summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroga <oga@openbsd.org>2008-11-04 00:22:12 +0000
committeroga <oga@openbsd.org>2008-11-04 00:22:12 +0000
commit652713dba0de92e69ddf58767b99e29c7d27757d (patch)
tree90ee2bdf23de333f676d1e0fcbc600cdc9fed2bf
parentrevert the pageflipping and vblank sync code to the older style that (diff)
downloadwireguard-openbsd-652713dba0de92e69ddf58767b99e29c7d27757d.tar.xz
wireguard-openbsd-652713dba0de92e69ddf58767b99e29c7d27757d.zip
Hold the drm lock around all things that touch the ringbuffer.
Not strictly needed in the non-gem case, but it will be needed then, and doesn't hurt now. From Eric Anholt at intel.
-rw-r--r--sys/dev/pci/drm/i915_dma.c15
-rw-r--r--sys/dev/pci/drm/i915_irq.c2
2 files changed, 14 insertions, 3 deletions
diff --git a/sys/dev/pci/drm/i915_dma.c b/sys/dev/pci/drm/i915_dma.c
index 9a3d6707c86..70656ea3bfd 100644
--- a/sys/dev/pci/drm/i915_dma.c
+++ b/sys/dev/pci/drm/i915_dma.c
@@ -594,10 +594,15 @@ int i915_quiescent(struct drm_device *dev)
int i915_flush_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{
+ int ret;
LOCK_TEST_WITH_RETURN(dev, file_priv);
- return i915_quiescent(dev);
+ DRM_LOCK();
+ ret = i915_quiescent(dev);
+ DRM_UNLOCK();
+
+ return (ret);
}
int i915_batchbuffer(struct drm_device *dev, void *data,
@@ -627,7 +632,9 @@ int i915_batchbuffer(struct drm_device *dev, void *data,
sizeof(struct drm_clip_rect)))
return EFAULT;
+ DRM_LOCK();
ret = i915_dispatch_batchbuffer(dev, batch);
+ DRM_UNLOCK();
sarea_priv->last_dispatch = READ_BREADCRUMB(dev_priv);
return ret;
@@ -657,7 +664,9 @@ int i915_cmdbuffer(struct drm_device *dev, void *data,
return EFAULT;
}
+ DRM_LOCK();
ret = i915_dispatch_cmdbuffer(dev, cmdbuf);
+ DRM_UNLOCK();
if (ret) {
DRM_ERROR("i915_dispatch_cmdbuffer failed\n");
return ret;
@@ -673,9 +682,9 @@ int i915_flip_bufs(struct drm_device *dev, void *data, struct drm_file *file_pri
LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-
+ DRM_LOCK();
i915_dispatch_flip(dev);
+ DRM_UNLOCK();
return 0;
}
diff --git a/sys/dev/pci/drm/i915_irq.c b/sys/dev/pci/drm/i915_irq.c
index 4ad4824228a..d8e4c3a3921 100644
--- a/sys/dev/pci/drm/i915_irq.c
+++ b/sys/dev/pci/drm/i915_irq.c
@@ -504,7 +504,9 @@ int i915_irq_emit(struct drm_device *dev, void *data,
return EINVAL;
}
+ DRM_LOCK();
result = i915_emit_irq(dev);
+ DRM_UNLOCK();
if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
DRM_ERROR("copy_to_user\n");