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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
use crate::generated::binding::*;
use crate::types::Arch;
use crate::util::c_char_slice_to_string;
use crate::version::*;

pub(crate) fn new_device_info(raw: FuriosaSmiDeviceInfo) -> DeviceInfo {
    DeviceInfo { raw }
}

/// A struct for device information
pub struct DeviceInfo {
    raw: FuriosaSmiDeviceInfo,
}

impl DeviceInfo {
    /// Get a architecture of device
    pub fn arch(&self) -> Arch {
        Arch::from(self.raw.arch)
    }

    /// Get a number of cores
    pub fn core_num(&self) -> u32 {
        self.raw.core_num
    }

    /// Get a numa node of device
    pub fn numa_node(&self) -> u32 {
        self.raw.numa_node
    }

    /// Get a name of device
    pub fn name(&self) -> String {
        c_char_slice_to_string(&self.raw.name)
    }

    /// Get a serial of device
    pub fn serial(&self) -> String {
        c_char_slice_to_string(&self.raw.serial)
    }

    /// Get a uuid of device
    pub fn uuid(&self) -> String {
        c_char_slice_to_string(&self.raw.uuid)
    }

    /// Get a bdf of device
    pub fn bdf(&self) -> String {
        c_char_slice_to_string(&self.raw.bdf)
    }

    /// Get a major part of pci device
    pub fn major(&self) -> u16 {
        self.raw.major
    }

    /// Get a minor part of pci device
    pub fn minor(&self) -> u16 {
        self.raw.minor
    }

    /// Get a firmware version of device
    pub fn firmware_version(&self) -> VersionInfo {
        new_version_info(self.raw.firmware_version)
    }

    /// Get a driver version of device
    pub fn driver_version(&self) -> VersionInfo {
        new_version_info(self.raw.driver_version)
    }
}

pub(crate) fn default_device_info() -> FuriosaSmiDeviceInfo {
    FuriosaSmiDeviceInfo {
        arch: 0,
        core_num: 0,
        numa_node: 0,
        name: [0; FURIOSA_SMI_MAX_CSTR_SIZE as usize],
        serial: [0; FURIOSA_SMI_MAX_CSTR_SIZE as usize],
        uuid: [0; FURIOSA_SMI_MAX_CSTR_SIZE as usize],
        bdf: [0; FURIOSA_SMI_MAX_CSTR_SIZE as usize],
        major: 0,
        minor: 0,
        firmware_version: default_version_info(),
        driver_version: default_version_info(),
    }
}

pub(crate) fn default_version_info() -> FuriosaSmiVersion {
    FuriosaSmiVersion {
        arch: 0,
        major: 0,
        minor: 0,
        patch: 0,
        metadata: [0; FURIOSA_SMI_MAX_CSTR_SIZE as usize],
    }
}