On Fri, 22 Nov 2019, Lyude Paul <lyude@xxxxxxxxxx> wrote: > 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. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112376 > Signed-off-by: Lyude Paul <lyude@xxxxxxxxxx> Acked-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/drm_dp_helper.c | 4 ++++ > drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c | 10 ++++++++-- > include/drm/drm_dp_helper.h | 8 ++++++++ > 3 files changed, 20 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c > index 2c7870aef469..ec7061e3a99b 100644 > --- a/drivers/gpu/drm/drm_dp_helper.c > +++ b/drivers/gpu/drm/drm_dp_helper.c > @@ -1155,6 +1155,10 @@ static const struct dpcd_quirk dpcd_quirk_list[] = { > { OUI(0x00, 0x10, 0xfa), DEVICE_ID_ANY, false, BIT(DP_DPCD_QUIRK_NO_PSR) }, > /* CH7511 seems to leave SINK_COUNT zeroed */ > { OUI(0x00, 0x00, 0x00), DEVICE_ID('C', 'H', '7', '5', '1', '1'), false, BIT(DP_DPCD_QUIRK_NO_SINK_COUNT) }, > + /* 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 87b59db9ffe3..3d61260b08ad 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c > @@ -325,11 +325,17 @@ 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->base); > + struct drm_i915_private *dev_priv = > + 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)) > + dev_priv->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 51ecb5112ef8..a444209cd54b 100644 > --- a/include/drm/drm_dp_helper.h > +++ b/include/drm/drm_dp_helper.h > @@ -1520,6 +1520,14 @@ enum drm_dp_quirk { > * The driver should ignore SINK_COUNT during detection. > */ > DP_DPCD_QUIRK_NO_SINK_COUNT, > + /** > + * @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, Intel Open Source Graphics Center _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel