#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PowerLevels<T> {
pub levels: Vec<T>,
pub active: Option<usize>,
}
impl<T> PowerLevels<T> {
pub fn active_level(&self) -> Option<&T> {
self.active.and_then(|active| self.levels.get(active))
}
}
macro_rules! impl_get_clocks_levels {
($name:ident, $level:expr, $out:ty) => {
pub fn $name(&self) -> Result<PowerLevels<$out>> {
self.get_clock_levels($level)
}
};
}
#[allow(missing_docs)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum PowerLevelKind {
CoreClock,
MemoryClock,
SOCClock,
FabricClock,
DCEFClock,
PcieSpeed,
}
impl PowerLevelKind {
pub fn filename(&self) -> &str {
use PowerLevelKind::*;
match self {
CoreClock => "pp_dpm_sclk",
MemoryClock => "pp_dpm_mclk",
SOCClock => "pp_dpm_socclk",
FabricClock => "pp_dpm_fclk",
DCEFClock => "pp_dpm_dcefclk",
PcieSpeed => "pp_dpm_pcie",
}
}
pub fn value_suffix(&self) -> Option<&str> {
use PowerLevelKind::*;
match self {
CoreClock | MemoryClock | SOCClock | FabricClock | DCEFClock => Some("mhz"),
PcieSpeed => None,
}
}
}