[PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-14 Thread Suraj Kandpal
As of now whenerver HDR is switched on we use the PWM to change the
backlight as opposed to AUX based backlight changes in terms of nits.
This patch writes to the appropriate DPCD registers to enable aux
based backlight using values in nits.

--v2
-Fix max_cll and max_fall assignment [Jani]
-Fix the size sent in drm_dpcd_write [Jani]

--v3
-Content Luminance needs to be sent only for pre-ICL after that
it is directly picked up from hdr metadata [Ville]

--v4
-Add checks for HDR TCON cap bits [Ville]
-Check eotf of hdr_output_data and sets bits base of that value.

--v5
-Fix capability check bits.
-Check colorspace before setting BT2020

Signed-off-by: Suraj Kandpal 
---
 .../drm/i915/display/intel_display_types.h|  3 +
 .../drm/i915/display/intel_dp_aux_backlight.c | 57 ---
 2 files changed, 52 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index e67cd5b02e84..271bb609106d 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -401,6 +401,9 @@ struct intel_panel {
} vesa;
struct {
bool sdr_uses_aux;
+   bool supports_2084_decode;
+   bool supports_2020_gamut;
+   bool supports_segmented_backlight;
} intel;
} edp;
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c 
b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
index 4f58efdc688a..f927e259b540 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
@@ -40,11 +40,6 @@
 #include "intel_dp.h"
 #include "intel_dp_aux_backlight.h"
 
-/* TODO:
- * Implement HDR, right now we just implement the bare minimum to bring us 
back into SDR mode so we
- * can make people's backlights work in the mean time
- */
-
 /*
  * DP AUX registers for Intel's proprietary HDR backlight interface. We define
  * them here since we'll likely be the only driver to ever use these.
@@ -158,6 +153,12 @@ intel_dp_aux_supports_hdr_backlight(struct intel_connector 
*connector)
 
panel->backlight.edp.intel.sdr_uses_aux =
tcon_cap[2] & INTEL_EDP_SDR_TCON_BRIGHTNESS_AUX_CAP;
+   panel->backlight.edp.intel.supports_2084_decode =
+   tcon_cap[1] & INTEL_EDP_HDR_TCON_2084_DECODE_CAP;
+   panel->backlight.edp.intel.supports_2020_gamut =
+   tcon_cap[1] & INTEL_EDP_HDR_TCON_2020_GAMUT_CAP;
+   panel->backlight.edp.intel.supports_segmented_backlight =
+   tcon_cap[1] & INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_CAP;
 
return true;
 }
@@ -206,6 +207,9 @@ intel_dp_aux_hdr_set_aux_backlight(const struct 
drm_connector_state *conn_state,
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
u8 buf[4] = {};
 
+   if (level < 20)
+   level = 20;
+
buf[0] = level & 0xFF;
buf[1] = (level & 0xFF00) >> 8;
 
@@ -221,7 +225,7 @@ intel_dp_aux_hdr_set_backlight(const struct 
drm_connector_state *conn_state, u32
struct intel_connector *connector = 
to_intel_connector(conn_state->connector);
struct intel_panel *panel = &connector->panel;
 
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
const u32 pwm_level = intel_backlight_level_to_pwm(connector, 
level);
@@ -251,8 +255,30 @@ intel_dp_aux_hdr_enable_backlight(const struct 
intel_crtc_state *crtc_state,
}
 
ctrl = old_ctrl;
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
+
+   if (conn_state->hdr_output_metadata) {
+   struct hdr_output_metadata *hdr_metadata =
+   conn_state->hdr_output_metadata->data;
+
+   if 
(panel->backlight.edp.intel.supports_segmented_backlight &&
+   hdr_metadata->hdmi_metadata_type1.eotf >=
+   HDMI_EOTF_TRADITIONAL_GAMMA_HDR)
+   ctrl |= 
INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
+   if (panel->backlight.edp.intel.supports_2084_decode &&
+   hdr_metadata->hdmi_metadata_type1.eotf ==
+   HDMI_EOTF_SMPTE_ST2084)
+   ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
+   if (panel->backlight.edp.intel.supports_2020_gamut &&
+   hdr_metadata->hdm

[PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-10 Thread Suraj Kandpal
As of now whenerver HDR is switched on we use the PWM to change the
backlight as opposed to AUX based backlight changes in terms of nits.
This patch writes to the appropriate DPCD registers to enable aux
based backlight using values in nits.

--v2
-Fix max_cll and max_fall assignment [Jani]
-Fix the size sent in drm_dpcd_write [Jani]

--v3
-Content Luminance needs to be sent only for pre-ICL after that
it is directly picked up from hdr metadata [Ville]

--v4
-Add checks for HDR TCON cap bits [Ville]
-Check eotf of hdr_output_data and sets bits base of that value.

Signed-off-by: Suraj Kandpal 
---
 .../drm/i915/display/intel_display_types.h|  3 ++
 .../drm/i915/display/intel_dp_aux_backlight.c | 51 ---
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h 
b/drivers/gpu/drm/i915/display/intel_display_types.h
index e67cd5b02e84..271bb609106d 100644
--- a/drivers/gpu/drm/i915/display/intel_display_types.h
+++ b/drivers/gpu/drm/i915/display/intel_display_types.h
@@ -401,6 +401,9 @@ struct intel_panel {
} vesa;
struct {
bool sdr_uses_aux;
+   bool supports_2084_decode;
+   bool supports_2020_gamut;
+   bool supports_segmented_backlight;
} intel;
} edp;
 
diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c 
b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
index 4f58efdc688a..74270c4755e7 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
@@ -40,11 +40,6 @@
 #include "intel_dp.h"
 #include "intel_dp_aux_backlight.h"
 
-/* TODO:
- * Implement HDR, right now we just implement the bare minimum to bring us 
back into SDR mode so we
- * can make people's backlights work in the mean time
- */
-
 /*
  * DP AUX registers for Intel's proprietary HDR backlight interface. We define
  * them here since we'll likely be the only driver to ever use these.
@@ -158,6 +153,12 @@ intel_dp_aux_supports_hdr_backlight(struct intel_connector 
*connector)
 
panel->backlight.edp.intel.sdr_uses_aux =
tcon_cap[2] & INTEL_EDP_SDR_TCON_BRIGHTNESS_AUX_CAP;
+   panel->backlight.edp.intel.supports_2084_decode =
+   tcon_cap[2] & INTEL_EDP_HDR_TCON_2084_DECODE_CAP;
+   panel->backlight.edp.intel.supports_2020_gamut =
+   tcon_cap[2] & INTEL_EDP_HDR_TCON_2020_GAMUT_CAP;
+   panel->backlight.edp.intel.supports_segmented_backlight =
+   tcon_cap[2] & INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_CAP;
 
return true;
 }
@@ -221,7 +222,7 @@ intel_dp_aux_hdr_set_backlight(const struct 
drm_connector_state *conn_state, u32
struct intel_connector *connector = 
to_intel_connector(conn_state->connector);
struct intel_panel *panel = &connector->panel;
 
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
const u32 pwm_level = intel_backlight_level_to_pwm(connector, 
level);
@@ -251,8 +252,27 @@ intel_dp_aux_hdr_enable_backlight(const struct 
intel_crtc_state *crtc_state,
}
 
ctrl = old_ctrl;
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
+
+   if (conn_state->hdr_output_metadata) {
+   struct hdr_output_metadata *hdr_metadata =
+   conn_state->hdr_output_metadata->data;
+
+   if 
(panel->backlight.edp.intel.supports_segmented_backlight &&
+   hdr_metadata->hdmi_metadata_type1.eotf >=
+   HDMI_EOTF_TRADITIONAL_GAMMA_HDR)
+   ctrl |= 
INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
+   if (panel->backlight.edp.intel.supports_2084_decode &&
+   hdr_metadata->hdmi_metadata_type1.eotf ==
+   HDMI_EOTF_SMPTE_ST2084)
+   ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
+   if (panel->backlight.edp.intel.supports_2020_gamut &&
+   hdr_metadata->hdmi_metadata_type1.eotf >=
+   HDMI_EOTF_TRADITIONAL_GAMMA_HDR)
+   ctrl |= INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
+   }
+
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
u32 pwm_level = intel_backlight_level_to_pwm(connector, level);
@@ -292,9 +312,11 @@ intel_dp_aux_hdr_setup_backl

RE: [PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-08 Thread Borah, Chaitanya Kumar
Hello Suraj,

> -Original Message-
> From: Intel-gfx  On Behalf Of Suraj
> Kandpal
> Sent: Thursday, March 7, 2024 3:59 PM
> To: intel-gfx@lists.freedesktop.org
> Cc: Shankar, Uma ; Nautiyal, Ankit K
> ; Kandpal, Suraj 
> Subject: [PATCH] drm/i915/dp: Enable AUX based backlight for HDR
> 
> As of now whenerver HDR is switched on we use the PWM to change the
> backlight as opposed to AUX based backlight changes in terms of nits.
> This patch writes to the appropriate DPCD registers to enable aux based
> backlight using values in nits.
> 
> --v2
> -Fix max_cll and max_fall assignment [Jani] -Fix the size sent in
> drm_dpcd_write [Jani]
> 
> --v3
> -Content Luminance needs to be sent only for pre-ICL after that it is directly
> picked up from hdr metadata [Ville]
> 
> Signed-off-by: Suraj Kandpal 
> ---
>  .../drm/i915/display/intel_dp_aux_backlight.c | 33 ++-
>  1 file changed, 25 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> index 4f58efdc688a..cba7b8f5dad4 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> @@ -40,11 +40,6 @@
>  #include "intel_dp.h"
>  #include "intel_dp_aux_backlight.h"
> 
> -/* TODO:
> - * Implement HDR, right now we just implement the bare minimum to bring
> us back into SDR mode so we
> - * can make people's backlights work in the mean time
> - */
> -
>  /*
>   * DP AUX registers for Intel's proprietary HDR backlight interface. We 
> define
>   * them here since we'll likely be the only driver to ever use these.
> @@ -221,7 +216,7 @@ intel_dp_aux_hdr_set_backlight(const struct
> drm_connector_state *conn_state, u32
>   struct intel_connector *connector = to_intel_connector(conn_state-
> >connector);
>   struct intel_panel *panel = &connector->panel;
> 
> - if (panel->backlight.edp.intel.sdr_uses_aux) {
> + if (panel->backlight.edp.intel.sdr_uses_aux ||
> +conn_state->hdr_output_metadata) {
>   intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
>   } else {
>   const u32 pwm_level =
> intel_backlight_level_to_pwm(connector, level); @@ -251,8 +246,15 @@
> intel_dp_aux_hdr_enable_backlight(const struct intel_crtc_state *crtc_state,
>   }
> 
>   ctrl = old_ctrl;
> - if (panel->backlight.edp.intel.sdr_uses_aux) {
> + if (panel->backlight.edp.intel.sdr_uses_aux ||
> +conn_state->hdr_output_metadata) {
>   ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
> +
> + if (conn_state->hdr_output_metadata) {
> + ctrl |=
> INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
> + ctrl |=
> INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
> + ctrl |=
> INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
> + }
> +
>   intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
>   } else {
>   u32 pwm_level = intel_backlight_level_to_pwm(connector,
> level); @@ -292,9 +294,11 @@ intel_dp_aux_hdr_setup_backlight(struct
> intel_connector *connector, enum pipe pi  {
>   struct drm_i915_private *i915 = to_i915(connector->base.dev);
>   struct intel_panel *panel = &connector->panel;
> + struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
>   struct drm_luminance_range_info *luminance_range =
>   &connector->base.display_info.luminance_range;
>   int ret;
> + u8 buf[4];
> 
>   drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDR backlight is
> controlled through %s\n",
>   connector->base.base.id, connector->base.name, @@ -
> 318,11 +322,24 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector
> *connector, enum pipe pi
>   panel->backlight.min = 0;
>   }
> 
> + if (DISPLAY_VER(i915) < 11) {
> + buf[0] = connector-
> >base.hdr_sink_metadata.hdmi_type1.max_cll & 0xFF;
> + buf[1] = (connector-
> >base.hdr_sink_metadata.hdmi_type1.max_cll & 0xFF00) >> 8;
> + buf[2] = connector-
> >base.hdr_sink_metadata.hdmi_type1.max_fall & 0xFF;
> + buf[3] = (connector-
> >base.hdr_sink_metadata.hdmi_type1.max_fall &
> +0xFF00) >> 8;
> +
> + ret = drm_dp_dpcd_write(&intel_dp->aux,
> INTEL_EDP_HDR_CONTENT_LUMINANCE, buf,
> + sizeof(buf));
> + if (ret < 0)
&g

Re: [PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-07 Thread Ville Syrjälä
On Thu, Mar 07, 2024 at 05:27:31AM +, Kandpal, Suraj wrote:
> 
> 
> > -Original Message-
> > From: Ville Syrjälä 
> > Sent: Wednesday, March 6, 2024 5:57 PM
> > To: Kandpal, Suraj 
> > Cc: intel-gfx@lists.freedesktop.org; Shankar, Uma ;
> > Nautiyal, Ankit K 
> > Subject: Re: [PATCH] drm/i915/dp: Enable AUX based backlight for HDR
> > 
> > On Wed, Mar 06, 2024 at 02:29:15PM +0530, Suraj Kandpal wrote:
> > > As of now whenerver HDR is switched on we use the PWM to change the
> > > backlight as opposed to AUX based backlight changes in terms of nits.
> > > This patch writes to the appropriate DPCD registers to enable aux
> > > based backlight using values in nits.
> > >
> > > --v2
> > > -Fix max_cll and max_fall assignment [Jani] -Fix the size sent in
> > > drm_dpcd_write [Jani]
> > >
> > > Signed-off-by: Suraj Kandpal 
> > > ---
> > >  .../drm/i915/display/intel_dp_aux_backlight.c | 30
> > > ++-
> > >  1 file changed, 22 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > > b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > > index 4f58efdc688a..1b6f14dacf3b 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > > @@ -40,11 +40,6 @@
> > >  #include "intel_dp.h"
> > >  #include "intel_dp_aux_backlight.h"
> > >
> > > -/* TODO:
> > > - * Implement HDR, right now we just implement the bare minimum to
> > > bring us back into SDR mode so we
> > > - * can make people's backlights work in the mean time
> > > - */
> > > -
> > >  /*
> > >   * DP AUX registers for Intel's proprietary HDR backlight interface. We 
> > > define
> > >   * them here since we'll likely be the only driver to ever use these.
> > > @@ -221,7 +216,7 @@ intel_dp_aux_hdr_set_backlight(const struct
> > drm_connector_state *conn_state, u32
> > >   struct intel_connector *connector = to_intel_connector(conn_state-
> > >connector);
> > >   struct intel_panel *panel = &connector->panel;
> > >
> > > - if (panel->backlight.edp.intel.sdr_uses_aux) {
> > > + if (panel->backlight.edp.intel.sdr_uses_aux ||
> > > +conn_state->hdr_output_metadata) {
> > >   intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
> > >   } else {
> > >   const u32 pwm_level =
> > intel_backlight_level_to_pwm(connector,
> > > level); @@ -251,8 +246,15 @@ intel_dp_aux_hdr_enable_backlight(const
> > struct intel_crtc_state *crtc_state,
> > >   }
> > >
> > >   ctrl = old_ctrl;
> > > - if (panel->backlight.edp.intel.sdr_uses_aux) {
> > > + if (panel->backlight.edp.intel.sdr_uses_aux ||
> > > +conn_state->hdr_output_metadata) {
> > >   ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
> > > +
> > > + if (conn_state->hdr_output_metadata) {
> > > + ctrl |=
> > INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
> > > + ctrl |=
> > INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
> > > + ctrl |=
> > INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
> > > + }
> > 
> > Wasn't bunch of this stuff supposed to be only used with older hw, and more
> > recent panels were supposed to pick this up more or less automagically from
> > the HDR metadata?
> > 
> > I seem to also recall that there are a bunch of capability bits we should
> > probably be checking somewhere...
> > 
> 
> Hi Ville,
> Thanks for the review
> You are correct I had a look into it, content luminance will will fill from 
> the static metadata from ICL onwards will get that corrected 
> As for capability check that was already being done in the function 
> intel_dp_aux_supports_hdr_backlight()

I meant the HDR TCON caps. I don't see us checking any of that
currently.

> I soon send a revision with the fixes.
> 
> Regards,
> Suraj Kandpal
> > > +
> > >   intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
> > >   } else {
> > >   u32 pwm_level = intel_backlight_level_to_pwm(connector,
> > level); @@
> > > -292,9 +294,11 @@ intel_dp_aux_hdr_setup_backlight(struct
> > > intel_connector *connector, enum pipe pi  {
> > >   struct drm

[PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-07 Thread Suraj Kandpal
As of now whenerver HDR is switched on we use the PWM to change the
backlight as opposed to AUX based backlight changes in terms of nits.
This patch writes to the appropriate DPCD registers to enable aux
based backlight using values in nits.

--v2
-Fix max_cll and max_fall assignment [Jani]
-Fix the size sent in drm_dpcd_write [Jani]

--v3
-Content Luminance needs to be sent only for pre-ICL after that
it is directly picked up from hdr metadata [Ville]

Signed-off-by: Suraj Kandpal 
---
 .../drm/i915/display/intel_dp_aux_backlight.c | 33 ++-
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c 
b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
index 4f58efdc688a..cba7b8f5dad4 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
@@ -40,11 +40,6 @@
 #include "intel_dp.h"
 #include "intel_dp_aux_backlight.h"
 
-/* TODO:
- * Implement HDR, right now we just implement the bare minimum to bring us 
back into SDR mode so we
- * can make people's backlights work in the mean time
- */
-
 /*
  * DP AUX registers for Intel's proprietary HDR backlight interface. We define
  * them here since we'll likely be the only driver to ever use these.
@@ -221,7 +216,7 @@ intel_dp_aux_hdr_set_backlight(const struct 
drm_connector_state *conn_state, u32
struct intel_connector *connector = 
to_intel_connector(conn_state->connector);
struct intel_panel *panel = &connector->panel;
 
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
const u32 pwm_level = intel_backlight_level_to_pwm(connector, 
level);
@@ -251,8 +246,15 @@ intel_dp_aux_hdr_enable_backlight(const struct 
intel_crtc_state *crtc_state,
}
 
ctrl = old_ctrl;
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
+
+   if (conn_state->hdr_output_metadata) {
+   ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
+   ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
+   ctrl |= INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
+   }
+
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
u32 pwm_level = intel_backlight_level_to_pwm(connector, level);
@@ -292,9 +294,11 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
*connector, enum pipe pi
 {
struct drm_i915_private *i915 = to_i915(connector->base.dev);
struct intel_panel *panel = &connector->panel;
+   struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
struct drm_luminance_range_info *luminance_range =
&connector->base.display_info.luminance_range;
int ret;
+   u8 buf[4];
 
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDR backlight is controlled 
through %s\n",
connector->base.base.id, connector->base.name,
@@ -318,11 +322,24 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
*connector, enum pipe pi
panel->backlight.min = 0;
}
 
+   if (DISPLAY_VER(i915) < 11) {
+   buf[0] = connector->base.hdr_sink_metadata.hdmi_type1.max_cll & 
0xFF;
+   buf[1] = (connector->base.hdr_sink_metadata.hdmi_type1.max_cll 
& 0xFF00) >> 8;
+   buf[2] = connector->base.hdr_sink_metadata.hdmi_type1.max_fall 
& 0xFF;
+   buf[3] = (connector->base.hdr_sink_metadata.hdmi_type1.max_fall 
& 0xFF00) >> 8;
+
+   ret = drm_dp_dpcd_write(&intel_dp->aux, 
INTEL_EDP_HDR_CONTENT_LUMINANCE, buf,
+   sizeof(buf));
+   if (ret < 0)
+   drm_dbg_kms(&i915->drm,
+   "Content Luminance DPCD reg write failed, 
err:-%d\n",
+   ret);
+   }
+
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Using AUX HDR interface for 
backlight control (range %d..%d)\n",
connector->base.base.id, connector->base.name,
panel->backlight.min, panel->backlight.max);
 
-
panel->backlight.level = intel_dp_aux_hdr_get_backlight(connector, 
pipe);
panel->backlight.enabled = panel->backlight.level != 0;
 
-- 
2.43.2



RE: [PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-06 Thread Kandpal, Suraj



> -Original Message-
> From: Ville Syrjälä 
> Sent: Wednesday, March 6, 2024 5:57 PM
> To: Kandpal, Suraj 
> Cc: intel-gfx@lists.freedesktop.org; Shankar, Uma ;
> Nautiyal, Ankit K 
> Subject: Re: [PATCH] drm/i915/dp: Enable AUX based backlight for HDR
> 
> On Wed, Mar 06, 2024 at 02:29:15PM +0530, Suraj Kandpal wrote:
> > As of now whenerver HDR is switched on we use the PWM to change the
> > backlight as opposed to AUX based backlight changes in terms of nits.
> > This patch writes to the appropriate DPCD registers to enable aux
> > based backlight using values in nits.
> >
> > --v2
> > -Fix max_cll and max_fall assignment [Jani] -Fix the size sent in
> > drm_dpcd_write [Jani]
> >
> > Signed-off-by: Suraj Kandpal 
> > ---
> >  .../drm/i915/display/intel_dp_aux_backlight.c | 30
> > ++-
> >  1 file changed, 22 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > index 4f58efdc688a..1b6f14dacf3b 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > @@ -40,11 +40,6 @@
> >  #include "intel_dp.h"
> >  #include "intel_dp_aux_backlight.h"
> >
> > -/* TODO:
> > - * Implement HDR, right now we just implement the bare minimum to
> > bring us back into SDR mode so we
> > - * can make people's backlights work in the mean time
> > - */
> > -
> >  /*
> >   * DP AUX registers for Intel's proprietary HDR backlight interface. We 
> > define
> >   * them here since we'll likely be the only driver to ever use these.
> > @@ -221,7 +216,7 @@ intel_dp_aux_hdr_set_backlight(const struct
> drm_connector_state *conn_state, u32
> > struct intel_connector *connector = to_intel_connector(conn_state-
> >connector);
> > struct intel_panel *panel = &connector->panel;
> >
> > -   if (panel->backlight.edp.intel.sdr_uses_aux) {
> > +   if (panel->backlight.edp.intel.sdr_uses_aux ||
> > +conn_state->hdr_output_metadata) {
> > intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
> > } else {
> > const u32 pwm_level =
> intel_backlight_level_to_pwm(connector,
> > level); @@ -251,8 +246,15 @@ intel_dp_aux_hdr_enable_backlight(const
> struct intel_crtc_state *crtc_state,
> > }
> >
> > ctrl = old_ctrl;
> > -   if (panel->backlight.edp.intel.sdr_uses_aux) {
> > +   if (panel->backlight.edp.intel.sdr_uses_aux ||
> > +conn_state->hdr_output_metadata) {
> > ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
> > +
> > +   if (conn_state->hdr_output_metadata) {
> > +   ctrl |=
> INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
> > +   ctrl |=
> INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
> > +   ctrl |=
> INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
> > +   }
> 
> Wasn't bunch of this stuff supposed to be only used with older hw, and more
> recent panels were supposed to pick this up more or less automagically from
> the HDR metadata?
> 
> I seem to also recall that there are a bunch of capability bits we should
> probably be checking somewhere...
> 

Hi Ville,
Thanks for the review
You are correct I had a look into it, content luminance will will fill from the 
static metadata from ICL onwards will get that corrected 
As for capability check that was already being done in the function 
intel_dp_aux_supports_hdr_backlight()
I soon send a revision with the fixes.

Regards,
Suraj Kandpal
> > +
> > intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
> > } else {
> > u32 pwm_level = intel_backlight_level_to_pwm(connector,
> level); @@
> > -292,9 +294,11 @@ intel_dp_aux_hdr_setup_backlight(struct
> > intel_connector *connector, enum pipe pi  {
> > struct drm_i915_private *i915 = to_i915(connector->base.dev);
> > struct intel_panel *panel = &connector->panel;
> > +   struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
> > struct drm_luminance_range_info *luminance_range =
> > &connector->base.display_info.luminance_range;
> > int ret;
> > +   u8 buf[4];
> >
> > drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDR backlight is
> controlled through %s\n",
> > connector->base.base.id, connector->base.name, @@ -
> 318

Re: [PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-06 Thread Ville Syrjälä
On Wed, Mar 06, 2024 at 02:29:15PM +0530, Suraj Kandpal wrote:
> As of now whenerver HDR is switched on we use the PWM to change the
> backlight as opposed to AUX based backlight changes in terms of nits.
> This patch writes to the appropriate DPCD registers to enable aux
> based backlight using values in nits.
> 
> --v2
> -Fix max_cll and max_fall assignment [Jani]
> -Fix the size sent in drm_dpcd_write [Jani]
> 
> Signed-off-by: Suraj Kandpal 
> ---
>  .../drm/i915/display/intel_dp_aux_backlight.c | 30 ++-
>  1 file changed, 22 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c 
> b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> index 4f58efdc688a..1b6f14dacf3b 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> @@ -40,11 +40,6 @@
>  #include "intel_dp.h"
>  #include "intel_dp_aux_backlight.h"
>  
> -/* TODO:
> - * Implement HDR, right now we just implement the bare minimum to bring us 
> back into SDR mode so we
> - * can make people's backlights work in the mean time
> - */
> -
>  /*
>   * DP AUX registers for Intel's proprietary HDR backlight interface. We 
> define
>   * them here since we'll likely be the only driver to ever use these.
> @@ -221,7 +216,7 @@ intel_dp_aux_hdr_set_backlight(const struct 
> drm_connector_state *conn_state, u32
>   struct intel_connector *connector = 
> to_intel_connector(conn_state->connector);
>   struct intel_panel *panel = &connector->panel;
>  
> - if (panel->backlight.edp.intel.sdr_uses_aux) {
> + if (panel->backlight.edp.intel.sdr_uses_aux || 
> conn_state->hdr_output_metadata) {
>   intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
>   } else {
>   const u32 pwm_level = intel_backlight_level_to_pwm(connector, 
> level);
> @@ -251,8 +246,15 @@ intel_dp_aux_hdr_enable_backlight(const struct 
> intel_crtc_state *crtc_state,
>   }
>  
>   ctrl = old_ctrl;
> - if (panel->backlight.edp.intel.sdr_uses_aux) {
> + if (panel->backlight.edp.intel.sdr_uses_aux || 
> conn_state->hdr_output_metadata) {
>   ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
> +
> + if (conn_state->hdr_output_metadata) {
> + ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
> + ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
> + ctrl |= INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
> + }

Wasn't bunch of this stuff supposed to be only used with older hw,
and more recent panels were supposed to pick this up more or less
automagically from the HDR metadata?

I seem to also recall that there are a bunch of capability bits we
should probably be checking somewhere...

> +
>   intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
>   } else {
>   u32 pwm_level = intel_backlight_level_to_pwm(connector, level);
> @@ -292,9 +294,11 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
> *connector, enum pipe pi
>  {
>   struct drm_i915_private *i915 = to_i915(connector->base.dev);
>   struct intel_panel *panel = &connector->panel;
> + struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
>   struct drm_luminance_range_info *luminance_range =
>   &connector->base.display_info.luminance_range;
>   int ret;
> + u8 buf[4];
>  
>   drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDR backlight is controlled 
> through %s\n",
>   connector->base.base.id, connector->base.name,
> @@ -318,11 +322,21 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
> *connector, enum pipe pi
>   panel->backlight.min = 0;
>   }
>  
> + buf[0] = connector->base.hdr_sink_metadata.hdmi_type1.max_cll & 0xFF;
> + buf[1] = (connector->base.hdr_sink_metadata.hdmi_type1.max_cll & 
> 0xFF00) >> 8;
> + buf[2] = connector->base.hdr_sink_metadata.hdmi_type1.max_fall & 0xFF;
> + buf[3] = (connector->base.hdr_sink_metadata.hdmi_type1.max_fall & 
> 0xFF00) >> 8;
> +
> + ret = drm_dp_dpcd_write(&intel_dp->aux, 
> INTEL_EDP_HDR_CONTENT_LUMINANCE, buf,
> + sizeof(buf));
> + if (ret < 0)
> + drm_dbg_kms(&i915->drm,
> + "Not able to write content luminence to DPCD 
> register err:-%d\n", ret);
> +
>   drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Using AUX HDR interface for 
> backlight control (range %d..%d)\n",
>   connector->base.base.id, connector->base.name,
>   panel->backlight.min, panel->backlight.max);
>  
> -
>   panel->backlight.level = intel_dp_aux_hdr_get_backlight(connector, 
> pipe);
>   panel->backlight.enabled = panel->backlight.level != 0;
>  
> -- 
> 2.43.2

-- 
Ville Syrjälä
Intel


[PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-06 Thread Suraj Kandpal
As of now whenerver HDR is switched on we use the PWM to change the
backlight as opposed to AUX based backlight changes in terms of nits.
This patch writes to the appropriate DPCD registers to enable aux
based backlight using values in nits.

--v2
-Fix max_cll and max_fall assignment [Jani]
-Fix the size sent in drm_dpcd_write [Jani]

Signed-off-by: Suraj Kandpal 
---
 .../drm/i915/display/intel_dp_aux_backlight.c | 30 ++-
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c 
b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
index 4f58efdc688a..1b6f14dacf3b 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
@@ -40,11 +40,6 @@
 #include "intel_dp.h"
 #include "intel_dp_aux_backlight.h"
 
-/* TODO:
- * Implement HDR, right now we just implement the bare minimum to bring us 
back into SDR mode so we
- * can make people's backlights work in the mean time
- */
-
 /*
  * DP AUX registers for Intel's proprietary HDR backlight interface. We define
  * them here since we'll likely be the only driver to ever use these.
@@ -221,7 +216,7 @@ intel_dp_aux_hdr_set_backlight(const struct 
drm_connector_state *conn_state, u32
struct intel_connector *connector = 
to_intel_connector(conn_state->connector);
struct intel_panel *panel = &connector->panel;
 
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
const u32 pwm_level = intel_backlight_level_to_pwm(connector, 
level);
@@ -251,8 +246,15 @@ intel_dp_aux_hdr_enable_backlight(const struct 
intel_crtc_state *crtc_state,
}
 
ctrl = old_ctrl;
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
+
+   if (conn_state->hdr_output_metadata) {
+   ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
+   ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
+   ctrl |= INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
+   }
+
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
u32 pwm_level = intel_backlight_level_to_pwm(connector, level);
@@ -292,9 +294,11 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
*connector, enum pipe pi
 {
struct drm_i915_private *i915 = to_i915(connector->base.dev);
struct intel_panel *panel = &connector->panel;
+   struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
struct drm_luminance_range_info *luminance_range =
&connector->base.display_info.luminance_range;
int ret;
+   u8 buf[4];
 
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDR backlight is controlled 
through %s\n",
connector->base.base.id, connector->base.name,
@@ -318,11 +322,21 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
*connector, enum pipe pi
panel->backlight.min = 0;
}
 
+   buf[0] = connector->base.hdr_sink_metadata.hdmi_type1.max_cll & 0xFF;
+   buf[1] = (connector->base.hdr_sink_metadata.hdmi_type1.max_cll & 
0xFF00) >> 8;
+   buf[2] = connector->base.hdr_sink_metadata.hdmi_type1.max_fall & 0xFF;
+   buf[3] = (connector->base.hdr_sink_metadata.hdmi_type1.max_fall & 
0xFF00) >> 8;
+
+   ret = drm_dp_dpcd_write(&intel_dp->aux, 
INTEL_EDP_HDR_CONTENT_LUMINANCE, buf,
+   sizeof(buf));
+   if (ret < 0)
+   drm_dbg_kms(&i915->drm,
+   "Not able to write content luminence to DPCD 
register err:-%d\n", ret);
+
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Using AUX HDR interface for 
backlight control (range %d..%d)\n",
connector->base.base.id, connector->base.name,
panel->backlight.min, panel->backlight.max);
 
-
panel->backlight.level = intel_dp_aux_hdr_get_backlight(connector, 
pipe);
panel->backlight.enabled = panel->backlight.level != 0;
 
-- 
2.43.2



Re: [PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-05 Thread Jani Nikula
On Tue, 05 Mar 2024, Suraj Kandpal  wrote:
> As of now whenerver HDR is switched on we use the PWM to change the
> backlight as opposed to AUX based backlight changes in terms of nits.
> This patch writes to the appropriate DPCD registers to enable aux
> based backlight using values in nits.
>
> Signed-off-by: Suraj Kandpal 
> ---
>  .../drm/i915/display/intel_dp_aux_backlight.c | 29 ++-
>  1 file changed, 21 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c 
> b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> index 4f58efdc688a..14144347f13f 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> @@ -40,11 +40,6 @@
>  #include "intel_dp.h"
>  #include "intel_dp_aux_backlight.h"
>  
> -/* TODO:
> - * Implement HDR, right now we just implement the bare minimum to bring us 
> back into SDR mode so we
> - * can make people's backlights work in the mean time
> - */
> -
>  /*
>   * DP AUX registers for Intel's proprietary HDR backlight interface. We 
> define
>   * them here since we'll likely be the only driver to ever use these.
> @@ -221,7 +216,7 @@ intel_dp_aux_hdr_set_backlight(const struct 
> drm_connector_state *conn_state, u32
>   struct intel_connector *connector = 
> to_intel_connector(conn_state->connector);
>   struct intel_panel *panel = &connector->panel;
>  
> - if (panel->backlight.edp.intel.sdr_uses_aux) {
> + if (panel->backlight.edp.intel.sdr_uses_aux || 
> conn_state->hdr_output_metadata) {
>   intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
>   } else {
>   const u32 pwm_level = intel_backlight_level_to_pwm(connector, 
> level);
> @@ -251,8 +246,15 @@ intel_dp_aux_hdr_enable_backlight(const struct 
> intel_crtc_state *crtc_state,
>   }
>  
>   ctrl = old_ctrl;
> - if (panel->backlight.edp.intel.sdr_uses_aux) {
> + if (panel->backlight.edp.intel.sdr_uses_aux || 
> conn_state->hdr_output_metadata) {
>   ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
> +
> + if (conn_state->hdr_output_metadata) {
> + ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
> + ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
> + ctrl |= INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
> + }
> +
>   intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
>   } else {
>   u32 pwm_level = intel_backlight_level_to_pwm(connector, level);
> @@ -292,9 +294,11 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
> *connector, enum pipe pi
>  {
>   struct drm_i915_private *i915 = to_i915(connector->base.dev);
>   struct intel_panel *panel = &connector->panel;
> + struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
>   struct drm_luminance_range_info *luminance_range =
>   &connector->base.display_info.luminance_range;
>   int ret;
> + u8 buf[4];
>  
>   drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDR backlight is controlled 
> through %s\n",
>   connector->base.base.id, connector->base.name,
> @@ -318,11 +322,20 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
> *connector, enum pipe pi
>   panel->backlight.min = 0;
>   }
>  
> + buf[0] = panel->backlight.max & 0xFF;
> + buf[1] = (panel->backlight.max & 0xFF00) >> 8;
> + buf[2] = (connector->base.hdr_sink_metadata.hdmi_type1.max_fall & 0xFF) 
> >> 16;
> + buf[3] = (connector->base.hdr_sink_metadata.hdmi_type1.max_fall & 
> 0xFF00) >> 24;

These last two lines will always be 0, which, without looking at any
specs, is not right...

> +
> + ret = drm_dp_dpcd_write(&intel_dp->aux, 
> INTEL_EDP_HDR_CONTENT_LUMINANCE, buf,
> + sizeof(buf) != sizeof(buf));

...but then this doesn't write it to the sink anyway, and it's unclear
to me what this actually ends up doing or returning. For certain it's
all wrong.

Someone(tm) will still need to properly review the rest of the patch,
these just caught my eye at a quick glance.


BR,
Jani.


> + if (ret)
> + drm_dbg_kms(&i915->drm, "Not able to write content luminence to 
> DPCD register\n");
> +
>   drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Using AUX HDR interface for 
> backlight control (range %d..%d)\n",
>   connector->base.base.id, connector->base.name,
>   panel->backlight.min, panel->backlight.max);
>  
> -
>   panel->backlight.level = intel_dp_aux_hdr_get_backlight(connector, 
> pipe);
>   panel->backlight.enabled = panel->backlight.level != 0;

-- 
Jani Nikula, Intel


[PATCH] drm/i915/dp: Enable AUX based backlight for HDR

2024-03-05 Thread Suraj Kandpal
As of now whenerver HDR is switched on we use the PWM to change the
backlight as opposed to AUX based backlight changes in terms of nits.
This patch writes to the appropriate DPCD registers to enable aux
based backlight using values in nits.

Signed-off-by: Suraj Kandpal 
---
 .../drm/i915/display/intel_dp_aux_backlight.c | 29 ++-
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c 
b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
index 4f58efdc688a..14144347f13f 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
@@ -40,11 +40,6 @@
 #include "intel_dp.h"
 #include "intel_dp_aux_backlight.h"
 
-/* TODO:
- * Implement HDR, right now we just implement the bare minimum to bring us 
back into SDR mode so we
- * can make people's backlights work in the mean time
- */
-
 /*
  * DP AUX registers for Intel's proprietary HDR backlight interface. We define
  * them here since we'll likely be the only driver to ever use these.
@@ -221,7 +216,7 @@ intel_dp_aux_hdr_set_backlight(const struct 
drm_connector_state *conn_state, u32
struct intel_connector *connector = 
to_intel_connector(conn_state->connector);
struct intel_panel *panel = &connector->panel;
 
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
const u32 pwm_level = intel_backlight_level_to_pwm(connector, 
level);
@@ -251,8 +246,15 @@ intel_dp_aux_hdr_enable_backlight(const struct 
intel_crtc_state *crtc_state,
}
 
ctrl = old_ctrl;
-   if (panel->backlight.edp.intel.sdr_uses_aux) {
+   if (panel->backlight.edp.intel.sdr_uses_aux || 
conn_state->hdr_output_metadata) {
ctrl |= INTEL_EDP_HDR_TCON_BRIGHTNESS_AUX_ENABLE;
+
+   if (conn_state->hdr_output_metadata) {
+   ctrl |= INTEL_EDP_HDR_TCON_SEGMENTED_BACKLIGHT_ENABLE;
+   ctrl |= INTEL_EDP_HDR_TCON_2084_DECODE_ENABLE;
+   ctrl |= INTEL_EDP_HDR_TCON_2020_GAMUT_ENABLE;
+   }
+
intel_dp_aux_hdr_set_aux_backlight(conn_state, level);
} else {
u32 pwm_level = intel_backlight_level_to_pwm(connector, level);
@@ -292,9 +294,11 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
*connector, enum pipe pi
 {
struct drm_i915_private *i915 = to_i915(connector->base.dev);
struct intel_panel *panel = &connector->panel;
+   struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
struct drm_luminance_range_info *luminance_range =
&connector->base.display_info.luminance_range;
int ret;
+   u8 buf[4];
 
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDR backlight is controlled 
through %s\n",
connector->base.base.id, connector->base.name,
@@ -318,11 +322,20 @@ intel_dp_aux_hdr_setup_backlight(struct intel_connector 
*connector, enum pipe pi
panel->backlight.min = 0;
}
 
+   buf[0] = panel->backlight.max & 0xFF;
+   buf[1] = (panel->backlight.max & 0xFF00) >> 8;
+   buf[2] = (connector->base.hdr_sink_metadata.hdmi_type1.max_fall & 0xFF) 
>> 16;
+   buf[3] = (connector->base.hdr_sink_metadata.hdmi_type1.max_fall & 
0xFF00) >> 24;
+
+   ret = drm_dp_dpcd_write(&intel_dp->aux, 
INTEL_EDP_HDR_CONTENT_LUMINANCE, buf,
+   sizeof(buf) != sizeof(buf));
+   if (ret)
+   drm_dbg_kms(&i915->drm, "Not able to write content luminence to 
DPCD register\n");
+
drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Using AUX HDR interface for 
backlight control (range %d..%d)\n",
connector->base.base.id, connector->base.name,
panel->backlight.min, panel->backlight.max);
 
-
panel->backlight.level = intel_dp_aux_hdr_get_backlight(connector, 
pipe);
panel->backlight.enabled = panel->backlight.level != 0;
 
-- 
2.43.2