From mboxrd@z Thu Jan 1 00:00:00 1970 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 A34544EA37A for ; Thu, 2 Jul 2026 14:46:37 +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=1783003599; cv=none; b=FYdfAXl+CCYgGdh5+zc+nQyJgrqBaRckNAO6CaCXPR7VozSDzPesjin58zWjHxy5mlaB+RetDgp4RMl+SB77te0eGfX7abSz6wOIPNB4uo7aJvLDbuls0VrvY/M41rYVM0ldHLhHkKOJB3Pjr0EPX1bwr/sHpJ0y1KbMKLkJRbs= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783003599; c=relaxed/simple; bh=uFU9sq3wcK+aVr4VsVljOiTboVowPyqp4I52GKzQlr8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AvZtQ6PBpyOsxwNqOVVOOaNZPfBnK3eLs+fCwnYyAxSLHlFqNhNLy8YXKWKob5TpG6bLwtYhRrtY0qr6YhooBs7nflEjEjhVbU5DgJSvfyawxKuw0G2KbqUzJh8eySYcoWbfVrrNJV7SyEzv4pyaFe995E90q3g2ur2jZlHLvxM= 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=fYkawl1j; 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="fYkawl1j" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1783003596; bh=uFU9sq3wcK+aVr4VsVljOiTboVowPyqp4I52GKzQlr8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=fYkawl1jPP2cKjFOkSldH7+dDgHcSW6MBHxwsRlOne+dHggv/p6yUjeodWpeNM70V wIPS+7ILRr6OY2ygeHkeYhvjYRkv7Iz29s4ii3767qcrVq66L+2UuopYhEnhW17c3K 9ywHEbn3iWssjJWkVZT9nRShqLL9smI+U8MBzVpto7vO9Cfpo1zCdIDi75xaxcxtib bO9MR7hTRKHzHvRMPKR5h276HPoQCgaN05C86TOL7zR2WIeZe+EpyQkxMdeAj/0uCr B9Ut6MpMxQxV0POC8vzEJilt55nIXNHaUDL973+NP9BgC5mCQaSjPfuweqv+prKS8E +zIFy30J4ptrA== 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 EE57417E1411; Thu, 2 Jul 2026 16:46:35 +0200 (CEST) From: Cristian Ciocaltea Date: Thu, 02 Jul 2026 17:46:19 +0300 Subject: [PATCH v8 06/39] drm/display: scdc-helper: Add helper to set SCDC version information 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: 7bit Message-Id: <20260702-dw-hdmi-qp-scramb-v8-6-d79890d00b6a@collabora.com> References: <20260702-dw-hdmi-qp-scramb-v8-0-d79890d00b6a@collabora.com> In-Reply-To: <20260702-dw-hdmi-qp-scramb-v8-0-d79890d00b6a@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 HDMI 2.x specs mandate that compliant Sink devices report their SCDC version in the Sink Version register, which reads as 1 on any SCDC-capable sink. There is also a dedicated Source Version register. Writing it is not compulsory, but the spec advises that compliant Source devices do so, in which case the value must be 1. Add drm_scdc_set_source_version() to follow this recommendation. The Sink Version register is read first, both to log the advertised SCDC version and to guard against non-conformant devices: a sink reporting version 0 is either not SCDC-version-aware or broken, so writing the source version gains nothing and risks upsetting such hardware. In that case the write is skipped. The source version is passed as a parameter rather than hardcoded, as future spec revisions may define additional rules for the allowable version values. The written value is additionally clamped to the sink's reported version so the source never advertises a version the sink does not understand. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/display/drm_scdc_helper.c | 46 ++++++++++++++++++++++++++++++- include/drm/display/drm_scdc_helper.h | 2 ++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/display/drm_scdc_helper.c b/drivers/gpu/drm/display/drm_scdc_helper.c index cb6632346aad..6d804ee19420 100644 --- a/drivers/gpu/drm/display/drm_scdc_helper.c +++ b/drivers/gpu/drm/display/drm_scdc_helper.c @@ -21,10 +21,11 @@ * DEALINGS IN THE SOFTWARE. */ +#include #include #include +#include #include -#include #include #include @@ -270,3 +271,46 @@ bool drm_scdc_set_high_tmds_clock_ratio(struct drm_connector *connector, return true; } EXPORT_SYMBOL(drm_scdc_set_high_tmds_clock_ratio); + +/** + * drm_scdc_set_source_version - set SCDC source version on the sink + * @connector: connector + * @ver: source version to advertise (per spec, 1) + * + * Reads the sink version for diagnostics and as a guard, then writes + * the source version unless the sink reports version 0. + * + * Returns: + * 0 on success or when skipped; a negative error code when either + * the read or the write failed. + */ +int drm_scdc_set_source_version(struct drm_connector *connector, u8 ver) +{ + u8 sink_ver; + int ret; + + ret = drm_scdc_readb(connector->ddc, SCDC_SINK_VERSION, &sink_ver); + if (ret) { + drm_scdc_dbg(connector, "Failed to read SCDC_SINK_VERSION: %d\n", ret); + return ret; + } + + drm_scdc_dbg(connector, "Sink reported SCDC ver. %u\n", sink_ver); + + /* + * Only advertise our source version to sinks that report a + * non-zero sink version. A sink reporting version 0 is either + * not SCDC-version-aware or non-conformant; writing the source + * version gains nothing and may upset broken hardware. + */ + if (sink_ver) { + ret = drm_scdc_writeb(connector->ddc, SCDC_SOURCE_VERSION, + min_t(u8, sink_ver, ver)); + if (ret) + drm_scdc_dbg(connector, + "Failed to write SCDC_SOURCE_VERSION: %d\n", ret); + } + + return ret; +} +EXPORT_SYMBOL(drm_scdc_set_source_version); diff --git a/include/drm/display/drm_scdc_helper.h b/include/drm/display/drm_scdc_helper.h index 34600476a1b9..90b0828364c2 100644 --- a/include/drm/display/drm_scdc_helper.h +++ b/include/drm/display/drm_scdc_helper.h @@ -77,4 +77,6 @@ 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, bool set); +int drm_scdc_set_source_version(struct drm_connector *connector, u8 ver); + #endif -- 2.54.0