Populate the new VCRAT NUMA affinity subtype with the NUMA node ID and
the corresponding proximity domain of each NUMA node.

Signed-off-by: Donet Tom <[email protected]>
---
 drivers/gpu/drm/amd/amdkfd/kfd_crat.c | 32 +++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
index 3190a4d6acc6..5613eb69423d 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_crat.c
@@ -1877,6 +1877,26 @@ static int kfd_fill_iolink_info_for_cpu(int 
numa_node_id, int *avail_size,
 }
 #endif
 
+static int kfd_fill_numa_info_for_cpu(int *avail_size,
+                       struct crat_subtype_numa *sub_type_hdr,
+                       int numa_node, int proximity_domain)
+{
+       *avail_size -= sizeof(struct crat_subtype_numa);
+       if (*avail_size < 0)
+               return -ENOMEM;
+
+       memset(sub_type_hdr, 0, sizeof(struct crat_subtype_numa));
+
+       /* Fill in subtype header data */
+       sub_type_hdr->type = CRAT_SUBTYPE_NUMA_AFFINITY;
+       sub_type_hdr->length = sizeof(struct crat_subtype_numa);
+       sub_type_hdr->flags = CRAT_SUBTYPE_FLAGS_ENABLED;
+       sub_type_hdr->numa_node = numa_node;
+       sub_type_hdr->proximity_domain = proximity_domain;
+
+       return 0;
+}
+
 /* kfd_create_vcrat_image_cpu - Create Virtual CRAT for CPU
  *
  *     @pcrat_image: Fill in VCRAT for CPU
@@ -1974,6 +1994,17 @@ static int kfd_create_vcrat_image_cpu(void *pcrat_image, 
size_t *size)
                pr_info("IO link not available for non x86 platforms\n");
 #endif
 
+               ret = kfd_fill_numa_info_for_cpu(&avail_size,
+                               (struct crat_subtype_numa *)sub_type_hdr,
+                               numa_node_id, crat_table->num_domains);
+               if (ret < 0)
+                       return ret;
+               crat_table->length += sub_type_hdr->length;
+               crat_table->total_entries++;
+
+               sub_type_hdr = (typeof(sub_type_hdr))((char *)sub_type_hdr +
+                               sub_type_hdr->length);
+
                crat_table->num_domains++;
        }
 
@@ -2436,6 +2467,7 @@ int kfd_create_crat_image_virtual(void **crat_image, int 
flags,
                dyn_size = sizeof(struct crat_header) +
                        num_nodes * (sizeof(struct crat_subtype_computeunit) +
                        sizeof(struct crat_subtype_memory) +
+                       sizeof(struct crat_subtype_numa) +
                        (num_nodes - 1) * sizeof(struct crat_subtype_iolink));
                pcrat_image = kvmalloc(dyn_size, GFP_KERNEL);
                if (!pcrat_image)
-- 
2.54.0

Reply via email to