Skip to content

Commit f202e36

Browse files
committed
Add support for VRAM size and usage reporting on amdgpu
1 parent 174c3dc commit f202e36

File tree

3 files changed

+61
-17
lines changed

3 files changed

+61
-17
lines changed

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
# nostrip disable stripping, default off
88
# plain apply neither -g nor -s.
99
# xcb enable libxcb to run unprivileged in Xorg, default on
10+
# amdgpu enable amdgpu VRAM size and usage reporting, default off
11+
# because amdgpu requires libdrm >= 2.4.63
1012

1113
PREFIX ?= /usr
1214
INSTALL ?= install
1315
LIBDIR ?= lib
1416

1517
nls ?= 1
1618
xcb ?= 1
19+
amdgpu ?= 0
1720

1821
bin = radeontop
1922
xcblib = libradeontop_xcb.so
@@ -41,6 +44,10 @@ ifeq ($(nls), 1)
4144
CFLAGS += -DENABLE_NLS=1
4245
endif
4346

47+
ifeq ($(amdgpu), 1)
48+
CFLAGS += -DENABLE_AMDGPU=1
49+
endif
50+
4451
ifndef plain
4552
ifdef debug
4653
CFLAGS += -g

detect.c

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
struct bits_t bits;
2222
unsigned long long vramsize;
2323
int drm_fd = -1;
24+
char drm_name[10] = ""; // should be radeon or amdgpu
2425

2526
unsigned int init_pci(unsigned char bus, const unsigned char forcemem) {
2627

@@ -71,11 +72,11 @@ unsigned int init_pci(unsigned char bus, const unsigned char forcemem) {
7172
drm_fd = drmOpen(NULL, busid);
7273
if (drm_fd >= 0) {
7374
drmVersionPtr ver = drmGetVersion(drm_fd);
74-
75-
if (strcmp(ver->name, "radeon") != 0) {
75+
if (strcmp(ver->name, "radeon") != 0 && strcmp(ver->name, "amdgpu") != 0) {
7676
close(drm_fd);
7777
drm_fd = -1;
7878
}
79+
strcpy(drm_name, ver->name);
7980
drmFreeVersion(ver);
8081
}
8182
if (drm_fd < 0 && access("/dev/ati/card0", F_OK) == 0) // fglrx path
@@ -115,26 +116,45 @@ unsigned int init_pci(unsigned char bus, const unsigned char forcemem) {
115116
ver->version_patchlevel,
116117
ver->name);*/
117118

118-
if (ver->version_major != 2 ||
119-
ver->version_minor < 36) {
119+
if (ver->version_major < 2 ||
120+
(ver->version_major == 2 && ver->version_minor < 36)) {
120121
printf(_("Kernel too old for VRAM reporting.\n"));
121122
drmFreeVersion(ver);
122123
goto out;
123124
}
124125
drmFreeVersion(ver);
125126

126127
// No version indicator, so we need to test once
127-
128-
struct drm_radeon_gem_info gem;
129-
130-
ret = drmCommandWriteRead(drm_fd, DRM_RADEON_GEM_INFO,
131-
&gem, sizeof(gem));
128+
// We use different codepaths for radeon and amdgpu
129+
// We store vram_size and check below if the ret value is sane
130+
if (strcmp(drm_name, "radeon") == 0) {
131+
struct drm_radeon_gem_info gem;
132+
133+
ret = drmCommandWriteRead(drm_fd, DRM_RADEON_GEM_INFO,
134+
&gem, sizeof(gem));
135+
vramsize = gem.vram_size;
136+
} else if (strcmp(drm_name, "amdgpu") == 0) {
137+
#ifdef ENABLE_AMDGPU
138+
struct drm_amdgpu_info_vram_gtt vram_gtt = {};
139+
140+
struct drm_amdgpu_info request;
141+
memset(&request, 0, sizeof(request));
142+
request.return_pointer = (unsigned long) &vram_gtt;
143+
request.return_size = sizeof(vram_gtt);
144+
request.query = AMDGPU_INFO_VRAM_GTT;
145+
146+
ret = drmCommandWrite(drm_fd, DRM_AMDGPU_INFO,
147+
&request, sizeof(request));
148+
vramsize = vram_gtt.vram_size;
149+
#else
150+
printf(_("amdgpu DRM driver is used, but amdgpu VRAM size reporting is not enabled\n"));
151+
#endif
152+
}
132153
if (ret) {
133154
printf(_("Failed to get VRAM size, error %d\n"),
134155
ret);
135156
goto out;
136157
}
137-
vramsize = gem.vram_size;
138158

139159
ret = getvram();
140160
if (ret == 0) {
@@ -154,15 +174,29 @@ unsigned int init_pci(unsigned char bus, const unsigned char forcemem) {
154174

155175
unsigned long long getvram() {
156176

157-
int ret;
177+
int ret = -1;
158178
unsigned long long val = 0;
159179

160-
struct drm_radeon_info info;
161-
memset(&info, 0, sizeof(info));
162-
info.value = (unsigned long) &val;
163-
info.request = RADEON_INFO_VRAM_USAGE;
164-
165-
ret = drmCommandWriteRead(drm_fd, DRM_RADEON_INFO, &info, sizeof(info));
180+
if (strcmp(drm_name, "radeon") == 0) {
181+
struct drm_radeon_info info;
182+
memset(&info, 0, sizeof(info));
183+
info.value = (unsigned long) &val;
184+
info.request = RADEON_INFO_VRAM_USAGE;
185+
186+
ret = drmCommandWriteRead(drm_fd, DRM_RADEON_INFO, &info, sizeof(info));
187+
} else if (strcmp(drm_name, "amdgpu") == 0) {
188+
#ifdef ENABLE_AMDGPU
189+
struct drm_amdgpu_info request;
190+
memset(&request, 0, sizeof(request));
191+
request.return_pointer = (unsigned long) &val;
192+
request.return_size = sizeof(val);
193+
request.query = AMDGPU_INFO_VRAM_USAGE;
194+
195+
ret = drmCommandWrite(drm_fd, DRM_AMDGPU_INFO, &request, sizeof(request));
196+
#else
197+
printf(_("amdgpu DRM driver is used, but amdgpu VRAM usage reporting is not enabled\n"));
198+
#endif
199+
}
166200
if (ret) return 0;
167201

168202
return val;

include/radeontop.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
#include <locale.h>
3636
#include <xf86drm.h>
3737
#include <radeon_drm.h>
38+
#ifdef ENABLE_AMDGPU
39+
#include <amdgpu_drm.h>
40+
#endif
3841

3942
enum {
4043
GRBM_STATUS = 0x8010,

0 commit comments

Comments
 (0)