#![allow(non_upper_case_globals)]
pub use crate::core_status::*;
pub use crate::device::*;
pub use crate::device_error_info::*;
pub use crate::device_file::*;
pub use crate::device_info::*;
pub use crate::error::*;
use crate::generated::binding::*;
pub use crate::performance::*;
pub use crate::types::*;
pub use crate::version::*;
use std::sync::{Arc, RwLock};
mod core_status;
mod device;
mod device_error_info;
mod device_file;
mod device_info;
mod error;
mod generated;
mod performance;
mod types;
mod util;
mod version;
#[allow(clippy::arc_with_non_send_sync)]
pub fn list_devices() -> SmiResult<Vec<Device>> {
let mut output = FuriosaSmiDeviceHandles {
count: 0,
device_handles: [0; FURIOSA_SMI_MAX_DEVICE_HANDLE_SIZE as usize],
};
let observer_instance = Arc::new(RwLock::new(create_observer()?));
match unsafe { furiosa_smi_get_device_handles(&mut output as *mut FuriosaSmiDeviceHandles) } {
FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_OK => {
let mut devices = Vec::with_capacity(output.count as usize);
for i in 0..output.count as usize {
devices.push(new_device(
output.device_handles[i],
observer_instance.clone(),
));
}
Ok(devices)
}
err => Err(SmiError::from(err)),
}
}
pub fn driver_info() -> SmiResult<VersionInfo> {
let mut output = default_version_info();
match unsafe { furiosa_smi_get_driver_info(&mut output as *mut FuriosaSmiVersion) } {
FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_OK => Ok(new_version_info(output)),
err => Err(SmiError::from(err)),
}
}
fn create_observer() -> SmiResult<DeviceObserverInstance> {
let mut observer_instance: FuriosaSmiObserverInstance = default_observer_instance();
match unsafe {
furiosa_smi_create_observer(&mut observer_instance as *mut FuriosaSmiObserverInstance)
} {
FuriosaSmiReturnCode_FURIOSA_SMI_RETURN_CODE_OK => {
Ok(new_observer_instance(observer_instance))
}
err => Err(SmiError::from(err)),
}
}