diff options
Diffstat (limited to 'linux-core/i915_execbuf.c')
-rw-r--r-- | linux-core/i915_execbuf.c | 63 |
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; |