const AMD_RCB_EVENT: u64 = 0x5100d1;
const AMD_DEFAULT_SKID_MARGIN: u64 = 10_000;
const AMD_EPYC_9D85_SKID_MARGIN: u64 = 1_000;
const AMD_FAMILY_19H_MODEL_A0H_SKID_MARGIN: u64 = 1_000;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PmuProfile {
rcb_event: u64,
skid_margin: u64,
}
impl PmuProfile {
pub fn for_family_model(family_id: u8, model_id: u8) -> Option<Self> {
let (rcb_event, skid_margin) = match family_id {
0x06 => match model_id {
0x1A | 0x1E | 0x2E => (0x5101c4, 100), 0x25 | 0x2C | 0x2F => (0x5101c4, 100), 0x2A | 0x2D | 0x3E => (0x5101c4, 100), 0x3A => (0x5101c4, 100), 0x3C | 0x3F | 0x45 | 0x46 => (0x5101c4, 100), 0x3D | 0x47 | 0x4F | 0x56 => (0x5101c4, 100), 0x4E | 0x55 | 0x5E => (0x5101c4, 100), 0x8E | 0x9E => (0x5101c4, 100), 0xA5 | 0xA6 => (0x5101c4, 100), 0x8D => (0x5101c4, 100), 0x9A => (0x5101c4, 125), 0x8F => (0x5101c4, 125), 0x86 => (0x5101c4, 100), _ => return None,
},
0x1A if model_id == 0x11 => (AMD_RCB_EVENT, AMD_EPYC_9D85_SKID_MARGIN),
0x19 if model_id == 0xA0 => (AMD_RCB_EVENT, AMD_FAMILY_19H_MODEL_A0H_SKID_MARGIN),
0x17 | 0x19 | 0x1A => (AMD_RCB_EVENT, AMD_DEFAULT_SKID_MARGIN),
_ => return None,
};
Some(Self {
rcb_event,
skid_margin,
})
}
pub fn raw_rcb_event(&self) -> u64 {
self.rcb_event
}
pub fn default_skid_margin(&self) -> u64 {
self.skid_margin
}
}