summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2008-06-06 12:57:01 -0700
committerKeith Packard <keithp@keithp.com>2008-06-06 13:00:46 -0700
commit56a96841d01d112d7d4adfebb572016398551ba8 (patch)
tree30366179c53a31c83c0f47b9994b688d21d82cf2
parent329e0862255e8ad27e2aa4e3755421a18ea1acc5 (diff)
[intel-gem] Add explicit throttle ioctl
Instead of throttling and execbuffer time, have the application ask to throttle explicitly. This allows the throttle to happen less often, and without holding the DRM lock.
-rw-r--r--linux-core/i915_gem.c11
-rw-r--r--shared-core/i915_dma.c1
-rw-r--r--shared-core/i915_drm.h2
-rw-r--r--shared-core/i915_drv.h2
4 files changed, 12 insertions, 4 deletions
diff --git a/linux-core/i915_gem.c b/linux-core/i915_gem.c
index 268411e8..14e57b41 100644
--- a/linux-core/i915_gem.c
+++ b/linux-core/i915_gem.c
@@ -1371,10 +1371,6 @@ i915_gem_execbuffer(struct drm_device *dev, void *data,
#endif
i915_kernel_lost_context(dev);
- ret = i915_gem_ring_throttle(dev);
- if (ret)
- return ret;
-
/* Copy in the exec list from userland */
exec_list = drm_calloc(sizeof(*exec_list), args->buffer_count,
DRM_MEM_DRIVER);
@@ -1628,6 +1624,13 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
return 0;
}
+int
+i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+{
+ return i915_gem_ring_throttle(dev);
+}
+
int i915_gem_init_object(struct drm_gem_object *obj)
{
struct drm_i915_gem_object *obj_priv;
diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c
index 1ea5c28e..6e188f08 100644
--- a/shared-core/i915_dma.c
+++ b/shared-core/i915_dma.c
@@ -1189,6 +1189,7 @@ struct drm_ioctl_desc i915_ioctls[] = {
DRM_IOCTL_DEF(DRM_I915_GEM_PIN, i915_gem_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_I915_GEM_UNPIN, i915_gem_unpin_ioctl, DRM_AUTH|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_I915_GEM_BUSY, i915_gem_busy_ioctl, DRM_AUTH),
+ DRM_IOCTL_DEF(DRM_I915_GEM_THROTTLE, i915_gem_throttle_ioctl, DRM_AUTH),
};
int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);
diff --git a/shared-core/i915_drm.h b/shared-core/i915_drm.h
index 4712ea4f..0fa292d0 100644
--- a/shared-core/i915_drm.h
+++ b/shared-core/i915_drm.h
@@ -181,6 +181,7 @@ typedef struct drm_i915_sarea {
#define DRM_I915_GEM_PIN 0x15
#define DRM_I915_GEM_UNPIN 0x16
#define DRM_I915_GEM_BUSY 0x17
+#define DRM_I915_GEM_THROTTLE 0x18
#define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
#define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH)
@@ -205,6 +206,7 @@ typedef struct drm_i915_sarea {
#define DRM_IOCTL_I915_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin)
#define DRM_IOCTL_I915_GEM_UNPIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin)
#define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy)
+#define DRM_IOCTL_I915_GEM_THROTTLE DRM_IO ( DRM_COMMAND_BASE + DRM_I915_GEM_THROTTLE)
/* Asynchronous page flipping:
*/
diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h
index d646177b..33fb7ca9 100644
--- a/shared-core/i915_drv.h
+++ b/shared-core/i915_drv.h
@@ -451,6 +451,8 @@ int i915_gem_unpin_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
int i915_gem_busy_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv);
+int i915_gem_throttle_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv);
int i915_gem_init_object(struct drm_gem_object *obj);
void i915_gem_free_object(struct drm_gem_object *obj);
int i915_gem_set_domain(struct drm_gem_object *obj,