Module: Mesa
Branch: main
Commit: a65e982b4412f44c035ccb474db3e64e0e9f6a16
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=a65e982b4412f44c035ccb474db3e64e0e9f6a16

Author: José Roberto de Souza <[email protected]>
Date:   Thu Nov 30 10:05:58 2023 -0800

anv: Split ANV_BO_ALLOC_HOST_CACHED_COHERENT into two actual flags

As suggested by Lionel, here adding ANV_BO_ALLOC_HOST_COHERENT
and with that ANV_BO_ALLOC_HOST_CACHED_COHERENT is now defined by
(ANV_BO_ALLOC_HOST_COHERENT | ANV_BO_ALLOC_HOST_CACHED).

In some callers of anv_device_alloc_bo() was necessary to add
ANV_BO_ALLOC_HOST_COHERENT as no other flag was set and that
was the default behavior up to now.

A change that could look not related is the removal of the
intel_flush_range() in anv_device_init_trivial_batch(), that was done
because trivial_batch_bo is HOST_COHERENT so no flush is necessary.
And it did not made sense to make it ANV_BO_ALLOC_HOST_CACHED_COHERENT
as it was never read in CPU.

Signed-off-by: José Roberto de Souza <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26457>

---

 src/intel/vulkan/anv_allocator.c        | 24 ++++++++++++++++--------
 src/intel/vulkan/anv_device.c           | 31 ++++++++++++++++---------------
 src/intel/vulkan/anv_private.h          | 17 ++++++++++-------
 src/intel/vulkan/i915/anv_kmd_backend.c |  4 ++--
 src/intel/vulkan/xe/anv_kmd_backend.c   |  2 +-
 5 files changed, 45 insertions(+), 33 deletions(-)

diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c
index eb588750920..281b604cb93 100644
--- a/src/intel/vulkan/anv_allocator.c
+++ b/src/intel/vulkan/anv_allocator.c
@@ -1443,7 +1443,7 @@ anv_bo_get_mmap_mode(struct anv_device *device, struct 
anv_bo *bo)
        * LLC in older platforms DRM_IOCTL_I915_GEM_SET_CACHING needs to be
        * supported and set.
        */
-      if (alloc_flags & ANV_BO_ALLOC_HOST_CACHED_COHERENT)
+      if (alloc_flags & ANV_BO_ALLOC_HOST_CACHED)
          return INTEL_DEVICE_INFO_MMAP_MODE_WB;
 
       return INTEL_DEVICE_INFO_MMAP_MODE_WC;
@@ -1463,9 +1463,15 @@ anv_device_alloc_bo(struct anv_device *device,
                     uint64_t explicit_address,
                     struct anv_bo **bo_out)
 {
-   /* bo can only be one: cached+coherent, cached(incoherent) or coherent(no 
flags) */
-   assert(!(!!(alloc_flags & ANV_BO_ALLOC_HOST_CACHED_COHERENT) &&
-            !!(alloc_flags & ANV_BO_ALLOC_HOST_CACHED)));
+   /* bo that needs CPU access needs to be HOST_CACHED, HOST_COHERENT or both 
*/
+   assert((alloc_flags & ANV_BO_ALLOC_MAPPED) == 0 ||
+          (alloc_flags & (ANV_BO_ALLOC_HOST_CACHED | 
ANV_BO_ALLOC_HOST_COHERENT)));
+
+   /* KMD requires a valid PAT index, so setting HOST_COHERENT/WC to bos that
+    * don't need CPU access
+    */
+   if ((alloc_flags & ANV_BO_ALLOC_MAPPED) == 0)
+      alloc_flags |= ANV_BO_ALLOC_HOST_COHERENT;
 
    const uint32_t bo_flags =
          device->kmd_backend->bo_alloc_flags_to_bo_flags(device, alloc_flags);
@@ -1594,7 +1600,8 @@ anv_device_import_bo_from_host_ptr(struct anv_device 
*device,
                                    struct anv_bo **bo_out)
 {
    assert(!(alloc_flags & (ANV_BO_ALLOC_MAPPED |
-                           ANV_BO_ALLOC_HOST_CACHED_COHERENT |
+                           ANV_BO_ALLOC_HOST_CACHED |
+                           ANV_BO_ALLOC_HOST_COHERENT |
                            ANV_BO_ALLOC_DEDICATED |
                            ANV_BO_ALLOC_PROTECTED |
                            ANV_BO_ALLOC_FIXED_ADDRESS)));
@@ -1651,7 +1658,7 @@ anv_device_import_bo_from_host_ptr(struct anv_device 
*device,
 
       __sync_fetch_and_add(&bo->refcount, 1);
    } else {
-      /* Makes sure that userptr gets WB mmap caching and right VM PAT index */
+      /* Makes sure that userptr gets WB+1way host caching */
       alloc_flags |= (ANV_BO_ALLOC_HOST_CACHED_COHERENT | 
ANV_BO_ALLOC_NO_LOCAL_MEM);
       struct anv_bo new_bo = {
          .name = "host-ptr",
@@ -1698,7 +1705,8 @@ anv_device_import_bo(struct anv_device *device,
                      struct anv_bo **bo_out)
 {
    assert(!(alloc_flags & (ANV_BO_ALLOC_MAPPED |
-                           ANV_BO_ALLOC_HOST_CACHED_COHERENT |
+                           ANV_BO_ALLOC_HOST_CACHED |
+                           ANV_BO_ALLOC_HOST_COHERENT |
                            ANV_BO_ALLOC_FIXED_ADDRESS)));
    assert(alloc_flags & ANV_BO_ALLOC_EXTERNAL);
 
@@ -1741,7 +1749,7 @@ anv_device_import_bo(struct anv_device *device,
 
       __sync_fetch_and_add(&bo->refcount, 1);
    } else {
-      /* so imported bos get WB and correct PAT index */
+      /* so imported bos get WB+1way host caching */
       alloc_flags |= (ANV_BO_ALLOC_HOST_CACHED_COHERENT | 
ANV_BO_ALLOC_NO_LOCAL_MEM);
       struct anv_bo new_bo = {
          .name = "imported",
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index c878d76c45e..96e25aae813 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -2929,7 +2929,8 @@ static VkResult
 anv_device_init_trivial_batch(struct anv_device *device)
 {
    VkResult result = anv_device_alloc_bo(device, "trivial-batch", 4096,
-                                         ANV_BO_ALLOC_MAPPED,
+                                         ANV_BO_ALLOC_MAPPED |
+                                         ANV_BO_ALLOC_HOST_COHERENT,
                                          0 /* explicit_address */,
                                          &device->trivial_batch_bo);
    if (result != VK_SUCCESS)
@@ -2944,11 +2945,6 @@ anv_device_init_trivial_batch(struct anv_device *device)
    anv_batch_emit(&batch, GFX7_MI_BATCH_BUFFER_END, bbe);
    anv_batch_emit(&batch, GFX7_MI_NOOP, noop);
 
-#ifdef SUPPORT_INTEL_INTEGRATED_GPUS
-   if (device->physical->memory.need_flush)
-      intel_flush_range(batch.start, batch.next - batch.start);
-#endif
-
    return VK_SUCCESS;
 }
 
@@ -3515,6 +3511,7 @@ VkResult anv_CreateDevice(
 
    result = anv_device_alloc_bo(device, "workaround", 8192,
                                 ANV_BO_ALLOC_CAPTURE |
+                                ANV_BO_ALLOC_HOST_COHERENT |
                                 ANV_BO_ALLOC_MAPPED,
                                 0 /* explicit_address */,
                                 &device->workaround_bo);
@@ -4161,14 +4158,6 @@ VkResult anv_AllocateMemory(
    if (mem->vk.export_handle_types || mem->vk.import_handle_type)
       alloc_flags |= (ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_IMPLICIT_SYNC);
 
-   if ((alloc_flags & (ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_SCANOUT)) == 0) {
-      if ((mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) &&
-          (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT))
-         alloc_flags |= ANV_BO_ALLOC_HOST_CACHED_COHERENT;
-      else if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
-         alloc_flags |= ANV_BO_ALLOC_HOST_CACHED;
-   }
-
    if (mem->vk.ahardware_buffer) {
       result = anv_import_ahw_memory(_device, mem);
       if (result != VK_SUCCESS)
@@ -4245,6 +4234,18 @@ VkResult anv_AllocateMemory(
       goto success;
    }
 
+   if (alloc_flags & (ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_SCANOUT)) {
+      alloc_flags |= ANV_BO_ALLOC_HOST_COHERENT;
+   } else if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
+      if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
+         alloc_flags |= ANV_BO_ALLOC_HOST_COHERENT;
+      if (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)
+         alloc_flags |= ANV_BO_ALLOC_HOST_CACHED;
+   } else {
+      /* Required to set some host mode to have a valid pat index set */
+      alloc_flags |= ANV_BO_ALLOC_HOST_COHERENT;
+   }
+
    /* Regular allocate (not importing memory). */
 
    result = anv_device_alloc_bo(device, "user", pAllocateInfo->allocationSize,
@@ -5212,7 +5213,7 @@ anv_device_get_pat_entry(struct anv_device *device,
       return &device->info->pat.writecombining;
    }
 
-   if (alloc_flags & (ANV_BO_ALLOC_HOST_CACHED_COHERENT))
+   if ((alloc_flags & (ANV_BO_ALLOC_HOST_CACHED_COHERENT)) == 
ANV_BO_ALLOC_HOST_CACHED_COHERENT)
       return &device->info->pat.cached_coherent;
    else if (alloc_flags & (ANV_BO_ALLOC_EXTERNAL | ANV_BO_ALLOC_SCANOUT))
       return &device->info->pat.scanout;
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index b1c558c7713..8e0f673a189 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -375,8 +375,12 @@ enum anv_bo_alloc_flags {
    /** Specifies that the BO should be mapped */
    ANV_BO_ALLOC_MAPPED =                  (1 << 2),
 
-   /** Specifies that the BO should be cached and coherent */
-   ANV_BO_ALLOC_HOST_CACHED_COHERENT =    (1 << 3),
+   /** Specifies that the BO should be coherent.
+    *
+    * Note: In platforms with LLC where HOST_CACHED + HOST_COHERENT is free,
+    * bo can get upgraded to HOST_CACHED_COHERENT
+    */
+   ANV_BO_ALLOC_HOST_COHERENT =           (1 << 3),
 
    /** Specifies that the BO should be captured in error states */
    ANV_BO_ALLOC_CAPTURE =                 (1 << 4),
@@ -426,15 +430,14 @@ enum anv_bo_alloc_flags {
    /** Protected buffer */
    ANV_BO_ALLOC_PROTECTED =               (1 << 15),
 
-   /** Specifies that the BO should be cached and incoherent.
-    *
-    * If ANV_BO_ALLOC_HOST_CACHED or ANV_BO_ALLOC_HOST_CACHED_COHERENT are not
-    * set it will allocate a coherent BO.
-    **/
+   /** Specifies that the BO should be cached and incoherent. */
    ANV_BO_ALLOC_HOST_CACHED =             (1 << 16),
 
    /** For sampler pools */
    ANV_BO_ALLOC_SAMPLER_POOL =            (1 << 17),
+
+   /** Specifies that the BO should be cached and coherent. */
+   ANV_BO_ALLOC_HOST_CACHED_COHERENT =    (ANV_BO_ALLOC_HOST_COHERENT | 
ANV_BO_ALLOC_HOST_CACHED),
 };
 
 struct anv_bo {
diff --git a/src/intel/vulkan/i915/anv_kmd_backend.c 
b/src/intel/vulkan/i915/anv_kmd_backend.c
index 78644f6d121..442ccb3f350 100644
--- a/src/intel/vulkan/i915/anv_kmd_backend.c
+++ b/src/intel/vulkan/i915/anv_kmd_backend.c
@@ -59,7 +59,7 @@ i915_gem_create(struct anv_device *device,
       if (intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_CREATE, &gem_create))
          return 0;
 
-      if (alloc_flags & ANV_BO_ALLOC_HOST_CACHED_COHERENT) {
+      if ((alloc_flags & ANV_BO_ALLOC_HOST_CACHED_COHERENT) == 
ANV_BO_ALLOC_HOST_CACHED_COHERENT) {
          /* We don't want to change these defaults if it's going to be shared
           * with another process.
           */
@@ -128,7 +128,7 @@ i915_gem_create(struct anv_device *device,
 
    *actual_size = gem_create.size;
 
-   if (alloc_flags & ANV_BO_ALLOC_HOST_CACHED_COHERENT) {
+   if ((alloc_flags & ANV_BO_ALLOC_HOST_CACHED_COHERENT) == 
ANV_BO_ALLOC_HOST_CACHED_COHERENT) {
       /* We don't want to change these defaults if it's going to be shared
        * with another process.
        */
diff --git a/src/intel/vulkan/xe/anv_kmd_backend.c 
b/src/intel/vulkan/xe/anv_kmd_backend.c
index 6c4a58d4538..db0957dd2f4 100644
--- a/src/intel/vulkan/xe/anv_kmd_backend.c
+++ b/src/intel/vulkan/xe/anv_kmd_backend.c
@@ -43,7 +43,7 @@ xe_gem_create(struct anv_device *device,
    /* TODO: protected content */
    assert((alloc_flags & ANV_BO_ALLOC_PROTECTED) == 0);
    /* WB+0 way coherent not supported by Xe KMD */
-   assert((alloc_flags & ANV_BO_ALLOC_HOST_CACHED) == 0);
+   assert(alloc_flags & ANV_BO_ALLOC_HOST_COHERENT);
 
    uint32_t flags = 0;
    if (alloc_flags & ANV_BO_ALLOC_SCANOUT)

Reply via email to