diff options
Diffstat (limited to 'shared-core/i915_irq.c')
| -rw-r--r-- | shared-core/i915_irq.c | 30 | 
1 files changed, 26 insertions, 4 deletions
diff --git a/shared-core/i915_irq.c b/shared-core/i915_irq.c index f9fe5e2a..0609dba7 100644 --- a/shared-core/i915_irq.c +++ b/shared-core/i915_irq.c @@ -514,15 +514,37 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)  	 */  	if (iir & I915_DISPLAY_PIPE_A_EVENT_INTERRUPT) {  		pipea_stats = I915_READ(PIPEASTAT); +		/* The vblank interrupt gets enabled even if we didn't ask for +		   it, so make sure it's shut down again */ +		if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)) +			pipea_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | +					 PIPE_VBLANK_INTERRUPT_ENABLE); +		else if (pipea_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| +					PIPE_VBLANK_INTERRUPT_STATUS)) +		{ +			vblank++; +			drm_handle_vblank(dev, i915_get_plane(dev, 0)); +		} +  		I915_WRITE(PIPEASTAT, pipea_stats);  	}  	if (iir & I915_DISPLAY_PIPE_B_EVENT_INTERRUPT) {  		pipeb_stats = I915_READ(PIPEBSTAT);  		I915_WRITE(PIPEBSTAT, pipeb_stats); +		/* The vblank interrupt gets enabled even if we didn't ask for +		   it, so make sure it's shut down again */ +		if (!(dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B)) +			pipeb_stats &= ~(PIPE_START_VBLANK_INTERRUPT_ENABLE | +					 PIPE_VBLANK_INTERRUPT_ENABLE); +		else if (pipeb_stats & (PIPE_START_VBLANK_INTERRUPT_STATUS| +					PIPE_VBLANK_INTERRUPT_STATUS)) +		{ +			vblank++; +			drm_handle_vblank(dev, i915_get_plane(dev, 1)); +		}  	} -	I915_WRITE(IIR, iir);  #ifdef __linux__  	if (dev->pdev->msi_enabled)  		I915_WRITE(IMR, dev_priv->irq_mask_reg); @@ -1110,9 +1132,9 @@ void i915_driver_irq_preinstall(struct drm_device * dev)  {  	struct drm_i915_private *dev_priv = dev->dev_private; -	I915_WRITE16(HWSTAM, 0xeffe); -	I915_WRITE16(IMR, 0x0); -	I915_WRITE16(IER, 0x0); +	I915_WRITE(HWSTAM, 0xeffe); +	I915_WRITE(IMR, 0xffffffff); +	I915_WRITE(IER, 0x0);  }  int i915_driver_irq_postinstall(struct drm_device * dev)  | 
