diff options
Diffstat (limited to 'linux-core')
-rw-r--r-- | linux-core/i915_gem.c | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/linux-core/i915_gem.c b/linux-core/i915_gem.c index 4e01b8ea..ad73f0a0 100644 --- a/linux-core/i915_gem.c +++ b/linux-core/i915_gem.c @@ -1064,10 +1064,15 @@ i915_gem_object_check_coherency(struct drm_gem_object *obj, int handle) } #endif +/** + * Bind an object to the GTT and evaluate the relocations landing in it + * + * + */ static int -i915_gem_reloc_and_validate_object(struct drm_gem_object *obj, - struct drm_file *file_priv, - struct drm_i915_gem_exec_object *entry) +i915_gem_object_bind_and_relocate(struct drm_gem_object *obj, + struct drm_file *file_priv, + struct drm_i915_gem_exec_object *entry) { struct drm_device *dev = obj->dev; struct drm_i915_gem_relocation_entry reloc; @@ -1108,7 +1113,7 @@ i915_gem_reloc_and_validate_object(struct drm_gem_object *obj, target_obj_priv = target_obj->driver_private; /* The target buffer should have appeared before us in the - * validate list, so it should have a GTT space bound by now. + * exec_object list, so it should have a GTT space bound by now. */ if (target_obj_priv->gtt_space == NULL) { DRM_ERROR("No GTT space found for object %d\n", @@ -1242,6 +1247,8 @@ i915_gem_reloc_and_validate_object(struct drm_gem_object *obj, return 0; } +/** Dispatch a batchbuffer to the ring + */ static int i915_dispatch_gem_execbuffer(struct drm_device *dev, struct drm_i915_gem_execbuffer *exec, @@ -1346,7 +1353,7 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv) { struct drm_i915_gem_execbuffer *args = data; - struct drm_i915_gem_exec_object *validate_list = NULL; + struct drm_i915_gem_exec_object *exec_list = NULL; struct drm_gem_object **object_list = NULL; struct drm_gem_object *batch_obj; int ret, i; @@ -1365,26 +1372,26 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, if (ret) return ret; - /* Copy in the validate list from userland */ - validate_list = drm_calloc(sizeof(*validate_list), args->buffer_count, - DRM_MEM_DRIVER); + /* Copy in the exec list from userland */ + exec_list = drm_calloc(sizeof(*exec_list), args->buffer_count, + DRM_MEM_DRIVER); object_list = drm_calloc(sizeof(*object_list), args->buffer_count, DRM_MEM_DRIVER); - if (validate_list == NULL || object_list == NULL) { - DRM_ERROR("Failed to allocate validate or object list " + if (exec_list == NULL || object_list == NULL) { + DRM_ERROR("Failed to allocate exec or object list " "for %d buffers\n", args->buffer_count); ret = -ENOMEM; - goto err; + goto pre_mutex_err; } - ret = copy_from_user(validate_list, + ret = copy_from_user(exec_list, (struct drm_i915_relocation_entry __user *) (uintptr_t) args->buffers_ptr, - sizeof(*validate_list) * args->buffer_count); + sizeof(*exec_list) * args->buffer_count); if (ret != 0) { - DRM_ERROR("copy %d validate entries failed %d\n", + DRM_ERROR("copy %d exec entries failed %d\n", args->buffer_count, ret); - goto err; + goto pre_mutex_err; } mutex_lock(&dev->struct_mutex); @@ -1399,21 +1406,21 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, /* Look up object handles and perform the relocations */ for (i = 0; i < args->buffer_count; i++) { object_list[i] = drm_gem_object_lookup(dev, file_priv, - validate_list[i].handle); + exec_list[i].handle); if (object_list[i] == NULL) { DRM_ERROR("Invalid object handle %d at index %d\n", - validate_list[i].handle, i); + exec_list[i].handle, i); ret = -EINVAL; goto err; } object_list[i]->pending_read_domains = 0; object_list[i]->pending_write_domain = 0; - ret = i915_gem_reloc_and_validate_object(object_list[i], - file_priv, - &validate_list[i]); + ret = i915_gem_object_bind_and_relocate(object_list[i], + file_priv, + &exec_list[i]); if (ret) { - DRM_ERROR("reloc and validate failed %d\n", ret); + DRM_ERROR("object bind and relocate failed %d\n", ret); goto err; } } @@ -1451,11 +1458,11 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, #if WATCH_COHERENCY for (i = 0; i < args->buffer_count; i++) { i915_gem_object_check_coherency(object_list[i], - validate_list[i].handle); + exec_list[i].handle); } #endif - exec_offset = validate_list[args->buffer_count - 1].offset; + exec_offset = exec_list[args->buffer_count - 1].offset; #if WATCH_EXEC i915_gem_dump_object(object_list[args->buffer_count - 1], @@ -1500,13 +1507,13 @@ i915_gem_execbuffer(struct drm_device *dev, void *data, i915_dump_lru(dev, __func__); #endif - /* Copy the new buffer offsets back to the user's validate list. */ + /* Copy the new buffer offsets back to the user's exec list. */ ret = copy_to_user((struct drm_i915_relocation_entry __user *) (uintptr_t) args->buffers_ptr, - validate_list, - sizeof(*validate_list) * args->buffer_count); + exec_list, + sizeof(*exec_list) * args->buffer_count); if (ret) - DRM_ERROR("failed to copy %d validate entries " + DRM_ERROR("failed to copy %d exec entries " "back to user (%d)\n", args->buffer_count, ret); err: @@ -1516,9 +1523,10 @@ err: } mutex_unlock(&dev->struct_mutex); +pre_mutex_err: drm_free(object_list, sizeof(*object_list) * args->buffer_count, DRM_MEM_DRIVER); - drm_free(validate_list, sizeof(*validate_list) * args->buffer_count, + drm_free(exec_list, sizeof(*exec_list) * args->buffer_count, DRM_MEM_DRIVER); return ret; |