...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package sysfs
18
19 import (
20 "errors"
21 "fmt"
22 "path/filepath"
23 "regexp"
24 "syscall"
25
26 "github.com/prometheus/procfs/internal/util"
27 )
28
29 const (
30
31 deviceDriverAMDGPU = "amdgpu"
32 )
33
34
35
36
37
38 type ClassDRMCardAMDGPUStats struct {
39 Name string
40 GPUBusyPercent uint64
41 MemoryGTTSize uint64
42 MemoryGTTUsed uint64
43 MemoryVisibleVRAMSize uint64
44 MemoryVisibleVRAMUsed uint64
45 MemoryVRAMSize uint64
46 MemoryVRAMUsed uint64
47 MemoryVRAMVendor string
48 PowerDPMForcePerformanceLevel string
49 UniqueID string
50 }
51
52
53 func (fs FS) ClassDRMCardAMDGPUStats() ([]ClassDRMCardAMDGPUStats, error) {
54 cards, err := filepath.Glob(fs.sys.Path("class/drm/card[0-9]"))
55 if err != nil {
56 return nil, err
57 }
58
59 var stats []ClassDRMCardAMDGPUStats
60 for _, card := range cards {
61 cardStats, err := parseClassDRMAMDGPUCard(card)
62 if err != nil {
63 if errors.Is(err, syscall.ENODATA) {
64 continue
65 }
66 return nil, err
67 }
68 cardStats.Name = filepath.Base(card)
69 stats = append(stats, cardStats)
70 }
71 return stats, nil
72 }
73
74 func parseClassDRMAMDGPUCard(card string) (ClassDRMCardAMDGPUStats, error) {
75 uevent, err := util.SysReadFile(filepath.Join(card, "device/uevent"))
76 if err != nil {
77 return ClassDRMCardAMDGPUStats{}, err
78 }
79
80 match, err := regexp.MatchString(fmt.Sprintf("DRIVER=%s", deviceDriverAMDGPU), uevent)
81 if err != nil {
82 return ClassDRMCardAMDGPUStats{}, err
83 }
84 if !match {
85 return ClassDRMCardAMDGPUStats{}, nil
86 }
87
88 stats := ClassDRMCardAMDGPUStats{Name: card}
89
90 if v, err := readDRMCardField(card, "gpu_busy_percent"); err == nil {
91 stats.GPUBusyPercent = *util.NewValueParser(v).PUInt64()
92 }
93 if v, err := readDRMCardField(card, "mem_info_gtt_total"); err == nil {
94 stats.MemoryGTTSize = *util.NewValueParser(v).PUInt64()
95 }
96 if v, err := readDRMCardField(card, "mem_info_gtt_used"); err == nil {
97 stats.MemoryGTTUsed = *util.NewValueParser(v).PUInt64()
98 }
99 if v, err := readDRMCardField(card, "mem_info_vis_vram_total"); err == nil {
100 stats.MemoryVisibleVRAMSize = *util.NewValueParser(v).PUInt64()
101 }
102 if v, err := readDRMCardField(card, "mem_info_vis_vram_used"); err == nil {
103 stats.MemoryVisibleVRAMUsed = *util.NewValueParser(v).PUInt64()
104 }
105 if v, err := readDRMCardField(card, "mem_info_vram_total"); err == nil {
106 stats.MemoryVRAMSize = *util.NewValueParser(v).PUInt64()
107 }
108 if v, err := readDRMCardField(card, "mem_info_vram_used"); err == nil {
109 stats.MemoryVRAMUsed = *util.NewValueParser(v).PUInt64()
110 }
111 if v, err := readDRMCardField(card, "mem_info_vram_vendor"); err == nil {
112 stats.MemoryVRAMVendor = v
113 }
114 if v, err := readDRMCardField(card, "power_dpm_force_performance_level"); err == nil {
115 stats.PowerDPMForcePerformanceLevel = v
116 }
117 if v, err := readDRMCardField(card, "unique_id"); err == nil {
118 stats.UniqueID = v
119 }
120
121 return stats, nil
122 }
123
View as plain text