mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-03 09:41:54 +09:00
drm/amd/display: Prevent using DMUB rptr that is out-of-bounds
[Why] Running into bugchecks during stress test where rptr is 0xFFFFFFFF. Typically this is caused by a hard hang, and can come from HW outside of DCN. [How] To prevent bugchecks when writing the DMUB rptr, fist check that the rptr is valid. Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com> Acked-by: Solomon Chiu <solomon.chiu@amd.com> Signed-off-by: Wyatt Wood <wyatt.wood@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -84,6 +84,7 @@ enum dmub_status {
|
||||
DMUB_STATUS_QUEUE_FULL,
|
||||
DMUB_STATUS_TIMEOUT,
|
||||
DMUB_STATUS_INVALID,
|
||||
DMUB_STATUS_HW_FAILURE,
|
||||
};
|
||||
|
||||
/* enum dmub_asic - dmub asic identifier */
|
||||
|
||||
@@ -655,13 +655,19 @@ enum dmub_status dmub_srv_wait_for_phy_init(struct dmub_srv *dmub,
|
||||
enum dmub_status dmub_srv_wait_for_idle(struct dmub_srv *dmub,
|
||||
uint32_t timeout_us)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t i, rptr;
|
||||
|
||||
if (!dmub->hw_init)
|
||||
return DMUB_STATUS_INVALID;
|
||||
|
||||
for (i = 0; i <= timeout_us; ++i) {
|
||||
dmub->inbox1_rb.rptr = dmub->hw_funcs.get_inbox1_rptr(dmub);
|
||||
rptr = dmub->hw_funcs.get_inbox1_rptr(dmub);
|
||||
|
||||
if (rptr > dmub->inbox1_rb.capacity)
|
||||
return DMUB_STATUS_HW_FAILURE;
|
||||
|
||||
dmub->inbox1_rb.rptr = rptr;
|
||||
|
||||
if (dmub_rb_empty(&dmub->inbox1_rb))
|
||||
return DMUB_STATUS_OK;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user