[PATCH RFC 2/3] drm/amd/display: quirk CH7218 DP DSC support bit
From: Stephen via B4 Relay
Date: Sat Jun 20 2026 - 12:07:10 EST
From: Stephen <stevester.codes@xxxxxxxxx>
Some CH7218 firmware clears DP_DSC_SUPPORT at DPCD 0x060 while
returning a populated DSC decoder capability block. Without the support
bit, AMDGPU rejects DSC on the DP side and cannot validate high-bandwidth
RGB modes that require DSC over the DP link.
For the malformed CH7218 PCON only, set the DSC support bit after
verifying that the DSC capability block contains non-zero decoder data.
Do not infer DSC support for other devices and do not synthesize DSC
passthrough support.
Signed-off-by: Stephen <stevester.codes@xxxxxxxxx>
---
.../display/dc/link/protocols/link_dp_capability.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c
index c2b48abfe7e6..ad4fb94281a8 100644
--- a/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c
+++ b/drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c
@@ -1183,6 +1183,25 @@ static void apply_ch7218_pcon_caps_quirk(struct dc_link *link)
link->dpcd_caps.dongle_caps.extendedCapValid = true;
}
+static void apply_ch7218_dsc_caps_quirk(struct dc_link *link)
+{
+ struct dpcd_dsc_capabilities *dsc_caps = &link->dpcd_caps.dsc_caps;
+
+ if (!is_ch7218_pcon(link) ||
+ dsc_caps->dsc_basic_caps.fields.dsc_support.DSC_SUPPORT ||
+ (!dsc_caps->dsc_basic_caps.raw[DP_DSC_REV - DP_DSC_SUPPORT] &&
+ !dsc_caps->dsc_basic_caps.raw[DP_DSC_SLICE_CAP_1 - DP_DSC_SUPPORT] &&
+ !dsc_caps->dsc_basic_caps.raw[DP_DSC_MAX_BITS_PER_PIXEL_LOW - DP_DSC_SUPPORT]))
+ return;
+
+ /*
+ * Some CH7218 firmware clears DP_DSC_SUPPORT while returning a populated
+ * DSC decoder capability block. Do not infer DSC support for other
+ * devices and do not enable DSC passthrough here.
+ */
+ dsc_caps->dsc_basic_caps.fields.dsc_support.DSC_SUPPORT = true;
+}
+
static void get_active_converter_info(
uint8_t data, struct dc_link *link)
{
@@ -2068,6 +2087,7 @@ static bool retrieve_link_cap(struct dc_link *link)
link->dpcd_caps.dsc_caps.dsc_basic_caps.raw,
sizeof(link->dpcd_caps.dsc_caps.dsc_basic_caps.raw));
if (status == DC_OK) {
+ apply_ch7218_dsc_caps_quirk(link);
is_fec_supported = link->dpcd_caps.fec_cap.bits.FEC_CAPABLE;
is_dsc_basic_supported = link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_SUPPORT;
is_dsc_passthrough_supported = link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_PASSTHROUGH_SUPPORT;
--
2.54.0