On Mon, Sep 23, 2013 at 02:48:50PM +0300, ville.syrjala@xxxxxxxxxxxxxxx wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > We have all the information we need in the mode structure, so going and > reading it from the hardware is pointless, and slower. > > We never populated ->get_vblank_timestamp() in the UMS case, and as that > is the only way we'd ever call ->get_scanout_position(), we can > completely ignore UMS in i915_get_crtc_scanoutpos(). > > Also reorganize intel_irq_init() a bit to clarify the KMS vs. UMS > situation. > > v2: Drop UMS code > > Cc: Mario Kleiner <mario.kleiner@xxxxxxxxxxxxxxxx> > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_irq.c | 43 ++++++++++++++++------------------------- > 1 file changed, 17 insertions(+), 26 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c > index b356dc1..058f099 100644 > --- a/drivers/gpu/drm/i915/i915_irq.c > +++ b/drivers/gpu/drm/i915/i915_irq.c > @@ -570,24 +570,29 @@ static u32 gm45_get_vblank_counter(struct drm_device *dev, int pipe) > static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, > int *vpos, int *hpos) > { > - drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; > - u32 vbl = 0, position = 0; > + struct drm_i915_private *dev_priv = dev->dev_private; > + struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe]; > + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); > + const struct drm_display_mode *mode = &intel_crtc->config.adjusted_mode; > + u32 position; > int vbl_start, vbl_end, htotal, vtotal; > bool in_vbl = true; > int ret = 0; > - enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv, > - pipe); Hooray, this rips out the racy pipe_to_cpu_transcoder deref, so I'm all in favour \o/ Of course I still have that ugly itme on my todo about "fix the locking for kms vblank stuff" ;-) Mario, can you please take a look at these patches and ack them? I'd like to slurp them in for -next. -Daniel > > - if (!i915_pipe_enabled(dev, pipe)) { > + if (!intel_crtc->active) { > DRM_DEBUG_DRIVER("trying to get scanoutpos for disabled " > "pipe %c\n", pipe_name(pipe)); > return 0; > } > > - /* Get vtotal. */ > - vtotal = 1 + ((I915_READ(VTOTAL(cpu_transcoder)) >> 16) & 0x1fff); > + htotal = mode->crtc_htotal; > + vtotal = mode->crtc_vtotal; > + vbl_start = mode->crtc_vblank_start; > + vbl_end = mode->crtc_vblank_end; > > - if (INTEL_INFO(dev)->gen >= 4) { > + ret |= DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE; > + > + if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) { > /* No obvious pixelcount register. Only query vertical > * scanout position from Display scan line register. > */ > @@ -605,29 +610,16 @@ static int i915_get_crtc_scanoutpos(struct drm_device *dev, int pipe, > */ > position = (I915_READ(PIPEFRAMEPIXEL(pipe)) & PIPE_PIXEL_MASK) >> PIPE_PIXEL_SHIFT; > > - htotal = 1 + ((I915_READ(HTOTAL(cpu_transcoder)) >> 16) & 0x1fff); > *vpos = position / htotal; > *hpos = position - (*vpos * htotal); > } > > - /* Query vblank area. */ > - vbl = I915_READ(VBLANK(cpu_transcoder)); > - > - /* Test position against vblank region. */ > - vbl_start = vbl & 0x1fff; > - vbl_end = (vbl >> 16) & 0x1fff; > - > - if ((*vpos < vbl_start) || (*vpos > vbl_end)) > - in_vbl = false; > + in_vbl = *vpos >= vbl_start && *vpos < vbl_end; > > /* Inside "upper part" of vblank area? Apply corrective offset: */ > if (in_vbl && (*vpos >= vbl_start)) > *vpos = *vpos - vtotal; > > - /* Readouts valid? */ > - if (vbl > 0) > - ret |= DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_ACCURATE; > - > /* In vblank? */ > if (in_vbl) > ret |= DRM_SCANOUTPOS_INVBL; > @@ -3148,11 +3140,10 @@ void intel_irq_init(struct drm_device *dev) > dev->driver->get_vblank_counter = gm45_get_vblank_counter; > } > > - if (drm_core_check_feature(dev, DRIVER_MODESET)) > + if (drm_core_check_feature(dev, DRIVER_MODESET)) { > dev->driver->get_vblank_timestamp = i915_get_vblank_timestamp; > - else > - dev->driver->get_vblank_timestamp = NULL; > - dev->driver->get_scanout_position = i915_get_crtc_scanoutpos; > + dev->driver->get_scanout_position = i915_get_crtc_scanoutpos; > + } > > if (IS_VALLEYVIEW(dev)) { > dev->driver->irq_handler = valleyview_irq_handler; > -- > 1.8.1.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