On Wed, Jun 12, 2013 at 11:47:24AM +0200, Daniel Vetter wrote: > We don't (yet) have proper pixel multiplier readout support on pch > split platforms, so the cross check will naturally fail. > > v2: Fix spelling in the comment, spotted by Ville. > > v3: Since the ordering constraint is pretty tricky between the crtc > get_pipe_config callback and the encoder->get_config callback add a > few comments about it. Prompted by a discussion with Chris Wilson on > irc about why this does work anywhere else than on i915g/gm. > > Reported-by: Chris Wilson <chris at chris-wilson.co.uk> > Cc: Chris Wilson <chris at chris-wilson.co.uk> > Cc: Ville Syrj?l? <ville.syrjala at linux.intel.com> > Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch> Merged with Chris' irc-ack to dinq. -Daniel > --- > drivers/gpu/drm/i915/intel_drv.h | 3 ++- > drivers/gpu/drm/i915/intel_sdvo.c | 11 +++++++++++ > 2 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 3363358..cf26fa8 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -140,7 +140,8 @@ struct intel_encoder { > * it is connected to in the pipe parameter. */ > bool (*get_hw_state)(struct intel_encoder *, enum pipe *pipe); > /* Reconstructs the equivalent mode flags for the current hardware > - * state. */ > + * state. This must be called _after_ display->get_pipe_config has > + * pre-filled the pipe config. */ > void (*get_config)(struct intel_encoder *, > struct intel_crtc_config *pipe_config); > int crtc_mask; > diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c > index a6c53b6..1327fa9 100644 > --- a/drivers/gpu/drm/i915/intel_sdvo.c > +++ b/drivers/gpu/drm/i915/intel_sdvo.c > @@ -1342,6 +1342,13 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder, > > pipe_config->adjusted_mode.flags |= flags; > > + /* > + * pixel multiplier readout is tricky: Only on i915g/gm it is stored in > + * the sdvo port register, on all other platforms it is part of the dpll > + * state. Since the general pipe state readout happens before the > + * encoder->get_config we so already have a valid pixel multplier on all > + * other platfroms. > + */ > if (IS_I915G(dev) || IS_I915GM(dev)) { > sdvox = I915_READ(intel_sdvo->sdvo_reg); > pipe_config->pixel_multiplier = > @@ -1362,6 +1369,10 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder, > encoder_pixel_multiplier = 4; > break; > } > + > + if(HAS_PCH_SPLIT(dev)) > + return; /* no pixel multiplier readout support yet */ > + > WARN(encoder_pixel_multiplier != pipe_config->pixel_multiplier, > "SDVO pixel multiplier mismatch, port: %i, encoder: %i\n", > pipe_config->pixel_multiplier, encoder_pixel_multiplier); > -- > 1.7.11.7 > -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch