On Mon, Aug 18, 2014 at 10:16:06PM +0300, ville.syrjala@xxxxxxxxxxxxxxx wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Try to make sure we find the power sequencer that the BIOS used > by first looking for one which has the panel power enabled, then > fall back to one with VDD force bit enabled, and finally look at > just the port select bits. This should make us pick the correct > power sequencer when the BIOS has already enabled the panel. > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_dp.c | 36 ++++++++++++++++++++++++++++++++++-- > 1 file changed, 34 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > index 4614e6e..4952783 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -341,9 +341,31 @@ vlv_power_sequencer_pipe(struct intel_dp *intel_dp) > return intel_dp->pps_pipe; > } > > +typedef bool (*vlv_pipe_check)(struct drm_i915_private *dev_priv, > + enum pipe pipe); > + > +static bool vlv_pipe_has_pp_on(struct drm_i915_private *dev_priv, > + enum pipe pipe) > +{ > + return I915_READ(VLV_PIPE_PP_STATUS(pipe)) & PP_ON; > +} > + > +static bool vlv_pipe_has_vdd_on(struct drm_i915_private *dev_priv, > + enum pipe pipe) > +{ > + return I915_READ(VLV_PIPE_PP_CONTROL(pipe)) & EDP_FORCE_VDD; > +} > + > +static bool vlv_pipe_any(struct drm_i915_private *dev_priv, > + enum pipe pipe) > +{ > + return true; > +} > + > static enum pipe > vlv_initial_power_sequencer_pipe(struct drm_i915_private *dev_priv, I've done a s/popwer_sequencer/pps/ here to make the lines fit. Might want to roll that out in general perhaps, atm there's a mix of power_sequencer and pps. -Daniel > - enum port port) > + enum port port, > + vlv_pipe_check pipe_check) > { > enum pipe pipe; > > @@ -354,6 +376,9 @@ vlv_initial_power_sequencer_pipe(struct drm_i915_private *dev_priv, > if (port_sel != PANEL_PORT_SELECT_VLV(port)) > continue; > > + if (!pipe_check(dev_priv, pipe)) > + continue; > + > return pipe; > } > > @@ -372,7 +397,14 @@ vlv_initial_power_sequencer_setup(struct intel_dp *intel_dp) > lockdep_assert_held(&dev_priv->pps_mutex); > > /* try to find a pipe with this port selected */ > - intel_dp->pps_pipe = vlv_initial_power_sequencer_pipe(dev_priv, port); > + /* first pick one where the panel is on */ > + intel_dp->pps_pipe = vlv_initial_power_sequencer_pipe(dev_priv, port, vlv_pipe_has_pp_on); > + /* didn't find one? pick one where vdd is on */ > + if (intel_dp->pps_pipe == INVALID_PIPE) > + intel_dp->pps_pipe = vlv_initial_power_sequencer_pipe(dev_priv, port, vlv_pipe_has_vdd_on); > + /* didn't find one? pick one with just the correct port */ > + if (intel_dp->pps_pipe == INVALID_PIPE) > + intel_dp->pps_pipe = vlv_initial_power_sequencer_pipe(dev_priv, port, vlv_pipe_any); > > /* didn't find one? just let vlv_power_sequencer_pipe() pick one when needed */ > if (intel_dp->pps_pipe == INVALID_PIPE) { > -- > 1.8.5.5 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx