diff options
Diffstat (limited to 'shared-core/radeon_irq.c')
| -rw-r--r-- | shared-core/radeon_irq.c | 24 | 
1 files changed, 13 insertions, 11 deletions
diff --git a/shared-core/radeon_irq.c b/shared-core/radeon_irq.c index 79e4e866..3f6ace88 100644 --- a/shared-core/radeon_irq.c +++ b/shared-core/radeon_irq.c @@ -128,9 +128,12 @@ irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS)  	stat &= dev_priv->irq_enable_reg;  	/* SW interrupt */ -	if (stat & RADEON_SW_INT_TEST) -		DRM_WAKEUP(&dev_priv->swi_queue); - +	if (stat & RADEON_SW_INT_TEST) { +		DRM_WAKEUP(&dev_priv->irq_queue); +#ifdef RADEON_HAVE_FENCE +		radeon_fence_handler(dev); +#endif +	}  	/* VBLANK interrupt */  	if (stat & RADEON_CRTC_VBLANK_STAT)  		drm_handle_vblank(dev, 0); @@ -140,14 +143,13 @@ irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS)  	return IRQ_HANDLED;  } -static int radeon_emit_irq(struct drm_device * dev) +int radeon_emit_irq(struct drm_device * dev)  {  	drm_radeon_private_t *dev_priv = dev->dev_private;  	unsigned int ret;  	RING_LOCALS; -	atomic_inc(&dev_priv->swi_emitted); -	ret = atomic_read(&dev_priv->swi_emitted); +	ret = radeon_update_breadcrumb(dev);  	BEGIN_RING(4);  	OUT_RING_REG(RADEON_LAST_SWI_REG, ret); @@ -164,13 +166,13 @@ static int radeon_wait_irq(struct drm_device * dev, int swi_nr)  	    (drm_radeon_private_t *) dev->dev_private;  	int ret = 0; -	if (RADEON_READ(RADEON_LAST_SWI_REG) >= swi_nr) +	if (READ_BREADCRUMB(dev_priv) >= swi_nr)  		return 0;  	dev_priv->stats.boxes |= RADEON_BOX_WAIT_IDLE; -	DRM_WAIT_ON(ret, dev_priv->swi_queue, 3 * DRM_HZ, -		    RADEON_READ(RADEON_LAST_SWI_REG) >= swi_nr); +	DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ, +		    READ_BREADCRUMB(dev_priv) >= swi_nr);  	return ret;  } @@ -258,8 +260,8 @@ int radeon_driver_irq_postinstall(struct drm_device * dev)  	    (drm_radeon_private_t *) dev->dev_private;  	int ret; -	atomic_set(&dev_priv->swi_emitted, 0); -	DRM_INIT_WAITQUEUE(&dev_priv->swi_queue); +	dev_priv->counter = 0; +	DRM_INIT_WAITQUEUE(&dev_priv->irq_queue);  	ret = drm_vblank_init(dev, 2);  	if (ret)  | 
