Skip to content

Commit

Permalink
staging: gma500: frame buffer locking
Browse files Browse the repository at this point in the history
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 printing lock).

In that case we cannot politely sleep when synching after an accelerated op
but must behave obnixously to be sure of getting the bits out.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Alan Cox authored and Greg Kroah-Hartman committed Sep 27, 2011
1 parent 30eb82f commit c7e285b
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 6 deletions.
10 changes: 6 additions & 4 deletions drivers/staging/gma500/accel_2d.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,9 @@ static int psbfb_2d_submit(struct drm_psb_private *dev_priv, uint32_t *cmdbuf,
int ret = 0;
int i;
unsigned submit_size;
unsigned long flags;

mutex_lock(&dev_priv->mutex_2d);
spin_lock_irqsave(&dev_priv->lock_2d, flags);
while (size > 0) {
submit_size = (size < 0x60) ? size : 0x60;
size -= submit_size;
Expand All @@ -127,7 +128,7 @@ static int psbfb_2d_submit(struct drm_psb_private *dev_priv, uint32_t *cmdbuf,

(void)PSB_RSGX32(PSB_SGX_2D_SLAVE_PORT + i - 4);
}
mutex_unlock(&dev_priv->mutex_2d);
spin_unlock_irqrestore(&dev_priv->lock_2d, flags);
return ret;
}

Expand Down Expand Up @@ -327,8 +328,9 @@ int psbfb_sync(struct fb_info *info)
struct drm_psb_private *dev_priv = dev->dev_private;
unsigned long _end = jiffies + DRM_HZ;
int busy = 0;
unsigned long flags;

mutex_lock(&dev_priv->mutex_2d);
spin_lock_irqsave(&dev_priv->lock_2d, flags);
/*
* First idle the 2D engine.
*/
Expand Down Expand Up @@ -357,7 +359,7 @@ int psbfb_sync(struct fb_info *info)
_PSB_C2B_STATUS_BUSY) != 0);

out:
mutex_unlock(&dev_priv->mutex_2d);
spin_unlock_irqrestore(&dev_priv->lock_2d, flags);
return (busy) ? -EBUSY : 0;
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/staging/gma500/psb_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ static int psb_do_init(struct drm_device *dev)


spin_lock_init(&dev_priv->irqmask_lock);
mutex_init(&dev_priv->mutex_2d);
spin_lock_init(&dev_priv->lock_2d);

PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK0);
PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK1);
Expand Down
2 changes: 1 addition & 1 deletion drivers/staging/gma500/psb_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -612,7 +612,7 @@ struct drm_psb_private {
void (*exit_idle)(struct drm_device *dev, u32 update_src);

/* 2D acceleration */
struct mutex mutex_2d;
spinlock_t lock_2d;

/* FIXME: Arrays anyone ? */
struct mdfld_dsi_encoder *encoder0;
Expand Down

0 comments on commit c7e285b

Please sign in to comment.