History

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.

Matthew Auld committed 5 years ago

Commit ebcb4021 parent 357814f4 files · +101 −0Browse files

Showing the changes to include/uapi (1 of 4 files). Show all

Unified · Split

include/uapi/drm/i915_drm.h+42−0
@@ -406,6 +406,7 @@ typedef struct _drm_i915_sarea { · 405 unmodified lines
406406 #define DRM_I915_QUERY 0x39
407407 #define DRM_I915_GEM_VM_CREATE 0x3a
408408 #define DRM_I915_GEM_VM_DESTROY 0x3b
409+#define DRM_I915_GEM_CREATE_EXT 0x3c
409410 /* Must be kept compact -- no holes */
410411
411412 #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
@@ -438,6 +439,7 @@ typedef struct _drm_i915_sarea { · 26 unmodified lines
438439 #define DRM_IOCTL_I915_GEM_ENTERVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_ENTERVT)
439440 #define DRM_IOCTL_I915_GEM_LEAVEVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_LEAVEVT)
440441 #define DRM_IOCTL_I915_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct drm_i915_gem_create)
442+#define DRM_IOCTL_I915_GEM_CREATE_EXT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE_EXT, struct drm_i915_gem_create_ext)
441443 #define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread)
442444 #define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite)
443445 #define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap)
@@ -2598,6 +2600,46 @@ struct drm_i915_query_memory_regions { · 2154 unmodified lines
25982600 struct drm_i915_memory_region_info regions[];
25992601 };
26002602
2603+/**
2604+ * struct drm_i915_gem_create_ext - Existing gem_create behaviour, with added
2605+ * extension support using struct i915_user_extension.
2606+ *
2607+ * Note that in the future we want to have our buffer flags here, at least for
2608+ * the stuff that is immutable. Previously we would have two ioctls, one to
2609+ * create the object with gem_create, and another to apply various parameters,
2610+ * however this creates some ambiguity for the params which are considered
2611+ * immutable. Also in general we're phasing out the various SET/GET ioctls.
2612+ */
2613+struct drm_i915_gem_create_ext {
2614+ /**
2615+ * @size: Requested size for the object.
2616+ *
2617+ * The (page-aligned) allocated size for the object will be returned.
2618+ *
2619+ */
2620+ __u64 size;
2621+ /**
2622+ * @handle: Returned handle for the object.
2623+ *
2624+ * Object handles are nonzero.
2625+ */
2626+ __u32 handle;
2627+ /** @flags: MBZ */
2628+ __u32 flags;
2629+ /**
2630+ * @extensions: The chain of extensions to apply to this object.
2631+ *
2632+ * This will be useful in the future when we need to support several
2633+ * different extensions, and we need to apply more than one when
2634+ * creating the object. See struct i915_user_extension.
2635+ *
2636+ * If we don't supply any extensions then we get the same old gem_create
2637+ * behaviour.
2638+ *
2639+ */
2640+ __u64 extensions;
2641+};
2642+
26012643 #if defined(__cplusplus)
26022644 }
26032645 #endif