drm/amd/display: Prevent using DMUB rptr that is out-of-bounds
authorWyatt Wood <wyatt.wood@amd.com>
Tue, 21 Sep 2021 13:17:27 +0000 (09:17 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 4 Oct 2021 19:23:02 +0000 (15:23 -0400)
[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>
drivers/gpu/drm/amd/display/dmub/dmub_srv.h
drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c

index ef324fc39315129505baaa1c7e79df910964ad23..efb667cf6c9846b8a0771c9f8620cd514644ef7a 100644 (file)
@@ -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 */
index a6188d067d655748319ebe1aeeeba94795bad340..77c67222cabd440d0cf41a264028c412b0800d51 100644 (file)
@@ -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;