All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Jouni Högander" <jouni.hogander@intel.com>
To: dri-devel@lists.freedesktop.org
Cc: "Jani Nikula" <jani.nikula@intel.com>,
	"Rodrigo Siqueira" <Rodrigo.Siqueira@amd.com>,
	"Mika Kahola" <mika.kahola@intel.com>,
	"Jouni Högander" <jouni.hogander@intel.com>
Subject: [PATCH 1/3] drm: New function to get luminance range based on static hdr metadata
Date: Tue, 26 Apr 2022 15:30:42 +0300	[thread overview]
Message-ID: <20220426123044.320415-2-jouni.hogander@intel.com> (raw)
In-Reply-To: <20220426123044.320415-1-jouni.hogander@intel.com>

Split luminance min/max calculation using static hdr metadata from
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c:update_connector_ext_caps
into drm/drm_edid.c.

Cc: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Lyude Paul <lyude@redhat.com>
Cc: Mika Kahola <mika.kahola@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 55 ++++++++++++++++++++++++++++++++++++++
 include/drm/drm_edid.h     |  4 +++
 2 files changed, 59 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 7a8482b75071..1cb886debbbe 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -4005,6 +4005,61 @@ drm_display_mode_from_cea_vic(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drm_display_mode_from_cea_vic);
 
+/**
+ * drm_luminance_range_from_static_hdr_metadata() - luminance range from static hdr
+ * metadata
+ * @connector: connector we're calculating for
+ * @min: Calculated min value
+ * @max: Calculated max value
+ *
+ * Calculates backlight min and max as described in CTA-861-G
+ *
+ * Returns: True when calculation succeeds.
+ */
+bool
+drm_luminance_range_from_static_hdr_metadata(struct drm_connector *connector,
+					     u32 *min, u32 *max)
+{
+	struct hdr_sink_metadata *hdr_metadata = &connector->hdr_sink_metadata;
+	static const u8 pre_computed_values[] = {
+		50, 51, 52, 53, 55, 56, 57, 58, 59, 61, 62, 63, 65, 66, 68, 69,
+		71, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 92, 94, 96, 98};
+	u32 min_cll, max_cll, q, r;
+
+	if (!(hdr_metadata->hdmi_type1.metadata_type &
+	      BIT(HDMI_STATIC_METADATA_TYPE1)))
+		return false;
+
+	max_cll = hdr_metadata->hdmi_type1.max_cll;
+	min_cll = hdr_metadata->hdmi_type1.min_cll;
+
+	/* From the specification (CTA-861-G), for calculating the maximum
+	 * luminance we need to use:
+	 *	Luminance = 50*2**(CV/32)
+	 * Where CV is a one-byte value.
+	 * For calculating this expression we may need float point precision;
+	 * to avoid this complexity level, we take advantage that CV is divided
+	 * by a constant. From the Euclids division algorithm, we know that CV
+	 * can be written as: CV = 32*q + r. Next, we replace CV in the
+	 * Luminance expression and get 50*(2**q)*(2**(r/32)), hence we just
+	 * need to pre-compute the value of r/32. For pre-computing the values
+	 * We just used the following Ruby line:
+	 *	(0...32).each {|cv| puts (50*2**(cv/32.0)).round}
+	 * The results of the above expressions can be verified at
+	 * pre_computed_values.
+	 */
+	q = max_cll >> 5;
+	r = max_cll % 32;
+	*max = (1 << q) * pre_computed_values[r];
+
+	/* min luminance: maxLum * (CV/255)^2 / 100 */
+	q = DIV_ROUND_CLOSEST(min_cll, 255);
+	*min = *max * DIV_ROUND_CLOSEST((q * q), 100);
+
+	return true;
+}
+EXPORT_SYMBOL(drm_luminance_range_from_static_hdr_metadata);
+
 static int
 do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len)
 {
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index c3204a58fb09..63e441c84d72 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -406,6 +406,10 @@ drm_hdmi_avi_infoframe_quant_range(struct hdmi_avi_infoframe *frame,
 				   const struct drm_display_mode *mode,
 				   enum hdmi_quantization_range rgb_quant_range);
 
+bool
+drm_luminance_range_from_static_hdr_metadata(struct drm_connector *connector,
+					     u32 *min, u32 *max);
+
 /**
  * drm_eld_mnl - Get ELD monitor name length in bytes.
  * @eld: pointer to an eld memory structure with mnl set
-- 
2.25.1


  reply	other threads:[~2022-04-26 12:31 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-26 12:30 [PATCH 0/3] HDR aux backlight range calculation Jouni Högander
2022-04-26 12:30 ` Jouni Högander [this message]
2022-04-26 13:37   ` [PATCH 1/3] drm: New function to get luminance range based on static hdr metadata Jani Nikula
2022-04-26 18:27     ` Navare, Manasi D
2022-04-26 12:30 ` [PATCH 2/3] drm/amdgpu_dm: Use split out luminance calculation function Jouni Högander
2022-04-26 12:30 ` [PATCH 3/3] drm/i915: Use luminance range from static hdr metadata Jouni Högander
2022-04-27 18:57 ` [PATCH 0/3] HDR aux backlight range calculation Lyude Paul
2022-04-29 23:34 ` Lyude Paul
2022-05-02  5:25   ` Hogander, Jouni

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=20220426123044.320415-2-jouni.hogander@intel.com \
    --to=jouni.hogander@intel.com \
    --cc=Rodrigo.Siqueira@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jani.nikula@intel.com \
    --cc=mika.kahola@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.