[PATCH 3/7] drm/amdgpu: Populate NUMA affinity entries in VCRAT

Donet Tom <[email protected]> Tue, 4 Aug 2026 15:22:32 +0530
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <bec09fed7585ec07276f6bdc3ee536ece8c24879.1785833981.git.donettom@linux.ibm.com>
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