summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Kazlauskas <nicholas.kazlauskas@amd.com>2019-11-04 13:32:46 -0500
committerAlex Deucher <alexander.deucher@amd.com>2019-11-19 10:12:53 -0500
commit56fc13fe6caa67e1017e048763c9eaa32330187b (patch)
treebb02cc776adcc0fbffa211073fe7e27842c83f51
parent46250a0cba4ce9c9754b922ef89a2aa484209164 (diff)
downloadlinux-56fc13fe6caa67e1017e048763c9eaa32330187b.tar.bz2
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 <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>
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c6
-rw-r--r--drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c9
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,