From nobody Thu Sep 17 16:53:14 2026 Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C65D7378D70 for ; Sat, 8 Aug 2026 09:58:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183102; cv=none; b=M+NVe4g97EJh2pacKUz3ju9meYE/6pR7ad4gjGsDdy3xrb6/ww8L2tNmq30J+vzzKsBGNk4DeaceZiy9UBu1jK8VKnZff13B/6zK0KwA2QplG4k0sfZzifxo7aCHcvVdbH4XijerbzKCKwdh8ZiP4oXCaYoW5IsnXss8YE9EK3A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183102; c=relaxed/simple; bh=n/uj2D8CCUzWJB9MV7Q62wQiyZzT5CTEqMphoJX5WTo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ne6jNWCgkCOJ6ulxdtHNqTrxlfTObQt4fMs0MNTopWIRa3CvEp4gqPxb4ha1Kki6T3NzRTvajbOmDJoGaJHZ+9FWuzad0FG4pX2x7uiRU4NG8FhfbFIebLf/v0XqfjXZ/QEU9X1KXjNwERMCyraNLklvZo3RkbXovXqWBgxecbI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BvmSSc5K; arc=none smtp.client-ip=209.85.221.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BvmSSc5K" Received: by mail-wr1-f44.google.com with SMTP id ffacd0b85a97d-47fe45db360so32560f8f.2 for ; Sat, 08 Aug 2026 02:58:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786183099; x=1786787899; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=LUzFgsK+uW+0joiMTH75XmXXqtMHA5YYrGPdzifhZ7c=; b=BvmSSc5KZvvvdtmc1HYRtZsIXYvJOG3Hv8+H5OQmnQHOckPbHypQaMbUlP5LynUTCW AZp8NW3rvJMrZ3Z4jxn/qTps0bsNFmi14t+os/SkK5gKt/DeMYOLygElPZ+QsxWFkKaw cAewdpGXbxRKJ5Hs4SzDztwnPk0zb2ACZMmU4wsvCbqd7rm9I2ZLRc/uwp1w1R37mPJ0 i5W81vioGIcKvZ0El+nxiOHxMiiCdPRSWvj5cp+7Vj70vwU/oX9nC4oXHSVh6jmK1GFw WTYKGqsX071dJ0wFgCbHVAuPh75o4az7q2j+2JQsomMp4T599S4DttE6Hxzrtlp81RGx Sbpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786183099; x=1786787899; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=LUzFgsK+uW+0joiMTH75XmXXqtMHA5YYrGPdzifhZ7c=; b=jhkiL/+3lap6AZgBKoiJljy20K4WiasIyTvlyPBnSsDNjWtzgrR8MlTrZnm7y3KyIi cue6f9Vkjg8iqB7nYNSafejcANbaHKAwb2Vj5EjtLQsOEainXUEvsDbPXvi1+LtBONH8 7GJftH0vRE78pO3LWsp3c80AyDIcERkXJ9bJ7UZlfg4QffrrTxjM28bs96oSIjKMf3BI P3fqAMjMIDPZy30CaePgiky4HsgUCdqOv1S3Gbo6tZIT46FEnODY+lobBuuS+8TyX9zm fDl/DRcNP6NTd10HxHVPxo25OBKFVScw4848gBDjt9pyWsKMIaI6pohTuN8T9gklCEqv k1aA== X-Forwarded-Encrypted: i=1; AHgh+RpAqGlIAbOm/2VlfN66Fya8F7yTaCIkEGyArF1aCrQFI5sCgW6alqY/tQBPLBRdcHbQkQ4rA3ODFkgiVpI=@vger.kernel.org X-Gm-Message-State: AOJu0YwypBGALOX5IF4VU8zkSs/Pc+MwKi+8CvQ6UgrN3Bp/OcSOFisJ rfSzmEKriIf5sRfSMZW0X5nq+wkJEBc1yMvrgSQvfoUwCjtQSqlCZh0R X-Gm-Gg: AR+sD12/GWo8ZFAmsMG4k/LYy6R2HX0jIfxi64IeZTJ9h/cuokzxYKipU4IMHK5rX7E KSEZ9ZZD5YtDg3kNVeijgqilZMiAg6GZKSi/4eIfnHE6Lt01HrVRgJ5eRlnHWa8FYIcxYmMKQbR OhMF0qxNSXSvyhe0SYmmlpDFgiaoT9JKsqlaNdHSBA+THWKit6UxcTWOjPV1yYNqG8JqA8766Dx DWc0CI5Ix5W9y4W5LOYkhJz2L+Y7razpLjk6zdL/cWioJ06rdJ+y0h5WEuv6DM/50CH05Jji5vs NV/0aBU83CkRpMe2kYPQt5vxRQ1DSSErOsvqJ+zNKkC6pL5Bu+bVpX7lb71M5bvMz94XZHu3JEe 4CWIxgHpDux1VG//YWSvRqqo7UF/q1BwBFlvt53g/AezlAK7+XobrZydAaLBYRW35KmEjEp/qHY OrhJE4Xo55aI0WWPk52qy8k7JOzoQzAXJCa8BJU/rum/wYZOyFrFrX6BpMGD3v1Ebkc8hhlHQYd WZikwPT9zfgVY9texzS26fHQlywcQFMraa6Dwvyueh+gT7LTp+7x8P34qav1qLZ6YF49Q== X-Received: by 2002:a05:6000:410e:b0:47f:e8af:7687 with SMTP id ffacd0b85a97d-47fec4ea9f6mr15258182f8f.1.1786183098980; Sat, 08 Aug 2026 02:58:18 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8E20009911270F4BEC2300.dsl.pool.telekom.hu. [2001:4c4e:1b8e:2000:9911:270f:4bec:2300]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480020be8f3sm13255725f8f.0.2026.08.08.02.58.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Aug 2026 02:58:18 -0700 (PDT) From: Igor Paunovic To: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sebastian Reichel , Cristian Ciocaltea , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dmitry Baryshkov , Sandy Huang , =?UTF-8?q?Heiko=20St=C3=BCbner?= , Andy Yan , Jani Nikula , Rodrigo Vivi , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Imre Deak , Ankit Nautiyal , Igor Paunovic Subject: [PATCH 1/5] drm/dp: Add drm_dp_hdr_metadata_infoframe_sdp_pack() Date: Sat, 8 Aug 2026 11:57:20 +0200 Message-ID: <20260808095749.9428-2-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260808095749.9428-1-royalnet026@gmail.com> References: <20260808095749.9428-1-royalnet026@gmail.com> 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 i915 packs HDR static metadata into an HDR Metadata InfoFrame SDP (DP 1.4a spec, Table 2-100 and Table 2-101) with a driver-private helper, intel_dp_hdr_metadata_infoframe_sdp_pack(). Nothing in it is i915 specific: it converts a generic struct hdmi_drm_infoframe into a generic struct dp_sdp. Move it to drm_dp_helper.c as drm_dp_hdr_metadata_infoframe_sdp_pack(), next to drm_dp_vsc_sdp_pack(), and convert i915 to the new helper. The Synopsys DesignWare DisplayPort bridge driver (dw-dp) needs to send the same SDP to support HDR and should not have to duplicate the packing code. The helper takes a struct drm_device pointer in place of the i915 display pointer for its two debug messages, and an i915-specific comment about GEN11+ GMP register sizes is dropped. No functional change. Signed-off-by: Igor Paunovic Acked-by: Jani Nikula --- drivers/gpu/drm/display/drm_dp_helper.c | 88 +++++++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.c | 84 +---------------------- include/drm/display/drm_dp_helper.h | 4 ++ 3 files changed, 95 insertions(+), 81 deletions(-) diff --git a/drivers/gpu/drm/display/drm_dp_helper.c b/drivers/gpu/drm/disp= lay/drm_dp_helper.c index 9c31e14cc413..7b3b079403c4 100644 --- a/drivers/gpu/drm/display/drm_dp_helper.c +++ b/drivers/gpu/drm/display/drm_dp_helper.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -3672,6 +3673,93 @@ ssize_t drm_dp_vsc_sdp_pack(const struct drm_dp_vsc_= sdp *vsc, } EXPORT_SYMBOL(drm_dp_vsc_sdp_pack); =20 +/** + * drm_dp_hdr_metadata_infoframe_sdp_pack() - pack HDR Metadata InfoFrame = SDP + * @dev: DRM device + * @drm_infoframe: HDMI DRM infoframe carrying the HDR static metadata + * @sdp: valid handle to the generic dp_sdp which will be packed + * @size: valid size of the passed sdp handle + * + * Pack a CTA-861 Dynamic Range and Mastering infoframe into an HDR + * Metadata InfoFrame SDP, as defined in DP 1.4a spec, Table 2-100 and + * Table 2-101. + * + * Returns: length of sdp on success and error code on failure + */ +ssize_t drm_dp_hdr_metadata_infoframe_sdp_pack(struct drm_device *dev, + const struct hdmi_drm_infoframe *drm_infoframe, + struct dp_sdp *sdp, + size_t size) +{ + size_t length =3D sizeof(struct dp_sdp); + const int infoframe_size =3D HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFR= AME_SIZE; + unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE]; + ssize_t len; + + if (size < length) + return -ENOSPC; + + memset(sdp, 0, size); + + len =3D hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf)); + if (len < 0) { + drm_dbg_kms(dev, + "buffer size is smaller than hdr metadata infoframe\n"); + return -ENOSPC; + } + + if (len !=3D infoframe_size) { + drm_dbg_kms(dev, "wrong static hdr metadata size\n"); + return -ENOSPC; + } + + /* + * Set up the infoframe sdp packet for HDR static metadata. + * Prepare VSC Header for SU as per DP 1.4a spec, + * Table 2-100 and Table 2-101 + */ + + /* Secondary-Data Packet ID, 00h for non-Audio INFOFRAME */ + sdp->sdp_header.HB0 =3D 0; + /* + * Packet Type 80h + Non-audio INFOFRAME Type value + * HDMI_INFOFRAME_TYPE_DRM: 0x87 + * - 80h + Non-audio INFOFRAME Type value + * - InfoFrame Type: 0x07 + * [CTA-861-G Table-42 Dynamic Range and Mastering InfoFrame] + */ + sdp->sdp_header.HB1 =3D drm_infoframe->type; + /* + * Least Significant Eight Bits of (Data Byte Count =E2=80=93 1) + * infoframe_size - 1 + */ + sdp->sdp_header.HB2 =3D 0x1D; + /* INFOFRAME SDP Version Number */ + sdp->sdp_header.HB3 =3D (0x13 << 2); + /* CTA Header Byte 2 (INFOFRAME Version Number) */ + sdp->db[0] =3D drm_infoframe->version; + /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */ + sdp->db[1] =3D drm_infoframe->length; + /* + * Copy HDMI_DRM_INFOFRAME_SIZE size from a buffer after + * HDMI_INFOFRAME_HEADER_SIZE + */ + BUILD_BUG_ON(sizeof(sdp->db) < HDMI_DRM_INFOFRAME_SIZE + 2); + memcpy(&sdp->db[2], &buf[HDMI_INFOFRAME_HEADER_SIZE], + HDMI_DRM_INFOFRAME_SIZE); + + /* + * Size of DP infoframe sdp packet for HDR static metadata consists of + * - DP SDP Header(struct dp_sdp_header): 4 bytes + * - Two Data Blocks: 2 bytes + * CTA Header Byte2 (INFOFRAME Version Number) + * CTA Header Byte3 (Length of INFOFRAME) + * - HDMI_DRM_INFOFRAME_SIZE: 26 bytes + */ + return sizeof(struct dp_sdp_header) + 2 + HDMI_DRM_INFOFRAME_SIZE; +} +EXPORT_SYMBOL(drm_dp_hdr_metadata_infoframe_sdp_pack); + /** * drm_dp_get_pcon_max_frl_bw() - maximum frl supported by PCON * @dpcd: DisplayPort configuration data diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915= /display/intel_dp.c index 6e3fa6662cbe..093a3b7961f7 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5157,84 +5157,6 @@ static ssize_t intel_dp_as_sdp_pack(const struct drm= _dp_as_sdp *as_sdp, return length; } =20 -static ssize_t -intel_dp_hdr_metadata_infoframe_sdp_pack(struct intel_display *display, - const struct hdmi_drm_infoframe *drm_infoframe, - struct dp_sdp *sdp, - size_t size) -{ - size_t length =3D sizeof(struct dp_sdp); - const int infoframe_size =3D HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFR= AME_SIZE; - unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE]; - ssize_t len; - - if (size < length) - return -ENOSPC; - - memset(sdp, 0, size); - - len =3D hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf)); - if (len < 0) { - drm_dbg_kms(display->drm, - "buffer size is smaller than hdr metadata infoframe\n"); - return -ENOSPC; - } - - if (len !=3D infoframe_size) { - drm_dbg_kms(display->drm, "wrong static hdr metadata size\n"); - return -ENOSPC; - } - - /* - * Set up the infoframe sdp packet for HDR static metadata. - * Prepare VSC Header for SU as per DP 1.4a spec, - * Table 2-100 and Table 2-101 - */ - - /* Secondary-Data Packet ID, 00h for non-Audio INFOFRAME */ - sdp->sdp_header.HB0 =3D 0; - /* - * Packet Type 80h + Non-audio INFOFRAME Type value - * HDMI_INFOFRAME_TYPE_DRM: 0x87 - * - 80h + Non-audio INFOFRAME Type value - * - InfoFrame Type: 0x07 - * [CTA-861-G Table-42 Dynamic Range and Mastering InfoFrame] - */ - sdp->sdp_header.HB1 =3D drm_infoframe->type; - /* - * Least Significant Eight Bits of (Data Byte Count =E2=80=93 1) - * infoframe_size - 1 - */ - sdp->sdp_header.HB2 =3D 0x1D; - /* INFOFRAME SDP Version Number */ - sdp->sdp_header.HB3 =3D (0x13 << 2); - /* CTA Header Byte 2 (INFOFRAME Version Number) */ - sdp->db[0] =3D drm_infoframe->version; - /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */ - sdp->db[1] =3D drm_infoframe->length; - /* - * Copy HDMI_DRM_INFOFRAME_SIZE size from a buffer after - * HDMI_INFOFRAME_HEADER_SIZE - */ - BUILD_BUG_ON(sizeof(sdp->db) < HDMI_DRM_INFOFRAME_SIZE + 2); - memcpy(&sdp->db[2], &buf[HDMI_INFOFRAME_HEADER_SIZE], - HDMI_DRM_INFOFRAME_SIZE); - - /* - * Size of DP infoframe sdp packet for HDR static metadata consists of - * - DP SDP Header(struct dp_sdp_header): 4 bytes - * - Two Data Blocks: 2 bytes - * CTA Header Byte2 (INFOFRAME Version Number) - * CTA Header Byte3 (Length of INFOFRAME) - * - HDMI_DRM_INFOFRAME_SIZE: 26 bytes - * - * Prior to GEN11's GMP register size is identical to DP HDR static metad= ata - * infoframe size. But GEN11+ has larger than that size, write_infoframe - * will pad rest of the size. - */ - return sizeof(struct dp_sdp_header) + 2 + HDMI_DRM_INFOFRAME_SIZE; -} - static void intel_write_dp_sdp(struct intel_encoder *encoder, const struct intel_crtc_state *crtc_state, unsigned int type) @@ -5253,9 +5175,9 @@ static void intel_write_dp_sdp(struct intel_encoder *= encoder, len =3D drm_dp_vsc_sdp_pack(&crtc_state->infoframes.vsc, &sdp); break; case HDMI_PACKET_TYPE_GAMUT_METADATA: - len =3D intel_dp_hdr_metadata_infoframe_sdp_pack(display, - &crtc_state->infoframes.drm.drm, - &sdp, sizeof(sdp)); + len =3D drm_dp_hdr_metadata_infoframe_sdp_pack(display->drm, + &crtc_state->infoframes.drm.drm, + &sdp, sizeof(sdp)); break; case DP_SDP_ADAPTIVE_SYNC: len =3D intel_dp_as_sdp_pack(&crtc_state->infoframes.as_sdp, &sdp, diff --git a/include/drm/display/drm_dp_helper.h b/include/drm/display/drm_= dp_helper.h index ab16c1be3900..c158628f0d38 100644 --- a/include/drm/display/drm_dp_helper.h +++ b/include/drm/display/drm_dp_helper.h @@ -32,6 +32,7 @@ struct drm_device; struct drm_dp_aux; struct drm_panel; +struct hdmi_drm_infoframe; =20 bool drm_dp_channel_eq_ok(const u8 link_status[DP_LINK_STATUS_SIZE], int lane_count); @@ -1029,6 +1030,9 @@ int drm_dp_bw_channel_coding_efficiency(bool is_uhbr); int drm_dp_max_dprx_data_rate(int max_link_rate, int max_lanes); =20 ssize_t drm_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc, struct dp_sd= p *sdp); +ssize_t drm_dp_hdr_metadata_infoframe_sdp_pack(struct drm_device *dev, + const struct hdmi_drm_infoframe *drm_infoframe, + struct dp_sdp *sdp, size_t size); int drm_dp_link_symbol_cycles(int lane_count, int pixels, int dsc_slice_co= unt, int bpp_x16, int symbol_size, bool is_mst); =20 --=20 2.43.0 From nobody Thu Sep 17 16:53:14 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BFC3A2EA749 for ; Sat, 8 Aug 2026 09:58:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183104; cv=none; b=dYsP1kaDBmdq73BQSAcR2HznhNg5DfKt5hG7NF0OBOH3fAUTXaevOE3IwRV+x91TC//OlP/wRfmuzUssi2PwuqrGyf8F/X4UvTw/T7ETWtXMFYqpUsFnIxKp5Oh1qK9CX0vHFjN7yfjJVqkDrWIgnyeyey3qXOhlKHom85APKqc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183104; c=relaxed/simple; bh=OptPU5YH44L4OSi5W34FeHPSEeQJS89xpSwp6Or23yg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c+hCzCp9rQzIbnp9M/tkSRnPkTDVKyOAogvoPgT1OTAhOYsHCOERvfUkVQcQlC8fqBGzd78qhf256AEkxTy1dWUcVMIXtxLUv6Su4sKkxum0l9Sqx/xZ8/ZCu8MuhVKpMuloy+Ml8FtAp8WXv53aiFrGRsoVozzTbnhfI765hz4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BryR4MZl; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BryR4MZl" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-49967f24eedso6475e9.0 for ; Sat, 08 Aug 2026 02:58:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786183101; x=1786787901; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=g22IUbt8ZLLCFwaMoIL3xYIHr/pNgXlbdNwWp0/GjnE=; b=BryR4MZlNGG4GWriBeIWOTesFyX6XnRzrlgfjWH4neEKcLS7HQf7EyupXlwHVKOHfa C1izmz/gnFd1anhsnrtNTmbOeLFNK6BQryugxV5+3aUkZ+b0ygEMbDzhlJttt4C9/JDf 77jVRs96fi9OU2vfdQ4LgiSpZNFve3f6UZ4yLsEYW/Pr50m6f35hMeV/WosZDS0HXTV5 wBVBOLQdb6OaBAwzu8y2tCiLl2q8BtDM2DhVlMyDLi5NvK0mg/UsF4bRIxVLQ6iWh4OL GhSXySQ+RnhRXnO3hObmPyeMDdgYJlAexYPwSot1uR+xP52fR8MfcbGsQ7jqVR9OggYB foog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786183101; x=1786787901; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=g22IUbt8ZLLCFwaMoIL3xYIHr/pNgXlbdNwWp0/GjnE=; b=ZzfmI9fipgN/JZSG1rmh6WiqxtBqshi/mS3Lrb7hdGE8lMBcV9NZxYycvIBlPOBOhd 3jGmPSqKtY6YA6xZsKMauPjWV6TvR+5rPRuC7TILGe3MxL36fuHBV8OU1Vin7pjrS3EP r+sOPdpRFOnGqzPgeBWjkAJUimVBJf+M7F+Dt54Gk25SFWBO1s1tJml/C0Zt9uzdhxft LbrcW2n3rVo5txNdzBFFal5URPEitZeqPihb50xvh6ZSfZuBMJuWlPw+pICjoQ30buOy j0giZslmpgac49Kt2YoYJCtxfQVQWDup1FYpipGiJHXZkKp9+gM1l9tQSj6+63aSWvV4 xJDw== X-Forwarded-Encrypted: i=1; AHgh+RpGHyg20Z48h+xE1rWtwQoI91x/fdKx6+ONrXhjqCC4tICRVXJdNlQvwpKVzfk9KcF3Kl8D4EBRGfKNAW0=@vger.kernel.org X-Gm-Message-State: AOJu0YzB3x2RQVnBdNYf67AGpBx6j6Hw2wBXB1UTmpLhKSoGJ3nsGYx8 qREqt35vw+yuI8nElIxCPa4M7CJlw7vuTF1lMEHiOQ/nWc21tGxyvrGSkgzIJsPh X-Gm-Gg: AR+sD12Ybazr+PhGMJ7XnVzNKtvmWeyQTLXMiOtflbXCzC7Q6h9jcsDjjuBO+mbZ1pV sOCfLY6k5JbYNKrp7pXwhssFnCA2hQCEyPG69iv5buuDFOinN8LWHgzoPAVjfC8HMnDqvfS5/af 8vOR8X+S+sTpEqHwSHAFhzo7Nq8J21Yjp+/kPdpeXYAqJsz9eqIgu+sIccvsojQ4JeW9oUDhnV3 nlHOP3adrt+Ss6AF7BqRyx2n3tYr7zpd3l/vQ6nsbYwPKUoDM3EIcm2jOhoIbs50ZBpDVV+tZZn 2DK3gS5SnZzIEzZ7ZuMhwMFtCAWwlRbQ+DxcCqnqwo/rcMdhnxSJ5re/2Ow/tMHf/15XMgCRXqc MOQaHU3KKGm0X1mLAUU5n7p81NgYu14tjXzT6Cis3bIphFHMWkXiyVwPVqu6KfggH5X2j8f3tuw YJ1ubuMDMRr3NLM10CQ2CXV0ByAO26Oc2zQJxRXJGutiCuZDmD3OwjOvksIs3/EOYbUN3qtJJLl vhfvmwbZe4yDttWYxZOsClwXOcdVck5Y9qtp780NEbL/8gdpuzC3BinggLv73z/Qxpfow== X-Received: by 2002:a05:600c:4514:b0:493:f42e:1b3f with SMTP id 5b1f17b1804b1-4994e7c7360mr190359775e9.3.1786183101054; Sat, 08 Aug 2026 02:58:21 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8E20009911270F4BEC2300.dsl.pool.telekom.hu. [2001:4c4e:1b8e:2000:9911:270f:4bec:2300]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480020be8f3sm13255725f8f.0.2026.08.08.02.58.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Aug 2026 02:58:20 -0700 (PDT) From: Igor Paunovic To: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sebastian Reichel , Cristian Ciocaltea , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dmitry Baryshkov , Sandy Huang , =?UTF-8?q?Heiko=20St=C3=BCbner?= , Andy Yan , Jani Nikula , Rodrigo Vivi , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Imre Deak , Ankit Nautiyal , Igor Paunovic Subject: [PATCH 2/5] drm/display: bridge-connector: Preserve max bpc across connector reset Date: Sat, 8 Aug 2026 11:57:21 +0200 Message-ID: <20260808095749.9428-3-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260808095749.9428-1-royalnet026@gmail.com> References: <20260808095749.9428-1-royalnet026@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" drm_connector_attach_max_bpc_property() initializes max_requested_bpc and max_bpc in the connector state, but nothing restores them when the connector state is later thrown away and re-created: drm_bridge_connector_create_state() returns a zeroed state for non-HDMI bridge connectors, and drm_mode_config_reset() installs such a fresh state on every connector that implements &drm_connector_funcs.atomic_create_state instead of a .reset hook. This matters because drivers can attach the property before drm_mode_config_reset() runs. Rockchip, for example, binds its component drivers (which create connectors and attach properties) before calling drm_mode_config_reset(). After that reset, max_requested_bpc is 0, so drm_atomic_connector_check() computes max_bpc =3D min(info->bpc ?: 8, 0) =3D 0. Any driver that filters output formats on conn_state->max_bpc then rejects every format, and clients that never set the "max bpc" property - fbcon in particular - end up with a black screen. meson already attaches the property on a drm_bridge_connector before drm_mode_config_reset() and so already boots with max_requested_bpc =3D 0 today. dw-hdmi's format negotiation does consume the value there, but meson attaches the property with a maximum of 8 and the 8-bit fallback formats are not gated on it, so negotiation yields the same result for 0 and 8 - the change is a no-op for meson. HDMI bridge connectors are immune: drm_bridge_connector_create_state() calls __drm_atomic_helper_connector_hdmi_state_init(), which initializes both fields from connector->max_bpc. amdgpu likewise re-initializes max_requested_bpc in its own .reset implementation. Non-HDMI bridge connectors have no equivalent. Mirror the HDMI helper on the non-HDMI path: record the upper attach limit in connector->max_bpc (drmm_connector_hdmi_init() already stores the same value there) and restore max_requested_bpc and max_bpc from it in drm_bridge_connector_create_state() whenever the "max bpc" property is attached. Connectors without the property behave exactly as before. Signed-off-by: Igor Paunovic --- drivers/gpu/drm/display/drm_bridge_connector.c | 6 +++++- drivers/gpu/drm/drm_connector.c | 5 +++++ 2 files changed, 10 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 632cc3ae3b54..d33c4fc42fbf 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -282,9 +282,13 @@ drm_bridge_connector_create_state(struct drm_connector= *connector) if (IS_ERR(conn_state)) return conn_state; =20 - if (bridge_connector->bridge_hdmi) + if (bridge_connector->bridge_hdmi) { __drm_atomic_helper_connector_hdmi_state_init(connector, conn_state); + } else if (connector->max_bpc_property) { + conn_state->max_requested_bpc =3D connector->max_bpc; + conn_state->max_bpc =3D connector->max_bpc; + } =20 return conn_state; } diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 8b4baed060f3..0400a6a92e2b 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -2866,6 +2866,10 @@ EXPORT_SYMBOL(drm_connector_set_link_status_property= ); * @max: The maximum bit depth supported by the connector. * * This is used to add support for limiting the bit depth on a connector. + * @max is also recorded in &drm_connector.max_bpc, so that + * &drm_connector_funcs.atomic_create_state and &drm_connector_funcs.reset + * implementations can restore the property default when re-creating the + * connector state. * * Returns: * Zero on success, negative errno on failure. @@ -2888,6 +2892,7 @@ int drm_connector_attach_max_bpc_property(struct drm_= connector *connector, drm_object_attach_property(&connector->base, prop, max); connector->state->max_requested_bpc =3D max; connector->state->max_bpc =3D max; + connector->max_bpc =3D max; =20 return 0; } --=20 2.43.0 From nobody Thu Sep 17 16:53:14 2026 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E840537C927 for ; Sat, 8 Aug 2026 09:58:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183106; cv=none; b=KDVcUmo8/coBsyvyxelF33YWCmLT0iAA1VNAC52Bn6aDW6VmtFXVeKtzskaDdJduCTP5VBHcZdWnWgDb6Wk1bEnezKMgXYGeNnoJjU3jz69vtCVRPg9UG+odL3T3Nlj6ymblSxR/jRpINeqUcN8190XU/GS3AIv01A3k5gncrLw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183106; c=relaxed/simple; bh=DQ6b8XRFFKt9UMJcIHgpSIL79qneL725jiudg5+394A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tz4UPts2tp15QGm95XVOFI2ZPs3g4a6VdD2bNhkPxpCO6nK35DKZt82z030JCQQZ/wsx5/dOI9KowXCvN1BJV18VVSR1cZYkJcE1xEXbuAqas6OdHK64dKPEqQM8DSxXn9o0cSYXnatwODKuP4MU09bWm14Fu8lA9xNzh5K8NWw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZgGQ/Rts; arc=none smtp.client-ip=209.85.221.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZgGQ/Rts" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-47df6a5655aso40641f8f.1 for ; Sat, 08 Aug 2026 02:58:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786183103; x=1786787903; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=bygF4+CGk1HszXnKQxQkJUMmXmQwnL2yRQrBPqNom6w=; b=ZgGQ/RtsO4lkNizRats3AC5PjhkBE5LfhZqd3snRXlzI2pVZtLb+KeXcHTASie+0sc r2aZmU2pZ54bhU97+22EFqIMEFoXuGWvJJn5dhlZoJteDArTtovWsykaE93HvR0Qwut0 IBTWctP84yQuhZoMQlGkYIqT7XKACYTsLwdiBDUbJWY3Cwy/8j7dzKk4dwUouTIXnkgg HH+NnKi6HOnQLb43CU3E5QU0Rqc+/IV5pMIUJdmS/my9XnT16akjFyPt9IEwbigCO0o0 Q1M3/STBSBosHQbRYbpO52Z7L6rZHnhYL//F4ifVWrYULYzrxQlTaCEFKWVuEcwExQkr dq4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786183103; x=1786787903; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=bygF4+CGk1HszXnKQxQkJUMmXmQwnL2yRQrBPqNom6w=; b=cFJZZAcCrOSvLQHT8jzPN+XeN4M2GtYSrcSQzhVelMhtBlnQQNqb8nbG30Sd2DwdDh 23EcvHj+A0+EXjDPy7FcpH3yvcrnQhnk/bKrkMiSL7M/fco9ANqLeuFH+KvmkoA3X7l7 BMdRTaMrf8M6ygNCN9WW8h7YnnSepMnoKhFi8ZVuKKw9qNyPg1OpWSoTGxZ1h2Sqy5bH 19YNOwSNQOv9gNSIit+dR5w/8UFQetE/nxxLxHZNQlfC7iFt5r1cah62wLY25d3YMdvJ SA1WUUuFGNEFTilpG7a4fDIVYLaT9Bf2U4Jg5giiMGQt8rP4jsFfXBHznau3K03qcMH8 /bSg== X-Forwarded-Encrypted: i=1; AHgh+Ro4HAMYx+UshKKNs3bu4zdQNZcjhS2/NUcZIfEmsqRyYmay029sx2WlwwivGeV7+CqXAAm5/4SgCwsUO7I=@vger.kernel.org X-Gm-Message-State: AOJu0YyAwfSVbiYG+nH04i9w0MeEVQemB75L+hV8DWCV2vDbGztj8yP2 J+VifXUj0tGJCHcJIZKl7eBSiwscf/uPK6iTlZZGwQYx8RPzjP+QRy+H X-Gm-Gg: AR+sD109xn9D1EIq3wKXy/e0B8scb7OYZfsp/2EpmH/U3rA89s82Lkn6+MSRmJOs2D3 ncdDKyZ26YE2hn1Mat+ROQgtwl9LQN42S66JaPzBdYsAukQUmafAEgv8ZaF0K9d3XCD++zux5sf wQCt5UWRgWhoiW3mUqEdvX1u6jAabOgaEpCCka+tVZoYPAUYbFrRXXbBsKlHtBhtoXzOOubAon+ WuDdnm4EVDCWlGh/QpS9Aeix3e1HB4ol7lEkXqE1HiDE3uRM4h5qPztyfD6aCbGuSjOtON2d8li 55GZtKEjhfF/u52oitQcjqEhpdVRggaW12Jt/egZwzVkkIREyAKVThdWWi/30KDdGTZUqEQRMDP Nz9IpOmX7pGIai9rxbV0rU3gTk8rXE2ieQt8eX94ind8CuIujQS/fqXUwrFT4/6V627eToF9rB0 N3w2ABhNy+YEJAxPvsXdCOT/abdX3BNaCpWV0mZTbJCViOkGkYaDUTeYdlCdNJk696+9/Eiyi4v HZGaYbP8SxolPwKfsLiU290KNqZuE7EBtQWDfrZoBxJYCk404NJqMr5sti9jPYLWL0+fQ== X-Received: by 2002:a05:6000:401f:b0:47f:7e91:3d55 with SMTP id ffacd0b85a97d-47fec520b24mr21741731f8f.2.1786183103128; Sat, 08 Aug 2026 02:58:23 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8E20009911270F4BEC2300.dsl.pool.telekom.hu. [2001:4c4e:1b8e:2000:9911:270f:4bec:2300]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480020be8f3sm13255725f8f.0.2026.08.08.02.58.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Aug 2026 02:58:22 -0700 (PDT) From: Igor Paunovic To: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sebastian Reichel , Cristian Ciocaltea , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dmitry Baryshkov , Sandy Huang , =?UTF-8?q?Heiko=20St=C3=BCbner?= , Andy Yan , Jani Nikula , Rodrigo Vivi , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Imre Deak , Ankit Nautiyal , Igor Paunovic Subject: [PATCH 3/5] drm/rockchip: dw_dp: Attach "max bpc" connector property Date: Sat, 8 Aug 2026 11:57:22 +0200 Message-ID: <20260808095749.9428-4-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260808095749.9428-1-royalnet026@gmail.com> References: <20260808095749.9428-1-royalnet026@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The dw-dp bridge already filters candidate output formats on conn_state->max_bpc in dw_dp_bridge_atomic_get_output_bus_fmts() and validates the result against the link bandwidth, but the connector never exposes the "max bpc" property, so userspace cannot limit the bit depth. Attach the property with a range of 6 to 10, matching dw_dp_output_formats[]: the smallest entry is 6 bpc RGB and the deepest entries are 10 bpc. drm_connector_attach_max_bpc_property() initializes connector->state->max_requested_bpc and therefore requires the connector to have a state. Rockchip binds its components before drm_mode_config_reset() runs, so the freshly created bridge connector does not have one yet - create the connector state before attaching the property, exactly like drmm_connector_hdmi_init() does for HDMI bridge connectors. The later drm_mode_config_reset() then re-creates the connector state, and the preceding patch makes drm_bridge_connector_create_state() restore max_requested_bpc from connector->max_bpc, so clients that never set the property (fbcon in particular) keep the full range instead of ending up with 0. With the property attached, compositors such as KWin write "max bpc" on every atomic modeset; any in-range value is handled by the existing format filter and bandwidth checks. Signed-off-by: Igor Paunovic --- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 26 +++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 770ab042a187..4dc29963b5d8 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -172,6 +172,32 @@ static int dw_dp_rockchip_bind(struct device *dev, str= uct device *master, void * "Failed to init bridge connector\n"); } =20 + /* + * The components are bound before drm_mode_config_reset() runs, so + * the connector has no state yet, but + * drm_connector_attach_max_bpc_property() requires one. Create the + * connector state first, like drmm_connector_hdmi_init() does. + */ + if (connector->funcs->atomic_create_state) { + struct drm_connector_state *state; + + state =3D connector->funcs->atomic_create_state(connector); + if (IS_ERR(state)) { + dw_dp_unbind(dp->base); + return PTR_ERR(state); + } + + connector->state =3D state; + } else if (connector->funcs->reset) { + connector->funcs->reset(connector); + } + + ret =3D drm_connector_attach_max_bpc_property(connector, 6, 10); + if (ret) { + dw_dp_unbind(dp->base); + return ret; + } + return 0; } =20 --=20 2.43.0 From nobody Thu Sep 17 16:53:14 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04ECA3B19D4 for ; Sat, 8 Aug 2026 09:58:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183110; cv=none; b=pH5VTLep7y0H79eeiVNLd33ge6drhQD4Lza2lmnKRIXnZ2kDsjZBRlKvyMuYV3wgDKo32SC2PIFZXAhx74a/TAjkU+1jXOrX0v/aQtZtWMnt+pNEpt0kVDolgY7XEaL+0R4Fwq4i/TWMHGr261YKSzKb5dLWSDvjF40f76uheWM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183110; c=relaxed/simple; bh=F29hNm/khAlsS3KtPOWxd7Sj1ngKO72eAoIKK4X03FI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OX9Xg3c/21QhwFELJFwh1rVfB9PCB5AxnzATrZHqPL+JaZfK/8gvUMbfhfwTWZ+6fua4iDVvJqUllt++Bj5UyvgByIkYPXHPRxwf566s7TQFprun8rh/olaTXiGZMiSwGQSXEL8uCiDwA3Ttjei2Rq3kRp0G/ycZLOe1i63pst8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FBiG79BW; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FBiG79BW" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-47fe45db360so32586f8f.2 for ; Sat, 08 Aug 2026 02:58:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786183105; x=1786787905; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=78pbQXQC7rS+xYT3KOYvmzHciozgKbUx+FycpcHfTyI=; b=FBiG79BWNPXo4Le7+BsLjNHJEIcdtS7WifTIza8oN0muJ8qerOqyoBOdMHRF6L5lLM okmV6Ukl7xVl8EXDt7KfwazppRDlCP3SeObvdfxzmaz73sdGGR4ULh6gbAa762f1hszr Xfj8Sk7Q2tBJiRMD9h5f95e4TejRdJryVAFRLiM3pq99Go2E0EdYg6qJzoF/2QrOTt+m ejQQhKxIokuW5i7H8PjJC7RaXNq25RuOYxum2VtLtDiH4W97B/NCTJnHuplSsBfvE81N 8aaT3B+3SJo6P8T/bDd/0CeBGy0xayPFX/8erxs7rtLUKkwvE15kYy/MqbWkkXM8c04k B06g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786183105; x=1786787905; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=78pbQXQC7rS+xYT3KOYvmzHciozgKbUx+FycpcHfTyI=; b=CK6Jpe7gtlVWNF3v0zmbEXq7EhyN2YAbNAgYK2AUyr/rhw0mj7AI9cmVBEmXM57rU5 VHhLiMI8sNDclHc+biJSgs09/YbkNrtZmi99ClSWkYfT6R5oqn/gYK7WCHCt9GNM4F7Z Joa7Iep08fMgx7hiHWgsVDuR5CKaFp4+jxE/Pz1wIOS720FbfQ7zuWPo0Vz7klBIqeFu 2hY8ywPmKf4rJcUhEDIa6y2KK7L84szg7wnqXbxJZlugfjmtdDcRaEEoISTjtJ5Trz0f W5mUre20vg0Ux6VBaz0jKe0G7a6CKFLlb+WAEtbMDdxH3S0VvnWFdfFczBb+pXkM8cS6 7RtA== X-Forwarded-Encrypted: i=1; AHgh+RruarAJkSLgR+XH2nr/t27JaBVF0LPtxIbwtIjCIbO2AVik3stx3sOG1e8rWunHVd3tN+ctzuT/c+k0aEQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9j9lFoMoMt97omng4oOaamEYvlWws07nZYhqvTSv0q8B0JqvW 1Hcss1JvcO9zLeNttxEjJF5e6lhWsCS9LQQnzJGDxhn0bknWnRK5ryYO X-Gm-Gg: AR+sD11oYsiFLidOvbwqsIhaFrsOTnCEHIphfAfkJyoLrGJV6q+byJp400Q/lpEi4fs /wcGg2432hdLt0/kve4eDoKh8dB8fiQ/5kC+Ya4FirNdv7c56i1LBVpPZY5Vbbkk7abZoJfOg0I IHqhKwBBTK0xERw2J4mSJMh/GEqls7ESdLZLG4etFYbZlSyOacvWjcoziu9puPqxS4Oiw6yY4xr cam4DV1EGASON+NS1OLYXBALjFdRzXsGA0ojdBrPRanAF73R4SjZWslIOW7cKvmyfLtpfj2xTvy zJyyWW5h3HRi+ynB82rCjKdHrroQQgQoxx0r4fvrdoBuBDdLah+IOFFd3DEVxgCIkRVOyhsexvo jPbIaCi3HaD7VURkEdT1/TaFpPp6MCsVftVLP9w/bT3f8dZokSoFoQDtNrJJv0G52K/OnJCusgt CxV5BUck8F6FipQb0PYUQZPM8w1Rz9uVpDPhfnj24Ipwja/fT77r6OpvWY3TcM4g73ACHeHNDv7 /AfRvVzGo9PEeJKDJBLAcBZMIyAhPC0jDmxIV+6Wr867kVtll3HUlKcormvCZM5Yg906JmsjIEz Oo2S X-Received: by 2002:a05:6000:4211:b0:47f:96bc:e370 with SMTP id ffacd0b85a97d-47fec63bb0bmr22186473f8f.4.1786183105168; Sat, 08 Aug 2026 02:58:25 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8E20009911270F4BEC2300.dsl.pool.telekom.hu. [2001:4c4e:1b8e:2000:9911:270f:4bec:2300]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480020be8f3sm13255725f8f.0.2026.08.08.02.58.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Aug 2026 02:58:24 -0700 (PDT) From: Igor Paunovic To: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sebastian Reichel , Cristian Ciocaltea , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dmitry Baryshkov , Sandy Huang , =?UTF-8?q?Heiko=20St=C3=BCbner?= , Andy Yan , Jani Nikula , Rodrigo Vivi , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Imre Deak , Ankit Nautiyal , Igor Paunovic Subject: [PATCH 4/5] drm/bridge: synopsys: dw-dp: Add HDR static metadata support Date: Sat, 8 Aug 2026 11:57:23 +0200 Message-ID: <20260808095749.9428-5-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260808095749.9428-1-royalnet026@gmail.com> References: <20260808095749.9428-1-royalnet026@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Send an HDR Metadata InfoFrame SDP (DP 1.4a, Table 2-100 and Table 2-101) when the connector state carries HDR output metadata, and attach the HDR_OUTPUT_METADATA property in the Rockchip glue so userspace can set it. The infoframe is built with drm_hdmi_infoframe_set_hdr_metadata() and packed with drm_dp_hdr_metadata_infoframe_sdp_pack(), then written into a free slot of the SDP register bank with vertical interval transmission, so the controller resends it once per frame during the vertical blanking period. The SDP is sent at the end of dw_dp_video_enable(), next to the existing VSC SDP; the connector state is passed down from atomic_enable(), which already looks it up. The allocated slot is tracked in hdr_sdp_nr and released in atomic_disable(), following the VSC SDP pattern exactly: atomic_disable() only clears tracked slots, so an untracked slot would leak on every enable/disable cycle until dw_dp_send_sdp() runs out of free slots and fails with -EBUSY for every SDP, including VSC and audio. A metadata change on a live stream (HDR on/off toggle, different mastering display data) forces a full modeset: atomic_check() compares the old and new connector state with drm_connector_atomic_hdr_metadata_equal() and sets crtc_state->mode_changed, the same approach as dw-hdmi. The resulting disable/enable cycle then drops or (re)sends the SDP. Commits without HDR metadata are unaffected: with a NULL metadata blob in both old and new connector state, drm_connector_atomic_hdr_metadata_equal() treats them as equal, no modeset is forced, and dw_dp_video_enable() skips the SDP. This keeps plain SDR commits a no-op even for compositors that write a NULL blob on every atomic modeset once the property exists (KWin does). Signed-off-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 44 +++++++++++++++++++++-- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 2 ++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index df149c52fce0..ca997ea53e66 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -369,6 +370,7 @@ struct dw_dp { struct drm_bridge *next_bridge; =20 int vsc_sdp_nr; + int hdr_sdp_nr; DECLARE_BITMAP(sdp_reg_bank, SDP_REG_BANK_SIZE); }; =20 @@ -1171,6 +1173,28 @@ static int dw_dp_send_vsc_sdp(struct dw_dp *dp) return dw_dp_send_sdp(dp, &sdp); } =20 +static int dw_dp_send_hdr_metadata_sdp(struct dw_dp *dp, + const struct drm_connector_state *conn_state) +{ + struct hdmi_drm_infoframe frame; + struct dw_dp_sdp sdp =3D {}; + ssize_t len; + int ret; + + ret =3D drm_hdmi_infoframe_set_hdr_metadata(&frame, conn_state); + if (ret) + return ret; + + len =3D drm_dp_hdr_metadata_infoframe_sdp_pack(dp->bridge.dev, &frame, + &sdp.base, sizeof(sdp.base)); + if (len < 0) + return len; + + sdp.flags =3D DW_DP_SDP_VERTICAL_INTERVAL; + + return dw_dp_send_sdp(dp, &sdp); +} + static int dw_dp_video_set_pixel_mode(struct dw_dp *dp) { switch (dp->pixel_mode) { @@ -1265,7 +1289,8 @@ static void dw_dp_video_disable(struct dw_dp *dp) FIELD_PREP(VIDEO_STREAM_ENABLE, 0)); } =20 -static int dw_dp_video_enable(struct dw_dp *dp) +static int dw_dp_video_enable(struct dw_dp *dp, + const struct drm_connector_state *conn_state) { struct dw_dp_link *link =3D &dp->link; struct dw_dp_bridge_state *state; @@ -1440,6 +1465,9 @@ static int dw_dp_video_enable(struct dw_dp *dp) if (dw_dp_video_need_vsc_sdp(dp)) dp->vsc_sdp_nr =3D dw_dp_send_vsc_sdp(dp); =20 + if (conn_state->hdr_output_metadata) + dp->hdr_sdp_nr =3D dw_dp_send_hdr_metadata_sdp(dp, conn_state); + return 0; } =20 @@ -1597,6 +1625,7 @@ static int dw_dp_bridge_atomic_check(struct drm_bridg= e *bridge, struct dw_dp *dp =3D bridge_to_dp(bridge); struct dw_dp_bridge_state *state; const struct dw_dp_output_format *fmt; + struct drm_connector_state *old_conn_state; struct drm_display_mode *mode; int min_hbp =3D 16; int min_hsync =3D 9; @@ -1616,6 +1645,11 @@ static int dw_dp_bridge_atomic_check(struct drm_brid= ge *bridge, state->bpc =3D fmt->bpc; state->bpp =3D fmt->bpp; =20 + old_conn_state =3D drm_atomic_get_old_connector_state(conn_state->state, + conn_state->connector); + if (!drm_connector_atomic_hdr_metadata_equal(old_conn_state, conn_state)) + crtc_state->mode_changed =3D true; + if ((adjusted_mode->hsync_start - adjusted_mode->hdisplay) & 0x1) { adjusted_mode->hsync_start +=3D 1; dev_warn(dp->dev, "hfp is not 2 pixeel aligned, fixup to aligned hfp\n"); @@ -2016,7 +2050,7 @@ static void dw_dp_bridge_atomic_enable(struct drm_bri= dge *bridge, return; } =20 - ret =3D dw_dp_video_enable(dp); + ret =3D dw_dp_video_enable(dp, conn_state); if (ret < 0) { dev_err(dp->dev, "failed to enable video: %d\n", ret); return; @@ -2066,6 +2100,11 @@ static void dw_dp_bridge_atomic_disable(struct drm_b= ridge *bridge, dp->vsc_sdp_nr =3D -1; } =20 + if (dp->hdr_sdp_nr >=3D 0) { + dw_dp_clear_sdp(dp, dp->hdr_sdp_nr); + dp->hdr_sdp_nr =3D -1; + } + dw_dp_reset(dp); pm_runtime_put_autosuspend(dp->dev); } @@ -2668,6 +2707,7 @@ int dw_dp_probe(struct dw_dp *dp) return ret; =20 dp->vsc_sdp_nr =3D -1; + dp->hdr_sdp_nr =3D -1; dp->audio_interface =3D DW_DP_AUDIO_UNUSED; dp->audio_sdp_nr =3D -1; =20 diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index 4dc29963b5d8..c5bc178c0a50 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -198,6 +198,8 @@ static int dw_dp_rockchip_bind(struct device *dev, stru= ct device *master, void * return ret; } =20 + drm_connector_attach_hdr_output_metadata_property(connector); + return 0; } =20 --=20 2.43.0 From nobody Thu Sep 17 16:53:14 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0D8302EA749 for ; Sat, 8 Aug 2026 09:58:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183112; cv=none; b=SC1uxJyq273/ONS3PmDMHyoarXav3vptb5tu2BXokSJkWZkVS0rq2C/re72XDyW/P4i3qkgFvGDaPFizidru+QMHR8eaqvwGT6ER/2BoxcUZ79oZNvZZRHvh+tYw3E2Y94WgtWBTLDHO1D886IZXepRkxQBAM37BJNhdwVODQwY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786183112; c=relaxed/simple; bh=neOKnZeyhSU1ZqTloSCJaeMqY0+mXHUwjgndvrH98O0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HJ5LxXZaqE4n34sRHJIZK9DmDCqjZgfziCxsBjvl9Eii+7HedvbJLFVwHJR3InN1s3UZ+/XMMcSU2tXfxaYB9csQNTm5+50L4zyWyGISbsjZgIoBPFSBSGjYIsOWDvIb2RlX47Q7fGVhTL++2d2Eu/U6oQ2xH/hoeY5lz59oDG4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mA8UHM1c; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mA8UHM1c" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-47f611b3af9so39229f8f.3 for ; Sat, 08 Aug 2026 02:58:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786183107; x=1786787907; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=eukZ4Yw0lPupGVKUZsE6QR5EVi6K7EEsCGMJTKxA3Qg=; b=mA8UHM1cnWJYtrRrV7vv/Bx7Nrigk7+tgJDKBIH5PnYE5AkaNa1iO5CLgjgvzsNH8O MYVAiUJJ4J5c3EE4fUZQhe8BlpHPcdtYaDMLq9ov21Rjod3NUnpaq1fSSliFq+y3ZXhP 6cdJA07nfBX4zYOx+UCBhSq8caZOHeB+juh1PahYMN8C/8Die3N20Lbi0ozvWDSU2k23 Ff3Wu8/sSLaXQtY4qPwiW7SZ5xUtomQl74IPQnJ4uirfUtcRy6uNFLq7GE3/Jz5klB0Y ucea5SPEL8PBvRaDQNuDvGd3nU+VK8ki78NRH8Z9oOjrLb76bQl5KBjJmBbMvHiO0ceo ++Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786183107; x=1786787907; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=eukZ4Yw0lPupGVKUZsE6QR5EVi6K7EEsCGMJTKxA3Qg=; b=gvhkiBfajnzep17ZgNk8t94/RVd6Ta039xaNR3mtAaSH5cGocd1sES7a2igVDc6YKi +ebSxYpT+njCtg0zqUCr6H2cLEArXS983RvAgrdKj2ybdZvE5Ry8SoPtsaSRF89iGM2Q +r/ET6FJ8BJoorHyvzCmFjoQz1U+HWFxZDM3M7XVrKsjYs5z0gRMgKfWC+GEgZxnMlPp MHBeT7OiOI3x3ZlNrW9TnjGaJOWiuc6QDEG4iGNzAIWpDejTVP07xgCGiwgksl1Blbl0 WnGhL1dku3LWIDp1yPo0WvECc+kt2b5+Q5zPPeFlgvnetKtBWtVSW68vdrzshvZow3Vo vU9Q== X-Forwarded-Encrypted: i=1; AHgh+RoTBHCCxtyujCDUIj9aX1UawOBLz+JpyCKBK7JGhSrE80rE0vq1ITxUCUUvRZ4WURqskkzMz0b7QR+QioM=@vger.kernel.org X-Gm-Message-State: AOJu0Yysn4itHcE2yAnQcLO6x/v8+Lp2Zs5tESAazUzdU78D/2sz1d2j j4ZoeAhxQ7d6eng84kW20iuwvCC+rpPVXSGcypS+s4QDUXGdHEAvKcJA X-Gm-Gg: AR+sD11JM1J4HiQB1l+Tu207fxNSnfcoj25x4k0TQhIcy8OXq8nYd29zpcHKrd6Yq3r X/U+Kdfn2nUuyTk2HHrE/9fS5hO+T1XjE8hzIVsZHx4nnmfc5hz4ne3S6pkbOF3luegK2aKpf8X YAJau8cmCD3NB/BT1/KhCxDgFKQ6l9CGM7qNxppuaq27+UfZkupoLKyiH1YKUgAO4JTWqs7NgdR 2/DAAAyeri3VFMJqYcFsILsNKZMrL11CLli4TV5GVCtYltcOLNBWz4Eor7BFoxK7fvwBrW+WDqT /eArx+OsPmXQuAAgus03j6QQ7DNpy+X8iFPA0LR9oNHeNM7iNlB94BOGhidQrGN6Qse0whWqLSi CKFpuaWZfCqrk9yFGk1eepRqnPSb9y1t1nbesLTU6wE3tcKBlsvsu0YUT2u3XrLAxdpfaSFlHZs EF4+tKg2Btr/Tl7NGLFQBvIiex7CLs8IpKyQ9mUGCxYL6QdY9MhjyQxu9bUnFYYpEsxCXj3x4R0 l2KT7OhVyJ3mSqLNvAsTrI2g47U0jOeczSmSrBfymb6OZnoInsI6gmn3rd6Tu/L1UGBD954Ands qv80VA== X-Received: by 2002:a5d:584c:0:b0:47f:959f:d5e with SMTP id ffacd0b85a97d-47fec487b60mr22022705f8f.0.1786183107204; Sat, 08 Aug 2026 02:58:27 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B8E20009911270F4BEC2300.dsl.pool.telekom.hu. [2001:4c4e:1b8e:2000:9911:270f:4bec:2300]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480020be8f3sm13255725f8f.0.2026.08.08.02.58.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Aug 2026 02:58:26 -0700 (PDT) From: Igor Paunovic To: dri-devel@lists.freedesktop.org Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Sebastian Reichel , Cristian Ciocaltea , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dmitry Baryshkov , Sandy Huang , =?UTF-8?q?Heiko=20St=C3=BCbner?= , Andy Yan , Jani Nikula , Rodrigo Vivi , =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= , Imre Deak , Ankit Nautiyal , Igor Paunovic Subject: [PATCH 5/5] drm/bridge: synopsys: dw-dp: Add BT.2020 colorimetry support Date: Sat, 8 Aug 2026 11:57:24 +0200 Message-ID: <20260808095749.9428-6-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260808095749.9428-1-royalnet026@gmail.com> References: <20260808095749.9428-1-royalnet026@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The VSC SDP colorimetry is hardcoded: DEFAULT for RGB output and BT709_YCC for YCbCr. HDR compositors render into a BT.2020 container and need a way to tell the sink. The legacy MSA MISC0 colorimetry bits cannot express BT.2020; DP 1.4a requires the VSC SDP revision 5 pixel encoding/colorimetry format indication, with MISC1 bit 6 set so the sink takes the format from the VSC SDP instead of MISC0. The driver already sets MISC1 bit 6 whenever it sends the VSC SDP, so only the trigger and the colorimetry values need extending: - store conn_state->colorspace in the bridge state during atomic_check(), next to the negotiated format; - send the VSC SDP also when the colorspace is BT2020_RGB or BT2020_YCC, not only for YCbCr 4:2:0 output; - map BT2020_RGB/BT2020_YCC to DP_COLORIMETRY_BT2020_RGB/ DP_COLORIMETRY_BT2020_YCC in the VSC SDP; every other colorspace value keeps today's values. The dynamic range stays VESA for RGB and CTA for YCbCr output. Sinks advertise VSC SDP colorimetry support in the DPCD (DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED). Without it BT.2020 cannot be signaled at all, so atomic_check() rejects such a request with -EINVAL and userspace's TEST_ONLY probe learns the configuration is impossible; i915 instead silently omits the VSC SDP and scans out BT.2020 pixels without signaling them. A colorspace change on a live stream forces a modeset, so the VSC SDP is regenerated with the new colorimetry. On the Rockchip side, create the DP Colorspace property with exactly the enum values the driver implements (Default, BT2020_RGB, BT2020_YCC). When the colorspace is BT.2020 and the negotiated bus format is YCbCr, program s->color_space =3D V4L2_COLORSPACE_BT2020 so the VOP2 uses its BT.2020 R'G'B' to Y'C'bC'r matrix for the CSC. For RGB output the pixels leave the VOP2 unconverted and the color space stays DEFAULT. Userspace that leaves the property at "Default" sees no change in behavior: the colorimetry mapping, the VSC SDP trigger and the VOP2 CSC selection all take the previous paths. Signed-off-by: Igor Paunovic --- drivers/gpu/drm/bridge/synopsys/dw-dp.c | 44 +++++++++++++++++++---- drivers/gpu/drm/rockchip/dw_dp-rockchip.c | 38 +++++++++++++++++++- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/brid= ge/synopsys/dw-dp.c index ca997ea53e66..8f0ee9628dcc 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c @@ -306,6 +306,7 @@ struct dw_dp_bridge_state { u8 color_format; u8 bpc; u8 bpp; + enum drm_colorspace colorspace; }; =20 struct dw_dp_sdp { @@ -1125,6 +1126,12 @@ static void dw_dp_clear_sdp(struct dw_dp *dp, int nr) clear_bit(nr, dp->sdp_reg_bank); } =20 +static bool dw_dp_colorspace_is_bt2020(enum drm_colorspace colorspace) +{ + return colorspace =3D=3D DRM_MODE_COLORIMETRY_BT2020_RGB || + colorspace =3D=3D DRM_MODE_COLORIMETRY_BT2020_YCC; +} + static int dw_dp_send_vsc_sdp(struct dw_dp *dp) { struct dw_dp_bridge_state *state; @@ -1160,13 +1167,25 @@ static int dw_dp_send_vsc_sdp(struct dw_dp *dp) break; } =20 - if (state->color_format =3D=3D DRM_OUTPUT_COLOR_FORMAT_RGB444) { - vsc.colorimetry =3D DP_COLORIMETRY_DEFAULT; + switch (state->colorspace) { + case DRM_MODE_COLORIMETRY_BT2020_RGB: + vsc.colorimetry =3D DP_COLORIMETRY_BT2020_RGB; + break; + case DRM_MODE_COLORIMETRY_BT2020_YCC: + vsc.colorimetry =3D DP_COLORIMETRY_BT2020_YCC; + break; + default: + if (state->color_format =3D=3D DRM_OUTPUT_COLOR_FORMAT_RGB444) + vsc.colorimetry =3D DP_COLORIMETRY_DEFAULT; + else + vsc.colorimetry =3D DP_COLORIMETRY_BT709_YCC; + break; + } + + if (state->color_format =3D=3D DRM_OUTPUT_COLOR_FORMAT_RGB444) vsc.dynamic_range =3D DP_DYNAMIC_RANGE_VESA; - } else { - vsc.colorimetry =3D DP_COLORIMETRY_BT709_YCC; + else vsc.dynamic_range =3D DP_DYNAMIC_RANGE_CTA; - } =20 drm_dp_vsc_sdp_pack(&vsc, &sdp.base); =20 @@ -1227,7 +1246,7 @@ static bool dw_dp_video_need_vsc_sdp(struct dw_dp *dp) if (state->color_format =3D=3D DRM_OUTPUT_COLOR_FORMAT_YCBCR420) return true; =20 - return false; + return dw_dp_colorspace_is_bt2020(state->colorspace); } =20 static int dw_dp_video_set_msa(struct dw_dp *dp, @@ -1644,10 +1663,21 @@ static int dw_dp_bridge_atomic_check(struct drm_bri= dge *bridge, state->color_format =3D fmt->color_format; state->bpc =3D fmt->bpc; state->bpp =3D fmt->bpp; + state->colorspace =3D conn_state->colorspace; + + /* + * BT.2020 cannot be signaled through the legacy MSA MISC0 + * colorimetry bits; it requires the VSC SDP colorimetry format + * indication, which the sink must support. + */ + if (dw_dp_colorspace_is_bt2020(conn_state->colorspace) && + !dp->link.vsc_sdp_supported) + return -EINVAL; =20 old_conn_state =3D drm_atomic_get_old_connector_state(conn_state->state, conn_state->connector); - if (!drm_connector_atomic_hdr_metadata_equal(old_conn_state, conn_state)) + if (!drm_connector_atomic_hdr_metadata_equal(old_conn_state, conn_state) = || + old_conn_state->colorspace !=3D conn_state->colorspace) crtc_state->mode_changed =3D true; =20 if ((adjusted_mode->hsync_start - adjusted_mode->hdisplay) & 0x1) { diff --git a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c b/drivers/gpu/drm/ro= ckchip/dw_dp-rockchip.c index c5bc178c0a50..798d82893f98 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -69,6 +69,21 @@ static void dw_dp_rockchip_hpd_sw_cfg(void *data, bool h= pd) FIELD_PREP_WM16(ROCKCHIP_VO_GRF_DP_SINK_HPD_CFG, hpd)); } =20 +static bool dw_dp_yuv_bus_format(u32 bus_format) +{ + switch (bus_format) { + case MEDIA_BUS_FMT_UYYVYY10_0_5X30: + case MEDIA_BUS_FMT_UYYVYY8_0_5X24: + case MEDIA_BUS_FMT_YUYV10_1X20: + case MEDIA_BUS_FMT_YUYV8_1X16: + case MEDIA_BUS_FMT_YUV10_1X30: + case MEDIA_BUS_FMT_YUV8_1X24: + return true; + default: + return false; + } +} + static int dw_dp_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) @@ -102,7 +117,17 @@ static int dw_dp_encoder_atomic_check(struct drm_encod= er *encoder, s->output_type =3D DRM_MODE_CONNECTOR_DisplayPort; s->bus_format =3D bus_format; s->bus_flags =3D di->bus_flags; - s->color_space =3D V4L2_COLORSPACE_DEFAULT; + + /* + * For BT.2020 YCbCr output the VOP2 must use its BT.2020 R'G'B' to + * Y'C'bC'r matrix; BT.2020 RGB is passed through unconverted. + */ + if ((conn_state->colorspace =3D=3D DRM_MODE_COLORIMETRY_BT2020_RGB || + conn_state->colorspace =3D=3D DRM_MODE_COLORIMETRY_BT2020_YCC) && + dw_dp_yuv_bus_format(bus_format)) + s->color_space =3D V4L2_COLORSPACE_BT2020; + else + s->color_space =3D V4L2_COLORSPACE_DEFAULT; =20 return 0; } @@ -200,6 +225,17 @@ static int dw_dp_rockchip_bind(struct device *dev, str= uct device *master, void * =20 drm_connector_attach_hdr_output_metadata_property(connector); =20 + ret =3D drm_mode_create_dp_colorspace_property(connector, + BIT(DRM_MODE_COLORIMETRY_DEFAULT) | + BIT(DRM_MODE_COLORIMETRY_BT2020_RGB) | + BIT(DRM_MODE_COLORIMETRY_BT2020_YCC)); + if (ret) { + dw_dp_unbind(dp->base); + return ret; + } + + drm_connector_attach_colorspace_property(connector); + return 0; } =20 --=20 2.43.0