Hi Cristian,
I tested this series on a Xunlong Orange Pi 5 (RK3588S) driving an
AOC Q32G1WG4 monitor (2560x1440@144, TMDS char rate 592 MHz) and can
report that scrambling works, with one interop issue described below.
A note on the test base: drm-misc-next at the series' base commit does
not boot on this board for reasons unrelated to the series (the
unpatched base commit hangs early as well; I can dig into that
separately). I therefore backported the series onto v7.2.3, dropping
the vc4/sun4i/tests patches and adjusting for minor context drift in
drm_connector.c and the scdc/hdmi helpers. The dw-hdmi-qp, rockchip,
bridge_connector and helper patches applied without functional
changes.
With the backport applied, all four 2560x1440 modes (60/100/120/144)
are exposed and 144 Hz works, but scrambling initially failed:
rockchip-drm display-subsystem: [drm] Sink doesn't support scrambling.
dwhdmiqp-rockchip fde80000.hdmi: Failed to enable scrambling: -22
The cause is the monitor's EDID: its HF-VSDB declares a Maximum TMDS
Character Rate of 600 MHz but leaves the SCDC Present flag unset, so
drm_scdc_sink_supports_scrambling() rejects it. The SCDC interface of
this display is nevertheless fully functional: reading SCDC via DDC
returns sink version 1, writes are accepted, and after the change
below TMDS_CONFIG reads back 0x03 (scrambling + 40-bit clock ratio)
with a stable picture at 592 MHz.
Since HDMI 2.0 mandates SCDC support for character rates above
340 MHz, I worked around it by trusting the declared rate:
--- a/drivers/gpu/drm/display/drm_hdmi_helper.c
+++ b/drivers/gpu/drm/display/drm_hdmi_helper.c
@@ static bool drm_scdc_sink_supports_scrambling(struct drm_connector
*connector)
{
const struct drm_display_info *info = &connector->display_info;
- return info->is_hdmi &&
- info->hdmi.scdc.supported &&
- info->hdmi.scdc.scrambling.supported;
+ if (!info->is_hdmi)
+ return false;
+
+ /*
+ * Some displays (e.g. AOC Q32G1WG4) declare a Max TMDS Character
+ * Rate above 340 MHz in their HF-VSDB but leave the SCDC Present
+ * flag unset, even though SCDC is functional. The spec mandates
+ * SCDC support for rates above 340 MHz, so trust the declared rate.
+ */
+ if (info->max_tmds_clock > 340000)
+ return true;
+
+ return info->hdmi.scdc.supported &&
+ info->hdmi.scdc.scrambling.supported;
}
I'm happy to test further revisions on this hardware, and to submit
the above as a proper patch if you think this is the right place to
handle such non-conformant EDIDs.
For the dw-hdmi-qp/rockchip/helper parts, on the backport described
above:
Tested-by: Robin Räber <[email protected]>
Best regards,
Robin