[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