From nobody Fri Jul 24 21:30:17 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (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 EAF8A248881 for ; Fri, 24 Jul 2026 14:23:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903036; cv=pass; b=h9/p7b80EEJQb/+sgqcywm0ONXX1yQT9TYHBJcSS2X9A1FNea28bcEHUlNDpNTdSu3+OLgp28DMarVtRXuR0DjTlYnQaVfFxZrrUG6W++u+l8TuomyW200O11nM1peAzQ7CNGZ3ysj7JFQCG4mNvPfoTJfCcb1E/FfEtm6i7qWI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903036; c=relaxed/simple; bh=hDUe1RQPhda6qL3w5SEastkGLPD0L2doCP9j9yz7TjQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t/fhBS+twKHBhuXfZW35hHMYCg19Ttmb0zSt11TyllxbAV0FzEph5NPML7Pr1CjsCFJObreqrL971amue7j3R5T5EqyD2QvgiIVAsUetrAXoLVO7pzV9wal44Wc7xMak5B1gTpEznFRZwQhGShoQMLKiZ4r2twB48KEPATOw9Ao= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=fSIPeAja; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="fSIPeAja" ARC-Seal: i=1; a=rsa-sha256; t=1784902988; cv=none; d=zohomail.com; s=zohoarc; b=kbqIspr+cUC8RUJbXTmhve7wPOtTpcQQYaYF0QF+G16e2vFD8tD3bQob84w0GrwGydKOrDPKJL2EqRcb+gRGnSyd2WyS239IdSI1R0hW0WUXse7ZdroucX9aIFTGcfPulc71yHlLwfpVVrq6LoCydQnXQLygHo4R8FMcJiTmuI8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784902988; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=D0GUxHD8Q9JSYP82sYc8lospznA2NKpGPVZdowq2lU0=; b=WsAyRjka3QTIYx8TxwyAosI5tq+oMdFfm+fpoBT9QVdma/R6j6+vX8WQIRZoPB7PgoLCZBDN/lGckiBo33AKVw6/DM2yKkQnmRAYgZJx0QbCmTgXa7BIlWkLFt6FHRMydhh8rG7RgpWuEr91e6F2Iiq5cuuNJPQGGeTBFJVk1aE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1784902988; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=D0GUxHD8Q9JSYP82sYc8lospznA2NKpGPVZdowq2lU0=; b=fSIPeAjaTuCMrA5HqVEjwoVjoJCBoM9yUiSSaps+/LgJVDAi9S3WQVqaZfBjnakN +gRMe191iqnSElFuyEUQ0E589MGGmTSikMmy2D3S5igrhTUMpG50dhDRZVbKjHOpkIw pEmZWbkABlaqmORSO0PGqDfSRtSMooB6Bn4G0Z0o= Received: by mx.zohomail.com with SMTPS id 178490298790344.75121009588497; Fri, 24 Jul 2026 07:23:07 -0700 (PDT) From: Nicolas Frattaroli Date: Fri, 24 Jul 2026 16:22:36 +0200 Subject: [PATCH v9 1/5] drm/scdc-helper: Don't use ssize_t return type for scdc_read/write 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: <20260724-scdc-link-health-v9-1-bdda406d016d@collabora.com> References: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> In-Reply-To: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> To: Jani Nikula , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Daniel Stone , Hans Verkuil , Chen-Yu Tsai , Samuel Holland , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, Nicolas Frattaroli X-Mailer: b4 0.15.2 drm_scdc_read and drm_scdc_write, both of which are only used within drm_scdc_helper (although exported), use a ssize_t as their return type. This would make sense if they returned the number of bytes read/written on success, and negative errno otherwise. However, they return 0 on success. Demote them to "int" as their return type, in order to avoid needlessly using 64 bits when less suffices. No functional change. Reviewed-by: Luca Ceresoli Reviewed-by: Hans Verkuil Signed-off-by: Nicolas Frattaroli --- drivers/gpu/drm/display/drm_scdc_helper.c | 8 ++++---- include/drm/display/drm_scdc_helper.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/display/drm_scdc_helper.c b/drivers/gpu/drm/di= splay/drm_scdc_helper.c index df878aad4a36..8403f2390ab6 100644 --- a/drivers/gpu/drm/display/drm_scdc_helper.c +++ b/drivers/gpu/drm/display/drm_scdc_helper.c @@ -67,8 +67,8 @@ * Returns: * 0 on success, negative error code on failure. */ -ssize_t drm_scdc_read(struct i2c_adapter *adapter, u8 offset, void *buffer, - size_t size) +int drm_scdc_read(struct i2c_adapter *adapter, u8 offset, void *buffer, + size_t size) { int ret; struct i2c_msg msgs[2] =3D { @@ -107,8 +107,8 @@ EXPORT_SYMBOL(drm_scdc_read); * Returns: * 0 on success, negative error code on failure. */ -ssize_t drm_scdc_write(struct i2c_adapter *adapter, u8 offset, - const void *buffer, size_t size) +int drm_scdc_write(struct i2c_adapter *adapter, u8 offset, const void *buf= fer, + size_t size) { struct i2c_msg msg =3D { .addr =3D SCDC_I2C_SLAVE_ADDRESS, diff --git a/include/drm/display/drm_scdc_helper.h b/include/drm/display/dr= m_scdc_helper.h index 34600476a1b9..e9ccaeba56dd 100644 --- a/include/drm/display/drm_scdc_helper.h +++ b/include/drm/display/drm_scdc_helper.h @@ -31,10 +31,10 @@ struct drm_connector; struct i2c_adapter; =20 -ssize_t drm_scdc_read(struct i2c_adapter *adapter, u8 offset, void *buffer, - size_t size); -ssize_t drm_scdc_write(struct i2c_adapter *adapter, u8 offset, - const void *buffer, size_t size); +int drm_scdc_read(struct i2c_adapter *adapter, u8 offset, void *buffer, + size_t size); +int drm_scdc_write(struct i2c_adapter *adapter, u8 offset, const void *buf= fer, + size_t size); =20 /** * drm_scdc_readb - read a single byte from SCDC --=20 2.55.0 From nobody Fri Jul 24 21:30:17 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (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 24AE7433BB9 for ; Fri, 24 Jul 2026 14:23:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903036; cv=pass; b=E89vqedK7eD0wVwxhGyuRN6M2VHWa9yvhH1eHIra04lCoq5JvkknEWHbzD+Mmfc1wxsycxsXSbUmaQEDuUDivj/2pacrmYjhx6S6SqBMhMebLhEy70h6XE9m3ZLwqLg69nLu9JH9RL85u17bNa9eJH42KL1keE8G1FYwORNlnHY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903036; c=relaxed/simple; bh=1Fl5hxb7WZYrMt7c2+7y/TGCfqmmtlWHZrsu26G/QjU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GmDvZYiJWE2G4tsfaq+SSD3zWzpTX10sypw54PU4lnPk35S/YV1Fmk61lpkNRt6arNzm+y74DZfI336H2mW2n95gnvixV4yBiB3ACew1alskml7yX31iZmvjGWs2TsSYsbuYJkpBFD46tnlDhnX5aR1i+FLVqXDxFfN6DGqj6E0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=PkhAokOL; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="PkhAokOL" ARC-Seal: i=1; a=rsa-sha256; t=1784902997; cv=none; d=zohomail.com; s=zohoarc; b=feh4E2AUYLXSbZc8wRwtPBE89dCTouytyoCUH7No0Ojkp1PjWoDx/Nn5rSGHcHkKOMIvxkng8O7fCWEPMEHmAtDz42gv71+MMT3m/z9n50HtfYPbhr+D5H4aU+0aj+tP5wQxt7/P5RoofpG3E7GA3R4Kam9PIVw+aGV46KAwkx8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784902997; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=C4lOeSzX69UWcsgeROuSWqBsh0HASlGUr+L4G5DF0F0=; b=CSSNSu93X87z5ScTJmriR2SxcpwkkXAIUGEp5tb3du4BHGnytHn4D3W8gdtBE8PkpoIyVYzzqS2apadDh0/fVSIdnn8dFumvTeC2zzidPap2Jm/cYYR430f9vh2ozL/vozvhIiUF9UhsE9D0LiDEfq6xzXvkRzDfwep2KOQFniY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1784902997; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=C4lOeSzX69UWcsgeROuSWqBsh0HASlGUr+L4G5DF0F0=; b=PkhAokOLtwcOar9enESMrhKl0pWI0QJVkrW+t/u+EQ5ByRiHc/4refgrz/IxL69H EoUlMLOv6XInmwciG6n6U8EfOUA+dWL2Z8QhLRgEVtyHNAbkDbqXuB1gzqcLMKlVNdC +0ZlO8yaVUxM4XYe4LMwJ6LmBtXphJfNGQ0kUx5Y= Received: by mx.zohomail.com with SMTPS id 1784902994433745.8102447774462; Fri, 24 Jul 2026 07:23:14 -0700 (PDT) From: Nicolas Frattaroli Date: Fri, 24 Jul 2026 16:22:37 +0200 Subject: [PATCH v9 2/5] drm/scdc-helper: Add scdc_status debugfs entry 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: <20260724-scdc-link-health-v9-2-bdda406d016d@collabora.com> References: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> In-Reply-To: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> To: Jani Nikula , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Daniel Stone , Hans Verkuil , Chen-Yu Tsai , Samuel Holland , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, Nicolas Frattaroli X-Mailer: b4 0.15.2 SCDC provides status information on the current display link. At the very least, it may be useful to expose this info through debugfs. Add a debugfs entry for it under the connector, which displays a few more details parsed out of the SCDC registers. A new drm_scdc_debugfs_init function can be called by the connector implementation to initialise the debugfs file. Signed-off-by: Nicolas Frattaroli --- drivers/gpu/drm/display/drm_scdc_helper.c | 186 ++++++++++++++++++++++++++= ++++ include/drm/display/drm_scdc_helper.h | 32 +++++ 2 files changed, 218 insertions(+) diff --git a/drivers/gpu/drm/display/drm_scdc_helper.c b/drivers/gpu/drm/di= splay/drm_scdc_helper.c index 8403f2390ab6..129a2b85527b 100644 --- a/drivers/gpu/drm/display/drm_scdc_helper.c +++ b/drivers/gpu/drm/display/drm_scdc_helper.c @@ -24,7 +24,9 @@ #include #include #include +#include #include +#include =20 #include #include @@ -276,3 +278,187 @@ 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 void +drm_scdc_parse_status0_flags(u8 val, struct drm_scdc_status_flags *flags) +{ + flags->clock_detected =3D val & SCDC_CLOCK_DETECT; + flags->ch0_locked =3D val & SCDC_CH0_LOCK; + flags->ch1_locked =3D val & SCDC_CH1_LOCK; + flags->ch2_locked =3D val & SCDC_CH2_LOCK; +} + +static int drm_scdc_parse_error_counters(const u8 scdc[256], u16 counter[3= ]) +{ + u8 sum =3D 0; + int i; + + for (i =3D SCDC_ERR_DET_0_L; i <=3D SCDC_ERR_DET_CHECKSUM ; i++) + sum =3D wrapping_add(u8, sum, scdc[i]); + + if (sum) + return -EPROTO; + + for (i =3D 0; i < 3; i++) { + if (scdc[SCDC_ERR_DET_0_H + i * 2] & SCDC_CHANNEL_VALID) + counter[i] =3D (scdc[SCDC_ERR_DET_0_H + i * 2] & + ~SCDC_CHANNEL_VALID) << 8 | + scdc[SCDC_ERR_DET_0_L + i * 2]; + else + counter[i] =3D 0; + } + + return 0; +} + +/** + * drm_scdc_read_state - Update state from SCDC + * @connector: pointer to a &struct drm_connector on which to operate on + * @state: pointer to a &struct drm_scdc_state to fill + * + * Reads the entire 256 byte SCDC state and parses it. + * + * Returns: %0 on success, negative errno on failure. + */ +int drm_scdc_read_state(struct drm_connector *connector, struct drm_scdc_s= tate *state) +{ + struct i2c_adapter *ddc; + struct drm_scdc *scdc; + u8 *buf =3D state->scdc; + int ret; + + if (!state || !connector) + return -ENODEV; + + scdc =3D &connector->display_info.hdmi.scdc; + ddc =3D connector->ddc; + + if (!scdc->supported || !ddc) + return -EOPNOTSUPP; + + /* Read in 128-byte chunks, to work around DP<->HDMI converters with issu= es. */ + ret =3D drm_scdc_read(ddc, 0, buf, 128); + if (ret) + return ret; + + ret =3D drm_scdc_read(ddc, 128, &buf[128], 128); + if (ret) + return ret; + + state->scrambling_enabled =3D buf[SCDC_TMDS_CONFIG] & SCDC_SCRAMBLING_ENA= BLE; + state->tmds_bclk_x40 =3D buf[SCDC_TMDS_CONFIG] & SCDC_TMDS_BIT_CLOCK_RATI= O_BY_40; + + state->scrambling_detected =3D buf[SCDC_SCRAMBLER_STATUS] & SCDC_SCRAMBLI= NG_STATUS; + + drm_scdc_parse_status0_flags(buf[SCDC_STATUS_FLAGS_0], &state->stf); + ret =3D drm_scdc_parse_error_counters(buf, state->error_count); + if (ret) + return ret; + + return 0; +} +EXPORT_SYMBOL(drm_scdc_read_state); + +#define scdc_print_str(_f, key, s) \ + (seq_printf((_f), "%-30s: %s\n", (key), (s))) +#define scdc_print_flag(_f, key, val) \ + (scdc_print_str((_f), (key), str_yes_no((val)))) +#define scdc_print_dec(_f, key, val) \ + (seq_printf((_f), "%-30s: %d\n", (key), (val))) + +static int scdc_status_show(struct seq_file *m, void *data) +{ + struct drm_connector *connector =3D m->private; + struct drm_scdc *scdc =3D &connector->display_info.hdmi.scdc; + struct drm_scdc_state *st; + int i, ret; + + drm_connector_get(connector); + + ret =3D mutex_lock_interruptible(&connector->dev->mode_config.mutex); + if (ret) + goto err_conn_put; + + if (connector->status !=3D connector_status_connected) { + ret =3D -ENODEV; + goto err_unlock; + } + + if (scdc->supported) { + st =3D kzalloc_obj(*st); + if (!st) { + ret =3D -ENOMEM; + goto err_unlock; + } + ret =3D drm_scdc_read_state(connector, st); + if (ret) + goto err_free_state; + + for (i =3D 0; i < ARRAY_SIZE(st->scdc); i +=3D 16) + seq_printf(m, "%*ph\n", 16, &st->scdc[i]); + + seq_puts(m, "\n----------------\n\n"); + } + + scdc_print_flag(m, "SCDC Supported", scdc->supported); + if (!scdc->supported) { + ret =3D 0; + goto err_unlock; + } + + scdc_print_flag(m, "Sink Read Request Capable", scdc->read_request); + scdc_print_flag(m, "Scrambling Supported", scdc->scrambling.supported); + scdc_print_flag(m, "Low Rate Scrambling Supported", scdc->scrambling.low_= rates); + + mutex_unlock(&connector->dev->mode_config.mutex); + + drm_connector_put(connector); + + scdc_print_flag(m, "Scrambling Enabled", st->scrambling_enabled); + scdc_print_flag(m, "Scrambling Detected", st->scrambling_detected); + + if (st->tmds_bclk_x40) + scdc_print_str(m, "TMDS Bit Clock Ratio", "1/40"); + else + scdc_print_str(m, "TMDS Bit Clock Ratio", "1/10"); + + scdc_print_flag(m, "Clock Detected", st->stf.clock_detected); + scdc_print_flag(m, "Channel 0 Locked", st->stf.ch0_locked); + scdc_print_flag(m, "Channel 1 Locked", st->stf.ch1_locked); + scdc_print_flag(m, "Channel 2 Locked", st->stf.ch2_locked); + + scdc_print_dec(m, "Channel 0 Errors", st->error_count[0]); + scdc_print_dec(m, "Channel 1 Errors", st->error_count[1]); + scdc_print_dec(m, "Channel 2 Errors", st->error_count[2]); + + kfree(st); + + return 0; + +err_free_state: + kfree(st); +err_unlock: + mutex_unlock(&connector->dev->mode_config.mutex); +err_conn_put: + drm_connector_put(connector); + + return ret; +} +DEFINE_SHOW_ATTRIBUTE(scdc_status); + +/** + * drm_scdc_debugfs_init - Initialize scdc files in connector debugfs + * @connector: pointer to &struct drm_connector to operate on + * @root: debugfs &struct dentry for the debugfs root of @connector + * + * Creates SCDC-related debugfs files for @connector. Must be called after + * @root is already created. + */ +void drm_scdc_debugfs_init(struct drm_connector *connector, struct dentry = *root) +{ + if (!root || !connector) + return; + + debugfs_create_file("scdc_status", 0444, root, connector, &scdc_status_fo= ps); +} +EXPORT_SYMBOL(drm_scdc_debugfs_init); diff --git a/include/drm/display/drm_scdc_helper.h b/include/drm/display/dr= m_scdc_helper.h index e9ccaeba56dd..e0b79d79e1ff 100644 --- a/include/drm/display/drm_scdc_helper.h +++ b/include/drm/display/drm_scdc_helper.h @@ -30,6 +30,34 @@ =20 struct drm_connector; struct i2c_adapter; +struct dentry; + +struct drm_scdc_status_flags { + /* Status Register 0 */ + bool clock_detected; + bool ch0_locked; + bool ch1_locked; + bool ch2_locked; +}; + +struct drm_scdc_state { + /** @stf: contents of the status flag registers */ + struct drm_scdc_status_flags stf; + /** @scramling_enabled: true if TMDS scrambling is on */ + bool scrambling_enabled; + /** @scrambling_detected: true if the sink actually detected scrambling */ + bool scrambling_detected; + /** + * @tmds_bclk_x40: true if TMDS bit period is 1/40th of the TMDS + * clock period, false if it's 1/10th of the clock period. + */ + bool tmds_bclk_x40; + /** @error_count: character error counts for each channel */ + u16 error_count[3]; + + /** @scdc: raw SCDC data buffer */ + u8 scdc[256]; +}; =20 int drm_scdc_read(struct i2c_adapter *adapter, u8 offset, void *buffer, size_t size); @@ -77,4 +105,8 @@ bool drm_scdc_get_scrambling_status(struct drm_connector= *connector); 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); =20 +int drm_scdc_read_state(struct drm_connector *connector, + struct drm_scdc_state *state); +void drm_scdc_debugfs_init(struct drm_connector *connector, struct dentry = *root); + #endif --=20 2.55.0 From nobody Fri Jul 24 21:30:17 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (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 2B57B43B4B6 for ; Fri, 24 Jul 2026 14:23:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903039; cv=pass; b=eXsc2P8EcMfC1ilP7T7rSYI829AuN8jGg7gaVLwZ24UvMTABViBUlxbuyDBmCKB3Yre6Bb65nyY3aKAgPPNo4Ns3bSzF5RhtC5Umfy4ocQTHtE+0nV4vdJQ1bm/Nc5/S/z69Iu3BtjE95mO4PVvUUAQJL5X8vu9xPXyD3D5H8Pk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903039; c=relaxed/simple; bh=5FLb8CYW9iQMqSd1sb+iJ+oh/shQPoL95k+RmmMJxu4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GC/sbLQITeh9C+xeA4amaatZWqIjLWHJVMPF3hI82ZJzommt606HR+S12DyVTf4CGrDycHJqoGgapARwGsS7rIzcqcOD9zaHgYSaSojprZ7NrnCxAo/HgdIhEESLxZkkrytGYlUZYlFMWydrqyXcV6Y7q1xkc6poOEDChY5vZMc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=T5m3wFrq; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="T5m3wFrq" ARC-Seal: i=1; a=rsa-sha256; t=1784903003; cv=none; d=zohomail.com; s=zohoarc; b=fhNUxl9nrqiMq8QoB6OURV4U0Kot5Mz6wBBsBqxT/Fsj2iCS+3IUG90wC3Pa/xK+PPx4LSkHGLzQ1XUMT2n507DsuYp8Xk2rjSJy7COg7pJqPKkO4i+YZj5bS0euqZsRnbPoL/veY3WTM9gFR2ZlNY9JkodImH8w/2IV4h8wk4E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784903003; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=pMs0Yai6sNaBFiwj9DRM4zWkNi3KmcoR/32UidIACgk=; b=bVBzobjit76C92oMgBteCfXI0XG4GWt58xCTB9rgLrpIkv4XC4k8YEyeAI3vAqxTzi/0Y+V+4dJGQ5mmI2s8uI5GOFVg4gV7njXUTsrnqo2Zf3fjP1PlZgew5XjyP22czSOsl1G2cyz87gejDKEPBdyn3aVTO+qMKzxQ2Hvi6oE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1784903003; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=pMs0Yai6sNaBFiwj9DRM4zWkNi3KmcoR/32UidIACgk=; b=T5m3wFrq4WgR8a0b1csalTwBsPNynv8L1DKFfvD43Xrx10h4mvFGI5BUmztscTSl kKo73GhVm9ASBq1r+rYOwjgEzJDI154iYlSyaJMx1/O8cwU4urZU2sAj6Q9qviI11+P GQkYJvErRr2Mh4xlfyxQk888eOdhKhcyt3JD0x8U= Received: by mx.zohomail.com with SMTPS id 1784903001077134.12179153555007; Fri, 24 Jul 2026 07:23:21 -0700 (PDT) From: Nicolas Frattaroli Date: Fri, 24 Jul 2026 16:22:38 +0200 Subject: [PATCH v9 3/5] drm/scdc-helper: Implement parsing and printing HDMI 2.1 fields 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: <20260724-scdc-link-health-v9-3-bdda406d016d@collabora.com> References: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> In-Reply-To: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> To: Jani Nikula , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Daniel Stone , Hans Verkuil , Chen-Yu Tsai , Samuel Holland , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, Nicolas Frattaroli X-Mailer: b4 0.15.2 HDMI 2.1 redefines previously reserved fields in SCDC for various new uses. No version check needs to be performed, as an HDMI 2.0 sink's reserved SCDC fields are well-defined to be 0, and any zero-ness of these fields for an HDMI 2.0 sink is not a surprise for SCDC parsers for HDMI 2.1. Implement reading and outputting these fields over debugfs. Reviewed-by: Maxime Ripard Signed-off-by: Nicolas Frattaroli --- drivers/gpu/drm/display/drm_scdc_helper.c | 103 ++++++++++++++++++++++++++= ++-- include/drm/display/drm_scdc.h | 21 +++++- include/drm/display/drm_scdc_helper.h | 69 +++++++++++++++++++- 3 files changed, 185 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/display/drm_scdc_helper.c b/drivers/gpu/drm/di= splay/drm_scdc_helper.c index 129a2b85527b..d00da20862fc 100644 --- a/drivers/gpu/drm/display/drm_scdc_helper.c +++ b/drivers/gpu/drm/display/drm_scdc_helper.c @@ -21,6 +21,7 @@ * DEALINGS IN THE SOFTWARE. */ =20 +#include #include #include #include @@ -57,6 +58,38 @@ =20 #define SCDC_I2C_SLAVE_ADDRESS 0x54 =20 +static const char *drm_scdc_frl_rate_str(enum drm_scdc_frl_rate rate) +{ + switch (rate) { + case SCDC_FRL_RATE_OFF: + return "Off"; + case SCDC_FRL_RATE_3X3: + return "3 Gbit/s x 3 lanes"; + case SCDC_FRL_RATE_6X3: + return "6 Gbit/s x 3 lanes"; + case SCDC_FRL_RATE_6X4: + return "6 Gbit/s x 4 lanes"; + case SCDC_FRL_RATE_8X4: + return "8 Gbit/s x 4 lanes"; + case SCDC_FRL_RATE_10X4: + return "10 Gbit/s x 4 lanes"; + case SCDC_FRL_RATE_12X4: + return "12 Gbit/s x 4 lanes"; + case SCDC_FRL_RATE_RESV_7: + case SCDC_FRL_RATE_RESV_8: + case SCDC_FRL_RATE_RESV_9: + case SCDC_FRL_RATE_RESV_10: + case SCDC_FRL_RATE_RESV_11: + case SCDC_FRL_RATE_RESV_12: + case SCDC_FRL_RATE_RESV_13: + case SCDC_FRL_RATE_RESV_14: + case SCDC_FRL_RATE_RESV_15: + return "(Reserved)"; + default: + return NULL; + } +} + /** * drm_scdc_read - read a block of data from SCDC * @adapter: I2C controller @@ -286,14 +319,41 @@ drm_scdc_parse_status0_flags(u8 val, struct drm_scdc_= status_flags *flags) flags->ch0_locked =3D val & SCDC_CH0_LOCK; flags->ch1_locked =3D val & SCDC_CH1_LOCK; flags->ch2_locked =3D val & SCDC_CH2_LOCK; + flags->ln3_locked =3D val & SCDC_LN3_LOCK; + flags->flt_ready =3D val & SCDC_FLT_READY; + flags->dsc_fail =3D val & SCDC_DSC_FAIL; +} + +static void +drm_scdc_parse_status1_2_flags(u8 val_flag1, u8 val_flag2, + struct drm_scdc_status_flags *flags) +{ + flags->ln0_training_pattern =3D FIELD_GET(SCDC_LN_EVEN_TRAIN_PTRN, val_fl= ag1); + flags->ln1_training_pattern =3D FIELD_GET(SCDC_LN_ODD_TRAIN_PTRN, val_fla= g1); + + flags->ln2_training_pattern =3D FIELD_GET(SCDC_LN_EVEN_TRAIN_PTRN, val_fl= ag2); + flags->ln3_training_pattern =3D FIELD_GET(SCDC_LN_ODD_TRAIN_PTRN, val_fla= g2); } =20 -static int drm_scdc_parse_error_counters(const u8 scdc[256], u16 counter[3= ]) +static int drm_scdc_parse_error_counters(const u8 scdc[256], u16 counter[4= ], + unsigned int num_lanes) { + u8 end_reg; u8 sum =3D 0; int i; =20 - for (i =3D SCDC_ERR_DET_0_L; i <=3D SCDC_ERR_DET_CHECKSUM ; i++) + switch (num_lanes) { + case 3: + end_reg =3D SCDC_ERR_DET_CHECKSUM; + break; + case 4: + end_reg =3D SCDC_ERR_DET_3_H; + break; + default: + return -EINVAL; + } + + for (i =3D SCDC_ERR_DET_0_L; i <=3D end_reg; i++) sum =3D wrapping_add(u8, sum, scdc[i]); =20 if (sum) @@ -308,6 +368,12 @@ static int drm_scdc_parse_error_counters(const u8 scdc= [256], u16 counter[3]) counter[i] =3D 0; } =20 + if (num_lanes =3D=3D 4 && scdc[SCDC_ERR_DET_3_H] & SCDC_CHANNEL_VALID) + counter[3] =3D (scdc[SCDC_ERR_DET_3_H] & ~SCDC_CHANNEL_VALID) << 8 | + scdc[SCDC_ERR_DET_3_L]; + else + counter[3] =3D 0; + return 0; } =20 @@ -325,6 +391,7 @@ int drm_scdc_read_state(struct drm_connector *connector= , struct drm_scdc_state * struct i2c_adapter *ddc; struct drm_scdc *scdc; u8 *buf =3D state->scdc; + int num_lanes; int ret; =20 if (!state || !connector) @@ -350,11 +417,26 @@ int drm_scdc_read_state(struct drm_connector *connect= or, struct drm_scdc_state * =20 state->scrambling_detected =3D buf[SCDC_SCRAMBLER_STATUS] & SCDC_SCRAMBLI= NG_STATUS; =20 + state->rate =3D FIELD_GET(SCDC_FRL_RATE, buf[SCDC_CONFIG_1]); + num_lanes =3D drm_scdc_num_frl_lanes(state->rate); + if (num_lanes < 0) + return num_lanes; + if (!num_lanes) + num_lanes =3D 3; + + state->ffe_levels =3D FIELD_GET(SCDC_FFE_LEVELS, buf[SCDC_CONFIG_1]); + drm_scdc_parse_status0_flags(buf[SCDC_STATUS_FLAGS_0], &state->stf); - ret =3D drm_scdc_parse_error_counters(buf, state->error_count); + drm_scdc_parse_status1_2_flags(buf[SCDC_STATUS_FLAGS_1], + buf[SCDC_STATUS_FLAGS_2], &state->stf); + ret =3D drm_scdc_parse_error_counters(buf, state->error_count, num_lanes); if (ret) return ret; =20 + if (state->rate && (buf[SCDC_ERR_DET_RS_H] & SCDC_CHANNEL_VALID)) + state->rs_corrections =3D (buf[SCDC_ERR_DET_RS_H] & ~SCDC_CHANNEL_VALID)= << 8 | + buf[SCDC_ERR_DET_RS_L]; + return 0; } EXPORT_SYMBOL(drm_scdc_read_state); @@ -371,7 +453,7 @@ static int scdc_status_show(struct seq_file *m, void *d= ata) struct drm_connector *connector =3D m->private; struct drm_scdc *scdc =3D &connector->display_info.hdmi.scdc; struct drm_scdc_state *st; - int i, ret; + int i, ret, frl_lanes; =20 drm_connector_get(connector); =20 @@ -414,8 +496,12 @@ static int scdc_status_show(struct seq_file *m, void *= data) =20 drm_connector_put(connector); =20 + frl_lanes =3D drm_scdc_num_frl_lanes(st->rate); + scdc_print_flag(m, "Scrambling Enabled", st->scrambling_enabled); scdc_print_flag(m, "Scrambling Detected", st->scrambling_detected); + scdc_print_str(m, "FRL Rate", drm_scdc_frl_rate_str(st->rate)); + scdc_print_dec(m, "FFE Levels", st->ffe_levels); =20 if (st->tmds_bclk_x40) scdc_print_str(m, "TMDS Bit Clock Ratio", "1/40"); @@ -426,10 +512,19 @@ static int scdc_status_show(struct seq_file *m, void = *data) scdc_print_flag(m, "Channel 0 Locked", st->stf.ch0_locked); scdc_print_flag(m, "Channel 1 Locked", st->stf.ch1_locked); scdc_print_flag(m, "Channel 2 Locked", st->stf.ch2_locked); + if (frl_lanes =3D=3D 4) + scdc_print_flag(m, "Lane 3 Locked", st->stf.ln3_locked); + + scdc_print_flag(m, "Sink Ready For Link Training", st->stf.flt_ready); + scdc_print_flag(m, "Sink Failed To Decode DSC", st->stf.dsc_fail); =20 scdc_print_dec(m, "Channel 0 Errors", st->error_count[0]); scdc_print_dec(m, "Channel 1 Errors", st->error_count[1]); scdc_print_dec(m, "Channel 2 Errors", st->error_count[2]); + if (frl_lanes =3D=3D 4) + scdc_print_dec(m, "Lane 3 Errors", st->error_count[3]); + if (frl_lanes > 0) + scdc_print_dec(m, "Reed-Solomon Corrections", st->rs_corrections); =20 kfree(st); =20 diff --git a/include/drm/display/drm_scdc.h b/include/drm/display/drm_scdc.h index 3d58f37e8ed8..7f0b05b2f280 100644 --- a/include/drm/display/drm_scdc.h +++ b/include/drm/display/drm_scdc.h @@ -29,6 +29,8 @@ #define SCDC_SOURCE_VERSION 0x02 =20 #define SCDC_UPDATE_0 0x10 +#define SCDC_RSED_UPDATE (1 << 6) +#define SCDC_FLT_UPDATE (1 << 5) #define SCDC_READ_REQUEST_TEST (1 << 2) #define SCDC_CED_UPDATE (1 << 1) #define SCDC_STATUS_UPDATE (1 << 0) @@ -46,14 +48,25 @@ #define SCDC_CONFIG_0 0x30 #define SCDC_READ_REQUEST_ENABLE (1 << 0) =20 +#define SCDC_CONFIG_1 0x31 +#define SCDC_FRL_RATE 0x0f +#define SCDC_FFE_LEVELS 0xf0 + #define SCDC_STATUS_FLAGS_0 0x40 +#define SCDC_DSC_FAIL (1 << 7) +#define SCDC_FLT_READY (1 << 6) +#define SCDC_LN3_LOCK (1 << 4) #define SCDC_CH2_LOCK (1 << 3) #define SCDC_CH1_LOCK (1 << 2) #define SCDC_CH0_LOCK (1 << 1) -#define SCDC_CH_LOCK_MASK (SCDC_CH2_LOCK | SCDC_CH1_LOCK | SCDC_CH0_LOCK) +#define SCDC_CH_LOCK_MASK (SCDC_LN3_LOCK | SCDC_CH2_LOCK | SCDC_CH1_LOCK = | \ + SCDC_CH0_LOCK) #define SCDC_CLOCK_DETECT (1 << 0) =20 #define SCDC_STATUS_FLAGS_1 0x41 +#define SCDC_LN_EVEN_TRAIN_PTRN 0x0f +#define SCDC_LN_ODD_TRAIN_PTRN 0xf0 +#define SCDC_STATUS_FLAGS_2 0x42 =20 #define SCDC_ERR_DET_0_L 0x50 #define SCDC_ERR_DET_0_H 0x51 @@ -65,6 +78,12 @@ =20 #define SCDC_ERR_DET_CHECKSUM 0x56 =20 +#define SCDC_ERR_DET_3_L 0x57 +#define SCDC_ERR_DET_3_H 0x58 + +#define SCDC_ERR_DET_RS_L 0x59 +#define SCDC_ERR_DET_RS_H 0x5a + #define SCDC_TEST_CONFIG_0 0xc0 #define SCDC_TEST_READ_REQUEST (1 << 7) #define SCDC_TEST_READ_REQUEST_DELAY(x) ((x) & 0x7f) diff --git a/include/drm/display/drm_scdc_helper.h b/include/drm/display/dr= m_scdc_helper.h index e0b79d79e1ff..a3b20adaac7e 100644 --- a/include/drm/display/drm_scdc_helper.h +++ b/include/drm/display/drm_scdc_helper.h @@ -24,6 +24,7 @@ #ifndef DRM_SCDC_HELPER_H #define DRM_SCDC_HELPER_H =20 +#include #include =20 #include @@ -38,8 +39,65 @@ struct drm_scdc_status_flags { bool ch0_locked; bool ch1_locked; bool ch2_locked; + bool ln3_locked; + bool flt_ready; + bool dsc_fail; + + /* Status Register 1 */ + u8 ln0_training_pattern : 4; + u8 ln1_training_pattern : 4; + + /* Status Register 2 */ + u8 ln2_training_pattern : 4; + u8 ln3_training_pattern : 4; +}; + +enum drm_scdc_frl_rate { + SCDC_FRL_RATE_OFF =3D 0, + SCDC_FRL_RATE_3X3 =3D 1, + SCDC_FRL_RATE_6X3 =3D 2, + SCDC_FRL_RATE_6X4 =3D 3, + SCDC_FRL_RATE_8X4 =3D 4, + SCDC_FRL_RATE_10X4 =3D 5, + SCDC_FRL_RATE_12X4 =3D 6, + SCDC_FRL_RATE_RESV_7 =3D 7, + SCDC_FRL_RATE_RESV_8 =3D 8, + SCDC_FRL_RATE_RESV_9 =3D 9, + SCDC_FRL_RATE_RESV_10 =3D 10, + SCDC_FRL_RATE_RESV_11 =3D 11, + SCDC_FRL_RATE_RESV_12 =3D 12, + SCDC_FRL_RATE_RESV_13 =3D 13, + SCDC_FRL_RATE_RESV_14 =3D 14, + SCDC_FRL_RATE_RESV_15 =3D 15 }; =20 +/** + * drm_scdc_num_frl_lanes - get number of lanes for a given FRL rate + * @rate: one of &enum drm_scdc_frl_rate + * + * For a given @rate, return the number of lanes it uses. + * + * Returns: %-EINVAL if @rate is not a valid FRL rate, or the number of la= nes + * for a given &enum drm_scdc_frl_rate on success (including %0 for "off") + */ +static inline __pure int drm_scdc_num_frl_lanes(enum drm_scdc_frl_rate rat= e) +{ + switch (rate) { + case SCDC_FRL_RATE_OFF: + return 0; + case SCDC_FRL_RATE_3X3: + case SCDC_FRL_RATE_6X3: + return 3; + case SCDC_FRL_RATE_6X4: + case SCDC_FRL_RATE_8X4: + case SCDC_FRL_RATE_10X4: + case SCDC_FRL_RATE_12X4: + return 4; + default: + return -EINVAL; + } +} + struct drm_scdc_state { /** @stf: contents of the status flag registers */ struct drm_scdc_status_flags stf; @@ -52,9 +110,14 @@ struct drm_scdc_state { * clock period, false if it's 1/10th of the clock period. */ bool tmds_bclk_x40; - /** @error_count: character error counts for each channel */ - u16 error_count[3]; - + /** @rate: FRL rate set by the source */ + enum drm_scdc_frl_rate rate : 4; + /** @ffe_levels: The FFE levels for @rate set by the source */ + u8 ffe_levels : 4; + /** @error_count: character error counts for each channel/link */ + u16 error_count[4]; + /** @rs_corrections: number of Reed-Solomon Corrections */ + u16 rs_corrections; /** @scdc: raw SCDC data buffer */ u8 scdc[256]; }; --=20 2.55.0 From nobody Fri Jul 24 21:30:17 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (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 B34E8439F8D for ; Fri, 24 Jul 2026 14:24:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903048; cv=pass; b=MxGcuymsOVPERUO08IsHimDSds8G+mHj2Jh8odTAP4BzYi+QSujyAo7T43JhMgNCDUMbuWQy+uwxGkpPBv7YZ85KDgEiu9pEpy01q+FaniB5C9VCNMWt2QX2+cKaaaBEjLO/7bnD9/cmwPK76xnsMAbArcsBNCGKS5Kv/u6zLww= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903048; c=relaxed/simple; bh=uBOWcWWyO2qOMGLWUPTKIGaiBB9hTwDU2V160NMp8Xo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kL7mODEWD/V4e941GyCksMmdLa/y68RK+/tn20A16smgslYqktWBpqm2ABxElNpKfFwipZWqcgCoDuMrCiOY/oDP2/aEeFIWwYoF0idJ6rmomwUIsTfQGj2zhi8/P0ZTdJB/orczlnhxo88PKlI/pahbFTh8+qaaHcGDM5DF5+c= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=A9MjFqpz; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="A9MjFqpz" ARC-Seal: i=1; a=rsa-sha256; t=1784903009; cv=none; d=zohomail.com; s=zohoarc; b=jYiFgrbToJzvMQGl32ZXLhRbJssBVREbXuHNBEnT6hPWnJ8MrtXvS7JNHn++iYKJkBdlI5B1GPBj4o8Q3Kj+WK2nykKAWPZjsVf7QChmCcTRH/PU8LtyTAQJxoTedZteRe4tUQseiVCS7ca+xVRGNz4RTAdQFlr/EOg/cqKEq7w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784903009; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=iyMdeIjesJ+k58luJXaL+sqCBtei9UFC6fuSl+9RZtM=; b=Q8ScHqsHZJaWReASiJmsjVUHKThcRw7KCNRDBsbz/fRMOzINwlL3dyauQmE/nDHwbrprqj64xHXYnT1IaAg8wj/VIQ/caN08LDUpcc5RdlekmPYRXyqMeh3n7BbvS5Y2LejLBbKfJC51sqRHmZuP6iMCc/HJ3JYIxoHAYY/BBQQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1784903009; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=iyMdeIjesJ+k58luJXaL+sqCBtei9UFC6fuSl+9RZtM=; b=A9MjFqpzWb61sjimdw1iu1VOE8VWrTa5LMVmqFKUkxv9JThVGsZ9/AzZcs3CzvLO GNpKZZQAxMbxMHdJs539C721ZwRhz1TEzbO7M0su4XSgGNsAvZWv/PJlOZQSyhNHd+J +YQxgtnVWs4H3DOx4NfjhEA9cPxSwWIxmC7+n4QY= Received: by mx.zohomail.com with SMTPS id 1784903008121607.2859628502019; Fri, 24 Jul 2026 07:23:28 -0700 (PDT) From: Nicolas Frattaroli Date: Fri, 24 Jul 2026 16:22:39 +0200 Subject: [PATCH v9 4/5] drm/debugfs: Move HDMI debugfs registration to state 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: <20260724-scdc-link-health-v9-4-bdda406d016d@collabora.com> References: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> In-Reply-To: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> To: Jani Nikula , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Daniel Stone , Hans Verkuil , Chen-Yu Tsai , Samuel Holland , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, Nicolas Frattaroli , Dmitry Baryshkov X-Mailer: b4 0.15.2 The HDMI debugfs files are only useful for connectors that already make use of the HDMI state helpers. In addition, relying on HDMI-specific functions in drm_debugfs.c can lead to circular linking problems later down the line. Move hdmi_debugfs_add() and friends to a new helper in drm_hdmi_state_helper.c, and make all current users (vc4, sun4i, bridge) either use it as a debugfs_init func, or call it directly in its debugfs_init func. Suggested-by: Maxime Ripard Reviewed-by: Dmitry Baryshkov Acked-by: Maxime Ripard Signed-off-by: Nicolas Frattaroli --- drivers/gpu/drm/display/drm_bridge_connector.c | 3 + drivers/gpu/drm/display/drm_hdmi_state_helper.c | 154 ++++++++++++++++++++= +++ drivers/gpu/drm/drm_debugfs.c | 157 --------------------= ---- drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 1 + drivers/gpu/drm/vc4/vc4_hdmi.c | 1 + include/drm/display/drm_hdmi_state_helper.h | 3 + 6 files changed, 162 insertions(+), 157 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 8b54069fa53a..00feb73e63d7 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -263,6 +263,9 @@ static void drm_bridge_connector_debugfs_init(struct dr= m_connector *connector, if (bridge->funcs->debugfs_init) bridge->funcs->debugfs_init(bridge, root); } + + if (bridge_connector->bridge_hdmi) + drm_hdmi_connector_debugfs_init(connector, root); } =20 static struct drm_connector_state * diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index ce17eeefc2da..8d5ee10ceb87 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: MIT =20 +#include #include =20 #include @@ -965,6 +966,159 @@ drm_hdmi_connector_mode_valid(struct drm_connector *c= onnector, } EXPORT_SYMBOL(drm_hdmi_connector_mode_valid); =20 +static ssize_t +audio_infoframe_read(struct file *filp, char __user *ubuf, size_t count, l= off_t *ppos) +{ + struct drm_connector_hdmi_infoframe *infoframe; + struct drm_connector *connector; + union hdmi_infoframe *frame; + u8 buf[HDMI_INFOFRAME_SIZE(AUDIO)]; + ssize_t len =3D 0; + + connector =3D filp->private_data; + mutex_lock(&connector->hdmi.infoframes.lock); + + infoframe =3D &connector->hdmi.infoframes.audio; + if (!infoframe->set) + goto out; + + frame =3D &infoframe->data; + len =3D hdmi_infoframe_pack(frame, buf, sizeof(buf)); + if (len < 0) + goto out; + + len =3D simple_read_from_buffer(ubuf, count, ppos, buf, len); + +out: + mutex_unlock(&connector->hdmi.infoframes.lock); + return len; +} + +static const struct file_operations audio_infoframe_fops =3D { + .owner =3D THIS_MODULE, + .open =3D simple_open, + .read =3D audio_infoframe_read, +}; + +static int create_hdmi_audio_infoframe_file(struct drm_connector *connecto= r, + struct dentry *parent) +{ + struct dentry *file; + + if (!connector->hdmi.funcs || + !connector->hdmi.funcs->audio.write_infoframe) + return 0; + + file =3D debugfs_create_file("audio", 0400, parent, connector, &audio_inf= oframe_fops); + if (IS_ERR(file)) + return PTR_ERR(file); + + return 0; +} + +#define DEFINE_INFOFRAME_FILE(_f) \ +static ssize_t _f##_read_infoframe(struct file *filp, \ + char __user *ubuf, \ + size_t count, \ + loff_t *ppos) \ +{ \ + struct drm_connector_hdmi_infoframe *infoframe; \ + struct drm_connector_state *conn_state; \ + struct drm_connector *connector; \ + union hdmi_infoframe *frame; \ + struct drm_device *dev; \ + u8 buf[HDMI_INFOFRAME_SIZE(MAX)]; \ + ssize_t len =3D 0; \ + \ + connector =3D filp->private_data; \ + dev =3D connector->dev; \ + \ + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); \ + \ + conn_state =3D connector->state; \ + infoframe =3D &conn_state->hdmi.infoframes._f; \ + if (!infoframe->set) \ + goto out; \ + \ + frame =3D &infoframe->data; \ + len =3D hdmi_infoframe_pack(frame, buf, sizeof(buf)); \ + if (len < 0) \ + goto out; \ + \ + len =3D simple_read_from_buffer(ubuf, count, ppos, buf, len); \ + \ +out: \ + drm_modeset_unlock(&dev->mode_config.connection_mutex); \ + return len; \ +} \ +\ +static const struct file_operations _f##_infoframe_fops =3D { \ + .owner =3D THIS_MODULE, \ + .open =3D simple_open, \ + .read =3D _f##_read_infoframe, \ +}; \ +\ +static int create_hdmi_## _f ## _infoframe_file(struct drm_connector *conn= ector, \ + struct dentry *parent) \ +{ \ + struct dentry *file; \ + \ + if (!connector->hdmi.funcs || \ + !connector->hdmi.funcs->_f.write_infoframe) \ + return 0; \ + file =3D debugfs_create_file(#_f, 0400, parent, connector, &_f ## _infofr= ame_fops); \ + if (IS_ERR(file)) \ + return PTR_ERR(file); \ + \ + return 0; \ +} + +DEFINE_INFOFRAME_FILE(avi); +DEFINE_INFOFRAME_FILE(hdmi); +DEFINE_INFOFRAME_FILE(hdr_drm); +DEFINE_INFOFRAME_FILE(spd); + +static int create_hdmi_infoframe_files(struct drm_connector *connector, + struct dentry *parent) +{ + int ret; + + ret =3D create_hdmi_audio_infoframe_file(connector, parent); + if (ret) + return ret; + + ret =3D create_hdmi_avi_infoframe_file(connector, parent); + if (ret) + return ret; + + ret =3D create_hdmi_hdmi_infoframe_file(connector, parent); + if (ret) + return ret; + + ret =3D create_hdmi_hdr_drm_infoframe_file(connector, parent); + if (ret) + return ret; + + ret =3D create_hdmi_spd_infoframe_file(connector, parent); + if (ret) + return ret; + + return 0; +} + +void drm_hdmi_connector_debugfs_init(struct drm_connector *connector, + struct dentry *root) +{ + struct dentry *dir; + + dir =3D debugfs_create_dir("infoframes", root); + if (IS_ERR(dir)) + return; + + create_hdmi_infoframe_files(connector, dir); +} +EXPORT_SYMBOL(drm_hdmi_connector_debugfs_init); + static int clear_infoframe(struct drm_connector *connector, const struct drm_connector_infoframe_funcs *funcs, const char *type) diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index ae1c6126c2c5..a72f9723d3a9 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c @@ -633,161 +633,6 @@ static const struct file_operations drm_connector_fop= s =3D { .write =3D connector_write }; =20 -static ssize_t -audio_infoframe_read(struct file *filp, char __user *ubuf, size_t count, l= off_t *ppos) -{ - struct drm_connector_hdmi_infoframe *infoframe; - struct drm_connector *connector; - union hdmi_infoframe *frame; - u8 buf[HDMI_INFOFRAME_SIZE(AUDIO)]; - ssize_t len =3D 0; - - connector =3D filp->private_data; - mutex_lock(&connector->hdmi.infoframes.lock); - - infoframe =3D &connector->hdmi.infoframes.audio; - if (!infoframe->set) - goto out; - - frame =3D &infoframe->data; - len =3D hdmi_infoframe_pack(frame, buf, sizeof(buf)); - if (len < 0) - goto out; - - len =3D simple_read_from_buffer(ubuf, count, ppos, buf, len); - -out: - mutex_unlock(&connector->hdmi.infoframes.lock); - return len; -} - -static const struct file_operations audio_infoframe_fops =3D { - .owner =3D THIS_MODULE, - .open =3D simple_open, - .read =3D audio_infoframe_read, -}; - -static int create_hdmi_audio_infoframe_file(struct drm_connector *connecto= r, - struct dentry *parent) -{ - struct dentry *file; - - if (!connector->hdmi.funcs || - !connector->hdmi.funcs->audio.write_infoframe) - return 0; - - file =3D debugfs_create_file("audio", 0400, parent, connector, &audio_inf= oframe_fops); - if (IS_ERR(file)) - return PTR_ERR(file); - - return 0; -} - -#define DEFINE_INFOFRAME_FILE(_f) \ -static ssize_t _f##_read_infoframe(struct file *filp, \ - char __user *ubuf, \ - size_t count, \ - loff_t *ppos) \ -{ \ - struct drm_connector_hdmi_infoframe *infoframe; \ - struct drm_connector_state *conn_state; \ - struct drm_connector *connector; \ - union hdmi_infoframe *frame; \ - struct drm_device *dev; \ - u8 buf[HDMI_INFOFRAME_SIZE(MAX)]; \ - ssize_t len =3D 0; \ - \ - connector =3D filp->private_data; \ - dev =3D connector->dev; \ - \ - drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); \ - \ - conn_state =3D connector->state; \ - infoframe =3D &conn_state->hdmi.infoframes._f; \ - if (!infoframe->set) \ - goto out; \ - \ - frame =3D &infoframe->data; \ - len =3D hdmi_infoframe_pack(frame, buf, sizeof(buf)); \ - if (len < 0) \ - goto out; \ - \ - len =3D simple_read_from_buffer(ubuf, count, ppos, buf, len); \ - \ -out: \ - drm_modeset_unlock(&dev->mode_config.connection_mutex); \ - return len; \ -} \ -\ -static const struct file_operations _f##_infoframe_fops =3D { \ - .owner =3D THIS_MODULE, \ - .open =3D simple_open, \ - .read =3D _f##_read_infoframe, \ -}; \ -\ -static int create_hdmi_## _f ## _infoframe_file(struct drm_connector *conn= ector, \ - struct dentry *parent) \ -{ \ - struct dentry *file; \ - \ - if (!connector->hdmi.funcs || \ - !connector->hdmi.funcs->_f.write_infoframe) \ - return 0; \ - file =3D debugfs_create_file(#_f, 0400, parent, connector, &_f ## _infofr= ame_fops); \ - if (IS_ERR(file)) \ - return PTR_ERR(file); \ - \ - return 0; \ -} - -DEFINE_INFOFRAME_FILE(avi); -DEFINE_INFOFRAME_FILE(hdmi); -DEFINE_INFOFRAME_FILE(hdr_drm); -DEFINE_INFOFRAME_FILE(spd); - -static int create_hdmi_infoframe_files(struct drm_connector *connector, - struct dentry *parent) -{ - int ret; - - ret =3D create_hdmi_audio_infoframe_file(connector, parent); - if (ret) - return ret; - - ret =3D create_hdmi_avi_infoframe_file(connector, parent); - if (ret) - return ret; - - ret =3D create_hdmi_hdmi_infoframe_file(connector, parent); - if (ret) - return ret; - - ret =3D create_hdmi_hdr_drm_infoframe_file(connector, parent); - if (ret) - return ret; - - ret =3D create_hdmi_spd_infoframe_file(connector, parent); - if (ret) - return ret; - - return 0; -} - -static void hdmi_debugfs_add(struct drm_connector *connector) -{ - struct dentry *dir; - - if (!(connector->connector_type =3D=3D DRM_MODE_CONNECTOR_HDMIA || - connector->connector_type =3D=3D DRM_MODE_CONNECTOR_HDMIB)) - return; - - dir =3D debugfs_create_dir("infoframes", connector->debugfs_entry); - if (IS_ERR(dir)) - return; - - create_hdmi_infoframe_files(connector, dir); -} - void drm_debugfs_connector_add(struct drm_connector *connector) { struct drm_device *dev =3D connector->dev; @@ -815,8 +660,6 @@ void drm_debugfs_connector_add(struct drm_connector *co= nnector) debugfs_create_file("output_bpc", 0444, root, connector, &output_bpc_fops); =20 - hdmi_debugfs_add(connector); - if (connector->funcs->debugfs_init) connector->funcs->debugfs_init(connector, root); } diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c b/drivers/gpu/drm/sun4i= /sun4i_hdmi_enc.c index e99f52ebb26f..e6c4f121ad0c 100644 --- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c +++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c @@ -292,6 +292,7 @@ static void sun4i_hdmi_connector_reset(struct drm_conne= ctor *connector) } =20 static const struct drm_connector_funcs sun4i_hdmi_connector_funcs =3D { + .debugfs_init =3D drm_hdmi_connector_debugfs_init, .detect =3D sun4i_hdmi_connector_detect, .fill_modes =3D drm_helper_probe_single_connector_modes, .reset =3D sun4i_hdmi_connector_reset, diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 17c8635c5afa..ea1f2013b20e 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -513,6 +513,7 @@ static void vc4_hdmi_connector_reset(struct drm_connect= or *connector) } =20 static const struct drm_connector_funcs vc4_hdmi_connector_funcs =3D { + .debugfs_init =3D drm_hdmi_connector_debugfs_init, .force =3D drm_atomic_helper_connector_hdmi_force, .fill_modes =3D drm_helper_probe_single_connector_modes, .reset =3D vc4_hdmi_connector_reset, diff --git a/include/drm/display/drm_hdmi_state_helper.h b/include/drm/disp= lay/drm_hdmi_state_helper.h index 13375bd0f4ae..596c57d9d250 100644 --- a/include/drm/display/drm_hdmi_state_helper.h +++ b/include/drm/display/drm_hdmi_state_helper.h @@ -3,6 +3,7 @@ #ifndef DRM_HDMI_STATE_HELPER_H_ #define DRM_HDMI_STATE_HELPER_H_ =20 +struct dentry; struct drm_atomic_commit; struct drm_connector; struct drm_connector_state; @@ -29,5 +30,7 @@ void drm_atomic_helper_connector_hdmi_force(struct drm_co= nnector *connector); enum drm_mode_status drm_hdmi_connector_mode_valid(struct drm_connector *connector, const struct drm_display_mode *mode); +void drm_hdmi_connector_debugfs_init(struct drm_connector *connector, + struct dentry *root); =20 #endif // DRM_HDMI_STATE_HELPER_H_ --=20 2.55.0 From nobody Fri Jul 24 21:30:17 2026 Received: from sender4-pp-f112.zoho.com (sender4-pp-f112.zoho.com [136.143.188.112]) (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 679E243B3DB for ; Fri, 24 Jul 2026 14:24:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.112 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903053; cv=pass; b=fLkYpPjc9Velb7cgDUt1yTmu6fbDDWLkpLCEWGoyAKd+oY9msNCh611DcBPf/jPLdl1kUrHck4quZ61W1dG98ljB3eSHe5rRXuKYLGmZV1l5ScHjfhOju901vvPG7HtvydkDmxemF+QKR9WeJwAdmou7avYTfuDXaM5vV5s5Rts= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784903053; c=relaxed/simple; bh=uZWx+LNGsmz6mrWAnsy+obBgIY91BMfTN9kMd8FU5KY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r69bkAKhNcFiPk7WIFpZUJ20vTbmZ5AAlOXQHTb+xC3Y+8kN0HhbJ8OXx4wC/SIwI2S1qAvVVC4E8x5mE8ujg9o5yyb/GCH2OCfQWgZbKGWRvIhnpiMLeP+MlcGlWJqgNW+gB4zTwnL0QnxKOPhpPhoCcd0imuxKDGsGYn1awOc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b=MFrbv+D6; arc=pass smtp.client-ip=136.143.188.112 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 (1024-bit key) header.d=collabora.com header.i=nicolas.frattaroli@collabora.com header.b="MFrbv+D6" ARC-Seal: i=1; a=rsa-sha256; t=1784903017; cv=none; d=zohomail.com; s=zohoarc; b=V3UKGrt3xpiyRUXW8515DLWmIrPB/9wHhYjz/TIS9bkgScArpuoaPVdfb7re50LrsNO8gBH68QvIj2JwF1O7Bg3C4GPomErn4i50rJbuhudUGhUvx1rD8s+ewR4YcKd6xTK0Es6W41WzLcGcwlLLXeSEAtk/U4yjUn6nM3T8gV8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784903017; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=/Bz0kOVpQ5EYH3MZETJm5OMDFXRozPcW4LBmQ5++M2c=; b=OtjtXHlpFPrwjBXHPiMJkalbu6/oXCMC0N4eL3FSMONZWTBXPiDIlm7rlQuv3RaBy6EMxtZASG5SFlZeexG794NTGjy9aFH9jWK9PyTRJU8bfpfRCYe2ItyrZXQeuMaV/UJly9r/XwFyfy4ufRxwUrTKuXNzeF7u/crgJ/zBV5c= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1784903017; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=/Bz0kOVpQ5EYH3MZETJm5OMDFXRozPcW4LBmQ5++M2c=; b=MFrbv+D6bfHq5zAanEVxswT9vF4rGP8+4iR8N25117wJdeAiPygrEO7Flx8QKmQv aeVMa7cCkV3T3+h6QfqSmNuBMKAvwti6wPbUeE8UZJbMAh7octC/alqLNbjTB31k3T0 kSn5V0705utbCDc07ORachjwD+Q4zkfiK8ZARVYU= Received: by mx.zohomail.com with SMTPS id 1784903014662276.19164388155514; Fri, 24 Jul 2026 07:23:34 -0700 (PDT) From: Nicolas Frattaroli Date: Fri, 24 Jul 2026 16:22:40 +0200 Subject: [PATCH v9 5/5] drm/display: hdmi-state-helper: Init SCDC debugfs for HDMI 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: <20260724-scdc-link-health-v9-5-bdda406d016d@collabora.com> References: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> In-Reply-To: <20260724-scdc-link-health-v9-0-bdda406d016d@collabora.com> To: Jani Nikula , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Daniel Stone , Hans Verkuil , Chen-Yu Tsai , Samuel Holland , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, kernel@collabora.com, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, Nicolas Frattaroli X-Mailer: b4 0.15.2 Initialise the SCDC debugfs file for connectors that call the HDMI state helper's debugfs_init helper. This makes all connectors that use the helper expose the scdc_status file in their connector debugfs. Acked-by: Maxime Ripard Signed-off-by: Nicolas Frattaroli --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index 8d5ee10ceb87..709524b40c26 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -13,6 +13,7 @@ #include #include #include +#include =20 /** * DOC: hdmi helpers @@ -1116,6 +1117,7 @@ void drm_hdmi_connector_debugfs_init(struct drm_conne= ctor *connector, return; =20 create_hdmi_infoframe_files(connector, dir); + drm_scdc_debugfs_init(connector, root); } EXPORT_SYMBOL(drm_hdmi_connector_debugfs_init); =20 --=20 2.55.0