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.
Showing the changes to include/uapi (1 of 4 files). Show all
Unified · Split
| @@ -406,6 +406,7 @@ typedef struct _drm_i915_sarea { · 405 unmodified lines | |||
| 406 | #define DRM_I915_QUERY 0x39 | 406 | #define DRM_I915_QUERY 0x39 |
| 407 | #define DRM_I915_GEM_VM_CREATE 0x3a | 407 | #define DRM_I915_GEM_VM_CREATE 0x3a |
| 408 | #define DRM_I915_GEM_VM_DESTROY 0x3b | 408 | #define DRM_I915_GEM_VM_DESTROY 0x3b |
| 409 | #define DRM_I915_GEM_CREATE_EXT 0x3c | ||
| 409 | /* Must be kept compact -- no holes */ | 410 | /* Must be kept compact -- no holes */ |
| 410 | 411 | ||
| 411 | #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) | 412 | #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 | |||
| 438 | #define DRM_IOCTL_I915_GEM_ENTERVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_ENTERVT) | 439 | #define DRM_IOCTL_I915_GEM_ENTERVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_ENTERVT) |
| 439 | #define DRM_IOCTL_I915_GEM_LEAVEVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_LEAVEVT) | 440 | #define DRM_IOCTL_I915_GEM_LEAVEVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_LEAVEVT) |
| 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 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) | ||
| 441 | #define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) | 443 | #define DRM_IOCTL_I915_GEM_PREAD DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread) |
| 442 | #define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) | 444 | #define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite) |
| 443 | #define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap) | 445 | #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 | |||
| 2598 | struct drm_i915_memory_region_info regions[]; | 2600 | struct drm_i915_memory_region_info regions[]; |
| 2599 | }; | 2601 | }; |
| 2600 | 2602 | ||
| 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 | |||
| 2601 | #if defined(__cplusplus) | 2643 | #if defined(__cplusplus) |
| 2602 | } | 2644 | } |
| 2603 | #endif | 2645 | #endif |