drm/amd/display: Don't spin forever waiting for DMCUB phy/auto init
authorNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Mon, 4 Nov 2019 18:32:46 +0000 (13:32 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 19 Nov 2019 15:12:53 +0000 (10:12 -0500)
[Why]
It's an interface violation to use infinite loops within DMUB
service functions and we'll lock up the kernel by doing so.

[How]
Revert the function back to its intended functionality.
Move the infinite loops into DC/DM as necessary.

Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: Sun peng Li <Sunpeng.Li@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c

index b65b660..8d348a5 100644 (file)
@@ -112,8 +112,10 @@ void dc_dmub_srv_wait_phy_init(struct dc_dmub_srv *dc_dmub_srv)
        struct dc_context *dc_ctx = dc_dmub_srv->ctx;
        enum dmub_status status;
 
-       status = dmub_srv_wait_for_phy_init(dmub, 1000000);
-       if (status != DMUB_STATUS_OK)
+       status = dmub_srv_wait_for_phy_init(dmub, 10000000);
+       if (status != DMUB_STATUS_OK) {
                DC_ERROR("Error waiting for DMUB phy init: status=%d\n",
                         status);
+               ASSERT(0);
+       }
 }
index 5ae1906..60c574a 100644 (file)
@@ -400,19 +400,14 @@ enum dmub_status dmub_srv_wait_for_phy_init(struct dmub_srv *dmub,
        if (!dmub->hw_init || !dmub->hw_funcs.is_phy_init)
                return DMUB_STATUS_INVALID;
 
-/*     for (i = 0; i <= timeout_us; i += 10) {
+       for (i = 0; i <= timeout_us; i += 10) {
                if (dmub->hw_funcs.is_phy_init(dmub))
                        return DMUB_STATUS_OK;
 
                udelay(10);
-       }*/
-       while (!dmub->hw_funcs.is_phy_init(dmub)) {
-               ASSERT(i <= timeout_us);
-               i += 10;
-               udelay(10);
        }
 
-       return DMUB_STATUS_OK;
+       return DMUB_STATUS_TIMEOUT;
 }
 
 enum dmub_status dmub_srv_wait_for_idle(struct dmub_srv *dmub,