From: Roman Li <[email protected]>

[Why]
Some 8K displays cannot tolerate the reduced phy ssc value
at high link utilization and show corruption or black screen.

[How]
Add an EDID panel-id quirk to utilize existing skip_phy_ssc_reduction flag.

To pass the link into the quirk handler, change the signature of
apply_edid_quirks() to take link as an argument. The dev local in
dm_helpers_parse_edid_caps() becomes unused and is removed.

Fixes: 5fa62c87cffd ("drm/amd/display: Add option to disable PHY SSC reduction 
on transmitter enable")
Reviewed-by: Alex Hung <[email protected]>
Signed-off-by: Roman Li <[email protected]>
Signed-off-by: Aurabindo Pillai <[email protected]>
---
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c   | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
index 844fd403795d..a2d0bb34e639 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
@@ -95,8 +95,11 @@ static u32 edid_extract_panel_id(struct edid *edid)
               (u32)EDID_PRODUCT_ID(edid);
 }
 
-static void apply_edid_quirks(struct drm_device *dev, struct edid *edid, 
struct dc_edid_caps *edid_caps)
+static void apply_edid_quirks(struct dc_link *link, struct edid *edid,
+                             struct dc_edid_caps *edid_caps)
 {
+       struct amdgpu_dm_connector *aconnector = link->priv;
+       struct drm_device *dev = aconnector->base.dev;
        uint32_t panel_id = edid_extract_panel_id(edid);
 
        switch (panel_id) {
@@ -126,6 +129,11 @@ static void apply_edid_quirks(struct drm_device *dev, 
struct edid *edid, struct
                drm_dbg_driver(dev, "Disabling VSC on monitor with panel id 
%X\n", panel_id);
                edid_caps->panel_patch.disable_colorimetry = true;
                break;
+       /* Workaround for monitors that get corrupted by the PHY SSC reduction 
*/
+       case drm_edid_encode_panel_id('D', 'E', 'L', 0x4147):
+               drm_dbg_driver(dev, "Skip PHY SSC reduction on panel id %X\n", 
panel_id);
+               link->wa_flags.skip_phy_ssc_reduction = true;
+               break;
        default:
                return;
        }
@@ -147,7 +155,6 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
 {
        struct amdgpu_dm_connector *aconnector = link->priv;
        struct drm_connector *connector = &aconnector->base;
-       struct drm_device *dev = connector->dev;
        struct edid *edid_buf = edid ? (struct edid *) edid->raw_edid : NULL;
        struct cea_sad *sads;
        int sad_count = -1;
@@ -188,7 +195,7 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
                                        edid_caps->frl_dsc_max_frl_rate, 
edid_caps->frl_dsc_total_chunk_kbytes);
        }
 
-       apply_edid_quirks(dev, edid_buf, edid_caps);
+       apply_edid_quirks(link, edid_buf, edid_caps);
 
        sad_count = drm_edid_to_sad((struct edid *) edid->raw_edid, &sads);
        if (sad_count <= 0)
-- 
2.54.0

Reply via email to