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
Showing the changes to include/uapi/drm (1 of 7 files). Show all
Unified · Split
| @@ -2616,6 +2616,11 @@ struct drm_i915_gem_create_ext { · 2615 unmodified lines | ||
| 2616 | 2616 | * |
| 2617 | 2617 | * The (page-aligned) allocated size for the object will be returned. |
| 2618 | 2618 | * |
| 2619 | + * Note that for some devices we have might have further minimum | |
| 2620 | + * page-size restrictions(larger than 4K), like for device local-memory. | |
| 2621 | + * However in general the final size here should always reflect any | |
| 2622 | + * rounding up, if for example using the I915_GEM_CREATE_EXT_MEMORY_REGIONS | |
| 2623 | + * extension to place the object in device local-memory. | |
| 2619 | 2624 | */ |
| 2620 | 2625 | __u64 size; |
| 2621 | 2626 | /** |
| @@ -2636,10 +2641,67 @@ struct drm_i915_gem_create_ext { · 14 unmodified lines | ||
| 2636 | 2641 | * If we don't supply any extensions then we get the same old gem_create |
| 2637 | 2642 | * behaviour. |
| 2638 | 2643 | * |
| 2644 | + * For I915_GEM_CREATE_EXT_MEMORY_REGIONS usage see | |
| 2645 | + * struct drm_i915_gem_create_ext_memory_regions. | |
| 2639 | 2646 | */ |
| 2647 | +#define I915_GEM_CREATE_EXT_MEMORY_REGIONS 0 | |
| 2640 | 2648 | __u64 extensions; |
| 2641 | 2649 | }; |
| 2642 | 2650 | |
| 2651 | +/** | |
| 2652 | + * struct drm_i915_gem_create_ext_memory_regions - The | |
| 2653 | + * I915_GEM_CREATE_EXT_MEMORY_REGIONS extension. | |
| 2654 | + * | |
| 2655 | + * Set the object with the desired set of placements/regions in priority | |
| 2656 | + * order. Each entry must be unique and supported by the device. | |
| 2657 | + * | |
| 2658 | + * This is provided as an array of struct drm_i915_gem_memory_class_instance, or | |
| 2659 | + * an equivalent layout of class:instance pair encodings. See struct | |
| 2660 | + * drm_i915_query_memory_regions and DRM_I915_QUERY_MEMORY_REGIONS for how to | |
| 2661 | + * query the supported regions for a device. | |
| 2662 | + * | |
| 2663 | + * As an example, on discrete devices, if we wish to set the placement as | |
| 2664 | + * device local-memory we can do something like: | |
| 2665 | + * | |
| 2666 | + * .. code-block:: C | |
| 2667 | + * | |
| 2668 | + * struct drm_i915_gem_memory_class_instance region_lmem = { | |
| 2669 | + * .memory_class = I915_MEMORY_CLASS_DEVICE, | |
| 2670 | + * .memory_instance = 0, | |
| 2671 | + * }; | |
| 2672 | + * struct drm_i915_gem_create_ext_memory_regions regions = { | |
| 2673 | + * .base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS }, | |
| 2674 | + * .regions = (uintptr_t)®ion_lmem, | |
| 2675 | + * .num_regions = 1, | |
| 2676 | + * }; | |
| 2677 | + * struct drm_i915_gem_create_ext create_ext = { | |
| 2678 | + * .size = 16 * PAGE_SIZE, | |
| 2679 | + * .extensions = (uintptr_t)®ions, | |
| 2680 | + * }; | |
| 2681 | + * | |
| 2682 | + * int err = ioctl(fd, DRM_IOCTL_I915_GEM_CREATE_EXT, &create_ext); | |
| 2683 | + * if (err) ... | |
| 2684 | + * | |
| 2685 | + * At which point we get the object handle in &drm_i915_gem_create_ext.handle, | |
| 2686 | + * along with the final object size in &drm_i915_gem_create_ext.size, which | |
| 2687 | + * should account for any rounding up, if required. | |
| 2688 | + */ | |
| 2689 | +struct drm_i915_gem_create_ext_memory_regions { | |
| 2690 | + /** @base: Extension link. See struct i915_user_extension. */ | |
| 2691 | + struct i915_user_extension base; | |
| 2692 | + | |
| 2693 | + /** @pad: MBZ */ | |
| 2694 | + __u32 pad; | |
| 2695 | + /** @num_regions: Number of elements in the @regions array. */ | |
| 2696 | + __u32 num_regions; | |
| 2697 | + /** | |
| 2698 | + * @regions: The regions/placements array. | |
| 2699 | + * | |
| 2700 | + * An array of struct drm_i915_gem_memory_class_instance. | |
| 2701 | + */ | |
| 2702 | + __u64 regions; | |
| 2703 | +}; | |
| 2704 | + | |
| 2643 | 2705 | #if defined(__cplusplus) |
| 2644 | 2706 | } |
| 2645 | 2707 | #endif |