aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Cox <alan@linux.intel.com>2011-11-29 17:27:10 -0500
committerDave Airlie <airlied@redhat.com>2011-12-06 04:55:38 -0500
commit9242fe23d2ebab9c61dbc50d65f30cfa20a856ae (patch)
treee41e980dc788a75488e1fbfdadef47e250b0d902
parent1f0d0b5183c8dd4d58678e8ba35553cabaf87390 (diff)
gma500: frame buffer locking
If we are the console then a printk can hit us with a spin lock held (and in fact the kernel will do its best to take the console printing lock). In that case we cannot politely sleep when synching after an accelerated op but must behave obnoxiously to be sure of getting the bits out. Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/gma500/accel_2d.c10
-rw-r--r--drivers/gpu/drm/gma500/psb_drv.c2
-rw-r--r--drivers/gpu/drm/gma500/psb_drv.h2
3 files changed, 8 insertions, 6 deletions
diff --git a/drivers/gpu/drm/gma500/accel_2d.c b/drivers/gpu/drm/gma500/accel_2d.c
index f0cef7678d41..f0ce82aed654 100644
--- a/drivers/gpu/drm/gma500/accel_2d.c
+++ b/drivers/gpu/drm/gma500/accel_2d.c
@@ -111,8 +111,9 @@ static int psbfb_2d_submit(struct drm_psb_private *dev_priv, uint32_t *cmdbuf,
111 int ret = 0; 111 int ret = 0;
112 int i; 112 int i;
113 unsigned submit_size; 113 unsigned submit_size;
114 unsigned long flags;
114 115
115 mutex_lock(&dev_priv->mutex_2d); 116 spin_lock_irqsave(&dev_priv->lock_2d, flags);
116 while (size > 0) { 117 while (size > 0) {
117 submit_size = (size < 0x60) ? size : 0x60; 118 submit_size = (size < 0x60) ? size : 0x60;
118 size -= submit_size; 119 size -= submit_size;
@@ -127,7 +128,7 @@ static int psbfb_2d_submit(struct drm_psb_private *dev_priv, uint32_t *cmdbuf,
127 128
128 (void)PSB_RSGX32(PSB_SGX_2D_SLAVE_PORT + i - 4); 129 (void)PSB_RSGX32(PSB_SGX_2D_SLAVE_PORT + i - 4);
129 } 130 }
130 mutex_unlock(&dev_priv->mutex_2d); 131 spin_unlock_irqrestore(&dev_priv->lock_2d, flags);
131 return ret; 132 return ret;
132} 133}
133 134
@@ -327,8 +328,9 @@ int psbfb_sync(struct fb_info *info)
327 struct drm_psb_private *dev_priv = dev->dev_private; 328 struct drm_psb_private *dev_priv = dev->dev_private;
328 unsigned long _end = jiffies + DRM_HZ; 329 unsigned long _end = jiffies + DRM_HZ;
329 int busy = 0; 330 int busy = 0;
331 unsigned long flags;
330 332
331 mutex_lock(&dev_priv->mutex_2d); 333 spin_lock_irqsave(&dev_priv->lock_2d, flags);
332 /* 334 /*
333 * First idle the 2D engine. 335 * First idle the 2D engine.
334 */ 336 */
@@ -357,6 +359,6 @@ int psbfb_sync(struct fb_info *info)
357 _PSB_C2B_STATUS_BUSY) != 0); 359 _PSB_C2B_STATUS_BUSY) != 0);
358 360
359out: 361out:
360 mutex_unlock(&dev_priv->mutex_2d); 362 spin_unlock_irqrestore(&dev_priv->lock_2d, flags);
361 return (busy) ? -EBUSY : 0; 363 return (busy) ? -EBUSY : 0;
362} 364}
diff --git a/drivers/gpu/drm/gma500/psb_drv.c b/drivers/gpu/drm/gma500/psb_drv.c
index 862bb8182b76..add3156cd8bf 100644
--- a/drivers/gpu/drm/gma500/psb_drv.c
+++ b/drivers/gpu/drm/gma500/psb_drv.c
@@ -186,7 +186,7 @@ static int psb_do_init(struct drm_device *dev)
186 186
187 187
188 spin_lock_init(&dev_priv->irqmask_lock); 188 spin_lock_init(&dev_priv->irqmask_lock);
189 mutex_init(&dev_priv->mutex_2d); 189 spin_lock_init(&dev_priv->lock_2d);
190 190
191 PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK0); 191 PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK0);
192 PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK1); 192 PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK1);
diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h
index f46b3c1edb1d..5ec8edf65163 100644
--- a/drivers/gpu/drm/gma500/psb_drv.h
+++ b/drivers/gpu/drm/gma500/psb_drv.h
@@ -606,7 +606,7 @@ struct drm_psb_private {
606 void *fbdev; 606 void *fbdev;
607 607
608 /* 2D acceleration */ 608 /* 2D acceleration */
609 struct mutex mutex_2d; 609 spinlock_t lock_2d;
610}; 610};
611 611
612 612