summaryrefslogtreecommitdiff
path: root/linux-core/i915_execbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux-core/i915_execbuf.c')
-rw-r--r--linux-core/i915_execbuf.c63
1 files changed, 31 insertions, 32 deletions
diff --git a/linux-core/i915_execbuf.c b/linux-core/i915_execbuf.c
index cb0e7348..ff83d795 100644
--- a/linux-core/i915_execbuf.c
+++ b/linux-core/i915_execbuf.c
@@ -25,7 +25,8 @@
* Authors:
* Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
* Dave Airlie
- * ?
+ * Keith Packard
+ * ... ?
*/
#include "drmP.h"
@@ -40,9 +41,9 @@
#endif
enum i915_buf_idle {
- i915_reloc_unchecked,
- i915_reloc_idle,
- i915_reloc_busy
+ I915_RELOC_UNCHECKED,
+ I915_RELOC_IDLE,
+ I915_RELOC_BUSY
};
struct i915_relocatee_info {
@@ -141,11 +142,11 @@ int i915_apply_reloc(struct drm_file *file_priv, int num_buffers,
relocatee->data_page = NULL;
relocatee->offset = new_cmd_offset;
- if (unlikely(relocatee->idle == i915_reloc_unchecked)) {
+ if (unlikely(relocatee->idle == I915_RELOC_UNCHECKED)) {
ret = drm_bo_wait(relocatee->buf, 0, 0, 0);
if (ret)
return ret;
- relocatee->idle = i915_reloc_idle;
+ relocatee->idle = I915_RELOC_IDLE;
}
ret = drm_bo_kmap(relocatee->buf, new_cmd_offset >> PAGE_SHIFT,
@@ -267,7 +268,7 @@ static int i915_exec_reloc(struct drm_file *file_priv, drm_handle_t buf_handle,
struct drm_i915_validate_buffer *buffers,
uint32_t buf_count)
{
- struct drm_device *dev = file_priv->head->dev;
+ struct drm_device *dev = file_priv->minor->dev;
struct i915_relocatee_info relocatee;
int ret = 0;
int b;
@@ -287,7 +288,7 @@ static int i915_exec_reloc(struct drm_file *file_priv, drm_handle_t buf_handle,
}
memset(&relocatee, 0, sizeof(relocatee));
- relocatee.idle = i915_reloc_unchecked;
+ relocatee.idle = I915_RELOC_UNCHECKED;
mutex_lock(&dev->struct_mutex);
relocatee.buf = drm_lookup_buffer_object(file_priv, buf_handle, 1);
@@ -347,7 +348,7 @@ static int i915_update_relocatee(struct i915_relocatee_info *relocatee,
* ring relocations.
*/
- if (relocatee->idle == i915_reloc_unchecked) {
+ if (relocatee->idle == I915_RELOC_UNCHECKED) {
preempt_enable();
ret = mutex_lock_interruptible(&relocatee->buf->mutex);
if (unlikely(ret))
@@ -355,9 +356,9 @@ static int i915_update_relocatee(struct i915_relocatee_info *relocatee,
ret = drm_bo_wait(relocatee->buf, 0, 0, 1);
if (ret == 0)
- relocatee->idle = i915_reloc_idle;
+ relocatee->idle = I915_RELOC_IDLE;
else {
- relocatee->idle = i915_reloc_busy;
+ relocatee->idle = I915_RELOC_BUSY;
relocatee->performed_ring_relocs = 1;
}
mutex_unlock(&relocatee->buf->mutex);
@@ -366,7 +367,7 @@ static int i915_update_relocatee(struct i915_relocatee_info *relocatee,
}
}
- if (relocatee->idle == i915_reloc_busy)
+ if (relocatee->idle == I915_RELOC_BUSY)
return 0;
if (unlikely(dst_offset > relocatee->buf->num_pages * PAGE_SIZE)) {
@@ -440,7 +441,7 @@ static int i915_apply_post_reloc(uint32_t reloc[],
index = (reloc[0] - relocatee->page_offset) >> 2;
val = val + reloc[1];
- if (relocatee->idle == i915_reloc_busy) {
+ if (relocatee->idle == I915_RELOC_BUSY) {
i915_emit_ring_reloc(relocatee->buf->dev,
relocatee->buf->offset + reloc[0], val);
return 0;
@@ -558,7 +559,7 @@ static int i915_post_relocs(struct drm_file *file_priv,
*/
if (relocatee.performed_ring_relocs)
- (void)i915_emit_mi_flush(file_priv->head->dev, 0);
+ (void)i915_emit_mi_flush(file_priv->minor->dev, 0);
i915_clear_relocatee(&relocatee);
if (reloc_buf) {
@@ -628,7 +629,7 @@ int i915_validate_buffer_list(struct drm_file *file_priv,
item = buffers + buf_count;
item->buffer = NULL;
item->presumed_offset_correct = 0;
- item->idle = i915_reloc_unchecked;
+ item->idle = I915_RELOC_UNCHECKED;
if (copy_from_user
(&arg, (void __user *)(unsigned long)data, sizeof(arg))) {
@@ -746,7 +747,7 @@ void i915_fence_or_sync(struct drm_file *file_priv,
struct drm_fence_arg *fence_arg,
struct drm_fence_object **fence_p)
{
- struct drm_device *dev = file_priv->head->dev;
+ struct drm_device *dev = file_priv->minor->dev;
int ret;
struct drm_fence_object *fence;
@@ -821,7 +822,6 @@ int i915_execbuffer(struct drm_device *dev, void *data,
int num_buffers;
int ret;
uint32_t __user *post_relocs;
- struct drm_i915_validate_buffer *buffers;
if (!dev_priv->allow_batchbuffer) {
DRM_ERROR("Batchbuffer ioctl disabled\n");
@@ -854,10 +854,12 @@ int i915_execbuffer(struct drm_device *dev, void *data,
num_buffers = exec_buf->num_buffers;
- buffers =
- drm_calloc(num_buffers, sizeof(struct drm_i915_validate_buffer),
- DRM_MEM_DRIVER);
- if (!buffers) {
+ if (!dev_priv->val_bufs) {
+ dev_priv->val_bufs =
+ vmalloc(sizeof(struct drm_i915_validate_buffer) *
+ dev_priv->max_validate_buffers);
+ }
+ if (!dev_priv->val_bufs) {
drm_bo_read_unlock(&dev->bm.bm_lock);
mutex_unlock(&dev_priv->cmdbuf_mutex);
return -ENOMEM;
@@ -865,13 +867,14 @@ int i915_execbuffer(struct drm_device *dev, void *data,
/* validate buffer list + fixup relocations */
ret = i915_validate_buffer_list(file_priv, 0, exec_buf->ops_list,
- buffers, &num_buffers, &post_relocs);
+ dev_priv->val_bufs, &num_buffers,
+ &post_relocs);
if (ret)
goto out_err0;
if (post_relocs) {
ret = i915_post_relocs(file_priv, post_relocs,
- buffers, num_buffers);
+ dev_priv->val_bufs, num_buffers);
if (ret)
goto out_err0;
}
@@ -881,9 +884,10 @@ int i915_execbuffer(struct drm_device *dev, void *data,
if (!post_relocs) {
drm_agp_chipset_flush(dev);
- batch->start = buffers[num_buffers - 1].buffer->offset;
+ batch->start =
+ dev_priv->val_bufs[num_buffers - 1].buffer->offset;
} else {
- batch->start += buffers[0].buffer->offset;
+ batch->start += dev_priv->val_bufs[0].buffer->offset;
}
DRM_DEBUG("i915 exec batchbuffer, start %x used %d cliprects %d\n",
@@ -897,15 +901,10 @@ int i915_execbuffer(struct drm_device *dev, void *data,
i915_fence_or_sync(file_priv, fence_arg->flags, fence_arg, NULL);
out_err0:
- ret = i915_handle_copyback(dev, buffers, num_buffers, ret);
+ ret = i915_handle_copyback(dev, dev_priv->val_bufs, num_buffers, ret);
mutex_lock(&dev->struct_mutex);
- i915_dereference_buffers_locked(buffers, num_buffers);
+ i915_dereference_buffers_locked(dev_priv->val_bufs, num_buffers);
mutex_unlock(&dev->struct_mutex);
-
- drm_free(buffers,
- (exec_buf->num_buffers * sizeof(struct drm_buffer_object *)),
- DRM_MEM_DRIVER);
-
mutex_unlock(&dev_priv->cmdbuf_mutex);
drm_bo_read_unlock(&dev->bm.bm_lock);
return ret;