Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915/uapi: introduce drm_i915_gem_create_ext

Same old gem_create but with now with extensions support. This is needed
to support various upcoming usecases.

v2:(Chris)
- Use separate ioctl number for gem_create_ext, instead of hijacking
the existing gem_create ioctl, otherwise we run into the issue
with being unable to detect if the kernel supports the new extension
behaviour.
- We now have gem_create_ext.flags, which should be zeroed.
- I915_GEM_CREATE_EXT_SETPARAM value is now zero, since this is the
index into our array of extensions.
- Setup a "vanilla" object which we can directly apply our extensions
to.
v3:(Daniel & Jason)
- drop I915_GEM_CREATE_EXT_SETPARAM. Instead just have each extension
do one thing only, instead of generic setparam which can cover
various use cases.
- add some kernel-doc.

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: CQ Tang <cq.tang@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Lionel Landwerlin <lionel.g.landwerlin@linux.intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Kenneth Graunke <kenneth@whitecape.org>
Cc: Jason Ekstrand <jason@jlekstrand.net>
Cc: Dave Airlie <airlied@gmail.com>
Cc: dri-devel@lists.freedesktop.org
Cc: mesa-dev@lists.freedesktop.org
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210429103056.407067-5-matthew.auld@intel.com

+101
+56
drivers/gpu/drm/i915/gem/i915_gem_create.c
··· 8 8 9 9 #include "i915_drv.h" 10 10 #include "i915_trace.h" 11 + #include "i915_user_extensions.h" 11 12 12 13 static int i915_gem_publish(struct drm_i915_gem_object *obj, 13 14 struct drm_file *file, ··· 136 135 obj = i915_gem_object_alloc(); 137 136 if (!obj) 138 137 return -ENOMEM; 138 + 139 + ret = i915_gem_setup(obj, 140 + intel_memory_region_by_type(i915, 141 + INTEL_MEMORY_SYSTEM), 142 + args->size); 143 + if (ret) 144 + goto object_free; 145 + 146 + return i915_gem_publish(obj, file, &args->size, &args->handle); 147 + 148 + object_free: 149 + i915_gem_object_free(obj); 150 + return ret; 151 + } 152 + 153 + struct create_ext { 154 + struct drm_i915_private *i915; 155 + struct drm_i915_gem_object *vanilla_object; 156 + }; 157 + 158 + static const i915_user_extension_fn create_extensions[] = { 159 + }; 160 + 161 + /** 162 + * Creates a new mm object and returns a handle to it. 163 + * @dev: drm device pointer 164 + * @data: ioctl data blob 165 + * @file: drm file pointer 166 + */ 167 + int 168 + i915_gem_create_ext_ioctl(struct drm_device *dev, void *data, 169 + struct drm_file *file) 170 + { 171 + struct drm_i915_private *i915 = to_i915(dev); 172 + struct drm_i915_gem_create_ext *args = data; 173 + struct create_ext ext_data = { .i915 = i915 }; 174 + struct drm_i915_gem_object *obj; 175 + int ret; 176 + 177 + if (args->flags) 178 + return -EINVAL; 179 + 180 + i915_gem_flush_free_objects(i915); 181 + 182 + obj = i915_gem_object_alloc(); 183 + if (!obj) 184 + return -ENOMEM; 185 + 186 + ext_data.vanilla_object = obj; 187 + ret = i915_user_extensions(u64_to_user_ptr(args->extensions), 188 + create_extensions, 189 + ARRAY_SIZE(create_extensions), 190 + &ext_data); 191 + if (ret) 192 + goto object_free; 139 193 140 194 ret = i915_gem_setup(obj, 141 195 intel_memory_region_by_type(i915,
+2
drivers/gpu/drm/i915/gem/i915_gem_ioctls.h
··· 14 14 struct drm_file *file); 15 15 int i915_gem_create_ioctl(struct drm_device *dev, void *data, 16 16 struct drm_file *file); 17 + int i915_gem_create_ext_ioctl(struct drm_device *dev, void *data, 18 + struct drm_file *file); 17 19 int i915_gem_execbuffer2_ioctl(struct drm_device *dev, void *data, 18 20 struct drm_file *file); 19 21 int i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
+1
drivers/gpu/drm/i915/i915_drv.c
··· 1705 1705 DRM_IOCTL_DEF_DRV(I915_GEM_ENTERVT, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 1706 1706 DRM_IOCTL_DEF_DRV(I915_GEM_LEAVEVT, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY), 1707 1707 DRM_IOCTL_DEF_DRV(I915_GEM_CREATE, i915_gem_create_ioctl, DRM_RENDER_ALLOW), 1708 + DRM_IOCTL_DEF_DRV(I915_GEM_CREATE_EXT, i915_gem_create_ext_ioctl, DRM_RENDER_ALLOW), 1708 1709 DRM_IOCTL_DEF_DRV(I915_GEM_PREAD, i915_gem_pread_ioctl, DRM_RENDER_ALLOW), 1709 1710 DRM_IOCTL_DEF_DRV(I915_GEM_PWRITE, i915_gem_pwrite_ioctl, DRM_RENDER_ALLOW), 1710 1711 DRM_IOCTL_DEF_DRV(I915_GEM_MMAP, i915_gem_mmap_ioctl, DRM_RENDER_ALLOW),
+42
include/uapi/drm/i915_drm.h
··· 406 406 #define DRM_I915_QUERY 0x39 407 407 #define DRM_I915_GEM_VM_CREATE 0x3a 408 408 #define DRM_I915_GEM_VM_DESTROY 0x3b 409 + #define DRM_I915_GEM_CREATE_EXT 0x3c 409 410 /* Must be kept compact -- no holes */ 410 411 411 412 #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) ··· 439 438 #define DRM_IOCTL_I915_GEM_ENTERVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_ENTERVT) 440 439 #define DRM_IOCTL_I915_GEM_LEAVEVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_LEAVEVT) 441 440 #define DRM_IOCTL_I915_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct drm_i915_gem_create) 441 + #define DRM_IOCTL_I915_GEM_CREATE_EXT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE_EXT, struct drm_i915_gem_create_ext) 442 442 #define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) 443 443 #define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) 444 444 #define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) ··· 2598 2596 2599 2597 /** @regions: Info about each supported region */ 2600 2598 struct drm_i915_memory_region_info regions[]; 2599 + }; 2600 + 2601 + /** 2602 + * struct drm_i915_gem_create_ext - Existing gem_create behaviour, with added 2603 + * extension support using struct i915_user_extension. 2604 + * 2605 + * Note that in the future we want to have our buffer flags here, at least for 2606 + * the stuff that is immutable. Previously we would have two ioctls, one to 2607 + * create the object with gem_create, and another to apply various parameters, 2608 + * however this creates some ambiguity for the params which are considered 2609 + * immutable. Also in general we're phasing out the various SET/GET ioctls. 2610 + */ 2611 + struct drm_i915_gem_create_ext { 2612 + /** 2613 + * @size: Requested size for the object. 2614 + * 2615 + * The (page-aligned) allocated size for the object will be returned. 2616 + * 2617 + */ 2618 + __u64 size; 2619 + /** 2620 + * @handle: Returned handle for the object. 2621 + * 2622 + * Object handles are nonzero. 2623 + */ 2624 + __u32 handle; 2625 + /** @flags: MBZ */ 2626 + __u32 flags; 2627 + /** 2628 + * @extensions: The chain of extensions to apply to this object. 2629 + * 2630 + * This will be useful in the future when we need to support several 2631 + * different extensions, and we need to apply more than one when 2632 + * creating the object. See struct i915_user_extension. 2633 + * 2634 + * If we don't supply any extensions then we get the same old gem_create 2635 + * behaviour. 2636 + * 2637 + */ 2638 + __u64 extensions; 2601 2639 }; 2602 2640 2603 2641 #if defined(__cplusplus)