From patchwork Thu Jul 23 01:34:49 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cristian Ciocaltea X-Patchwork-Id: 315 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10]) by mxe881.netcup.net (Postfix) with ESMTPS id 1F3BA1C2E7B for ; Thu, 23 Jul 2026 03:35:25 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=collabora.com; spf=pass (sender IP is 172.234.253.10) smtp.mailfrom=linux-sunxi+bounces-24642-noreply=patchwork.local@lists.linux.dev smtp.helo=sea.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.234.253.10 as permitted sender) client-ip=172.234.253.10; envelope-from=linux-sunxi+bounces-24642-noreply=patchwork.local@lists.linux.dev; helo=sea.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id 378EB3048F4A for ; Thu, 23 Jul 2026 01:35:07 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A23EA3016F2; Thu, 23 Jul 2026 01:35:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="TRWZrTfA" X-Original-To: linux-sunxi@lists.linux.dev Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 26AE27478 for ; Thu, 23 Jul 2026 01:35:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784770506; cv=none; b=arI9a84qDUowyuWyADJ+2NacF2SgYY/NzmKDHS1/2OjNXSRtf6NjANRlAaorN7satWpHkESg58cd7p56GoXc5UFAGzJSAukmk2IGsrRn5FKS/Fd3jKiTzCI7F7PTd5h/bgoB68d9DxkEGkaC/HEQMB9fJceVbbNbJpoajGXIQ58= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784770506; c=relaxed/simple; bh=R8PxmlhQl3VUS5cP/LV8ezrNBD+SiyCtEO5ogQyuxGM=; h=From:Subject:Date:Message-Id:MIME-Version:Content-Type:To:Cc; b=Zrg1WNCuAYuKsCgK1OL9cG6DwsDCzvWU/lpGhP9dfCON9HxLT43Ld0HZ8YbJw3Ne72DpfKKvNemVzNHzjU2Q0HxleLlLPgp5G8oMH+sMf58TtTTr1g0Db6VXVnpt+7uZ0WcwyhlbpelJ9Pdt481ecJPsaP2BQQ/nbQrHHtSo/aA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=TRWZrTfA; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1784770502; bh=R8PxmlhQl3VUS5cP/LV8ezrNBD+SiyCtEO5ogQyuxGM=; h=From:Subject:Date:To:Cc:From; b=TRWZrTfAp11txVRHhm4f4vvDBTKpD6en6sXzpFn0mu/w256Hh1krAkiqB6ZhE9i+n 6uEYze4zJPtgbFjbMOH38Ikpu+QlEAnQJW1cKkUsf/uSNFLpjN1+rXtcjxeZbedECi 2EaI/6jr+20+zw/HiS7ezL4gfqLv2B2lAolnt+rfaxgTv6ztbakgyM2L5F08myYJeD 3mRabVXU0PwuCR4uJ9ULeFuGubQJMK2w2jci0pz7JJJJonFtRARs+eDT3rm1UVjFH4 SVhTWtGnSg6VwT3CP0MfmTLq1EiNPBYf8Yw4+FJui0DREBec32TL9bJghYwc3xBWOd +iWHU2vmVnWiA== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange secp256r1 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id E808E17E023C; Thu, 23 Jul 2026 03:35:01 +0200 (CEST) From: Cristian Ciocaltea Subject: [PATCH v9 00/61] Add HDMI 2.0 support to DW HDMI QP TX Date: Thu, 23 Jul 2026 04:34:49 +0300 Message-Id: <20260723-dw-hdmi-qp-scramb-v9-0-4fb12ea22ac9@collabora.com> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-B4-Tracking: v=1; b=H4sIAAAAAAAC/33Q20rEMBAG4FdZcm0kmRwm3SvfQ7zIqTawu11bq crSd3e2IBUZvPwD82X+uYm5Tq3O4ni4iakubW7jhUL3cBB5iJfXKluhLECB06CMLB9yKOcm365 yzlM8J5lLKiE5zLnvBM1dp9q3z818fqE8tPl9nL62LxZ9f/1PW7RUMhjfV7RKR9895fF0immc4 mMez+IuLvCjeKU1qwApsWKC7EIBWzjF/FY6TjGkUDmvNRrVZ80pdlcM38iSYjQWk0IqoNlGblc seE5xpBTEUFFl0hKn+F1xoDjFkwI2oaVtEwbgFNwVr4BTkBRrXU3O1qore92wK8grYWvUhU4Vp ZKPf5V1Xb8BDODQeaACAAA= X-Change-ID: 20251203-dw-hdmi-qp-scramb-cdbd8b57ccf9 To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Chen-Yu Tsai , Samuel Holland , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Algea Cao , Daniel Stone , Liu Ying , Phong LE Cc: kernel@collabora.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-rockchip@lists.infradead.org, Dmitry Baryshkov , Maud Spierings , Diederik de Haas , Sashiko X-Mailer: b4 0.15.2 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= Enable HDMI 2.0 display modes (e.g. 4K@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 at the DRM infrastructure level, the series first introduces the HDMI version enum, then prepares for changing the signature of drmm_connector_hdmi_init(), i.e. dropping the vendor, product, supported_formats and max_bpc arguments, which are being moved into struct drm_connector_hdmi_funcs, by temporarily renaming the helper to drmm_connector_hdmi_ini2(). This lets the new signature be introduced under the original name while callers are converted incrementally. Note the transitional name matches the original's length so continuation-line arguments stay aligned to the opening parenthesis, keeping the diff to the identifier itself and avoiding re-alignment churn. Appending more HDMI-specific arguments to the init function would not scale well, hence the hdmi_funcs struct is extended with new fields: supported_hdmi_ver, supported_tmds_char_rate. These are used to infer and/or limit the maximum TMDS character rate permitted for the connector. Patches 5-10 build the connector and bridge scrambling infrastructure on top: the connector scrambler callbacks/flags, the scdc-helper additions (connector-prefixed debug macro and SCDC version helper), and the HDMI scrambling management helpers including SCDC source-version advertisement. Patches 11-18 wires this up through the hdmi-state-helper and bridge connector layers: source TMDS rate validation, hotplug SCDC state sync and the scrambling requirement, new source-side scrambling bridge ops, the switch to a cached-status, atomic-aware .detect_ctx() connector helper, and finally hooking up the HDMI 2.0 scrambler callbacks. 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 19-23). Patches 24-32 cover the Rockchip platform driver and HPD handling: minor cleanups (newlines in dev_err_probe(), consistent local dev variable, dropping unnecessary include/define), avoiding spurious HDP IRQ wakeups, 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 34-39 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(), proper -EDEADLK handling, and replacing the driver-local scrambling implementation with the common SCDC scrambling helpers. Patches 40-47 advertise supported version for all HDMI connectors/bridges, except the MediaTek HDMI driver (for now), as it requires non-trivial changes: there's a core library shared between two drivers, one being HDMI 2.0 compliant. Patches 48-57 add KUnit tests: HDMI caps-based init coverage and source-side scrambler validation for the connector, conversion of hdmi_state_helper to the new drmm_connector_hdmi_init() with max_tmds_char_rate validation, a new 4K@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. Eventually patches 58-61 remove the now unused drmm_connector_hdmi_ini2() helper and drop redundant hdmi fields from connector structs: vendor, product, supported_formats and max_bpc. 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 --- Changes in v9: - Collected A-b, R-b, T-b tags from Dmitry, Maxime, Maud - Dropped misleading "HDMI_VERSION_UNKNOWN means legacy/default behaviour" from drm_connector_hdmi_caps.supported_hdmi_ver documentation - Warned in drm_bridge_add() if an HDMI bridge leaves supported_hdmi_ver unset - Added max_tmds_char_rate to drm_bridge struct and wire it through drm_bridge_connector_init() along with supported_hdmi_ver - Got rid of connector's scrambler_supported flag and, instead, relied on checking the presence of scrambler callbacks via a new drm_connector_hdmi_scrambler_supported() helper (Dmitry) - Dropped HDMI connector scdc_cb callback and introduced scdc_work_initialized flag to perform lazy initialization and guard the teardown paths against touching an uninitialized work item - Unconditionally checked connector->hdmi.max_tmds_char_rate in "drm/display: hdmi-state-helper: Add fallback TMDS rate validation" and performed s/fallback/source/ in commit subject & description (Maxime) - Added a TODO comment for checking drm_display_info.hdmi.scdc.scrambling.low_rates in "drm/display: hdmi-state-helper: Set HDMI scrambling requirement" patch (Maxime) - Moved the prototype changes from "drm/display: hdmi-state-helper: Sync SCDC state on hotplug" into a dedicated "drm/display: hdmi-state-helper: Pass acquire ctx to hotplug helpers" patch; also switched ctx and status args ordering, for consistency with detect_ctx() signature (Maxime) - Ensured HDMI connector's SCDC delayed work is explicitly canceled during connector cleanup (Sashiko) - Fixed a potential NULL pointer dereference in drm_connector_hdmi_enable_scrambling() and drm_connector_hdmi_sync_scdc() helpers caused by forcing an EDID advertising SCDC on a connector that physically lacks an I2C DDC bus (Sashiko) - dw-hdmi-qp * Fixed a potential NULL pointer dereference in dw_hdmi_qp_hpd_notify() helper by using a local variable to cache the connector pointer (Sashiko) * Ensured hdmi->phy.ops->disable() is not skipped in dw_hdmi_qp_bridge_atomic_disable() by accessing the connector via drm_atomic_get_old_connector_for_encoder() instead of hdmi->curr_conn (Sashiko) * Mitigated a potential use-after-free reported by Sashiko caused when HPD interrupt fires after the DRM device is torn down; reworked "Defer HPD IRQ enable until after connector setup" into: * Factor out HPD interrupt mask/unmask helpers * Control the HPD IRQ line via the bridge HPD ops * Added new patch addressing another Sashiko finding: drm/rockchip: dw_hdmi_qp: Avoid spurious HPD IRQ thread wakeups * Added new patch: drm/bridge: dw-hdmi-qp: Remove unused workqueue include and define * Dropped .hdmi_tmds_char_rate_valid() usage from the bridge/synopsys/dw-hdmi-qp.c scrambling support patch, while advertising HDMI 1.4 capability for no-hpd configurations - VC4 * Passed ctx instead of NULL when calling drm_atomic_helper_connector_hdmi_hotplug() from vc4_hdmi_handle_hotplug() in the helper preparatory patch * Aligned with the expected detect_ctx() semantics in a dedicated "drm/vc4: hdmi: Propagate -EDEADLK to the top level" rather than bundled in the conversion patch * Optimized diff around drm_dev_enter() in the conversion patch (Maxime) * Simplified vc4_hdmi_connector_clock_valid() logic by deferring max clock validation to HDMI helpers (new patch) - Migrated to a funcs-based HDMI connector init API - new patches: * drm/display: hdmi: Rename drmm_connector_hdmi_init() to *_ini2() * drm/display: bridge_connector: Convert to drmm_connector_hdmi_init() * drm/vc4: hdmi: Convert to drmm_connector_hdmi_init() * drm/vc4: hdmi: Convert to common HDMI 2.0 scrambling infrastructure * drm/sun4i: hdmi: Convert to drmm_connector_hdmi_init() * drm/tests: connector: Convert to drmm_connector_hdmi_init() * drm/tests: hdmi_state_helper: Convert to drmm_connector_hdmi_init() * drm/bridge: adv7511: Advertise HDMI 1.2 capabilities * drm/bridge: inno-hdmi: Advertise HDMI 1.2 capabilities * drm/bridge: ite-it6263: Drop redundant .mode_valid hook * drm/bridge: ite-it6263: Advertise HDMI 1.3 capabilities * drm/bridge: ite-it66121: Advertise HDMI 1.2 capabilities * drm/bridge: lontium-lt9611: Advertise HDMI 1.4 capabilities * drm/rockchip: rk3066_hdmi: Advertise HDMI 1.4 capabilities * drm/sun4i: hdmi: Convert to drmm_connector_hdmi_init() * drm/connector: Remove drmm_connector_hdmi_ini2() * drm/connector: Drop redundant hdmi vendor/product fields * drm/connector: Drop redundant hdmi supported_formats field * drm/connector: Drop redundant max_bpc field - KUnit * Adapted hdmi_state_helper scrambler tests and reworked a couple of max_tmds_char_rate tests according to the latest DRM core changes * Fixed a regression in the HDMI caps-based init coverage * Fix a couple of bisectability issues, also implied partial commit reorder * Set supported HDMI version for the test bridges (new patch) - Rebased series onto latest drm-misc-next and removed "drm/rockchip: dw_hdmi_qp: Drop unnecessary #include" patch, since a similar change as been already applied - Link to v8: https://patch.msgid.link/20260702-dw-hdmi-qp-scramb-v8-0-d79890d00b6a@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 Changes in v7: - Split the scrambler_needed flag computation from the SCDC scrambling helpers into a standalone hdmi_state_helper patch for clarity (new patch 6) - Added vc4 HDMI conversion to common TMDS char rate constants and SCDC scrambling helpers as a proof of reuse (new patches 24-25) - Added KUnit tests for connector scrambler_supported/callback consistency validation (new patch 26) - Added 4K@60Hz 600MHz TMDS test EDID for high-rate scrambling coverage (new patch 27) - Added KUnit tests for hdmi_state_helper scrambler_needed flag: low-rate, high-rate, and source-no-support cases (new patch 28) - Fixed EDID conformity issues (edid-decode v1.33.0 failures) in the existing 1080p+4K YUV420 200MHz and 4K RGB/YUV 340MHz test EDIDs without changing the capabilities used by existing tests (new patches 29-30) - Rebased onto latest drm-misc-next - Link to v6: https://patch.msgid.link/20260520-dw-hdmi-qp-scramb-v6-0-24b74603b782@collabora.com Changes in v6: - Collected R-b & A-b tags from Dmitry and Heiko - Restructured the series from 10 into 22 patches, splitting the SCDC scrambling helpers, connector infrastructure, bridge operations, bridge_connector plumbing, dw-hdmi-qp implementation, and Rockchip platform changes into distinct commits - Added drm_scdc_dbg() macro to simplify debug messages (new patch) - Added drm_scdc_start/stop/sync_status() helpers for full scrambling lifecycle management (reworked from v5 patch 5) - Added drm_atomic_helper_connector_hdmi_hotplug_ctx() to propagate modeset acquire context for SCDC sync on hotplug (new patch) - Added connector scrambler callbacks and SCDC work/flag infrastructure as a separate patch (split from v5 patch 5) - Added DRM_BRIDGE_OP_HDMI_SCRAMBLER bridge operation with hdmi_scrambler_enable/disable callbacks (new patch) - Implemented bridge_connector scrambler interface wiring (new patch) - Added .enable_hpd()/.disable_hpd() PHY ops for dw-hdmi-qp bridge and Rockchip platform drivers, replacing the obsolete .setup_hpd() op - Added dw_hdmi_qp_hpd_notify() helper for targeted connector-only HPD notification (split from v5 patch 10) - Dropped drm_fb_helper_hotplug_event() unused variable (new cleanup) - Dropped unused drm_simple_kms_helper.h include (new cleanup) - Masked RK3576 HPD IRQ in io_init() for consistency with RK3588 - Rebased onto latest drm-misc-next - Link to v5: https://patch.msgid.link/20260426-dw-hdmi-qp-scramb-v5-0-d778e70c317b@collabora.com Changes in v5: - Added new patches: 1/10, 3/10, 6/10, 7/10, 8/10 - Removed redundant no-op error check in drm_bridge_helper_reset_crtc() (patch 1) - Removed the EDEADLK retry loop from the bridge .detect_ctx() callback, as that's already handled in the drm_bridge_detect_ctx() helper or by the caller when ctx is provided (patch 2) - Refactored drm_bridge_detect() to delegate to drm_bridge_detect_ctx() and added a WARN_ON for unexpected negative return values (patch 2) - Split the bridge-connector .detect_ctx() switch into a preparatory patch to use cached connector status in .get_modes() (patch 3) - Improved error handling in SCDC scrambling setup: roll back high TMDS clock ratio on scrambling failure, reset scramb_enabled flag on set_scramb failure, and add SCDC version read/write error checks (patch 5) - Annotated scramb_enabled with READ_ONCE/WRITE_ONCE for cross-context access between modeset paths and the scrambling work item (patch 5) - Renamed SCDC_MIN_SOURCE_VERSION to SCDC_MAX_SOURCE_VERSION (patch 5) - Rate limited i2c error messages (patch 6) - Added missing newlines in dev_err_probe() messages (patch 7) - Replaced indirect device pointer accesses with local dev variable in bind() (patch 8) - Split the HPD connector restriction (formerly patch 4/4): register HPD IRQ after connector setup first (patch 9), then restrict HPD event to the affected connector (patch 10); also collected R-b from Heiko - Rebased onto latest drm-misc-next - Link to v4: https://lore.kernel.org/r/20260303-dw-hdmi-qp-scramb-v4-0-317d3b8bd219@collabora.com Changes in v4: - Fixed conflicts while rebasing onto latest drm-misc-next - Link to v3: https://lore.kernel.org/r/20260119-dw-hdmi-qp-scramb-v3-0-bd8611730fc1@collabora.com Changes in v3: - Used drm_bridge_helper_reset_crtc() helper to reset the display pipeline and got rid of some boilerplate code (Maxime) - Rebased onto latest drm-misc-next - Link to v2: https://lore.kernel.org/r/20260113-dw-hdmi-qp-scramb-v2-0-ae7b2c58d24d@collabora.com Changes in v2: - Collected Tested-by tags from Diederik and Maud - Rebased onto latest drm-misc-next - Ensured the recently introduced 'no-hpd' support for dealing with unconnected/repurposed/broken HPD pin is limited to HDMI 1.4 rates - Link to v1: https://lore.kernel.org/r/20251203-dw-hdmi-qp-scramb-v1-0-836fe7401a69@collabora.com --- Cristian Ciocaltea (61): video/hdmi: Introduce HDMI version enum drm/display: hdmi: Rename drmm_connector_hdmi_init() to *_ini2() drm/connector: Add drmm_connector_hdmi_init() with new signature drm/display: bridge_connector: Convert to drmm_connector_hdmi_init() drm/connector: Add HDMI 2.0 scrambler infrastructure drm/display: scdc-helper: Add macro for connector-prefixed debug messages drm/display: scdc-helper: Add helper to set SCDC version information drm/display: hdmi: Add HDMI 2.0 scrambling management helpers drm/display: hdmi: Advertise SCDC source version when scrambling drm/bridge: Remove redundant error check in drm_bridge_helper_reset_crtc() drm/bridge: Add bridge ops for source-side HDMI 2.0 scrambling drm/display: bridge_connector: Use cached connector status in .get_modes() drm/display: bridge_connector: Switch to .detect_ctx() connector helper drm/display: bridge_connector: Wire up HDMI 2.0 scrambler callbacks drm/display: hdmi-state-helper: Add source TMDS rate validation drm/display: hdmi-state-helper: Pass acquire ctx to hotplug helpers drm/display: hdmi-state-helper: Sync SCDC state on hotplug drm/display: hdmi-state-helper: Set HDMI scrambling requirement drm/bridge: dw-hdmi-qp: Rate limit i2c read error messages drm/bridge: dw-hdmi-qp: Provide .{enable,disable}_hpd() PHY ops drm/bridge: dw-hdmi-qp: Remove unused workqueue include and define drm/bridge: dw-hdmi-qp: Add HDMI 2.0 scrambling support drm/bridge: dw-hdmi-qp: Provide dw_hdmi_qp_hpd_notify() helper drm/rockchip: dw_hdmi_qp: Fix NULL deref in PM ops on incomplete bind drm/rockchip: dw_hdmi_qp: Add missing newlines in dev_err_probe() messages drm/rockchip: dw_hdmi_qp: Use local dev variable consistently in bind() drm/rockchip: dw_hdmi_qp: Avoid spurious HPD IRQ thread wakeups drm/rockchip: dw_hdmi_qp: Mask RK3576 HPD IRQ in io_init drm/rockchip: dw_hdmi_qp: Implement .{enable,disable}_hpd() PHY ops drm/rockchip: dw_hdmi_qp: Factor out HPD interrupt (un)mask helpers drm/rockchip: dw_hdmi_qp: Control the HPD IRQ line via the bridge HPD ops drm/rockchip: dw_hdmi_qp: Use dw_hdmi_qp_hpd_notify() for HPD reports drm/bridge: dw-hdmi-qp: Drop unused .setup_hpd() phy op drm/vc4: hdmi: Use common TMDS char rate constants drm/vc4: hdmi: Switch to drm_hdmi_mode_needs_scrambling() drm/vc4: hdmi: Propagate -EDEADLK to the top level drm/vc4: hdmi: Convert to drmm_connector_hdmi_init() drm/vc4: hdmi: Convert to common HDMI 2.0 scrambling infrastructure drm/vc4: hdmi: Defer pixel clock validation to HDMI helpers drm/bridge: adv7511: Advertise HDMI 1.2 capabilities drm/bridge: inno-hdmi: Advertise HDMI 1.2 capabilities drm/bridge: ite-it6263: Drop redundant .mode_valid hook drm/bridge: ite-it6263: Advertise HDMI 1.3 capabilities drm/bridge: ite-it66121: Advertise HDMI 1.2 capabilities drm/bridge: lontium-lt9611: Advertise HDMI 1.4 capabilities drm/rockchip: rk3066_hdmi: Advertise HDMI 1.4 capabilities drm/sun4i: hdmi: Convert to drmm_connector_hdmi_init() drm/tests: edid: Add 4K@60Hz EDID with 600MHz TMDS drm/tests: edid: Fix conformity for 1080p+4K YUV420 200MHz EDID drm/tests: edid: Fix conformity for 4K RGB/YUV 340MHz EDID drm/tests: bridge: Set supported HDMI version drm/tests: connector: Convert to drmm_connector_hdmi_init() drm/tests: connector: Add HDMI max_tmds_char_rate init coverage drm/tests: connector: Add HDMI source-side scrambler coverage drm/tests: hdmi_state_helper: Convert to drmm_connector_hdmi_init() drm/tests: hdmi_state_helper: Add connector-provided max_tmds_char_rate coverage drm/tests: hdmi_state_helper: Cover source-side scrambling decision drm/connector: Remove drmm_connector_hdmi_ini2() drm/connector: Drop redundant hdmi vendor/product fields drm/connector: Drop redundant hdmi supported_formats field drm/connector: Drop redundant max_bpc field drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 22 +- drivers/gpu/drm/bridge/inno-hdmi.c | 1 + drivers/gpu/drm/bridge/ite-it6263.c | 33 +- drivers/gpu/drm/bridge/ite-it66121.c | 13 +- drivers/gpu/drm/bridge/lontium-lt9611.c | 16 +- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 124 ++++- drivers/gpu/drm/display/drm_bridge_connector.c | 158 ++++-- drivers/gpu/drm/display/drm_hdmi_helper.c | 288 ++++++++++ drivers/gpu/drm/display/drm_hdmi_state_helper.c | 73 ++- drivers/gpu/drm/display/drm_scdc_helper.c | 70 ++- drivers/gpu/drm/drm_bridge.c | 6 +- drivers/gpu/drm/drm_bridge_helper.c | 2 - drivers/gpu/drm/drm_connector.c | 90 +++- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 191 ++++--- drivers/gpu/drm/rockchip/rk3066_hdmi.c | 2 + drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 14 +- drivers/gpu/drm/tests/drm_bridge_test.c | 2 + drivers/gpu/drm/tests/drm_connector_test.c | 517 ++++++++++++------ drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 595 +++++++++++++++------ drivers/gpu/drm/tests/drm_kunit_edid.c | 251 +++++++-- drivers/gpu/drm/tests/drm_kunit_edid.h | 1 + drivers/gpu/drm/vc4/vc4_hdmi.c | 355 +++--------- drivers/gpu/drm/vc4/vc4_hdmi.h | 30 +- include/drm/bridge/dw_hdmi_qp.h | 4 +- include/drm/display/drm_hdmi_helper.h | 15 + include/drm/display/drm_hdmi_state_helper.h | 6 +- include/drm/display/drm_scdc_helper.h | 2 + include/drm/drm_bridge.h | 49 ++ include/drm/drm_connector.h | 161 +++++- include/linux/hdmi.h | 12 + 30 files changed, 2109 insertions(+), 994 deletions(-) --- base-commit: 9c99e09777509d9bd8cabb0c1132c981b4e668e2 change-id: 20251203-dw-hdmi-qp-scramb-cdbd8b57ccf9