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 (1 of 7 files). Show all
Unified · Split
| @@ -2616,6 +2616,11 @@ struct drm_i915_gem_create_ext { · 2615 unmodified lines | |||
| 2616 | * | 2616 | * |
| 2617 | * The (page-aligned) allocated size for the object will be returned. | 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 | __u64 size; | 2625 | __u64 size; |
| 2621 | /** | 2626 | /** |
| @@ -2636,10 +2641,67 @@ struct drm_i915_gem_create_ext { · 14 unmodified lines | |||
| 2636 | * If we don't supply any extensions then we get the same old gem_create | 2641 | * If we don't supply any extensions then we get the same old gem_create |
| 2637 | * behaviour. | 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 | __u64 extensions; | 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 | #if defined(__cplusplus) | 2705 | #if defined(__cplusplus) |
| 2644 | } | 2706 | } |
| 2645 | #endif | 2707 | #endif |