[Intel-gfx] [PATCH] drm/i915: enable vblank interrupt on ironlake

Zhenyu Wang zhenyuw at linux.intel.com
Mon Jan 25 01:46:27 CET 2010


On 2010.01.23 00:12:58 +0800, Li Peng wrote:
> Thanks for your review, Zhenyu. I made a little update on this patch, 
> adding drm_vblank_off() at ironlake crtc dpms off, so that we won't wait
> on a disabled pipe if one display is turned off.
> 

yeah, good catch. 

Acked-by: Zhenyu Wang <zhenyuw at linux.intel.com>

Eric, I think this is for .33 stuff. 

Thanks.

> From: Li Peng <peng.li at intel.com>
> Date: Fri, 22 Jan 2010 20:59:59 +0800
> Subject: drm/i915: enable vblank interrupt on ironlake
> 
> so far vblank interrupt on ironlake is disabled, this would cause
> bad gfx performance if userspace calls drm_wait_vblank. This patch
> enables vblank interrupt on ironlake and follows vblank get/put
> model.
> 
> Signed-off-by: Li Peng <peng.li at intel.com>
> ---
>  drivers/gpu/drm/i915/i915_irq.c      |   30 +++++++++++++++++++-----------
>  drivers/gpu/drm/i915/intel_display.c |    1 +
>  2 files changed, 20 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 89a071a..e7472d8 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -309,6 +309,12 @@ irqreturn_t ironlake_irq_handler(struct drm_device *dev)
>  	if (de_iir & DE_GSE)
>  		ironlake_opregion_gse_intr(dev);
>  
> +	if (de_iir & DE_PIPEA_VBLANK)
> +		drm_handle_vblank(dev, 0);
> +
> +	if (de_iir & DE_PIPEB_VBLANK)
> +		drm_handle_vblank(dev, 1);
> +
>  	/* check event from PCH */
>  	if ((de_iir & DE_PCH_EVENT) &&
>  	    (pch_iir & SDE_HOTPLUG_MASK)) {
> @@ -844,11 +850,11 @@ int i915_enable_vblank(struct drm_device *dev, int pipe)
>  	if (!(pipeconf & PIPEACONF_ENABLE))
>  		return -EINVAL;
>  
> -	if (IS_IRONLAKE(dev))
> -		return 0;
> -
>  	spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
> -	if (IS_I965G(dev))
> +	if (IS_IRONLAKE(dev))
> +		ironlake_enable_display_irq(dev_priv, (pipe == 0) ? 
> +					    DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
> +	else if (IS_I965G(dev))
>  		i915_enable_pipestat(dev_priv, pipe,
>  				     PIPE_START_VBLANK_INTERRUPT_ENABLE);
>  	else
> @@ -866,13 +872,14 @@ void i915_disable_vblank(struct drm_device *dev, int pipe)
>  	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
>  	unsigned long irqflags;
>  
> -	if (IS_IRONLAKE(dev))
> -		return;
> -
>  	spin_lock_irqsave(&dev_priv->user_irq_lock, irqflags);
> -	i915_disable_pipestat(dev_priv, pipe,
> -			      PIPE_VBLANK_INTERRUPT_ENABLE |
> -			      PIPE_START_VBLANK_INTERRUPT_ENABLE);
> +	if (IS_IRONLAKE(dev))
> +		ironlake_disable_display_irq(dev_priv, (pipe == 0) ? 
> +					     DE_PIPEA_VBLANK: DE_PIPEB_VBLANK);
> +	else
> +		i915_disable_pipestat(dev_priv, pipe,
> +				      PIPE_VBLANK_INTERRUPT_ENABLE |
> +				      PIPE_START_VBLANK_INTERRUPT_ENABLE);
>  	spin_unlock_irqrestore(&dev_priv->user_irq_lock, irqflags);
>  }
>  
> @@ -1015,7 +1022,8 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
>  {
>  	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
>  	/* enable kind of interrupts always enabled */
> -	u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT;
> +	u32 display_mask = DE_MASTER_IRQ_CONTROL | DE_GSE | DE_PCH_EVENT |
> +			   DE_PIPEA_VBLANK | DE_PIPEB_VBLANK;
>  	u32 render_mask = GT_USER_INTERRUPT;
>  	u32 hotplug_mask = SDE_CRT_HOTPLUG | SDE_PORTB_HOTPLUG |
>  			   SDE_PORTC_HOTPLUG | SDE_PORTD_HOTPLUG;
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 45da78e..2cc489b 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -1638,6 +1638,7 @@ static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode)
>  	case DRM_MODE_DPMS_OFF:
>  		DRM_DEBUG_KMS("crtc %d dpms off\n", pipe);
>  
> +		drm_vblank_off(dev, pipe);
>  		/* Disable display plane */
>  		temp = I915_READ(dspcntr_reg);
>  		if ((temp & DISPLAY_PLANE_ENABLE) != 0) {
> -- 
> 1.6.6
> 
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20100125/2b0cfe1f/attachment.sig>


More information about the Intel-gfx mailing list