21
21
struct bits_t bits ;
22
22
unsigned long long vramsize ;
23
23
int drm_fd = -1 ;
24
+ char drm_name [10 ] = "" ; // should be radeon or amdgpu
24
25
25
26
unsigned int init_pci (unsigned char bus , const unsigned char forcemem ) {
26
27
@@ -71,11 +72,11 @@ unsigned int init_pci(unsigned char bus, const unsigned char forcemem) {
71
72
drm_fd = drmOpen (NULL , busid );
72
73
if (drm_fd >= 0 ) {
73
74
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 ) {
76
76
close (drm_fd );
77
77
drm_fd = -1 ;
78
78
}
79
+ strcpy (drm_name , ver -> name );
79
80
drmFreeVersion (ver );
80
81
}
81
82
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) {
115
116
ver->version_patchlevel,
116
117
ver->name);*/
117
118
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 ) ) {
120
121
printf (_ ("Kernel too old for VRAM reporting.\n" ));
121
122
drmFreeVersion (ver );
122
123
goto out ;
123
124
}
124
125
drmFreeVersion (ver );
125
126
126
127
// 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
+ }
132
153
if (ret ) {
133
154
printf (_ ("Failed to get VRAM size, error %d\n" ),
134
155
ret );
135
156
goto out ;
136
157
}
137
- vramsize = gem .vram_size ;
138
158
139
159
ret = getvram ();
140
160
if (ret == 0 ) {
@@ -154,15 +174,29 @@ unsigned int init_pci(unsigned char bus, const unsigned char forcemem) {
154
174
155
175
unsigned long long getvram () {
156
176
157
- int ret ;
177
+ int ret = -1 ;
158
178
unsigned long long val = 0 ;
159
179
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
+ }
166
200
if (ret ) return 0 ;
167
201
168
202
return val ;
0 commit comments