diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1314-drm-amdkfd-Add-support-for-displaying-VRAM-usage.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/1314-drm-amdkfd-Add-support-for-displaying-VRAM-usage.patch | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1314-drm-amdkfd-Add-support-for-displaying-VRAM-usage.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1314-drm-amdkfd-Add-support-for-displaying-VRAM-usage.patch new file mode 100644 index 00000000..b81c6131 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1314-drm-amdkfd-Add-support-for-displaying-VRAM-usage.patch @@ -0,0 +1,137 @@ +From bf47c9a8a8699ea4c62f4c72b768ad937136f696 Mon Sep 17 00:00:00 2001 +From: Kent Russell <kent.russell@amd.com> +Date: Thu, 20 Jul 2017 12:51:38 -0400 +Subject: [PATCH 1314/4131] drm/amdkfd: Add support for displaying VRAM usage + +Add a sysfs file in topology (node/x/memory_banks/X/used_memory) that +reports the current VRAM usage for that node. Only works for GPU nodes +at this time + +Change-Id: I326c7995eef165edba3897049ad7176e1434c95a +Signed-off-by: Kent Russell <kent.russell@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 49 +++++++++++++++++++++++++++---- + drivers/gpu/drm/amd/amdkfd/kfd_topology.h | 4 ++- + 2 files changed, 46 insertions(+), 7 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +index 0cfeba2..cf9bd01 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +@@ -226,6 +226,8 @@ struct kfd_topology_device *kfd_create_topology_device( + sysfs_show_gen_prop(buffer, "%s %llu\n", name, value) + #define sysfs_show_32bit_val(buffer, value) \ + sysfs_show_gen_prop(buffer, "%u\n", value) ++#define sysfs_show_64bit_val(buffer, value) \ ++ sysfs_show_gen_prop(buffer, "%llu\n", value) + #define sysfs_show_str_val(buffer, value) \ + sysfs_show_gen_prop(buffer, "%s\n", value) + +@@ -308,11 +310,23 @@ static ssize_t mem_show(struct kobject *kobj, struct attribute *attr, + { + ssize_t ret; + struct kfd_mem_properties *mem; ++ uint64_t used_mem; + + /* Making sure that the buffer is an empty string */ + buffer[0] = 0; + +- mem = container_of(attr, struct kfd_mem_properties, attr); ++ if (strcmp(attr->name, "used_memory") == 0) { ++ mem = container_of(attr, struct kfd_mem_properties, ++ attr_used); ++ if (mem->gpu) { ++ used_mem = mem->gpu->kfd2kgd->get_vram_usage(mem->gpu->kgd); ++ return sysfs_show_64bit_val(buffer, used_mem); ++ } ++ /* TODO: Report APU/CPU-allocated memory; For now return 0 */ ++ return 0; ++ } ++ ++ mem = container_of(attr, struct kfd_mem_properties, attr_props); + sysfs_show_32bit_prop(buffer, "heap_type", mem->heap_type); + sysfs_show_64bit_prop(buffer, "size_in_bytes", mem->size_in_bytes); + sysfs_show_32bit_prop(buffer, "flags", mem->flags); +@@ -580,7 +594,12 @@ static void kfd_remove_sysfs_node_entry(struct kfd_topology_device *dev) + if (dev->kobj_mem) { + list_for_each_entry(mem, &dev->mem_props, list) + if (mem->kobj) { +- kfd_remove_sysfs_file(mem->kobj, &mem->attr); ++ kfd_remove_sysfs_file(mem->kobj, ++ &mem->attr_props); ++ /* TODO: Remove when CPU/APU supported */ ++ if (dev->node_props.cpu_cores_count == 0) ++ kfd_remove_sysfs_file(mem->kobj, ++ &mem->attr_used); + mem->kobj = NULL; + } + kobject_del(dev->kobj_mem); +@@ -691,12 +710,23 @@ static int kfd_build_sysfs_node_entry(struct kfd_topology_device *dev, + if (ret < 0) + return ret; + +- mem->attr.name = "properties"; +- mem->attr.mode = KFD_SYSFS_FILE_MODE; +- sysfs_attr_init(&mem->attr); +- ret = sysfs_create_file(mem->kobj, &mem->attr); ++ mem->attr_props.name = "properties"; ++ mem->attr_props.mode = KFD_SYSFS_FILE_MODE; ++ sysfs_attr_init(&mem->attr_props); ++ ret = sysfs_create_file(mem->kobj, &mem->attr_props); + if (ret < 0) + return ret; ++ ++ /* TODO: Support APU/CPU memory usage */ ++ if (dev->node_props.cpu_cores_count == 0) { ++ mem->attr_used.name = "used_memory"; ++ mem->attr_used.mode = KFD_SYSFS_FILE_MODE; ++ sysfs_attr_init(&mem->attr_used); ++ ret = sysfs_create_file(mem->kobj, &mem->attr_used); ++ if (ret < 0) ++ return ret; ++ } ++ + i++; + } + +@@ -1159,15 +1189,22 @@ static struct kfd_topology_device *kfd_assign_gpu(struct kfd_dev *gpu) + { + struct kfd_topology_device *dev; + struct kfd_topology_device *out_dev = NULL; ++ struct kfd_mem_properties *mem; + + down_write(&topology_lock); + list_for_each_entry(dev, &topology_device_list, list) + if (!dev->gpu && (dev->node_props.simd_count > 0)) { + dev->gpu = gpu; + out_dev = dev; ++ ++ /* Assign mem->gpu */ ++ list_for_each_entry(mem, &dev->mem_props, list) ++ mem->gpu = dev->gpu; ++ + break; + } + up_write(&topology_lock); ++ + return out_dev; + } + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h +index ae5edd9..44f0fc7 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.h ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.h +@@ -97,7 +97,9 @@ struct kfd_mem_properties { + uint32_t width; + uint32_t mem_clk_max; + struct kobject *kobj; +- struct attribute attr; ++ struct kfd_dev *gpu; ++ struct attribute attr_props; ++ struct attribute attr_used; + }; + + #define HSA_CACHE_TYPE_DATA 0x00000001 +-- +2.7.4 + |