From nobody Fri Sep 25 18:20:29 2026 Received: from mail-wm2-f12.google.com (mail-wm2-f12.google.com [74.125.225.140]) (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 4F26C376A0B for ; Wed, 9 Sep 2026 17:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788975374; cv=none; b=iw+R0pryHMXjDCMnLXui7jsTnHtTA/tGnQNOIWhB0Wc56qOL5ad0GF1cXQ1aBsjArmXLgSU0iCUzpFknXXtZQUFPycxgDS11NledACTuChr6mckienCXnY60ItKxQyUYTXNRG1JsHDfgKHKUQb3YaSica6NrORW665jTqV5ah1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788975374; c=relaxed/simple; bh=QzfN7SZAAwtIGC2LBQsPhFsxtdu6e3ajEaPL4hbP/XI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ElZmHHOcm7Djx9bPvjyPUlggmwrorqocFL6CNgI5NjdQR/JzVwbuoxw3uhj+rjPuLwIa0xe/uwNM3pIBZxVPrg31LFXSk7buoyeu/8Qo+b2cUyBkH7LCtmS8HE5d+0tBfKTsZVo66SlCMyvC8AkOeFMwQGXPxlx5hG23WtqeCBc= 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=gB1YxOye; arc=none smtp.client-ip=74.125.225.140 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="gB1YxOye" Received: by mail-wm2-f12.google.com with SMTP id 5b1f17b1804b1-499db1740f2so2579155e9.3 for ; Wed, 09 Sep 2026 10:36:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788975370; x=1789580170; 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=GcSEJLSb+KPAcWrzfd13cySwpnusQrnIcgjvZmkYhdY=; b=gB1YxOyewpnvzIA0YmrnNSZgFpoB0XVHMz7D2TRETkJEhBeSax5XSsiIX/nmyXESni VWUani2JM4AzQuxe0vXpw2wi6nqNGlIt2Y8YpQ48t4Lee8Fleo5/Lt8GZNPl+UDzieKY iBVlKqoGHsCjxxM2QmPWq0gJQ65S/KV6jsmS56hCdG/BbBWsgfLLy9qZlJFI6HrELYe5 O2WuTh5e5z6X0LssGyNQy9CFpnjggzRaXljbyHwXQF8SZeToeGNc0fTYj2nLW7Tiyei1 /JhNUqTR6i9uElTRbNjpyQc8PNj5Wqs3wwtIpKCpIVdPYY2OCY8ezKrHOV5Byh9pdWnh 6yJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788975370; x=1789580170; 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=GcSEJLSb+KPAcWrzfd13cySwpnusQrnIcgjvZmkYhdY=; b=GGYS1eQAmmWQZaP653fu/AhyMcg8IzJ3AEhXKNNmuWeuqxNZSKQbpWLJiLRyYt+vFo XORAww0TEStWDHWaKFIaTs/eynd3TuIHUrlWuYxJl4lDwMr4igM4PeF34fWjqbALbn3a DZnDB/UN5sA/JGdRRqe9HICEftLW+FmJUSMeRNSt3n+vXXcBc6hAK7O2ZfW1QY9PJTTG 4JSk48dY0t8gHJvK+y3T73Lvdevdk+M89RAJaHuoRUm0y3VgJB+6m0pNwXXy8a3rH3C4 ruU9ygCb6mxQJ5ZH/sklnaAsr135kRIOQFHVFvOz/Q2xgF6P6Cj/ER578Hy6PXvmYb4W lL4A== X-Forwarded-Encrypted: i=1; AKwUvBwE5AS8ozzFIfS4S+dyv+THtPJQnq08HYFbDF1rqjhzBJAobQNo8R4uT5cuFsJXBP2Bg6w58K3S1YcK+5A=@vger.kernel.org X-Gm-Message-State: AFuF++lDcmSOHISxwF8eUMelBc88lQkG6dtuvefBZkUzA4lEs3kv3Wov KEb/GWxsNOVfqHWK7a35tbsQ/BitrkHl4YdPi6xgkM1Y4uQKTLDIOa7T X-Gm-Gg: AYBFou0I512G47vZ1//XDyHkyYxTS/sw7Nw86kkACMRwoiQXXtb1+oXgNC7Y3IcY/UT nDiaijyvz+yQj5g+p0EDVWGXC019UoaOo9GnOvc8MO7Fsr/M+f6a3MUvluc0V2ZomMwvdinMr8+ MTtQl91JYS0wWavNOIa/v/nPupuXzdSXxJBHFZVAISMwqjLJ0RItJA2cl13hkWC/Zry1VwWTkXK fzS+UTnVqt6Fy3k56Sl4p5JJs2fo/MrDcSElxhD/J5lDrpUn7Fkt8vBNYDBaXgFrdo3miHs/UeJ GVRBu17l6J0MEBNLVNQZ584/tBd82EGIGkAoJ4bTtZtEzIEkKbcvSyn5iS42Zb22AkPWhrNz1Nr RIPUvAKbFPEmryNZFVZ/k20mmU03l7a2zhTO4v0dEKRlqpaHE+QmGt7rZhRhWd48A1vNJxxxr+y 9Py4CiU4tok9fPMBNykiqrewzd5JAgfHyb+yGokn7dH40dyzhXljJdA77NAnx608pSPkVmU8puA SabCeeOC3+L/tm/nWA9eznjauLL8njWFNpb2mRhAEZE3RTQhk6QAWyqvqOjABllUZCEW9cruq70 /9E= X-Received: by 2002:a05:600c:35cb:b0:49d:1da4:511b with SMTP id 5b1f17b1804b1-49d1da4515bmr96595615e9.1.1788975370286; Wed, 09 Sep 2026 10:36:10 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B836900B0110705BF092680.dsl.pool.telekom.hu. [2001:4c4e:1b83:6900:b011:705:bf09:2680]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49d26c06f04sm6876575e9.13.2026.09.09.10.36.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Sep 2026 10:36:09 -0700 (PDT) From: Igor Paunovic To: dri-devel@lists.freedesktop.org Cc: Igor Paunovic , 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 , Heiko Stuebner , Andy Yan , Jani Nikula , Rodrigo Vivi , Ville Syrjala , Imre Deak , Ankit Nautiyal Subject: [PATCH v2 1/3] drm/dp: Add drm_dp_hdr_metadata_infoframe_sdp_pack() Date: Wed, 9 Sep 2026 19:35:38 +0200 Message-ID: <20260909173542.14030-2-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260909163206.36409-1-royalnet026@gmail.com> References: <20260909163206.36409-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. Assisted-by: LLM checkpatch 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 e623ccb4c1d8a..7b80937255fe0 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 113d767e62e9c..d0d3f517df85a 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -5189,84 +5189,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) @@ -5285,9 +5207,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 5b05a7fbe174a..3e3f119775b38 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); @@ -1035,6 +1036,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 Fri Sep 25 18:20:29 2026 Received: from mail-wm2-f12.google.com (mail-wm2-f12.google.com [74.125.225.140]) (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 227B438A70C for ; Wed, 9 Sep 2026 17:36:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.140 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788975375; cv=none; b=bFdXkrSXLiyluMD8LbtLY9JnV88e/twCmToUS1QUdBzY2sOSv6NosJSPyxc+3lbKGK05lIOvih9EcKTwQlk4BOnhCZncHOmJqvAPzzEcYOach5qkOo3e2fE078ktOrmpf+OxGyfzmYAfLvjKckKxy+q03zU209iLotSki/vQpxk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788975375; c=relaxed/simple; bh=VxwEIG6yCOOvrzqWhkvESH0ChUSgHAYSU3EDjaD2jXk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ERLTDeiwetE0hMdh4DBW/vHTDpZ6KeB6ky4BdlteE9IDa9S02PKc4DJhBpt2C6IliArWJ1OIJHJu/SX9isxu6i1hq6E1/lsFyMAnkHLfKU4SSaJlDOU8p5si4MO0a6nXK8g94RGRXd9O7Rj/SHqPc0kzcLWvxpdlr+A2sdR+s0c= 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=adENeQ9t; arc=none smtp.client-ip=74.125.225.140 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="adENeQ9t" Received: by mail-wm2-f12.google.com with SMTP id 5b1f17b1804b1-499db1740e4so2944815e9.0 for ; Wed, 09 Sep 2026 10:36:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788975372; x=1789580172; 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=WLa/2IhG0uPxKott5hiW6gEdbabkA+pAUSYZZS+3kb0=; b=adENeQ9tVbrXM1H9ILpgmFPlb8lXE/aCRhE80oL/UPkcRJFdCrNGKSGcCly1mU7Re5 8wCm+MtaZlfNCiKhz5Y0LKqVS6YVZ1AzJ5gUEkdk0se0ihW9JRXtw3VrbdPuLx90IfoL xcjPQRZXKbfZ5yqTAS6+7Hic3jttup0snue6+GT/QTltU16W3q5maCG9SspSH5KpvfOS apFMST/R97QzRhKCXc3+FvT4xKpdEo0FoRSDQvxO7MhkSXGLm4d8X9/AV9CUHLN/bl/M l/2QRqLCUyTrhXCM4j0ftQf4H7LQyOjnonJSiqOCdz4RZMP2B3ewlm0QG9+u99sQlTPG 2Udw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788975372; x=1789580172; 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=WLa/2IhG0uPxKott5hiW6gEdbabkA+pAUSYZZS+3kb0=; b=ED+TdmzcItRS8mTca6xHthMBHqmA6Mxgg5tOa6/R8GwMbvsq86WEjC7nvAeM9xsMk4 x1c/pC4Tdbh6bF9lCf9KYmYbx/Wp7HySTqyNizQIvdkpRBngM1hW+x2jPnPMgLb5nL9U 24rcOxHExMaCEZDtOi7Wwswt/BuY0frKjL5EI0vs1pySO91rsdt7kXFhDhirXZp3tj12 0sKdQLS0tPQypPr9UTZO75wtgJh4qny5FiiaYpHZF0dQl0P6bPXmsqhd7z85mWMwh48t Kxsz5heGeY4T2h1EkGJrGUZ7faOfl/8Jdthx3xD8LWg5qQRhRnT6ItgWqqZZi9RSDONo gLVw== X-Forwarded-Encrypted: i=1; AKwUvBwAl7ds6vIcZptgDEVPwraJ7zBU42ThxQZDpkiNJPZgvhkBYicVV3VQk3hzLROY+phsgjTjPOtiJst3agQ=@vger.kernel.org X-Gm-Message-State: AFuF++kVUHR2t6qAnfhZGTavGLg+xsK/kIabxXAw4bSuY+Niep1QAq3c UzhhoC4QoJy7y2f2AtBxdT4lK2vWpCHNju1ClyeWunW4aHbhkvaT3e+W X-Gm-Gg: AYBFou1iZFmYCFrH/TYT7apy3MjF4fCvvl4S6e3OfvAtiUREWzEB0KWvJI6UrUisoxx 7/Q0KF8tvT0wp1JdYLezVAC9XLcVUQZlujPJdH5zB8cKCYETRiUbrwx0PXCImHRuBvxtDn/g2b5 hu5hkX3n8QgNpyomI/bnlFRTBdNzjxvFzUNBxcDxXg9YEj7qwtiOazlftihYB1xKeBCq9W0Vo0l FdULx5iU/IR5fJdA3dYZqFws9w07kMq6Z/LBBdd2OQu7+4+knuUqSXF7q2jem3HInrmc/m1HesO Lq+OZ+a+2tfu+pUBeolBp9FfuNeiEDj4nImKlGlv2KEyn6QXgIlPeAnlV4Y+fpNo3nrTCBY0aBg 4SdAdW1/1BtNJtDP/AAIGfTwpmBWxDlsQMQKner3GCiDW5EfzgOPVLtLogdb7PEHubpl6cNX6iB 2qTZ1v8xBlw+Xpyd+i0fWT0ee/7UbYnnJLjEbRl9TxCMerx8WSI3qWndiOghrhxV1qDDGO7YkBo KoC8UkrwUVWYiT8scqq2EcwOlV7JCPS7UEWnykjQzFNVy7vDq4D050UQVhYM3JguBv5ir0dvVax GA== X-Received: by 2002:a05:600c:a305:b0:49c:ff81:e062 with SMTP id 5b1f17b1804b1-49cff81e076mr237967455e9.2.1788975372348; Wed, 09 Sep 2026 10:36:12 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B836900B0110705BF092680.dsl.pool.telekom.hu. [2001:4c4e:1b83:6900:b011:705:bf09:2680]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49d26c06f04sm6876575e9.13.2026.09.09.10.36.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Sep 2026 10:36:11 -0700 (PDT) From: Igor Paunovic To: dri-devel@lists.freedesktop.org Cc: Igor Paunovic , 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 , Heiko Stuebner , Andy Yan , Jani Nikula , Rodrigo Vivi , Ville Syrjala , Imre Deak , Ankit Nautiyal Subject: [PATCH v2 2/3] drm/display: bridge-connector: Preserve max bpc across connector reset Date: Wed, 9 Sep 2026 19:35:39 +0200 Message-ID: <20260909173542.14030-3-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260909163206.36409-1-royalnet026@gmail.com> References: <20260909163206.36409-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. Assisted-by: LLM checkpatch 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 00feb73e63d7f..6197fb80f7cc2 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -279,9 +279,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 8b4baed060f3a..0400a6a92e2b7 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 Fri Sep 25 18:20:29 2026 Received: from mail-wr2-f12.google.com (mail-wr2-f12.google.com [74.125.225.76]) (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 6DFCF37C929 for ; Wed, 9 Sep 2026 17:36:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788975378; cv=none; b=u8OztEmRvQ84+ybqNOGa3yCkXLny3hBaBXfUBrAK2l41vWO0z5KpyGyFozlDpUT2Ip7iPWayXNhQOZoBrDL6AYC7v3UIl5Erxsk0BG5GKTOYrt1LrEIlFvoQLwW2awahBrAcbtVJXaZMpDa/FkRxC1AAMZWDirPPHtA9gS7n6y0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788975378; c=relaxed/simple; bh=K6TRwu9LuT59/wZN7jShPaYAGjmA6cF+Xm3+2+qJdbw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NqZ4Ws2uUbdcPnwR8TL5tcWrHMiX6tBk/9i0nOtlcsjJM1qj6S5HzTwviiOvvm8LfGw84G2CDjx/ITzjdj2zLXaBvTulwe/dY5XMqUAXzFh+Fsb09nmJ9g73yWDfz8xWWxeJynv+NaYTvN66Eiv2nm5bpCqEoZMm2XxCdQQ3EfM= 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=ms2SQ8sy; arc=none smtp.client-ip=74.125.225.76 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="ms2SQ8sy" Received: by mail-wr2-f12.google.com with SMTP id ffacd0b85a97d-484399babcaso567240f8f.0 for ; Wed, 09 Sep 2026 10:36:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788975375; x=1789580175; 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=EqyOJwWDc9siUyUIf9HLEiRZ/UBmYkZ2bG5NW9K2GYU=; b=ms2SQ8syFyX2qvaOSsH7WibuxIm4GBFIknDoq4wKFw6dcvUKkOefjnChQoP/Qc6ETs Rs50y8NTTI84MAKj9vxU0hXcH503HIx/qXJepbngArnFWlvjhMX3vkK5YloPdsmIoRBr IakiWnKuACGtSF4utkhaW6N2OeGT0NkdBbkNU0QInbAwHvAzXl5A+KfDKN1Q49vNfIvP FFs+d6VMS7jnVkbFiR7oF28azPgWXO0+DRhBZOZC373Hex9UxQUY4fZA14mcpyXbBYKD NySBKMxvZj83i2JGEfm48Dbg1b3FjLYs8cOIVNOKVvhF5+pIMdbEL1v5xeAjhrEXRJXV cp8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788975375; x=1789580175; 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=EqyOJwWDc9siUyUIf9HLEiRZ/UBmYkZ2bG5NW9K2GYU=; b=TeuUDHgXaByTnuneQEBAAeCBAC0XgJA0wjFBsMc0T8NJEohFG43H3XBUAs4T6mh2mF hK1NMUZgrmxFa86D7S2gjwrbhjk0ieOf1ID9O17HhwJrOiWUID/GzpExCu+7fAdmKXMg yRiiLoTV2oqK/QdqoqAcce82/NZAd1CaHaCYYD2kS3J80KIquyTBy55Iu5aEyZdpOtsE Q0/iWykojPqdudhkaDningsU6Gx/VSSDB9bx7iei9/6LES/rB7tS+675ll7nUQhs4Mga ImUEzDTF5mD+cU4ATD0glR8POqVGP49kV5Ndmo15am55zH+w5C4ulrmf1Yf3nwNKitqY Y8vg== X-Forwarded-Encrypted: i=1; AKwUvBxksV0t6+c+KcEXmmKCx1MoYgXltAMQmYhBu8kvNG4CxhUtks9K96tlokgPJhj1JJqU3HracPrl7NvNeJw=@vger.kernel.org X-Gm-Message-State: AFuF++nQJviopSNmJBCNWIquBPwK/UnxrBCLHiuTLl+hFYt20+Wsui49 TdMkn4TQYd0j8N1ETMCtctvSIaheVFfp9lt7cbOtHHhJ7EvQZ2pU3tk7 X-Gm-Gg: AYBFou0mu9m0+wLx3aR/+Vi8Taa4a6mHnVvZ6BKFXnQva5fcuUN2llXzWAxQpAaTMwo PYXR0cTvrsEQcjrwDaYXg4Q88qAPQF9ePushXzqFBjPuPinTPHdiFOB4NY/EooBY94O132vbZxd 9LRFuOmIL9q1DGJ3tO7mK2+I24nKyhFPXrO/TKrWCWrV79YXbV++Gq60VOPvunBXPATlHvmrHKS lOoZ2C1bYEyNxRXlU5eJcpcwo2KyW8R4dignnKq/cMUMsN749R9oqxUhalqT7W8RmCV+8yx75Tw LgTe1cgXaG/a0rpYSKYoYZY0IGNhqCQo8W0NKlk2GrfVN2QgD7BaXTQKmCQqflo2EH/jRseOaBO sX69Z2bTdbyGXun62Rfy714F4UfTlmjjBIcLgzKTLDKnerKYmkRSnjPAbjAVisZDM3YRjD+nXrB PtM+NG5i7Enu61rdRU48aVzH7W8lNDW77VgEeH69zai7V1H8mgDGwjwqC6fpLdyudTDin9oWzf0 5WCiGGhJERkw7I0H7K/qZWotB+2ue14bBK0iOi79yQi9Dz1iC+H+MoQvAqaXRlKOqVgDggUw0qY Zg== X-Received: by 2002:a05:600c:620f:b0:49c:eac2:ddad with SMTP id 5b1f17b1804b1-49d2570acaemr24678895e9.1.1788975374390; Wed, 09 Sep 2026 10:36:14 -0700 (PDT) Received: from OrangePi5-Plus.BB-HOME (20014C4E1B836900B0110705BF092680.dsl.pool.telekom.hu. [2001:4c4e:1b83:6900:b011:705:bf09:2680]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-49d26c06f04sm6876575e9.13.2026.09.09.10.36.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Sep 2026 10:36:14 -0700 (PDT) From: Igor Paunovic To: dri-devel@lists.freedesktop.org Cc: Igor Paunovic , 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 , Heiko Stuebner , Andy Yan , Jani Nikula , Rodrigo Vivi , Ville Syrjala , Imre Deak , Ankit Nautiyal Subject: [PATCH v2 3/3] drm/rockchip: dw_dp: Attach "max bpc" connector property Date: Wed, 9 Sep 2026 19:35:40 +0200 Message-ID: <20260909173542.14030-4-royalnet026@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260909163206.36409-1-royalnet026@gmail.com> References: <20260909163206.36409-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. Assisted-by: LLM checkpatch 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 b23efb153c9e6..8ff27353b1417 100644 --- a/drivers/gpu/drm/rockchip/dw_dp-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_dp-rockchip.c @@ -112,6 +112,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