Re: [PATCH] drm/i915/dp: Tweak initial dpcd backlight.enabled value

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 2020-10-12 at 13:50 -0400, Sean Paul wrote:
> On Tue, Sep 22, 2020 at 11:36 AM Lyude Paul <lyude@xxxxxxxxxx> wrote:
> > On Tue, 2020-09-22 at 09:39 -0400, Sean Paul wrote:
> > > On Mon, Sep 21, 2020 at 6:35 PM Lyude Paul <lyude@xxxxxxxxxx> wrote:
> > > > So if I understand this correctly, it sounds like that some Pixelbooks
> > > > boot up
> > > > with DP_EDP_BACKLIGHT_BRIGHTNESS_MSB set to a non-zero value, without
> > > > the
> > > > panel actually having DPCD backlight controls enabled?
> > > 
> > > It boots with DP_EDP_BACKLIGHT_BRIGHTNESS_MSB == 0, which used to set
> > > backlight.enabled = false. By changing backlight.level = max,
> > > backlight.enabled is now set to true. This results in losing backlight
> > > control on boot (since the enable routine is no longer invoked).
> > > 
> > Ahhh ok, I'm fine with that - review still stands :)
> 
> Pinging intel maintainers, could someone please apply this?

oops, sorry about that. I can go ahead and push this
> 
> 
> Sean
> 
> > > Sean
> > > 
> > > > If I'm understanding that correctly, then this patch looks good to me:
> > > > 
> > > > Reviewed-by: Lyude Paul <lyude@xxxxxxxxxx>
> > > > 
> > > > On Thu, 2020-09-17 at 20:28 -0400, Sean Paul wrote:
> > > > > From: Sean Paul <seanpaul@xxxxxxxxxxxx>
> > > > > 
> > > > > In commit 79946723092b ("drm/i915: Assume 100% brightness when not in
> > > > > DPCD control mode"), we fixed the brightness level when DPCD control
> > > > > was
> > > > > not active to max brightness. This is as good as we can guess since
> > > > > most
> > > > > backlights go on full when uncontrolled.
> > > > > 
> > > > > However in doing so we changed the semantics of the initial
> > > > > 'backlight.enabled' value. At least on Pixelbooks, they  were relying
> > > > > on the brightness level in DP_EDP_BACKLIGHT_BRIGHTNESS_MSB to be 0 on
> > > > > boot such that enabled would be false. This causes the device to be
> > > > > enabled when the brightness is set. Without this, brightness control
> > > > > doesn't work. So by changing brightness to max, we also flipped
> > > > > enabled
> > > > > to be true on boot.
> > > > > 
> > > > > To fix this, make enabled a function of brightness and backlight
> > > > > control
> > > > > mechanism.
> > > > > 
> > > > > Fixes: 79946723092b ("drm/i915: Assume 100% brightness when not in
> > > > > DPCD
> > > > > control mode")
> > > > > Cc: Lyude Paul <lyude@xxxxxxxxxx>
> > > > > Cc: Jani Nikula <jani.nikula@xxxxxxxxx>
> > > > > Cc: Juha-Pekka Heikkila <juhapekka.heikkila@xxxxxxxxx>
> > > > > Cc: "Ville Syrjälä" <ville.syrjala@xxxxxxxxxxxxxxx>
> > > > > Cc: Rodrigo Vivi <rodrigo.vivi@xxxxxxxxx>
> > > > > Cc: Kevin Chowski <chowski@xxxxxxxxxxxx>>
> > > > > Signed-off-by: Sean Paul <seanpaul@xxxxxxxxxxxx>
> > > > > ---
> > > > >  .../drm/i915/display/intel_dp_aux_backlight.c | 31 ++++++++++++----
> > > > > ---
> > > > >  1 file changed, 20 insertions(+), 11 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 acbd7eb66cbe..036f504ac7db 100644
> > > > > --- a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > > > > +++ b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight.c
> > > > > @@ -52,17 +52,11 @@ static void set_aux_backlight_enable(struct
> > > > > intel_dp
> > > > > *intel_dp, bool enable)
> > > > >       }
> > > > >  }
> > > > > 
> > > > > -/*
> > > > > - * Read the current backlight value from DPCD register(s) based
> > > > > - * on if 8-bit(MSB) or 16-bit(MSB and LSB) values are supported
> > > > > - */
> > > > > -static u32 intel_dp_aux_get_backlight(struct intel_connector
> > > > > *connector)
> > > > > +static bool intel_dp_aux_backlight_dpcd_mode(struct intel_connector
> > > > > *connector)
> > > > >  {
> > > > >       struct intel_dp *intel_dp = intel_attached_dp(connector);
> > > > >       struct drm_i915_private *i915 = dp_to_i915(intel_dp);
> > > > > -     u8 read_val[2] = { 0x0 };
> > > > >       u8 mode_reg;
> > > > > -     u16 level = 0;
> > > > > 
> > > > >       if (drm_dp_dpcd_readb(&intel_dp->aux,
> > > > >                             DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
> > > > > @@ -70,15 +64,29 @@ static u32 intel_dp_aux_get_backlight(struct
> > > > > intel_connector *connector)
> > > > >               drm_dbg_kms(&i915->drm,
> > > > >                           "Failed to read the DPCD register 0x%x\n",
> > > > >                           DP_EDP_BACKLIGHT_MODE_SET_REGISTER);
> > > > > -             return 0;
> > > > > +             return false;
> > > > >       }
> > > > > 
> > > > > +     return (mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) ==
> > > > > +            DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD;
> > > > > +}
> > > > > +
> > > > > +/*
> > > > > + * Read the current backlight value from DPCD register(s) based
> > > > > + * on if 8-bit(MSB) or 16-bit(MSB and LSB) values are supported
> > > > > + */
> > > > > +static u32 intel_dp_aux_get_backlight(struct intel_connector
> > > > > *connector)
> > > > > +{
> > > > > +     struct intel_dp *intel_dp = intel_attached_dp(connector);
> > > > > +     struct drm_i915_private *i915 = dp_to_i915(intel_dp);
> > > > > +     u8 read_val[2] = { 0x0 };
> > > > > +     u16 level = 0;
> > > > > +
> > > > >       /*
> > > > >        * If we're not in DPCD control mode yet, the programmed
> > > > > brightness
> > > > >        * value is meaningless and we should assume max brightness
> > > > >        */
> > > > > -     if ((mode_reg & DP_EDP_BACKLIGHT_CONTROL_MODE_MASK) !=
> > > > > -         DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD)
> > > > > +     if (!intel_dp_aux_backlight_dpcd_mode(connector))
> > > > >               return connector->panel.backlight.max;
> > > > > 
> > > > >       if (drm_dp_dpcd_read(&intel_dp->aux,
> > > > > DP_EDP_BACKLIGHT_BRIGHTNESS_MSB,
> > > > > @@ -319,7 +327,8 @@ static int intel_dp_aux_setup_backlight(struct
> > > > > intel_connector *connector,
> > > > > 
> > > > >       panel->backlight.min = 0;
> > > > >       panel->backlight.level = intel_dp_aux_get_backlight(connector);
> > > > > -     panel->backlight.enabled = panel->backlight.level != 0;
> > > > > +     panel->backlight.enabled =
> > > > > intel_dp_aux_backlight_dpcd_mode(connector)
> > > > > &&
> > > > > +                                panel->backlight.level != 0;
> > > > > 
> > > > >       return 0;
> > > > >  }
> > > > --
> > > > Cheers,
> > > >         Lyude Paul (she/her)
> > > >         Software Engineer at Red Hat
> > > > 
> > --
> > Cheers,
> >         Lyude Paul (she/her)
> >         Software Engineer at Red Hat
> > 
-- 
Sincerely,
      Lyude Paul (she/her)
      Software Engineer at Red Hat

_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux