The Linux Kernel Mailing List
 help / color / mirror / Atom feed
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

  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