[PATCH v8 00/39] Add HDMI 2.0 support to DW HDMI QP TX
Cristian Ciocaltea
cristian.ciocaltea at collabora.com
Thu Jul 2 08:31:43 PDT 2026
Hi,
I've just realized I missed updating the part of the cover letter that
describes the patch structure. Please find the corrected content below.
Regards,
Cristian
On 7/2/26 5:46 PM, Cristian Ciocaltea wrote:
> Enable HDMI 2.0 display modes (e.g. 4K at 60Hz) on the Synopsys DW HDMI QP
> TX controller, as found in Rockchip RK3576 & RK3588 SoCs, by adding SCDC
> management for high TMDS clock ratio and scrambling.
Since SCDC state is lost on sink disconnects, the bridge driver needs to
trigger a CRTC reset during connector detection. To support this, the
series first introduces the HDMI version enum and the caps-based HDMI
connector init helper (patches 1-3), then builds the connector and
bridge scrambling infrastructure on top of it - the connector scrambler
support, the scdc-helper additions (connector-prefixed debug macro and
SCDC version helper), and the HDMI scrambling management helpers
including SCDC source-version advertisement (patches 4-8).
It then wires this up through the hdmi-state-helper and bridge connector
layers: fallback TMDS rate validation, hotplug SCDC state sync and the
scrambling requirement (patches 9-11), a bridge cleanup and the new
source-side scrambling bridge ops (patches 12-13), the switch to a
cached-status, atomic-aware .detect_ctx() connector helper (patches
14-15), and finally hooking up the HDMI 2.0 scrambler callbacks (patch
16).
The SCDC scrambling feature itself is implemented in the DW HDMI QP
bridge driver, alongside i2c error-message rate limiting,
.enable_hpd()/.disable_hpd() PHY ops and a dw_hdmi_qp_hpd_notify()
helper (patches 17-20).
Patches 21-28 cover the Rockchip platform driver and HPD handling: minor
cleanups (newlines in dev_err_probe(), consistent local dev variable,
dropping an unnecessary include), deferring HPD IRQ enable until after
connector setup, masking the RK3576 HPD IRQ in io_init, implementing the
.{enable|disable}_hpd() PHY ops, switching HPD reports to
dw_hdmi_qp_hpd_notify() to restrict events to the affected connector,
and dropping the now-unused .setup_hpd() PHY op.
Patches 29-31 convert vc4 HDMI to the common infrastructure as a proof
of reuse: adopting the shared TMDS char rate constants, switching to
drm_hdmi_mode_needs_scrambling(), and replacing the driver-local
scrambling implementation with the common SCDC scrambling helpers.
Patches 32-39 add KUnit tests: HDMI caps-based init coverage and
source-side scrambler validation for the connector, conversion of
hdmi_state_helper to drmm_connector_hdmi_init_with_caps() with
max_tmds_char_rate fallback tests, a new 4K at 60Hz 600MHz TMDS EDID,
source-side scrambling decision coverage, and conformity fixes for the
existing 1080p+4K YUV420 200MHz and 4K RGB/YUV 340MHz test EDID blobs.
>
> This has been tested on the following boards:
>
> * Radxa ROCK 5B (RK3588)
> * Radxa ROCK 4D (RK3576)
> * Raspberry Pi 5 Model B Rev 1.1 (BCM2712 D0)
>
> Note that commit d87773de9efe1 ("clocksource/drivers/arm_arch_timer:
> Default to EL2 virtual timer when running VHE"), introduced in v7.2-rc1,
> causes Raspberry Pi 5 to hang during boot. Reverting the commit
> restores normal boot. This issue has already been reported in [1];
> alternatively, the workaround proposed in [2] can be applied.
>
> Regards,
> Cristian
>
> [1] https://lore.kernel.org/all/ea15cce1-b393-43f6-8d58-3d6f90f0c0cd@samsung.com/
> [2] https://lore.kernel.org/all/20260619204832.586079-1-dan@reactivated.net/
>
> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea at collabora.com>
> ---
> Changes in v8:
> - Added an enum hdmi_version under video/hdmi to describe the HDMI
> specification version a source/sink supports (new patch 1)
> - Introduced HDMI connector capabilities API and reworked the
> infrastructure patches on top of it: drmm_connector_hdmi_init() now
> takes a drm_connector_hdmi_caps struct that carries supported_formats,
> max_bpc, supported_hdmi_ver and max_tmds_char_rate (new patches 2-3)
> - Moved all the new SCDC helpers covering both source and sink to
> display/drm_hdmi_helper.c
> - Renamed drm_scdc_{start,stop}_scrambling() to
> drm_connector_hdmi_{enable,disable}_scrambling() and added a
> connector-state argument so the scrambler_needed flag is checked
> centrally instead of in every driver
> - Renamed drm_scdc_sync_status() to drm_connector_hdmi_sync_scdc(),
> aligned its lifecycle with vc4_hdmi_reset_link(), and removed the
> internal drm_scdc_reset_crtc() helper; it now also gates on CRTC state
> and an in-flight commit (Maxime)
> - Changed the prototype of drm_atomic_helper_connector_hdmi_hotplug() to
> take an acquire context and an int return, instead of adding a new
> _ctx variant (Maxime)
> - Added drm_hdmi_mode_needs_scrambling() to centralise the above-340 MHz
> decision (new patch 7)
> - Made SCDC source version negotiation optional and moved it to a
> dedicated patch "drm/display: hdmi: Advertise SCDC source version when
> scrambling" (new patch 8), backed by a new
> drm_scdc_set_source_version() helper in "drm/display: scdc-helper: Add
> helper to set SCDC version information" (new patch 6)
> - Added a fallback TMDS rate validation patch using the connector-level
> max_tmds_char_rate when the driver provides no .tmds_char_rate_valid()
> hook (new patch 9)
> - Split scrambler_needed flag handling into its own hdmi-state-helper
> dedicate change (new patch 11)
> - VC4:
> * Replaced vc4_hdmi_mode_needs_scrambling() with
> drm_hdmi_mode_needs_scrambling() (new patch 30)
> * Restored drm_dev_{enter,exit}() pairing around the converted
> scrambling paths
> * Removed now unused output_{bpc,color_format} fields from vc4_hdmi as
> part of the SCDC conversion
> - KUnit:
> * Covered the caps-based connector init path: NULL caps, inferred
> max_tmds_char_rate per supported_hdmi_ver, and override validation
> (new patch 32)
> * Switched drm_hdmi_state_helper_test to the caps-based init helper
> and exposed it through
> drm_kunit_helper_connector_hdmi_init_with_caps_edid_funcs() (new
> patch 34)
> * Added max_tmds_char_rate fallback coverage in
> drm_hdmi_state_helper_test (new patch 35)
> - Rebased onto latest drm-misc-next and dropped the already applied
> "drm/fb-helper: Remove unused local variable in hotplug_event()" patch
> - Link to v7: https://patch.msgid.link/20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com
[...]
More information about the linux-arm-kernel
mailing list