diff --git a/linux-core/drm_irq.c b/linux-core/drm_irq.c index 2a5a453..7001c06 100644 --- a/linux-core/drm_irq.c +++ b/linux-core/drm_irq.c @@ -332,6 +332,8 @@ void drm_update_vblank_count(struct drm_device *dev, int crtc) diff = dev->max_vblank_count - dev->last_vblank[crtc]; diff += cur_vblank; + printk(KERN_ERR "vblank count wrap!\n"); + dump_stack(); } else { diff = cur_vblank - dev->last_vblank[crtc]; } diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index 7a0c0ea..c92758f 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -794,7 +794,11 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); #define VSYNCSHIFT_B 0x61028 #define HACTIVE_MASK 0x00000fff +#define VTOTAL_MASK 0x00001fff +#define VTOTAL_SHIFT 16 #define VACTIVE_MASK 0x00000fff +#define VBLANK_END_MASK 0x00001fff +#define VBLANK_END_SHIFT 16 #define VBLANK_START_MASK 0x00001fff #define PP_STATUS 0x61200 diff --git a/shared-core/i915_irq.c b/shared-core/i915_irq.c index 56bcac9..d463f6e 100644 --- a/shared-core/i915_irq.c +++ b/shared-core/i915_irq.c @@ -341,22 +341,39 @@ static void i915_vblank_tasklet(struct drm_device *dev) drm_free(swap_hit, sizeof(*swap_hit), DRM_MEM_DRIVER); } } +#if 0 +static int i915_in_vblank(struct drm_device *dev, int pipe) +{ + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + unsigned long pipedsl, vblank, vtotal; + unsigned long vbl_start, vbl_end, cur_line; + + pipedsl = pipe ? PIPEBDSL : PIPEADSL; + vblank = pipe ? VBLANK_B : VBLANK_A; + vtotal = pipe ? VTOTAL_B : VTOTAL_A; + + vbl_start = I915_READ(vblank) & VBLANK_START_MASK; + vbl_end = (I915_READ(vblank) >> VBLANK_END_SHIFT) & VBLANK_END_MASK; + + cur_line = I915_READ(pipedsl); + + if (cur_line >= vbl_start) + return 1; + return 0; +} +#endif u32 i915_get_vblank_counter(struct drm_device *dev, int plane) { drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; unsigned long high_frame; unsigned long low_frame; - unsigned long pipedsl, vblank, vtotal; u32 high1, high2, low, count; int pipe; pipe = i915_get_pipe(dev, plane); high_frame = pipe ? PIPEBFRAMEHIGH : PIPEAFRAMEHIGH; low_frame = pipe ? PIPEBFRAMEPIXEL : PIPEAFRAMEPIXEL; - pipedsl = pipe ? PIPEBDSL : PIPEADSL; - vblank = pipe ? VBLANK_B : VBLANK_A; - vtotal = pipe ? VTOTAL_B : VTOTAL_A; if (!i915_pipe_enabled(dev, pipe)) { printk(KERN_ERR "trying to get vblank count for disabled " @@ -385,10 +402,10 @@ u32 i915_get_vblank_counter(struct drm_device *dev, int plane) * above regs won't have been updated yet, so return * an incremented count to stay accurate */ - if ((I915_READ(pipedsl) >= (I915_READ(vblank) & VBLANK_START_MASK)) || - (I915_READ(pipedsl) < (I915_READ(vtotal) & VACTIVE_MASK))) +#if 0 + if (i915_in_vblank(dev, pipe)) count++; - +#endif return count; }