@@ -19,32 +19,43 @@ const char* ffDrmDetectRadeon(const FFGPUOptions* options, FFGPUResult* gpu, con
19
19
FF_AUTO_CLOSE_FD int fd = open (renderPath , O_RDONLY );
20
20
if (fd < 0 ) return "Failed to open DRM render device" ;
21
21
22
- struct drm_radeon_info info ;
23
- info .request = RADEON_INFO_ACTIVE_CU_COUNT ;
24
- if (ioctl (fd , DRM_IOCTL_RADEON_INFO , & info ) >= 0 )
25
- gpu -> coreCount = (int32_t ) info .value ;
22
+ uint32_t value ;
23
+
24
+ // https://github.com/torvalds/linux/blob/fb4d33ab452ea254e2c319bac5703d1b56d895bf/drivers/gpu/drm/radeon/radeon_kms.c#L231
25
+
26
+ if (ioctl (fd , DRM_IOCTL_RADEON_INFO , & (struct drm_radeon_info ) {
27
+ .request = RADEON_INFO_ACTIVE_CU_COUNT ,
28
+ .value = (uintptr_t ) & value ,
29
+ }) >= 0 )
30
+ gpu -> coreCount = (int32_t ) value ;
26
31
27
32
if (options -> temp )
28
33
{
29
- info .request = RADEON_INFO_CURRENT_GPU_TEMP ; // millidegrees C
30
- if (ioctl (fd , DRM_IOCTL_RADEON_INFO , & info ) >= 0 )
31
- gpu -> temperature = (double ) info .value / 1000.0 ;
34
+ if (ioctl (fd , DRM_IOCTL_RADEON_INFO , & (struct drm_radeon_info ) {
35
+ .request = RADEON_INFO_CURRENT_GPU_TEMP , // millidegrees C
36
+ .value = (uintptr_t ) & value ,
37
+ }) >= 0 && value != 0 ) // 0 means unavailable
38
+ gpu -> temperature = (double ) value / 1000.0 ;
32
39
}
33
40
34
- info .request = RADEON_INFO_MAX_SCLK ; // MHz
35
- if (ioctl (fd , DRM_IOCTL_RADEON_INFO , & info ) >= 0 )
36
- gpu -> frequency = (uint32_t ) (info .value / 1000u );
41
+ if (ioctl (fd , DRM_IOCTL_RADEON_INFO , & (struct drm_radeon_info ) {
42
+ .request = RADEON_INFO_MAX_SCLK , // MHz
43
+ .value = (uintptr_t ) & value ,
44
+ }) >= 0 )
45
+ gpu -> frequency = (uint32_t ) (value / 1000u );
37
46
38
- struct drm_radeon_gem_info gemInfo ;
39
- if (ioctl (fd , DRM_IOCTL_RADEON_GEM_INFO , & gemInfo ) >= 0 && gemInfo .vram_visible > 0 )
47
+ if (options -> driverSpecific )
40
48
{
41
- gpu -> type = FF_GPU_TYPE_DISCRETE ;
42
- if (options -> driverSpecific )
49
+ struct drm_radeon_gem_info gemInfo ;
50
+ if (ioctl ( fd , DRM_IOCTL_RADEON_GEM_INFO , & gemInfo ) >= 0 && gemInfo . vram_visible > 0 )
43
51
{
44
52
gpu -> dedicated .total = gemInfo .vram_visible ;
45
- info .request = RADEON_INFO_VRAM_USAGE ;
46
- if (ioctl (fd , DRM_IOCTL_RADEON_INFO , & info ) >= 0 )
47
- gpu -> dedicated .used = info .value ;
53
+ uint64_t memSize ;
54
+ if (ioctl (fd , DRM_IOCTL_RADEON_INFO , & (struct drm_radeon_info ) {
55
+ .request = RADEON_INFO_VRAM_USAGE , // uint64_t
56
+ .value = (uintptr_t ) & memSize ,
57
+ }) >= 0 )
58
+ gpu -> dedicated .used = memSize ;
48
59
}
49
60
}
50
61
0 commit comments