aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/1259-drm-amd-display-send-pipe-set-command-to-dmcu-when-s.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/1259-drm-amd-display-send-pipe-set-command-to-dmcu-when-s.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/1259-drm-amd-display-send-pipe-set-command-to-dmcu-when-s.patch131
1 files changed, 131 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/1259-drm-amd-display-send-pipe-set-command-to-dmcu-when-s.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/1259-drm-amd-display-send-pipe-set-command-to-dmcu-when-s.patch
new file mode 100644
index 00000000..1f2c862b
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/1259-drm-amd-display-send-pipe-set-command-to-dmcu-when-s.patch
@@ -0,0 +1,131 @@
+From f0f023fd42dbb64f470eb4d7c986deca2662aad7 Mon Sep 17 00:00:00 2001
+From: Josip Pavic <Josip.Pavic@amd.com>
+Date: Tue, 29 Jan 2019 14:15:03 -0500
+Subject: [PATCH 1259/2940] drm/amd/display: send pipe set command to dmcu when
+ stream unblanks
+
+[Why]
+When stream is blanked, pipe set command is sent to dmcu to notify it
+that the abm pipe is disabled. When stream is unblanked, no notification is
+made to dmcu that the abm pipe has been enabled, resulting in abm not
+being enabled in the firmware.
+
+[How]
+When stream is unblanked, send a pipe set command to dmcu.
+
+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 | 32 ++++++++++---------
+ .../amd/display/dc/dcn10/dcn10_hw_sequencer.c | 4 ++-
+ drivers/gpu/drm/amd/display/dc/inc/hw/abm.h | 1 +
+ 3 files changed, 21 insertions(+), 16 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 01e56f1a9f34..a740bc3418a1 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c
+@@ -175,7 +175,6 @@ static void dmcu_set_backlight_level(
+ uint32_t controller_id)
+ {
+ unsigned int backlight_8_bit = 0;
+- uint32_t rampingBoundary = 0xFFFF;
+ uint32_t s2;
+
+ if (backlight_pwm_u16_16 & 0x10000)
+@@ -185,17 +184,6 @@ 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;
+
+- /* 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);
+-
+ /* waitDMCUReadyForCmd */
+ REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT,
+ 0, 1, 80000);
+@@ -305,21 +293,34 @@ static bool dce_abm_set_level(struct abm *abm, uint32_t level)
+ return true;
+ }
+
+-static bool dce_abm_immediate_disable(struct abm *abm)
++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);
+
+- /* setDMCUParam_ABMLevel */
++ /* 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, MCP_DISABLE_ABM_IMMEDIATELY);
++ 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);
++
++ dce_abm_set_pipe(abm, MCP_DISABLE_ABM_IMMEDIATELY);
++
+ abm->stored_backlight_registers.BL_PWM_CNTL =
+ REG_READ(BL_PWM_CNTL);
+ abm->stored_backlight_registers.BL_PWM_CNTL2 =
+@@ -419,6 +420,7 @@ static const struct abm_funcs dce_funcs = {
+ .abm_init = dce_abm_init,
+ .set_abm_level = dce_abm_set_level,
+ .init_backlight = dce_abm_init_backlight,
++ .set_pipe = dce_abm_set_pipe,
+ .set_backlight_level_pwm = dce_abm_set_backlight_level_pwm,
+ .get_current_backlight = dce_abm_get_current_backlight,
+ .get_target_backlight = dce_abm_get_target_backlight,
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+index ac021b2877ab..f508c4de0213 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+@@ -2161,8 +2161,10 @@ static void dcn10_blank_pixel_data(
+ if (!blank) {
+ if (stream_res->tg->funcs->set_blank)
+ stream_res->tg->funcs->set_blank(stream_res->tg, blank);
+- if (stream_res->abm)
++ if (stream_res->abm) {
++ stream_res->abm->funcs->set_pipe(stream_res->abm, stream_res->tg->inst + 1);
+ stream_res->abm->funcs->set_abm_level(stream_res->abm, stream->abm_level);
++ }
+ } else if (blank) {
+ if (stream_res->abm)
+ stream_res->abm->funcs->set_abm_immediate_disable(stream_res->abm);
+diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h b/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h
+index abc961c0906e..86dc39a02408 100644
+--- a/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h
++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/abm.h
+@@ -46,6 +46,7 @@ struct abm_funcs {
+ void (*abm_init)(struct abm *abm);
+ bool (*set_abm_level)(struct abm *abm, unsigned int abm_level);
+ bool (*set_abm_immediate_disable)(struct abm *abm);
++ bool (*set_pipe)(struct abm *abm, unsigned int controller_id);
+ bool (*init_backlight)(struct abm *abm);
+
+ /* backlight_pwm_u16_16 is unsigned 32 bit,
+--
+2.17.1
+