From: Jani Nikula <jani.nikula@linux.intel.com>
To: Igor Paunovic <royalnet026@gmail.com>, 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" <sebastian.reichel@collabora.com>,
"Cristian Ciocaltea" <cristian.ciocaltea@collabora.com>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Luca Ceresoli" <luca.ceresoli@bootlin.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Dmitry Baryshkov" <dmitry.baryshkov@oss.qualcomm.com>,
"Sandy Huang" <hjc@rock-chips.com>,
"Heiko Stübner" <heiko@sntech.de>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Ville Syrjälä" <ville.syrjala@linux.intel.com>,
"Imre Deak" <imre.deak@intel.com>,
"Ankit Nautiyal" <ankit.k.nautiyal@intel.com>,
"Igor Paunovic" <royalnet026@gmail.com>
Subject: Re: [PATCH 1/5] drm/dp: Add drm_dp_hdr_metadata_infoframe_sdp_pack()
Date: Mon, 10 Aug 2026 12:00:20 +0300 [thread overview]
Message-ID: <d128b937ee3ca1987d2bd543f92cbabab84ea440@intel.com> (raw)
In-Reply-To: <20260808095749.9428-2-royalnet026@gmail.com>
On Sat, 08 Aug 2026, Igor Paunovic <royalnet026@gmail.com> wrote:
> 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 <royalnet026@gmail.com>
'git show --color-moved' says it's fine. ;)
Acked-by: Jani Nikula <jani.nikula@intel.com>
for merging via drm-misc.
> ---
> 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/display/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 <linux/dynamic_debug.h>
> #include <linux/errno.h>
> #include <linux/export.h>
> +#include <linux/hdmi.h>
> #include <linux/i2c.h>
> #include <linux/init.h>
> #include <linux/iopoll.h>
> @@ -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);
>
> +/**
> + * 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 = sizeof(struct dp_sdp);
> + const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_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 = 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 != 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 = 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 = drm_infoframe->type;
> + /*
> + * Least Significant Eight Bits of (Data Byte Count – 1)
> + * infoframe_size - 1
> + */
> + sdp->sdp_header.HB2 = 0x1D;
> + /* INFOFRAME SDP Version Number */
> + sdp->sdp_header.HB3 = (0x13 << 2);
> + /* CTA Header Byte 2 (INFOFRAME Version Number) */
> + sdp->db[0] = drm_infoframe->version;
> + /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */
> + sdp->db[1] = 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;
> }
>
> -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 = sizeof(struct dp_sdp);
> - const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_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 = 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 != 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 = 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 = drm_infoframe->type;
> - /*
> - * Least Significant Eight Bits of (Data Byte Count – 1)
> - * infoframe_size - 1
> - */
> - sdp->sdp_header.HB2 = 0x1D;
> - /* INFOFRAME SDP Version Number */
> - sdp->sdp_header.HB3 = (0x13 << 2);
> - /* CTA Header Byte 2 (INFOFRAME Version Number) */
> - sdp->db[0] = drm_infoframe->version;
> - /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */
> - sdp->db[1] = 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 metadata
> - * 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 = drm_dp_vsc_sdp_pack(&crtc_state->infoframes.vsc, &sdp);
> break;
> case HDMI_PACKET_TYPE_GAMUT_METADATA:
> - len = intel_dp_hdr_metadata_infoframe_sdp_pack(display,
> - &crtc_state->infoframes.drm.drm,
> - &sdp, sizeof(sdp));
> + len = drm_dp_hdr_metadata_infoframe_sdp_pack(display->drm,
> + &crtc_state->infoframes.drm.drm,
> + &sdp, sizeof(sdp));
> break;
> case DP_SDP_ADAPTIVE_SYNC:
> len = 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;
>
> 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);
>
> ssize_t drm_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc, struct dp_sdp *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_count,
> int bpp_x16, int symbol_size, bool is_mst);
--
Jani Nikula, Intel
next prev parent reply other threads:[~2026-08-10 9:00 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-08 9:57 [PATCH 0/5] drm/bridge: synopsys: dw-dp: Add HDR support Igor Paunovic
2026-08-08 9:57 ` [PATCH 1/5] drm/dp: Add drm_dp_hdr_metadata_infoframe_sdp_pack() Igor Paunovic
2026-08-10 9:00 ` Jani Nikula [this message]
2026-08-08 9:57 ` [PATCH 2/5] drm/display: bridge-connector: Preserve max bpc across connector reset Igor Paunovic
2026-08-08 9:57 ` [PATCH 3/5] drm/rockchip: dw_dp: Attach "max bpc" connector property Igor Paunovic
2026-08-08 9:57 ` [PATCH 4/5] drm/bridge: synopsys: dw-dp: Add HDR static metadata support Igor Paunovic
2026-08-08 9:57 ` [PATCH 5/5] drm/bridge: synopsys: dw-dp: Add BT.2020 colorimetry support Igor Paunovic
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d128b937ee3ca1987d2bd543f92cbabab84ea440@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=airlied@gmail.com \
--cc=andrzej.hajda@intel.com \
--cc=andy.yan@rock-chips.com \
--cc=ankit.k.nautiyal@intel.com \
--cc=cristian.ciocaltea@collabora.com \
--cc=dmitry.baryshkov@oss.qualcomm.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=heiko@sntech.de \
--cc=hjc@rock-chips.com \
--cc=imre.deak@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=jernej.skrabec@gmail.com \
--cc=jonas@kwiboo.se \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=luca.ceresoli@bootlin.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=rfoss@kernel.org \
--cc=rodrigo.vivi@intel.com \
--cc=royalnet026@gmail.com \
--cc=sebastian.reichel@collabora.com \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
--cc=ville.syrjala@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox