Add AMD GPU collector (#15515)
Dimitris P committed
Aug 7, 2023 at 18:46 UTC
1bcb3fb105ad1888516b2b0b9c38fe6cc22e08f6
10 files changed
+1373
-7
CMakeLists.txt
+1
@@ -671,6 +671,7 @@ set(PROC_PLUGIN_FILES
671
collectors/proc.plugin/sys_fs_btrfs.c
672
collectors/proc.plugin/sys_class_power_supply.c
673
collectors/proc.plugin/sys_devices_pci_aer.c
674
+ collectors/proc.plugin/sys_class_drm.c
675
)
676
677
set(TC_PLUGIN_FILES
Makefile.am
+1
@@ -423,6 +423,7 @@ PROC_PLUGIN_FILES = \
423
collectors/proc.plugin/sys_fs_btrfs.c \
424
collectors/proc.plugin/sys_class_power_supply.c \
425
collectors/proc.plugin/sys_class_infiniband.c \
426
+ collectors/proc.plugin/sys_class_drm.c \
427
$(NULL)
428
429
PROFILE_PLUGIN_FILES = \
collectors/all.h
+9
-5
@@ -375,11 +375,11 @@
375
376
// Linux powercap
377
378
-#define NETDATA_CHART_PRIO_POWERCAP 9600
378
+#define NETDATA_CHART_PRIO_POWERCAP 9600
379
380
// Wireless
381
382
-#define NETDATA_CHART_PRIO_WIRELESS_IFACE 7110
382
+#define NETDATA_CHART_PRIO_WIRELESS_IFACE 7110
383
384
// CGROUPS
385
@@ -394,12 +394,16 @@
394
395
#define NETDATA_CHART_PRIO_PCI_AER 100000
396
397
+// AMD GPUs
398
+
399
+#define NETDATA_CHART_PRIO_DRM_AMDGPU 39000
400
+
401
// NETDATA ML CHARTS
402
403
// [ml] charts
400
-#define ML_CHART_PRIO_DIMENSIONS 39181
401
-#define ML_CHART_PRIO_ANOMALY_RATE 39182
402
-#define ML_CHART_PRIO_DETECTOR_EVENTS 39183
404
+#define ML_CHART_PRIO_DIMENSIONS 39181
405
+#define ML_CHART_PRIO_ANOMALY_RATE 39182
406
+#define ML_CHART_PRIO_DETECTOR_EVENTS 39183
407
408
// [netdata.ml] charts
409
#define NETDATA_ML_CHART_RUNNING 890001
collectors/proc.plugin/README.md
+31
@@ -31,6 +31,7 @@ In detail, it collects metrics from:
31
- `/proc/spl/kstat/zfs/pool/state` (state of ZFS pools)
32
- `/sys/class/power_supply` (power supply properties)
33
- `/sys/class/infiniband` (infiniband interconnect)
34
+- `/sys/class/drm` (AMD GPUs)
35
- `ipc` (IPC semaphores and message queues)
36
- `ksm` Kernel Same-Page Merging performance (several files under `/sys/kernel/mm/ksm`).
37
- `netdata` (internal Netdata resources utilization)
@@ -579,6 +580,36 @@ Default configuration will monitor only enabled infiniband ports, and refresh ne
580
# refresh ports state every seconds = 30
581
```
582
583
+## AMD GPUs
584
+
585
+This module monitors every AMD GPU card discovered at agent startup.
586
+
587
+### Monitored GPU metrics
588
+
589
+The following charts will be provided:
590
+
591
+- **GPU utilization**
592
+- **GPU memory utilization**
593
+- **GPU clock frequency**
594
+- **GPU memory clock frequency**
595
+- **VRAM memory usage percentage**
596
+- **VRAM memory usage**
597
+- **visible VRAM memory usage percentage**
598
+- **visible VRAM memory usage**
599
+- **GTT memory usage percentage**
600
+- **GTT memory usage**
601
+
602
+### configuration
603
+
604
+The `drm` path can be configured if it differs from the default:
605
+
606
+```
607
+[plugin:proc:/sys/class/drm]
608
+ # directory to monitor = /sys/class/drm
609
+```
610
+
611
+> [!NOTE]
612
+> Temperature, fan speed, voltage and power metrics for AMD GPUs can be monitored using the [Sensors](https://github.com/netdata/netdata/blob/master/collectors/charts.d.plugin/sensors/README.md) plugin.
613
614
## IPC
615
collectors/proc.plugin/metadata.yaml
+135
@@ -5180,3 +5180,138 @@ modules:
5180
- name: now
5181
- name: max
5182
- name: max_design
5183
+ - meta:
5184
+ plugin_name: proc.plugin
5185
+ module_name: /sys/class/drm
5186
+ monitored_instance:
5187
+ name: AMD GPU
5188
+ link: "https://www.amd.com"
5189
+ categories:
5190
+ - data-collection.hardware-devices-and-sensors
5191
+ icon_filename: "amd.png"
5192
+ related_resources:
5193
+ integrations:
5194
+ list: []
5195
+ info_provided_to_referring_integrations:
5196
+ description: ""
5197
+ keywords:
5198
+ - amd
5199
+ - gpu
5200
+ - hardware
5201
+ most_popular: false
5202
+ overview:
5203
+ data_collection:
5204
+ metrics_description: "This integration monitors AMD GPU metrics, such as utilization, clock frequency and memory usage."
5205
+ method_description: "It reads `/sys/class/drm` to collect metrics for every AMD GPU card instance it encounters."
5206
+ supported_platforms:
5207
+ include:
5208
+ - Linux
5209
+ exclude: []
5210
+ multi_instance: true
5211
+ additional_permissions:
5212
+ description: ""
5213
+ default_behavior:
5214
+ auto_detection:
5215
+ description: ""
5216
+ limits:
5217
+ description: ""
5218
+ performance_impact:
5219
+ description: ""
5220
+ setup:
5221
+ prerequisites:
5222
+ list: []
5223
+ configuration:
5224
+ file:
5225
+ name: ""
5226
+ description: ""
5227
+ options:
5228
+ description: ""
5229
+ folding:
5230
+ title: ""
5231
+ enabled: true
5232
+ list: []
5233
+ examples:
5234
+ folding:
5235
+ enabled: true
5236
+ title: ""
5237
+ list: []
5238
+ troubleshooting:
5239
+ problems:
5240
+ list: []
5241
+ alerts: []
5242
+ metrics:
5243
+ folding:
5244
+ title: Metrics
5245
+ enabled: false
5246
+ description: ""
5247
+ availability: []
5248
+ scopes:
5249
+ - name: gpu
5250
+ description: "These metrics refer to the GPU."
5251
+ labels:
5252
+ - name: product_name
5253
+ description: GPU product name (e.g. AMD RX 6600)
5254
+ metrics:
5255
+ - name: amdgpu.gpu_utilization
5256
+ description: GPU utilization
5257
+ unit: "percentage"
5258
+ chart_type: line
5259
+ dimensions:
5260
+ - name: utilization
5261
+ - name: amdgpu.gpu_mem_utilization
5262
+ description: GPU memory utilization
5263
+ unit: "percentage"
5264
+ chart_type: line
5265
+ dimensions:
5266
+ - name: utilization
5267
+ - name: amdgpu.gpu_clk_frequency
5268
+ description: GPU clock frequency
5269
+ unit: "MHz"
5270
+ chart_type: line
5271
+ dimensions:
5272
+ - name: frequency
5273
+ - name: amdgpu.gpu_mem_clk_frequency
5274
+ description: GPU memory clock frequency
5275
+ unit: "MHz"
5276
+ chart_type: line
5277
+ dimensions:
5278
+ - name: frequency
5279
+ - name: amdgpu.gpu_mem_vram_usage_perc
5280
+ description: VRAM memory usage percentage
5281
+ unit: "percentage"
5282
+ chart_type: line
5283
+ dimensions:
5284
+ - name: usage
5285
+ - name: amdgpu.gpu_mem_vram_usage
5286
+ description: VRAM memory usage
5287
+ unit: "bytes"
5288
+ chart_type: area
5289
+ dimensions:
5290
+ - name: free
5291
+ - name: used
5292
+ - name: amdgpu.gpu_mem_vis_vram_usage_perc
5293
+ description: visible VRAM memory usage percentage
5294
+ unit: "percentage"
5295
+ chart_type: line
5296
+ dimensions:
5297
+ - name: usage
5298
+ - name: amdgpu.gpu_mem_vis_vram_usage
5299
+ description: visible VRAM memory usage
5300
+ unit: "bytes"
5301
+ chart_type: area
5302
+ dimensions:
5303
+ - name: free
5304
+ - name: used
5305
+ - name: amdgpu.gpu_mem_gtt_usage_perc
5306
+ description: GTT memory usage percentage
5307
+ unit: "percentage"
5308
+ chart_type: line
5309
+ dimensions:
5310
+ - name: usage
5311
+ - name: amdgpu.gpu_mem_gtt_usage
5312
+ description: GTT memory usage
5313
+ unit: "bytes"
5314
+ chart_type: area
5315
+ dimensions:
5316
+ - name: free
5317
+ - name: used
collectors/proc.plugin/plugin_proc.c
+4
-1
@@ -70,8 +70,11 @@ static struct proc_module {
70
// IPC metrics
71
{.name = "ipc", .dim = "ipc", .func = do_ipc},
72
73
- {.name = "/sys/class/power_supply", .dim = "power_supply", .func = do_sys_class_power_supply},
73
// linux power supply metrics
74
+ {.name = "/sys/class/power_supply", .dim = "power_supply", .func = do_sys_class_power_supply},
75
+
76
+ // GPU metrics
77
+ {.name = "/sys/class/drm", .dim = "drm", .func = do_sys_class_drm},
78
79
// the terminator of this array
80
{.name = NULL, .dim = NULL, .func = NULL}
collectors/proc.plugin/plugin_proc.h
+1
@@ -46,6 +46,7 @@ int do_ipc(int update_every, usec_t dt);
46
int do_sys_class_power_supply(int update_every, usec_t dt);
47
int do_proc_pagetypeinfo(int update_every, usec_t dt);
48
int do_sys_class_infiniband(int update_every, usec_t dt);
49
+int do_sys_class_drm(int update_every, usec_t dt);
50
int get_numa_node_count(void);
51
52
// metrics that need to be shared among data collectors
collectors/proc.plugin/sys_class_drm.c
new
+1169
@@ -0,0 +1,1169 @@
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
+ uint32_t asic_id;
11
+ uint32_t 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 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
+ procfile *const ff = procfile_open(pathname, " ", PROCFILE_FLAG_NO_ERROR_ON_FILE_IO);
619
+ if(unlikely(!procfile_readall(ff))){
620
+ procfile_close(ff);
621
+ return 1; // error
622
+ }
623
+
624
+ for(size_t l = 0; l < procfile_lines(ff); l++) {
625
+ if(!strcmp(procfile_lineword(ff, l, 0), "DRIVER=amdgpu")){
626
+ procfile_close(ff);
627
+ return 0;
628
+ }
629
+ }
630
+
631
+ procfile_close(ff);
632
+ return 2; // no match
633
+}
634
+
635
+static int read_multiline_file(procfile *ff, const char *const pathname, collected_number *num){
636
+ if(!ff) ff = procfile_open(pathname, NULL, PROCFILE_FLAG_DEFAULT);
637
+ if(unlikely(!procfile_readall(ff))){
638
+ procfile_close(ff);
639
+ return 1; // error
640
+ }
641
+
642
+ for(size_t l = 0; l < procfile_lines(ff) ; l++) {
643
+
644
+ if(ff->lines->lines[l].words >= 3 && !strcmp(procfile_lineword(ff, l, 2), "*")){
645
+ char *str_with_units = procfile_lineword(ff, l, 1);
646
+ char *delim = strchr(str_with_units, 'M');
647
+ char str_without_units[10];
648
+ memcpy(str_without_units, str_with_units, delim - str_with_units);
649
+ *num = str2ll(str_without_units, NULL);
650
+ return 0;
651
+ }
652
+ }
653
+
654
+ procfile_close(ff);
655
+ return 2; // error
656
+}
657
+
658
+static char *set_id(const char *const suf_1, const char *const suf_2, const char *const suf_3){
659
+ static char id[RRD_ID_LENGTH_MAX + 1];
660
+ snprintfz(id, RRD_ID_LENGTH_MAX, "%s_%s_%s", suf_1, suf_2, suf_3);
661
+ return id;
662
+}
663
+
664
+typedef int (*do_rrd_x_func)(struct card *const c);
665
+
666
+struct do_rrd_x {
667
+ do_rrd_x_func func;
668
+ struct do_rrd_x *next;
669
+};
670
+
671
+static void add_do_rrd_x(struct card *const c, const do_rrd_x_func func){
672
+ struct do_rrd_x *const drrd = callocz(1, sizeof(struct do_rrd_x));
673
+ drrd->func = func;
674
+ drrd->next = c->do_rrd_x_root;
675
+ c->do_rrd_x_root = drrd;
676
+}
677
+
678
+static void rm_do_rrd_x(struct card *const c, struct do_rrd_x *const drrd){
679
+ if(drrd == c->do_rrd_x_root) c->do_rrd_x_root = drrd->next;
680
+ else {
681
+ struct do_rrd_x *last;
682
+ for(last = c->do_rrd_x_root; last && last->next != drrd; last = last->next);
683
+ if(last) last->next = drrd->next;
684
+ }
685
+
686
+ freez(drrd);
687
+}
688
+
689
+static int do_rrd_util_gpu(struct card *const c){
690
+ if(likely(!read_single_number_file(c->pathname_util_gpu, (unsigned long long *) &c->util_gpu))){
691
+ rrddim_set_by_pointer(c->st_util_gpu, c->rd_util_gpu, c->util_gpu);
692
+ rrdset_done(c->st_util_gpu);
693
+ return 0;
694
+ }
695
+ else {
696
+ collector_error("Cannot read util_gpu for %s: [%s]", c->pathname, c->id.marketing_name);
697
+ freez((void *) c->pathname_util_gpu);
698
+ rrdset_is_obsolete(c->st_util_gpu);
699
+ return 1;
700
+ }
701
+}
702
+
703
+static int do_rrd_util_mem(struct card *const c){
704
+ if(likely(!read_single_number_file(c->pathname_util_mem, (unsigned long long *) &c->util_mem))){
705
+ rrddim_set_by_pointer(c->st_util_mem, c->rd_util_mem, c->util_mem);
706
+ rrdset_done(c->st_util_mem);
707
+ return 0;
708
+ }
709
+ else {
710
+ collector_error("Cannot read util_mem for %s: [%s]", c->pathname, c->id.marketing_name);
711
+ freez((void *) c->pathname_util_mem);
712
+ rrdset_is_obsolete(c->st_util_mem);
713
+ return 1;
714
+ }
715
+}
716
+
717
+static int do_rrd_clk_gpu(struct card *const c){
718
+ if(likely(!read_multiline_file(c->ff_clk_gpu, (char *) c->pathname_clk_gpu, &c->clk_gpu))){
719
+ rrddim_set_by_pointer(c->st_clk_gpu, c->rd_clk_gpu, c->clk_gpu);
720
+ rrdset_done(c->st_clk_gpu);
721
+ return 0;
722
+ }
723
+ else {
724
+ collector_error("Cannot read clk_gpu for %s: [%s]", c->pathname, c->id.marketing_name);
725
+ freez((void *) c->pathname_clk_gpu);
726
+ rrdset_is_obsolete(c->st_clk_gpu);
727
+ procfile_close(c->ff_clk_gpu);
728
+ return 1;
729
+ }
730
+}
731
+
732
+static int do_rrd_clk_mem(struct card *const c){
733
+ if(likely(!read_multiline_file(c->ff_clk_mem, (char *) c->pathname_clk_mem, &c->clk_mem))){
734
+ rrddim_set_by_pointer(c->st_clk_mem, c->rd_clk_mem, c->clk_mem);
735
+ rrdset_done(c->st_clk_mem);
736
+ return 0;
737
+ }
738
+ else {
739
+ collector_error("Cannot read clk_mem for %s: [%s]", c->pathname, c->id.marketing_name);
740
+ freez((void *) c->pathname_clk_mem);
741
+ rrdset_is_obsolete(c->st_clk_mem);
742
+ procfile_close(c->ff_clk_mem);
743
+ return 1;
744
+ }
745
+}
746
+
747
+static int do_rrd_vram(struct card *const c){
748
+ if(likely(!read_single_number_file(c->pathname_mem_used_vram, (unsigned long long *) &c->used_vram) &&
749
+ c->total_vram)){
750
+ rrddim_set_by_pointer( c->st_mem_usage_perc_vram,
751
+ c->rd_mem_used_perc_vram,
752
+ c->used_vram * 10000 / c->total_vram);
753
+ rrdset_done(c->st_mem_usage_perc_vram);
754
+
755
+ rrddim_set_by_pointer(c->st_mem_usage_vram, c->rd_mem_used_vram, c->used_vram);
756
+ rrddim_set_by_pointer(c->st_mem_usage_vram, c->rd_mem_free_vram, c->total_vram - c->used_vram);
757
+ rrdset_done(c->st_mem_usage_vram);
758
+ return 0;
759
+ }
760
+ else {
761
+ collector_error("Cannot read used_vram for %s: [%s]", c->pathname, c->id.marketing_name);
762
+ freez((void *) c->pathname_mem_used_vram);
763
+ freez((void *) c->pathname_mem_total_vram);
764
+ rrdset_is_obsolete(c->st_mem_usage_perc_vram);
765
+ rrdset_is_obsolete(c->st_mem_usage_vram);
766
+ return 1;
767
+ }
768
+}
769
+
770
+static int do_rrd_vis_vram(struct card *const c){
771
+ if(likely(!read_single_number_file(c->pathname_mem_used_vis_vram, (unsigned long long *) &c->used_vis_vram) &&
772
+ c->total_vis_vram)){
773
+ rrddim_set_by_pointer( c->st_mem_usage_perc_vis_vram,
774
+ c->rd_mem_used_perc_vis_vram,
775
+ c->used_vis_vram * 10000 / c->total_vis_vram);
776
+ rrdset_done(c->st_mem_usage_perc_vis_vram);
777
+
778
+ rrddim_set_by_pointer(c->st_mem_usage_vis_vram, c->rd_mem_used_vis_vram, c->used_vis_vram);
779
+ rrddim_set_by_pointer(c->st_mem_usage_vis_vram, c->rd_mem_free_vis_vram, c->total_vis_vram - c->used_vis_vram);
780
+ rrdset_done(c->st_mem_usage_vis_vram);
781
+ return 0;
782
+ }
783
+ else {
784
+ collector_error("Cannot read used_vis_vram for %s: [%s]", c->pathname, c->id.marketing_name);
785
+ freez((void *) c->pathname_mem_used_vis_vram);
786
+ freez((void *) c->pathname_mem_total_vis_vram);
787
+ rrdset_is_obsolete(c->st_mem_usage_perc_vis_vram);
788
+ rrdset_is_obsolete(c->st_mem_usage_vis_vram);
789
+ return 1;
790
+ }
791
+}
792
+
793
+static int do_rrd_gtt(struct card *const c){
794
+ if(likely(!read_single_number_file(c->pathname_mem_used_gtt, (unsigned long long *) &c->used_gtt) &&
795
+ c->total_gtt)){
796
+ rrddim_set_by_pointer( c->st_mem_usage_perc_gtt,
797
+ c->rd_mem_used_perc_gtt,
798
+ c->used_gtt * 10000 / c->total_gtt);
799
+ rrdset_done(c->st_mem_usage_perc_gtt);
800
+
801
+ rrddim_set_by_pointer(c->st_mem_usage_gtt, c->rd_mem_used_gtt, c->used_gtt);
802
+ rrddim_set_by_pointer(c->st_mem_usage_gtt, c->rd_mem_free_gtt, c->total_gtt - c->used_gtt);
803
+ rrdset_done(c->st_mem_usage_gtt);
804
+ return 0;
805
+ }
806
+ else {
807
+ collector_error("Cannot read used_gtt for %s: [%s]", c->pathname, c->id.marketing_name);
808
+ freez((void *) c->pathname_mem_used_gtt);
809
+ freez((void *) c->pathname_mem_total_gtt);
810
+ rrdset_is_obsolete(c->st_mem_usage_perc_gtt);
811
+ rrdset_is_obsolete(c->st_mem_usage_gtt);
812
+ return 1;
813
+ }
814
+}
815
+
816
+int do_sys_class_drm(int update_every, usec_t dt) {
817
+ (void)dt;
818
+
819
+ static DIR *drm_dir = NULL;
820
+
821
+ int chart_prio = NETDATA_CHART_PRIO_DRM_AMDGPU;
822
+
823
+ if(unlikely(!drm_dir)) {
824
+ char filename[FILENAME_MAX + 1];
825
+ snprintfz(filename, FILENAME_MAX, "%s%s", netdata_configured_host_prefix, "/sys/class/drm");
826
+ char *drm_dir_name = config_get(CONFIG_SECTION_PLUGIN_PROC_DRM, "directory to monitor", filename);
827
+ if(unlikely(NULL == (drm_dir = opendir(drm_dir_name)))){
828
+ collector_error("Cannot read directory '%s'", drm_dir_name);
829
+ return 1;
830
+ }
831
+
832
+ struct dirent *de = NULL;
833
+ while(likely(de = readdir(drm_dir))) {
834
+ if( de->d_type == DT_DIR && ((de->d_name[0] == '.' && de->d_name[1] == '\0') ||
835
+ (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == '\0'))) continue;
836
+
837
+ if(de->d_type == DT_LNK && !strncmp(de->d_name, "card", 4) && !strchr(de->d_name, '-')) {
838
+ char filename[FILENAME_MAX + 1];
839
+
840
+ snprintfz(filename, FILENAME_MAX, "%s/%s/%s", drm_dir_name, de->d_name, "device/uevent");
841
+ if(check_card_is_amdgpu(filename)) continue;
842
+
843
+ /* Get static info */
844
+
845
+ struct card *const c = callocz(1, sizeof(struct card));
846
+ snprintfz(filename, FILENAME_MAX, "%s/%s", drm_dir_name, de->d_name);
847
+ c->pathname = strdupz(filename);
848
+
849
+ snprintfz(filename, FILENAME_MAX, "%s/%s", c->pathname, "device/device");
850
+ if(read_single_base64_or_hex_number_file(filename, (unsigned long long *) &c->id.asic_id)){
851
+ collector_error("Cannot read asic_id from '%s'", filename);
852
+ card_free(c);
853
+ continue;
854
+ }
855
+
856
+ snprintfz(filename, FILENAME_MAX, "%s/%s", c->pathname, "device/revision");
857
+ if(read_single_base64_or_hex_number_file(filename, (unsigned long long *) &c->id.pci_rev_id)){
858
+ collector_error("Cannot read pci_rev_id from '%s'", filename);
859
+ card_free(c);
860
+ continue;
861
+ }
862
+
863
+ for(int i = 0; amdgpu_ids[i].asic_id; i++){
864
+ if(c->id.asic_id == amdgpu_ids[i].asic_id && c->id.pci_rev_id == amdgpu_ids[i].pci_rev_id){
865
+ c->id.marketing_name = strdupz(amdgpu_ids[i].marketing_name);
866
+ break;
867
+ }
868
+ }
869
+ if(!c->id.marketing_name)
870
+ c->id.marketing_name = strdupz(amdgpu_ids[sizeof(amdgpu_ids)/sizeof(amdgpu_ids[0]) - 1].marketing_name);
871
+
872
+
873
+ collected_number tmp_val;
874
+ #define set_prop_pathname(prop_filename, prop_pathname, ff){ \
875
+ snprintfz(filename, FILENAME_MAX, "%s/%s", c->pathname, prop_filename); \
876
+ if((ff && !read_multiline_file(ff, filename, &tmp_val)) || \
877
+ !read_single_number_file(filename, (unsigned long long *) &tmp_val)) \
878
+ prop_pathname = strdupz(filename); \
879
+ else \
880
+ collector_info("Cannot read file '%s'", filename); \
881
+ }
882
+
883
+ /* Initialize GPU and VRAM utilization metrics */
884
+
885
+ set_prop_pathname("device/gpu_busy_percent", c->pathname_util_gpu, NULL);
886
+
887
+ if(c->pathname_util_gpu){
888
+ c->st_util_gpu = rrdset_create_localhost(
889
+ AMDGPU_CHART_TYPE
890
+ , set_id("gpu_utilization", c->id.marketing_name, de->d_name)
891
+ , NULL
892
+ , "utilization"
893
+ , AMDGPU_CHART_TYPE ".gpu_utilization"
894
+ , "GPU utilization"
895
+ , "percentage"
896
+ , PLUGIN_PROC_NAME
897
+ , PLUGIN_PROC_MODULE_DRM_NAME
898
+ , chart_prio++
899
+ , update_every
900
+ , RRDSET_TYPE_LINE
901
+ );
902
+
903
+ rrdlabels_add(c->st_util_gpu->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
904
+
905
+ c->rd_util_gpu = rrddim_add(c->st_util_gpu, "utilization", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
906
+
907
+ add_do_rrd_x(c, do_rrd_util_gpu);
908
+ }
909
+
910
+ set_prop_pathname("device/mem_busy_percent", c->pathname_util_mem, NULL);
911
+
912
+ if(c->pathname_util_mem){
913
+ c->st_util_mem = rrdset_create_localhost(
914
+ AMDGPU_CHART_TYPE
915
+ , set_id("gpu_mem_utilization", c->id.marketing_name, de->d_name)
916
+ , NULL
917
+ , "utilization"
918
+ , AMDGPU_CHART_TYPE ".gpu_mem_utilization"
919
+ , "GPU memory utilization"
920
+ , "percentage"
921
+ , PLUGIN_PROC_NAME
922
+ , PLUGIN_PROC_MODULE_DRM_NAME
923
+ , chart_prio++
924
+ , update_every
925
+ , RRDSET_TYPE_LINE
926
+ );
927
+
928
+ rrdlabels_add(c->st_util_mem->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
929
+
930
+ c->rd_util_mem = rrddim_add(c->st_util_mem, "utilization", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
931
+
932
+ add_do_rrd_x(c, do_rrd_util_mem);
933
+ }
934
+
935
+
936
+ /* Initialize GPU and VRAM clock frequency metrics */
937
+
938
+ set_prop_pathname("device/pp_dpm_sclk", c->pathname_clk_gpu, c->ff_clk_gpu);
939
+
940
+ if(c->pathname_clk_gpu){
941
+ c->st_clk_gpu = rrdset_create_localhost(
942
+ AMDGPU_CHART_TYPE
943
+ , set_id("gpu_clk_frequency", c->id.marketing_name, de->d_name)
944
+ , NULL
945
+ , "frequency"
946
+ , AMDGPU_CHART_TYPE ".gpu_clk_frequency"
947
+ , "GPU clock frequency"
948
+ , "MHz"
949
+ , PLUGIN_PROC_NAME
950
+ , PLUGIN_PROC_MODULE_DRM_NAME
951
+ , chart_prio++
952
+ , update_every
953
+ , RRDSET_TYPE_LINE
954
+ );
955
+
956
+ rrdlabels_add(c->st_clk_gpu->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
957
+
958
+ c->rd_clk_gpu = rrddim_add(c->st_clk_gpu, "frequency", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
959
+
960
+ add_do_rrd_x(c, do_rrd_clk_gpu);
961
+
962
+ }
963
+
964
+ set_prop_pathname("device/pp_dpm_mclk", c->pathname_clk_mem, c->ff_clk_mem);
965
+
966
+ if(c->pathname_clk_mem){
967
+ c->st_clk_mem = rrdset_create_localhost(
968
+ AMDGPU_CHART_TYPE
969
+ , set_id("gpu_mem_clk_frequency", c->id.marketing_name, de->d_name)
970
+ , NULL
971
+ , "frequency"
972
+ , AMDGPU_CHART_TYPE ".gpu_mem_clk_frequency"
973
+ , "GPU memory clock frequency"
974
+ , "MHz"
975
+ , PLUGIN_PROC_NAME
976
+ , PLUGIN_PROC_MODULE_DRM_NAME
977
+ , chart_prio++
978
+ , update_every
979
+ , RRDSET_TYPE_LINE
980
+ );
981
+
982
+ rrdlabels_add(c->st_clk_mem->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
983
+
984
+ c->rd_clk_mem = rrddim_add(c->st_clk_mem, "frequency", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
985
+
986
+ add_do_rrd_x(c, do_rrd_clk_mem);
987
+ }
988
+
989
+
990
+ /* Initialize GPU memory usage metrics */
991
+
992
+ set_prop_pathname("device/mem_info_vram_used", c->pathname_mem_used_vram, NULL);
993
+ set_prop_pathname("device/mem_info_vram_total", c->pathname_mem_total_vram, NULL);
994
+ if(c->pathname_mem_total_vram) c->total_vram = tmp_val;
995
+
996
+ if(c->pathname_mem_used_vram && c->pathname_mem_total_vram){
997
+ c->st_mem_usage_perc_vram = rrdset_create_localhost(
998
+ AMDGPU_CHART_TYPE
999
+ , set_id("gpu_mem_vram_usage_perc", c->id.marketing_name, de->d_name)
1000
+ , NULL
1001
+ , "memory_usage"
1002
+ , AMDGPU_CHART_TYPE ".gpu_mem_vram_usage_perc"
1003
+ , "VRAM memory usage percentage"
1004
+ , "percentage"
1005
+ , PLUGIN_PROC_NAME
1006
+ , PLUGIN_PROC_MODULE_DRM_NAME
1007
+ , chart_prio++
1008
+ , update_every
1009
+ , RRDSET_TYPE_LINE
1010
+ );
1011
+
1012
+ rrdlabels_add(c->st_mem_usage_perc_vram->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1013
+
1014
+ c->rd_mem_used_perc_vram = rrddim_add(c->st_mem_usage_perc_vram, "usage", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1015
+
1016
+
1017
+ c->st_mem_usage_vram = rrdset_create_localhost(
1018
+ AMDGPU_CHART_TYPE
1019
+ , set_id("gpu_mem_vram_usage", c->id.marketing_name, de->d_name)
1020
+ , NULL
1021
+ , "memory_usage"
1022
+ , AMDGPU_CHART_TYPE ".gpu_mem_vram_usage"
1023
+ , "VRAM memory usage"
1024
+ , "bytes"
1025
+ , PLUGIN_PROC_NAME
1026
+ , PLUGIN_PROC_MODULE_DRM_NAME
1027
+ , chart_prio++
1028
+ , update_every
1029
+ , RRDSET_TYPE_STACKED
1030
+ );
1031
+
1032
+ rrdlabels_add(c->st_mem_usage_vram->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1033
+
1034
+ c->rd_mem_free_vram = rrddim_add(c->st_mem_usage_vram, "free", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1035
+ c->rd_mem_used_vram = rrddim_add(c->st_mem_usage_vram, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1036
+
1037
+
1038
+ add_do_rrd_x(c, do_rrd_vram);
1039
+ }
1040
+
1041
+ set_prop_pathname("device/mem_info_vis_vram_used", c->pathname_mem_used_vis_vram, NULL);
1042
+ set_prop_pathname("device/mem_info_vis_vram_total", c->pathname_mem_total_vis_vram, NULL);
1043
+ if(c->pathname_mem_total_vis_vram) c->total_vis_vram = tmp_val;
1044
+
1045
+ if(c->pathname_mem_used_vis_vram && c->pathname_mem_total_vis_vram){
1046
+ c->st_mem_usage_perc_vis_vram = rrdset_create_localhost(
1047
+ AMDGPU_CHART_TYPE
1048
+ , set_id("gpu_mem_vis_vram_usage_perc", c->id.marketing_name, de->d_name)
1049
+ , NULL
1050
+ , "memory_usage"
1051
+ , AMDGPU_CHART_TYPE ".gpu_mem_vis_vram_usage_perc"
1052
+ , "visible VRAM memory usage percentage"
1053
+ , "percentage"
1054
+ , PLUGIN_PROC_NAME
1055
+ , PLUGIN_PROC_MODULE_DRM_NAME
1056
+ , chart_prio++
1057
+ , update_every
1058
+ , RRDSET_TYPE_LINE
1059
+ );
1060
+
1061
+ rrdlabels_add(c->st_mem_usage_perc_vis_vram->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1062
+
1063
+ c->rd_mem_used_perc_vis_vram = rrddim_add(c->st_mem_usage_perc_vis_vram, "usage", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1064
+
1065
+
1066
+ c->st_mem_usage_vis_vram = rrdset_create_localhost(
1067
+ AMDGPU_CHART_TYPE
1068
+ , set_id("gpu_mem_vis_vram_usage", c->id.marketing_name, de->d_name)
1069
+ , NULL
1070
+ , "memory_usage"
1071
+ , AMDGPU_CHART_TYPE ".gpu_mem_vis_vram_usage"
1072
+ , "visible VRAM memory usage"
1073
+ , "bytes"
1074
+ , PLUGIN_PROC_NAME
1075
+ , PLUGIN_PROC_MODULE_DRM_NAME
1076
+ , chart_prio++
1077
+ , update_every
1078
+ , RRDSET_TYPE_STACKED
1079
+ );
1080
+
1081
+ rrdlabels_add(c->st_mem_usage_vis_vram->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1082
+
1083
+ c->rd_mem_free_vis_vram = rrddim_add(c->st_mem_usage_vis_vram, "free", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1084
+ c->rd_mem_used_vis_vram = rrddim_add(c->st_mem_usage_vis_vram, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1085
+
1086
+
1087
+ add_do_rrd_x(c, do_rrd_vis_vram);
1088
+ }
1089
+
1090
+ set_prop_pathname("device/mem_info_gtt_used", c->pathname_mem_used_gtt, NULL);
1091
+ set_prop_pathname("device/mem_info_gtt_total", c->pathname_mem_total_gtt, NULL);
1092
+ if(c->pathname_mem_total_gtt) c->total_gtt = tmp_val;
1093
+
1094
+ if(c->pathname_mem_used_gtt && c->pathname_mem_total_gtt){
1095
+ c->st_mem_usage_perc_gtt = rrdset_create_localhost(
1096
+ AMDGPU_CHART_TYPE
1097
+ , set_id("gpu_mem_gtt_usage_perc", c->id.marketing_name, de->d_name)
1098
+ , NULL
1099
+ , "memory_usage"
1100
+ , AMDGPU_CHART_TYPE ".gpu_mem_gtt_usage_perc"
1101
+ , "GTT memory usage percentage"
1102
+ , "percentage"
1103
+ , PLUGIN_PROC_NAME
1104
+ , PLUGIN_PROC_MODULE_DRM_NAME
1105
+ , chart_prio++
1106
+ , update_every
1107
+ , RRDSET_TYPE_LINE
1108
+ );
1109
+
1110
+ rrdlabels_add(c->st_mem_usage_perc_gtt->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1111
+
1112
+ c->rd_mem_used_perc_gtt = rrddim_add(c->st_mem_usage_perc_gtt, "usage", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
1113
+
1114
+ c->st_mem_usage_gtt = rrdset_create_localhost(
1115
+ AMDGPU_CHART_TYPE
1116
+ , set_id("gpu_mem_gtt_usage", c->id.marketing_name, de->d_name)
1117
+ , NULL
1118
+ , "memory_usage"
1119
+ , AMDGPU_CHART_TYPE ".gpu_mem_gtt_usage"
1120
+ , "GTT memory usage"
1121
+ , "bytes"
1122
+ , PLUGIN_PROC_NAME
1123
+ , PLUGIN_PROC_MODULE_DRM_NAME
1124
+ , chart_prio++
1125
+ , update_every
1126
+ , RRDSET_TYPE_STACKED
1127
+ );
1128
+
1129
+ rrdlabels_add(c->st_mem_usage_gtt->rrdlabels, "product_name", c->id.marketing_name, RRDLABEL_SRC_AUTO);
1130
+
1131
+ c->rd_mem_free_gtt = rrddim_add(c->st_mem_usage_gtt, "free", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1132
+ c->rd_mem_used_gtt = rrddim_add(c->st_mem_usage_gtt, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
1133
+
1134
+
1135
+ add_do_rrd_x(c, do_rrd_gtt);
1136
+ }
1137
+
1138
+ c->next = card_root;
1139
+ card_root = c;
1140
+ }
1141
+ }
1142
+ }
1143
+
1144
+
1145
+ struct card *card_cur = card_root,
1146
+ *card_next;
1147
+ while(card_cur){
1148
+
1149
+ struct do_rrd_x *do_rrd_x_cur = card_cur->do_rrd_x_root,
1150
+ *do_rrd_x_next;
1151
+ while(do_rrd_x_cur){
1152
+ if(unlikely(do_rrd_x_cur->func(card_cur))) {
1153
+ do_rrd_x_next = do_rrd_x_cur->next;
1154
+ rm_do_rrd_x(card_cur, do_rrd_x_cur);
1155
+ do_rrd_x_cur = do_rrd_x_next;
1156
+ }
1157
+ else do_rrd_x_cur = do_rrd_x_cur->next;
1158
+ }
1159
+
1160
+ if(unlikely(!card_cur->do_rrd_x_root)){
1161
+ card_next = card_cur->next;
1162
+ card_free(card_cur);
1163
+ card_cur = card_next;
1164
+ }
1165
+ else card_cur = card_cur->next;
1166
+ }
1167
+
1168
+ return card_root ? 0 : 1;
1169
+}
libnetdata/inlined.h
+16
-1
@@ -209,7 +209,7 @@ static inline uint64_t str2uint64_hex(const char *src, char **endptr) {
209
const unsigned char *s = (const unsigned char *)src;
210
unsigned char c;
211
212
- while ((c = hex_value_from_ascii[*s]) != 255) {
212
+ while ((c = hex_value_from_ascii[toupper(*s)]) != 255) {
213
num = (num << 4) | c;
214
s++;
215
}
@@ -510,6 +510,21 @@ static inline int read_single_signed_number_file(const char *filename, long long
510
return 0;
511
}
512
513
+static inline int read_single_base64_or_hex_number_file(const char *filename, unsigned long long *result) {
514
+ char buffer[30 + 1];
515
+
516
+ int ret = read_file(filename, buffer, 30);
517
+ if(unlikely(ret)) {
518
+ *result = 0;
519
+ return ret;
520
+ }
521
+
522
+ buffer[30] = '\0';
523
+
524
+ *result = str2ull_encoded(buffer);
525
+ return 0;
526
+}
527
+
528
static inline int uuid_memcmp(const uuid_t *uu1, const uuid_t *uu2) {
529
return memcmp(uu1, uu2, sizeof(uuid_t));
530
}
web/gui/dashboard_info.js
+6
@@ -140,6 +140,12 @@ netdataDashboard.menu = {
140
info: 'Detailed information for each CPU of the system. A summary of the system for all CPUs can be found at the <a href="#menu_system">System Overview</a> section.'
141
},
142
143
+ 'amdgpu': {
144
+ title: 'AMD GPUs',
145
+ icon: '<i class="fas fa-microchip"></i>',
146
+ info: 'Detailed information for each AMD GPU of the system. Temperature, fan speed, voltage and power metrics can be found at the <a href="#menu_sensors">Sensors</a> section.'
147
+ },
148
+
149
'mem': {
150
title: 'Memory',
151
icon: '<i class="fas fa-microchip"></i>',