diff mbox series

[v2,5/5] drm/i915: Force DPCD backlight mode on X1 Extreme 2nd Gen 4K AMOLED panel

Message ID 99df51313fd8112a9eb8d30dde19dde51e0c618b.1579010266.git.jani.nikula@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915: eDP DPCD aux backlight fixes | expand

Commit Message

Jani Nikula Jan. 14, 2020, 2:01 p.m. UTC
From: Lyude Paul <lyude@redhat.com>

Annoyingly, the VBT on the ThinkPad X1 Extreme 2nd Gen indicates that
the system uses plain PWM based backlight controls, when in reality the
only backlight controls that work are the standard VESA eDP DPCD
backlight controls.

Honestly, this makes me wonder how many other systems have these issues
or lie about this in their VBT. Not sure we have any good way of finding
out until panels like this become more common place in the laptop
market. For now, just add a DRM DP quirk to indicate that this panel is
telling the truth and is being a good LCD.

v2 by Jani:
- rebase

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112376
Closes: https://gitlab.freedesktop.org/drm/intel/issues/642
Tested-by: AceLan Kao <acelan.kao@canonical.com>
Signed-off-by: Lyude Paul <lyude@redhat.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_dp_helper.c                       | 4 ++++
 drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c | 8 ++++++--
 include/drm/drm_dp_helper.h                           | 8 ++++++++
 3 files changed, 18 insertions(+), 2 deletions(-)

Comments

Lyude Paul Jan. 14, 2020, 11:36 p.m. UTC | #1
fwiw - I got some feedback from one of the vendors that we work with that I
haven't gone through yet, but I'm hoping to figure out whether we want to
trust the vbt/dpcd based off that once I do. Once we've made up the decision
on that (and I send out a reroll if needed), think this is good to merge? (I
don't see any issues with any of the changes you've made, and they seem to
work fine on my machines)

On Tue, 2020-01-14 at 16:01 +0200, Jani Nikula wrote:
> From: Lyude Paul <lyude@redhat.com>
> 
> Annoyingly, the VBT on the ThinkPad X1 Extreme 2nd Gen indicates that
> the system uses plain PWM based backlight controls, when in reality the
> only backlight controls that work are the standard VESA eDP DPCD
> backlight controls.
> 
> Honestly, this makes me wonder how many other systems have these issues
> or lie about this in their VBT. Not sure we have any good way of finding
> out until panels like this become more common place in the laptop
> market. For now, just add a DRM DP quirk to indicate that this panel is
> telling the truth and is being a good LCD.
> 
> v2 by Jani:
> - rebase
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112376
> Closes: https://gitlab.freedesktop.org/drm/intel/issues/642
> Tested-by: AceLan Kao <acelan.kao@canonical.com>
> Signed-off-by: Lyude Paul <lyude@redhat.com>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>  drivers/gpu/drm/drm_dp_helper.c                       | 4 ++++
>  drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c | 8 ++++++--
>  include/drm/drm_dp_helper.h                           | 8 ++++++++
>  3 files changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_dp_helper.c
> b/drivers/gpu/drm/drm_dp_helper.c
> index 5a103e9b3c86..90e122809fa4 100644
> --- a/drivers/gpu/drm/drm_dp_helper.c
> +++ b/drivers/gpu/drm/drm_dp_helper.c
> @@ -1179,6 +1179,10 @@ static const struct dpcd_quirk dpcd_quirk_list[] = {
>  	{ OUI(0x00, 0x00, 0x00), DEVICE_ID('C', 'H', '7', '5', '1', '1'),
> false, BIT(DP_DPCD_QUIRK_NO_SINK_COUNT) },
>  	/* Synaptics DP1.4 MST hubs can support DSC without virtual DPCD */
>  	{ OUI(0x90, 0xCC, 0x24), DEVICE_ID_ANY, true,
> BIT(DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) },
> +	/* Optional 4K AMOLED panel in the ThinkPad X1 Extreme 2nd Generation
> +	 * only supports DPCD backlight controls, despite advertising
> otherwise
> +	 */
> +	{ OUI(0xba, 0x41, 0x59), DEVICE_ID_ANY, false,
> BIT(DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT) },
>  };
>  
>  #undef OUI
> 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 77a759361c5c..57774003e8c5 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> @@ -328,11 +328,15 @@ intel_dp_aux_display_control_capable(struct
> intel_connector *connector)
>  int intel_dp_aux_init_backlight_funcs(struct intel_connector
> *intel_connector)
>  {
>  	struct intel_panel *panel = &intel_connector->panel;
> -	struct drm_i915_private *dev_priv = to_i915(intel_connector-
> >base.dev);
> +	struct intel_dp *intel_dp = enc_to_intel_dp(intel_connector->encoder);
> +	struct drm_i915_private *i915 = to_i915(intel_connector->base.dev);
>  
>  	if (i915_modparams.enable_dpcd_backlight == 0 ||
>  	    (i915_modparams.enable_dpcd_backlight == -1 &&
> -	    dev_priv->vbt.backlight.type !=
> INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE))
> +	     i915->vbt.backlight.type !=
> +	     INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE &&
> +	     !drm_dp_has_quirk(&intel_dp->desc,
> +			       DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT)))
>  		return -ENODEV;
>  
>  	if (!intel_dp_aux_display_control_capable(intel_connector))
> diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
> index 262faf9e5e94..bb081921f53d 100644
> --- a/include/drm/drm_dp_helper.h
> +++ b/include/drm/drm_dp_helper.h
> @@ -1532,6 +1532,14 @@ enum drm_dp_quirk {
>  	 * The DSC caps can be read from the physical aux instead.
>  	 */
>  	DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD,
> +	/**
> +	 * @DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT:
> +	 *
> +	 * The device is telling the truth when it says that it uses DPCD
> +	 * backlight controls, even if the system's firmware disagrees.
> +	 * The driver should honor the DPCD backlight capabilities advertised.
> +	 */
> +	DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT,
>  };
>  
>  /**
Jani Nikula Jan. 15, 2020, 8:32 a.m. UTC | #2
On Tue, 14 Jan 2020, Lyude Paul <lyude@redhat.com> wrote:
> fwiw - I got some feedback from one of the vendors that we work with that I
> haven't gone through yet, but I'm hoping to figure out whether we want to
> trust the vbt/dpcd based off that once I do. Once we've made up the decision
> on that (and I send out a reroll if needed), think this is good to merge? (I
> don't see any issues with any of the changes you've made, and they seem to
> work fine on my machines)

Thanks, yes, my idea was that I'd merge this after CI says good to
go. But do let me know if you get more information.

BR,
Jani.


>
> On Tue, 2020-01-14 at 16:01 +0200, Jani Nikula wrote:
>> From: Lyude Paul <lyude@redhat.com>
>> 
>> Annoyingly, the VBT on the ThinkPad X1 Extreme 2nd Gen indicates that
>> the system uses plain PWM based backlight controls, when in reality the
>> only backlight controls that work are the standard VESA eDP DPCD
>> backlight controls.
>> 
>> Honestly, this makes me wonder how many other systems have these issues
>> or lie about this in their VBT. Not sure we have any good way of finding
>> out until panels like this become more common place in the laptop
>> market. For now, just add a DRM DP quirk to indicate that this panel is
>> telling the truth and is being a good LCD.
>> 
>> v2 by Jani:
>> - rebase
>> 
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112376
>> Closes: https://gitlab.freedesktop.org/drm/intel/issues/642
>> Tested-by: AceLan Kao <acelan.kao@canonical.com>
>> Signed-off-by: Lyude Paul <lyude@redhat.com>
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> ---
>>  drivers/gpu/drm/drm_dp_helper.c                       | 4 ++++
>>  drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c | 8 ++++++--
>>  include/drm/drm_dp_helper.h                           | 8 ++++++++
>>  3 files changed, 18 insertions(+), 2 deletions(-)
>> 
>> diff --git a/drivers/gpu/drm/drm_dp_helper.c
>> b/drivers/gpu/drm/drm_dp_helper.c
>> index 5a103e9b3c86..90e122809fa4 100644
>> --- a/drivers/gpu/drm/drm_dp_helper.c
>> +++ b/drivers/gpu/drm/drm_dp_helper.c
>> @@ -1179,6 +1179,10 @@ static const struct dpcd_quirk dpcd_quirk_list[] = {
>>  	{ OUI(0x00, 0x00, 0x00), DEVICE_ID('C', 'H', '7', '5', '1', '1'),
>> false, BIT(DP_DPCD_QUIRK_NO_SINK_COUNT) },
>>  	/* Synaptics DP1.4 MST hubs can support DSC without virtual DPCD */
>>  	{ OUI(0x90, 0xCC, 0x24), DEVICE_ID_ANY, true,
>> BIT(DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) },
>> +	/* Optional 4K AMOLED panel in the ThinkPad X1 Extreme 2nd Generation
>> +	 * only supports DPCD backlight controls, despite advertising
>> otherwise
>> +	 */
>> +	{ OUI(0xba, 0x41, 0x59), DEVICE_ID_ANY, false,
>> BIT(DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT) },
>>  };
>>  
>>  #undef OUI
>> 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 77a759361c5c..57774003e8c5 100644
>> --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
>> @@ -328,11 +328,15 @@ intel_dp_aux_display_control_capable(struct
>> intel_connector *connector)
>>  int intel_dp_aux_init_backlight_funcs(struct intel_connector
>> *intel_connector)
>>  {
>>  	struct intel_panel *panel = &intel_connector->panel;
>> -	struct drm_i915_private *dev_priv = to_i915(intel_connector-
>> >base.dev);
>> +	struct intel_dp *intel_dp = enc_to_intel_dp(intel_connector->encoder);
>> +	struct drm_i915_private *i915 = to_i915(intel_connector->base.dev);
>>  
>>  	if (i915_modparams.enable_dpcd_backlight == 0 ||
>>  	    (i915_modparams.enable_dpcd_backlight == -1 &&
>> -	    dev_priv->vbt.backlight.type !=
>> INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE))
>> +	     i915->vbt.backlight.type !=
>> +	     INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE &&
>> +	     !drm_dp_has_quirk(&intel_dp->desc,
>> +			       DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT)))
>>  		return -ENODEV;
>>  
>>  	if (!intel_dp_aux_display_control_capable(intel_connector))
>> diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
>> index 262faf9e5e94..bb081921f53d 100644
>> --- a/include/drm/drm_dp_helper.h
>> +++ b/include/drm/drm_dp_helper.h
>> @@ -1532,6 +1532,14 @@ enum drm_dp_quirk {
>>  	 * The DSC caps can be read from the physical aux instead.
>>  	 */
>>  	DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD,
>> +	/**
>> +	 * @DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT:
>> +	 *
>> +	 * The device is telling the truth when it says that it uses DPCD
>> +	 * backlight controls, even if the system's firmware disagrees.
>> +	 * The driver should honor the DPCD backlight capabilities advertised.
>> +	 */
>> +	DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT,
>>  };
>>  
>>  /**
Lyude Paul Jan. 15, 2020, 11:36 p.m. UTC | #3
sigh… so I just went through the correspondence with the vendor I mentioned
and unfortunately the answer is still unclear. It looks like that for some of
these panels there might actually be some bits in the EDID (!?!?) that are
supposed to correspond to the backlight interface. weird. on top of that I'm
not even sure if these EDID bits are actually standard. Interestingly enough
it seems like they're also intending for some of their panels to be able to be
used in both PWM and DPCD mode, and will eventually drop the PWM
compatibility.

Note this vendor isn't Lenovo, so I'm assuming that's probably why pwm mode
doesn't work at all on this X1 extreme.

That being said all I've seen are systems that don't specify this correctly in
the vbt but do in the dpcd, so I'm going to go ahead and change this patch
series over to using the dpcd by default instead. If this actually breaks any
systems out there we can change the default behavior later. I will do a respin
of the series asap (will have it on the list today or tommorrow, will merge
after CI gives the OK).

On Wed, 2020-01-15 at 10:32 +0200, Jani Nikula wrote:
> On Tue, 14 Jan 2020, Lyude Paul <lyude@redhat.com> wrote:
> > fwiw - I got some feedback from one of the vendors that we work with that
> > I
> > haven't gone through yet, but I'm hoping to figure out whether we want to
> > trust the vbt/dpcd based off that once I do. Once we've made up the
> > decision
> > on that (and I send out a reroll if needed), think this is good to merge?
> > (I
> > don't see any issues with any of the changes you've made, and they seem to
> > work fine on my machines)
> 
> Thanks, yes, my idea was that I'd merge this after CI says good to
> go. But do let me know if you get more information.
> 
> BR,
> Jani.
> 
> 
> > On Tue, 2020-01-14 at 16:01 +0200, Jani Nikula wrote:
> > > From: Lyude Paul <lyude@redhat.com>
> > > 
> > > Annoyingly, the VBT on the ThinkPad X1 Extreme 2nd Gen indicates that
> > > the system uses plain PWM based backlight controls, when in reality the
> > > only backlight controls that work are the standard VESA eDP DPCD
> > > backlight controls.
> > > 
> > > Honestly, this makes me wonder how many other systems have these issues
> > > or lie about this in their VBT. Not sure we have any good way of finding
> > > out until panels like this become more common place in the laptop
> > > market. For now, just add a DRM DP quirk to indicate that this panel is
> > > telling the truth and is being a good LCD.
> > > 
> > > v2 by Jani:
> > > - rebase
> > > 
> > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112376
> > > Closes: https://gitlab.freedesktop.org/drm/intel/issues/642
> > > Tested-by: AceLan Kao <acelan.kao@canonical.com>
> > > Signed-off-by: Lyude Paul <lyude@redhat.com>
> > > Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> > > ---
> > >  drivers/gpu/drm/drm_dp_helper.c                       | 4 ++++
> > >  drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c | 8 ++++++--
> > >  include/drm/drm_dp_helper.h                           | 8 ++++++++
> > >  3 files changed, 18 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/drm_dp_helper.c
> > > b/drivers/gpu/drm/drm_dp_helper.c
> > > index 5a103e9b3c86..90e122809fa4 100644
> > > --- a/drivers/gpu/drm/drm_dp_helper.c
> > > +++ b/drivers/gpu/drm/drm_dp_helper.c
> > > @@ -1179,6 +1179,10 @@ static const struct dpcd_quirk dpcd_quirk_list[]
> > > = {
> > >  	{ OUI(0x00, 0x00, 0x00), DEVICE_ID('C', 'H', '7', '5', '1', '1'),
> > > false, BIT(DP_DPCD_QUIRK_NO_SINK_COUNT) },
> > >  	/* Synaptics DP1.4 MST hubs can support DSC without virtual DPCD */
> > >  	{ OUI(0x90, 0xCC, 0x24), DEVICE_ID_ANY, true,
> > > BIT(DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) },
> > > +	/* Optional 4K AMOLED panel in the ThinkPad X1 Extreme 2nd Generation
> > > +	 * only supports DPCD backlight controls, despite advertising
> > > otherwise
> > > +	 */
> > > +	{ OUI(0xba, 0x41, 0x59), DEVICE_ID_ANY, false,
> > > BIT(DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT) },
> > >  };
> > >  
> > >  #undef OUI
> > > 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 77a759361c5c..57774003e8c5 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > > @@ -328,11 +328,15 @@ intel_dp_aux_display_control_capable(struct
> > > intel_connector *connector)
> > >  int intel_dp_aux_init_backlight_funcs(struct intel_connector
> > > *intel_connector)
> > >  {
> > >  	struct intel_panel *panel = &intel_connector->panel;
> > > -	struct drm_i915_private *dev_priv = to_i915(intel_connector-
> > > > base.dev);
> > > +	struct intel_dp *intel_dp = enc_to_intel_dp(intel_connector->encoder);
> > > +	struct drm_i915_private *i915 = to_i915(intel_connector->base.dev);
> > >  
> > >  	if (i915_modparams.enable_dpcd_backlight == 0 ||
> > >  	    (i915_modparams.enable_dpcd_backlight == -1 &&
> > > -	    dev_priv->vbt.backlight.type !=
> > > INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE))
> > > +	     i915->vbt.backlight.type !=
> > > +	     INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE &&
> > > +	     !drm_dp_has_quirk(&intel_dp->desc,
> > > +			       DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT)))
> > >  		return -ENODEV;
> > >  
> > >  	if (!intel_dp_aux_display_control_capable(intel_connector))
> > > diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
> > > index 262faf9e5e94..bb081921f53d 100644
> > > --- a/include/drm/drm_dp_helper.h
> > > +++ b/include/drm/drm_dp_helper.h
> > > @@ -1532,6 +1532,14 @@ enum drm_dp_quirk {
> > >  	 * The DSC caps can be read from the physical aux instead.
> > >  	 */
> > >  	DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD,
> > > +	/**
> > > +	 * @DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT:
> > > +	 *
> > > +	 * The device is telling the truth when it says that it uses DPCD
> > > +	 * backlight controls, even if the system's firmware disagrees.
> > > +	 * The driver should honor the DPCD backlight capabilities advertised.
> > > +	 */
> > > +	DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT,
> > >  };
> > >  
> > >  /**
Jani Nikula Jan. 16, 2020, 11:24 a.m. UTC | #4
On Wed, 15 Jan 2020, Lyude Paul <lyude@redhat.com> wrote:
> sigh… so I just went through the correspondence with the vendor I mentioned
> and unfortunately the answer is still unclear. It looks like that for some of
> these panels there might actually be some bits in the EDID (!?!?) that are
> supposed to correspond to the backlight interface. weird. on top of that I'm
> not even sure if these EDID bits are actually standard. Interestingly enough
> it seems like they're also intending for some of their panels to be able to be
> used in both PWM and DPCD mode, and will eventually drop the PWM
> compatibility.
>
> Note this vendor isn't Lenovo, so I'm assuming that's probably why pwm mode
> doesn't work at all on this X1 extreme.
>
> That being said all I've seen are systems that don't specify this correctly in
> the vbt but do in the dpcd, so I'm going to go ahead and change this patch
> series over to using the dpcd by default instead. If this actually breaks any
> systems out there we can change the default behavior later. I will do a respin
> of the series asap (will have it on the list today or tommorrow, will merge
> after CI gives the OK).

Don't worry, nothing about displays really surprises me anymore.

I'm fine with the idea of trying to use the DPCD alone to enable aux
backlight. We need to try to make this work out of the box, without
module parameters.

Just make sure it's reasonably easy to revert in case issues do arise...

BR,
Jani.
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 5a103e9b3c86..90e122809fa4 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -1179,6 +1179,10 @@  static const struct dpcd_quirk dpcd_quirk_list[] = {
 	{ OUI(0x00, 0x00, 0x00), DEVICE_ID('C', 'H', '7', '5', '1', '1'), false, BIT(DP_DPCD_QUIRK_NO_SINK_COUNT) },
 	/* Synaptics DP1.4 MST hubs can support DSC without virtual DPCD */
 	{ OUI(0x90, 0xCC, 0x24), DEVICE_ID_ANY, true, BIT(DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) },
+	/* Optional 4K AMOLED panel in the ThinkPad X1 Extreme 2nd Generation
+	 * only supports DPCD backlight controls, despite advertising otherwise
+	 */
+	{ OUI(0xba, 0x41, 0x59), DEVICE_ID_ANY, false, BIT(DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT) },
 };
 
 #undef OUI
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 77a759361c5c..57774003e8c5 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
@@ -328,11 +328,15 @@  intel_dp_aux_display_control_capable(struct intel_connector *connector)
 int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector)
 {
 	struct intel_panel *panel = &intel_connector->panel;
-	struct drm_i915_private *dev_priv = to_i915(intel_connector->base.dev);
+	struct intel_dp *intel_dp = enc_to_intel_dp(intel_connector->encoder);
+	struct drm_i915_private *i915 = to_i915(intel_connector->base.dev);
 
 	if (i915_modparams.enable_dpcd_backlight == 0 ||
 	    (i915_modparams.enable_dpcd_backlight == -1 &&
-	    dev_priv->vbt.backlight.type != INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE))
+	     i915->vbt.backlight.type !=
+	     INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE &&
+	     !drm_dp_has_quirk(&intel_dp->desc,
+			       DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT)))
 		return -ENODEV;
 
 	if (!intel_dp_aux_display_control_capable(intel_connector))
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index 262faf9e5e94..bb081921f53d 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -1532,6 +1532,14 @@  enum drm_dp_quirk {
 	 * The DSC caps can be read from the physical aux instead.
 	 */
 	DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD,
+	/**
+	 * @DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT:
+	 *
+	 * The device is telling the truth when it says that it uses DPCD
+	 * backlight controls, even if the system's firmware disagrees.
+	 * The driver should honor the DPCD backlight capabilities advertised.
+	 */
+	DP_DPCD_QUIRK_FORCE_DPCD_BACKLIGHT,
 };
 
 /**