use crate::lib::sysfs_attrs;
pub fn count_cpus() -> crate::Result<usize> {
use std::fs::DirEntry;
let is_cpu_obj = |inode: &DirEntry| {
let name = inode.file_name();
let name = name.to_string_lossy();
name.starts_with("policy") && name["policy".len()..].chars().all(|ch| ch.is_ascii_digit())
};
let count = std::fs::read_dir("/sys/devices/system/cpu/cpufreq")?
.filter(|res| matches!(res, Ok(inode) if is_cpu_obj(inode)))
.count();
Ok(count)
}
#[sysfs_attrs(in "/sys/devices/system/cpu/cpufreq/policy{cpu}")]
pub mod cpufreq {
use crate::lib::sysfs;
#[sysfs]
pub fn affected_cpus(cpu: usize) -> Vec<usize> {
let read = |text: &str| text.split(' ').map(|int| int.parse().unwrap()).collect();
..
}
#[sysfs]
pub fn bios_limit(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn cpuinfo_cur_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn cpuinfo_max_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn cpuinfo_min_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn cpuinfo_transition_latency(cpu: usize) -> isize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn related_cpus(cpu: usize) -> Vec<usize> {
let read = |text: &str| text.split(' ').map(|int| int.parse().unwrap()).collect();
..
}
#[sysfs]
pub fn scaling_available_governors(cpu: usize) -> Vec<String> {
let read = |text: &str| text.split(' ').map(str::to_owned).collect();
..
}
#[sysfs]
pub fn scaling_cur_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn scaling_driver(cpu: usize) -> String {
let read = str::to_owned;
..
}
#[sysfs]
pub fn scaling_governor(cpu: usize) -> String {
let read = str::to_owned;
let write = |gov: &str| gov.to_owned();
..
}
#[sysfs]
pub fn scaling_max_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
let write = |khz: usize| khz.to_string();
..
}
#[sysfs]
pub fn scaling_min_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
let write = |khz: usize| khz.to_string();
..
}
#[sysfs]
pub fn scaling_setspeed(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
let write = |khz: usize| khz.to_string();
..
}
}
#[sysfs_attrs(in "/sys/devices/system/cpu/cpufreq/policy{cpu}")]
pub mod amd_pstate {
use crate::lib::sysfs;
#[sysfs]
pub fn amd_pstate_highest_perf(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn amd_pstate_max_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn amd_pstate_lowest_nonlinear_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn energy_performance_available_preferences(cpu: usize) -> Vec<String> {
let read = |text: &str| text.split(' ').map(str::to_owned).collect();
..
}
#[sysfs]
pub fn energy_performance_preference(cpu: usize) -> String {
let read = str::to_owned;
let write = |epp: &str| epp.to_owned();
..
}
}
#[sysfs_attrs(in "/sys/devices/system/cpu/cpu{cpu}/acpi_cppc")]
pub mod acpi_cppc {
use crate::lib::sysfs;
#[sysfs]
pub fn highest_perf(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn nominal_perf(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn lowest_nonlinear_perf(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn lowest_perf(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn lowest_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn nominal_freq(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn feedback_ctrs(cpu: usize) -> FeedbackCounters {
let read = |text: &str| text.parse().unwrap();
..
}
#[derive(Copy, Clone, Debug)]
pub struct FeedbackCounters {
pub reference: usize,
pub delivered: usize,
}
impl std::str::FromStr for FeedbackCounters {
type Err = crate::Error;
fn from_str(text: &str) -> crate::Result<Self> {
let mut reference = None;
let mut delivered = None;
for text in text.split(' ') {
if let Some(text) = text.strip_prefix("ref:") {
reference = Some(text.parse().unwrap());
} else if let Some(text) = text.strip_prefix("del:") {
delivered = Some(text.parse().unwrap());
} else {
todo!("parsing error")
}
}
Ok(Self {
reference: reference.unwrap(),
delivered: delivered.unwrap(),
})
}
}
#[sysfs]
pub fn wraparound_time(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
#[sysfs]
pub fn reference_perf(cpu: usize) -> usize {
let read = |text: &str| text.parse().unwrap();
..
}
}