drm/amd/display: Add monitor specific edid quirk
authorAurabindo Pillai <aurabindo.pillai@amd.com>
Mon, 12 Jun 2023 16:44:00 +0000 (12:44 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 30 Jun 2023 17:12:15 +0000 (13:12 -0400)
Disable FAMS on a Samsung Odyssey G9 monitor. Experiments show that this
monitor does not work well under some use cases, and is likely
implementation specific bug on the monitor's firmware.

Cc: stable@vger.kernel.org
Reviewed-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c

index cd20cfc..d9a4829 100644 (file)
 #include "dm_helpers.h"
 #include "ddc_service_types.h"
 
+static u32 edid_extract_panel_id(struct edid *edid)
+{
+       return (u32)edid->mfg_id[0] << 24   |
+              (u32)edid->mfg_id[1] << 16   |
+              (u32)EDID_PRODUCT_ID(edid);
+}
+
+static void apply_edid_quirks(struct edid *edid, struct dc_edid_caps *edid_caps)
+{
+       uint32_t panel_id = edid_extract_panel_id(edid);
+
+       switch (panel_id) {
+       /* Workaround for some monitors which does not work well with FAMS */
+       case drm_edid_encode_panel_id('S', 'A', 'M', 0x0E5E):
+       case drm_edid_encode_panel_id('S', 'A', 'M', 0x7053):
+       case drm_edid_encode_panel_id('S', 'A', 'M', 0x71AC):
+               DRM_DEBUG_DRIVER("Disabling FAMS on monitor with panel id %X\n", panel_id);
+               edid_caps->panel_patch.disable_fams = true;
+               break;
+       default:
+               return;
+       }
+}
+
 /* dm_helpers_parse_edid_caps
  *
  * Parse edid caps
@@ -115,6 +139,8 @@ enum dc_edid_status dm_helpers_parse_edid_caps(
        else
                edid_caps->speaker_flags = DEFAULT_SPEAKER_LOCATION;
 
+       apply_edid_quirks(edid_buf, edid_caps);
+
        kfree(sads);
        kfree(sadb);