diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5014-drm-amd-display-Prevent-PSR-from-being-enabled-if-in.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5014-drm-amd-display-Prevent-PSR-from-being-enabled-if-in.patch | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5014-drm-amd-display-Prevent-PSR-from-being-enabled-if-in.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5014-drm-amd-display-Prevent-PSR-from-being-enabled-if-in.patch new file mode 100644 index 00000000..868a5f56 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5014-drm-amd-display-Prevent-PSR-from-being-enabled-if-in.patch @@ -0,0 +1,124 @@ +From 8758419d5f7103cc56263e2cc8675f5e18060aeb Mon Sep 17 00:00:00 2001 +From: Anthony Koo <Anthony.Koo@amd.com> +Date: Tue, 17 Jul 2018 09:43:44 -0400 +Subject: [PATCH 5014/5725] drm/amd/display: Prevent PSR from being enabled if + initialization fails + +[Why] +PSR_SET command is sent to the microcontroller in order to initialize +parameters needed for PSR feature, such as telling the microcontroller +which pipe is driving the PSR supported panel. When this command is +skipped or fails, the microcontroller may program the wrong thing if +driver tries to enable PSR. + +[How] +If PSR_SET fails, do not set psr_enable flag to indicate the feature is +not yet initialized. + +Signed-off-by: Anthony Koo <Anthony.Koo@amd.com> +Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> +Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c | 38 ++++++++++++++++----------- + drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h | 2 +- + 2 files changed, 24 insertions(+), 16 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c +index 062a465..ca7989e 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c +@@ -150,7 +150,7 @@ static void dce_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait) + } + } + +-static void dce_dmcu_setup_psr(struct dmcu *dmcu, ++static bool dce_dmcu_setup_psr(struct dmcu *dmcu, + struct dc_link *link, + struct psr_context *psr_context) + { +@@ -261,6 +261,8 @@ static void dce_dmcu_setup_psr(struct dmcu *dmcu, + + /* notifyDMCUMsg */ + REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1); ++ ++ return true; + } + + static bool dce_is_dmcu_initialized(struct dmcu *dmcu) +@@ -545,24 +547,25 @@ static void dcn10_dmcu_set_psr_enable(struct dmcu *dmcu, bool enable, bool wait) + * least a few frames. Should never hit the max retry assert below. + */ + if (wait == true) { +- for (retryCount = 0; retryCount <= 1000; retryCount++) { +- dcn10_get_dmcu_psr_state(dmcu, &psr_state); +- if (enable) { +- if (psr_state != 0) +- break; +- } else { +- if (psr_state == 0) +- break; ++ for (retryCount = 0; retryCount <= 1000; retryCount++) { ++ dcn10_get_dmcu_psr_state(dmcu, &psr_state); ++ if (enable) { ++ if (psr_state != 0) ++ break; ++ } else { ++ if (psr_state == 0) ++ break; ++ } ++ udelay(500); + } +- udelay(500); +- } + +- /* assert if max retry hit */ +- ASSERT(retryCount <= 1000); ++ /* assert if max retry hit */ ++ if (retryCount >= 1000) ++ ASSERT(0); + } + } + +-static void dcn10_dmcu_setup_psr(struct dmcu *dmcu, ++static bool dcn10_dmcu_setup_psr(struct dmcu *dmcu, + struct dc_link *link, + struct psr_context *psr_context) + { +@@ -577,7 +580,7 @@ static void dcn10_dmcu_setup_psr(struct dmcu *dmcu, + + /* If microcontroller is not running, do nothing */ + if (dmcu->dmcu_state != DMCU_RUNNING) +- return; ++ return false; + + link->link_enc->funcs->psr_program_dp_dphy_fast_training(link->link_enc, + psr_context->psrExitLinkTrainingRequired); +@@ -677,6 +680,11 @@ static void dcn10_dmcu_setup_psr(struct dmcu *dmcu, + + /* notifyDMCUMsg */ + REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1); ++ ++ /* waitDMCUReadyForCmd */ ++ REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, 1, 10000); ++ ++ return true; + } + + static void dcn10_psr_wait_loop( +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h +index de60f94..4550747 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dmcu.h +@@ -48,7 +48,7 @@ struct dmcu_funcs { + const char *src, + unsigned int bytes); + void (*set_psr_enable)(struct dmcu *dmcu, bool enable, bool wait); +- void (*setup_psr)(struct dmcu *dmcu, ++ bool (*setup_psr)(struct dmcu *dmcu, + struct dc_link *link, + struct psr_context *psr_context); + void (*get_psr_state)(struct dmcu *dmcu, uint32_t *psr_state); +-- +2.7.4 + |