diff options
author | Joshua Bakita <jbakita@cs.unc.edu> | 2024-04-13 14:19:10 -0400 |
---|---|---|
committer | Joshua Bakita <jbakita@cs.unc.edu> | 2024-04-13 14:19:10 -0400 |
commit | 6c8c5c70a885395afae4e7dd49d6abd9c470bc9e (patch) | |
tree | dd0440345208df6f1d3c35e5c9813ec296358ad5 /device_info_procfs.c | |
parent | 7cfa24cebeaf144b446d07e15fb25e78bb14841e (diff) |
Add /proc/gpu#/local_memory API for getting VRAM size
Diffstat (limited to 'device_info_procfs.c')
-rw-r--r-- | device_info_procfs.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/device_info_procfs.c b/device_info_procfs.c index 8fe9709..c8903fc 100644 --- a/device_info_procfs.c +++ b/device_info_procfs.c | |||
@@ -61,6 +61,30 @@ struct file_operations nvdebug_read_reg_range_file_ops = { | |||
61 | .llseek = default_llseek, | 61 | .llseek = default_llseek, |
62 | }; | 62 | }; |
63 | 63 | ||
64 | static ssize_t local_memory_read(struct file *f, char __user *buf, size_t size, loff_t *off) { | ||
65 | struct nvdebug_state *g = &g_nvdebug_state[file2parentgpuidx(f)]; | ||
66 | char out[30]; | ||
67 | int chars_written; | ||
68 | memory_range_t mem_range; | ||
69 | if (size < 30 || *off != 0) | ||
70 | return 0; | ||
71 | mem_range.raw = nvdebug_readl(g, NV_FB_MMU_LOCAL_MEMORY_RANGE); | ||
72 | if (mem_range.raw == -1) | ||
73 | return -EIO; | ||
74 | // 64-bit size has at most 19 characters + 8 for text and termination | ||
75 | chars_written = scnprintf(out, 30, "%lld bytes\n", memory_range_to_bytes(mem_range)); | ||
76 | if (copy_to_user(buf, out, chars_written)) | ||
77 | printk(KERN_WARNING "Unable to copy all data for %s\n", file_dentry(f)->d_name.name); | ||
78 | *off += chars_written; | ||
79 | return chars_written; | ||
80 | } | ||
81 | |||
82 | // Read out size of on-device VRAM | ||
83 | struct file_operations local_memory_file_ops = { | ||
84 | .read = local_memory_read, | ||
85 | .llseek = default_llseek, | ||
86 | }; | ||
87 | |||
64 | typedef struct { | 88 | typedef struct { |
65 | int idx; // Current index in the device_info table | 89 | int idx; // Current index in the device_info table |
66 | int length; // Length of device_info table (including unpopulated entries) | 90 | int length; // Length of device_info table (including unpopulated entries) |