mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-20 02:34:23 +08:00
drm/dp/mst: Handle invalid link bandwidth from DPCD gracefully
Don't BUG out if the link reports an invalid (or plain unknown) bandwidth value, but report the failure and fail gracefully. Fixes a trivial compiler warning in case the BUG is ever compiled away. Link: http://lkml.kernel.org/p/1415785566-12758-1-git-send-email-geert@linux-m68k.org Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Dave Airlie <airlied@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
db88362884
commit
b853fdb3c0
@ -1799,17 +1799,27 @@ static int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drm_dp_get_vc_payload_bw(int dp_link_bw, int dp_link_count)
|
||||
static bool drm_dp_get_vc_payload_bw(int dp_link_bw,
|
||||
int dp_link_count,
|
||||
int *out)
|
||||
{
|
||||
switch (dp_link_bw) {
|
||||
default:
|
||||
DRM_DEBUG_KMS("invalid link bandwidth in DPCD: %x (link count: %d)\n",
|
||||
dp_link_bw, dp_link_count);
|
||||
return false;
|
||||
|
||||
case DP_LINK_BW_1_62:
|
||||
return 3 * dp_link_count;
|
||||
*out = 3 * dp_link_count;
|
||||
break;
|
||||
case DP_LINK_BW_2_7:
|
||||
return 5 * dp_link_count;
|
||||
*out = 5 * dp_link_count;
|
||||
break;
|
||||
case DP_LINK_BW_5_4:
|
||||
return 10 * dp_link_count;
|
||||
*out = 10 * dp_link_count;
|
||||
break;
|
||||
}
|
||||
BUG();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1841,7 +1851,13 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
mgr->pbn_div = drm_dp_get_vc_payload_bw(mgr->dpcd[1], mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK);
|
||||
if (!drm_dp_get_vc_payload_bw(mgr->dpcd[1],
|
||||
mgr->dpcd[2] & DP_MAX_LANE_COUNT_MASK,
|
||||
&mgr->pbn_div)) {
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
mgr->total_pbn = 2560;
|
||||
mgr->total_slots = DIV_ROUND_UP(mgr->total_pbn, mgr->pbn_div);
|
||||
mgr->avail_slots = mgr->total_slots;
|
||||
|
Loading…
Reference in New Issue
Block a user