• Ville Syrjälä's avatar
    drm/i915: Fix scanout position for real · 78e8fc6b
    Ville Syrjälä authored
    Seems I've been a bit dense with regards to the start of vblank
    vs. the scanline counter / pixel counter.
    
    After staring at the pixel counter on gen4 I came to the conclusion
    that the start of vblank interrupt and scanline counter increment
    happen at the same time. The scanline counter increment is documented
    to occur at start of hsync, which means that the start of vblank
    interrupt must also trigger there. Looking at the pixel counter value
    when the scanline wraps from vtotal-1 to 0 confirms that, as the pixel
    counter at that point reads hsync_start. This also clarifies why we see
    need the +1 adjustment to the scaline counter. The counter actually
    starts counting from vtotal-1 on the first active line.
    
    I also confirmed that the frame start interrupt happens ~1 line after
    the start of vblank, but the frame start occurs at hblank_start instead.
    We only use the frame start interrupt on gen2 where the start of vblank
    interrupt isn't available. The only important thing to note here is that
    frame start occurs after vblank start, so we don't have to play any
    additional tricks to fix up the scanline counter.
    
    The other thing to note is the fact that the pixel counter on gen3-4
    starts counting from the start of horizontal active on the first active
    line. That means that when we get the start of vblank interrupt, the
    pixel counter reads (htotal*(vblank_start-1)+hsync_start). Since we
    consider vblank to start at (htotal*vblank_start) we need to add a
    constant (htotal-hsync_start) offset to the pixel counter, or else we
    risk misdetecting whether we're in vblank or not.
    
    I talked a bit with Art Runyan about these topics, and he confirmed my
    findings. And that the same rules should hold for platforms which don't
    have the pixel counter. That's good since without the pixel counter it's
    rather difficult to verify the timings to this accuracy.
    
    So the conclusion is that we can throw away all the ISR tricks I added,
    and just increment the scanline counter by one always.
    Reviewed-by: default avatarSourab Gupta <sourabgupta@gmail.com>
    Reviewed-by: default avatarAkash Goel <akash.goels@gmail.com>
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    78e8fc6b
i915_irq.c 115 KB