The 38-ec-11 TCON contained in some AUO panels will hang when used
with PSR-SU and changing the brightness.

Forcing a full frame update works around the issue, so add a quirk
for this panel to do just that.

Reported-by: aaron...@canonical.com
Signed-off-by: Mario Limonciello <mario.limoncie...@amd.com>
---
Cc: hamza.mahf...@amd.com
Cc: mpearson-len...@squebb.ca

 drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c | 30 ++++++++++++++-----
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c 
b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
index 3e243e407bb8..68c619b43cbf 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_psr.c
@@ -36,6 +36,7 @@
 static const uint8_t DP_SINK_DEVICE_STR_ID_1[] = {7, 1, 8, 7, 3};
 static const uint8_t DP_SINK_DEVICE_STR_ID_2[] = {7, 1, 8, 7, 5};
 static const uint8_t DP_SINK_DEVICE_STR_ID_3[] = {0x42, 0x61, 0x6c, 0x73, 
0x61};
+static const uint8_t DP_SINK_DEVICE_STR_ID_4[] = {0x0, 0x0, 0x0, 0x0, 0x0};
 
 /*
  * Convert dmcub psr state to dmcu psr state.
@@ -284,6 +285,25 @@ static void dmub_psr_set_power_opt(struct dmub_psr *dmub, 
unsigned int power_opt
        dc_wake_and_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
+static bool dmub_psr_need_force_ffu(bool dsc_enable_status, struct dc_link 
*link)
+{
+       if (link->dpcd_caps.sink_dev_id != DP_DEVICE_ID_38EC11)
+               return false;
+
+       /**
+        * WA for PSRSU+DSC on specific TCON, if DSC is enabled, force PSRSU as 
ffu mode(full frame update)
+        * Note that PSRSU+DSC is still under development.
+        */
+       if (dsc_enable_status &&
+           !memcmp(link->dpcd_caps.sink_dev_id_str, DP_SINK_DEVICE_STR_ID_1,
+                   sizeof(DP_SINK_DEVICE_STR_ID_1)))
+               return true;
+       if (!memcmp(link->dpcd_caps.sink_dev_id_str, DP_SINK_DEVICE_STR_ID_4,
+                   sizeof(DP_SINK_DEVICE_STR_ID_4)))
+               return true;
+
+       return false;
+}
 /*
  * Setup PSR by programming phy registers and sending psr hw context values to 
firmware.
  */
@@ -378,14 +398,8 @@ static bool dmub_psr_copy_settings(struct dmub_psr *dmub,
        copy_settings_data->panel_inst = panel_inst;
        copy_settings_data->dsc_enable_status = 
(pipe_ctx->stream->timing.flags.DSC == 1);
 
-       /**
-        * WA for PSRSU+DSC on specific TCON, if DSC is enabled, force PSRSU as 
ffu mode(full frame update)
-        * Note that PSRSU+DSC is still under development.
-        */
-       if (copy_settings_data->dsc_enable_status &&
-               link->dpcd_caps.sink_dev_id == DP_DEVICE_ID_38EC11 &&
-               !memcmp(link->dpcd_caps.sink_dev_id_str, 
DP_SINK_DEVICE_STR_ID_1,
-                       sizeof(DP_SINK_DEVICE_STR_ID_1)))
+
+       if (dmub_psr_need_force_ffu(copy_settings_data->dsc_enable_status, 
link))
                link->psr_settings.force_ffu_mode = 1;
        else
                link->psr_settings.force_ffu_mode = 0;
-- 
2.34.1

Reply via email to