drm/xe/uapi: Separate bo_create placement from flags
authorRodrigo Vivi <rodrigo.vivi@intel.com>
Wed, 22 Nov 2023 14:38:21 +0000 (14:38 +0000)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 21 Dec 2023 16:45:12 +0000 (11:45 -0500)
Although the flags are about the creation, the memory placement
of the BO deserves a proper dedicated field in the uapi.

Besides getting more clear, it also allows to remove the
'magic' shifts from the flags that was a concern during the
uapi reviews.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Francois Dugast <francois.dugast@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
drivers/gpu/drm/xe/xe_bo.c
include/uapi/drm/xe_drm.h

index 5e3493f21b59f208ce47a6ca844cca9e708ab3a0..fd516ad7478c8fdbcd164c3c41a6328c5667ffbc 100644 (file)
@@ -1890,15 +1890,15 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data,
            XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
                return -EINVAL;
 
+       /* at least one valid memory placement must be specified */
+       if (XE_IOCTL_DBG(xe, (args->placement & ~xe->info.mem_region_mask) ||
+                        !args->placement))
+               return -EINVAL;
+
        if (XE_IOCTL_DBG(xe, args->flags &
                         ~(DRM_XE_GEM_CREATE_FLAG_DEFER_BACKING |
                           DRM_XE_GEM_CREATE_FLAG_SCANOUT |
-                          DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM |
-                          xe->info.mem_region_mask)))
-               return -EINVAL;
-
-       /* at least one memory type must be specified */
-       if (XE_IOCTL_DBG(xe, !(args->flags & xe->info.mem_region_mask)))
+                          DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM)))
                return -EINVAL;
 
        if (XE_IOCTL_DBG(xe, args->handle))
@@ -1920,7 +1920,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data,
        if (args->flags & DRM_XE_GEM_CREATE_FLAG_SCANOUT)
                bo_flags |= XE_BO_SCANOUT_BIT;
 
-       bo_flags |= args->flags << (ffs(XE_BO_CREATE_SYSTEM_BIT) - 1);
+       bo_flags |= args->placement << (ffs(XE_BO_CREATE_SYSTEM_BIT) - 1);
 
        if (args->flags & DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM) {
                if (XE_IOCTL_DBG(xe, !(bo_flags & XE_BO_CREATE_VRAM_MASK)))
index 4c906ff2429e46b4927ec6c7fca347c0d5d9d7a2..6edbcd81c1950e015234d34678f3d176d24d1326 100644 (file)
@@ -500,8 +500,11 @@ struct drm_xe_gem_create {
         */
        __u64 size;
 
-#define DRM_XE_GEM_CREATE_FLAG_DEFER_BACKING           (0x1 << 24)
-#define DRM_XE_GEM_CREATE_FLAG_SCANOUT                 (0x1 << 25)
+       /** @placement: A mask of memory instances of where BO can be placed. */
+       __u32 placement;
+
+#define DRM_XE_GEM_CREATE_FLAG_DEFER_BACKING           (1 << 0)
+#define DRM_XE_GEM_CREATE_FLAG_SCANOUT                 (1 << 1)
 /*
  * When using VRAM as a possible placement, ensure that the corresponding VRAM
  * allocation will always use the CPU accessible part of VRAM. This is important
@@ -517,7 +520,7 @@ struct drm_xe_gem_create {
  * display surfaces, therefore the kernel requires setting this flag for such
  * objects, otherwise an error is thrown on small-bar systems.
  */
-#define DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM      (0x1 << 26)
+#define DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM      (1 << 2)
        /**
         * @flags: Flags, currently a mask of memory instances of where BO can
         * be placed