Commit 64df665f authored by Wyatt Wood's avatar Wyatt Wood Committed by Alex Deucher
Browse files

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: default avatarNicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: default avatarSolomon Chiu <solomon.chiu@amd.com>
Signed-off-by: default avatarWyatt Wood <wyatt.wood@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 519607a2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 */
+8 −2
Original line number Diff line number Diff line
@@ -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;