From nobody Mon Jun 8 05:27:34 2026 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 AEDD6392C57 for ; Mon, 1 Jun 2026 22:45:12 +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=1780353913; cv=none; b=D1wYgCWlCExbQOwbnOGYA/aAxL3k4Lim1Cr0nDT47V0ElJ0AJJnV9wnCkNJIeLpRboyhfWx1cTQLS580QWmIgCdJ0TaLdqLCTxZPJo3gEkgR953L12j7VBjCp7hK7Etp1J8FLHl7vJVr2YuzxXgM/SRhzjClM10OkQfo19epzR8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353913; c=relaxed/simple; bh=1TxawDU3yjqoMhD2RXj7CT9lQcvokN1vb2eWoTYf5Z4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=F7+0NHw3+4dsgbcUe4TTYhLFUDPtR2BG3ZI85gJugvS8hdXBG/x+tBIilVNNH2nXGaIYVky+Sd4XJHxhA9+DakoVEg2Euxbu5thuM7tlIkSoft05AxnHenkDbqXxARQVnped4rrLDcv/L2J/7z5yzL0tAAg2+nry+EOjw9nhaW0= 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=TSOvRfFw; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="TSOvRfFw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353911; bh=1TxawDU3yjqoMhD2RXj7CT9lQcvokN1vb2eWoTYf5Z4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=TSOvRfFw5F3RtSqH3MW9Q5fC8Y58+untt3VP+tevALOHtUb5jwKJhjoHnOaeiwymu BIvlgQ00gYQwP55hA3+aQKsVInMQ5ky8I1KUs0c2xBoQeJSYP9a8h8BcOKqL+Xm3NG XcuAauYfJEBgBrnDlhKFnXOYgGqURxU4YTdHDgsJgXcChjAYdWB9WYrkAku2KKlXNf ApB1jdqevU9Z7zUEwmN/6y9/h8I6cNXMhi7KaDlhlurDYbl4a9XHhPc6mf2kE44zvi XN1zDxD9DeXOgcIW1oqCDwbZxxuTKyx5eNRtNljtEaYmClqxPbbMcyx/91dye7HBIf hqPXgpW2a9lrg== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 078C017E01B6; Tue, 2 Jun 2026 00:45:11 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:01 +0300 Subject: [PATCH v7 01/30] drm/fb-helper: Remove unused local variable in hotplug_event() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-1-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Remove the 'err' local variable in drm_fb_helper_hotplug_event() which only stores a return value that is never used beyond the immediate return statement. This simplifies the code without behavior changes. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/drm_fb_helper.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helpe= r.c index 7b11a582f8ec..3316bb00a662 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -1744,21 +1744,17 @@ EXPORT_SYMBOL(drm_fb_helper_initial_config); */ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) { - int err =3D 0; - if (!drm_fbdev_emulation || !fb_helper) return 0; =20 mutex_lock(&fb_helper->lock); - if (fb_helper->deferred_setup) { - err =3D __drm_fb_helper_initial_config_and_unlock(fb_helper); - return err; - } + if (fb_helper->deferred_setup) + return __drm_fb_helper_initial_config_and_unlock(fb_helper); =20 if (!fb_helper->fb || !drm_master_internal_acquire(fb_helper->dev)) { fb_helper->delayed_hotplug =3D true; mutex_unlock(&fb_helper->lock); - return err; + return 0; } =20 drm_master_internal_release(fb_helper->dev); @@ -1802,4 +1798,3 @@ bool drm_fb_helper_gem_is_fb(const struct drm_fb_help= er *fb_helper, return gem =3D=3D obj; } EXPORT_SYMBOL_GPL(drm_fb_helper_gem_is_fb); - --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 7C2AA380FEC for ; Mon, 1 Jun 2026 22:45:13 +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=1780353914; cv=none; b=L56FxBPC+ApTMXLdQ3Ykr2/U2ZHAQ4kKugG3V2/uC8giruvzP86ewU8ZAiQYfHxWBUNVOkjjdWk1fIuOfH4NeY1wZae/7xBF5coiHPGSpYw+mfw7mn9YYA3TmoIrD/2zyvcoblZjVMwXOG5WAALsAlVdNEgdVxRC94wpj7M5pKA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353914; c=relaxed/simple; bh=5mPr8GUk4/dmA8bUsbqpackEWr0cr5253B/asVUafak=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fHMqdIYhQLjkkbciDSf+c8skdPcATYb1bAOF8QS+Mg1uCOYm9RVSz9MvXOTznUeR0nAg3K7paglma1rKhFR0DMw3Tc5xgLFncidaeEi2jt9Ef9rehG+1X2K8Lq0w1aY1vnE/YcTNfwFd6Y/Vxydyn6tzLGm2Mr+XhsjA3Vk2eCg= 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=JJsVftFH; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="JJsVftFH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353911; bh=5mPr8GUk4/dmA8bUsbqpackEWr0cr5253B/asVUafak=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JJsVftFHlRGlVRSmnGPRWiHKbFb6/QgR+x6Basa6eJ2/zHzKhP2l6hLa2QoFxTTCn OCuE5RO9/q5UIU0oe8DJYTmSr8o8nG9ni7CU4baXv2MZEW2gb6Gw2fSIbo53r0j0T7 YWvNzpN3oDTYTghiiWA8pWllPOSn3xzMOr/Gj6Hu5/USSwfa5j8clJ9rKm8Eq2YAbI b+o2dVDayc+JaZwh8eHSkkwthDVRT+9eX+5rq9Pvud3tZNzUSKQYVjHHBhmyz8gHdq g7PPAN6G4kERaux5v5vG7ItWgUZq8tW1SZaPp9T43Z8eraGMmsyX9nUF38Q2T8ZWO7 3gARCgqmCn7Jg== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id C5BFD17E045E; Tue, 2 Jun 2026 00:45:11 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:02 +0300 Subject: [PATCH v7 02/30] drm/connector: Add HDMI 2.0 scrambler infrastructure Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-2-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Add the connector-level infrastructure to support HDMI 2.0 scrambling: - A scrambler_supported flag to indicate whether the source supports the scrambling capability, in which case the newly introduced .scrambler_{enable|disable}() callbacks in drm_connector_hdmi_funcs are mandatory - A scrambler_needed flag to be managed by the hdmi state helpers based on the negotiated TMDS character rate and the source/sink scrambling capabilities - A scrambler_enabled flag to track whether scrambling is currently active - A delayed work item (scdc_work) with an associated callback (scdc_cb) to monitor sink-side scrambling status and retry the setup if the sink resets it These are intended to be used by SCDC scrambling helpers to coordinate scrambling setup and teardown between the source driver and the DRM core. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/drm_connector.c | 18 +++++++++ include/drm/drm_connector.h | 81 +++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 99 insertions(+) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index a5d13b92b665..526dc2931b8a 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -220,6 +220,19 @@ void drm_connector_free_work_fn(struct work_struct *wo= rk) } } =20 +static void drm_connector_hdmi_scdc_work(struct work_struct *work) +{ + struct drm_connector *connector; + struct drm_connector_hdmi *hdmi; + + hdmi =3D container_of(to_delayed_work(work), struct drm_connector_hdmi, + scdc_work); + connector =3D container_of(hdmi, struct drm_connector, hdmi); + + if (hdmi->scdc_cb) + hdmi->scdc_cb(connector); +} + static int drm_connector_init_only(struct drm_device *dev, struct drm_connector *connector, const struct drm_connector_funcs *funcs, @@ -285,6 +298,7 @@ static int drm_connector_init_only(struct drm_device *d= ev, mutex_init(&connector->edid_override_mutex); mutex_init(&connector->hdmi.infoframes.lock); mutex_init(&connector->hdmi_audio.lock); + INIT_DELAYED_WORK(&connector->hdmi.scdc_work, drm_connector_hdmi_scdc_wor= k); connector->edid_blob_ptr =3D NULL; connector->epoch_counter =3D 0; connector->tile_blob_ptr =3D NULL; @@ -606,6 +620,10 @@ int drmm_connector_hdmi_init(struct drm_device *dev, !hdmi_funcs->hdmi.write_infoframe) return -EINVAL; =20 + if (connector->hdmi.scrambler_supported && + (!hdmi_funcs->scrambler_enable || !hdmi_funcs->scrambler_disable)) + return -EINVAL; + ret =3D drmm_connector_init(dev, connector, funcs, connector_type, ddc); if (ret) return ret; diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 529755c2e862..f1c5c15a6cce 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -1057,6 +1058,19 @@ struct drm_connector_hdmi_state { * @tmds_char_rate: TMDS Character Rate, in Hz. */ unsigned long long tmds_char_rate; + + /** + * @scrambler_needed: Whether HDMI 2.0 SCDC scrambling is required + * for the negotiated mode/bpc/format. + * + * Computed by drm_atomic_helper_connector_hdmi_check() from + * @tmds_char_rate and the source/sink scrambling capabilities. + * + * Per HDMI 2.0, scrambling is mandatory above 340 MHz TMDS + * character rate. Optional scrambling at lower rates is + * deliberately not requested by the helper. + */ + bool scrambler_needed; }; =20 /** @@ -1358,6 +1372,36 @@ struct drm_connector_hdmi_funcs { */ const struct drm_edid *(*read_edid)(struct drm_connector *connector); =20 + /** + * @scrambler_enable: + * + * This callback is invoked through @drm_scdc_start_scrambling during + * a commit to setup SCDC scrambling and high TMDS clock ratio on + * source side. + * + * The @scrambler_enable callback is mandatory if HDMI 2.0 is to be + * supported. + * + * Returns: + * 0 on success, a negative error code otherwise + */ + int (*scrambler_enable)(struct drm_connector *connector); + + /** + * @scrambler_disable: + * + * This callback is invoked through @drm_scdc_stop_scrambling during + * a commit to disable SCDC scrambling and high TMDS clock ratio on + * source side. + * + * The @scrambler_disable callback is mandatory if HDMI 2.0 is to be + * supported. + * + * Returns: + * 0 on success, a negative error code otherwise + */ + int (*scrambler_disable)(struct drm_connector *connector); + /** * @avi: * @@ -1960,6 +2004,43 @@ struct drm_connector_hdmi { */ unsigned long supported_formats; =20 + /** + * @scrambler_supported: Indicates whether the HDMI controller + * (source) supports HDMI 2.0 SCDC scrambling. + * + * When true, @drm_connector_hdmi_funcs.scrambler_enable and + * @drm_connector_hdmi_funcs.scrambler_disable are mandatory. + * This is enforced by drmm_connector_hdmi_init(). + * + * For HDMI bridge based drivers using drm_bridge_connector_init(), + * this is propagated automatically from bridges that set the + * DRM_BRIDGE_OP_HDMI_SCRAMBLER flag in their &drm_bridge->ops. + * Other drivers must set this field on @connector->hdmi before calling + * drmm_connector_hdmi_init(). + */ + bool scrambler_supported; + + /** + * @scrambler_enabled: Tracks whether HDMI 2.0 scrambler is currently ena= bled. + */ + bool scrambler_enabled; + + /** + * @scdc_work: Work item currently used to monitor sink-side scrambling + * status and retry setup if the sink resets it. + */ + struct delayed_work scdc_work; + + /** @scdc_cb: Callback to be invoked as part of @scdc_work. + * + * Currently used to monitor sink-side scrambling status and retry + * setup if the sink resets it. + * + * This is assigned by the framework when making use of + * drm_scdc_start_scrambling() helper. + */ + void (*scdc_cb)(struct drm_connector *connector); + /** * @funcs: HDMI connector Control Functions */ --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 4966A34D92C for ; Mon, 1 Jun 2026 22:45:14 +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=1780353915; cv=none; b=S04ue6hUqgyQISrZDXsnV4VPG87wv+I2Q6jJ+rjgTMHQ3iWVram0oBam/SLoMJTkHvTQnGZpwoqJ6bK0Qvo+KzbPVwcBC5I7Liz7ngrWQiArBpUL4m7HCjQv91aeWMwf2/WBJ8+jhD8BqU8K5sUb1CjCZ3EYKaLhhLG70pgeREY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353915; c=relaxed/simple; bh=rpL3MHwmbukVAMlSNrXnpHWWnXcNs/kbJP+qO9PfFXw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=C4EXS/gaAxYuuwJ6+5ck1LSkmmU9mhqC8yunq8fB78g3YybWoTArz2JNQK1VczJ1NWVYyKJ17SaH0Nao3vLR8THHsNIo2LbaU0VPatdFeWYT55atBSukjPPSpwyqdWQO0URFYXP9brQC6wrQe6t2OfahLREoQdqQY2wwGwYaIZw= 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=I1v1vuS5; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="I1v1vuS5" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353912; bh=rpL3MHwmbukVAMlSNrXnpHWWnXcNs/kbJP+qO9PfFXw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=I1v1vuS5ZqOMXJ1VecZnWOGHAFaqHZFuKyUmSOcDNY3/4SZ+nM7yBeo3Jyx/NED7S rKmkH3SBRA9bHzL1p+KyiJh08WevT+WZ5gDZQXAjl9+/h66ylEjb7oMU2uqY9/5sAo EarPIsmu47wefj2cQRciNErVejVeo4A3bEaFPdB6ShGGB/38RblVfymFYjGAXe7eTg azV8zgrro4rKn90UPQ2Ihg8Pho8eekTjhrVW84+ea+cM00fXS4sZIOWxCw3XOfoSA/ MxU4AU+B7fb20pHLVioFtN0awq+YqRDN2pZa+x3LZ13ULwr1DNlW0iP7gtvjCzffHb d17VbA7bYh4Fw== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 86BC617E0A6C; Tue, 2 Jun 2026 00:45:12 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:03 +0300 Subject: [PATCH v7 03/30] drm/display: scdc_helper: Add macro for connector-prefixed debug messages Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-3-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Introduce the drm_scdc_dbg() wrapper over drm_dbg_kms() to help getting rid of the boilerplate around prefixing the debug messages with the connector information. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/display/drm_scdc_helper.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/display/drm_scdc_helper.c b/drivers/gpu/drm/di= splay/drm_scdc_helper.c index df878aad4a36..cb6632346aad 100644 --- a/drivers/gpu/drm/display/drm_scdc_helper.c +++ b/drivers/gpu/drm/display/drm_scdc_helper.c @@ -55,6 +55,10 @@ =20 #define SCDC_I2C_SLAVE_ADDRESS 0x54 =20 +#define drm_scdc_dbg(connector, fmt, ...) \ + drm_dbg_kms((connector)->dev, "[CONNECTOR:%d:%s] " fmt, \ + (connector)->base.id, (connector)->name, ##__VA_ARGS__) + /** * drm_scdc_read - read a block of data from SCDC * @adapter: I2C controller @@ -158,9 +162,7 @@ bool drm_scdc_get_scrambling_status(struct drm_connecto= r *connector) =20 ret =3D drm_scdc_readb(connector->ddc, SCDC_SCRAMBLER_STATUS, &status); if (ret < 0) { - drm_dbg_kms(connector->dev, - "[CONNECTOR:%d:%s] Failed to read scrambling status: %d\n", - connector->base.id, connector->name, ret); + drm_scdc_dbg(connector, "Failed to read scrambling status: %d\n", ret); return false; } =20 @@ -188,9 +190,7 @@ bool drm_scdc_set_scrambling(struct drm_connector *conn= ector, =20 ret =3D drm_scdc_readb(connector->ddc, SCDC_TMDS_CONFIG, &config); if (ret < 0) { - drm_dbg_kms(connector->dev, - "[CONNECTOR:%d:%s] Failed to read TMDS config: %d\n", - connector->base.id, connector->name, ret); + drm_scdc_dbg(connector, "Failed to read TMDS config: %d\n", ret); return false; } =20 @@ -201,9 +201,7 @@ bool drm_scdc_set_scrambling(struct drm_connector *conn= ector, =20 ret =3D drm_scdc_writeb(connector->ddc, SCDC_TMDS_CONFIG, config); if (ret < 0) { - drm_dbg_kms(connector->dev, - "[CONNECTOR:%d:%s] Failed to enable scrambling: %d\n", - connector->base.id, connector->name, ret); + drm_scdc_dbg(connector, "Failed to enable scrambling: %d\n", ret); return false; } =20 @@ -248,9 +246,7 @@ bool drm_scdc_set_high_tmds_clock_ratio(struct drm_conn= ector *connector, =20 ret =3D drm_scdc_readb(connector->ddc, SCDC_TMDS_CONFIG, &config); if (ret < 0) { - drm_dbg_kms(connector->dev, - "[CONNECTOR:%d:%s] Failed to read TMDS config: %d\n", - connector->base.id, connector->name, ret); + drm_scdc_dbg(connector, "Failed to read TMDS config: %d\n", ret); return false; } =20 @@ -261,9 +257,7 @@ bool drm_scdc_set_high_tmds_clock_ratio(struct drm_conn= ector *connector, =20 ret =3D drm_scdc_writeb(connector->ddc, SCDC_TMDS_CONFIG, config); if (ret < 0) { - drm_dbg_kms(connector->dev, - "[CONNECTOR:%d:%s] Failed to set TMDS clock ratio: %d\n", - connector->base.id, connector->name, ret); + drm_scdc_dbg(connector, "Failed to set TMDS clock ratio: %d\n", ret); return false; } =20 --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 D5E243955F6 for ; Mon, 1 Jun 2026 22:45:14 +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=1780353918; cv=none; b=ly31Jp7GvVACe5DmJ2yL9vEsBreYD+yW0fguOPqp9ATI1W4MVmNQkOPsbFn+PhtJDtzyQRaD6r7W7a+kV0AykuVtFqloW3CjchCWhZgWohtLWUooz7/aDKHnPkElBX0TJJdsIcCjf4plJsORiwJjy04zLArCiickrr5p0QKRpNs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353918; c=relaxed/simple; bh=tiJHoz6sHTaLSRkeGeJGIUitrKvwGKQyqPEx82TOIfw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VEe/XqU35+3jlPml0W+G2vq2U5rpqX5fsgr1I4+0M9zJJHdqud7vdapJdsYJZQq3mOfaqdJCwXX6hON0cSedJkUCcZYIl4HbU7TXNWvKBM5jP6NIEQRTnVT9+vVTbw68JYFz2vqu34wqk9Skd6ctdecPcSzlPRJc8DGY9z6N3wA= 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=UEkPgE5A; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="UEkPgE5A" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353913; bh=tiJHoz6sHTaLSRkeGeJGIUitrKvwGKQyqPEx82TOIfw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=UEkPgE5AexUsRFdHETBc1ZOjtZ8E+QKdH3frwrT5l3fpYzPwGzQTFM+WBQVNv7hxC NkKzcgVaSPnEYiWXgi85sKkHF4/BXukVz1C1jWTmqp6XulNROiKkpPLWG9ZIRfROr7 4vCLSrYjTrk9liGkrt1gncqywQYQk7v38MxusxnjbQXeEHGhdr7jY0ZUorYPNucIti /lnqR2as47AEGMNEfklhyUTZgndmG7nVkbeWzrLQ8vTXdMB3wGiu4+apSXFDinh7e3 x0Tcdp8/kuAAYFRcROS6rPbM7nMPNKSmjrjprk6NEefu2jARB/ZXBnbKmN1D2vqYcP 0GWGCvgd2CPoA== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 4735217E0B66; Tue, 2 Jun 2026 00:45:13 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:04 +0300 Subject: [PATCH v7 04/30] drm/display: scdc_helper: Add HDMI 2.0 scrambling management helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-4-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Add helpers to manage the full lifecycle of HDMI 2.0 SCDC scrambling on both source and sink sides: - drm_scdc_start_scrambling(): configures SCDC scrambling and high TMDS clock ratio and starts a periodic work item that monitors the sink's SCDC scrambling status, retrying setup when the sink loses state - drm_scdc_stop_scrambling(): tears down scrambling on both sides and cancels the monitoring work - drm_scdc_sync_status(): triggers a CRTC reset on reconnection to restore SCDC state lost during sink disconnects within an active display pipeline Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/display/drm_scdc_helper.c | 245 ++++++++++++++++++++++++++= +++- include/drm/display/drm_scdc_helper.h | 6 +- 2 files changed, 244 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/display/drm_scdc_helper.c b/drivers/gpu/drm/di= splay/drm_scdc_helper.c index cb6632346aad..f71728e5ca81 100644 --- a/drivers/gpu/drm/display/drm_scdc_helper.c +++ b/drivers/gpu/drm/display/drm_scdc_helper.c @@ -21,15 +21,22 @@ * DEALINGS IN THE SOFTWARE. */ =20 +#include #include #include +#include #include -#include + +#include +#include +#include +#include +#include +#include +#include +#include =20 #include -#include -#include -#include =20 /** * DOC: scdc helpers @@ -50,10 +57,14 @@ * has to track the connector status changes using interrupts and * restore the SCDC status. The typical solution for this is to trigger an * empty modeset in drm_connector_helper_funcs.detect_ctx(), like what vc4= does - * in vc4_hdmi_reset_link(). + * in vc4_hdmi_reset_link(). Alternatively, use the HDMI connector framewo= rk + * which ensures drm_scdc_sync_status() is called in the context of + * drm_atomic_helper_connector_hdmi_hotplug_ctx(). */ =20 -#define SCDC_I2C_SLAVE_ADDRESS 0x54 +#define SCDC_I2C_SLAVE_ADDRESS 0x54 +#define SCDC_MAX_SOURCE_VERSION 0x1 +#define SCDC_STATUS_POLL_DELAY_MS 1000 =20 #define drm_scdc_dbg(connector, fmt, ...) \ drm_dbg_kms((connector)->dev, "[CONNECTOR:%d:%s] " fmt, \ @@ -270,3 +281,225 @@ bool drm_scdc_set_high_tmds_clock_ratio(struct drm_co= nnector *connector, return true; } EXPORT_SYMBOL(drm_scdc_set_high_tmds_clock_ratio); + +static int drm_scdc_try_scrambling_setup(struct drm_connector *connector) +{ + bool done; + + done =3D drm_scdc_set_high_tmds_clock_ratio(connector, true); + if (!done) + return -EIO; + + done =3D drm_scdc_set_scrambling(connector, true); + if (!done) + return -EIO; + + if (READ_ONCE(connector->hdmi.scrambler_enabled)) + schedule_delayed_work(&connector->hdmi.scdc_work, + msecs_to_jiffies(SCDC_STATUS_POLL_DELAY_MS)); + + return 0; +} + +static void drm_scdc_monitor_scrambler(struct drm_connector *connector) +{ + if (READ_ONCE(connector->hdmi.scrambler_enabled) && + !drm_scdc_get_scrambling_status(connector)) + drm_scdc_try_scrambling_setup(connector); +} + +static int drm_scdc_reset_crtc(struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx) +{ + struct drm_device *dev =3D connector->dev; + struct drm_crtc *crtc; + u8 config; + int ret; + + if (!ctx) + return 0; + + /* + * This is normally part of .detect_ctx() call path, which already holds + * connection_mutex through @ctx. However, re-acquiring it with the + * same context is a no-op and makes the helper safe under any caller. + */ + ret =3D drm_modeset_lock(&dev->mode_config.connection_mutex, ctx); + if (ret) + return ret; + + if (!connector->state) + return 0; + + crtc =3D connector->state->crtc; + if (!crtc) + return 0; + + ret =3D drm_scdc_readb(connector->ddc, SCDC_TMDS_CONFIG, &config); + if (ret) { + drm_scdc_dbg(connector, "Failed to read TMDS config: %d\n", ret); + return ret; + } + + if ((config & SCDC_SCRAMBLING_ENABLE) && + (config & SCDC_TMDS_BIT_CLOCK_RATIO_BY_40)) + return 0; + + /* + * Reset the CRTC to suspend TMDS transmission, conforming to HDMI 2.0 + * spec which requires scrambled data not to be sent before the sink is + * configured, and TMDS clock to be suspended while changing the clock + * ratio. The disable/re-enable cycle triggered by the reset should + * call drm_scdc_start_scrambling() during re-enable, properly + * configuring the sink before data transmission resumes. + */ + + drm_scdc_dbg(connector, "Resetting CRTC to restore SCDC status\n"); + + ret =3D drm_atomic_helper_reset_crtc(crtc, ctx); + if (ret && ret !=3D -EDEADLK) + drm_scdc_dbg(connector, "Failed to reset CRTC: %d\n", ret); + + return ret; +} + +/** + * drm_scdc_start_scrambling - activate scrambling and monitor SCDC status + * @connector: connector + * + * Enables scrambling and high TMDS clock ratio on both source and sink si= des. + * Additionally, use a delayed work item to monitor the scrambling status = on + * the sink side and retry the operation, as some displays refuse to set t= he + * scrambling bit right away. + * + * Returns: + * Zero if scrambling is set successfully, an error code otherwise. + */ +int drm_scdc_start_scrambling(struct drm_connector *connector) +{ + struct drm_display_info *info =3D &connector->display_info; + struct drm_connector_hdmi *hdmi =3D &connector->hdmi; + int ret; + u8 ver; + + if (!hdmi->scrambler_supported) { + drm_scdc_dbg(connector, "Scrambler not supported, bailing.\n"); + return -EINVAL; + } + + if (!info->is_hdmi || + !info->hdmi.scdc.supported || + !info->hdmi.scdc.scrambling.supported) { + drm_scdc_dbg(connector, "Sink doesn't support scrambling.\n"); + return -EINVAL; + } + + drm_scdc_dbg(connector, "Enabling scrambling\n"); + + ret =3D drm_scdc_readb(connector->ddc, SCDC_SINK_VERSION, &ver); + if (ret) { + drm_scdc_dbg(connector, "Failed to read SCDC_SINK_VERSION: %d\n", ret); + return ret; + } + + ret =3D drm_scdc_writeb(connector->ddc, SCDC_SOURCE_VERSION, + min_t(u8, ver, SCDC_MAX_SOURCE_VERSION)); + if (ret) { + drm_scdc_dbg(connector, "Failed to write SCDC_SOURCE_VERSION: %d\n", ret= ); + return ret; + } + + hdmi->scdc_cb =3D drm_scdc_monitor_scrambler; + WRITE_ONCE(hdmi->scrambler_enabled, true); + + ret =3D drm_scdc_try_scrambling_setup(connector); + if (!ret) + ret =3D hdmi->funcs->scrambler_enable(connector); + + if (ret) { + WRITE_ONCE(hdmi->scrambler_enabled, false); + cancel_delayed_work_sync(&hdmi->scdc_work); + hdmi->scdc_cb =3D NULL; + + drm_scdc_set_scrambling(connector, false); + drm_scdc_set_high_tmds_clock_ratio(connector, false); + } + + return ret; +} +EXPORT_SYMBOL(drm_scdc_start_scrambling); + +/** + * drm_scdc_stop_scrambling - deactivate scrambling and SCDC status monitor + * @connector: connector + * + * Disables scrambling and high TMDS clock ratio on both source and sink s= ides. + * Also cancels the SCDC status monitoring work item, if it is still pendi= ng. + * + * Returns: + * Zero if scrambling is reset successfully, an error code otherwise. + */ +int drm_scdc_stop_scrambling(struct drm_connector *connector) +{ + struct drm_display_info *info =3D &connector->display_info; + struct drm_connector_hdmi *hdmi =3D &connector->hdmi; + + if (!hdmi->scrambler_supported) { + drm_scdc_dbg(connector, "Scrambler not supported, bailing.\n"); + return -EINVAL; + } + + if (!READ_ONCE(hdmi->scrambler_enabled)) + return 0; + + drm_scdc_dbg(connector, "Disabling scrambling\n"); + + WRITE_ONCE(hdmi->scrambler_enabled, false); + cancel_delayed_work_sync(&hdmi->scdc_work); + hdmi->scdc_cb =3D NULL; + + if (connector->status =3D=3D connector_status_connected && + info->is_hdmi && info->hdmi.scdc.supported && + info->hdmi.scdc.scrambling.supported) { + drm_scdc_set_scrambling(connector, false); + drm_scdc_set_high_tmds_clock_ratio(connector, false); + } + + return hdmi->funcs->scrambler_disable(connector); +} +EXPORT_SYMBOL(drm_scdc_stop_scrambling); + +/** + * drm_scdc_sync_status - resync the sink-side SCDC upon reconnect + * @connector: connector + * @plugged: connector plugged status event + * @ctx: initialized lock acquisition context + * + * When receiving hotplug disconnect/reconnect event, while the display is + * still active (CRTC enabled), the SCDC status on the sink side is reset + * and must be explicitly restored. + * + * The typical solution for this is to trigger an empty modeset in + * drm_connector_helper_funcs.detect_ctx(), which is what this helper does + * by triggering a CRTC reset on reconnection. + * + * When making use of the HDMI connector framework, this is automatically + * triggered via drm_atomic_helper_connector_hdmi_hotplug_ctx(). + * + * Returns: + * Zero on success, an error code otherwise, including -EDEADLK. + */ +int drm_scdc_sync_status(struct drm_connector *connector, bool plugged, + struct drm_modeset_acquire_ctx *ctx) +{ + struct drm_connector_hdmi *hdmi =3D &connector->hdmi; + + if (hdmi->scrambler_supported && plugged && + READ_ONCE(hdmi->scrambler_enabled)) + return drm_scdc_reset_crtc(connector, ctx); + + /* TODO: Also handle HDMI 2.1 FRL link training */ + + return 0; +} +EXPORT_SYMBOL(drm_scdc_sync_status); diff --git a/include/drm/display/drm_scdc_helper.h b/include/drm/display/dr= m_scdc_helper.h index 34600476a1b9..5d9a37bbb362 100644 --- a/include/drm/display/drm_scdc_helper.h +++ b/include/drm/display/drm_scdc_helper.h @@ -29,6 +29,7 @@ #include =20 struct drm_connector; +struct drm_modeset_acquire_ctx; struct i2c_adapter; =20 ssize_t drm_scdc_read(struct i2c_adapter *adapter, u8 offset, void *buffer, @@ -76,5 +77,8 @@ bool drm_scdc_get_scrambling_status(struct drm_connector = *connector); =20 bool drm_scdc_set_scrambling(struct drm_connector *connector, bool enable); bool drm_scdc_set_high_tmds_clock_ratio(struct drm_connector *connector, b= ool set); - +int drm_scdc_start_scrambling(struct drm_connector *connector); +int drm_scdc_stop_scrambling(struct drm_connector *connector); +int drm_scdc_sync_status(struct drm_connector *connector, bool plugged, + struct drm_modeset_acquire_ctx *ctx); #endif --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 9A066395AED for ; Mon, 1 Jun 2026 22:45:15 +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=1780353922; cv=none; b=hnfRizelBXamgyBR+4WJHeT5piogaKHVrb3MRY2fTNx4lXgRrqYJEHhpM2luKso/WrYVsiduOPSdo1ZKFsVQ4wlXHQil6J8T1cz0V1ORfQIAmVhoDgZNX7Kn3N7K5GkpzbF9XsqT0nqa504T9efj/HIrgYfvD1E8O0lyLvFOihY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353922; c=relaxed/simple; bh=qd5KmmczyZ6wEzeipbZ7XdsJaimi0OgdnkXBt1vaPbw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rYNUN3WiYm0QMJdNuA3/Lf3wybq7019nDfO4WAosSTkzXSxaAq3z4PfzC+92h7JflteJ+z1S+6rFi0dNCk+n41EDMHxiHRcqNA7+jXXemJcIA4jzGz5UQTHhvG9ONx4rgezctekBbrJIjY0zupUbDvj6Xap5Ql3g39Ctwxl0HkA= 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=qZz1vVDC; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="qZz1vVDC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353914; bh=qd5KmmczyZ6wEzeipbZ7XdsJaimi0OgdnkXBt1vaPbw=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=qZz1vVDCrHWuuwThR8nqtR1sCRtHFi1Ix37vgaWBRPc5g17f8243PY+U2njtBEpS9 4bI6B3G9f4oDcuqY6BDR9vnrvrBeQMOTzXKJ6ZaxfZGXZ4lwUeO1rMqRa7poBeahZR mjbFDUHEpljJOBR78QkPS6gHhZzrfYeOx4KX/4RzU77PX+gkSJ7Z0IfKpWfcoJRb6r HrhH63oflUMUFX8bcxMdVBYpH/suYraYBPdNsESoASBOYycNT3sQy3WNhp3QdEsaiu WdtXcRoHie+x5IOONXeTH5Vnaeh6hwENhUlzSHPGIUe2uUgUKDqs5AzvpJp8uJLran 8gVzUuuU2xz4w== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 0F4A517E0B69; Tue, 2 Jun 2026 00:45:14 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:05 +0300 Subject: [PATCH v7 05/30] drm/display: hdmi_state_helper: Add ctx-aware hotplug helper for SCDC sync Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-5-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Introduce drm_atomic_helper_connector_hdmi_hotplug_ctx(), a variant of drm_atomic_helper_connector_hdmi_hotplug() that accepts a drm_modeset_acquire_ctx. This enables SCDC status synchronization on hotplug events, which requires lock acquisition context for performing the CRTC reset triggered by drm_scdc_sync_status(). Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 40 ++++++++++++++++++++-= ---- include/drm/display/drm_hdmi_state_helper.h | 4 +++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index a331ebdd65af..a96d81cbf94f 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -12,6 +12,7 @@ #include #include #include +#include =20 /** * DOC: hdmi helpers @@ -1150,18 +1151,20 @@ drm_atomic_helper_connector_hdmi_clear_audio_infofr= ame(struct drm_connector *con } EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_clear_audio_infoframe); =20 -static void +static int drm_atomic_helper_connector_hdmi_update(struct drm_connector *connector, - enum drm_connector_status status) + enum drm_connector_status status, + struct drm_modeset_acquire_ctx *ctx) { const struct drm_edid *drm_edid; + int ret =3D 0; =20 if (status =3D=3D connector_status_disconnected) { - // TODO: also handle scramber, HDMI sink disconnected. + ret =3D drm_scdc_sync_status(connector, false, ctx); drm_connector_hdmi_audio_plugged_notify(connector, false); drm_edid_connector_update(connector, NULL); drm_connector_cec_phys_addr_invalidate(connector); - return; + return ret; } =20 if (connector->hdmi.funcs->read_edid) @@ -1174,10 +1177,12 @@ drm_atomic_helper_connector_hdmi_update(struct drm_= connector *connector, drm_edid_free(drm_edid); =20 if (status =3D=3D connector_status_connected) { - // TODO: also handle scramber, HDMI sink is now connected. + ret =3D drm_scdc_sync_status(connector, true, ctx); drm_connector_hdmi_audio_plugged_notify(connector, true); drm_connector_cec_phys_addr_set(connector); } + + return ret; } =20 /** @@ -1191,10 +1196,31 @@ drm_atomic_helper_connector_hdmi_update(struct drm_= connector *connector, void drm_atomic_helper_connector_hdmi_hotplug(struct drm_connector *connec= tor, enum drm_connector_status status) { - drm_atomic_helper_connector_hdmi_update(connector, status); + drm_atomic_helper_connector_hdmi_update(connector, status, NULL); } EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_hotplug); =20 +/** + * drm_atomic_helper_connector_hdmi_hotplug_ctx - Handle the hotplug event= for the HDMI connector + * @connector: A pointer to the HDMI connector + * @status: Connection status + * @ctx: Lock acquisition context to be used for resetting CRTC + * + * This function should be called as a part of the .detect() / .detect_ctx= () + * callbacks for all status changes. + * + * Returns: + * Zero on success, error code on failure. + * If @ctx is set, it might also return -EDEADLK. + */ +int drm_atomic_helper_connector_hdmi_hotplug_ctx(struct drm_connector *con= nector, + enum drm_connector_status status, + struct drm_modeset_acquire_ctx *ctx) +{ + return drm_atomic_helper_connector_hdmi_update(connector, status, ctx); +} +EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_hotplug_ctx); + /** * drm_atomic_helper_connector_hdmi_force - HDMI Connector implementation = of the force callback * @connector: A pointer to the HDMI connector @@ -1206,6 +1232,6 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_hotplu= g); */ void drm_atomic_helper_connector_hdmi_force(struct drm_connector *connecto= r) { - drm_atomic_helper_connector_hdmi_update(connector, connector->status); + drm_atomic_helper_connector_hdmi_update(connector, connector->status, NUL= L); } EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_force); diff --git a/include/drm/display/drm_hdmi_state_helper.h b/include/drm/disp= lay/drm_hdmi_state_helper.h index 13375bd0f4ae..75fedd4a3ba8 100644 --- a/include/drm/display/drm_hdmi_state_helper.h +++ b/include/drm/display/drm_hdmi_state_helper.h @@ -7,6 +7,7 @@ struct drm_atomic_commit; struct drm_connector; struct drm_connector_state; struct drm_display_mode; +struct drm_modeset_acquire_ctx; struct hdmi_audio_infoframe; =20 enum drm_connector_status; @@ -24,6 +25,9 @@ int drm_atomic_helper_connector_hdmi_update_infoframes(st= ruct drm_connector *con struct drm_atomic_commit *state); void drm_atomic_helper_connector_hdmi_hotplug(struct drm_connector *connec= tor, enum drm_connector_status status); +int drm_atomic_helper_connector_hdmi_hotplug_ctx(struct drm_connector *con= nector, + enum drm_connector_status status, + struct drm_modeset_acquire_ctx *ctx); void drm_atomic_helper_connector_hdmi_force(struct drm_connector *connecto= r); =20 enum drm_mode_status --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 532B9392C2F for ; Mon, 1 Jun 2026 22:45:16 +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=1780353923; cv=none; b=ueV5zi0jcmwmcc9FqBRf6HFwzggdGZZBpbkaCdVrCvrrB60OUnFvkZdlp9yvIdgTURccLTSFW6aR62uumavTAg5X1Frv2suPiM7Q2tEnmZV5eN0NcnSx2YtwXgk89B8EIuiIINmFxJiH9zwbUcBI2+U8HMSko6FnFCrgV0jtr5A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353923; c=relaxed/simple; bh=nrOKDTe1HmXsLH2kqmhLmoDqq6g4GvbMXtZ492I514E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b2vrF54Z+++kJ32od2MzDYGEnnFOIraxGn0hGxM5a3pHvgKa7W9WqvGJhzpVBLGdngWXLpJjeTLrnXhwqQNtANcwkT1iCBMSkAGryZQPyHOFff1C0u3oPAMUFDeSZZ1wgOr8zWOCxnXiQglHX4VmDrc64dQPuqQE5Q8r1X5NTFA= 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=pa9AIksV; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="pa9AIksV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353915; bh=nrOKDTe1HmXsLH2kqmhLmoDqq6g4GvbMXtZ492I514E=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pa9AIksVwxUHazLrV3OYVJTlSkSaPcg3SetCh2RRQsKs9jjbtIF6AobBvXV3iShS3 UFYagSZfJbu9XTry7vFY2Ah7P/4GmUYkn3K8jYu3qinBL/+NYtuVknXQVPtO5/wCt2 Phkq+mkZ9sel5Sx8E2WLlQKIMvAVd0+UTKMADf0H+thvxrDBumeC+kwCpA0dNsOxXA yr/gMxk2IH3l4YsgHvFSIS5sSZgpzgOKtGLpuw8Sjat+wgi5wD50JtSODmbutFs1Xo 3FwPLBBfOvvPcnXQ3+RpzxVnoUeLA3879sw2xwbkdcJLFfvRpfY9euV/YUrjOmPJtG TRf+jPUyK99pg== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id C244517E0C54; Tue, 2 Jun 2026 00:45:14 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:06 +0300 Subject: [PATCH v7 06/30] drm/display: hdmi_state_helper: Plumb HDMI 2.0 source scrambling capability Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-6-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Toggle drm_connector_hdmi_state.scrambler_needed flag when the TMDS character rate exceeds 340 MHz and both the source and the sink advertise SCDC scrambling capability. Drivers no longer need to open-code this check. According to HDMI 2.0 spec, scrambling is only mandatory above 340 MHz; the optional sub-340 MHz scrambling path is intentionally not requested. Once all drivers are converted to advertise the scrambler support, the unsupported HDMI 2.0 modes could be simply rejected. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index a96d81cbf94f..7cb880dcedfe 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -588,6 +588,21 @@ hdmi_compute_clock(const struct drm_connector *connect= or, if (status !=3D MODE_OK) return -EINVAL; =20 + if (clock > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ) { + const struct drm_display_info *info =3D &connector->display_info; + + /* + * TODO: Reject unsupported HDMI 2.0 modes once all drivers + * advertise their scrambler capability. + */ + conn_state->hdmi.scrambler_needed =3D connector->hdmi.scrambler_supporte= d && + info->is_hdmi && + info->hdmi.scdc.supported && + info->hdmi.scdc.scrambling.supported; + } else { + conn_state->hdmi.scrambler_needed =3D false; + } + conn_state->hdmi.tmds_char_rate =3D clock; =20 return 0; --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 42F2C396B73 for ; Mon, 1 Jun 2026 22:45:17 +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=1780353926; cv=none; b=jm1rsMutPuR7yiKSlvyFPpRABfVjBrL04FaY+G67kMticyg8SdKctST7XIkqyx0eDlcel2uAo5YFWHlQT1GC0TzK/HpQGxDqnmkpA9IKc4KoLv/AVz+Ief+7WfIDv0UGkMRBHjvRSLxJ1idJ0sd1fXXxhsK130S0XZaXBPRWbpk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353926; c=relaxed/simple; bh=QCn0pWH6R490QoGfBT3a1Vn0/GvOOWVICGTR08194MA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=te6ixShIylL2iy1NYx7AJ40C8Qe3xb1vg8MLMPFyUuHLymj7u+LRziD6elohFXuoNANH4EC0cmWm7PMOwVNhLnAEHuEVc0Yl1VM/3HUpb/E+fg7QTv5FDAwUIiu5q8OP3I+YwTh4ZkLMSkb3FveoBRMnfS9taQcDSb/32K7n0Oo= 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=aU9LyL6P; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="aU9LyL6P" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353915; bh=QCn0pWH6R490QoGfBT3a1Vn0/GvOOWVICGTR08194MA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aU9LyL6PqthadcIa1yCskb+xzzuyS66ZVTNen2vYlCXieLBBOxUSwoyVsI1TtT1od ox2RzYLlHY++/iDP2xqC68XunTnblqmtZ7s/DkMON92XcMocT3pXvW42QjFdRtStGP OvJ2h/u+KGk22iNd2O73FnTjZ4lGomU7l35azVMnjg/6/oMXYCJdChBy5/Bp+nFslv LGL2K0BmhUrZeliiM86NikCissaD4ngOeUgs7M4/DC4lxtr3HOmmririIuhVY3gNSL caLG2tZaProkmAuRtCnH0tdcig+73wndljYcl8Lcq0DIgFeG5Hw7PiaMXzrjc9ZvKP +4RfomGb+RXLA== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 8882B17E0C88; Tue, 2 Jun 2026 00:45:15 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:07 +0300 Subject: [PATCH v7 07/30] drm/bridge: Remove redundant error check in drm_bridge_helper_reset_crtc() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-7-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Dmitry Baryshkov X-Mailer: b4 0.15.2 Remove the no-op error check after drm_atomic_helper_reset_crtc() since the goto target is the immediately following label and the return value is already propagated correctly without it. Reviewed-by: Dmitry Baryshkov Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/drm_bridge_helper.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/gpu/drm/drm_bridge_helper.c b/drivers/gpu/drm/drm_brid= ge_helper.c index 420f29cf3e54..0a3c8fee66b3 100644 --- a/drivers/gpu/drm/drm_bridge_helper.c +++ b/drivers/gpu/drm/drm_bridge_helper.c @@ -50,8 +50,6 @@ int drm_bridge_helper_reset_crtc(struct drm_bridge *bridg= e, =20 crtc =3D connector->state->crtc; ret =3D drm_atomic_helper_reset_crtc(crtc, ctx); - if (ret) - goto out; =20 out: drm_modeset_unlock(&dev->mode_config.connection_mutex); --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 BC566396B96 for ; Mon, 1 Jun 2026 22:45:17 +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=1780353922; cv=none; b=kSBWOOVCUgyT3HxZT7B+bqASMHOKM54/+q/ccemcay/OisK8C+KcqAfjx3xtQDr8zBrLIr8O09lP+oEW5GE4zl2o7Ef/Mn1oKaML1ecFdPjmWwGz+GjVMj9kAFmj47+/9nIuCDMxlmxqerPkF2wNm3ljfhP+1gVA3Z4yl2k/Tvc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353922; c=relaxed/simple; bh=rkG/NccXaoj6+7q2G/t0c8xMi4deZ8qzhUuGLVQWl5Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UbdwFFXQ/88CkMbJB3nU3jpAPkG6HFXy75mhg+RZg0U0+Ha1C2B3A+8suyYtLfVwEDO3bF0ASIRXxDdz6pPkBldoRZbCl6I4jibWsAldwyNg2x6lweiKYI+4jaNJsKzbJEImsD4FxtAJhpEnxeJTzUnL7PjHVbhXTadhxB5Y6OE= 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=d0XnKuj3; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="d0XnKuj3" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353916; bh=rkG/NccXaoj6+7q2G/t0c8xMi4deZ8qzhUuGLVQWl5Q=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=d0XnKuj3c+/bq3TfoRP+um/OqXLU/PoIHK9LsHo1lWiAqrmAbTRXXISHQAq1cPggu okXB/g+bPunyACSV9M0gkkNvQuIJGfVKC2kwV8XvBo8UdpNn5rLE0dPyxE0bXvJPIW ScWp/GJK7fgJMYxYe+k3fLfYWMppncVu/K6ALt38ezCRrkKcp8pcEC7wq47LBA2i4K JUCMK1ONHEj71ETy/ZFbcKuKL72/A0uw93L9Lv9gFetNvRTB2HGI4X6HfHNiZ9NS5D F8cVwx2mNoizrzdoreu3BWFhFCzliXoSiN4ipk1aHUTv1oofGdT0BWb2L6Bh/kBwEJ cgzzhbOOA4XjA== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 464B017E0C93; Tue, 2 Jun 2026 00:45:16 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:08 +0300 Subject: [PATCH v7 08/30] drm/bridge: Add HDMI 2.0 scrambler bridge operation and callbacks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-8-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Add DRM_BRIDGE_OP_HDMI_SCRAMBLER bridge operation flag and the corresponding .hdmi_scrambler_{enable|disable}() bridge funcs callbacks. Bridge drivers are expected to set DRM_BRIDGE_OP_HDMI_SCRAMBLER to advertise that they implement source-side scrambling control, which the bridge connector layer uses to wire up the connector's scrambler callbacks. Signed-off-by: Cristian Ciocaltea --- include/drm/drm_bridge.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 4ba3a5deef9a..f36e1e71aa86 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -667,6 +667,26 @@ struct drm_bridge_funcs { const struct drm_display_mode *mode, unsigned long long tmds_rate); =20 + /** + * @hdmi_scrambler_enable: + * + * Enable source-side HDMI 2.0 scrambling and high TMDS clock ratio. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI_SCRAMBLER flag in their &drm_bridge->ops. + */ + int (*hdmi_scrambler_enable)(struct drm_bridge *bridge); + + /** + * @hdmi_scrambler_disable: + * + * Disable source-side HDMI 2.0 scrambling and high TMDS clock ratio. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI_SCRAMBLER flag in their &drm_bridge->ops. + */ + int (*hdmi_scrambler_disable)(struct drm_bridge *bridge); + /** * @hdmi_clear_avi_infoframe: * @@ -1092,6 +1112,12 @@ enum drm_bridge_ops { * &drm_bridge_funcs->hdmi_clear_spd_infoframe callbacks. */ DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME =3D BIT(10), + /** + * @DRM_BRIDGE_OP_HDMI_SCRAMBLER: The bridge supports + * &drm_bridge_funcs->hdmi_scrambler_enable and + * &drm_bridge_funcs->hdmi_scrambler_disable callbacks. + */ + DRM_BRIDGE_OP_HDMI_SCRAMBLER =3D BIT(11), }; =20 /** --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 0B445392C46 for ; Mon, 1 Jun 2026 22:45:19 +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=1780353929; cv=none; b=Jhz9gS9QPSBxLV2tZjzu1yMwSfYL8rehX23kKVl4QZqI4QeyWRB0uJlY8m6RJ0ezOW2EoYjgmFUJKh0jOxtVn3xKCjKwLaGCbgYK+ZM8z4IX3dbpBNtx2RZc2tDzIR7qESPcIqN4B1OdTgyO+npnD3Xn/A48p6D7Cwsj4NioV/A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353929; c=relaxed/simple; bh=D3WLI0/xqh09WqxG7OJ3t8fiOSfKDxrH6DTK/8B7zCk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kvR30LB0OZ6bRJNd5L4bfIxZ60jZBGuTJAJ6fwtJa3iq+jJ2DV/xclM/qvMaNDz80gbHXMWq5hvz5q2JmzB7NxioCjakGchnvCUH3F4YXT3dKrz/fqIpPElUuUDdVZkbDdh/uNFq0uiKY+cXiev3At2JC2A1ZzvzUNt4i7Rnlww= 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=RwDyxlCN; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="RwDyxlCN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353917; bh=D3WLI0/xqh09WqxG7OJ3t8fiOSfKDxrH6DTK/8B7zCk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=RwDyxlCNWPnXikCNbriDKEBPlsl0KcnHcyame3jfWh1AJToS0H5fYhr5YHDI/RpeD tM39Z0MlhozOFgKj+xVQ5DUYLOE0pNEDVGwBhAKY3cTcG7WzdGhg7FlVeLgns4riH9 ZBwMMTQs3LeEd47Gupe9Wixaxkb3rYiOLEVAQ/2MBHilaN/Iw/KDKuxSpRfaO188C2 fRfdyhHJQ9Ui0yYfWpEqZ6zrEK8/al4mG8mlGDm36dVKn6j0/Fg1eR8k5X+MD7nnBJ Pi11g3pXOYuMuahEooYvV2u6muofosdN4RqQLBPlb2eqfKY9kFzFgNH2vhX0/LIHqZ L47rYYcFjbINw== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 0AB7217E0D07; Tue, 2 Jun 2026 00:45:17 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:09 +0300 Subject: [PATCH v7 09/30] drm/display: bridge_connector: Use cached connector status in .get_modes() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-9-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Dmitry Baryshkov X-Mailer: b4 0.15.2 Replace the active drm_bridge_connector_detect() call in get_modes() with a read of the already-cached connector->status. The .get_modes() callback is only invoked from drm_helper_probe_single_connector_modes(), which has already retrieved the connector status. Calling detect again is redundant and triggers a duplicate hotplug event. This is also a prerequisite for switching to the .detect_ctx() hook, which requires a drm_modeset_acquire_ctx not available in the .get_modes() path. Reviewed-by: Dmitry Baryshkov Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/display/drm_bridge_connector.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index cafa498c3848..61c2a46edaf3 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -301,12 +301,10 @@ static const struct drm_connector_funcs drm_bridge_co= nnector_funcs =3D { static int drm_bridge_connector_get_modes_edid(struct drm_connector *conne= ctor, struct drm_bridge *bridge) { - enum drm_connector_status status; const struct drm_edid *drm_edid; int n; =20 - status =3D drm_bridge_connector_detect(connector, false); - if (status !=3D connector_status_connected) + if (connector->status !=3D connector_status_connected) goto no_edid; =20 drm_edid =3D drm_bridge_edid_read(bridge, connector); --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 37F57394786 for ; Mon, 1 Jun 2026 22:45:19 +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=1780353929; cv=none; b=L6B2w+6JfKm2/77/UxFU+fJN3PSjB2Fn27k02j2UJieiAWfulhA6AiEewg7SKcXsDTD3ww+phIokm6R0kOq6k1QKoox11irkbKhu2WK0BRkkdNzSJd5dSy71MKkJXjEmWX1jMLaPKqgqZAIhokbOBX8AGK42ZguQ7E1cpG+Yn8A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353929; c=relaxed/simple; bh=ykSyYz1VyVTs5TNDSPY+oQTiDASh87EALRC2/kCbgns=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P37VGGLdD+hNgL6MKjnQfwULSXaXXE4/baAbB2TdmO3GdsaA7x0MMzpxRg8/7ZsCGYPY/Jc+O1nmvkMphJbwL2pSu2HcLk2yxOHWFNDEL6N3adh5RdqRbtTXNnjinwYFSIbXiuISKQ6qbcA01oRhLDhVlsYKuYfc8cPxzeLd7ck= 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=UsVaQZ9+; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="UsVaQZ9+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353917; bh=ykSyYz1VyVTs5TNDSPY+oQTiDASh87EALRC2/kCbgns=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=UsVaQZ9+5mjLUYdbyo1hctlUnM7ABi5NVD+5SMayY2RIAi3SK87snAUKjYoUkSSd2 R/PkRPBL/ByG0NVb5hZTP5d4cGOxSBffW35yx3YrJDc1feqgEhyIXSsBtMJqOn744O yHAB5BOPpEqk1B1UMnNhHcQ5vmtpgAFOet70uX1AHj3K8JBBFuMguVXgvRbygy07zz 78h9iAgHiwRjicQ1HgeXKf0UF+jhFKfTJV9hM5TWIGSvpZmdKq28TqjiPUwqpDyTsD MhAD8t4rywKCRMAOhNfuLn17pOdguHQ/oKfdt55CfDgxhSgMEw93S2jiUdRPsKyjA0 1iHNeIyst5kBQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id CA2F217E0D87; Tue, 2 Jun 2026 00:45:17 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:10 +0300 Subject: [PATCH v7 10/30] drm/display: bridge_connector: Switch to .detect_ctx() connector helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-10-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Diederik de Haas , Maud Spierings , Dmitry Baryshkov X-Mailer: b4 0.15.2 Replace the .detect() connector_funcs callback with the atomic-aware .detect_ctx() connector_helper_funcs hook. This propagates the modeset acquire context through drm_atomic_helper_connector_hdmi_hotplug_ctx() to the HDMI connector framework, enabling SCDC state recovery via CRTC reset when the sink reconnects during an active display pipeline. Tested-by: Diederik de Haas Tested-by: Maud Spierings Reviewed-by: Dmitry Baryshkov Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/display/drm_bridge_connector.c | 74 ++++++++++++++--------= ---- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 61c2a46edaf3..9d21b1b57b0d 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -208,39 +208,6 @@ static void drm_bridge_connector_disable_hpd(struct dr= m_connector *connector) * Bridge Connector Functions */ =20 -static enum drm_connector_status -drm_bridge_connector_detect(struct drm_connector *connector, bool force) -{ - struct drm_bridge_connector *bridge_connector =3D - to_drm_bridge_connector(connector); - struct drm_bridge *detect =3D bridge_connector->bridge_detect; - struct drm_bridge *hdmi =3D bridge_connector->bridge_hdmi; - enum drm_connector_status status; - - if (detect) { - status =3D detect->funcs->detect(detect, connector); - - if (hdmi) - drm_atomic_helper_connector_hdmi_hotplug(connector, status); - - drm_bridge_connector_hpd_notify(connector, status); - } else { - switch (connector->connector_type) { - case DRM_MODE_CONNECTOR_DPI: - case DRM_MODE_CONNECTOR_LVDS: - case DRM_MODE_CONNECTOR_DSI: - case DRM_MODE_CONNECTOR_eDP: - status =3D connector_status_connected; - break; - default: - status =3D connector_status_unknown; - break; - } - } - - return status; -} - static void drm_bridge_connector_force(struct drm_connector *connector) { struct drm_bridge_connector *bridge_connector =3D @@ -284,7 +251,6 @@ drm_bridge_connector_create_state(struct drm_connector = *connector) } =20 static const struct drm_connector_funcs drm_bridge_connector_funcs =3D { - .detect =3D drm_bridge_connector_detect, .force =3D drm_bridge_connector_force, .fill_modes =3D drm_helper_probe_single_connector_modes, .atomic_create_state =3D drm_bridge_connector_create_state, @@ -298,6 +264,45 @@ static const struct drm_connector_funcs drm_bridge_con= nector_funcs =3D { * Bridge Connector Helper Functions */ =20 +static int drm_bridge_connector_detect_ctx(struct drm_connector *connector, + struct drm_modeset_acquire_ctx *ctx, + bool force) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *detect =3D bridge_connector->bridge_detect; + struct drm_bridge *hdmi =3D bridge_connector->bridge_hdmi; + enum drm_connector_status status; + int ret; + + if (detect) { + status =3D detect->funcs->detect(detect, connector); + + if (hdmi) { + ret =3D drm_atomic_helper_connector_hdmi_hotplug_ctx(connector, + status, ctx); + if (ret =3D=3D -EDEADLK) + return ret; + } + + drm_bridge_connector_hpd_notify(connector, status); + } else { + switch (connector->connector_type) { + case DRM_MODE_CONNECTOR_DPI: + case DRM_MODE_CONNECTOR_LVDS: + case DRM_MODE_CONNECTOR_DSI: + case DRM_MODE_CONNECTOR_eDP: + status =3D connector_status_connected; + break; + default: + status =3D connector_status_unknown; + break; + } + } + + return status; +} + static int drm_bridge_connector_get_modes_edid(struct drm_connector *conne= ctor, struct drm_bridge *bridge) { @@ -389,6 +394,7 @@ static int drm_bridge_connector_atomic_check(struct drm= _connector *connector, =20 static const struct drm_connector_helper_funcs drm_bridge_connector_helper= _funcs =3D { .get_modes =3D drm_bridge_connector_get_modes, + .detect_ctx =3D drm_bridge_connector_detect_ctx, .mode_valid =3D drm_bridge_connector_mode_valid, .enable_hpd =3D drm_bridge_connector_enable_hpd, .disable_hpd =3D drm_bridge_connector_disable_hpd, --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 352FF394490 for ; Mon, 1 Jun 2026 22:45:20 +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=1780353922; cv=none; b=MkRBQCwLj/c7vj1leAZS4/mdUAdaRhLGeghx24mnNZ0z1463ovq8uBDD+6wTXxhpYQ3ck7VMN7vYnfY0iMNSqnZnZWJ6fQZtzAXIFZDJYD2boCUDeprg/dSpOcdIq3Z9GYtnYViMNoKS1dO9LrPzc2lsFFQHc3Xg40nIL89vG/I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353922; c=relaxed/simple; bh=xO+14mBjTOvVDX8C6FH5vurdj8sQ1RCHp2uwEvfr4jQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S99qa3F9yiHYZ6qm7lub/L5a9V4NFgnYJtleInAW9jR+mQ9U94FIycRVWrA6/tmy6wlcq0uLTMghgd7n+LBmkNUmXWfXomXu9wOPVW/GqPe9cLIUL6EQ5mPWnIysyHjlwStL4zJm95/YeYLRtx0HqcrQGCEM2UpBVM32gdf/hPY= 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=mfbaYLu+; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="mfbaYLu+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353918; bh=xO+14mBjTOvVDX8C6FH5vurdj8sQ1RCHp2uwEvfr4jQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=mfbaYLu+KLmyXsAr3IlTKrZ2HUvXoFHUKgokOazPBWn8qYxGhVwDJ9LXNlxwvVlYi 1EMZBWBBrskpV9gpLZMRSiRMkXyrn88pQia+47R1a4QJ8AAfamngC4xpr4bzwwL30o lfZA5qOHDkTXgrs0tuo8buNLT4baW5Ob7pBT3ga6JCRJoqMnnKQpVpIceAfUPZ/zTX 4nCD8GMBrWcSd+VB34CILIW0wf/FIaGICrYI60GD9YpS6cE0fFts1vW1Hg+I6L6t09 FZUT5XrU49yMtDvMbr8pTO0VycsIwvrSkCMiN5axTTmdVCO/hh4+tH32jrnILjyO0/ tXCsAVtTS3PBA== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 888BE17E045E; Tue, 2 Jun 2026 00:45:18 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:11 +0300 Subject: [PATCH v7 11/30] drm/display: bridge_connector: Wire up HDMI 2.0 scrambler callbacks Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-11-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Connect the bridge connector's .scrambler_{enable|disable} callbacks to the underlying bridge's .hdmi_scrambler_{enable|disable} funcs when DRM_BRIDGE_OP_HDMI_SCRAMBLER is advertised. This completes the bridge connector plumbing so that the SCDC scrambling helpers can control source-side scrambling through the bridge chain. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/display/drm_bridge_connector.c | 41 ++++++++++++++++++++++= +++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 9d21b1b57b0d..d048ab49eade 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -555,6 +555,32 @@ static int drm_bridge_connector_write_spd_infoframe(st= ruct drm_connector *connec return bridge->funcs->hdmi_write_spd_infoframe(bridge, buffer, len); } =20 +static int drm_bridge_connector_scrambler_enable(struct drm_connector *con= nector) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + return bridge->funcs->hdmi_scrambler_enable(bridge); +} + +static int drm_bridge_connector_scrambler_disable(struct drm_connector *co= nnector) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + return bridge->funcs->hdmi_scrambler_disable(bridge); +} + static const struct drm_edid * drm_bridge_connector_read_edid(struct drm_connector *connector) { @@ -580,7 +606,7 @@ static const struct drm_connector_hdmi_funcs drm_bridge= _connector_hdmi_funcs =3D { .clear_infoframe =3D drm_bridge_connector_clear_hdmi_infoframe, .write_infoframe =3D drm_bridge_connector_write_hdmi_infoframe, }, - /* audio, hdr_drm and spd are set dynamically during init */ + /* scrambler, audio, hdr_drm and spd are set dynamically during init */ }; =20 static const struct drm_connector_infoframe_funcs drm_bridge_connector_hdm= i_audio_infoframe =3D { @@ -886,6 +912,11 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, !bridge->funcs->hdmi_clear_spd_infoframe)) return ERR_PTR(-EINVAL); =20 + if (bridge->ops & DRM_BRIDGE_OP_HDMI_SCRAMBLER && + (!bridge->funcs->hdmi_scrambler_enable || + !bridge->funcs->hdmi_scrambler_disable)) + return ERR_PTR(-EINVAL); + bridge_connector->bridge_hdmi =3D drm_bridge_get(bridge); =20 if (bridge->supported_formats) @@ -990,6 +1021,14 @@ struct drm_connector *drm_bridge_connector_init(struc= t drm_device *drm, bridge_connector->hdmi_funcs.spd =3D drm_bridge_connector_hdmi_spd_infoframe; =20 + if (bridge_connector->bridge_hdmi->ops & DRM_BRIDGE_OP_HDMI_SCRAMBLER) { + bridge_connector->hdmi_funcs.scrambler_enable =3D + drm_bridge_connector_scrambler_enable; + bridge_connector->hdmi_funcs.scrambler_disable =3D + drm_bridge_connector_scrambler_disable; + connector->hdmi.scrambler_supported =3D true; + } + ret =3D drmm_connector_hdmi_init(drm, connector, bridge_connector->bridge_hdmi->vendor, bridge_connector->bridge_hdmi->product, --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 8B81E394EB7 for ; Mon, 1 Jun 2026 22:45:20 +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=1780353924; cv=none; b=TPwBi1RFTckbjJ5L8PuxOFnIhuHfBswx84rvRsiKq/QMlSFT0oK2l0jMoCDX7nNB+AyQc9yIeJbYU5QYXnDDiDmJwZAuGJqjkGnlJOCJzk1SNaS18A96b0ae36JAmd02+Zalz8Z+Y3gQhz/4DmKQcA+KsDMKaZp/2ZDGazw0SW4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353924; c=relaxed/simple; bh=CqrlMo21uLSDERPACdFjyTESttbjzijb5VGmtS4m04U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=P/Dl5ydDOp24dLrGMBeBfydQS4mjglkGPJ0gPfWggdXYVpRCbkX3W3cwBuekavKsaTWlq7LSvpIJWpiJgkJYhsSpdyinY2HUGEvIoFjA7oYNy9x0WVCE94BDNBQLhhprEktbZsx8lrbWfyitNDOe8TIRUER2XxJxoOMYQGA4jJw= 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=K/6ZhbKW; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="K/6ZhbKW" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353919; bh=CqrlMo21uLSDERPACdFjyTESttbjzijb5VGmtS4m04U=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=K/6ZhbKWrrUNMfKwYutN3ZLitktfoN/XlhjVpSSZhj4MvVO9v6ejn3dW5XyGHPm9Y 9DlEZqyVLc5fNKvnyxRdn8JGDlbWIJl49jZijqF98dyY6EFrfOCmVGSffPie/j6QrX 1v6uRkB8//B18zL5fH5n3TtfqXO29TVfLiTFSZjghG/BKwqoE8hbcmufDHySlx07If T69dNQioTui4NE1DtF829l5LF/999quy2CyDNd4+RB7XHguYshHPSkuPrSPsCN0bX4 ohsmrbYMz4WYgm0/hzeNL1slt41ZfjnAkrswOgHDjD8036q763WMSttmNKr3vV/Xxo y/slxs7QKyMsQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 484AE17E0DE1; Tue, 2 Jun 2026 00:45:19 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:12 +0300 Subject: [PATCH v7 12/30] drm/bridge: dw-hdmi-qp: Rate limit i2c read error messages Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-12-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 During EDID reads, repeated i2c errors can flood the kernel log: [ 25.361716] dwhdmiqp-rockchip fde80000.hdmi: i2c read error [ 25.363376] dwhdmiqp-rockchip fde80000.hdmi: i2c read error ... [ 25.368671] dwhdmiqp-rockchip fde80000.hdmi: i2c read error [ 25.369440] dwhdmiqp-rockchip fde80000.hdmi: failed to get edid Switch to dev_err_ratelimited() in dw_hdmi_qp_i2c_read() to reduce log spam while still reporting the condition. Reviewed-by: Heiko Stuebner Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index 1c214a8e6dc2..b3318655ceab 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -561,7 +561,7 @@ static int dw_hdmi_qp_i2c_read(struct dw_hdmi_qp *hdmi, dev_dbg_ratelimited(hdmi->dev, "i2c read timed out\n"); else - dev_err(hdmi->dev, "i2c read timed out\n"); + dev_err_ratelimited(hdmi->dev, "i2c read timed out\n"); dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); return -EAGAIN; } @@ -572,7 +572,7 @@ static int dw_hdmi_qp_i2c_read(struct dw_hdmi_qp *hdmi, dev_dbg_ratelimited(hdmi->dev, "i2c read error\n"); else - dev_err(hdmi->dev, "i2c read error\n"); + dev_err_ratelimited(hdmi->dev, "i2c read error\n"); dw_hdmi_qp_write(hdmi, 0x01, I2CM_CONTROL0); return -EIO; } --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 9F9553955E3 for ; Mon, 1 Jun 2026 22:45:21 +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=1780353926; cv=none; b=Uk7fyVmgOwbebAU2WPl3t2erlPKUpMpgdWqOWefGprG0C0/30+wO15QzTccHaglmF8qpX77260iRTRUZKbzZrIO8X0uveBsOiiT6CFRrJNXHVYvwaD0lZb2yblIH8osHlRmfVjN+QosAV44F3YL20Z0EnLaVMQZSkyfZXj2JGng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353926; c=relaxed/simple; bh=pOLKcJluwdl4dR4SYTYCdJO0qZsDIUNN5uK3N2fcug8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GIRIqqn8aHYV7GAKsxprLI1nDSWx02vgamx7fB1YP2RADFHg2ks2DpgohpkBlY1uflBP1rARIP4BJm0R8eP6WsgIfTDmNgdx2tie0FWuicZ8q5dRQTI80yQ9t+QXOpzAquISh1K9o/aushJF3jUQc1M/GtdhIocAHD4TkR0p9Lc= 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=O97dHyck; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="O97dHyck" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353920; bh=pOLKcJluwdl4dR4SYTYCdJO0qZsDIUNN5uK3N2fcug8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=O97dHyckQg7AYiBjI72hk5WdF7GPbH5OafSKUpRt5krhegCt9zBu3rdcWbiSwPned eL1B13hc/kl8HAsytFrTNKo12chbjfHIUAl1xt6HORvWA6cFTcowsuDvYtlWow3IXx dFBL1P+qEb4QQEIjpsC8CDkAapcAfzv2s8Nb85mUXm/pc1w4x/HyDCJwDrx5Ee6Bmz KtVHzQuhTNLBVTKbzxKdbVC+z6c/HB/JwT8p/wnWAXfzFpcuvT6bKFWI2QNwl8gdeW h80I0hNw9LlmqeOKR14vPimRoV3tiKwVxHUDljud0Qn2H/6z27c2XNYcfr4S72xVeg zh4r9/tjJo8Xg== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 11D0917E0DE9; Tue, 2 Jun 2026 00:45:20 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:13 +0300 Subject: [PATCH v7 13/30] drm/bridge: dw-hdmi-qp: Provide .{enable|disable}_hpd() PHY ops Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-13-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Implement the .hpd_enable() and .hpd_disable() bridge callbacks and extend dw_hdmi_qp_phy_ops with corresponding hooks. This enables the DRM core to control when HPD interrupts are armed, which is needed to prevent premature interrupt delivery before the connector is fully initialized, and to properly quiesce HPD during suspend. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 18 ++++++++++++++++++ include/drm/bridge/dw_hdmi_qp.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index b3318655ceab..3f72bea20ba4 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -1189,6 +1189,22 @@ static int dw_hdmi_qp_cec_transmit(struct drm_bridge= *bridge, u8 attempts, #define dw_hdmi_qp_cec_transmit NULL #endif /* CONFIG_DRM_DW_HDMI_QP_CEC */ =20 +static void dw_hdmi_qp_bridge_hpd_enable(struct drm_bridge *bridge) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + + if (hdmi->phy.ops->enable_hpd) + hdmi->phy.ops->enable_hpd(hdmi, hdmi->phy.data); +} + +static void dw_hdmi_qp_bridge_hpd_disable(struct drm_bridge *bridge) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + + if (hdmi->phy.ops->disable_hpd) + hdmi->phy.ops->disable_hpd(hdmi, hdmi->phy.data); +} + static const struct drm_bridge_funcs dw_hdmi_qp_bridge_funcs =3D { .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, @@ -1196,6 +1212,8 @@ static const struct drm_bridge_funcs dw_hdmi_qp_bridg= e_funcs =3D { .atomic_enable =3D dw_hdmi_qp_bridge_atomic_enable, .atomic_disable =3D dw_hdmi_qp_bridge_atomic_disable, .detect =3D dw_hdmi_qp_bridge_detect, + .hpd_enable =3D dw_hdmi_qp_bridge_hpd_enable, + .hpd_disable =3D dw_hdmi_qp_bridge_hpd_disable, .edid_read =3D dw_hdmi_qp_bridge_edid_read, .hdmi_tmds_char_rate_valid =3D dw_hdmi_qp_bridge_tmds_char_rate_valid, .hdmi_clear_avi_infoframe =3D dw_hdmi_qp_bridge_clear_avi_infoframe, diff --git a/include/drm/bridge/dw_hdmi_qp.h b/include/drm/bridge/dw_hdmi_q= p.h index 6ea9c561cfef..b80fceffc315 100644 --- a/include/drm/bridge/dw_hdmi_qp.h +++ b/include/drm/bridge/dw_hdmi_qp.h @@ -17,6 +17,8 @@ struct dw_hdmi_qp_phy_ops { void (*disable)(struct dw_hdmi_qp *hdmi, void *data); enum drm_connector_status (*read_hpd)(struct dw_hdmi_qp *hdmi, void *data= ); void (*setup_hpd)(struct dw_hdmi_qp *hdmi, void *data); + void (*enable_hpd)(struct dw_hdmi_qp *hdmi, void *data); + void (*disable_hpd)(struct dw_hdmi_qp *hdmi, void *data); }; =20 struct dw_hdmi_qp_plat_data { --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 46F8A395AD7 for ; Mon, 1 Jun 2026 22:45:22 +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=1780353929; cv=none; b=oHDDIsCBf5QSA6yC+vnDAdtWVZnzNlFGPeoJAE3I0N4QjWUd1FGnhUhWZxnCwDkqB2aT67SbXU23A5neMi5mJlYUrXDfd2J+0Nxkdg4XXDyAGQzMbxxszmzRfPB0lUAp6CC6aAFLXE3rXlK3p3BEnxU8CW9C9a1fPurTUsw6S2g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353929; c=relaxed/simple; bh=VDT2u8E4L1g/gyMdDtadl27jfkfsP1aOhIib3QCu4FQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TsS5oGDWTC+39Yq4dVPsfuoICarLuwyYTf6mkwaohfvE9c+Qe7pj5c/i1oNtWdGd3jKqaDn8dFhWhcwDQyZeRVkxQ7IrZPKGZz7DGQs0g/zS55lEEDL+TZDzmD7MqcyVXjo2BK3pytCWhOg98rvuwB7hNDvQrgAQ/DfS8r1f4W4= 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=m9qs30xw; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="m9qs30xw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353920; bh=VDT2u8E4L1g/gyMdDtadl27jfkfsP1aOhIib3QCu4FQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=m9qs30xwhkPzLKzo7E7ys+KFRU6CvNczVuwViz1HGG+JmyRupZJtsP9RNajX3Pm0c 4kg1FZHuoE7d29fLpJDKQg/afNW20JueuB3P/qv3ZT+7L076nUhK1vtyJZHbh1FDZk 5QM4XnO+L8yTjMwfdTScjA1vlZch1VxzauzSyrSq/vHby2IC3ZQSgTbPof32z+akyj ++Qd3NFdig2AxQ64EQ0c+caiG2O/Py0pK3AcdxVjDwhWZaUKV1U9kseZk7utN4lz64 3+gAr/bZV4nRg1TfsKeC30H/xX9b3UqD/efkQAyWpKtm6/kQSXL9RAv1G74ubiY2HW KPLt/m2B5ls7g== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id C187E17E01B6; Tue, 2 Jun 2026 00:45:20 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:14 +0300 Subject: [PATCH v7 14/30] drm/bridge: dw-hdmi-qp: Add HDMI 2.0 SCDC scrambling support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-14-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Diederik de Haas , Maud Spierings X-Mailer: b4 0.15.2 Enable HDMI 2.0 display modes (e.g. 4K@60Hz) by implementing SCDC scrambling and high TMDS clock ratio management for TMDS character rates exceeding the 340 MHz HDMI 1.4b limit. Reject modes requiring TMDS rates above 600 MHz since those require HDMI 2.1 FRL which is not yet supported. In no_hpd configurations, further restrict to 340 MHz because SCDC requires a connected sink. Tested-by: Diederik de Haas Tested-by: Maud Spierings Acked-by: Heiko Stuebner Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 76 +++++++++++++++++++++---= ---- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index 3f72bea20ba4..0250ddd8f91a 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -2,6 +2,7 @@ /* * Copyright (c) 2021-2022 Rockchip Electronics Co., Ltd. * Copyright (c) 2024 Collabora Ltd. + * Copyright (c) 2025 Amazon.com, Inc. or its affiliates. * * Author: Algea Cao * Author: Cristian Ciocaltea @@ -15,12 +16,12 @@ #include #include #include -#include =20 #include #include #include #include +#include #include #include #include @@ -162,6 +163,7 @@ struct dw_hdmi_qp { } phy; =20 unsigned long ref_clk_rate; + struct drm_connector *curr_conn; struct regmap *regm; int main_irq; =20 @@ -752,26 +754,35 @@ static void dw_hdmi_qp_bridge_atomic_enable(struct dr= m_bridge *bridge, { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; struct drm_connector_state *conn_state; - struct drm_connector *connector; unsigned int op_mode; + int ret; =20 - connector =3D drm_atomic_get_new_connector_for_encoder(state, bridge->enc= oder); - if (WARN_ON(!connector)) + hdmi->curr_conn =3D drm_atomic_get_new_connector_for_encoder(state, + bridge->encoder); + if (WARN_ON(!hdmi->curr_conn)) return; =20 - conn_state =3D drm_atomic_get_new_connector_state(state, connector); + conn_state =3D drm_atomic_get_new_connector_state(state, hdmi->curr_conn); if (WARN_ON(!conn_state)) return; =20 - if (connector->display_info.is_hdmi) { - dev_dbg(hdmi->dev, "%s mode=3DHDMI %s rate=3D%llu bpc=3D%u\n", __func__, - drm_hdmi_connector_get_output_format_name(conn_state->hdmi.output_forma= t), - conn_state->hdmi.tmds_char_rate, conn_state->hdmi.output_bpc); + if (hdmi->curr_conn->display_info.is_hdmi) { op_mode =3D 0; hdmi->tmds_char_rate =3D conn_state->hdmi.tmds_char_rate; + + if (conn_state->hdmi.scrambler_needed) { + ret =3D drm_scdc_start_scrambling(hdmi->curr_conn); + if (ret) + dev_warn(hdmi->dev, "Failed to setup SCDC: %d\n", ret); + } + + dev_dbg(hdmi->dev, "%s mode=3DHDMI %s rate=3D%llu bpc=3D%u scramb=3D%d\n= ", __func__, + drm_hdmi_connector_get_output_format_name(conn_state->hdmi.output_forma= t), + conn_state->hdmi.tmds_char_rate, conn_state->hdmi.output_bpc, + hdmi->curr_conn->hdmi.scrambler_enabled); } else { - dev_dbg(hdmi->dev, "%s mode=3DDVI\n", __func__); op_mode =3D OPMODE_DVI; + dev_dbg(hdmi->dev, "%s mode=3DDVI\n", __func__); } =20 hdmi->phy.ops->init(hdmi, hdmi->phy.data); @@ -779,7 +790,7 @@ static void dw_hdmi_qp_bridge_atomic_enable(struct drm_= bridge *bridge, dw_hdmi_qp_mod(hdmi, HDCP2_BYPASS, HDCP2_BYPASS, HDCP2LOGIC_CONFIG0); dw_hdmi_qp_mod(hdmi, op_mode, OPMODE_DVI, LINK_CONFIG0); =20 - drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); + drm_atomic_helper_connector_hdmi_update_infoframes(hdmi->curr_conn, state= ); } =20 static void dw_hdmi_qp_bridge_atomic_disable(struct drm_bridge *bridge, @@ -787,8 +798,14 @@ static void dw_hdmi_qp_bridge_atomic_disable(struct dr= m_bridge *bridge, { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; =20 + if (!hdmi->curr_conn) + return; + hdmi->tmds_char_rate =3D 0; =20 + drm_scdc_stop_scrambling(hdmi->curr_conn); + + hdmi->curr_conn =3D NULL; hdmi->phy.ops->disable(hdmi, hdmi->phy.data); } =20 @@ -830,12 +847,12 @@ dw_hdmi_qp_bridge_tmds_char_rate_valid(const struct d= rm_bridge *bridge, { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; =20 - /* - * TODO: when hdmi->no_hpd is 1 we must not support modes that - * require scrambling, including every mode with a clock above - * HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ. - */ - if (rate > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ) { + if (hdmi->no_hpd && rate > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ) { + dev_dbg(hdmi->dev, "Unsupported TMDS char rate in no_hpd mode: %lld\n", = rate); + return MODE_CLOCK_HIGH; + } + + if (rate > HDMI_2_0_TMDS_CHAR_RATE_MAX_HZ) { dev_dbg(hdmi->dev, "Unsupported TMDS char rate: %lld\n", rate); return MODE_CLOCK_HIGH; } @@ -843,6 +860,26 @@ dw_hdmi_qp_bridge_tmds_char_rate_valid(const struct dr= m_bridge *bridge, return MODE_OK; } =20 +static int dw_hdmi_qp_bridge_scrambler_enable(struct drm_bridge *bridge) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + + dw_hdmi_qp_write(hdmi, 1, SCRAMB_CONFIG0); + dev_dbg(hdmi->dev, "scrambler enabled\n"); + + return 0; +} + +static int dw_hdmi_qp_bridge_scrambler_disable(struct drm_bridge *bridge) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + + dw_hdmi_qp_write(hdmi, 0, SCRAMB_CONFIG0); + dev_dbg(hdmi->dev, "scrambler disabled\n"); + + return 0; +} + static int dw_hdmi_qp_bridge_clear_avi_infoframe(struct drm_bridge *bridge) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; @@ -1216,6 +1253,8 @@ static const struct drm_bridge_funcs dw_hdmi_qp_bridg= e_funcs =3D { .hpd_disable =3D dw_hdmi_qp_bridge_hpd_disable, .edid_read =3D dw_hdmi_qp_bridge_edid_read, .hdmi_tmds_char_rate_valid =3D dw_hdmi_qp_bridge_tmds_char_rate_valid, + .hdmi_scrambler_enable =3D dw_hdmi_qp_bridge_scrambler_enable, + .hdmi_scrambler_disable =3D dw_hdmi_qp_bridge_scrambler_disable, .hdmi_clear_avi_infoframe =3D dw_hdmi_qp_bridge_clear_avi_infoframe, .hdmi_write_avi_infoframe =3D dw_hdmi_qp_bridge_write_avi_infoframe, .hdmi_clear_hdmi_infoframe =3D dw_hdmi_qp_bridge_clear_hdmi_infoframe, @@ -1342,7 +1381,8 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_de= vice *pdev, DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_HDMI_AUDIO | DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME | - DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME; + DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME | + DRM_BRIDGE_OP_HDMI_SCRAMBLER; if (!hdmi->no_hpd) hdmi->bridge.ops |=3D DRM_BRIDGE_OP_HPD; hdmi->bridge.of_node =3D pdev->dev.of_node; --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 32F09399360 for ; Mon, 1 Jun 2026 22:45:24 +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=1780353930; cv=none; b=d3MFC32kgGL+U2O3/dLBELbcw7MPcpisPdJvfIvgNvCc7EufSCB9MnimNw7txnShHsbqzhtLq6zRhCPY1PBXhVsTRCJOEnPeeUQ0ddL0c8l2wP7NqjQK54/UWNruBX76r8pUhs8g+xWR8yJOlTK5VPdgaIv9Bo1GUDt/9MWH+FA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353930; c=relaxed/simple; bh=9Sn0cgy0Ujy9Ad4R+4LyrDZu4ahIQTS8kZpAqsHqH24=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ghDaVEKHWnmvG4wguBcDADmYX4q1VqmI8vZXNjB8RvJDvbeKpEe/ytAl2zpAiS+LFYGy5DF2IriqJMF6g+ke9AZ5uA1pqMyzqUdMzW01KHLC5Ky+qu5Bg9bFKlxHp4PZM006MRQFJR6uVNziI93mZDPdtWFMc/Gjt5f5Z+7SfVg= 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=NJLR5tlh; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="NJLR5tlh" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353921; bh=9Sn0cgy0Ujy9Ad4R+4LyrDZu4ahIQTS8kZpAqsHqH24=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NJLR5tlhghmBb4UmvCDG1zMfszPflRCEwYFAXkzMvYMNqxZbVnQbe3qBPOavpfou2 Jn400mcv4ZvgNV1wtunjbJe15PM/TyNgWdyvvRWJsllLI5n+Qk9oGq85gdOFrLO8wb 9wIYFM5i1AFafpnKeTQzdYOhcdOqTpnkQwkyufNcJHe3cvV1/+i6IYf0SuHjZ2qwaD mV5gs8uZPjkvM8/0mIxBQdf+QOG4YwxClBS605oHdGqi37ArS0bFe/gRwbYoFiyaBO kTONNLlL5A/t7G7PZgMlkCtr2gLz9Q26FGUOjHaa7m0ccpMYwQQfNSrHC6+HkTsj7x UrcaHzS2hUSDQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 8136B17E0B66; Tue, 2 Jun 2026 00:45:21 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:15 +0300 Subject: [PATCH v7 15/30] drm/bridge: dw-hdmi-qp: Provide dw_hdmi_qp_hpd_notify() helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-15-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Export dw_hdmi_qp_hpd_notify() for platform drivers to report hot-plug detection events. Unlike drm_helper_hpd_irq_event() which polls all connectors, this helper targets only the affected connector and ensures .detect_ctx() is invoked on reconnection events to trigger SCDC state recovery. Note that this helper may sleep, so it must only be called from a threaded HPD interrupt handler or a work function. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 31 ++++++++++++++++++++++++= ++++ include/drm/bridge/dw_hdmi_qp.h | 1 + 2 files changed, 32 insertions(+) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index 0250ddd8f91a..999229705ffb 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -29,6 +29,7 @@ #include #include #include +#include =20 #include =20 @@ -1433,6 +1434,36 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_d= evice *pdev, } EXPORT_SYMBOL_GPL(dw_hdmi_qp_bind); =20 +/** + * dw_hdmi_qp_hpd_notify() - Notify a hot-plug detection event + * @hdmi: pointer to the DW HDMI QP controller + * + * Platform drivers should call this from their threaded IRQ handler or wo= rk + * function to notify the bridge of a connection status change. + * The bridge's .read_hpd() phy_ops callback is used to read the current + * connection status. + */ +void dw_hdmi_qp_hpd_notify(struct dw_hdmi_qp *hdmi) +{ + enum drm_connector_status status; + + status =3D hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data); + dev_dbg(hdmi->dev, "%s status=3D%d\n", __func__, status); + + /* + * When the display pipeline has been already active, switch to + * drm_connector_helper_hpd_irq_event() to ensure .detect_ctx() + * gets invoked, i.e. via drm_helper_probe_detect(), because + * drm_bridge_hpd_notify() defers to a delayed hotplug path in + * this case. + */ + if (hdmi->curr_conn && status =3D=3D connector_status_connected) + drm_connector_helper_hpd_irq_event(hdmi->curr_conn); + else + drm_bridge_hpd_notify(&hdmi->bridge, status); +} +EXPORT_SYMBOL_GPL(dw_hdmi_qp_hpd_notify); + void dw_hdmi_qp_suspend(struct device *dev, struct dw_hdmi_qp *hdmi) { disable_irq(hdmi->main_irq); diff --git a/include/drm/bridge/dw_hdmi_qp.h b/include/drm/bridge/dw_hdmi_q= p.h index b80fceffc315..b4fb1c578a5b 100644 --- a/include/drm/bridge/dw_hdmi_qp.h +++ b/include/drm/bridge/dw_hdmi_qp.h @@ -36,6 +36,7 @@ struct dw_hdmi_qp_plat_data { struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev, struct drm_encoder *encoder, const struct dw_hdmi_qp_plat_data *plat_data); +void dw_hdmi_qp_hpd_notify(struct dw_hdmi_qp *hdmi); void dw_hdmi_qp_suspend(struct device *dev, struct dw_hdmi_qp *hdmi); void dw_hdmi_qp_resume(struct device *dev, struct dw_hdmi_qp *hdmi); #endif /* __DW_HDMI_QP__ */ --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 316AB399350 for ; Mon, 1 Jun 2026 22:45:24 +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=1780353930; cv=none; b=nFZ/moSjPRzHgKwpLGGrW+JxRIzH++cJSPfE6O0qssOJcFa69OGW7e4vVTDKngD6mCU9R0V//RkZjIpNIURMQ5eoYhSnSwQFkTXj31dzv1Y2Enmv/cr/3sqyecSuSPNkF31Jv3yFBGioiI5ka6zJEDIYIPApsycAUpf7I/kNYGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353930; c=relaxed/simple; bh=yeSZkQ0N5Q3VN7kh/SBKICWX4z0SQ9VZaaRj6HJiVGM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JxAnxC/vAYTDldZJRGEYoN+1lZ/10isTKH2ZB/4NqjgKulUFBqZ6dOiJCUdzEWZ8Ey6ZrPjA3Jt8beik4/bV1yOMXEbiWU9hTYUvg5QGQAu7T/Tk15kMNGVZ25NTJkyJDYj35eSnS+VDcoKEAu5lql+xVUUDjjFbQjbNRQKUamQ= 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=aUsTjxnQ; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="aUsTjxnQ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353922; bh=yeSZkQ0N5Q3VN7kh/SBKICWX4z0SQ9VZaaRj6HJiVGM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=aUsTjxnQJSpgazhoDAYOI0OZNuMv+t7rf8i4c3z9VAiVvNO4KFJbzNkVQRNgzvzH/ QO6OabixuRIRlw9qo+Q8700RCn4Z6xw+ERFB/0FtWGQDRiJdYNTOOBC6n6rG1S7Jr/ 8TZZFCoeUw8TWUDEIH0jyY94bvuSQyplPjeQA2a1zKfYDG9M+EoY3HrSYY8HQaVNd4 +fsvrBOvPNQi0QSNEzki0F9S0lWdc5bA6RbQ3OV/G0boQupBmLqERnravpAoBTEtmq phLbYLt5q7DUGvzIdwry+3C0yyLH2B6s7/VLRGsxvp+JvoAZ/ykuIstfHmry0xbZr2 hq2GC9zTQlXPA== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 4D68D17E0E08; Tue, 2 Jun 2026 00:45:22 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:16 +0300 Subject: [PATCH v7 16/30] drm/rockchip: dw_hdmi_qp: Add missing newlines in dev_err_probe() messages Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-16-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Add the missing trailing newlines to a couple of dev_err_probe() calls in dw_hdmi_qp_rockchip_bind(). Fixes: b6736a4ea3fa ("drm/rockchip: dw_hdmi_qp: Improve error handling with= dev_err_probe()") Fixes: e1f7b7cbd74c ("drm/rockchip: dw_hdmi_qp: Switch to drmm_encoder_init= ()") Reviewed-by: Heiko Stuebner Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index f35484715c2d..296f9a3ba66a 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -589,14 +589,14 @@ static int dw_hdmi_qp_rockchip_bind(struct device *de= v, struct device *master, drm_encoder_helper_add(encoder, &dw_hdmi_qp_rockchip_encoder_helper_funcs= ); ret =3D drmm_encoder_init(drm, encoder, NULL, DRM_MODE_ENCODER_TMDS, NULL= ); if (ret) - return dev_err_probe(hdmi->dev, ret, "Failed to init encoder"); + return dev_err_probe(hdmi->dev, ret, "Failed to init encoder\n"); =20 platform_set_drvdata(pdev, hdmi); =20 hdmi->hdmi =3D dw_hdmi_qp_bind(pdev, encoder, &plat_data); if (IS_ERR(hdmi->hdmi)) return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->hdmi), - "Failed to bind dw-hdmi-qp"); + "Failed to bind dw-hdmi-qp\n"); =20 connector =3D drm_bridge_connector_init(drm, encoder); if (IS_ERR(connector)) --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 9C6CD396B98 for ; Mon, 1 Jun 2026 22:45:24 +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=1780353933; cv=none; b=j89miwEQOPQjt5RttGYM/oLSudsVVKATAbwZmG72u3WKeAxs3MGXdLDpbMVX360fimSdnwZ7NTgPqx091oOCvbO5KcX5GrSoOkdJ3dRPycUZwNiIDUxzxjkD7hjZZi1u5GxJTzISe1CyCmMMmxO0NRD6D83AczdW+WLJF1PPpSI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353933; c=relaxed/simple; bh=ZJkZbZinkYW2/9ujWgQTHHbPgel0K7gaSQEekVmR0Ys=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MHniB9m5ne55ndTHfUWbtPqEMy1Pc2XylQ1O6GcKiah6i+2Fj9lNPYv9aM+qGJ0vDtQXCrKIE8EGk5Ebrjrbi5yUklNyqz1VVhfv+oYBm6ETaQh3Pwkrx2r5QBmKGZ08RDFRq+XUN+IshXN3PSiBQgYL2m+0eEHTVonWNr5BdCs= 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=M3tWroIm; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="M3tWroIm" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353923; bh=ZJkZbZinkYW2/9ujWgQTHHbPgel0K7gaSQEekVmR0Ys=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=M3tWroImPEASepXoPGVR+eBuf3khOqiLQC/DdeiiE4bp+qdtbv+Aq247Gadm3czX+ IHioIRMNdejmVsuCuIqyWOqf8O+CLrtjJUD53/ljhMoLIEFMYYcfWWv+JODN2SV6rO Y1oewhn0fE5pIKaNTDvoRksi9o9V4ajriPEa1AwEwuKpuyVG3dBYE/3KNJgC2lu3XC WqesGbNHfrx3ke6O1t8TEEa38L5ae3z3/9Z6GJe/8U8zA9L23M0fGuto7SMexKIfwZ itxTeWrEDIasKjesZcHC79KdPWd/pHxDWs2ZgWX2AHBFFocwh+UAcNimfoOGZQhI+0 YRz/Fw9l5+0zg== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 206B217E0B69; Tue, 2 Jun 2026 00:45:23 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:17 +0300 Subject: [PATCH v7 17/30] drm/rockchip: dw_hdmi_qp: Use local dev variable consistently in bind() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-17-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Replace indirect struct device accesses via hdmi->dev and pdev->dev with the local dev parameter already available in dw_hdmi_qp_rockchip_bind(), for consistency and readability. Reviewed-by: Heiko Stuebner Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 33 +++++++++++++---------= ---- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index 296f9a3ba66a..46df5abe31a4 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -475,7 +475,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, struct clk *ref_clk; int ret, irq, i; =20 - if (!pdev->dev.of_node) + if (!dev->of_node) return -ENODEV; =20 hdmi =3D drmm_kzalloc(drm, sizeof(*hdmi), GFP_KERNEL); @@ -495,7 +495,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, return dev_err_probe(dev, -ENODEV, "Missing platform ctrl ops\n"); =20 hdmi->ctrl_ops =3D cfg->ctrl_ops; - hdmi->dev =3D &pdev->dev; + hdmi->dev =3D dev; hdmi->port_id =3D -ENODEV; =20 /* Identify port ID by matching base IO address */ @@ -506,7 +506,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, } } if (hdmi->port_id < 0) - return dev_err_probe(hdmi->dev, hdmi->port_id, + return dev_err_probe(dev, hdmi->port_id, "Failed to match HDMI port ID\n"); =20 plat_data.phy_ops =3D cfg->phy_ops; @@ -530,37 +530,36 @@ static int dw_hdmi_qp_rockchip_bind(struct device *de= v, struct device *master, hdmi->regmap =3D syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,grf"); if (IS_ERR(hdmi->regmap)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->regmap), + return dev_err_probe(dev, PTR_ERR(hdmi->regmap), "Unable to get rockchip,grf\n"); =20 hdmi->vo_regmap =3D syscon_regmap_lookup_by_phandle(dev->of_node, "rockchip,vo-grf"); if (IS_ERR(hdmi->vo_regmap)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->vo_regmap), + return dev_err_probe(dev, PTR_ERR(hdmi->vo_regmap), "Unable to get rockchip,vo-grf\n"); =20 - ret =3D devm_clk_bulk_get_all_enabled(hdmi->dev, &clks); + ret =3D devm_clk_bulk_get_all_enabled(dev, &clks); if (ret < 0) - return dev_err_probe(hdmi->dev, ret, "Failed to get clocks\n"); + return dev_err_probe(dev, ret, "Failed to get clocks\n"); =20 - ref_clk =3D clk_get(hdmi->dev, "ref"); + ref_clk =3D clk_get(dev, "ref"); if (IS_ERR(ref_clk)) - return dev_err_probe(hdmi->dev, PTR_ERR(ref_clk), + return dev_err_probe(dev, PTR_ERR(ref_clk), "Failed to get ref clock\n"); =20 plat_data.ref_clk_rate =3D clk_get_rate(ref_clk); clk_put(ref_clk); =20 - hdmi->frl_enable_gpio =3D devm_gpiod_get_optional(hdmi->dev, "frl-enable", + hdmi->frl_enable_gpio =3D devm_gpiod_get_optional(dev, "frl-enable", GPIOD_OUT_LOW); if (IS_ERR(hdmi->frl_enable_gpio)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->frl_enable_gpio), + return dev_err_probe(dev, PTR_ERR(hdmi->frl_enable_gpio), "Failed to request FRL enable GPIO\n"); =20 hdmi->phy =3D devm_of_phy_get_by_index(dev, dev->of_node, 0); if (IS_ERR(hdmi->phy)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->phy), - "Failed to get phy\n"); + return dev_err_probe(dev, PTR_ERR(hdmi->phy), "Failed to get phy\n"); =20 cfg->ctrl_ops->io_init(hdmi); =20 @@ -578,7 +577,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, if (irq < 0) return irq; =20 - ret =3D devm_request_threaded_irq(hdmi->dev, irq, + ret =3D devm_request_threaded_irq(dev, irq, cfg->ctrl_ops->hardirq_callback, cfg->ctrl_ops->irq_callback, IRQF_SHARED, "dw-hdmi-qp-hpd", @@ -589,18 +588,18 @@ static int dw_hdmi_qp_rockchip_bind(struct device *de= v, struct device *master, drm_encoder_helper_add(encoder, &dw_hdmi_qp_rockchip_encoder_helper_funcs= ); ret =3D drmm_encoder_init(drm, encoder, NULL, DRM_MODE_ENCODER_TMDS, NULL= ); if (ret) - return dev_err_probe(hdmi->dev, ret, "Failed to init encoder\n"); + return dev_err_probe(dev, ret, "Failed to init encoder\n"); =20 platform_set_drvdata(pdev, hdmi); =20 hdmi->hdmi =3D dw_hdmi_qp_bind(pdev, encoder, &plat_data); if (IS_ERR(hdmi->hdmi)) - return dev_err_probe(hdmi->dev, PTR_ERR(hdmi->hdmi), + return dev_err_probe(dev, PTR_ERR(hdmi->hdmi), "Failed to bind dw-hdmi-qp\n"); =20 connector =3D drm_bridge_connector_init(drm, encoder); if (IS_ERR(connector)) - return dev_err_probe(hdmi->dev, PTR_ERR(connector), + return dev_err_probe(dev, PTR_ERR(connector), "Failed to init bridge connector\n"); =20 return 0; --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 215D73E51FD for ; Mon, 1 Jun 2026 22:45:26 +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=1780353930; cv=none; b=qvIErmXleIG9P3dOM76bUZyburRlhbiy27PO6Bp+Asec8EvuZfmeA7Cs3wFb10P+eAVpT40KNzZDDAVI30JIByGWO+9uZIURz2y5POw75GdMC0zzqi8vO5xnm7SizfcaUEzU+3Z/0ILq2aIW2w+jJPWE1YnWh866l7hdXD+nd64= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353930; c=relaxed/simple; bh=6E6xBHA62toRrtBV3Ev5KvntPSsFKRs99+xMXbjyuoQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Sm4M3T6pd73g41mF7iKGxcR4XWghNFaHRy0a0w0x4W3pGS38fXePqThW/UkslKIJbxxtw36lm4cmfRG10y2MfzFmKjiFGEG+z5p6fyRqRbAV0BGUbQjIl4sIHdvTSQHXjY60KD4KzHCuyl7Y5GjiuGWWp08/nB+hymcuQuJbMLM= 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=nlUMAZ60; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="nlUMAZ60" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353924; bh=6E6xBHA62toRrtBV3Ev5KvntPSsFKRs99+xMXbjyuoQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nlUMAZ60TVPo06oxGnTNteoKT3WR8494Q5u/aZrUkBYtaUs0iXWDBlNrdbJr4mR7T 3LlDlncWg5gbq0V+oiGwIujhxyXNs+CHmZOw33RUAUlEDc0/FJcmPWWd1NV62kvMb7 4d1B/uWJOKkesqCdAhINFb5rc0W1DI3Xhq/Q9fMC8A0obKCKCOXiUwv2fJk+ajlr19 eDI2cRjEBiA9O3AjlBQC2ffePQPmCRvgSIqUg4vI4HqTTu3tz8J4I9vbaTsPrrNw4U LwzDbH7xVg95ajxAuFSrlL2/Bq/HMwOwbqr0DHQoiM9cYPuS9v4awqcQCScxKjAYjR yotESvqGfJMYw== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id DAB9A17E0E3F; Tue, 2 Jun 2026 00:45:23 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:18 +0300 Subject: [PATCH v7 18/30] drm/rockchip: dw_hdmi_qp: Drop unnecessary #include Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-18-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Remove superfluous drm_simple_kms_helper.h include, which has no users in this file since commit e1f7b7cbd74c ("drm/rockchip: dw_hdmi_qp: Switch to drmm_encoder_init()"). Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index 46df5abe31a4..8d64b76a1aa5 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -24,7 +24,6 @@ #include #include #include -#include =20 #include "rockchip_drm_drv.h" =20 --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 E61FF3E121A for ; Mon, 1 Jun 2026 22:45:26 +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=1780353933; cv=none; b=YC9fiAD9qsvYGMfu0SfpuW36SxlUXq2lYMmVZ2qtZZaU87l+37yZTapQhAqzW8tnfPu30600LOuHTW0zDuTnu6aCAZ+Ppf/KLwgoy6jEtmJk+qeLWHJLuC2oQUz2S38ayySDCbZV6nQ6qcywCBvfqNJ4bFusj4ONY0AxFFHZ3ng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353933; c=relaxed/simple; bh=rWwG8Tc5P19fndsb7w+Dxe1sCr7RUtnyYEv1AsNrqpA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fxpJEkVrQ76l8z7u6uH1UbDkzvFHKlzlCNRfVznFOc6C0yPO4uBu5FMTpKe9b9TYCTn2H2IZVP2H6utyeQmre41Sxc4vfu7dZsZU8ycHl6zlVXDgcDfedL+QOPHfzuOR2BZEIeEGhFsPhsZhO7344Tnzd9x1jWg9wq5peZ1p35s= 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=a8gEHTPl; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="a8gEHTPl" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353924; bh=rWwG8Tc5P19fndsb7w+Dxe1sCr7RUtnyYEv1AsNrqpA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=a8gEHTPlI39ghXXfwH1xR1lpaPPfhinzj179kgVZxEmxts52zrM2davPTt2A2iquY aX+z12CIyZofGhgua6hUeERUictta7l9929hYeEE7B1X4gF20TDlFNBY3qwg27Mos1 ahSAKSYchhvpbgIRdjAMLppk7V5l8z332tWJ13RQzsnhl8KjZFt2AoLPEk7CFmBW12 0kdeNoLB5iKFQ8e3jA+S8gvt0sVwVrdhEaaitOzL+xRzBx6DNs9Jmxrx7BX1tl+Kk5 CXA1ng0GPhndaHe9q6zdWFyOHdu555HKVZqHM12pe3n0cxVs5qzXsf8XbFR51H4Jqk 45F+YIR6+vC4Q== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id A72A517E0E4C; Tue, 2 Jun 2026 00:45:24 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:19 +0300 Subject: [PATCH v7 19/30] drm/rockchip: dw_hdmi_qp: Defer HPD IRQ enable until after connector setup Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-19-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, Dmitry Baryshkov X-Mailer: b4 0.15.2 Request the HPD IRQ early in bind() with IRQF_NO_AUTOEN, keeping it disabled until all DRM resources are fully initialized, at which point enable_irq() arms it. This prevents premature interrupt delivery without forcing devm_request_threaded_irq() to the very end of the initialization sequence, which would complicate error unwinding. Note that IRQF_NO_AUTOEN is incompatible with IRQF_SHARED; the latter is dropped as this IRQ has no other users. Suggested-by: Dmitry Baryshkov Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index 8d64b76a1aa5..27342094958c 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -579,7 +579,7 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, ret =3D devm_request_threaded_irq(dev, irq, cfg->ctrl_ops->hardirq_callback, cfg->ctrl_ops->irq_callback, - IRQF_SHARED, "dw-hdmi-qp-hpd", + IRQF_NO_AUTOEN, "dw-hdmi-qp-hpd", hdmi); if (ret) return ret; @@ -601,6 +601,8 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev,= struct device *master, return dev_err_probe(dev, PTR_ERR(connector), "Failed to init bridge connector\n"); =20 + enable_irq(irq); + return 0; } =20 --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 215423E51EB for ; Mon, 1 Jun 2026 22:45:26 +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=1780353933; cv=none; b=lTOVz4GhSCJ73ums9XFqYGs4PJYLvbyGsOyq0TAgLTXtA+nSbxbUgTOax0W5ODSBY2uwY20d3009FCQ7wLV4xd+hKW1YaiVOSdjnnILlwY2uGX5WlPSQyxKSdC4CnweJzWr/KIOxI5ow2PPxXMTaVBhUY7/eaXmdJ+0Brd40yEI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353933; c=relaxed/simple; bh=zyVYCq2WRoxnKrGeF/o7p+aT7ASCbQqm8Mt8MtlMBZo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=i4ZkRtOsCvJxG+9umnrjlmnd9+A5hV+NWDnRYty8KpuGHjJr1Zunc8ID4zjWSKzG/ANHdGWVbiJ9e1YJCFjAyKCCtf+Bqx8Vi5KvC1gBPXyk7Ys2UOP4vikoKBehCVE1XD8AxOOfGIKGf5njMVYe1uQD5gJTTahggzS4h+kjUCY= 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=Ep/xlSqC; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Ep/xlSqC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353925; bh=zyVYCq2WRoxnKrGeF/o7p+aT7ASCbQqm8Mt8MtlMBZo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Ep/xlSqCmxWexIU2a3Cr6BPuFsWOJJ14AiBv+4o7bwgbTA1DSGeWhBPEJysKHt+rM +t5gSBDZUJVYZJxk2DU+zIPUOZcdLTMLVKI1A/KwmxAWPIF/qfwK7Z/nhaxKaKJzjE /kyGN5+4vzUuDLEoGdRAuw9w87U0reb8mGOMZOykdOYsBUUnypaKcmclMX5aI8Ti5s 8l1am+fX4Xh5qaeHie0kfasic7U6lEOxPU0CwsWZ85NbYHl1G4i63U6MgSxVbAW/Nl +7t90gVHgQctRrqYHYf48WW2gh4H9Y38jdLsk6Ce++G4hPurxJ/PHNZexulwNOa9Tg +q8AN05hbt9dQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 7033717E0086; Tue, 2 Jun 2026 00:45:25 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:20 +0300 Subject: [PATCH v7 20/30] drm/rockchip: dw_hdmi_qp: Mask HPD IRQ in rk3576_io_init() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-20-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Mask the RK3576 HPD interrupt in io_init() so it starts disabled, matching the RK3588 behavior. This prevents spurious interrupts before the bridge framework enables HPD via the .hpd_enable() callback. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index 27342094958c..62ea5c7cbbe6 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -346,7 +346,7 @@ static void dw_hdmi_qp_rk3576_io_init(struct rockchip_h= dmi_qp *hdmi) =20 regmap_write(hdmi->vo_regmap, RK3576_VO0_GRF_SOC_CON14, val); =20 - val =3D FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 0); + val =3D FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 1); regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); } =20 --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 D11B93955E2 for ; Mon, 1 Jun 2026 22:45:27 +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=1780353936; cv=none; b=bKilkOGkMQFNXkbwcNOAjfbbSCQSaOdrLLJOikZyXrMz9FG8C6PMbdR8msyFS7Os+pdMRIF/HBhRrD/gtV5mMKBbjAfuLSkkPQWPnXEccP1iStXgvNmXOY9/muZliZCYbnYut5GImErrQIEqwPLsDQM+viPKnTobKCJZV67YVAE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353936; c=relaxed/simple; bh=rLAf+mCXah0GMXLUQeSkJBx6Xl8UV5ety5SsdwICkGE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=H4AeWJKba8h41VV70MfzJpsiXIsOSGxJ9TbVltfcshdrH3CGaA6wJ5FsqB1ZdIyji058aUUXUxWnXC1yoi2zxPH3niRmEbW95jbHv6pPa4s57uYim3wpgvzdvYVBjWLZvuXrR7y5r5Ueah1Z9lflsicXKsBhi8Jhq9gLwAv8n5g= 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=ZT1SQI09; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="ZT1SQI09" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353926; bh=rLAf+mCXah0GMXLUQeSkJBx6Xl8UV5ety5SsdwICkGE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ZT1SQI09CvE5fZOE6CCZpC8kszlXSJN0rVL/9zcxqeAKm6KzIsWktLyDae1oDen30 vvjjxGYHqYJ0B1p5BmK4OZq0Cg4IgXa5Rk9D67pl5PlL3sqXKqJWiekRfpqzg1G9wS MHjYZVqQY/SUzlh8ecbVSuoY+LyxLROXrYrkpKS6/70VGt4XKZF3upypkFXphruF/Y t1T+GeMi2Wi7dJAC28Hp5dKnAMVe8O4MJLhns9wV2LqE4702X0q7FbHowDxDyHABxP jCC3l9T5z/x1Z1HI/SPNegAhF/M1Xz27oY2DmCSTZtn5oo0LHQ1RwXaSDU1KG0xKlC Fv4FKoeXALUiw== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 3015117E045E; Tue, 2 Jun 2026 00:45:26 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:21 +0300 Subject: [PATCH v7 21/30] drm/rockchip: dw_hdmi_qp: Implement .{enable|disable}_hpd() PHY ops Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-21-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Implement .enable_hpd() and .disable_hpd() phy ops for RK3576 and RK3588 SoCs, used by the corresponding bridge callbacks for HPD activation control. Consolidate the interrupt clear-and-unmask sequence into enable_hpd() and the mask-only operation into disable_hpd(), replacing the open-coded register writes in the interrupt handlers and io_init(). The .setup_hpd() phy op, which was previously called from dw_hdmi_qp_init_hw(), is no longer needed and its users are removed. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 78 +++++++++++++---------= ---- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index 62ea5c7cbbe6..b9e0ea56efd8 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -193,7 +193,7 @@ dw_hdmi_qp_rk3588_read_hpd(struct dw_hdmi_qp *dw_hdmi, = void *data) return val ? connector_status_connected : connector_status_disconnected; } =20 -static void dw_hdmi_qp_rk3588_setup_hpd(struct dw_hdmi_qp *dw_hdmi, void *= data) +static void dw_hdmi_qp_rk3588_enable_hpd(struct dw_hdmi_qp *dw_hdmi, void = *data) { struct rockchip_hdmi_qp *hdmi =3D (struct rockchip_hdmi_qp *)data; u32 val; @@ -208,11 +208,25 @@ static void dw_hdmi_qp_rk3588_setup_hpd(struct dw_hdm= i_qp *dw_hdmi, void *data) regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); } =20 +static void dw_hdmi_qp_rk3588_disable_hpd(struct dw_hdmi_qp *dw_hdmi, void= *data) +{ + struct rockchip_hdmi_qp *hdmi =3D (struct rockchip_hdmi_qp *)data; + u32 val; + + if (hdmi->port_id) + val =3D FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 1); + else + val =3D FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 1); + + regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); +} + static const struct dw_hdmi_qp_phy_ops rk3588_hdmi_phy_ops =3D { .init =3D dw_hdmi_qp_rk3588_phy_init, .disable =3D dw_hdmi_qp_rk3588_phy_disable, .read_hpd =3D dw_hdmi_qp_rk3588_read_hpd, - .setup_hpd =3D dw_hdmi_qp_rk3588_setup_hpd, + .enable_hpd =3D dw_hdmi_qp_rk3588_enable_hpd, + .disable_hpd =3D dw_hdmi_qp_rk3588_disable_hpd, }; =20 static enum drm_connector_status @@ -227,7 +241,7 @@ dw_hdmi_qp_rk3576_read_hpd(struct dw_hdmi_qp *dw_hdmi, = void *data) connector_status_connected : connector_status_disconnected; } =20 -static void dw_hdmi_qp_rk3576_setup_hpd(struct dw_hdmi_qp *dw_hdmi, void *= data) +static void dw_hdmi_qp_rk3576_enable_hpd(struct dw_hdmi_qp *dw_hdmi, void = *data) { struct rockchip_hdmi_qp *hdmi =3D (struct rockchip_hdmi_qp *)data; u32 val; @@ -236,14 +250,22 @@ static void dw_hdmi_qp_rk3576_setup_hpd(struct dw_hdm= i_qp *dw_hdmi, void *data) FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 0)); =20 regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); - regmap_write(hdmi->regmap, 0xa404, 0xffff0102); +} + +static void dw_hdmi_qp_rk3576_disable_hpd(struct dw_hdmi_qp *dw_hdmi, void= *data) +{ + struct rockchip_hdmi_qp *hdmi =3D (struct rockchip_hdmi_qp *)data; + + regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, + FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 1)); } =20 static const struct dw_hdmi_qp_phy_ops rk3576_hdmi_phy_ops =3D { .init =3D dw_hdmi_qp_rk3588_phy_init, .disable =3D dw_hdmi_qp_rk3588_phy_disable, .read_hpd =3D dw_hdmi_qp_rk3576_read_hpd, - .setup_hpd =3D dw_hdmi_qp_rk3576_setup_hpd, + .enable_hpd =3D dw_hdmi_qp_rk3576_enable_hpd, + .disable_hpd =3D dw_hdmi_qp_rk3576_disable_hpd, }; =20 static void dw_hdmi_qp_rk3588_hpd_work(struct work_struct *work) @@ -264,13 +286,12 @@ static void dw_hdmi_qp_rk3588_hpd_work(struct work_st= ruct *work) static irqreturn_t dw_hdmi_qp_rk3576_hardirq(int irq, void *dev_id) { struct rockchip_hdmi_qp *hdmi =3D dev_id; - u32 intr_stat, val; + u32 intr_stat; =20 regmap_read(hdmi->regmap, RK3576_IOC_HDMI_HPD_STATUS, &intr_stat); - if (intr_stat) { - val =3D FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 1); =20 - regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); + if (intr_stat) { + dw_hdmi_qp_rk3576_disable_hpd(NULL, hdmi); return IRQ_WAKE_THREAD; } =20 @@ -280,15 +301,11 @@ static irqreturn_t dw_hdmi_qp_rk3576_hardirq(int irq,= void *dev_id) static irqreturn_t dw_hdmi_qp_rk3576_irq(int irq, void *dev_id) { struct rockchip_hdmi_qp *hdmi =3D dev_id; - u32 val; =20 - val =3D FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_CLR, 1); - regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); mod_delayed_work(system_percpu_wq, &hdmi->hpd_work, msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); =20 - val =3D FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 0); - regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); + dw_hdmi_qp_rk3576_enable_hpd(NULL, hdmi); =20 return IRQ_HANDLED; } @@ -296,16 +313,12 @@ static irqreturn_t dw_hdmi_qp_rk3576_irq(int irq, voi= d *dev_id) static irqreturn_t dw_hdmi_qp_rk3588_hardirq(int irq, void *dev_id) { struct rockchip_hdmi_qp *hdmi =3D dev_id; - u32 intr_stat, val; + u32 intr_stat; =20 regmap_read(hdmi->regmap, RK3588_GRF_SOC_STATUS1, &intr_stat); =20 if (intr_stat) { - if (hdmi->port_id) - val =3D FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 1); - else - val =3D FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 1); - regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); + dw_hdmi_qp_rk3588_disable_hpd(NULL, hdmi); return IRQ_WAKE_THREAD; } =20 @@ -315,22 +328,11 @@ static irqreturn_t dw_hdmi_qp_rk3588_hardirq(int irq,= void *dev_id) static irqreturn_t dw_hdmi_qp_rk3588_irq(int irq, void *dev_id) { struct rockchip_hdmi_qp *hdmi =3D dev_id; - u32 val; - - if (hdmi->port_id) - val =3D FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_CLR, 1); - else - val =3D FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_CLR, 1); - regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); =20 mod_delayed_work(system_percpu_wq, &hdmi->hpd_work, msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); =20 - if (hdmi->port_id) - val |=3D FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 0); - else - val |=3D FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 0); - regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); + dw_hdmi_qp_rk3588_enable_hpd(NULL, hdmi); =20 return IRQ_HANDLED; } @@ -343,11 +345,11 @@ static void dw_hdmi_qp_rk3576_io_init(struct rockchip= _hdmi_qp *hdmi) FIELD_PREP_WM16(RK3576_SDAIN_MASK, 1) | FIELD_PREP_WM16(RK3576_HDMI_GRANT_SEL, 1) | FIELD_PREP_WM16(RK3576_I2S_SEL_MASK, 1); - regmap_write(hdmi->vo_regmap, RK3576_VO0_GRF_SOC_CON14, val); =20 - val =3D FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 1); - regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val); + regmap_write(hdmi->regmap, 0xa404, 0xffff0102); + + dw_hdmi_qp_rk3576_disable_hpd(NULL, hdmi); } =20 static void dw_hdmi_qp_rk3588_io_init(struct rockchip_hdmi_qp *hdmi) @@ -372,11 +374,7 @@ static void dw_hdmi_qp_rk3588_io_init(struct rockchip_= hdmi_qp *hdmi) val =3D FIELD_PREP_WM16(RK3588_HDMI0_GRANT_SEL, 1); regmap_write(hdmi->vo_regmap, RK3588_GRF_VO1_CON9, val); =20 - if (hdmi->port_id) - val =3D FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 1); - else - val =3D FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 1); - regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val); + dw_hdmi_qp_rk3588_disable_hpd(NULL, hdmi); } =20 static void dw_hdmi_qp_rk3576_enc_init(struct rockchip_hdmi_qp *hdmi, --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 6F50239C003 for ; Mon, 1 Jun 2026 22:45:28 +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=1780353934; cv=none; b=XdVDHHRQqdPTTDj2uzam6nji+P63PKFQMG5k1bBE1YgAurTMQ9xQlLQrR2CHQW28N7JCQf4yJeAeZMtCyDEZ6UUoN6j6HVZFVfIpp3LauH2ehS/Ys9BwqF19jJyxx+iUeARjT/MEQZgDJWf3ZIlBAmchX4zirt9HYfJUPdFJKc4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353934; c=relaxed/simple; bh=EOy1hBtmV/oLRhDhHglDR1BtGwYAUjW4vfi4FuA2Xr8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nUCQKYty0uAQPCNVVc73p7ryAkm0GXGtnsf2osSm1khMDwkQKrEmKEewQGXSK+C9Hv1TtEzn1d3urWHVZb/vQFgnlYuSnEV7qSVXKr3M0tUyry+PPPOIkwe9TAviyWkI7+/tL3jY52WJI4RGEg3RjTgoaCMj1/bCP2z8PrtLaSQ= 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=M0ZqzIgj; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="M0ZqzIgj" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353927; bh=EOy1hBtmV/oLRhDhHglDR1BtGwYAUjW4vfi4FuA2Xr8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=M0ZqzIgj4WCm7FRTKUrerbJ2UAwMqUVL77prB+lCynle8tGQ31UlKLIx/nQdgkjhv 5tj8y8o5M101KCDLgvxGoE5cDSAlb9ibt8Y24h0JDrC0iPDzKvLJOL7xZ4pmholeww 0QYG7yTWWyIn2dJEAp+ivWjb8qCNuVNeoG3XlbdxCS8DswdNmegJMIKa6ZXkpK257K C1F1aLvtnnSpqLqptJH6mf74DxoN6EOO5ICKkmr65X5kO5dnLReweRr4F2aT/4KxO2 8jJfGIGR2f+h18cQsgU0Nh3lNd8/q6jdQmNBaAzItbuLkpGEAL1ARXtr5V1o34HZ67 IX+dgRhbwbyMw== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id DFADF17E0A6C; Tue, 2 Jun 2026 00:45:26 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:22 +0300 Subject: [PATCH v7 22/30] drm/rockchip: dw_hdmi_qp: Switch to dw_hdmi_qp_hpd_notify() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-22-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Switch from drm_helper_hpd_irq_event(), which polls all connectors, to the recently introduced dw_hdmi_qp_hpd_notify() helper, which runs the detect cycle only on the affected connector. This avoids unnecessary work and redundant detect calls on unrelated connectors. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/d= rm/rockchip/dw_hdmi_qp-rockchip.c index b9e0ea56efd8..666631fc9162 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c @@ -23,7 +23,6 @@ #include #include #include -#include =20 #include "rockchip_drm_drv.h" =20 @@ -273,14 +272,8 @@ static void dw_hdmi_qp_rk3588_hpd_work(struct work_str= uct *work) struct rockchip_hdmi_qp *hdmi =3D container_of(work, struct rockchip_hdmi_qp, hpd_work.work); - struct drm_device *drm =3D hdmi->encoder.encoder.dev; - bool changed; =20 - if (drm) { - changed =3D drm_helper_hpd_irq_event(drm); - if (changed) - dev_dbg(hdmi->dev, "connector status changed\n"); - } + dw_hdmi_qp_hpd_notify(hdmi->hdmi); } =20 static irqreturn_t dw_hdmi_qp_rk3576_hardirq(int irq, void *dev_id) @@ -645,8 +638,7 @@ static int __maybe_unused dw_hdmi_qp_rockchip_resume(st= ruct device *dev) =20 dw_hdmi_qp_resume(dev, hdmi->hdmi); =20 - if (hdmi->encoder.encoder.dev) - drm_helper_hpd_irq_event(hdmi->encoder.encoder.dev); + dw_hdmi_qp_hpd_notify(hdmi->hdmi); =20 return 0; } --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 3142E397694 for ; Mon, 1 Jun 2026 22:45:29 +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=1780353934; cv=none; b=uDv1YOhOFzYfqyPPaEM9Ix7SRLkWiHJegOsa77NAjhSCvZRawHypi0Fg76fhPwyt+1vFLh5FN7a1JhOhrSh/TbHGZA0BJcTPdvw0de1nf9QpMtMyWqP1aG6Mc4BAhdsP4ywoIHJK2yu1PBsiScIDVEYgiOgogSEGunPzmyY1hEo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353934; c=relaxed/simple; bh=2YOZtIOzsaKUDvl49jxh1pMsviLuI3ZtxOvFsyPw6lA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jPb09vQq/AsaK2Jt1qnEFiHxprMveFqqnmjJPTzwlwAhjR4dceN7jIAYVMSk/W3niPtD0GLaBP1IfUQ5MrHNI3XhmDKS7Hb/p2wpm3OYOM1huTVHHIP1Cal+7cWLwLYKbSVLOCFJhdjwCIWaAJVWb7ehlgTFgj8DsWJjgATiG1I= 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=Z7O29uk0; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Z7O29uk0" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353927; bh=2YOZtIOzsaKUDvl49jxh1pMsviLuI3ZtxOvFsyPw6lA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Z7O29uk0ODJ66WIT6k9Ofr8e/k7vYWmGzq395fqxU5XK+Vtlwyvt14lfXyYgM4iFn gE7haN23XTSH7mcR3nS5fAJ6NYisewh1os11/+Vyi/88HI0IiZkrIRu0MHyoJ1Ayb1 qs3QWIdTHtkbkj2TokBz9qIlHaMbAh/8mOKSN5ijq7gUIkDPkiDh4Xw21XuFE/ow+c UubWPUyycvCOIQuuvUEXyobnkk2NzG0QmGNLjrSX2VcIeZfbV7Gb4XruwkllxniLfU qdsdwYh2oilUAFJ9M9IiXHN2Waj+1nikb/TKm7tVqcnUo2Zx0HhCnvZ9XOd8wqMkBE kadgLgnGk47dw== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id B3E5717E0C88; Tue, 2 Jun 2026 00:45:27 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:23 +0300 Subject: [PATCH v7 23/30] drm/bridge: dw-hdmi-qp: Remove obsolete .setup_hpd() phy op Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-23-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 With the transition to .{enable|disable}_hpd() phy ops complete in both the bridge and platform drivers, .setup_hpd() has no remaining callers. Drop it. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 3 --- include/drm/bridge/dw_hdmi_qp.h | 1 - 2 files changed, 4 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index 999229705ffb..3cb06fe43087 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -1318,9 +1318,6 @@ static void dw_hdmi_qp_init_hw(struct dw_hdmi_qp *hdm= i) /* Clear DONE and ERROR interrupts */ dw_hdmi_qp_write(hdmi, I2CM_OP_DONE_CLEAR | I2CM_NACK_RCVD_CLEAR, MAINUNIT_1_INT_CLEAR); - - if (hdmi->phy.ops->setup_hpd) - hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data); } =20 struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev, diff --git a/include/drm/bridge/dw_hdmi_qp.h b/include/drm/bridge/dw_hdmi_q= p.h index b4fb1c578a5b..ad33f9cafdeb 100644 --- a/include/drm/bridge/dw_hdmi_qp.h +++ b/include/drm/bridge/dw_hdmi_qp.h @@ -16,7 +16,6 @@ struct dw_hdmi_qp_phy_ops { int (*init)(struct dw_hdmi_qp *hdmi, void *data); void (*disable)(struct dw_hdmi_qp *hdmi, void *data); enum drm_connector_status (*read_hpd)(struct dw_hdmi_qp *hdmi, void *data= ); - void (*setup_hpd)(struct dw_hdmi_qp *hdmi, void *data); void (*enable_hpd)(struct dw_hdmi_qp *hdmi, void *data); void (*disable_hpd)(struct dw_hdmi_qp *hdmi, void *data); }; --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 1D2F2397AE4 for ; Mon, 1 Jun 2026 22:45:29 +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=1780353935; cv=none; b=EKnYMptAgrAL42JwIdsUF14r6gGLnktMUWFP2VoisWp++4x43D1l/ng+0AQHEWaC26E2RGQjJmcSRWcR3YrnP+eEV6dY3C1NgzWJ935iLcnFdnU1Cg0qtETrhZRikutV30fUXv+I28CqxfotQJIq4+XMvYamhTn+3KhwJxBWIEo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353935; c=relaxed/simple; bh=yIFZkXQvWRCtoEOG6bwT3y8io/QLub6eDXCjsunphsk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FbAPYTKt0mGLQnmlLxtMLHnDtURADTHO3tenhlyFJw/O3dlcYLCKhO026sS8NL+CjwwPYONCAU0InW6mf44o8fxviJwHSMl7idALIwFCxv+IsVDv+LXpx6lfEnmg2/3swun7/JxRjoWpqvZpk5yZKMgYgbKUt3o/knevaEURZac= 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=EUgjpbdZ; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="EUgjpbdZ" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353928; bh=yIFZkXQvWRCtoEOG6bwT3y8io/QLub6eDXCjsunphsk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=EUgjpbdZYiKTXCLlgnCboqOG/g6s9e2ADIb46uc0AGnPo6io4OE4uqGJMwhS9vrj9 aDlQ8MtBv1pz1ZwrAC949JaGUvGepff4e400fL4mIPylxa9ewBgSeh+hhmjs4ig89H IeORvyLoG7h0zjp3m5gYsTRBn0a5Il+qRCQE5mAUm0IkUw6+doGjvccnBgEZ+rxE7f 68xhMKwzsMM5sJFMoUm+OaOPFX1IwGFh2kAGhoD2mSldDMM/uBT4sBFRNkgVkt36YL Hqpuf/skLRRVZ4N7OeUomO3jAwc8RIQjYjNxC0nNYvBkRfLioxmpGvEWBGVVVUoq2e EaeQQLyWdgUDQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 7088E17E0DE1; Tue, 2 Jun 2026 00:45:28 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:24 +0300 Subject: [PATCH v7 24/30] drm/vc4: hdmi: Use common TMDS char rate constants Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-24-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Replace HDMI_14_MAX_TMDS_CLK defined locally with HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ provided by linux/hdmi.h. Note this incorrectly referenced HDMI 1.4, as the 340 MHz maximum TMDS character rate was actually introduced in HDMI 1.3. Similarly, use HDMI_2_0_TMDS_CHAR_RATE_MAX_HZ instead of the 600000000 magic number. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/vc4/vc4_hdmi.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 74dce4be0c00..046ac4f43ba8 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -113,8 +114,6 @@ #define HSM_MIN_CLOCK_FREQ 120000000 #define CEC_CLOCK_FREQ 40000 =20 -#define HDMI_14_MAX_TMDS_CLK (340 * 1000 * 1000) - static bool vc4_hdmi_supports_scrambling(struct vc4_hdmi *vc4_hdmi) { struct drm_display_info *display =3D &vc4_hdmi->connector.display_info; @@ -137,7 +136,7 @@ static bool vc4_hdmi_mode_needs_scrambling(const struct= drm_display_mode *mode, { unsigned long long clock =3D drm_hdmi_compute_mode_clock(mode, bpc, fmt); =20 - return clock > HDMI_14_MAX_TMDS_CLK; + return clock > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ; } =20 static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) @@ -1727,7 +1726,7 @@ vc4_hdmi_connector_clock_valid(const struct drm_conne= ctor *connector, if (clock > vc4_hdmi->variant->max_pixel_clock) return MODE_CLOCK_HIGH; =20 - if (!vc4->hvs->vc5_hdmi_enable_hdmi_20 && clock > HDMI_14_MAX_TMDS_CLK) + if (!vc4->hvs->vc5_hdmi_enable_hdmi_20 && clock > HDMI_1_3_TMDS_CHAR_RATE= _MAX_HZ) return MODE_CLOCK_HIGH; =20 /* 4096x2160@60 is not reliable without overclocking core */ @@ -3253,7 +3252,7 @@ static int vc4_hdmi_bind(struct device *dev, struct d= evice *master, void *data) * vc4_hdmi_disable_scrambling() will thus run at boot, make * sure it's disabled, and avoid any inconsistency. */ - if (variant->max_pixel_clock > HDMI_14_MAX_TMDS_CLK) + if (variant->max_pixel_clock > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ) vc4_hdmi->scdc_enabled =3D true; =20 ret =3D variant->init_resources(drm, vc4_hdmi); @@ -3383,7 +3382,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi0_va= riant =3D { .encoder_type =3D VC4_ENCODER_TYPE_HDMI0, .debugfs_name =3D "hdmi0_regs", .card_name =3D "vc4-hdmi-0", - .max_pixel_clock =3D 600000000, + .max_pixel_clock =3D HDMI_2_0_TMDS_CHAR_RATE_MAX_HZ, .registers =3D vc5_hdmi_hdmi0_fields, .num_registers =3D ARRAY_SIZE(vc5_hdmi_hdmi0_fields), .phy_lane_mapping =3D { @@ -3412,7 +3411,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi1_va= riant =3D { .encoder_type =3D VC4_ENCODER_TYPE_HDMI1, .debugfs_name =3D "hdmi1_regs", .card_name =3D "vc4-hdmi-1", - .max_pixel_clock =3D HDMI_14_MAX_TMDS_CLK, + .max_pixel_clock =3D HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ, .registers =3D vc5_hdmi_hdmi1_fields, .num_registers =3D ARRAY_SIZE(vc5_hdmi_hdmi1_fields), .phy_lane_mapping =3D { @@ -3441,7 +3440,7 @@ static const struct vc4_hdmi_variant bcm2712_hdmi0_va= riant =3D { .encoder_type =3D VC4_ENCODER_TYPE_HDMI0, .debugfs_name =3D "hdmi0_regs", .card_name =3D "vc4-hdmi-0", - .max_pixel_clock =3D 600000000, + .max_pixel_clock =3D HDMI_2_0_TMDS_CHAR_RATE_MAX_HZ, .registers =3D vc6_hdmi_hdmi0_fields, .num_registers =3D ARRAY_SIZE(vc6_hdmi_hdmi0_fields), .phy_lane_mapping =3D { @@ -3468,7 +3467,7 @@ static const struct vc4_hdmi_variant bcm2712_hdmi1_va= riant =3D { .encoder_type =3D VC4_ENCODER_TYPE_HDMI1, .debugfs_name =3D "hdmi1_regs", .card_name =3D "vc4-hdmi-1", - .max_pixel_clock =3D 600000000, + .max_pixel_clock =3D HDMI_2_0_TMDS_CHAR_RATE_MAX_HZ, .registers =3D vc6_hdmi_hdmi1_fields, .num_registers =3D ARRAY_SIZE(vc6_hdmi_hdmi1_fields), .phy_lane_mapping =3D { --=20 2.54.0 From nobody Mon Jun 8 05:27:34 2026 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 B1A2A3EEAC8 for ; Mon, 1 Jun 2026 22:45:30 +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=1780353936; cv=none; b=mFRjzi6UMl62CSsmazOAvM/2fZqqgpzBUB72sICEz7GRUi4fyp51b4oNnPj531asPX47zGExy1siaKBN2GCjFv2y4xuFd8Kb/PIZ0T8Ppc/X+p73UGRaMOOmBTN18b+1rSb3utIOAkWP1k17ttaicRJB+TgxZbxKY6H+KUt8nvY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353936; c=relaxed/simple; bh=PEAv8TNwAIrTF/VpnuiW1c80xtKKv9wlhajkzBFg53M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Kv4YYjQQ1mIpugAhn8F24XSJXQGFfPZPxeCF2b9c80eeD7/nVMU5UQnECog7ofWAn9y60NV1tya9kARqpK6eBfXG3doL1GesQD4+CvVjZOEb6s8kdHhCeAViNHkFHcSON8U8cyV3weDTqtJeguW/z9077XezccNb+acmEw04P84= 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=Zf6NufGC; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Zf6NufGC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353929; bh=PEAv8TNwAIrTF/VpnuiW1c80xtKKv9wlhajkzBFg53M=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Zf6NufGCfDkOhKmPShvvegjuh+HKO6ovD4VGo0p6burOiRm8irphoK32eY+BT8SC8 i1UbJ/frh+MLcmBUHJknawIFWmS9vcHqYaZfR105chIYp9Tk4VeRj+7LaF3AEz6O9C kx/HU6YjU52ZBDZiVhnXRYPnnGhCYkrYK2AS68mDeG/oucF5lDn/UjX4YyLeXUwS77 j5m3Uqx7hZTah1pZp1EgJ2BHWK52Q1cL6vOWxdzxmKapXMa83dD+G2pHFK0KGaP3At YOiD3oisl8a/pa5jJy+1N+Un46WXMdBBzX+Mk8xReWZESm56vO2okwRSJbjYliduFh GSe1lb5YdiStQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 3307B17E0DE9; Tue, 2 Jun 2026 00:45:29 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:25 +0300 Subject: [PATCH v7 25/30] drm/vc4: hdmi: Convert to common HDMI 2.0 SCDC scrambling helpers Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-25-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Replace the vc4-local scrambling implementation with the newly introduced DRM common SCDC scrambling infrastructure: - Advertise source-side scrambling support by setting connector->hdmi.scrambling_supported based on the variant's max_pixel_clock before drmm_connector_hdmi_init(). - Provide minimal .scrambler_{enable|disable} connector callbacks that only toggle the VC5 HDMI_SCRAMBLER_CTL register. Sink-side SCDC programming and periodic status monitoring are now delegated to drm_scdc_{start|stop}_scrambling(). - Replace vc4_hdmi_enable_scrambling() with a conditional call to drm_scdc_start_scrambling() in post_crtc_enable, gated on conn_state->hdmi.scrambler_needed (computed by the HDMI state helper). - Replace vc4_hdmi_disable_scrambling() with drm_scdc_stop_scrambling() in post_crtc_disable. - Drop vc4_hdmi_reset_link() and vc4_hdmi_handle_hotplug(), switching the .detect_ctx() path to drm_atomic_helper_connector_hdmi_hotplug_ctx() which internally calls drm_scdc_sync_status() to trigger a CRTC reset on reconnection. - Drop the local scrambling_work delayed workqueue and scdc_enabled flag, now tracked by the common drm_connector_hdmi layer. - Drop vc4_hdmi_supports_scrambling() and vc4_hdmi_mode_needs_scrambling() helpers, inlining the remaining 4KP60 warning with an explicit drm_hdmi_compute_mode_clock() check. - Seed connector->hdmi.scrambler_enabled =3D true in connector_init() to ensure drm_scdc_stop_scrambling() runs at boot and disables any stale scrambling state left by the bootloader. No functional change is expected for the supported modes. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/vc4/vc4_hdmi.c | 265 ++++++-------------------------------= ---- drivers/gpu/drm/vc4/vc4_hdmi.h | 8 -- 2 files changed, 35 insertions(+), 238 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 046ac4f43ba8..02f6ca6ab52b 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -114,31 +114,6 @@ #define HSM_MIN_CLOCK_FREQ 120000000 #define CEC_CLOCK_FREQ 40000 =20 -static bool vc4_hdmi_supports_scrambling(struct vc4_hdmi *vc4_hdmi) -{ - struct drm_display_info *display =3D &vc4_hdmi->connector.display_info; - - lockdep_assert_held(&vc4_hdmi->mutex); - - if (!display->is_hdmi) - return false; - - if (!display->hdmi.scdc.supported || - !display->hdmi.scdc.scrambling.supported) - return false; - - return true; -} - -static bool vc4_hdmi_mode_needs_scrambling(const struct drm_display_mode *= mode, - unsigned int bpc, - enum drm_output_color_format fmt) -{ - unsigned long long clock =3D drm_hdmi_compute_mode_clock(mode, bpc, fmt); - - return clock > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ; -} - static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) { struct drm_debugfs_entry *entry =3D m->private; @@ -272,124 +247,6 @@ static void vc4_hdmi_cec_update_clk_div(struct vc4_hd= mi *vc4_hdmi) static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) {} #endif =20 -static int vc4_hdmi_reset_link(struct drm_connector *connector, - struct drm_modeset_acquire_ctx *ctx) -{ - struct drm_device *drm; - struct vc4_hdmi *vc4_hdmi; - struct drm_connector_state *conn_state; - struct drm_crtc_state *crtc_state; - struct drm_crtc *crtc; - bool scrambling_needed; - u8 config; - int ret; - - if (!connector) - return 0; - - drm =3D connector->dev; - ret =3D drm_modeset_lock(&drm->mode_config.connection_mutex, ctx); - if (ret) - return ret; - - conn_state =3D connector->state; - crtc =3D conn_state->crtc; - if (!crtc) - return 0; - - ret =3D drm_modeset_lock(&crtc->mutex, ctx); - if (ret) - return ret; - - crtc_state =3D crtc->state; - if (!crtc_state->active) - return 0; - - vc4_hdmi =3D connector_to_vc4_hdmi(connector); - mutex_lock(&vc4_hdmi->mutex); - - if (!vc4_hdmi_supports_scrambling(vc4_hdmi)) { - mutex_unlock(&vc4_hdmi->mutex); - return 0; - } - - scrambling_needed =3D vc4_hdmi_mode_needs_scrambling(&vc4_hdmi->saved_adj= usted_mode, - vc4_hdmi->output_bpc, - vc4_hdmi->output_format); - if (!scrambling_needed) { - mutex_unlock(&vc4_hdmi->mutex); - return 0; - } - - if (conn_state->commit && - !try_wait_for_completion(&conn_state->commit->hw_done)) { - mutex_unlock(&vc4_hdmi->mutex); - return 0; - } - - ret =3D drm_scdc_readb(connector->ddc, SCDC_TMDS_CONFIG, &config); - if (ret < 0) { - drm_err(drm, "Failed to read TMDS config: %d\n", ret); - mutex_unlock(&vc4_hdmi->mutex); - return 0; - } - - if (!!(config & SCDC_SCRAMBLING_ENABLE) =3D=3D scrambling_needed) { - mutex_unlock(&vc4_hdmi->mutex); - return 0; - } - - mutex_unlock(&vc4_hdmi->mutex); - - /* - * HDMI 2.0 says that one should not send scrambled data - * prior to configuring the sink scrambling, and that - * TMDS clock/data transmission should be suspended when - * changing the TMDS clock rate in the sink. So let's - * just do a full modeset here, even though some sinks - * would be perfectly happy if were to just reconfigure - * the SCDC settings on the fly. - */ - return drm_atomic_helper_reset_crtc(crtc, ctx); -} - -static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi, - struct drm_modeset_acquire_ctx *ctx, - enum drm_connector_status status) -{ - struct drm_connector *connector =3D &vc4_hdmi->connector; - int ret; - - /* - * NOTE: This function should really be called with vc4_hdmi->mutex - * held, but doing so results in reentrancy issues since - * cec_s_phys_addr() might call .adap_enable, which leads to that - * funtion being called with our mutex held. - * - * A similar situation occurs with vc4_hdmi_reset_link() that - * will call into our KMS hooks if the scrambling was enabled. - * - * Concurrency isn't an issue at the moment since we don't share - * any state with any of the other frameworks so we can ignore - * the lock for now. - */ - - drm_atomic_helper_connector_hdmi_hotplug(connector, status); - - if (status !=3D connector_status_connected) - return; - - for (;;) { - ret =3D vc4_hdmi_reset_link(connector, ctx); - if (ret =3D=3D -EDEADLK) { - drm_modeset_backoff(ctx); - continue; - } - - break; - } -} - static int vc4_hdmi_connector_detect_ctx(struct drm_connector *connector, struct drm_modeset_acquire_ctx *ctx, bool force) @@ -401,8 +258,8 @@ static int vc4_hdmi_connector_detect_ctx(struct drm_con= nector *connector, /* * NOTE: This function should really take vc4_hdmi->mutex, but * doing so results in reentrancy issues since - * vc4_hdmi_handle_hotplug() can call into other functions that - * would take the mutex while it's held here. + * drm_atomic_helper_connector_hdmi_hotplug_ctx() can call into other + * functions that would take the mutex while it's held here. * * Concurrency isn't an issue at the moment since we don't share * any state with any of the other frameworks so we can ignore @@ -425,10 +282,11 @@ static int vc4_hdmi_connector_detect_ctx(struct drm_c= onnector *connector, status =3D connector_status_connected; } =20 - vc4_hdmi_handle_hotplug(vc4_hdmi, ctx, status); + ret =3D drm_atomic_helper_connector_hdmi_hotplug_ctx(connector, status, c= tx); + pm_runtime_put(&vc4_hdmi->pdev->dev); =20 - return status; + return ret =3D=3D -EDEADLK ? ret : status; } =20 static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) @@ -441,9 +299,12 @@ static int vc4_hdmi_connector_get_modes(struct drm_con= nector *connector) if (!vc4->hvs->vc5_hdmi_enable_hdmi_20) { struct drm_device *drm =3D connector->dev; const struct drm_display_mode *mode; + unsigned long long clock; =20 list_for_each_entry(mode, &connector->probed_modes, head) { - if (vc4_hdmi_mode_needs_scrambling(mode, 8, DRM_OUTPUT_COLOR_FORMAT_RGB= 444)) { + clock =3D drm_hdmi_compute_mode_clock(mode, 8, + DRM_OUTPUT_COLOR_FORMAT_RGB444); + if (clock > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ) { drm_warn_once(drm, "The core clock cannot reach frequencies high enoug= h to support 4k @ 60Hz."); drm_warn_once(drm, "Please change your config.txt file to add hdmi_ena= ble_4kp60."); } @@ -540,6 +401,9 @@ static int vc4_hdmi_connector_init(struct drm_device *d= ev, if (vc4_hdmi->variant->supports_hdr) max_bpc =3D 12; =20 + connector->hdmi.scrambler_supported =3D + vc4_hdmi->variant->max_pixel_clock > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ; + ret =3D drmm_connector_hdmi_init(dev, connector, "Broadcom", "Videocore", &vc4_hdmi_connector_funcs, @@ -561,6 +425,14 @@ static int vc4_hdmi_connector_init(struct drm_device *= dev, =20 drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs); =20 + /* + * Since we don't know the state of the controller and its + * display (if any), let's assume it's always enabled. + * drm_scdc_stop_scrambling() will thus run at boot, make + * sure it's disabled, and avoid any inconsistency. + */ + connector->hdmi.scrambler_enabled =3D connector->hdmi.scrambler_supported; + /* * Some of the properties below require access to state, like bpc. * Allocate some default initial connector state with our reset helper. @@ -786,93 +658,30 @@ static int vc4_hdmi_write_spd_infoframe(struct drm_co= nnector *connector, buffer, len); } =20 -#define SCRAMBLING_POLLING_DELAY_MS 1000 - -static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder) +static int vc4_hdmi_scrambler_enable(struct drm_connector *connector) { - struct vc4_hdmi *vc4_hdmi =3D encoder_to_vc4_hdmi(encoder); - struct drm_connector *connector =3D &vc4_hdmi->connector; - struct drm_device *drm =3D connector->dev; - const struct drm_display_mode *mode =3D &vc4_hdmi->saved_adjusted_mode; + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); unsigned long flags; - int idx; - - lockdep_assert_held(&vc4_hdmi->mutex); - - if (!vc4_hdmi_supports_scrambling(vc4_hdmi)) - return; - - if (!vc4_hdmi_mode_needs_scrambling(mode, - vc4_hdmi->output_bpc, - vc4_hdmi->output_format)) - return; - - if (!drm_dev_enter(drm, &idx)) - return; - - drm_scdc_set_high_tmds_clock_ratio(connector, true); - drm_scdc_set_scrambling(connector, true); =20 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) | VC5_HDMI_SCRAMBLER_CTL_ENABLE); spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); =20 - drm_dev_exit(idx); - - vc4_hdmi->scdc_enabled =3D true; - - queue_delayed_work(system_percpu_wq, &vc4_hdmi->scrambling_work, - msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS)); + return 0; } =20 -static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder) +static int vc4_hdmi_scrambler_disable(struct drm_connector *connector) { - struct vc4_hdmi *vc4_hdmi =3D encoder_to_vc4_hdmi(encoder); - struct drm_connector *connector =3D &vc4_hdmi->connector; - struct drm_device *drm =3D connector->dev; + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); unsigned long flags; - int idx; - - lockdep_assert_held(&vc4_hdmi->mutex); - - if (!vc4_hdmi->scdc_enabled) - return; - - vc4_hdmi->scdc_enabled =3D false; - - if (delayed_work_pending(&vc4_hdmi->scrambling_work)) - cancel_delayed_work_sync(&vc4_hdmi->scrambling_work); - - if (!drm_dev_enter(drm, &idx)) - return; =20 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); HDMI_WRITE(HDMI_SCRAMBLER_CTL, HDMI_READ(HDMI_SCRAMBLER_CTL) & ~VC5_HDMI_SCRAMBLER_CTL_ENABLE); spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); =20 - drm_scdc_set_scrambling(connector, false); - drm_scdc_set_high_tmds_clock_ratio(connector, false); - - drm_dev_exit(idx); -} - -static void vc4_hdmi_scrambling_wq(struct work_struct *work) -{ - struct vc4_hdmi *vc4_hdmi =3D container_of(to_delayed_work(work), - struct vc4_hdmi, - scrambling_work); - struct drm_connector *connector =3D &vc4_hdmi->connector; - - if (drm_scdc_get_scrambling_status(connector)) - return; - - drm_scdc_set_high_tmds_clock_ratio(connector, true); - drm_scdc_set_scrambling(connector, true); - - queue_delayed_work(system_percpu_wq, &vc4_hdmi->scrambling_work, - msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS)); + return 0; } =20 static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder, @@ -917,7 +726,7 @@ static void vc4_hdmi_encoder_post_crtc_disable(struct d= rm_encoder *encoder, spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); } =20 - vc4_hdmi_disable_scrambling(encoder); + drm_scdc_stop_scrambling(&vc4_hdmi->connector); =20 drm_dev_exit(idx); =20 @@ -1625,6 +1434,7 @@ static void vc4_hdmi_encoder_post_crtc_enable(struct = drm_encoder *encoder, struct drm_display_info *display =3D &vc4_hdmi->connector.display_info; bool hsync_pos =3D mode->flags & DRM_MODE_FLAG_PHSYNC; bool vsync_pos =3D mode->flags & DRM_MODE_FLAG_PVSYNC; + struct drm_connector_state *conn_state; unsigned long flags; int ret; int idx; @@ -1693,7 +1503,10 @@ static void vc4_hdmi_encoder_post_crtc_enable(struct= drm_encoder *encoder, } =20 vc4_hdmi_recenter_fifo(vc4_hdmi); - vc4_hdmi_enable_scrambling(encoder); + + conn_state =3D drm_atomic_get_new_connector_state(state, connector); + if (conn_state && conn_state->hdmi.scrambler_needed) + drm_scdc_start_scrambling(connector); =20 drm_dev_exit(idx); =20 @@ -1739,7 +1552,9 @@ vc4_hdmi_connector_clock_valid(const struct drm_conne= ctor *connector, } =20 static const struct drm_connector_hdmi_funcs vc4_hdmi_hdmi_connector_funcs= =3D { - .tmds_char_rate_valid =3D vc4_hdmi_connector_clock_valid, + .tmds_char_rate_valid =3D vc4_hdmi_connector_clock_valid, + .scrambler_enable =3D vc4_hdmi_scrambler_enable, + .scrambler_disable =3D vc4_hdmi_scrambler_disable, .avi =3D { .clear_infoframe =3D vc4_hdmi_clear_avi_infoframe, .write_infoframe =3D vc4_hdmi_write_avi_infoframe, @@ -3233,7 +3048,6 @@ static int vc4_hdmi_bind(struct device *dev, struct d= evice *master, void *data) return ret; =20 spin_lock_init(&vc4_hdmi->hw_lock); - INIT_DELAYED_WORK(&vc4_hdmi->scrambling_work, vc4_hdmi_scrambling_wq); =20 dev_set_drvdata(dev, vc4_hdmi); encoder =3D &vc4_hdmi->encoder.base; @@ -3246,15 +3060,6 @@ static int vc4_hdmi_bind(struct device *dev, struct = device *master, void *data) vc4_hdmi->pdev =3D pdev; vc4_hdmi->variant =3D variant; =20 - /* - * Since we don't know the state of the controller and its - * display (if any), let's assume it's always enabled. - * vc4_hdmi_disable_scrambling() will thus run at boot, make - * sure it's disabled, and avoid any inconsistency. - */ - if (variant->max_pixel_clock > HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ) - vc4_hdmi->scdc_enabled =3D true; - ret =3D variant->init_resources(drm, vc4_hdmi); if (ret) return ret; diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h index 29d461d4ee49..58c92ebc2677 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -118,8 +118,6 @@ struct vc4_hdmi { struct vc4_encoder encoder; struct drm_connector connector; =20 - struct delayed_work scrambling_work; - struct i2c_adapter *ddc; void __iomem *hdmicore_regs; void __iomem *hd_regs; @@ -193,12 +191,6 @@ struct vc4_hdmi { */ bool packet_ram_enabled; =20 - /** - * @scdc_enabled: Is the HDMI controller currently running with - * the scrambler on? Protected by @mutex. - */ - bool scdc_enabled; - /** * @output_bpc: Copy of @drm_connector_state.hdmi.output_bpc for * use outside of KMS hooks. Protected by @mutex. --=20 2.54.0 From nobody Mon Jun 8 05:27:35 2026 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 662533F0A81 for ; Mon, 1 Jun 2026 22:45:31 +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=1780353934; cv=none; b=J1iUM0baKDDiF7zmJGI27YW3cektvmxFKAdxHM7BB9QUD2HLvntZd5ZSWiLuu6oLkRFGOyRu68tot311PlrSVsU2/29+hoxu4/Fikyb636ItL0jkqrPa+0FsH91Tm/Uhu0Kk/qOOIH7SsBc/gTmQbPs16H8DhbJu+Q8fezWYLbg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353934; c=relaxed/simple; bh=I4m70wH8SD5JWU/tgjfhdZ9kfm9RujBffmi2lpXN2Yc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=osgDuopf+YNZsm2g6maqen6HVcZTNU4gL+fkSBP6TbsNLm6fw7YHhzKouKcjA7de4ILafOCjuaOILjxS0+FtM+mxWk2I/duUggGLKyZPOlj5obbAhD+YpQ7ha8lS0ZC9H9Wr7b03FUUbOFqcYntM2d6yZVIdvu4SukRCs34fAJo= 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=LOUtazSS; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="LOUtazSS" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353930; bh=I4m70wH8SD5JWU/tgjfhdZ9kfm9RujBffmi2lpXN2Yc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=LOUtazSSeLeBNHZTAyv7J12RwzOwrSBgZtOM9rQkxc7E8UjomwQWyf2jmPOFcwKfd x1YBv0iGKIm21xa4qIgaFLB6YX540oNWZU2ygg4HXbIn1SFSNOtD5WpGVUPHvBWiyW qC5BYAZNlebt2N2LTfPauzluKLLGx1q/w11ugjrJozbpVaR3k+ztXnne1MScxeiXeQ lt4XoWX45oC3iwNK9n5Li16eRce/Wa34/wWppCWigutS1y1GgYtccsZfHsw9/tdL6p QagnkO+F2N5pGWCupQgGackRm1sl7FjAS2O7lX0hyOMyLWe0GBmotGjLrQ81B6SqvE wTDaovmZ3EVHA== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id E9A7F17E0E6C; Tue, 2 Jun 2026 00:45:29 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:26 +0300 Subject: [PATCH v7 26/30] drm/tests: connector: Add HDMI source-side scrambler capability tests Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-26-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Add KUnit tests covering the consistency validation between HDMI connector's scrambler_supported flag and the .scrambler_{enable,disable} HDMI connector callbacks that drmm_connector_hdmi_init() performs. The four added cases cover the validation matrix: - scrambler_supported =3D true with both callbacks set: success - scrambler_supported =3D true with no callbacks: failure - scrambler_supported =3D true with only one callback: failure - scrambler_supported =3D false with both callbacks: success (callbacks ignored) Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/tests/drm_connector_test.c | 132 +++++++++++++++++++++++++= ++++ 1 file changed, 132 insertions(+) diff --git a/drivers/gpu/drm/tests/drm_connector_test.c b/drivers/gpu/drm/t= ests/drm_connector_test.c index beb1d50a6646..b79b75be18c4 100644 --- a/drivers/gpu/drm/tests/drm_connector_test.c +++ b/drivers/gpu/drm/tests/drm_connector_test.c @@ -47,6 +47,41 @@ static const struct drm_connector_hdmi_funcs dummy_hdmi_= funcs =3D { }, }; =20 +static int accept_scrambler_enable(struct drm_connector *connector) +{ + return 0; +} + +static int accept_scrambler_disable(struct drm_connector *connector) +{ + return 0; +} + +static const struct drm_connector_hdmi_funcs dummy_hdmi_funcs_scrambler = =3D { + .scrambler_enable =3D accept_scrambler_enable, + .scrambler_disable =3D accept_scrambler_disable, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, +}; + +static const struct drm_connector_hdmi_funcs dummy_hdmi_funcs_scrambler_pa= rtial =3D { + .scrambler_enable =3D accept_scrambler_enable, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, +}; + static const struct drm_connector_funcs dummy_funcs =3D { .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, @@ -1254,6 +1289,99 @@ KUNIT_ARRAY_PARAM(drm_connector_hdmi_init_type_inval= id, drm_connector_hdmi_init_type_invalid_tests, drm_connector_hdmi_init_type_desc); =20 +/* + * Test that the registration of an HDMI connector advertising source-side + * scrambling support succeeds when the .scrambler_{enable|disable} callba= cks + * are provided. + */ +static void drm_test_connector_hdmi_init_scrambler_valid(struct kunit *tes= t) +{ + struct drm_connector_init_priv *priv =3D test->priv; + int ret; + + priv->connector.hdmi.scrambler_supported =3D true; + + ret =3D drmm_connector_hdmi_init(&priv->drm, &priv->connector, + "Vendor", "Product", + &dummy_funcs, + &dummy_hdmi_funcs_scrambler, + DRM_MODE_CONNECTOR_HDMIA, + &priv->ddc, + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444), + 8); + KUNIT_EXPECT_EQ(test, ret, 0); +} + +/* + * Test that the registration of an HDMI connector advertising source-side + * scrambling support fails when the .scrambler_{enable|disable} callbacks + * are not provided. + */ +static void drm_test_connector_hdmi_init_scrambler_no_callbacks(struct kun= it *test) +{ + struct drm_connector_init_priv *priv =3D test->priv; + int ret; + + priv->connector.hdmi.scrambler_supported =3D true; + + ret =3D drmm_connector_hdmi_init(&priv->drm, &priv->connector, + "Vendor", "Product", + &dummy_funcs, + &dummy_hdmi_funcs, + DRM_MODE_CONNECTOR_HDMIA, + &priv->ddc, + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444), + 8); + KUNIT_EXPECT_LT(test, ret, 0); +} + +/* + * Test that the registration of an HDMI connector advertising source-side + * scrambling support fails when only one of the .scrambler_{enable|disabl= e} + * callbacks are provided. + */ +static void drm_test_connector_hdmi_init_scrambler_partial_callbacks(struc= t kunit *test) +{ + struct drm_connector_init_priv *priv =3D test->priv; + int ret; + + priv->connector.hdmi.scrambler_supported =3D true; + + ret =3D drmm_connector_hdmi_init(&priv->drm, &priv->connector, + "Vendor", "Product", + &dummy_funcs, + &dummy_hdmi_funcs_scrambler_partial, + DRM_MODE_CONNECTOR_HDMIA, + &priv->ddc, + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444), + 8); + KUNIT_EXPECT_LT(test, ret, 0); +} + +/* + * Test that the registration of an HDMI connector not advertising source-= side + * scrambling support succeeds, even when the .scrambler_{enable|disable} + * callbacks are provided, i.e. they are ignored. + */ +static void drm_test_connector_hdmi_init_scrambler_ignored_callbacks(struc= t kunit *test) +{ + struct drm_connector_init_priv *priv =3D test->priv; + int ret; + + priv->connector.hdmi.scrambler_supported =3D false; + + ret =3D drmm_connector_hdmi_init(&priv->drm, &priv->connector, + "Vendor", "Product", + &dummy_funcs, + &dummy_hdmi_funcs_scrambler, + DRM_MODE_CONNECTOR_HDMIA, + &priv->ddc, + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444), + 8); + KUNIT_EXPECT_EQ(test, ret, 0); + KUNIT_EXPECT_EQ(test, priv->connector.hdmi.scrambler_supported, false); +} + static struct kunit_case drmm_connector_hdmi_init_tests[] =3D { KUNIT_CASE(drm_test_connector_hdmi_init_valid), KUNIT_CASE(drm_test_connector_hdmi_init_bpc_8), @@ -1278,6 +1406,10 @@ static struct kunit_case drmm_connector_hdmi_init_te= sts[] =3D { drm_connector_hdmi_init_type_valid_gen_params), KUNIT_CASE_PARAM(drm_test_connector_hdmi_init_type_invalid, drm_connector_hdmi_init_type_invalid_gen_params), + KUNIT_CASE(drm_test_connector_hdmi_init_scrambler_valid), + KUNIT_CASE(drm_test_connector_hdmi_init_scrambler_no_callbacks), + KUNIT_CASE(drm_test_connector_hdmi_init_scrambler_partial_callbacks), + KUNIT_CASE(drm_test_connector_hdmi_init_scrambler_ignored_callbacks), { } }; =20 --=20 2.54.0 From nobody Mon Jun 8 05:27:35 2026 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 46AF93DFC80 for ; Mon, 1 Jun 2026 22:45:32 +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=1780353935; cv=none; b=RkCCKo6wCZw8zCrdEZ6sws9gNGEYqx63TuYfRBVFDXRmPnMwoSYjR/+fcl9D/VtH6XmB7/iNUD5q00r2oN3MRXsgKP56tnxct9VnssbmtcdvreNU8S8z9GjmrHN9tZubPm4n4ET6iEiDm2cj2vKohDFrgQeZt/upgrp9DZW7zuI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353935; c=relaxed/simple; bh=MevDvGZ18yJpfUWkQpvx/6/Xn9V/IwMY7jgZGAE3dXM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aEePGo2SYqlp34+Yod81dmy1MivcRzzm6KiMqUbuRZoSTV64rXK/p87XNTbl360LYWHrWtakaEjS3biyO6Mv0sqcZLQYlFrcX9XBSZd0Mg4wpqLvNBbNFN/BMCXJv4Dv7bMzX3/6cWIeRsbGHQZjccFe1OqmOQcFQF/itdA7zJY= 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=K7a74rkE; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="K7a74rkE" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353930; bh=MevDvGZ18yJpfUWkQpvx/6/Xn9V/IwMY7jgZGAE3dXM=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=K7a74rkENfEq7Z18cF7M/X9/J1fB3Gll3mxbF8if8XIA3ImbRelaOpg5uqC7rp+/x sdfVo7WsN7Xzh19kgiBnoS2PHyV5n16dRJva53i+ErButBysIxVrV0vH2gAp+Q0oO2 QqI0qgdo2oH+QNI7Z3ZrkK/5zH8X862rq3YN9+V540HerPgB0YSyMU8GxvKRtr8zCr un5K2LSqa94Blv/Ixd8IghWl3xklPxyLvcr7ChaVZVoECM83FkXt7eAtBhJJv28g0w gn63huxszceZUZ8cI6NhWi6kJPLO8Z4VhhwxnHw5GzNE6kCBsADvTAOZ2LOJeL6PFa rYEsXPIoM+QaQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id A2A0D17E01B6; Tue, 2 Jun 2026 00:45:30 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:27 +0300 Subject: [PATCH v7 27/30] drm/tests: edid: Add 4K@60Hz EDID with 600MHz TMDS Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-27-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Add a new test EDID advertising the following capabilities: Max resolution: 3840x2160@60Hz with RGB, YUV444, YUV422, YUV420 Max BPC: 16 Max TMDS clock: 600 MHz This is needed to exercise the new HDMI infrastructure that decides whether scrambling needs to be enabled for a given display mode and to validate that high-rate modes are properly rejected/accepted depending on the source/sink scrambling capability. The EDID is derived from test_edid_hdmi_4k_rgb_yuv420_dc_max_340mhz with the following changes: - Upgraded the first DTD from 3840x2160@30 (297 MHz) to 3840x2160@60 (594 MHz). The H/V totals (4400x2250) and porches already match the HDMI 2.0 4K@60Hz standard timing, so only the pixel clock had to be bumped. - Widened Display Range Limits descriptor to cover the new timing, i.e. 24-140 kHz H, max dotclock 600 MHz. - Updated CTA-861 Video Data Block to advertise VIC 97 (4K@60Hz) instead of VIC 95 (4k30). - Bumped HF-VSDB Max TMDS Character Rate to 600 MHz, keeping SCDC_Present set so that the sink advertises scrambling support. - Cleared HDMI VSDB Max TMDS clock byte, as required by HDMI 2.0 when the HF-VSDB declares a Max TMDS Character Rate above 340 MHz. - Provided a Video Capability Data Block advertising selectable RGB and YCC quantization range plus underscan for IT/CE formats; also set the 'IT Video Formats Underscanned' bit in the CTA-861 extension header to match. - Aligned base block image size with the DTD (160x90 cm) and replaced the bogus 'Week of Manufacture =3D 0xff' with the Model Year code, both fixing inherited EDID conformity warnings. - Dropped the empty YCbCr 4:2:0 Video Data Block inherited from the parent EDID, which is flagged as a failure by edid-decode v1.33.0 Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/tests/drm_kunit_edid.h | 128 +++++++++++++++++++++++++++++= ++++ 1 file changed, 128 insertions(+) diff --git a/drivers/gpu/drm/tests/drm_kunit_edid.h b/drivers/gpu/drm/tests= /drm_kunit_edid.h index f4923157f5bf..9b318f7d364e 100644 --- a/drivers/gpu/drm/tests/drm_kunit_edid.h +++ b/drivers/gpu/drm/tests/drm_kunit_edid.h @@ -980,4 +980,132 @@ static const unsigned char test_edid_hdmi_4k_rgb_yuv4= 20_dc_max_340mhz[] =3D { 0x00, 0x00, 0x00, 0x84 }; =20 +/* + * Max resolution: 3840x2160@60Hz with RGB, YUV444, YUV422, YUV420 + * Max BPC: 16 for all modes + * Max TMDS clock: 600 MHz + * + * edid-decode (hex): + * + * 00 ff ff ff ff ff ff 00 31 d8 34 00 00 00 00 00 + * 00 23 01 03 80 a0 5a 78 0f ee 91 a3 54 4c 99 26 + * 0f 50 54 20 00 00 01 01 01 01 01 01 01 01 01 01 + * 01 01 01 01 01 01 08 e8 00 30 f2 70 5a 80 b0 58 + * 8a 00 40 84 63 00 00 1e 00 00 00 fc 00 54 65 73 + * 74 20 45 44 49 44 0a 20 20 20 00 00 00 fd 00 18 + * 55 18 8c 3c 00 0a 20 20 20 20 20 20 00 00 00 10 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 a9 + * + * 02 03 28 b1 41 61 6c 03 0c 00 10 00 78 00 20 00 + * 00 01 03 6d d8 5d c4 01 78 80 07 00 00 00 00 00 + * 00 e2 00 ca e3 0f 01 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 + * + * ---------------- + * + * Block 0, Base EDID: + * EDID Structure Version & Revision: 1.3 + * Vendor & Product Identification: + * Manufacturer: LNX + * Model: 52 + * Made in: 2025 + * Basic Display Parameters & Features: + * Digital display + * Maximum image size: 160 cm x 90 cm + * Gamma: 2.20 + * RGB color display + * Default (sRGB) color space is primary color space + * First detailed timing is the preferred timing + * Supports GTF timings within operating range + * Color Characteristics: + * Red : 0.6396, 0.3300 + * Green: 0.2998, 0.5996 + * Blue : 0.1503, 0.0595 + * White: 0.3125, 0.3291 + * Established Timings I & II: + * DMT 0x04: 640x480 59.940476 Hz 4:3 31.469 kHz 25.175= 000 MHz + * Standard Timings: none + * Detailed Timing Descriptors: + * DTD 1: 3840x2160 60.000000 Hz 16:9 135.000 kHz 594.000000= MHz (1600 mm x 900 mm) + * Hfront 176 Hsync 88 Hback 296 Hpol P + * Vfront 8 Vsync 10 Vback 72 Vpol P + * Display Product Name: 'Test EDID' + * Display Range Limits: + * Monitor ranges (GTF): 24-85 Hz V, 24-140 kHz H, max dotclock 600 = MHz + * Dummy Descriptor: + * Extension blocks: 1 + * Checksum: 0xa9 + * + * ---------------- + * + * Block 1, CTA-861 Extension Block: + * Revision: 3 + * Underscans IT Video Formats by default + * Supports YCbCr 4:4:4 + * Supports YCbCr 4:2:2 + * Native detailed modes: 1 + * Video Data Block: + * VIC 97: 3840x2160 60.000000 Hz 16:9 135.000 kHz 594.0000= 00 MHz + * Vendor-Specific Data Block (HDMI), OUI 00-0C-03: + * Source physical address: 1.0.0.0 + * DC_48bit + * DC_36bit + * DC_30bit + * DC_Y444 + * Maximum TMDS clock: 0 MHz + * Extended HDMI video details: + * Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: + * Version: 1 + * Maximum TMDS Character Rate: 600 MHz + * SCDC Present + * Supports 16-bits/component Deep Color 4:2:0 Pixel Encoding + * Supports 12-bits/component Deep Color 4:2:0 Pixel Encoding + * Supports 10-bits/component Deep Color 4:2:0 Pixel Encoding + * VRRmin: 0 Hz + * VRRmax: 0 Hz + * Video Capability Data Block: + * YCbCr quantization: Selectable (via AVI YQ) + * RGB quantization: Selectable (via AVI Q) + * PT scan behavior: No Data + * IT scan behavior: Always Underscanned + * CE scan behavior: Always Underscanned + * YCbCr 4:2:0 Capability Map Data Block: + * VIC 97: 3840x2160 60.000000 Hz 16:9 135.000 kHz 594.0000= 00 MHz + * Checksum: 0x54 Unused space in Extension Block: 87 bytes + * + * ---------------- + * + * edid-decode 1.33.0 + * + * EDID conformity: PASS + */ +static const unsigned char test_edid_hdmi_4k_rgb_yuv420_dc_max_600mhz[] = =3D { + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x31, 0xd8, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x03, 0x80, 0xa0, 0x5a, 0x78, + 0x0f, 0xee, 0x91, 0xa3, 0x54, 0x4c, 0x99, 0x26, 0x0f, 0x50, 0x54, 0x20, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x08, 0xe8, 0x00, 0x30, 0xf2, 0x70, + 0x5a, 0x80, 0xb0, 0x58, 0x8a, 0x00, 0x40, 0x84, 0x63, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0xfc, 0x00, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x44, + 0x49, 0x44, 0x0a, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x18, + 0x55, 0x18, 0x8c, 0x3c, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa9, 0x02, 0x03, 0x28, 0xb1, + 0x41, 0x61, 0x6c, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x78, 0x00, 0x20, 0x00, + 0x00, 0x01, 0x03, 0x6d, 0xd8, 0x5d, 0xc4, 0x01, 0x78, 0x80, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x00, 0xca, 0xe3, 0x0f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x54, +}; + #endif // DRM_KUNIT_EDID_H_ --=20 2.54.0 From nobody Mon Jun 8 05:27:35 2026 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 D90543E1D08 for ; Mon, 1 Jun 2026 22:45:32 +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=1780353935; cv=none; b=U3pjZ8Lrw7tDrIitoPN0nH7SQdZP4nUrMkq0L3T8GAbqzgkM93Ji66AgMSLc2rmEdBpZcEUp2OSzqm4a+XNhUY2I+Wiswd1ga9iLZwgNlJeQ+QGKuB9AykLXXF1FD52mvWmro2HbpKCg8x+U87n0/gbCgsskwC53cZvXEUhCuNU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353935; c=relaxed/simple; bh=W9tdDgg2EQqozZD3LL3IaBrdwUPqaxVbVRoj+UPs6tA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FPXE47dMXl7ED9ntTR1k1US9q3UsDkNSF7mdd4NVU7xLRR0GSkVyScIBSHeQS9dLWD/JB9fQE+XEvupfZZdwXRPfGff/rTKqoPGrJSCeAYd0SU3XjjUhRBvdLn/D7Q/l9klhBhYAFYozG42Vu0gVI8Vlb9fXJvaBK9/oX6X/4/8= 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=K3uzFQyx; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="K3uzFQyx" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353931; bh=W9tdDgg2EQqozZD3LL3IaBrdwUPqaxVbVRoj+UPs6tA=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=K3uzFQyxAz0uXPAhkwIzduYktV/go2ZdhRzbBF6tcsUTx2mO1+XKzER2dXLmBtFG7 TJjgSnMeKzm9ZHpJOZP1tsRf5NxEtaadpnoxbQ4d6DIt/WFwIpn9ArNtjASoQ74F8q iqtYFnQEOtNKUU2UWfkOVrIbUIdSLvOxrWUdqul1fD8ElA18k2FpT/mLHzcDBuk2Fu 7t8hxCRdnN3O556mqp0UtQP+NNI2nkZh/gDjQu9uOu6AUh1rw6RKT9IQkKscsHdaTo G0YTfal0ygm3o67xjocWIEw7rcqJUNYWSbi+HoD4jGpFxhx2Un+wdNRJuft4Ktm7CE p+IR+yeDi2RMQ== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 5C0B817E0B66; Tue, 2 Jun 2026 00:45:31 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:28 +0300 Subject: [PATCH v7 28/30] drm/tests: hdmi_state_helper: Add HDMI 2.0 scrambling tests Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-28-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 Cover the newly introduced HDMI 2.0 source-scrambler plumbing in the drm_hdmi_state_helper code with the following KUnit tests: - drm_test_check_scrambler_needed_low_rate verifies that a mode with TMDS rate <=3D 340 MHz never sets conn_state->hdmi.scrambler_needed, even when both endpoints advertise scrambling support. - drm_test_check_scrambler_needed_high_rate verifies that a mode with TMDS rate > 340 MHz makes the helper set scrambler_needed. - drm_test_check_scrambler_needed_high_rate_no_adv verifies that a mode with TMDS rate > 340 MHz never sets scrambler_needed when source does not advertise scrambling support, regardless of sink scrambling advertisement. To match the behaviour drm_bridge_connector_init() applies to bridges that implement source-scrambling callbacks, the __connector_hdmi_init() helper now infers connector->hdmi.scrambling_supported from the presence of .scrambler_enable and .scrambler_disable in the supplied drm_connector_hdmi_funcs, mirroring how connector capability should be wired up in real drivers. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 219 +++++++++++++++++= ++++ 1 file changed, 219 insertions(+) diff --git a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c b/drivers/g= pu/drm/tests/drm_hdmi_state_helper_test.c index e89e1af7a811..98cd42f429cb 100644 --- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c @@ -20,6 +20,8 @@ #include #include =20 +#include + #include "../drm_crtc_internal.h" =20 #include @@ -140,6 +142,29 @@ static const struct drm_connector_hdmi_funcs reject_10= 0mhz_connector_hdmi_funcs }, }; =20 +static int accept_scrambler_enable(struct drm_connector *connector) +{ + return 0; +} + +static int accept_scrambler_disable(struct drm_connector *connector) +{ + return 0; +} + +static const struct drm_connector_hdmi_funcs scrambler_connector_hdmi_func= s =3D { + .scrambler_enable =3D accept_scrambler_enable, + .scrambler_disable =3D accept_scrambler_disable, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, +}; + static int dummy_connector_get_modes(struct drm_connector *connector) { struct drm_atomic_helper_connector_hdmi_priv *priv =3D @@ -240,6 +265,8 @@ __connector_hdmi_init(struct kunit *test, =20 conn =3D &priv->connector; conn->ycbcr_420_allowed =3D !!(formats & BIT(DRM_OUTPUT_COLOR_FORMAT_YCBC= R420)); + conn->hdmi.scrambler_supported =3D hdmi_funcs->scrambler_enable && + hdmi_funcs->scrambler_disable; =20 ret =3D drmm_connector_hdmi_init(drm, conn, "Vendor", "Product", @@ -2198,6 +2225,195 @@ static void drm_test_check_disable_connector(struct= kunit *test) drm_modeset_acquire_fini(&ctx); } =20 +/* + * Test that a sub-340 MHz TMDS character rate does not set + * conn_state->hdmi.scrambler_needed, even when the source + * and the sink both support scrambling. + */ +static void drm_test_check_scrambler_needed_low_rate(struct kunit *test) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv; + struct drm_modeset_acquire_ctx ctx; + struct drm_connector_state *conn_state; + struct drm_display_info *info; + struct drm_display_mode *low_rate_mode; + struct drm_connector *conn; + struct drm_device *drm; + struct drm_crtc *crtc; + unsigned long long rate; + int ret; + + priv =3D drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test, + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444), + 8, + &scrambler_connector_hdmi_funcs, + test_edid_hdmi_4k_rgb_yuv420_dc_max_600mhz); + KUNIT_ASSERT_NOT_NULL(test, priv); + + drm =3D &priv->drm; + crtc =3D priv->crtc; + conn =3D &priv->connector; + info =3D &conn->display_info; + KUNIT_ASSERT_TRUE(test, conn->hdmi.scrambler_supported); + KUNIT_ASSERT_TRUE(test, info->is_hdmi); + KUNIT_ASSERT_TRUE(test, info->hdmi.scdc.supported); + KUNIT_ASSERT_TRUE(test, info->hdmi.scdc.scrambling.supported); + + low_rate_mode =3D drm_kunit_display_mode_from_cea_vic(test, drm, 16); + KUNIT_ASSERT_NOT_NULL(test, low_rate_mode); + + rate =3D drm_hdmi_compute_mode_clock(low_rate_mode, 8, DRM_OUTPUT_COLOR_F= ORMAT_RGB444); + KUNIT_ASSERT_LT(test, rate, HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ); + + drm_modeset_acquire_init(&ctx, 0); + +retry_conn_enable: + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, crtc, conn, + low_rate_mode, &ctx); + if (ret =3D=3D -EDEADLK) { + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_enable; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + conn_state =3D conn->state; + KUNIT_ASSERT_NOT_NULL(test, conn_state); + + KUNIT_EXPECT_LE(test, conn_state->hdmi.tmds_char_rate, + HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ); + KUNIT_EXPECT_FALSE(test, conn_state->hdmi.scrambler_needed); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); +} + +/* + * Test that an over-340 MHz TMDS character rate sets + * conn_state->hdmi.scrambler_needed when both source + * and sink advertise scrambling support. + */ +static void drm_test_check_scrambler_needed_high_rate(struct kunit *test) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv; + struct drm_modeset_acquire_ctx ctx; + struct drm_connector_state *conn_state; + struct drm_display_info *info; + struct drm_display_mode *preferred; + struct drm_connector *conn; + struct drm_device *drm; + struct drm_crtc *crtc; + unsigned long long rate; + int ret; + + priv =3D drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test, + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444), + 8, + &scrambler_connector_hdmi_funcs, + test_edid_hdmi_4k_rgb_yuv420_dc_max_600mhz); + KUNIT_ASSERT_NOT_NULL(test, priv); + + drm =3D &priv->drm; + crtc =3D priv->crtc; + conn =3D &priv->connector; + info =3D &conn->display_info; + KUNIT_ASSERT_TRUE(test, conn->hdmi.scrambler_supported); + KUNIT_ASSERT_TRUE(test, info->is_hdmi); + KUNIT_ASSERT_TRUE(test, info->hdmi.scdc.supported); + KUNIT_ASSERT_TRUE(test, info->hdmi.scdc.scrambling.supported); + + preferred =3D find_preferred_mode(conn); + KUNIT_ASSERT_NOT_NULL(test, preferred); + + rate =3D drm_hdmi_compute_mode_clock(preferred, 8, DRM_OUTPUT_COLOR_FORMA= T_RGB444); + KUNIT_ASSERT_GT(test, rate, HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ); + + drm_modeset_acquire_init(&ctx, 0); + +retry_conn_enable: + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, crtc, conn, + preferred, &ctx); + if (ret =3D=3D -EDEADLK) { + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_enable; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + conn_state =3D conn->state; + KUNIT_ASSERT_NOT_NULL(test, conn_state); + + KUNIT_EXPECT_GT(test, conn_state->hdmi.tmds_char_rate, + HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ); + KUNIT_EXPECT_TRUE(test, conn_state->hdmi.scrambler_needed); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); +} + +/* + * Test that an over-340 MHz TMDS character rate does not set + * conn_state->hdmi.scrambler_needed when the source does not + * advertise scrambling support, even if the sink does. + */ +static void drm_test_check_scrambler_needed_high_rate_no_adv(struct kunit = *test) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv; + struct drm_modeset_acquire_ctx ctx; + struct drm_connector_state *conn_state; + struct drm_display_info *info; + struct drm_display_mode *preferred; + struct drm_connector *conn; + struct drm_device *drm; + struct drm_crtc *crtc; + unsigned long long rate; + int ret; + + priv =3D drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test, + BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444), + 8, + &dummy_connector_hdmi_funcs, + test_edid_hdmi_4k_rgb_yuv420_dc_max_600mhz); + KUNIT_ASSERT_NOT_NULL(test, priv); + + drm =3D &priv->drm; + crtc =3D priv->crtc; + conn =3D &priv->connector; + info =3D &conn->display_info; + KUNIT_ASSERT_FALSE(test, conn->hdmi.scrambler_supported); + KUNIT_ASSERT_TRUE(test, info->is_hdmi); + KUNIT_ASSERT_TRUE(test, info->hdmi.scdc.supported); + KUNIT_ASSERT_TRUE(test, info->hdmi.scdc.scrambling.supported); + + preferred =3D find_preferred_mode(conn); + KUNIT_ASSERT_NOT_NULL(test, preferred); + + rate =3D drm_hdmi_compute_mode_clock(preferred, 8, DRM_OUTPUT_COLOR_FORMA= T_RGB444); + KUNIT_ASSERT_GT(test, rate, HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ); + + drm_modeset_acquire_init(&ctx, 0); + +retry_conn_enable: + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, crtc, conn, + preferred, &ctx); + if (ret =3D=3D -EDEADLK) { + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_enable; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + conn_state =3D conn->state; + KUNIT_ASSERT_NOT_NULL(test, conn_state); + + KUNIT_EXPECT_GT(test, conn_state->hdmi.tmds_char_rate, + HDMI_1_3_TMDS_CHAR_RATE_MAX_HZ); + KUNIT_EXPECT_FALSE(test, conn_state->hdmi.scrambler_needed); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); +} + static struct kunit_case drm_atomic_helper_connector_hdmi_check_tests[] = =3D { KUNIT_CASE(drm_test_check_broadcast_rgb_auto_cea_mode), KUNIT_CASE(drm_test_check_broadcast_rgb_auto_cea_mode_vic_1), @@ -2227,6 +2443,9 @@ static struct kunit_case drm_atomic_helper_connector_= hdmi_check_tests[] =3D { KUNIT_CASE(drm_test_check_tmds_char_rate_rgb_8bpc), KUNIT_CASE(drm_test_check_tmds_char_rate_rgb_10bpc), KUNIT_CASE(drm_test_check_tmds_char_rate_rgb_12bpc), + KUNIT_CASE(drm_test_check_scrambler_needed_low_rate), + KUNIT_CASE(drm_test_check_scrambler_needed_high_rate), + KUNIT_CASE(drm_test_check_scrambler_needed_high_rate_no_adv), /* * TODO: We should have tests to check that a change in the * format triggers a CRTC mode change just like we do for the --=20 2.54.0 From nobody Mon Jun 8 05:27:35 2026 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 9B65E3F65E8 for ; Mon, 1 Jun 2026 22:45:33 +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=1780353936; cv=none; b=F9lahABuq0SyDuWrcEcdW/wQ4GDwhHj/I3nag0FsWwwxjMv+525BKB1d+rTC8IXveQwGnY9SvVrKxXUVZhmaCF67RQHjDrteMc+QCWb1VNQLdFsgijg1ru2XYM0PVU7wvMQm3BrxYn7RBdBpBnWojiiWGtz2mr4EU/monPfR5NM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353936; c=relaxed/simple; bh=PPWygKHxfd4EJbA3pkJAWqPU2JXfwPO9D/9ypsXFy/s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jGxvDQ9Y3jPRPbWQkZzl90DSgpltxXrHoyJl/BEmTedQbBKmFrl0qRSlnODKeG1qyDX5c34mQDzHmNnyHSkAs5eBWdsb1eq5+rol94sVB9or7GSTPgjUbTR1A5BKk/HCYC6gYvRMV4yEgCa0/gZSlpYmqSKL6NUW80jP7OoYZKU= 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=cC1oNJ5C; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="cC1oNJ5C" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353932; bh=PPWygKHxfd4EJbA3pkJAWqPU2JXfwPO9D/9ypsXFy/s=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=cC1oNJ5CoPf+mHv6BlQa0SUyo+gBYJ5KFNTZpPyJ5TlLjbd2ZgsooVHY/4Ul6fHVG /2NQ3tqMAVrwYyovSg3gfN5RMZ3ll76Q+gBIupAK8t+rf7TMPiHo8kLhNuRrROT0Ut ZUtr+MaO8oam8ErMNMwTWw8BevpNPw6XPd2Z3gbasj5dYjzCBHR8iWQOuvt06RDGN7 oq1K+zxtb9fSs8O+MIRD6KZaWnoHplUudTXyFIjbt0THygwaYLuSVrGcDSxFtUAa/d DL1hH1cfG1K/2CDRgIVkySGxvll6gPh5WXNy3a80JWh6DupsaGjduiz17A/FOOCNuK 9+lEhyKZfVRag== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 18B5017E0D07; Tue, 2 Jun 2026 00:45:32 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:29 +0300 Subject: [PATCH v7 29/30] drm/tests: edid: Fix conformity for 1080p+4K YUV420 200MHz EDID Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-29-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 The test EDID added by commit 58fe1d78605e ("drm/tests: hdmi: Provide EDID supporting 4K@30Hz with YUV420 only") fails 'edid-decode --check' (v1.33.0) with the following issues: Warnings: Block 1, CTA-861 Extension Block: IT Video Formats are overscanned by default, but normally this should b= e underscanned. YCbCr 4:2:0 Video Data Block: Some YCbCr 4:2:0 timings are invalid for = HDMI 2.1 (which requires an RGB timings pixel rate >=3D 590 MHz). EDID: Base EDID: Some timings are out of range of the Monitor Ranges: Maximum Clock: 297.000 MHz (Monitor: 170.000 MHz) CTA-861: Multiple native progressive timings are defined. Failures: Block 0, Base EDID: Vendor & Product Identification: EDID 1.3 does not support week 0xff. Block 1, CTA-861 Extension Block: Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: Max TMDS rate is= > 0 and <=3D 340 or > 600. YCbCr 4:2:0 Capability Map Data Block: Empty Capability Map. YCbCr 4:2:0 Video Data Block: YCbCr 4:2:0-only VIC 95 is also a regular= VIC. Missing VCDB, needed for Set Selectable RGB Quantization to avoid inter= op issues. EDID: CTA-861: The maximum HDMI TMDS clock is 200000 kHz, but one or more vid= eo timings go up to 297000 kHz. Address them while preserving the advertised maximum resolutions, BPC and TMDS clock used by the existing KUnit tests: - Week 0xff is not valid for EDID 1.3; set it to 0x00 so that the Model year field becomes a regular Year of Manufacture. - The HDMI Forum VSDB Max TMDS Character Rate must be 0 when no rate above 340 MHz is supported. The HDMI VSDB still advertises 200 MHz as Max TMDS Clock. - VIC 95 (3840x2160@30Hz) was reported as YUV420-only but was listed in both the regular Video Data Block and the YCbCr 4:2:0 Video Data Block. Drop it from the regular VDB (so it stays advertised in the 4:2:0 VDB only) and remove the now unnecessary empty YCbCr 4:2:0 Capability Map Data Block. - Add a Video Capability Data Block advertising selectable RGB and YCC quantization range plus underscan for IT/CE formats; also set the 'IT Video Formats Underscanned' bit in the CTA-861 extension header to match. - Bump the Display Range Limits max pixel clock from 170 MHz to 300 MHz so it covers the 297 MHz pixel rate of VIC 95. - Drop the 'native' flag from VIC 16 in the Video Data Block so it is no longer flagged as a second native progressive timing alongside the preferred DTD. The only remaining warning is HDMI 2.1 related and can be ignored, as it requires that any mode listed in the YCbCr 4:2:0 Video Data Block must have a corresponding RGB pixel clock >=3D 590 MHz. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/tests/drm_kunit_edid.h | 65 +++++++++++++++++++++---------= ---- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/tests/drm_kunit_edid.h b/drivers/gpu/drm/tests= /drm_kunit_edid.h index 9b318f7d364e..618b42d2fd8e 100644 --- a/drivers/gpu/drm/tests/drm_kunit_edid.h +++ b/drivers/gpu/drm/tests/drm_kunit_edid.h @@ -758,22 +758,22 @@ static const unsigned char test_edid_hdmi_1080p_rgb_y= uv_dc_max_340mhz[] =3D { * edid-decode (hex): * * 00 ff ff ff ff ff ff 00 31 d8 34 00 00 00 00 00 - * ff 23 01 03 80 60 36 78 0f ee 91 a3 54 4c 99 26 + * 00 23 01 03 80 60 36 78 0f ee 91 a3 54 4c 99 26 * 0f 50 54 20 00 00 01 01 01 01 01 01 01 01 01 01 * 01 01 01 01 01 01 02 3a 80 18 71 38 2d 40 58 2c * 45 00 c0 1c 32 00 00 1e 00 00 00 fc 00 54 65 73 * 74 20 45 44 49 44 0a 20 20 20 00 00 00 fd 00 18 - * 55 18 5e 11 00 0a 20 20 20 20 20 20 00 00 00 10 - * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 bb + * 55 18 5e 1e 00 0a 20 20 20 20 20 20 00 00 00 10 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ad * - * 02 03 29 31 42 90 5f 6c 03 0c 00 10 00 78 28 20 - * 00 00 01 03 6d d8 5d c4 01 28 80 07 00 00 00 00 - * 00 00 e3 0f 00 00 e2 0e 5f 00 00 00 00 00 00 00 + * 02 03 27 b1 41 10 6c 03 0c 00 10 00 78 28 20 00 + * 00 01 03 6d d8 5d c4 01 00 80 07 00 00 00 00 00 + * 00 e2 00 ca e2 0e 5f 00 00 00 00 00 00 00 00 00 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ca + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 9a * * ---------------- * @@ -782,7 +782,7 @@ static const unsigned char test_edid_hdmi_1080p_rgb_yuv= _dc_max_340mhz[] =3D { * Vendor & Product Identification: * Manufacturer: LNX * Model: 52 - * Model year: 2025 + * Made in: 2025 * Basic Display Parameters & Features: * Digital display * Maximum image size: 96 cm x 54 cm @@ -805,21 +805,21 @@ static const unsigned char test_edid_hdmi_1080p_rgb_y= uv_dc_max_340mhz[] =3D { * Vfront 4 Vsync 5 Vback 36 Vpol P * Display Product Name: 'Test EDID' * Display Range Limits: - * Monitor ranges (GTF): 24-85 Hz V, 24-94 kHz H, max dotclock 170 M= Hz + * Monitor ranges (GTF): 24-85 Hz V, 24-94 kHz H, max dotclock 300 M= Hz * Dummy Descriptor: * Extension blocks: 1 - * Checksum: 0xbb + * Checksum: 0xad * * ---------------- * * Block 1, CTA-861 Extension Block: * Revision: 3 + * Underscans IT Video Formats by default * Supports YCbCr 4:4:4 * Supports YCbCr 4:2:2 * Native detailed modes: 1 * Video Data Block: - * VIC 16: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.5000= 00 MHz (native) - * VIC 95: 3840x2160 30.000000 Hz 16:9 67.500 kHz 297.0000= 00 MHz + * VIC 16: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.5000= 00 MHz * Vendor-Specific Data Block (HDMI), OUI 00-0C-03: * Source physical address: 1.0.0.0 * DC_48bit @@ -830,40 +830,57 @@ static const unsigned char test_edid_hdmi_1080p_rgb_y= uv_dc_max_340mhz[] =3D { * Extended HDMI video details: * Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: * Version: 1 - * Maximum TMDS Character Rate: 200 MHz * SCDC Present * Supports 16-bits/component Deep Color 4:2:0 Pixel Encoding * Supports 12-bits/component Deep Color 4:2:0 Pixel Encoding * Supports 10-bits/component Deep Color 4:2:0 Pixel Encoding - * YCbCr 4:2:0 Capability Map Data Block: - * Empty Capability Map + * VRRmin: 0 Hz + * VRRmax: 0 Hz + * Video Capability Data Block: + * YCbCr quantization: Selectable (via AVI YQ) + * RGB quantization: Selectable (via AVI Q) + * PT scan behavior: No Data + * IT scan behavior: Always Underscanned + * CE scan behavior: Always Underscanned * YCbCr 4:2:0 Video Data Block: * VIC 95: 3840x2160 30.000000 Hz 16:9 67.500 kHz 297.0000= 00 MHz - * Checksum: 0xca + * Checksum: 0x9a Unused space in Extension Block: 88 bytes + * + * ---------------- + * + * edid-decode 1.33.0 + * + * Warnings: + * + * Block 1, CTA-861 Extension Block: + * YCbCr 4:2:0 Video Data Block: Some YCbCr 4:2:0 timings are invalid fo= r HDMI 2.1 + * (which requires an RGB timings pixel rate >=3D 590 MHz). + * + * EDID conformity: PASS */ static const unsigned char test_edid_hdmi_1080p_rgb_yuv_4k_yuv420_dc_max_2= 00mhz[] =3D { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x31, 0xd8, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0x23, 0x01, 0x03, 0x80, 0x60, 0x36, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x03, 0x80, 0x60, 0x36, 0x78, 0x0f, 0xee, 0x91, 0xa3, 0x54, 0x4c, 0x99, 0x26, 0x0f, 0x50, 0x54, 0x20, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, 0x2d, 0x40, 0x58, 0x2c, 0x45, 0x00, 0xc0, 0x1c, 0x32, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x44, 0x49, 0x44, 0x0a, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x18, - 0x55, 0x18, 0x5e, 0x11, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x55, 0x18, 0x5e, 0x1e, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xbb, 0x02, 0x03, 0x29, 0x31, - 0x42, 0x90, 0x5f, 0x6c, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x78, 0x28, 0x20, - 0x00, 0x00, 0x01, 0x03, 0x6d, 0xd8, 0x5d, 0xc4, 0x01, 0x28, 0x80, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x0f, 0x00, 0x00, 0xe2, 0x0e, - 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xad, 0x02, 0x03, 0x27, 0xb1, + 0x41, 0x10, 0x6c, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x78, 0x28, 0x20, 0x00, + 0x00, 0x01, 0x03, 0x6d, 0xd8, 0x5d, 0xc4, 0x01, 0x00, 0x80, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x00, 0xca, 0xe2, 0x0e, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xca + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x9a, }; =20 /* --=20 2.54.0 From nobody Mon Jun 8 05:27:35 2026 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 596FD3F6C4C for ; Mon, 1 Jun 2026 22:45:34 +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=1780353936; cv=none; b=pCxXpZfg9t9VvcWhQ5g7B+Hq/iWRCY40MP1xVklmQ7HJaRKAAMThio9SRVtxdpCyeoBa2sEcIFaeMZ8m88SFVzUlcgNjMlPRD9+a7lm/Fp3MyBVgekxsjQ79Rc8Hbx/RCSR225u0YUQDZ23zJKSlrBLIVTGlr6fwYDE1ZDcKHfs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780353936; c=relaxed/simple; bh=K7ewwCgtGn1bmE9RvSATmXgNhsIx4BxKUTZmr1+qQKE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mrt60IBGjSS4or2T+FAu74aYg83JFSLqQHUH0X335S+fLGPMIoYBMZ6cGZb6d69bI9e/X669yxofjK1fTQR1EHqKPP5HIWVryTN8dfvDCC5q5romMzp2g7WdyRmetA3X6a42fWmWprzmAbk+xMEhCSQHAqaMFvwQPrAaMKrLae8= 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=doSYmY6Y; 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="doSYmY6Y" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1780353932; bh=K7ewwCgtGn1bmE9RvSATmXgNhsIx4BxKUTZmr1+qQKE=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=doSYmY6YnwkDjozXpuNG6TsWqlBXJqtbVNLhYoGvB9rcNQ+i2FbYoGB2urz49DCtO zs5+aJ7np0kvsB4Yw7e5EboAp3rgl16MR5QveFFabajpbcV8juZ+5K41IuR4Nw2UYb 96zsbdIOTwOhnesQrzbO/g6M2dglCfHUgk7j/e68P8m4W0BK2Qbji3xrEbh1PAzPdH aXor4Rx3lATFAborTxAZjQbTEnAJQ6gcg8si6DjgVouNBA43VocTVIit4MBrmD9Gow HqGa5jYGIKlm0RVeGdQshZGZ9HfCPrqX1473KvFDeKsA8Ls6MK/zQitAt6CtXl7aI8 HYvuDDh+azX1g== Received: from localhost (unknown [100.64.0.241]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id C596517E0D87; Tue, 2 Jun 2026 00:45:32 +0200 (CEST) From: Cristian Ciocaltea Date: Tue, 02 Jun 2026 01:44:30 +0300 Subject: [PATCH v7 30/30] drm/tests: edid: Fix conformity for 4K RGB/YUV 340MHz EDID Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260602-dw-hdmi-qp-scramb-v7-30-445eb54ee1ed@collabora.com> References: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> In-Reply-To: <20260602-dw-hdmi-qp-scramb-v7-0-445eb54ee1ed@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan , Daniel Stone , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.15.2 The test EDID added by commit 54a5f1c4d5f8 ("drm/tests: hdmi: Provide EDID supporting 4K@30Hz with RGB/YUV") fails 'edid-decode --check' (v1.33.0) with the following issues: Warnings: Block 1, CTA-861 Extension Block: IT Video Formats are overscanned by default, but normally this should b= e underscanned. YCbCr 4:2:0 Capability Map Data Block: Some YCbCr 4:2:0 timings are inv= alid for HDMI 2.1 (which requires an RGB timings pixel rate >=3D 590 MHz). Failures: Block 0, Base EDID: Vendor & Product Identification: EDID 1.3 does not support week 0xff. Detailed Timing Descriptor #1: Mismatch of image size 1600x900 mm vs di= splay size 960x540 mm. Block 1, CTA-861 Extension Block: Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: Max TMDS rate is= > 0 and <=3D 340 or > 600. YCbCr 4:2:0 Video Data Block: This Data Block is empty. Missing VCDB, needed for Set Selectable RGB Quantization to avoid inter= op issues. EDID: Base EDID: The DTD max image size is 1600x900mm, which is larger than t= he display size 960.0x540.0mm. Address them while preserving the advertised maximum resolution, BPC and TMDS clock used by the existing KUnit tests: - Week 0xff is not valid for EDID 1.3; set it to 0x00 so that the Model year field becomes a regular Year of Manufacture. - Align the DTD image size with the Basic Display Parameters maximum image size (96 cm x 54 cm). - The HDMI Forum VSDB Max TMDS Character Rate must be 0 when no rate above 340 MHz is supported. The HDMI VSDB still advertises 340 MHz as Max TMDS Clock. - Drop the empty YCbCr 4:2:0 Video Data Block. VIC 95 (3840x2160@30Hz) remains advertised as YUV420-capable via the YCbCr 4:2:0 Capability Map Data Block, which references the corresponding entry in the regular Video Data Block. - Add a Video Capability Data Block advertising selectable RGB and YCC quantization range plus underscan for IT/CE formats; also set the 'IT Video Formats Underscanned' bit in the CTA-861 extension header to match. The only remaining warning is HDMI 2.1 related and can be ignored, as it requires that any mode listed in the YCbCr 4:2:0 Video Data Block must have a corresponding RGB pixel clock >=3D 590 MHz. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/tests/drm_kunit_edid.h | 57 ++++++++++++++++++++++--------= ---- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/tests/drm_kunit_edid.h b/drivers/gpu/drm/tests= /drm_kunit_edid.h index 618b42d2fd8e..9a326c9e3f7b 100644 --- a/drivers/gpu/drm/tests/drm_kunit_edid.h +++ b/drivers/gpu/drm/tests/drm_kunit_edid.h @@ -891,22 +891,22 @@ static const unsigned char test_edid_hdmi_1080p_rgb_y= uv_4k_yuv420_dc_max_200mhz[ * edid-decode (hex): * * 00 ff ff ff ff ff ff 00 31 d8 34 00 00 00 00 00 - * ff 23 01 03 80 60 36 78 0f ee 91 a3 54 4c 99 26 + * 00 23 01 03 80 60 36 78 0f ee 91 a3 54 4c 99 26 * 0f 50 54 20 00 00 01 01 01 01 01 01 01 01 01 01 * 01 01 01 01 01 01 04 74 00 30 f2 70 5a 80 b0 58 - * 8a 00 40 84 63 00 00 1e 00 00 00 fc 00 54 65 73 + * 8a 00 c0 1c 32 00 00 1e 00 00 00 fc 00 54 65 73 * 74 20 45 44 49 44 0a 20 20 20 00 00 00 fd 00 18 * 55 18 5e 22 00 0a 20 20 20 20 20 20 00 00 00 10 - * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ce + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 e6 * - * 02 03 27 31 41 5f 6c 03 0c 00 10 00 78 44 20 00 - * 00 01 03 6d d8 5d c4 01 44 80 07 00 00 00 00 00 - * 00 e3 0f 01 00 e1 0e 00 00 00 00 00 00 00 00 00 + * 02 03 28 b1 41 5f 6c 03 0c 00 10 00 78 44 20 00 + * 00 01 03 6d d8 5d c4 01 00 80 07 00 00 00 00 00 + * 00 e2 00 ca e3 0f 01 00 00 00 00 00 00 00 00 00 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 84 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8a * * ---------------- * @@ -915,7 +915,7 @@ static const unsigned char test_edid_hdmi_1080p_rgb_yuv= _4k_yuv420_dc_max_200mhz[ * Vendor & Product Identification: * Manufacturer: LNX * Model: 52 - * Model year: 2025 + * Made in: 2025 * Basic Display Parameters & Features: * Digital display * Maximum image size: 96 cm x 54 cm @@ -933,7 +933,7 @@ static const unsigned char test_edid_hdmi_1080p_rgb_yuv= _4k_yuv420_dc_max_200mhz[ * DMT 0x04: 640x480 59.940476 Hz 4:3 31.469 kHz 25.175= 000 MHz * Standard Timings: none * Detailed Timing Descriptors: - * DTD 1: 3840x2160 30.000000 Hz 16:9 67.500 kHz 297.000000= MHz (1600 mm x 900 mm) + * DTD 1: 3840x2160 30.000000 Hz 16:9 67.500 kHz 297.000000= MHz (960 mm x 540 mm) * Hfront 176 Hsync 88 Hback 296 Hpol P * Vfront 8 Vsync 10 Vback 72 Vpol P * Display Product Name: 'Test EDID' @@ -941,12 +941,13 @@ static const unsigned char test_edid_hdmi_1080p_rgb_y= uv_4k_yuv420_dc_max_200mhz[ * Monitor ranges (GTF): 24-85 Hz V, 24-94 kHz H, max dotclock 340 M= Hz * Dummy Descriptor: * Extension blocks: 1 - * Checksum: 0xce + * Checksum: 0xe6 * * ---------------- * * Block 1, CTA-861 Extension Block: * Revision: 3 + * Underscans IT Video Formats by default * Supports YCbCr 4:4:4 * Supports YCbCr 4:2:2 * Native detailed modes: 1 @@ -962,31 +963,49 @@ static const unsigned char test_edid_hdmi_1080p_rgb_y= uv_4k_yuv420_dc_max_200mhz[ * Extended HDMI video details: * Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8: * Version: 1 - * Maximum TMDS Character Rate: 340 MHz * SCDC Present * Supports 16-bits/component Deep Color 4:2:0 Pixel Encoding * Supports 12-bits/component Deep Color 4:2:0 Pixel Encoding * Supports 10-bits/component Deep Color 4:2:0 Pixel Encoding + * VRRmin: 0 Hz + * VRRmax: 0 Hz + * Video Capability Data Block: + * YCbCr quantization: Selectable (via AVI YQ) + * RGB quantization: Selectable (via AVI Q) + * PT scan behavior: No Data + * IT scan behavior: Always Underscanned + * CE scan behavior: Always Underscanned * YCbCr 4:2:0 Capability Map Data Block: * VIC 95: 3840x2160 30.000000 Hz 16:9 67.500 kHz 297.0000= 00 MHz - * YCbCr 4:2:0 Video Data Block: - * Checksum: 0x84 + * Checksum: 0x8a Unused space in Extension Block: 87 bytes + * + * ---------------- + * + * edid-decode 1.33.0 + * + * Warnings: + * + * Block 1, CTA-861 Extension Block: + * YCbCr 4:2:0 Capability Map Data Block: Some YCbCr 4:2:0 timings are i= nvalid for HDMI 2.1 + * (which requires an RGB timings pixel rate >=3D 590 MHz). + * + * EDID conformity: PASS */ static const unsigned char test_edid_hdmi_4k_rgb_yuv420_dc_max_340mhz[] = =3D { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x31, 0xd8, 0x34, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0x23, 0x01, 0x03, 0x80, 0x60, 0x36, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x01, 0x03, 0x80, 0x60, 0x36, 0x78, 0x0f, 0xee, 0x91, 0xa3, 0x54, 0x4c, 0x99, 0x26, 0x0f, 0x50, 0x54, 0x20, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04, 0x74, 0x00, 0x30, 0xf2, 0x70, - 0x5a, 0x80, 0xb0, 0x58, 0x8a, 0x00, 0x40, 0x84, 0x63, 0x00, 0x00, 0x1e, + 0x5a, 0x80, 0xb0, 0x58, 0x8a, 0x00, 0xc0, 0x1c, 0x32, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x44, 0x49, 0x44, 0x0a, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x18, 0x55, 0x18, 0x5e, 0x22, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xce, 0x02, 0x03, 0x27, 0x31, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe6, 0x02, 0x03, 0x28, 0xb1, 0x41, 0x5f, 0x6c, 0x03, 0x0c, 0x00, 0x10, 0x00, 0x78, 0x44, 0x20, 0x00, - 0x00, 0x01, 0x03, 0x6d, 0xd8, 0x5d, 0xc4, 0x01, 0x44, 0x80, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x0f, 0x01, 0x00, 0xe1, 0x0e, 0x00, + 0x00, 0x01, 0x03, 0x6d, 0xd8, 0x5d, 0xc4, 0x01, 0x00, 0x80, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x00, 0xca, 0xe3, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -994,7 +1013,7 @@ static const unsigned char test_edid_hdmi_4k_rgb_yuv42= 0_dc_max_340mhz[] =3D { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x84 + 0x00, 0x00, 0x00, 0x8a, }; =20 /* --=20 2.54.0