diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1264-drm-amd-display-send-pipe-set-command-to-dmcu-when-b.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/1264-drm-amd-display-send-pipe-set-command-to-dmcu-when-b.patch | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1264-drm-amd-display-send-pipe-set-command-to-dmcu-when-b.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1264-drm-amd-display-send-pipe-set-command-to-dmcu-when-b.patch new file mode 100644 index 00000000..472f8318 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1264-drm-amd-display-send-pipe-set-command-to-dmcu-when-b.patch @@ -0,0 +1,97 @@ +From a99b4532a892bef4635391082047a3df2321e556 Mon Sep 17 00:00:00 2001 +From: Josip Pavic <Josip.Pavic@amd.com> +Date: Wed, 30 Jan 2019 16:23:47 -0500 +Subject: [PATCH 1264/2940] drm/amd/display: send pipe set command to dmcu when + backlight is set + +[Why] +Previously, a change removed code that would send a pipe set command +to dmcu each time the backlight was set, as it was thought to be +superfluous. However, it is possible for the backlight to be set +before a valid pipe has been set, which causes DMCU to hang after a +DPMS restore on some systems. + +[How] +Send a pipe set command to DMCU prior to setting the backlight. + +Fixes: 4d3cb100431c ("drm/amd/display: send pipe set command to dmcu when backlight is set") +Signed-off-by: Josip Pavic <Josip.Pavic@amd.com> +Reviewed-by: Anthony Koo <Anthony.Koo@amd.com> +Acked-by: Leo Li <sunpeng.li@amd.com> +--- + drivers/gpu/drm/amd/display/dc/dce/dce_abm.c | 45 ++++++++++---------- + 1 file changed, 23 insertions(+), 22 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c +index a740bc3418a1..da96229db53a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c +@@ -53,6 +53,27 @@ + + #define MCP_DISABLE_ABM_IMMEDIATELY 255 + ++static bool dce_abm_set_pipe(struct abm *abm, uint32_t controller_id) ++{ ++ struct dce_abm *abm_dce = TO_DCE_ABM(abm); ++ uint32_t rampingBoundary = 0xFFFF; ++ ++ REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, ++ 1, 80000); ++ ++ /* set ramping boundary */ ++ REG_WRITE(MASTER_COMM_DATA_REG1, rampingBoundary); ++ ++ /* setDMCUParam_Pipe */ ++ REG_UPDATE_2(MASTER_COMM_CMD_REG, ++ MASTER_COMM_CMD_REG_BYTE0, MCP_ABM_PIPE_SET, ++ MASTER_COMM_CMD_REG_BYTE1, controller_id); ++ ++ /* notifyDMCUMsg */ ++ REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1); ++ ++ return true; ++} + + static unsigned int calculate_16_bit_backlight_from_pwm(struct dce_abm *abm_dce) + { +@@ -184,6 +205,8 @@ static void dmcu_set_backlight_level( + // Take MSB of fractional part since backlight is not max + backlight_8_bit = (backlight_pwm_u16_16 >> 8) & 0xFF; + ++ dce_abm_set_pipe(&abm_dce->base, controller_id); ++ + /* waitDMCUReadyForCmd */ + REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, + 0, 1, 80000); +@@ -293,28 +316,6 @@ static bool dce_abm_set_level(struct abm *abm, uint32_t level) + return true; + } + +-static bool dce_abm_set_pipe(struct abm *abm, uint32_t controller_id) +-{ +- struct dce_abm *abm_dce = TO_DCE_ABM(abm); +- uint32_t rampingBoundary = 0xFFFF; +- +- REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, +- 1, 80000); +- +- /* set ramping boundary */ +- REG_WRITE(MASTER_COMM_DATA_REG1, rampingBoundary); +- +- /* setDMCUParam_Pipe */ +- REG_UPDATE_2(MASTER_COMM_CMD_REG, +- MASTER_COMM_CMD_REG_BYTE0, MCP_ABM_PIPE_SET, +- MASTER_COMM_CMD_REG_BYTE1, controller_id); +- +- /* notifyDMCUMsg */ +- REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1); +- +- return true; +-} +- + static bool dce_abm_immediate_disable(struct abm *abm) + { + struct dce_abm *abm_dce = TO_DCE_ABM(abm); +-- +2.17.1 + |