drm/i915/gem: Drop legacy execbuffer support (v2)
libdrm has supported the newer execbuffer2 ioctl and using it by default when it exists since libdrm commit b50964027bef which landed Mar 2, 2010. The i915 and i965 drivers in Mesa at the time both used libdrm and so did the Intel X11 back-end. The SNA back-end for X11 has always used execbuffer2. v2 (Jason Ekstrand): - Add a comment saying what Linux version it's being removed in. Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> Acked-by: Keith Packard <keithp@keithp.com> Acked-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: https://patchwork.freedesktop.org/patch/msgid/20210317234014.2271006-2-jason@jlekstrand.net
This commit is contained in:
parent
06debd6e1b
commit
b5b6f6a610
@ -3401,106 +3401,6 @@ static bool check_buffer_count(size_t count)
|
||||
return !(count < 1 || count > INT_MAX || count > SIZE_MAX / sz - 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Legacy execbuffer just creates an exec2 list from the original exec object
|
||||
* list array and passes it to the real function.
|
||||
*/
|
||||
int
|
||||
i915_gem_execbuffer_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(dev);
|
||||
struct drm_i915_gem_execbuffer *args = data;
|
||||
struct drm_i915_gem_execbuffer2 exec2;
|
||||
struct drm_i915_gem_exec_object *exec_list = NULL;
|
||||
struct drm_i915_gem_exec_object2 *exec2_list = NULL;
|
||||
const size_t count = args->buffer_count;
|
||||
unsigned int i;
|
||||
int err;
|
||||
|
||||
if (!check_buffer_count(count)) {
|
||||
drm_dbg(&i915->drm, "execbuf2 with %zd buffers\n", count);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
exec2.buffers_ptr = args->buffers_ptr;
|
||||
exec2.buffer_count = args->buffer_count;
|
||||
exec2.batch_start_offset = args->batch_start_offset;
|
||||
exec2.batch_len = args->batch_len;
|
||||
exec2.DR1 = args->DR1;
|
||||
exec2.DR4 = args->DR4;
|
||||
exec2.num_cliprects = args->num_cliprects;
|
||||
exec2.cliprects_ptr = args->cliprects_ptr;
|
||||
exec2.flags = I915_EXEC_RENDER;
|
||||
i915_execbuffer2_set_context_id(exec2, 0);
|
||||
|
||||
err = i915_gem_check_execbuffer(&exec2);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* Copy in the exec list from userland */
|
||||
exec_list = kvmalloc_array(count, sizeof(*exec_list),
|
||||
__GFP_NOWARN | GFP_KERNEL);
|
||||
|
||||
/* Allocate extra slots for use by the command parser */
|
||||
exec2_list = kvmalloc_array(count + 2, eb_element_size(),
|
||||
__GFP_NOWARN | GFP_KERNEL);
|
||||
if (exec_list == NULL || exec2_list == NULL) {
|
||||
drm_dbg(&i915->drm,
|
||||
"Failed to allocate exec list for %d buffers\n",
|
||||
args->buffer_count);
|
||||
kvfree(exec_list);
|
||||
kvfree(exec2_list);
|
||||
return -ENOMEM;
|
||||
}
|
||||
err = copy_from_user(exec_list,
|
||||
u64_to_user_ptr(args->buffers_ptr),
|
||||
sizeof(*exec_list) * count);
|
||||
if (err) {
|
||||
drm_dbg(&i915->drm, "copy %d exec entries failed %d\n",
|
||||
args->buffer_count, err);
|
||||
kvfree(exec_list);
|
||||
kvfree(exec2_list);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
for (i = 0; i < args->buffer_count; i++) {
|
||||
exec2_list[i].handle = exec_list[i].handle;
|
||||
exec2_list[i].relocation_count = exec_list[i].relocation_count;
|
||||
exec2_list[i].relocs_ptr = exec_list[i].relocs_ptr;
|
||||
exec2_list[i].alignment = exec_list[i].alignment;
|
||||
exec2_list[i].offset = exec_list[i].offset;
|
||||
if (INTEL_GEN(to_i915(dev)) < 4)
|
||||
exec2_list[i].flags = EXEC_OBJECT_NEEDS_FENCE;
|
||||
else
|
||||
exec2_list[i].flags = 0;
|
||||
}
|
||||
|
||||
err = i915_gem_do_execbuffer(dev, file, &exec2, exec2_list);
|
||||
if (exec2.flags & __EXEC_HAS_RELOC) {
|
||||
struct drm_i915_gem_exec_object __user *user_exec_list =
|
||||
u64_to_user_ptr(args->buffers_ptr);
|
||||
|
||||
/* Copy the new buffer offsets back to the user's exec list. */
|
||||
for (i = 0; i < args->buffer_count; i++) {
|
||||
if (!(exec2_list[i].offset & UPDATE))
|
||||
continue;
|
||||
|
||||
exec2_list[i].offset =
|
||||
gen8_canonical_addr(exec2_list[i].offset & PIN_OFFSET_MASK);
|
||||
exec2_list[i].offset &= PIN_OFFSET_MASK;
|
||||
if (__copy_to_user(&user_exec_list[i].offset,
|
||||
&exec2_list[i].offset,
|
||||
sizeof(user_exec_list[i].offset)))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
kvfree(exec_list);
|
||||
kvfree(exec2_list);
|
||||
return err;
|
||||
}
|
||||
|
||||
int
|
||||
i915_gem_execbuffer2_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file)
|
||||
|
@ -14,8 +14,6 @@ int i915_gem_busy_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file);
|
||||
int i915_gem_create_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file);
|
||||
int i915_gem_execbuffer_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file);
|
||||
int i915_gem_execbuffer2_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file);
|
||||
int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
|
||||
|
@ -1691,7 +1691,7 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
|
||||
DRM_IOCTL_DEF_DRV(I915_VBLANK_SWAP, drm_noop, DRM_AUTH),
|
||||
DRM_IOCTL_DEF_DRV(I915_HWS_ADDR, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
||||
DRM_IOCTL_DEF_DRV(I915_GEM_INIT, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
||||
DRM_IOCTL_DEF_DRV(I915_GEM_EXECBUFFER, i915_gem_execbuffer_ioctl, DRM_AUTH),
|
||||
DRM_IOCTL_DEF_DRV(I915_GEM_EXECBUFFER, drm_invalid_op, DRM_AUTH),
|
||||
DRM_IOCTL_DEF_DRV(I915_GEM_EXECBUFFER2_WR, i915_gem_execbuffer2_ioctl, DRM_RENDER_ALLOW),
|
||||
DRM_IOCTL_DEF_DRV(I915_GEM_PIN, i915_gem_reject_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY),
|
||||
DRM_IOCTL_DEF_DRV(I915_GEM_UNPIN, i915_gem_reject_pin_ioctl, DRM_AUTH|DRM_ROOT_ONLY),
|
||||
|
@ -943,6 +943,7 @@ struct drm_i915_gem_exec_object {
|
||||
__u64 offset;
|
||||
};
|
||||
|
||||
/* DRM_IOCTL_I915_GEM_EXECBUFFER was removed in Linux 5.13 */
|
||||
struct drm_i915_gem_execbuffer {
|
||||
/**
|
||||
* List of buffers to be validated with their relocations to be
|
||||
|
Loading…
Reference in New Issue
Block a user