drm/i915/uapi: implement object placement extension
Add new extension to support setting an immutable-priority-list of
potential placements, at creation time.
If we use the normal gem_create or gem_create_ext without the
extensions/placements then we still get the old behaviour with only
placing the object in system memory.
v2(Daniel & Jason):
- Add a bunch of kernel-doc
- Simplify design for placements extension
Testcase: igt/gem_create/create-ext-placement-sanity-check
Testcase: igt/gem_create/create-ext-placement-each
Testcase: igt/gem_create/create-ext-placement-all
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-6-matthew.auld@intel.com
This commit is contained in:
@@ -2616,6 +2616,11 @@ struct drm_i915_gem_create_ext {
|
||||
*
|
||||
* The (page-aligned) allocated size for the object will be returned.
|
||||
*
|
||||
* Note that for some devices we have might have further minimum
|
||||
* page-size restrictions(larger than 4K), like for device local-memory.
|
||||
* However in general the final size here should always reflect any
|
||||
* rounding up, if for example using the I915_GEM_CREATE_EXT_MEMORY_REGIONS
|
||||
* extension to place the object in device local-memory.
|
||||
*/
|
||||
__u64 size;
|
||||
/**
|
||||
@@ -2636,10 +2641,67 @@ struct drm_i915_gem_create_ext {
|
||||
* If we don't supply any extensions then we get the same old gem_create
|
||||
* behaviour.
|
||||
*
|
||||
* For I915_GEM_CREATE_EXT_MEMORY_REGIONS usage see
|
||||
* struct drm_i915_gem_create_ext_memory_regions.
|
||||
*/
|
||||
#define I915_GEM_CREATE_EXT_MEMORY_REGIONS 0
|
||||
__u64 extensions;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_i915_gem_create_ext_memory_regions - The
|
||||
* I915_GEM_CREATE_EXT_MEMORY_REGIONS extension.
|
||||
*
|
||||
* Set the object with the desired set of placements/regions in priority
|
||||
* order. Each entry must be unique and supported by the device.
|
||||
*
|
||||
* This is provided as an array of struct drm_i915_gem_memory_class_instance, or
|
||||
* an equivalent layout of class:instance pair encodings. See struct
|
||||
* drm_i915_query_memory_regions and DRM_I915_QUERY_MEMORY_REGIONS for how to
|
||||
* query the supported regions for a device.
|
||||
*
|
||||
* As an example, on discrete devices, if we wish to set the placement as
|
||||
* device local-memory we can do something like:
|
||||
*
|
||||
* .. code-block:: C
|
||||
*
|
||||
* struct drm_i915_gem_memory_class_instance region_lmem = {
|
||||
* .memory_class = I915_MEMORY_CLASS_DEVICE,
|
||||
* .memory_instance = 0,
|
||||
* };
|
||||
* struct drm_i915_gem_create_ext_memory_regions regions = {
|
||||
* .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
|
||||
* .regions = (uintptr_t)®ion_lmem,
|
||||
* .num_regions = 1,
|
||||
* };
|
||||
* struct drm_i915_gem_create_ext create_ext = {
|
||||
* .size = 16 * PAGE_SIZE,
|
||||
* .extensions = (uintptr_t)®ions,
|
||||
* };
|
||||
*
|
||||
* int err = ioctl(fd, DRM_IOCTL_I915_GEM_CREATE_EXT, &create_ext);
|
||||
* if (err) ...
|
||||
*
|
||||
* At which point we get the object handle in &drm_i915_gem_create_ext.handle,
|
||||
* along with the final object size in &drm_i915_gem_create_ext.size, which
|
||||
* should account for any rounding up, if required.
|
||||
*/
|
||||
struct drm_i915_gem_create_ext_memory_regions {
|
||||
/** @base: Extension link. See struct i915_user_extension. */
|
||||
struct i915_user_extension base;
|
||||
|
||||
/** @pad: MBZ */
|
||||
__u32 pad;
|
||||
/** @num_regions: Number of elements in the @regions array. */
|
||||
__u32 num_regions;
|
||||
/**
|
||||
* @regions: The regions/placements array.
|
||||
*
|
||||
* An array of struct drm_i915_gem_memory_class_instance.
|
||||
*/
|
||||
__u64 regions;
|
||||
};
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user