From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 48F64CCA471 for ; Mon, 6 Oct 2025 08:30:48 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 9B18510E29F; Mon, 6 Oct 2025 08:30:47 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; unprotected) header.d=collabora.com header.i=@collabora.com header.b="UBwDr+xt"; dkim-atps=neutral Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) by gabe.freedesktop.org (Postfix) with ESMTPS id 899D210E29F for ; Mon, 6 Oct 2025 08:30:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1759739445; bh=zlwSATh/5kT82IyYMGoD9JazQnUFPKnHMv+Ym/DTQQo=; h=From:To:Cc:Subject:Date:From; b=UBwDr+xtF27gndCO8TGwpLhenkBfVXtlUTS+fn4SNAuqmMBMGq3mfkzm2DeOh/BS2 7YJh6XXXhBx3NosGCUXrxPAU1E4uEUL0PGqyFSzkAezcg/OGdW+SHn0nVRgsbLA07c ZFozzwZGTeKDaQRWgJXYctFxHVUAGFs+t8vOR33lbZ+DRzjpV/uuTD5g6IIV5cUA83 owj+Wab9BaW4Yp4957y8w8jcgDJJ6qvd9rB80qA6VUAM4c0ED1R52vWTlvuuWoZwQ+ fwPFHpNJV2qi1/3rH4hOE0cBwxzL9Z55AkTECa6vU1oYvMj9nHP7uIdf1+Z5HzDEK2 CQeTguOTGzBFg== Received: from localhost.localdomain (unknown [IPv6:2a02:2f08:ed09:4100:8ef5:95fb:24c7:d990]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: mvlad) by bali.collaboradmins.com (Postfix) with ESMTPSA id 7D87117E124A; Mon, 6 Oct 2025 10:30:44 +0200 (CEST) From: Marius Vlad To: dri-devel@lists.freedesktop.org Cc: dmitry.baryshkov@oss.qualcomm.com, jani.nikula@linux.intel.com, tzimmermann@suse.de, simona.vetter@ffwll.ch, derek.foreman@collabora.com, daniel.stone@collabora.com Subject: [PATCH v2] drm/connector: hdmi: Add a 'link bpc' property Date: Mon, 6 Oct 2025 11:30:43 +0300 Message-ID: <20251006083043.3115-1-marius.vlad@collabora.com> X-Mailer: git-send-email 2.47.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: Derek Foreman Add a way to know the actual bpc of a running link. Drivers might change the current bpc link value due to changes in mode line or refresh rates. For example when enabling VRR the underlying hardware might not be able sustain the same bandwidth for a particular mode line, and it might attempt to lower the bpc. Another example can be found when switching the color output format, part of YUV420 fallback. This means we might be displaying a stale bpc value although it was modified for different reasons -- like a refresh rate or an output color format. Introduces a new property 'link bpc' that user-space can use to get the current bpc value of a running link while in the same time allow user-space to set-up bpc using 'max bpc' property. An implementation for Weston [1] and a simple test for i-g-t [2] have been added. Signed-off-by: Derek Foreman Signed-off-by: Marius Vlad [1] https://gitlab.freedesktop.org/wayland/weston/-/merge_requests/1850 [2] https://lists.freedesktop.org/archives/igt-dev/2025-October/097061.html --- v1: - https://lore.kernel.org/dri-devel/20250801101750.1726-1-marius.vlad@collabora.com/T/#u v2: - replace return with EBUSY if connector already exists (Dmitry) - add i-g-t test and an implementation for Weston (Dmitry) - re-wording patch description (Jani) drivers/gpu/drm/drm_atomic_uapi.c | 5 +++++ drivers/gpu/drm/drm_connector.c | 25 +++++++++++++++++++++++++ include/drm/drm_connector.h | 8 ++++++++ 3 files changed, 38 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c index 85dbdaa4a2e2..15c5ad7ddfb5 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -776,6 +776,9 @@ static int drm_atomic_connector_set_property(struct drm_connector *connector, fence_ptr); } else if (property == connector->max_bpc_property) { state->max_requested_bpc = val; + } else if (property == connector->link_bpc_property) { + drm_dbg_kms(dev, "only drivers can set link bpc property. Use max bpc instead\n"); + return -EINVAL; } else if (property == connector->privacy_screen_sw_state_property) { state->privacy_screen_sw_state = val; } else if (property == connector->broadcast_rgb_property) { @@ -861,6 +864,8 @@ drm_atomic_connector_get_property(struct drm_connector *connector, *val = 0; } else if (property == connector->max_bpc_property) { *val = state->max_requested_bpc; + } else if (property == connector->link_bpc_property) { + *val = state->hdmi.output_bpc; } else if (property == connector->privacy_screen_sw_state_property) { *val = state->privacy_screen_sw_state; } else if (property == connector->broadcast_rgb_property) { diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c index 272d6254ea47..7cc99cd16e20 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -542,6 +542,27 @@ int drmm_connector_init(struct drm_device *dev, } EXPORT_SYMBOL(drmm_connector_init); +static int +drm_connector_attach_link_bpc_property(struct drm_connector *connector, + int max) +{ + struct drm_device *dev = connector->dev; + struct drm_property *prop; + + if (connector->link_bpc_property) + return -EBUSY; + + prop = drm_property_create_range(dev, 0, "link bpc", 8, max); + if (!prop) + return -ENOMEM; + + connector->link_bpc_property = prop; + + drm_object_attach_property(&connector->base, prop, max); + + return 0; +} + /** * drmm_connector_hdmi_init - Init a preallocated HDMI connector * @dev: DRM device @@ -618,6 +639,10 @@ int drmm_connector_hdmi_init(struct drm_device *dev, drm_connector_attach_max_bpc_property(connector, 8, max_bpc); connector->max_bpc = max_bpc; + ret = drm_connector_attach_link_bpc_property(connector, max_bpc); + if (ret) + return ret; + if (max_bpc > 8) drm_connector_attach_hdr_output_metadata_property(connector); diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 8f34f4b8183d..4a50198aa7c0 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -2079,6 +2079,14 @@ struct drm_connector { */ struct drm_property *max_bpc_property; + /** + * @link_bpc_property: Current connector link bpc set by the driver + * + * This property can be used to retrieve the current link bpc from + * connector_state::hdmi:output_bpc + */ + struct drm_property *link_bpc_property; + /** @privacy_screen: drm_privacy_screen for this connector, or NULL. */ struct drm_privacy_screen *privacy_screen; -- 2.47.2