master
c 1,189 lines 50.5 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "plugin_proc.h"
4
5 #define PLUGIN_PROC_MODULE_DRM_NAME "/sys/class/drm"
6 #define CONFIG_SECTION_PLUGIN_PROC_DRM "plugin:proc:/sys/class/drm"
7 #define AMDGPU_CHART_TYPE "amdgpu"
8
9 struct amdgpu_id_struct {
10 unsigned long long asic_id;
11 unsigned long long pci_rev_id;
12 const char *marketing_name;
13 };
14
15 /*
16 * About amdgpu_ids list:
17 * ------------------------------------------------------------------------
18 * Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.
19 *
20 * The list is copied from:
21 * https://raw.githubusercontent.com/Syllo/nvtop/master/src/amdgpu_ids.h
22 *
23 * which is modified from libdrm (MIT License):
24 *
25 * URL: https://gitlab.freedesktop.org/mesa/drm/-/blob/main/data/amdgpu.ids
26 * ------------------------------------------------------------------------
27 * **IMPORTANT**: The amdgpu_ids has to be modified after new GPU releases.
28 * ------------------------------------------------------------------------*/
29
30 static const struct amdgpu_id_struct amdgpu_ids[] = {
31 {0x1309, 0x00, "AMD Radeon R7 Graphics"},
32 {0x130A, 0x00, "AMD Radeon R6 Graphics"},
33 {0x130B, 0x00, "AMD Radeon R4 Graphics"},
34 {0x130C, 0x00, "AMD Radeon R7 Graphics"},
35 {0x130D, 0x00, "AMD Radeon R6 Graphics"},
36 {0x130E, 0x00, "AMD Radeon R5 Graphics"},
37 {0x130F, 0x00, "AMD Radeon R7 Graphics"},
38 {0x130F, 0xD4, "AMD Radeon R7 Graphics"},
39 {0x130F, 0xD5, "AMD Radeon R7 Graphics"},
40 {0x130F, 0xD6, "AMD Radeon R7 Graphics"},
41 {0x130F, 0xD7, "AMD Radeon R7 Graphics"},
42 {0x1313, 0x00, "AMD Radeon R7 Graphics"},
43 {0x1313, 0xD4, "AMD Radeon R7 Graphics"},
44 {0x1313, 0xD5, "AMD Radeon R7 Graphics"},
45 {0x1313, 0xD6, "AMD Radeon R7 Graphics"},
46 {0x1315, 0x00, "AMD Radeon R5 Graphics"},
47 {0x1315, 0xD4, "AMD Radeon R5 Graphics"},
48 {0x1315, 0xD5, "AMD Radeon R5 Graphics"},
49 {0x1315, 0xD6, "AMD Radeon R5 Graphics"},
50 {0x1315, 0xD7, "AMD Radeon R5 Graphics"},
51 {0x1316, 0x00, "AMD Radeon R5 Graphics"},
52 {0x1318, 0x00, "AMD Radeon R5 Graphics"},
53 {0x131B, 0x00, "AMD Radeon R4 Graphics"},
54 {0x131C, 0x00, "AMD Radeon R7 Graphics"},
55 {0x131D, 0x00, "AMD Radeon R6 Graphics"},
56 {0x15D8, 0x00, "AMD Radeon RX Vega 8 Graphics WS"},
57 {0x15D8, 0x91, "AMD Radeon Vega 3 Graphics"},
58 {0x15D8, 0x91, "AMD Ryzen Embedded R1606G with Radeon Vega Gfx"},
59 {0x15D8, 0x92, "AMD Radeon Vega 3 Graphics"},
60 {0x15D8, 0x92, "AMD Ryzen Embedded R1505G with Radeon Vega Gfx"},
61 {0x15D8, 0x93, "AMD Radeon Vega 1 Graphics"},
62 {0x15D8, 0xA1, "AMD Radeon Vega 10 Graphics"},
63 {0x15D8, 0xA2, "AMD Radeon Vega 8 Graphics"},
64 {0x15D8, 0xA3, "AMD Radeon Vega 6 Graphics"},
65 {0x15D8, 0xA4, "AMD Radeon Vega 3 Graphics"},
66 {0x15D8, 0xB1, "AMD Radeon Vega 10 Graphics"},
67 {0x15D8, 0xB2, "AMD Radeon Vega 8 Graphics"},
68 {0x15D8, 0xB3, "AMD Radeon Vega 6 Graphics"},
69 {0x15D8, 0xB4, "AMD Radeon Vega 3 Graphics"},
70 {0x15D8, 0xC1, "AMD Radeon Vega 10 Graphics"},
71 {0x15D8, 0xC2, "AMD Radeon Vega 8 Graphics"},
72 {0x15D8, 0xC3, "AMD Radeon Vega 6 Graphics"},
73 {0x15D8, 0xC4, "AMD Radeon Vega 3 Graphics"},
74 {0x15D8, 0xC5, "AMD Radeon Vega 3 Graphics"},
75 {0x15D8, 0xC8, "AMD Radeon Vega 11 Graphics"},
76 {0x15D8, 0xC9, "AMD Radeon Vega 8 Graphics"},
77 {0x15D8, 0xCA, "AMD Radeon Vega 11 Graphics"},
78 {0x15D8, 0xCB, "AMD Radeon Vega 8 Graphics"},
79 {0x15D8, 0xCC, "AMD Radeon Vega 3 Graphics"},
80 {0x15D8, 0xCE, "AMD Radeon Vega 3 Graphics"},
81 {0x15D8, 0xCF, "AMD Ryzen Embedded R1305G with Radeon Vega Gfx"},
82 {0x15D8, 0xD1, "AMD Radeon Vega 10 Graphics"},
83 {0x15D8, 0xD2, "AMD Radeon Vega 8 Graphics"},
84 {0x15D8, 0xD3, "AMD Radeon Vega 6 Graphics"},
85 {0x15D8, 0xD4, "AMD Radeon Vega 3 Graphics"},
86 {0x15D8, 0xD8, "AMD Radeon Vega 11 Graphics"},
87 {0x15D8, 0xD9, "AMD Radeon Vega 8 Graphics"},
88 {0x15D8, 0xDA, "AMD Radeon Vega 11 Graphics"},
89 {0x15D8, 0xDB, "AMD Radeon Vega 3 Graphics"},
90 {0x15D8, 0xDB, "AMD Radeon Vega 8 Graphics"},
91 {0x15D8, 0xDC, "AMD Radeon Vega 3 Graphics"},
92 {0x15D8, 0xDD, "AMD Radeon Vega 3 Graphics"},
93 {0x15D8, 0xDE, "AMD Radeon Vega 3 Graphics"},
94 {0x15D8, 0xDF, "AMD Radeon Vega 3 Graphics"},
95 {0x15D8, 0xE3, "AMD Radeon Vega 3 Graphics"},
96 {0x15D8, 0xE4, "AMD Ryzen Embedded R1102G with Radeon Vega Gfx"},
97 {0x15DD, 0x81, "AMD Ryzen Embedded V1807B with Radeon Vega Gfx"},
98 {0x15DD, 0x82, "AMD Ryzen Embedded V1756B with Radeon Vega Gfx"},
99 {0x15DD, 0x83, "AMD Ryzen Embedded V1605B with Radeon Vega Gfx"},
100 {0x15DD, 0x84, "AMD Radeon Vega 6 Graphics"},
101 {0x15DD, 0x85, "AMD Ryzen Embedded V1202B with Radeon Vega Gfx"},
102 {0x15DD, 0x86, "AMD Radeon Vega 11 Graphics"},
103 {0x15DD, 0x88, "AMD Radeon Vega 8 Graphics"},
104 {0x15DD, 0xC1, "AMD Radeon Vega 11 Graphics"},
105 {0x15DD, 0xC2, "AMD Radeon Vega 8 Graphics"},
106 {0x15DD, 0xC3, "AMD Radeon Vega 3 / 10 Graphics"},
107 {0x15DD, 0xC4, "AMD Radeon Vega 8 Graphics"},
108 {0x15DD, 0xC5, "AMD Radeon Vega 3 Graphics"},
109 {0x15DD, 0xC6, "AMD Radeon Vega 11 Graphics"},
110 {0x15DD, 0xC8, "AMD Radeon Vega 8 Graphics"},
111 {0x15DD, 0xC9, "AMD Radeon Vega 11 Graphics"},
112 {0x15DD, 0xCA, "AMD Radeon Vega 8 Graphics"},
113 {0x15DD, 0xCB, "AMD Radeon Vega 3 Graphics"},
114 {0x15DD, 0xCC, "AMD Radeon Vega 6 Graphics"},
115 {0x15DD, 0xCE, "AMD Radeon Vega 3 Graphics"},
116 {0x15DD, 0xCF, "AMD Radeon Vega 3 Graphics"},
117 {0x15DD, 0xD0, "AMD Radeon Vega 10 Graphics"},
118 {0x15DD, 0xD1, "AMD Radeon Vega 8 Graphics"},
119 {0x15DD, 0xD3, "AMD Radeon Vega 11 Graphics"},
120 {0x15DD, 0xD5, "AMD Radeon Vega 8 Graphics"},
121 {0x15DD, 0xD6, "AMD Radeon Vega 11 Graphics"},
122 {0x15DD, 0xD7, "AMD Radeon Vega 8 Graphics"},
123 {0x15DD, 0xD8, "AMD Radeon Vega 3 Graphics"},
124 {0x15DD, 0xD9, "AMD Radeon Vega 6 Graphics"},
125 {0x15DD, 0xE1, "AMD Radeon Vega 3 Graphics"},
126 {0x15DD, 0xE2, "AMD Radeon Vega 3 Graphics"},
127 {0x163F, 0xAE, "AMD Custom GPU 0405"},
128 {0x6600, 0x00, "AMD Radeon HD 8600 / 8700M"},
129 {0x6600, 0x81, "AMD Radeon R7 M370"},
130 {0x6601, 0x00, "AMD Radeon HD 8500M / 8700M"},
131 {0x6604, 0x00, "AMD Radeon R7 M265 Series"},
132 {0x6604, 0x81, "AMD Radeon R7 M350"},
133 {0x6605, 0x00, "AMD Radeon R7 M260 Series"},
134 {0x6605, 0x81, "AMD Radeon R7 M340"},
135 {0x6606, 0x00, "AMD Radeon HD 8790M"},
136 {0x6607, 0x00, "AMD Radeon R5 M240"},
137 {0x6608, 0x00, "AMD FirePro W2100"},
138 {0x6610, 0x00, "AMD Radeon R7 200 Series"},
139 {0x6610, 0x81, "AMD Radeon R7 350"},
140 {0x6610, 0x83, "AMD Radeon R5 340"},
141 {0x6610, 0x87, "AMD Radeon R7 200 Series"},
142 {0x6611, 0x00, "AMD Radeon R7 200 Series"},
143 {0x6611, 0x87, "AMD Radeon R7 200 Series"},
144 {0x6613, 0x00, "AMD Radeon R7 200 Series"},
145 {0x6617, 0x00, "AMD Radeon R7 240 Series"},
146 {0x6617, 0x87, "AMD Radeon R7 200 Series"},
147 {0x6617, 0xC7, "AMD Radeon R7 240 Series"},
148 {0x6640, 0x00, "AMD Radeon HD 8950"},
149 {0x6640, 0x80, "AMD Radeon R9 M380"},
150 {0x6646, 0x00, "AMD Radeon R9 M280X"},
151 {0x6646, 0x80, "AMD Radeon R9 M385"},
152 {0x6646, 0x80, "AMD Radeon R9 M470X"},
153 {0x6647, 0x00, "AMD Radeon R9 M200X Series"},
154 {0x6647, 0x80, "AMD Radeon R9 M380"},
155 {0x6649, 0x00, "AMD FirePro W5100"},
156 {0x6658, 0x00, "AMD Radeon R7 200 Series"},
157 {0x665C, 0x00, "AMD Radeon HD 7700 Series"},
158 {0x665D, 0x00, "AMD Radeon R7 200 Series"},
159 {0x665F, 0x81, "AMD Radeon R7 360 Series"},
160 {0x6660, 0x00, "AMD Radeon HD 8600M Series"},
161 {0x6660, 0x81, "AMD Radeon R5 M335"},
162 {0x6660, 0x83, "AMD Radeon R5 M330"},
163 {0x6663, 0x00, "AMD Radeon HD 8500M Series"},
164 {0x6663, 0x83, "AMD Radeon R5 M320"},
165 {0x6664, 0x00, "AMD Radeon R5 M200 Series"},
166 {0x6665, 0x00, "AMD Radeon R5 M230 Series"},
167 {0x6665, 0x83, "AMD Radeon R5 M320"},
168 {0x6665, 0xC3, "AMD Radeon R5 M435"},
169 {0x6666, 0x00, "AMD Radeon R5 M200 Series"},
170 {0x6667, 0x00, "AMD Radeon R5 M200 Series"},
171 {0x666F, 0x00, "AMD Radeon HD 8500M"},
172 {0x66A1, 0x02, "AMD Instinct MI60 / MI50"},
173 {0x66A1, 0x06, "AMD Radeon Pro VII"},
174 {0x66AF, 0xC1, "AMD Radeon VII"},
175 {0x6780, 0x00, "AMD FirePro W9000"},
176 {0x6784, 0x00, "ATI FirePro V (FireGL V) Graphics Adapter"},
177 {0x6788, 0x00, "ATI FirePro V (FireGL V) Graphics Adapter"},
178 {0x678A, 0x00, "AMD FirePro W8000"},
179 {0x6798, 0x00, "AMD Radeon R9 200 / HD 7900 Series"},
180 {0x6799, 0x00, "AMD Radeon HD 7900 Series"},
181 {0x679A, 0x00, "AMD Radeon HD 7900 Series"},
182 {0x679B, 0x00, "AMD Radeon HD 7900 Series"},
183 {0x679E, 0x00, "AMD Radeon HD 7800 Series"},
184 {0x67A0, 0x00, "AMD Radeon FirePro W9100"},
185 {0x67A1, 0x00, "AMD Radeon FirePro W8100"},
186 {0x67B0, 0x00, "AMD Radeon R9 200 Series"},
187 {0x67B0, 0x80, "AMD Radeon R9 390 Series"},
188 {0x67B1, 0x00, "AMD Radeon R9 200 Series"},
189 {0x67B1, 0x80, "AMD Radeon R9 390 Series"},
190 {0x67B9, 0x00, "AMD Radeon R9 200 Series"},
191 {0x67C0, 0x00, "AMD Radeon Pro WX 7100 Graphics"},
192 {0x67C0, 0x80, "AMD Radeon E9550"},
193 {0x67C2, 0x01, "AMD Radeon Pro V7350x2"},
194 {0x67C2, 0x02, "AMD Radeon Pro V7300X"},
195 {0x67C4, 0x00, "AMD Radeon Pro WX 7100 Graphics"},
196 {0x67C4, 0x80, "AMD Radeon E9560 / E9565 Graphics"},
197 {0x67C7, 0x00, "AMD Radeon Pro WX 5100 Graphics"},
198 {0x67C7, 0x80, "AMD Radeon E9390 Graphics"},
199 {0x67D0, 0x01, "AMD Radeon Pro V7350x2"},
200 {0x67D0, 0x02, "AMD Radeon Pro V7300X"},
201 {0x67DF, 0xC0, "AMD Radeon Pro 580X"},
202 {0x67DF, 0xC1, "AMD Radeon RX 580 Series"},
203 {0x67DF, 0xC2, "AMD Radeon RX 570 Series"},
204 {0x67DF, 0xC3, "AMD Radeon RX 580 Series"},
205 {0x67DF, 0xC4, "AMD Radeon RX 480 Graphics"},
206 {0x67DF, 0xC5, "AMD Radeon RX 470 Graphics"},
207 {0x67DF, 0xC6, "AMD Radeon RX 570 Series"},
208 {0x67DF, 0xC7, "AMD Radeon RX 480 Graphics"},
209 {0x67DF, 0xCF, "AMD Radeon RX 470 Graphics"},
210 {0x67DF, 0xD7, "AMD Radeon RX 470 Graphics"},
211 {0x67DF, 0xE0, "AMD Radeon RX 470 Series"},
212 {0x67DF, 0xE1, "AMD Radeon RX 590 Series"},
213 {0x67DF, 0xE3, "AMD Radeon RX Series"},
214 {0x67DF, 0xE7, "AMD Radeon RX 580 Series"},
215 {0x67DF, 0xEB, "AMD Radeon Pro 580X"},
216 {0x67DF, 0xEF, "AMD Radeon RX 570 Series"},
217 {0x67DF, 0xF7, "AMD Radeon RX P30PH"},
218 {0x67DF, 0xFF, "AMD Radeon RX 470 Series"},
219 {0x67E0, 0x00, "AMD Radeon Pro WX Series"},
220 {0x67E3, 0x00, "AMD Radeon Pro WX 4100"},
221 {0x67E8, 0x00, "AMD Radeon Pro WX Series"},
222 {0x67E8, 0x01, "AMD Radeon Pro WX Series"},
223 {0x67E8, 0x80, "AMD Radeon E9260 Graphics"},
224 {0x67EB, 0x00, "AMD Radeon Pro V5300X"},
225 {0x67EF, 0xC0, "AMD Radeon RX Graphics"},
226 {0x67EF, 0xC1, "AMD Radeon RX 460 Graphics"},
227 {0x67EF, 0xC2, "AMD Radeon Pro Series"},
228 {0x67EF, 0xC3, "AMD Radeon RX Series"},
229 {0x67EF, 0xC5, "AMD Radeon RX 460 Graphics"},
230 {0x67EF, 0xC7, "AMD Radeon RX Graphics"},
231 {0x67EF, 0xCF, "AMD Radeon RX 460 Graphics"},
232 {0x67EF, 0xE0, "AMD Radeon RX 560 Series"},
233 {0x67EF, 0xE1, "AMD Radeon RX Series"},
234 {0x67EF, 0xE2, "AMD Radeon RX 560X"},
235 {0x67EF, 0xE3, "AMD Radeon RX Series"},
236 {0x67EF, 0xE5, "AMD Radeon RX 560 Series"},
237 {0x67EF, 0xE7, "AMD Radeon RX 560 Series"},
238 {0x67EF, 0xEF, "AMD Radeon 550 Series"},
239 {0x67EF, 0xFF, "AMD Radeon RX 460 Graphics"},
240 {0x67FF, 0xC0, "AMD Radeon Pro 465"},
241 {0x67FF, 0xC1, "AMD Radeon RX 560 Series"},
242 {0x67FF, 0xCF, "AMD Radeon RX 560 Series"},
243 {0x67FF, 0xEF, "AMD Radeon RX 560 Series"},
244 {0x67FF, 0xFF, "AMD Radeon RX 550 Series"},
245 {0x6800, 0x00, "AMD Radeon HD 7970M"},
246 {0x6801, 0x00, "AMD Radeon HD 8970M"},
247 {0x6806, 0x00, "AMD Radeon R9 M290X"},
248 {0x6808, 0x00, "AMD FirePro W7000"},
249 {0x6808, 0x00, "ATI FirePro V (FireGL V) Graphics Adapter"},
250 {0x6809, 0x00, "ATI FirePro W5000"},
251 {0x6810, 0x00, "AMD Radeon R9 200 Series"},
252 {0x6810, 0x81, "AMD Radeon R9 370 Series"},
253 {0x6811, 0x00, "AMD Radeon R9 200 Series"},
254 {0x6811, 0x81, "AMD Radeon R7 370 Series"},
255 {0x6818, 0x00, "AMD Radeon HD 7800 Series"},
256 {0x6819, 0x00, "AMD Radeon HD 7800 Series"},
257 {0x6820, 0x00, "AMD Radeon R9 M275X"},
258 {0x6820, 0x81, "AMD Radeon R9 M375"},
259 {0x6820, 0x83, "AMD Radeon R9 M375X"},
260 {0x6821, 0x00, "AMD Radeon R9 M200X Series"},
261 {0x6821, 0x83, "AMD Radeon R9 M370X"},
262 {0x6821, 0x87, "AMD Radeon R7 M380"},
263 {0x6822, 0x00, "AMD Radeon E8860"},
264 {0x6823, 0x00, "AMD Radeon R9 M200X Series"},
265 {0x6825, 0x00, "AMD Radeon HD 7800M Series"},
266 {0x6826, 0x00, "AMD Radeon HD 7700M Series"},
267 {0x6827, 0x00, "AMD Radeon HD 7800M Series"},
268 {0x6828, 0x00, "AMD FirePro W600"},
269 {0x682B, 0x00, "AMD Radeon HD 8800M Series"},
270 {0x682B, 0x87, "AMD Radeon R9 M360"},
271 {0x682C, 0x00, "AMD FirePro W4100"},
272 {0x682D, 0x00, "AMD Radeon HD 7700M Series"},
273 {0x682F, 0x00, "AMD Radeon HD 7700M Series"},
274 {0x6830, 0x00, "AMD Radeon 7800M Series"},
275 {0x6831, 0x00, "AMD Radeon 7700M Series"},
276 {0x6835, 0x00, "AMD Radeon R7 Series / HD 9000 Series"},
277 {0x6837, 0x00, "AMD Radeon HD 7700 Series"},
278 {0x683D, 0x00, "AMD Radeon HD 7700 Series"},
279 {0x683F, 0x00, "AMD Radeon HD 7700 Series"},
280 {0x684C, 0x00, "ATI FirePro V (FireGL V) Graphics Adapter"},
281 {0x6860, 0x00, "AMD Radeon Instinct MI25"},
282 {0x6860, 0x01, "AMD Radeon Instinct MI25"},
283 {0x6860, 0x02, "AMD Radeon Instinct MI25"},
284 {0x6860, 0x03, "AMD Radeon Pro V340"},
285 {0x6860, 0x04, "AMD Radeon Instinct MI25x2"},
286 {0x6860, 0x07, "AMD Radeon Pro V320"},
287 {0x6861, 0x00, "AMD Radeon Pro WX 9100"},
288 {0x6862, 0x00, "AMD Radeon Pro SSG"},
289 {0x6863, 0x00, "AMD Radeon Vega Frontier Edition"},
290 {0x6864, 0x03, "AMD Radeon Pro V340"},
291 {0x6864, 0x04, "AMD Radeon Instinct MI25x2"},
292 {0x6864, 0x05, "AMD Radeon Pro V340"},
293 {0x6868, 0x00, "AMD Radeon Pro WX 8200"},
294 {0x686C, 0x00, "AMD Radeon Instinct MI25 MxGPU"},
295 {0x686C, 0x01, "AMD Radeon Instinct MI25 MxGPU"},
296 {0x686C, 0x02, "AMD Radeon Instinct MI25 MxGPU"},
297 {0x686C, 0x03, "AMD Radeon Pro V340 MxGPU"},
298 {0x686C, 0x04, "AMD Radeon Instinct MI25x2 MxGPU"},
299 {0x686C, 0x05, "AMD Radeon Pro V340L MxGPU"},
300 {0x686C, 0x06, "AMD Radeon Instinct MI25 MxGPU"},
301 {0x687F, 0x01, "AMD Radeon RX Vega"},
302 {0x687F, 0xC0, "AMD Radeon RX Vega"},
303 {0x687F, 0xC1, "AMD Radeon RX Vega"},
304 {0x687F, 0xC3, "AMD Radeon RX Vega"},
305 {0x687F, 0xC7, "AMD Radeon RX Vega"},
306 {0x6900, 0x00, "AMD Radeon R7 M260"},
307 {0x6900, 0x81, "AMD Radeon R7 M360"},
308 {0x6900, 0x83, "AMD Radeon R7 M340"},
309 {0x6900, 0xC1, "AMD Radeon R5 M465 Series"},
310 {0x6900, 0xC3, "AMD Radeon R5 M445 Series"},
311 {0x6900, 0xD1, "AMD Radeon 530 Series"},
312 {0x6900, 0xD3, "AMD Radeon 530 Series"},
313 {0x6901, 0x00, "AMD Radeon R5 M255"},
314 {0x6902, 0x00, "AMD Radeon Series"},
315 {0x6907, 0x00, "AMD Radeon R5 M255"},
316 {0x6907, 0x87, "AMD Radeon R5 M315"},
317 {0x6920, 0x00, "AMD Radeon R9 M395X"},
318 {0x6920, 0x01, "AMD Radeon R9 M390X"},
319 {0x6921, 0x00, "AMD Radeon R9 M390X"},
320 {0x6929, 0x00, "AMD FirePro S7150"},
321 {0x6929, 0x01, "AMD FirePro S7100X"},
322 {0x692B, 0x00, "AMD FirePro W7100"},
323 {0x6938, 0x00, "AMD Radeon R9 200 Series"},
324 {0x6938, 0xF0, "AMD Radeon R9 200 Series"},
325 {0x6938, 0xF1, "AMD Radeon R9 380 Series"},
326 {0x6939, 0x00, "AMD Radeon R9 200 Series"},
327 {0x6939, 0xF0, "AMD Radeon R9 200 Series"},
328 {0x6939, 0xF1, "AMD Radeon R9 380 Series"},
329 {0x694C, 0xC0, "AMD Radeon RX Vega M GH Graphics"},
330 {0x694E, 0xC0, "AMD Radeon RX Vega M GL Graphics"},
331 {0x6980, 0x00, "AMD Radeon Pro WX 3100"},
332 {0x6981, 0x00, "AMD Radeon Pro WX 3200 Series"},
333 {0x6981, 0x01, "AMD Radeon Pro WX 3200 Series"},
334 {0x6981, 0x10, "AMD Radeon Pro WX 3200 Series"},
335 {0x6985, 0x00, "AMD Radeon Pro WX 3100"},
336 {0x6986, 0x00, "AMD Radeon Pro WX 2100"},
337 {0x6987, 0x80, "AMD Embedded Radeon E9171"},
338 {0x6987, 0xC0, "AMD Radeon 550X Series"},
339 {0x6987, 0xC1, "AMD Radeon RX 640"},
340 {0x6987, 0xC3, "AMD Radeon 540X Series"},
341 {0x6987, 0xC7, "AMD Radeon 540"},
342 {0x6995, 0x00, "AMD Radeon Pro WX 2100"},
343 {0x6997, 0x00, "AMD Radeon Pro WX 2100"},
344 {0x699F, 0x81, "AMD Embedded Radeon E9170 Series"},
345 {0x699F, 0xC0, "AMD Radeon 500 Series"},
346 {0x699F, 0xC1, "AMD Radeon 540 Series"},
347 {0x699F, 0xC3, "AMD Radeon 500 Series"},
348 {0x699F, 0xC7, "AMD Radeon RX 550 / 550 Series"},
349 {0x699F, 0xC9, "AMD Radeon 540"},
350 {0x6FDF, 0xE7, "AMD Radeon RX 590 GME"},
351 {0x6FDF, 0xEF, "AMD Radeon RX 580 2048SP"},
352 {0x7300, 0xC1, "AMD FirePro S9300 x2"},
353 {0x7300, 0xC8, "AMD Radeon R9 Fury Series"},
354 {0x7300, 0xC9, "AMD Radeon Pro Duo"},
355 {0x7300, 0xCA, "AMD Radeon R9 Fury Series"},
356 {0x7300, 0xCB, "AMD Radeon R9 Fury Series"},
357 {0x7312, 0x00, "AMD Radeon Pro W5700"},
358 {0x731E, 0xC6, "AMD Radeon RX 5700XTB"},
359 {0x731E, 0xC7, "AMD Radeon RX 5700B"},
360 {0x731F, 0xC0, "AMD Radeon RX 5700 XT 50th Anniversary"},
361 {0x731F, 0xC1, "AMD Radeon RX 5700 XT"},
362 {0x731F, 0xC2, "AMD Radeon RX 5600M"},
363 {0x731F, 0xC3, "AMD Radeon RX 5700M"},
364 {0x731F, 0xC4, "AMD Radeon RX 5700"},
365 {0x731F, 0xC5, "AMD Radeon RX 5700 XT"},
366 {0x731F, 0xCA, "AMD Radeon RX 5600 XT"},
367 {0x731F, 0xCB, "AMD Radeon RX 5600 OEM"},
368 {0x7340, 0xC1, "AMD Radeon RX 5500M"},
369 {0x7340, 0xC3, "AMD Radeon RX 5300M"},
370 {0x7340, 0xC5, "AMD Radeon RX 5500 XT"},
371 {0x7340, 0xC7, "AMD Radeon RX 5500"},
372 {0x7340, 0xC9, "AMD Radeon RX 5500XTB"},
373 {0x7340, 0xCF, "AMD Radeon RX 5300"},
374 {0x7341, 0x00, "AMD Radeon Pro W5500"},
375 {0x7347, 0x00, "AMD Radeon Pro W5500M"},
376 {0x7360, 0x41, "AMD Radeon Pro 5600M"},
377 {0x7360, 0xC3, "AMD Radeon Pro V520"},
378 {0x738C, 0x01, "AMD Instinct MI100"},
379 {0x73A3, 0x00, "AMD Radeon Pro W6800"},
380 {0x73A5, 0xC0, "AMD Radeon RX 6950 XT"},
381 {0x73AF, 0xC0, "AMD Radeon RX 6900 XT"},
382 {0x73BF, 0xC0, "AMD Radeon RX 6900 XT"},
383 {0x73BF, 0xC1, "AMD Radeon RX 6800 XT"},
384 {0x73BF, 0xC3, "AMD Radeon RX 6800"},
385 {0x73DF, 0xC0, "AMD Radeon RX 6750 XT"},
386 {0x73DF, 0xC1, "AMD Radeon RX 6700 XT"},
387 {0x73DF, 0xC2, "AMD Radeon RX 6800M"},
388 {0x73DF, 0xC3, "AMD Radeon RX 6800M"},
389 {0x73DF, 0xC5, "AMD Radeon RX 6700 XT"},
390 {0x73DF, 0xCF, "AMD Radeon RX 6700M"},
391 {0x73DF, 0xD7, "AMD TDC-235"},
392 {0x73E1, 0x00, "AMD Radeon Pro W6600M"},
393 {0x73E3, 0x00, "AMD Radeon Pro W6600"},
394 {0x73EF, 0xC0, "AMD Radeon RX 6800S"},
395 {0x73EF, 0xC1, "AMD Radeon RX 6650 XT"},
396 {0x73EF, 0xC2, "AMD Radeon RX 6700S"},
397 {0x73EF, 0xC3, "AMD Radeon RX 6650M"},
398 {0x73EF, 0xC4, "AMD Radeon RX 6650M XT"},
399 {0x73FF, 0xC1, "AMD Radeon RX 6600 XT"},
400 {0x73FF, 0xC3, "AMD Radeon RX 6600M"},
401 {0x73FF, 0xC7, "AMD Radeon RX 6600"},
402 {0x73FF, 0xCB, "AMD Radeon RX 6600S"},
403 {0x7408, 0x00, "AMD Instinct MI250X"},
404 {0x740C, 0x01, "AMD Instinct MI250X / MI250"},
405 {0x740F, 0x02, "AMD Instinct MI210"},
406 {0x7421, 0x00, "AMD Radeon Pro W6500M"},
407 {0x7422, 0x00, "AMD Radeon Pro W6400"},
408 {0x7423, 0x00, "AMD Radeon Pro W6300M"},
409 {0x7423, 0x01, "AMD Radeon Pro W6300"},
410 {0x7424, 0x00, "AMD Radeon RX 6300"},
411 {0x743F, 0xC1, "AMD Radeon RX 6500 XT"},
412 {0x743F, 0xC3, "AMD Radeon RX 6500"},
413 {0x743F, 0xC3, "AMD Radeon RX 6500M"},
414 {0x743F, 0xC7, "AMD Radeon RX 6400"},
415 {0x743F, 0xCF, "AMD Radeon RX 6300M"},
416 {0x744C, 0xC8, "AMD Radeon RX 7900 XTX"},
417 {0x744C, 0xCC, "AMD Radeon RX 7900 XT"},
418 {0x7480, 0xC1, "AMD Radeon RX 7700S"},
419 {0x7480, 0xC3, "AMD Radeon RX 7600S"},
420 {0x7480, 0xC7, "AMD Radeon RX 7600M XT"},
421 {0x7483, 0xCF, "AMD Radeon RX 7600M"},
422 {0x9830, 0x00, "AMD Radeon HD 8400 / R3 Series"},
423 {0x9831, 0x00, "AMD Radeon HD 8400E"},
424 {0x9832, 0x00, "AMD Radeon HD 8330"},
425 {0x9833, 0x00, "AMD Radeon HD 8330E"},
426 {0x9834, 0x00, "AMD Radeon HD 8210"},
427 {0x9835, 0x00, "AMD Radeon HD 8210E"},
428 {0x9836, 0x00, "AMD Radeon HD 8200 / R3 Series"},
429 {0x9837, 0x00, "AMD Radeon HD 8280E"},
430 {0x9838, 0x00, "AMD Radeon HD 8200 / R3 series"},
431 {0x9839, 0x00, "AMD Radeon HD 8180"},
432 {0x983D, 0x00, "AMD Radeon HD 8250"},
433 {0x9850, 0x00, "AMD Radeon R3 Graphics"},
434 {0x9850, 0x03, "AMD Radeon R3 Graphics"},
435 {0x9850, 0x40, "AMD Radeon R2 Graphics"},
436 {0x9850, 0x45, "AMD Radeon R3 Graphics"},
437 {0x9851, 0x00, "AMD Radeon R4 Graphics"},
438 {0x9851, 0x01, "AMD Radeon R5E Graphics"},
439 {0x9851, 0x05, "AMD Radeon R5 Graphics"},
440 {0x9851, 0x06, "AMD Radeon R5E Graphics"},
441 {0x9851, 0x40, "AMD Radeon R4 Graphics"},
442 {0x9851, 0x45, "AMD Radeon R5 Graphics"},
443 {0x9852, 0x00, "AMD Radeon R2 Graphics"},
444 {0x9852, 0x40, "AMD Radeon E1 Graphics"},
445 {0x9853, 0x00, "AMD Radeon R2 Graphics"},
446 {0x9853, 0x01, "AMD Radeon R4E Graphics"},
447 {0x9853, 0x03, "AMD Radeon R2 Graphics"},
448 {0x9853, 0x05, "AMD Radeon R1E Graphics"},
449 {0x9853, 0x06, "AMD Radeon R1E Graphics"},
450 {0x9853, 0x07, "AMD Radeon R1E Graphics"},
451 {0x9853, 0x08, "AMD Radeon R1E Graphics"},
452 {0x9853, 0x40, "AMD Radeon R2 Graphics"},
453 {0x9854, 0x00, "AMD Radeon R3 Graphics"},
454 {0x9854, 0x01, "AMD Radeon R3E Graphics"},
455 {0x9854, 0x02, "AMD Radeon R3 Graphics"},
456 {0x9854, 0x05, "AMD Radeon R2 Graphics"},
457 {0x9854, 0x06, "AMD Radeon R4 Graphics"},
458 {0x9854, 0x07, "AMD Radeon R3 Graphics"},
459 {0x9855, 0x02, "AMD Radeon R6 Graphics"},
460 {0x9855, 0x05, "AMD Radeon R4 Graphics"},
461 {0x9856, 0x00, "AMD Radeon R2 Graphics"},
462 {0x9856, 0x01, "AMD Radeon R2E Graphics"},
463 {0x9856, 0x02, "AMD Radeon R2 Graphics"},
464 {0x9856, 0x05, "AMD Radeon R1E Graphics"},
465 {0x9856, 0x06, "AMD Radeon R2 Graphics"},
466 {0x9856, 0x07, "AMD Radeon R1E Graphics"},
467 {0x9856, 0x08, "AMD Radeon R1E Graphics"},
468 {0x9856, 0x13, "AMD Radeon R1E Graphics"},
469 {0x9874, 0x81, "AMD Radeon R6 Graphics"},
470 {0x9874, 0x84, "AMD Radeon R7 Graphics"},
471 {0x9874, 0x85, "AMD Radeon R6 Graphics"},
472 {0x9874, 0x87, "AMD Radeon R5 Graphics"},
473 {0x9874, 0x88, "AMD Radeon R7E Graphics"},
474 {0x9874, 0x89, "AMD Radeon R6E Graphics"},
475 {0x9874, 0xC4, "AMD Radeon R7 Graphics"},
476 {0x9874, 0xC5, "AMD Radeon R6 Graphics"},
477 {0x9874, 0xC6, "AMD Radeon R6 Graphics"},
478 {0x9874, 0xC7, "AMD Radeon R5 Graphics"},
479 {0x9874, 0xC8, "AMD Radeon R7 Graphics"},
480 {0x9874, 0xC9, "AMD Radeon R7 Graphics"},
481 {0x9874, 0xCA, "AMD Radeon R5 Graphics"},
482 {0x9874, 0xCB, "AMD Radeon R5 Graphics"},
483 {0x9874, 0xCC, "AMD Radeon R7 Graphics"},
484 {0x9874, 0xCD, "AMD Radeon R7 Graphics"},
485 {0x9874, 0xCE, "AMD Radeon R5 Graphics"},
486 {0x9874, 0xE1, "AMD Radeon R7 Graphics"},
487 {0x9874, 0xE2, "AMD Radeon R7 Graphics"},
488 {0x9874, 0xE3, "AMD Radeon R7 Graphics"},
489 {0x9874, 0xE4, "AMD Radeon R7 Graphics"},
490 {0x9874, 0xE5, "AMD Radeon R5 Graphics"},
491 {0x9874, 0xE6, "AMD Radeon R5 Graphics"},
492 {0x98E4, 0x80, "AMD Radeon R5E Graphics"},
493 {0x98E4, 0x81, "AMD Radeon R4E Graphics"},
494 {0x98E4, 0x83, "AMD Radeon R2E Graphics"},
495 {0x98E4, 0x84, "AMD Radeon R2E Graphics"},
496 {0x98E4, 0x86, "AMD Radeon R1E Graphics"},
497 {0x98E4, 0xC0, "AMD Radeon R4 Graphics"},
498 {0x98E4, 0xC1, "AMD Radeon R5 Graphics"},
499 {0x98E4, 0xC2, "AMD Radeon R4 Graphics"},
500 {0x98E4, 0xC4, "AMD Radeon R5 Graphics"},
501 {0x98E4, 0xC6, "AMD Radeon R5 Graphics"},
502 {0x98E4, 0xC8, "AMD Radeon R4 Graphics"},
503 {0x98E4, 0xC9, "AMD Radeon R4 Graphics"},
504 {0x98E4, 0xCA, "AMD Radeon R5 Graphics"},
505 {0x98E4, 0xD0, "AMD Radeon R2 Graphics"},
506 {0x98E4, 0xD1, "AMD Radeon R2 Graphics"},
507 {0x98E4, 0xD2, "AMD Radeon R2 Graphics"},
508 {0x98E4, 0xD4, "AMD Radeon R2 Graphics"},
509 {0x98E4, 0xD9, "AMD Radeon R5 Graphics"},
510 {0x98E4, 0xDA, "AMD Radeon R5 Graphics"},
511 {0x98E4, 0xDB, "AMD Radeon R3 Graphics"},
512 {0x98E4, 0xE1, "AMD Radeon R3 Graphics"},
513 {0x98E4, 0xE2, "AMD Radeon R3 Graphics"},
514 {0x98E4, 0xE9, "AMD Radeon R4 Graphics"},
515 {0x98E4, 0xEA, "AMD Radeon R4 Graphics"},
516 {0x98E4, 0xEB, "AMD Radeon R3 Graphics"},
517 {0x98E4, 0xEC, "AMD Radeon R4 Graphics"},
518 {0x0000, 0x00, "unknown AMD GPU"} // this must always be the last item
519 };
520
521 struct card {
522 const char *pathname;
523 struct amdgpu_id_struct id;
524
525 /* GPU and VRAM utilizations */
526
527 const char *pathname_util_gpu;
528 RRDSET *st_util_gpu;
529 RRDDIM *rd_util_gpu;
530 collected_number util_gpu;
531
532 const char *pathname_util_mem;
533 RRDSET *st_util_mem;
534 RRDDIM *rd_util_mem;
535 collected_number util_mem;
536
537
538 /* GPU and VRAM clock frequencies */
539
540 const char *pathname_clk_gpu;
541 procfile *ff_clk_gpu;
542 RRDSET *st_clk_gpu;
543 RRDDIM *rd_clk_gpu;
544 collected_number clk_gpu;
545
546 const char *pathname_clk_mem;
547 procfile *ff_clk_mem;
548 RRDSET *st_clk_mem;
549 RRDDIM *rd_clk_mem;
550 collected_number clk_mem;
551
552
553 /* GPU memory usage */
554
555 const char *pathname_mem_used_vram;
556 const char *pathname_mem_total_vram;
557
558 RRDSET *st_mem_usage_perc_vram;
559 RRDDIM *rd_mem_used_perc_vram;
560
561 RRDSET *st_mem_usage_vram;
562 RRDDIM *rd_mem_used_vram;
563 RRDDIM *rd_mem_free_vram;
564
565 collected_number used_vram;
566 collected_number total_vram;
567
568
569 const char *pathname_mem_used_vis_vram;
570 const char *pathname_mem_total_vis_vram;
571
572 RRDSET *st_mem_usage_perc_vis_vram;
573 RRDDIM *rd_mem_used_perc_vis_vram;
574
575 RRDSET *st_mem_usage_vis_vram;
576 RRDDIM *rd_mem_used_vis_vram;
577 RRDDIM *rd_mem_free_vis_vram;
578
579 collected_number used_vis_vram;
580 collected_number total_vis_vram;
581
582
583 const char *pathname_mem_used_gtt;
584 const char *pathname_mem_total_gtt;
585
586 RRDSET *st_mem_usage_perc_gtt;
587 RRDDIM *rd_mem_used_perc_gtt;
588
589 RRDSET *st_mem_usage_gtt;
590 RRDDIM *rd_mem_used_gtt;
591 RRDDIM *rd_mem_free_gtt;
592
593 collected_number used_gtt;
594 collected_number total_gtt;
595
596 struct do_rrd_x *do_rrd_x_root;
597
598 struct card *next;
599 };
600 static struct card *card_root = NULL;
601
602 static void card_free(struct card *c){
603 if(c->pathname) freez((void *) c->pathname);
604 if(c->id.marketing_name) freez((void *) c->id.marketing_name);
605
606 /* remove card from linked list */
607 if(c == card_root) card_root = c->next;
608 else {
609 struct card *last;
610 for(last = card_root; last && last->next != c; last = last->next);
611 if(last) last->next = c->next;
612 }
613
614 freez(c);
615 }
616
617 static int check_card_is_amdgpu(const char *const pathname){
618 int rc = -1;
619
620 procfile *ff = procfile_open(pathname, " ", PROCFILE_FLAG_NO_ERROR_ON_FILE_IO);
621 if(unlikely(!ff)){
622 rc = -1;
623 goto cleanup;
624 }
625
626 ff = procfile_readall(ff);
627 if(unlikely(!ff || procfile_lines(ff) < 1 || procfile_linewords(ff, 0) < 1)){
628 rc = -2;
629 goto cleanup;
630 }
631
632 for(size_t l = 0; l < procfile_lines(ff); l++) {
633 if(!strcmp(procfile_lineword(ff, l, 0), "DRIVER=amdgpu")){
634 rc = 0;
635 goto cleanup;
636 }
637 }
638
639 rc = -3; // no match
640
641 cleanup:
642 procfile_close(ff);
643 return rc;
644 }
645
646 static int read_clk_freq_file(procfile **p_ff, const char *const pathname, collected_number *num){
647 if(unlikely(!*p_ff)){
648 *p_ff = procfile_open(pathname, NULL, PROCFILE_FLAG_NO_ERROR_ON_FILE_IO);
649 if(unlikely(!*p_ff))
650 return -1;
651 }
652
653 if(unlikely(NULL == (*p_ff = procfile_readall(*p_ff))))
654 return -1;
655
656 for(size_t l = 0; l < procfile_lines(*p_ff) ; l++) {
657 char *str_with_units = NULL;
658
659 if(procfile_linewords(*p_ff, l) >= 3 && !strcmp(procfile_lineword((*p_ff), l, 2), "*")) //format: X: collected_number *
660 str_with_units = procfile_lineword((*p_ff), l, 1);
661 else if (procfile_linewords(*p_ff, l) == 2 && !strcmp(procfile_lineword((*p_ff), l, 1), "*")) //format: collected_number *
662 str_with_units = procfile_lineword((*p_ff), l, 0);
663
664 if (str_with_units) {
665 char *units = NULL;
666 *num = str2ll(str_with_units, &units);
667 return 0;
668 }
669 }
670
671 *num = 0; // the card is not active, so no speed reporting
672 return 0;
673 }
674
675 static char *set_id(const char *const suf_1, const char *const suf_2, const char *const suf_3){
676 static char id[RRD_ID_LENGTH_MAX + 1];
677 snprintfz(id, RRD_ID_LENGTH_MAX, "%s_%s_%s", suf_1, suf_2, suf_3);
678 return id;
679 }
680
681 typedef int (*do_rrd_x_func)(struct card *const c);
682
683 struct do_rrd_x {
684 do_rrd_x_func func;
685 struct do_rrd_x *next;
686 };
687
688 static void add_do_rrd_x(struct card *const c, const do_rrd_x_func func){
689 struct do_rrd_x *const drrd = callocz(1, sizeof(struct do_rrd_x));
690 drrd->func = func;
691 drrd->next = c->do_rrd_x_root;
692 c->do_rrd_x_root = drrd;
693 }
694
695 static void rm_do_rrd_x(struct card *const c, struct do_rrd_x *const drrd){
696 if(drrd == c->do_rrd_x_root) c->do_rrd_x_root = drrd->next;
697 else {
698 struct do_rrd_x *last;
699 for(last = c->do_rrd_x_root; last && last->next != drrd; last = last->next);
700 if(last) last->next = drrd->next;
701 }
702
703 freez(drrd);
704 }
705
706 static int do_rrd_util_gpu(struct card *const c){
707 if(likely(!read_single_number_file(c->pathname_util_gpu, (unsigned long long *) &c->util_gpu))){
708 rrddim_set_by_pointer(c->st_util_gpu, c->rd_util_gpu, c->util_gpu);
709 rrdset_done(c->st_util_gpu);
710 return 0;
711 }
712 else {
713 collector_error("Cannot read util_gpu for %s: [%s]", c->pathname, c->id.marketing_name);
714 freez((void *) c->pathname_util_gpu);
715 rrdset_is_obsolete___safe_from_collector_thread(c->st_util_gpu);
716 return 1;
717 }
718 }
719
720 static int do_rrd_util_mem(struct card *const c){
721 if(likely(!read_single_number_file(c->pathname_util_mem, (unsigned long long *) &c->util_mem))){
722 rrddim_set_by_pointer(c->st_util_mem, c->rd_util_mem, c->util_mem);
723 rrdset_done(c->st_util_mem);
724 return 0;
725 }
726 else {
727 collector_error("Cannot read util_mem for %s: [%s]", c->pathname, c->id.marketing_name);
728 freez((void *) c->pathname_util_mem);
729 rrdset_is_obsolete___safe_from_collector_thread(c->st_util_mem);
730 return 1;
731 }
732 }
733
734 static int do_rrd_clk_gpu(struct card *const c){
735 if(likely(!read_clk_freq_file(&c->ff_clk_gpu, (char *) c->pathname_clk_gpu, &c->clk_gpu))){
736 rrddim_set_by_pointer(c->st_clk_gpu, c->rd_clk_gpu, c->clk_gpu);
737 rrdset_done(c->st_clk_gpu);
738 return 0;
739 }
740 else {
741 collector_error("Cannot read clk_gpu for %s: [%s]", c->pathname, c->id.marketing_name);
742 freez((void *) c->pathname_clk_gpu);
743 rrdset_is_obsolete___safe_from_collector_thread(c->st_clk_gpu);
744 return 1;
745 }
746 }
747
748 static int do_rrd_clk_mem(struct card *const c){
749 if(likely(!read_clk_freq_file(&c->ff_clk_mem, (char *) c->pathname_clk_mem, &c->clk_mem))){
750 rrddim_set_by_pointer(c->st_clk_mem, c->rd_clk_mem, c->clk_mem);
751 rrdset_done(c->st_clk_mem);
752 return 0;
753 }
754 else {
755 collector_error("Cannot read clk_mem for %s: [%s]", c->pathname, c->id.marketing_name);
756 freez((void *) c->pathname_clk_mem);
757 rrdset_is_obsolete___safe_from_collector_thread(c->st_clk_mem);
758 return 1;
759 }
760 }
761
762 static int do_rrd_vram(struct card *const c){
763 if(likely(!read_single_number_file(c->pathname_mem_used_vram, (unsigned long long *) &c->used_vram) &&
764 c->total_vram)){
765 rrddim_set_by_pointer( c->st_mem_usage_perc_vram,
766 c->rd_mem_used_perc_vram,
767 c->used_vram * 10000 / c->total_vram);
768 rrdset_done(c->st_mem_usage_perc_vram);
769
770 rrddim_set_by_pointer(c->st_mem_usage_vram, c->rd_mem_used_vram, c->used_vram);
771 rrddim_set_by_pointer(c->st_mem_usage_vram, c->rd_mem_free_vram, c->total_vram - c->used_vram);
772 rrdset_done(c->st_mem_usage_vram);
773 return 0;
774 }
775 else {
776 collector_error("Cannot read used_vram for %s: [%s]", c->pathname, c->id.marketing_name);
777 freez((void *) c->pathname_mem_used_vram);
778 freez((void *) c->pathname_mem_total_vram);
779 rrdset_is_obsolete___safe_from_collector_thread(c->st_mem_usage_perc_vram);
780 rrdset_is_obsolete___safe_from_collector_thread(c->st_mem_usage_vram);
781 return 1;
782 }
783 }
784
785 static int do_rrd_vis_vram(struct card *const c){
786 if(likely(!read_single_number_file(c->pathname_mem_used_vis_vram, (unsigned long long *) &c->used_vis_vram) &&
787 c->total_vis_vram)){
788 rrddim_set_by_pointer( c->st_mem_usage_perc_vis_vram,
789 c->rd_mem_used_perc_vis_vram,
790 c->used_vis_vram * 10000 / c->total_vis_vram);
791 rrdset_done(c->st_mem_usage_perc_vis_vram);
792
793 rrddim_set_by_pointer(c->st_mem_usage_vis_vram, c->rd_mem_used_vis_vram, c->used_vis_vram);
794 rrddim_set_by_pointer(c->st_mem_usage_vis_vram, c->rd_mem_free_vis_vram, c->total_vis_vram - c->used_vis_vram);
795 rrdset_done(c->st_mem_usage_vis_vram);
796 return 0;
797 }
798 else {
799 collector_error("Cannot read used_vis_vram for %s: [%s]", c->pathname, c->id.marketing_name);
800 freez((void *) c->pathname_mem_used_vis_vram);
801 freez((void *) c->pathname_mem_total_vis_vram);
802 rrdset_is_obsolete___safe_from_collector_thread(c->st_mem_usage_perc_vis_vram);
803 rrdset_is_obsolete___safe_from_collector_thread(c->st_mem_usage_vis_vram);
804 return 1;
805 }
806 }
807
808 static int do_rrd_gtt(struct card *const c){
809 if(likely(!read_single_number_file(c->pathname_mem_used_gtt, (unsigned long long *) &c->used_gtt) &&
810 c->total_gtt)){
811 rrddim_set_by_pointer( c->st_mem_usage_perc_gtt,
812 c->rd_mem_used_perc_gtt,
813 c->used_gtt * 10000 / c->total_gtt);
814 rrdset_done(c->st_mem_usage_perc_gtt);
815
816 rrddim_set_by_pointer(c->st_mem_usage_gtt, c->rd_mem_used_gtt, c->used_gtt);
817 rrddim_set_by_pointer(c->st_mem_usage_gtt, c->rd_mem_free_gtt, c->total_gtt - c->used_gtt);
818 rrdset_done(c->st_mem_usage_gtt);
819 return 0;
820 }
821 else {
822 collector_error("Cannot read used_gtt for %s: [%s]", c->pathname, c->id.marketing_name);
823 freez((void *) c->pathname_mem_used_gtt);
824 freez((void *) c->pathname_mem_total_gtt);
825 rrdset_is_obsolete___safe_from_collector_thread(c->st_mem_usage_perc_gtt);
826 rrdset_is_obsolete___safe_from_collector_thread(c->st_mem_usage_gtt);
827 return 1;
828 }
829 }
830
831 int do_sys_class_drm(int update_every, usec_t dt) {
832 (void)dt;
833
834 static DIR *drm_dir = NULL;
835
836 int chart_prio = NETDATA_CHART_PRIO_DRM_AMDGPU;
837
838 if(unlikely(!drm_dir)) {
839 char filename[FILENAME_MAX];
840 snprintfz(filename, sizeof(filename), "%s%s", netdata_configured_host_prefix, "/sys/class/drm");
841 const char *drm_dir_name = inicfg_get(&netdata_config, CONFIG_SECTION_PLUGIN_PROC_DRM, "directory to monitor", filename);
842 if(unlikely(NULL == (drm_dir = opendir(drm_dir_name)))){
843 collector_error("Cannot read directory '%s'", drm_dir_name);
844 return 1;
845 }
846
847 struct dirent *de = NULL;
848 while(likely(de = readdir(drm_dir))) {
849 if( de->d_type == DT_DIR && ((de->d_name[0] == '.' && de->d_name[1] == '\0') ||
850 (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0'))) continue;
851
852 if(de->d_type == DT_LNK && !strncmp(de->d_name, "card", 4) && !strchr(de->d_name, '-')) {
853 snprintfz(filename, sizeof(filename), "%s/%s/%s", drm_dir_name, de->d_name, "device/uevent");
854 if(check_card_is_amdgpu(filename)) continue;
855
856 /* Get static info */
857
858 struct card *const c = callocz(1, sizeof(struct card));
859 snprintfz(filename, sizeof(filename), "%s/%s", drm_dir_name, de->d_name);
860 c->pathname = strdupz(filename);
861
862 snprintfz(filename, sizeof(filename), "%s/%s", c->pathname, "device/device");
863 if(read_single_base64_or_hex_number_file(filename, &c->id.asic_id)){
864 collector_error("Cannot read asic_id from '%s'", filename);
865 card_free(c);
866 continue;
867 }
868
869 snprintfz(filename, sizeof(filename), "%s/%s", c->pathname, "device/revision");
870 if(read_single_base64_or_hex_number_file(filename, &c->id.pci_rev_id)){
871 collector_error("Cannot read pci_rev_id from '%s'", filename);
872 card_free(c);
873 continue;
874 }
875
876 for(int i = 0; amdgpu_ids[i].asic_id; i++){
877 if(c->id.asic_id == amdgpu_ids[i].asic_id && c->id.pci_rev_id == amdgpu_ids[i].pci_rev_id){
878 c->id.marketing_name = strdupz(amdgpu_ids[i].marketing_name);
879 break;
880 }
881 }
882 if(!c->id.marketing_name)
883 c->id.marketing_name = strdupz(amdgpu_ids[sizeof(amdgpu_ids)/sizeof(amdgpu_ids[0]) - 1].marketing_name);
884
885
886 collected_number tmp_val;
887 #define set_prop_pathname_single_number_file(prop_filename, prop_pathname) do { \
888 snprintfz(filename, sizeof(filename), "%s/%s", c->pathname, prop_filename); \
889 if(!read_single_number_file(filename, (unsigned long long *) &tmp_val)) \
890 prop_pathname = strdupz(filename); \
891 else \
892 collector_info("Cannot read file '%s'", filename); \
893 } while(0)
894
895 #define set_prop_pathname_clock_file(prop_filename, prop_pathname, p_ff) do { \
896 snprintfz(filename, sizeof(filename), "%s/%s", c->pathname, prop_filename); \
897 if(!read_clk_freq_file(p_ff, filename, &tmp_val)) \
898 prop_pathname = strdupz(filename); \
899 else \
900 collector_info("Cannot read file '%s'", filename); \
901 } while(0)
902
903 /* Initialize GPU and VRAM utilization metrics */
904
905 set_prop_pathname_single_number_file("device/gpu_busy_percent", c->pathname_util_gpu);
906
907 if(c->pathname_util_gpu){
908 c->st_util_gpu = rrdset_create_localhost(
909 AMDGPU_CHART_TYPE
910 , set_id("gpu_utilization", c->id.marketing_name, de->d_name)
911 , NULL
912 , "utilization"
913 , AMDGPU_CHART_TYPE ".gpu_utilization"
914 , "GPU utilization"
915 , "percentage"
916 , PLUGIN_PROC_NAME
917 , PLUGIN_PROC_MODULE_DRM_NAME
918 , chart_prio++
919 , update_every
920 , RRDSET_TYPE_LINE
921 );
922
923 rrdlabels_add(c->st_util_gpu->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
924
925 c->rd_util_gpu = rrddim_add(c->st_util_gpu, "utilization", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
926
927 add_do_rrd_x(c, do_rrd_util_gpu);
928 }
929
930 set_prop_pathname_single_number_file("device/mem_busy_percent", c->pathname_util_mem);
931
932 if(c->pathname_util_mem){
933 c->st_util_mem = rrdset_create_localhost(
934 AMDGPU_CHART_TYPE
935 , set_id("gpu_mem_utilization", c->id.marketing_name, de->d_name)
936 , NULL
937 , "utilization"
938 , AMDGPU_CHART_TYPE ".gpu_mem_utilization"
939 , "GPU memory utilization"
940 , "percentage"
941 , PLUGIN_PROC_NAME
942 , PLUGIN_PROC_MODULE_DRM_NAME
943 , chart_prio++
944 , update_every
945 , RRDSET_TYPE_LINE
946 );
947
948 rrdlabels_add(c->st_util_mem->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
949
950 c->rd_util_mem = rrddim_add(c->st_util_mem, "utilization", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
951
952 add_do_rrd_x(c, do_rrd_util_mem);
953 }
954
955
956 /* Initialize GPU and VRAM clock frequency metrics */
957
958 set_prop_pathname_clock_file("device/pp_dpm_sclk", c->pathname_clk_gpu, &c->ff_clk_gpu);
959
960 if(c->pathname_clk_gpu){
961 c->st_clk_gpu = rrdset_create_localhost(
962 AMDGPU_CHART_TYPE
963 , set_id("gpu_clk_frequency", c->id.marketing_name, de->d_name)
964 , NULL
965 , "frequency"
966 , AMDGPU_CHART_TYPE ".gpu_clk_frequency"
967 , "GPU clock frequency"
968 , "MHz"
969 , PLUGIN_PROC_NAME
970 , PLUGIN_PROC_MODULE_DRM_NAME
971 , chart_prio++
972 , update_every
973 , RRDSET_TYPE_LINE
974 );
975
976 rrdlabels_add(c->st_clk_gpu->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
977
978 c->rd_clk_gpu = rrddim_add(c->st_clk_gpu, "frequency", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
979
980 add_do_rrd_x(c, do_rrd_clk_gpu);
981
982 }
983
984 set_prop_pathname_clock_file("device/pp_dpm_mclk", c->pathname_clk_mem, &c->ff_clk_mem);
985
986 if(c->pathname_clk_mem){
987 c->st_clk_mem = rrdset_create_localhost(
988 AMDGPU_CHART_TYPE
989 , set_id("gpu_mem_clk_frequency", c->id.marketing_name, de->d_name)
990 , NULL
991 , "frequency"
992 , AMDGPU_CHART_TYPE ".gpu_mem_clk_frequency"
993 , "GPU memory clock frequency"
994 , "MHz"
995 , PLUGIN_PROC_NAME
996 , PLUGIN_PROC_MODULE_DRM_NAME
997 , chart_prio++
998 , update_every
999 , RRDSET_TYPE_LINE
1000 );
1001
1002 rrdlabels_add(c->st_clk_mem->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1003
1004 c->rd_clk_mem = rrddim_add(c->st_clk_mem, "frequency", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1005
1006 add_do_rrd_x(c, do_rrd_clk_mem);
1007 }
1008
1009
1010 /* Initialize GPU memory usage metrics */
1011
1012 set_prop_pathname_single_number_file("device/mem_info_vram_used", c->pathname_mem_used_vram);
1013 set_prop_pathname_single_number_file("device/mem_info_vram_total", c->pathname_mem_total_vram);
1014 if(c->pathname_mem_total_vram) c->total_vram = tmp_val;
1015
1016 if(c->pathname_mem_used_vram && c->pathname_mem_total_vram){
1017 c->st_mem_usage_perc_vram = rrdset_create_localhost(
1018 AMDGPU_CHART_TYPE
1019 , set_id("gpu_mem_vram_usage_perc", c->id.marketing_name, de->d_name)
1020 , NULL
1021 , "memory_usage"
1022 , AMDGPU_CHART_TYPE ".gpu_mem_vram_usage_perc"
1023 , "VRAM memory usage percentage"
1024 , "percentage"
1025 , PLUGIN_PROC_NAME
1026 , PLUGIN_PROC_MODULE_DRM_NAME
1027 , chart_prio++
1028 , update_every
1029 , RRDSET_TYPE_LINE
1030 );
1031
1032 rrdlabels_add(c->st_mem_usage_perc_vram->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1033
1034 c->rd_mem_used_perc_vram = rrddim_add(c->st_mem_usage_perc_vram, "usage", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1035
1036
1037 c->st_mem_usage_vram = rrdset_create_localhost(
1038 AMDGPU_CHART_TYPE
1039 , set_id("gpu_mem_vram_usage", c->id.marketing_name, de->d_name)
1040 , NULL
1041 , "memory_usage"
1042 , AMDGPU_CHART_TYPE ".gpu_mem_vram_usage"
1043 , "VRAM memory usage"
1044 , "bytes"
1045 , PLUGIN_PROC_NAME
1046 , PLUGIN_PROC_MODULE_DRM_NAME
1047 , chart_prio++
1048 , update_every
1049 , RRDSET_TYPE_STACKED
1050 );
1051
1052 rrdlabels_add(c->st_mem_usage_vram->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1053
1054 c->rd_mem_free_vram = rrddim_add(c->st_mem_usage_vram, "free", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1055 c->rd_mem_used_vram = rrddim_add(c->st_mem_usage_vram, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1056
1057
1058 add_do_rrd_x(c, do_rrd_vram);
1059 }
1060
1061 set_prop_pathname_single_number_file("device/mem_info_vis_vram_used", c->pathname_mem_used_vis_vram);
1062 set_prop_pathname_single_number_file("device/mem_info_vis_vram_total", c->pathname_mem_total_vis_vram);
1063 if(c->pathname_mem_total_vis_vram) c->total_vis_vram = tmp_val;
1064
1065 if(c->pathname_mem_used_vis_vram && c->pathname_mem_total_vis_vram){
1066 c->st_mem_usage_perc_vis_vram = rrdset_create_localhost(
1067 AMDGPU_CHART_TYPE
1068 , set_id("gpu_mem_vis_vram_usage_perc", c->id.marketing_name, de->d_name)
1069 , NULL
1070 , "memory_usage"
1071 , AMDGPU_CHART_TYPE ".gpu_mem_vis_vram_usage_perc"
1072 , "visible VRAM memory usage percentage"
1073 , "percentage"
1074 , PLUGIN_PROC_NAME
1075 , PLUGIN_PROC_MODULE_DRM_NAME
1076 , chart_prio++
1077 , update_every
1078 , RRDSET_TYPE_LINE
1079 );
1080
1081 rrdlabels_add(c->st_mem_usage_perc_vis_vram->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1082
1083 c->rd_mem_used_perc_vis_vram = rrddim_add(c->st_mem_usage_perc_vis_vram, "usage", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1084
1085
1086 c->st_mem_usage_vis_vram = rrdset_create_localhost(
1087 AMDGPU_CHART_TYPE
1088 , set_id("gpu_mem_vis_vram_usage", c->id.marketing_name, de->d_name)
1089 , NULL
1090 , "memory_usage"
1091 , AMDGPU_CHART_TYPE ".gpu_mem_vis_vram_usage"
1092 , "visible VRAM memory usage"
1093 , "bytes"
1094 , PLUGIN_PROC_NAME
1095 , PLUGIN_PROC_MODULE_DRM_NAME
1096 , chart_prio++
1097 , update_every
1098 , RRDSET_TYPE_STACKED
1099 );
1100
1101 rrdlabels_add(c->st_mem_usage_vis_vram->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1102
1103 c->rd_mem_free_vis_vram = rrddim_add(c->st_mem_usage_vis_vram, "free", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1104 c->rd_mem_used_vis_vram = rrddim_add(c->st_mem_usage_vis_vram, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1105
1106
1107 add_do_rrd_x(c, do_rrd_vis_vram);
1108 }
1109
1110 set_prop_pathname_single_number_file("device/mem_info_gtt_used", c->pathname_mem_used_gtt);
1111 set_prop_pathname_single_number_file("device/mem_info_gtt_total", c->pathname_mem_total_gtt);
1112 if(c->pathname_mem_total_gtt) c->total_gtt = tmp_val;
1113
1114 if(c->pathname_mem_used_gtt && c->pathname_mem_total_gtt){
1115 c->st_mem_usage_perc_gtt = rrdset_create_localhost(
1116 AMDGPU_CHART_TYPE
1117 , set_id("gpu_mem_gtt_usage_perc", c->id.marketing_name, de->d_name)
1118 , NULL
1119 , "memory_usage"
1120 , AMDGPU_CHART_TYPE ".gpu_mem_gtt_usage_perc"
1121 , "GTT memory usage percentage"
1122 , "percentage"
1123 , PLUGIN_PROC_NAME
1124 , PLUGIN_PROC_MODULE_DRM_NAME
1125 , chart_prio++
1126 , update_every
1127 , RRDSET_TYPE_LINE
1128 );
1129
1130 rrdlabels_add(c->st_mem_usage_perc_gtt->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1131
1132 c->rd_mem_used_perc_gtt = rrddim_add(c->st_mem_usage_perc_gtt, "usage", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1133
1134 c->st_mem_usage_gtt = rrdset_create_localhost(
1135 AMDGPU_CHART_TYPE
1136 , set_id("gpu_mem_gtt_usage", c->id.marketing_name, de->d_name)
1137 , NULL
1138 , "memory_usage"
1139 , AMDGPU_CHART_TYPE ".gpu_mem_gtt_usage"
1140 , "GTT memory usage"
1141 , "bytes"
1142 , PLUGIN_PROC_NAME
1143 , PLUGIN_PROC_MODULE_DRM_NAME
1144 , chart_prio++
1145 , update_every
1146 , RRDSET_TYPE_STACKED
1147 );
1148
1149 rrdlabels_add(c->st_mem_usage_gtt->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1150
1151 c->rd_mem_free_gtt = rrddim_add(c->st_mem_usage_gtt, "free", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1152 c->rd_mem_used_gtt = rrddim_add(c->st_mem_usage_gtt, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1153
1154
1155 add_do_rrd_x(c, do_rrd_gtt);
1156 }
1157
1158 c->next = card_root;
1159 card_root = c;
1160 }
1161 }
1162 }
1163
1164
1165 struct card *card_cur = card_root,
1166 *card_next;
1167 while(card_cur){
1168
1169 struct do_rrd_x *do_rrd_x_cur = card_cur->do_rrd_x_root,
1170 *do_rrd_x_next;
1171 while(do_rrd_x_cur){
1172 if(unlikely(do_rrd_x_cur->func(card_cur))) {
1173 do_rrd_x_next = do_rrd_x_cur->next;
1174 rm_do_rrd_x(card_cur, do_rrd_x_cur);
1175 do_rrd_x_cur = do_rrd_x_next;
1176 }
1177 else do_rrd_x_cur = do_rrd_x_cur->next;
1178 }
1179
1180 if(unlikely(!card_cur->do_rrd_x_root)){
1181 card_next = card_cur->next;
1182 card_free(card_cur);
1183 card_cur = card_next;
1184 }
1185 else card_cur = card_cur->next;
1186 }
1187
1188 return card_root ? 0 : 1;
1189 }