Commit 1174bf15 authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/connector: move HDR sink metadata to display info



Information parsed from the display EDID should be stored in display
info. Move HDR sink metadata there.

Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Link: https://lore.kernel.org/r/20250519112900.1383997-1-jani.nikula@intel.com


Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 786bd08c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ int drm_hdmi_infoframe_set_hdr_metadata(struct hdmi_drm_infoframe *frame,

	/* Sink EOTF is Bit map while infoframe is absolute values */
	if (!is_eotf_supported(hdr_metadata->hdmi_metadata_type1.eotf,
	    connector->hdr_sink_metadata.hdmi_type1.eotf))
			       connector->display_info.hdr_sink_metadata.hdmi_type1.eotf))
		DRM_DEBUG_KMS("Unknown EOTF %d\n", hdr_metadata->hdmi_metadata_type1.eotf);

	err = hdmi_drm_infoframe_init(frame);
+1 −1
Original line number Diff line number Diff line
@@ -1687,7 +1687,7 @@ EXPORT_SYMBOL(drm_hdmi_connector_get_output_format_name);
 *	structure from userspace. This is received as blob and stored in
 *	&drm_connector_state.hdr_output_metadata. It parses EDID and saves the
 *	sink metadata in &struct hdr_sink_metadata, as
 *	&drm_connector.hdr_sink_metadata.  Driver uses
 *	&drm_connector.display_info.hdr_sink_metadata.  Driver uses
 *	drm_hdmi_infoframe_set_hdr_metadata() helper to set the HDR metadata,
 *	hdmi_drm_infoframe_pack() to pack the infoframe as per spec, in case of
 *	HDMI encoder.
+10 −9
Original line number Diff line number Diff line
@@ -5374,7 +5374,8 @@ static void fixup_detailed_cea_mode_clock(struct drm_connector *connector,

static void drm_calculate_luminance_range(struct drm_connector *connector)
{
	struct hdr_static_metadata *hdr_metadata = &connector->hdr_sink_metadata.hdmi_type1;
	const struct hdr_static_metadata *hdr_metadata =
		&connector->display_info.hdr_sink_metadata.hdmi_type1;
	struct drm_luminance_range_info *luminance_range =
		&connector->display_info.luminance_range;
	static const u8 pre_computed_values[] = {
@@ -5435,21 +5436,21 @@ static uint8_t hdr_metadata_type(const u8 *edid_ext)
static void
drm_parse_hdr_metadata_block(struct drm_connector *connector, const u8 *db)
{
	struct hdr_static_metadata *hdr_metadata =
		&connector->display_info.hdr_sink_metadata.hdmi_type1;
	u16 len;

	len = cea_db_payload_len(db);

	connector->hdr_sink_metadata.hdmi_type1.eotf =
						eotf_supported(db);
	connector->hdr_sink_metadata.hdmi_type1.metadata_type =
						hdr_metadata_type(db);
	hdr_metadata->eotf = eotf_supported(db);
	hdr_metadata->metadata_type = hdr_metadata_type(db);

	if (len >= 4)
		connector->hdr_sink_metadata.hdmi_type1.max_cll = db[4];
		hdr_metadata->max_cll = db[4];
	if (len >= 5)
		connector->hdr_sink_metadata.hdmi_type1.max_fall = db[5];
		hdr_metadata->max_fall = db[5];
	if (len >= 6) {
		connector->hdr_sink_metadata.hdmi_type1.min_cll = db[6];
		hdr_metadata->min_cll = db[6];

		/* Calculate only when all values are available */
		drm_calculate_luminance_range(connector);
@@ -6597,7 +6598,7 @@ static void drm_reset_display_info(struct drm_connector *connector)
	info->has_hdmi_infoframe = false;
	info->rgb_quant_range_selectable = false;
	memset(&info->hdmi, 0, sizeof(info->hdmi));
	memset(&connector->hdr_sink_metadata, 0, sizeof(connector->hdr_sink_metadata));
	memset(&info->hdr_sink_metadata, 0, sizeof(info->hdr_sink_metadata));

	info->edid_hdmi_rgb444_dc_modes = 0;
	info->edid_hdmi_ycbcr444_dc_modes = 0;
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ intel_dp_aux_supports_hdr_backlight(struct intel_connector *connector)
	 * ranges for such panels.
	 */
	if (display->params.enable_dpcd_backlight != INTEL_DP_AUX_BACKLIGHT_FORCE_INTEL &&
	    !(connector->base.hdr_sink_metadata.hdmi_type1.metadata_type &
	    !(connector->base.display_info.hdr_sink_metadata.hdmi_type1.metadata_type &
	      BIT(HDMI_STATIC_METADATA_TYPE1))) {
		drm_info(display->drm,
			 "[CONNECTOR:%d:%s] Panel is missing HDR static metadata. Possible support for Intel HDR backlight interface is not used. If your backlight controls don't work try booting with i915.enable_dpcd_backlight=%d.\n",
+5 −3
Original line number Diff line number Diff line
@@ -799,6 +799,11 @@ struct drm_display_info {
	 */
	struct drm_hdmi_info hdmi;

	/**
	 * @hdr_sink_metadata: HDR Metadata Information read from sink
	 */
	struct hdr_sink_metadata hdr_sink_metadata;

	/**
	 * @non_desktop: Non desktop display (HMD).
	 */
@@ -2284,9 +2289,6 @@ struct drm_connector {
	 */
	struct llist_node free_node;

	/** @hdr_sink_metadata: HDR Metadata Information read from sink */
	struct hdr_sink_metadata hdr_sink_metadata;

	/**
	 * @hdmi: HDMI-related variable and properties.
	 */