aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_drv.h
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2008-09-01 19:45:29 -0400
committerDave Airlie <airlied@linux.ie>2008-10-17 17:10:51 -0400
commit546b0974c39657017407c86fe79811100b60700d (patch)
tree42ae164d23ecaa1cb78ad87ad9603e0bdd29740d /drivers/gpu/drm/i915/i915_drv.h
parented4c9c4acf948b42b138747fcb8843ecb1a24ce4 (diff)
i915: Use struct_mutex to protect ring in GEM mode.
In the conversion for GEM, we had stopped using the hardware lock to protect ring usage, since it was all internal to the DRM now. However, some paths weren't converted to using struct_mutex to prevent multiple threads from concurrently working on the ring, in particular between the vblank swap handler and ioctls. Signed-off-by: Eric Anholt <eric@anholt.net> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_drv.h')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 87b071ab864..8547f0aeafc 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -285,6 +285,9 @@ typedef struct drm_i915_private {
285 */ 285 */
286 struct delayed_work retire_work; 286 struct delayed_work retire_work;
287 287
288 /** Work task for vblank-related ring access */
289 struct work_struct vblank_work;
290
288 uint32_t next_gem_seqno; 291 uint32_t next_gem_seqno;
289 292
290 /** 293 /**
@@ -435,6 +438,7 @@ extern int i915_irq_wait(struct drm_device *dev, void *data,
435void i915_user_irq_get(struct drm_device *dev); 438void i915_user_irq_get(struct drm_device *dev);
436void i915_user_irq_put(struct drm_device *dev); 439void i915_user_irq_put(struct drm_device *dev);
437 440
441extern void i915_gem_vblank_work_handler(struct work_struct *work);
438extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); 442extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
439extern void i915_driver_irq_preinstall(struct drm_device * dev); 443extern void i915_driver_irq_preinstall(struct drm_device * dev);
440extern int i915_driver_irq_postinstall(struct drm_device *dev); 444extern int i915_driver_irq_postinstall(struct drm_device *dev);
@@ -538,6 +542,17 @@ extern void intel_opregion_free(struct drm_device *dev);
538extern void opregion_asle_intr(struct drm_device *dev); 542extern void opregion_asle_intr(struct drm_device *dev);
539extern void opregion_enable_asle(struct drm_device *dev); 543extern void opregion_enable_asle(struct drm_device *dev);
540 544
545/**
546 * Lock test for when it's just for synchronization of ring access.
547 *
548 * In that case, we don't need to do it when GEM is initialized as nobody else
549 * has access to the ring.
550 */
551#define RING_LOCK_TEST_WITH_RETURN(dev, file_priv) do { \
552 if (((drm_i915_private_t *)dev->dev_private)->ring.ring_obj == NULL) \
553 LOCK_TEST_WITH_RETURN(dev, file_priv); \
554} while (0)
555
541#define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, (reg)) 556#define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, (reg))
542#define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, (reg), (val)) 557#define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, (reg), (val))
543#define I915_READ16(reg) DRM_READ16(dev_priv->mmio_map, (reg)) 558#define I915_READ16(reg) DRM_READ16(dev_priv->mmio_map, (reg))