libdrm_amdgpu_sys/
drm_version.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#[cfg(feature = "link_drm")]
use crate::bindings;
use crate::AMDGPU::DeviceHandle;
use core::ffi::CStr;

#[derive(Debug, Clone)]
pub struct drmVersion {
    pub version_major: i32,
    pub version_minor: i32,
    pub version_patchlevel: i32,
    pub name: String,
    pub date: String,
    pub desc: String,
}

impl DeviceHandle {
    pub fn get_drm_version_struct(&self) -> Result<drmVersion, i32> {
        #[cfg(feature = "link_drm")]
        let (get_func, free_func) = (bindings::drmGetVersion, bindings::drmFreeVersion);
        #[cfg(feature = "dynamic_loading")]
        let (get_func, free_func) = (self.libdrm.drmGetVersion, self.libdrm.drmFreeVersion);

        let drm_ver_ptr = unsafe { get_func(self.fd) };

        if drm_ver_ptr.is_null() {
            return Err(-libc::EFAULT);
        }

        let ver = unsafe { core::ptr::read(drm_ver_ptr) };

        let [name, date, desc] = [ver.name, ver.date, ver.desc].map(|v| {
            if v.is_null() {
                String::new()
            } else {
                unsafe { CStr::from_ptr(v).to_str().map(|s| s.to_string()).unwrap_or_default() }
            }
        });

        unsafe { free_func(drm_ver_ptr) }

        Ok(drmVersion {
            version_major: ver.version_major,
            version_minor: ver.version_minor,
            version_patchlevel: ver.version_patchlevel,
            name,
            date,
            desc,
        })
    }
}