Signed-off-by: Mario Limonciello <[email protected]>
---
The idea is that this can help a user figure out which wheels they need
for their hardware.
Cc: [email protected]
Cc: [email protected]
Cc: [email protected]
drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 37 +++++++++++++++++++++++
drivers/gpu/drm/amd/amdkfd/kfd_topology.h | 1 +
2 files changed, 38 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index 08c63b4cc9a5f..ab029d87eb9ea 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -471,6 +471,9 @@ static ssize_t node_show(struct kobject *kobj, struct
attribute *attr,
dev->node_props.max_slots_scratch_cu);
sysfs_show_32bit_prop(buffer, offs, "gfx_target_version",
dev->node_props.gfx_target_version);
+ if (dev->node_props.gpu_family[0])
+ sysfs_show_gen_prop(buffer, offs, "gpu_family %s\n",
+ dev->node_props.gpu_family);
sysfs_show_32bit_prop(buffer, offs, "vendor_id",
dev->node_props.vendor_id);
sysfs_show_32bit_prop(buffer, offs, "device_id",
@@ -2048,6 +2051,37 @@ static void kfd_topology_set_capabilities(struct
kfd_topology_device *dev)
kfd_topology_set_dbg_firmware_support(dev);
}
+/**
+ * kfd_get_gpu_family_name - Get GPU family name from gfx_target_version
+ * @gfx_target_version: Numeric GPU target version
+ * @family_name: Output buffer for family name
+ * @size: Size of output buffer
+ *
+ * Converts gfx_target_version to TheRock family format (e.g., "gfx110X").
+ * The gfx_target_version encodes version as MMMNNRR where:
+ * MMM = major version
+ * NN = minor version
+ * RR = revision
+ * Family format is "gfx{major}{minor}X", e.g., 110501 (11.5.01) -> "gfx115X"
+ * If the version is not recognized, family_name is set to empty string.
+ */
+static void kfd_get_gpu_family_name(uint32_t gfx_target_version,
+ char *family_name, size_t size)
+{
+ int major, minor;
+
+ /* Only support TheRock GPU families (GFX9 and newer) */
+ if (gfx_target_version < 90000) {
+ family_name[0] = '\0';
+ return;
+ }
+
+ major = gfx_target_version / 10000;
+ minor = (gfx_target_version / 100) % 100;
+
+ snprintf(family_name, size, "gfx%d%dX", major, minor);
+}
+
int kfd_topology_add_device(struct kfd_node *gpu)
{
uint32_t gpu_id;
@@ -2105,6 +2139,9 @@ int kfd_topology_add_device(struct kfd_node *gpu)
dev->node_props.gfx_target_version =
gpu->kfd->device_info.gfx_target_version;
+ kfd_get_gpu_family_name(dev->node_props.gfx_target_version,
+ dev->node_props.gpu_family,
+ sizeof(dev->node_props.gpu_family));
dev->node_props.vendor_id = gpu->adev->pdev->vendor;
dev->node_props.device_id = gpu->adev->pdev->device;
dev->node_props.capability |=
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
index 3de8ec0043bb4..8e52dd59b53dd 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h
@@ -81,6 +81,7 @@ struct kfd_node_properties {
uint32_t eop_buffer_size;
uint32_t debug_memory_size;
char name[KFD_TOPOLOGY_PUBLIC_NAME_SIZE];
+ char gpu_family[8]; /* GPU family name in TheRock format (e.g.,
gfx110X) */
};
struct kfd_mem_properties {
--
2.53.0