From 56fc13fe6caa67e1017e048763c9eaa32330187b Mon Sep 17 00:00:00 2001 From: Nicholas Kazlauskas Date: Mon, 4 Nov 2019 13:32:46 -0500 Subject: [PATCH] drm/amd/display: Don't spin forever waiting for DMCUB phy/auto init [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 Reviewed-by: Sun peng Li Acked-by: Rodrigo Siqueira Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c | 6 ++++-- drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c | 9 ++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c index b65b66025267..8d348a5f5599 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c @@ -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); + } } diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c index 5ae1906ff1b1..60c574a39c6a 100644 --- a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c +++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c @@ -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, -- 2.17.1