aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.10/950-0475-drm-vc4-Add-HDR-metadata-property-to-the-VC5-HDMI-co.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0475-drm-vc4-Add-HDR-metadata-property-to-the-VC5-HDMI-co.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.10/950-0475-drm-vc4-Add-HDR-metadata-property-to-the-VC5-HDMI-co.patch99
1 files changed, 99 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0475-drm-vc4-Add-HDR-metadata-property-to-the-VC5-HDMI-co.patch b/target/linux/bcm27xx/patches-5.10/950-0475-drm-vc4-Add-HDR-metadata-property-to-the-VC5-HDMI-co.patch
new file mode 100644
index 0000000000..3a4d39b612
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.10/950-0475-drm-vc4-Add-HDR-metadata-property-to-the-VC5-HDMI-co.patch
@@ -0,0 +1,99 @@
+From 82a5aa1df1b04efef46c7be82a7d71ea5300ce92 Mon Sep 17 00:00:00 2001
+From: Dave Stevenson <dave.stevenson@raspberrypi.com>
+Date: Wed, 2 Dec 2020 18:36:24 +0000
+Subject: [PATCH] drm/vc4: Add HDR metadata property to the VC5 HDMI
+ connectors
+
+Now that we can export deeper colour depths, add in the signalling
+for HDR metadata.
+
+Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+---
+ drivers/gpu/drm/vc4/vc4_hdmi.c | 28 ++++++++++++++++++++++++++++
+ drivers/gpu/drm/vc4/vc4_hdmi.h | 3 +++
+ 2 files changed, 31 insertions(+)
+
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
+@@ -309,6 +309,10 @@ static int vc4_hdmi_connector_init(struc
+ connector->doublescan_allowed = 0;
+ connector->stereo_allowed = 1;
+
++ if (vc4_hdmi->variant->supports_hdr)
++ drm_object_attach_property(&connector->base,
++ connector->dev->mode_config.hdr_output_metadata_property, 0);
++
+ drm_connector_attach_encoder(connector, encoder);
+
+ return 0;
+@@ -448,6 +452,25 @@ static void vc4_hdmi_set_audio_infoframe
+ vc4_hdmi_write_infoframe(encoder, &frame);
+ }
+
++static void vc4_hdmi_set_hdr_infoframe(struct drm_encoder *encoder)
++{
++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
++ struct drm_connector *connector = &vc4_hdmi->connector;
++ struct drm_connector_state *conn_state = connector->state;
++ union hdmi_infoframe frame;
++
++ if (!vc4_hdmi->variant->supports_hdr)
++ return;
++
++ if (!conn_state->hdr_output_metadata)
++ return;
++
++ if (drm_hdmi_infoframe_set_hdr_metadata(&frame.drm, conn_state))
++ return;
++
++ vc4_hdmi_write_infoframe(encoder, &frame);
++}
++
+ static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder)
+ {
+ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
+@@ -460,6 +483,8 @@ static void vc4_hdmi_set_infoframes(stru
+ */
+ if (vc4_hdmi->audio.streaming)
+ vc4_hdmi_set_audio_infoframe(encoder);
++
++ vc4_hdmi_set_hdr_infoframe(encoder);
+ }
+
+ static void vc4_hdmi_encoder_post_crtc_disable(struct drm_encoder *encoder,
+@@ -2282,6 +2307,7 @@ static const struct vc4_hdmi_variant bcm
+ .phy_rng_enable = vc4_hdmi_phy_rng_enable,
+ .phy_rng_disable = vc4_hdmi_phy_rng_disable,
+ .channel_map = vc4_hdmi_channel_map,
++ .supports_hdr = false,
+ };
+
+ static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = {
+@@ -2309,6 +2335,7 @@ static const struct vc4_hdmi_variant bcm
+ .phy_rng_enable = vc5_hdmi_phy_rng_enable,
+ .phy_rng_disable = vc5_hdmi_phy_rng_disable,
+ .channel_map = vc5_hdmi_channel_map,
++ .supports_hdr = true,
+ };
+
+ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = {
+@@ -2336,6 +2363,7 @@ static const struct vc4_hdmi_variant bcm
+ .phy_rng_enable = vc5_hdmi_phy_rng_enable,
+ .phy_rng_disable = vc5_hdmi_phy_rng_disable,
+ .channel_map = vc5_hdmi_channel_map,
++ .supports_hdr = true,
+ };
+
+ static const struct of_device_id vc4_hdmi_dt_match[] = {
+--- a/drivers/gpu/drm/vc4/vc4_hdmi.h
++++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
+@@ -99,6 +99,9 @@ struct vc4_hdmi_variant {
+
+ /* Callback to get channel map */
+ u32 (*channel_map)(struct vc4_hdmi *vc4_hdmi, u32 channel_mask);
++
++ /* Enables HDR metadata */
++ bool supports_hdr;
+ };
+
+ /* HDMI audio information */