use crate::{CpuVendor, ProcInfo, CpuCodename, CpuMicroArch, CpuStepping, ProcessNode};
#[cfg(feature = "std")]
use std::fmt;
impl ProcInfo {
pub(super) fn amd_fam10h(m: u32, s: u32) -> Self {
match m {
0x2 => Self {
codename: CpuCodename::Amd(AmdCodename::DR),
archname: CpuMicroArch::Amd(AmdMicroArch::Barcelona),
step_info: match s {
0x1 => CpuStepping::B1,
0x2 => CpuStepping::B2,
0x3 => CpuStepping::B3,
0xA => CpuStepping::BA,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(65)),
},
0x4 => Self {
codename: CpuCodename::Amd(AmdCodename::RB),
archname: CpuMicroArch::Amd(AmdMicroArch::Shanghai),
step_info: match s {
0x2 => CpuStepping::C2,
0x3 => CpuStepping::C3,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(45)),
},
0x5 => Self {
codename: CpuCodename::Amd(AmdCodename::BL),
archname: CpuMicroArch::Amd(AmdMicroArch::K10),
step_info: match s {
0x2 => CpuStepping::C2,
0x3 => CpuStepping::C3,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(45)),
},
0x6 => Self {
codename: CpuCodename::Amd(AmdCodename::DA),
archname: CpuMicroArch::Amd(AmdMicroArch::K10),
step_info: match s {
0x2 => CpuStepping::C2,
0x3 => CpuStepping::C3,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(45)),
},
0x8 => Self {
codename: CpuCodename::Amd(AmdCodename::HY),
archname: CpuMicroArch::Amd(AmdMicroArch::Istanbul),
step_info: match s {
0x0 => CpuStepping::D0,
0x1 => CpuStepping::D1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(45)),
},
0x9 => Self {
codename: CpuCodename::Amd(AmdCodename::HY),
archname: CpuMicroArch::Amd(AmdMicroArch::K10),
step_info: match s {
0x1 => CpuStepping::D1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(45)),
},
0xA => Self {
codename: CpuCodename::Amd(AmdCodename::PH),
archname: CpuMicroArch::Amd(AmdMicroArch::K10),
step_info: match s {
0x0 => CpuStepping::E0,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(45)),
},
_ => Self {
codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x10, m),
archname: CpuMicroArch::Unknown,
step_info: CpuStepping::Unknown(s),
node: None,
},
}
}
pub(super) fn amd_fam11h(m: u32, s: u32) -> Self {
match m {
0x3 => Self {
codename: CpuCodename::Amd(AmdCodename::Griffin),
archname: CpuMicroArch::Amd(AmdMicroArch::Puma2008),
step_info: CpuStepping::B1, node: Some(ProcessNode::NM(65)),
},
_ => Self {
codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x11, m),
archname: CpuMicroArch::Unknown,
step_info: CpuStepping::Unknown(s),
node: None,
},
}
}
pub(super) fn amd_fam12h(m: u32, s: u32) -> Self {
match m {
0x1 => Self {
codename: CpuCodename::Amd(AmdCodename::Llano),
archname: CpuMicroArch::Amd(AmdMicroArch::K10),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(32)),
},
_ => Self {
codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x12, m),
archname: CpuMicroArch::Unknown,
step_info: CpuStepping::Unknown(s),
node: None,
},
}
}
pub(super) fn amd_fam14h(m: u32, s: u32) -> Self {
match m {
0x1 | 0x2 => Self {
codename: CpuCodename::Amd(AmdCodename::Ontario_Zacate),
archname: CpuMicroArch::Amd(AmdMicroArch::Bobcat),
step_info: match m {
0x1 => CpuStepping::B0,
0x2 => CpuStepping::C0,
_ => unreachable!(),
},
node: Some(ProcessNode::NM(40)),
},
_ => Self {
codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x14, m),
archname: CpuMicroArch::Unknown,
step_info: CpuStepping::Unknown(s),
node: None,
},
}
}
pub(super) fn amd_fam15h(m: u32, s: u32) -> Self {
match m {
0x1 | 0x2 => Self {
codename: CpuCodename::Amd(AmdCodename::Orochi),
archname: CpuMicroArch::Amd(AmdMicroArch::Bulldozer),
step_info: match (m, s) {
(0x1, 0x2) => CpuStepping::B2,
(0x2, 0x0) => CpuStepping::C0,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(32)),
},
0x10 => Self {
codename: CpuCodename::Amd(AmdCodename::Trinity),
archname: CpuMicroArch::Amd(AmdMicroArch::Piledriver),
step_info: match s {
0x0 => CpuStepping::A0,
0x1 => CpuStepping::A1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(32)),
},
0x13 => Self {
codename: CpuCodename::Amd(AmdCodename::Richland),
archname: CpuMicroArch::Amd(AmdMicroArch::Piledriver),
step_info: match s {
0x1 => CpuStepping::A1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(32)),
},
0x30 => Self {
codename: CpuCodename::Amd(AmdCodename::Kaveri),
archname: CpuMicroArch::Amd(AmdMicroArch::Steamroller),
step_info: match s {
0x1 => CpuStepping::A1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(28)),
},
0x38 => Self {
codename: CpuCodename::Amd(AmdCodename::Godavari),
archname: CpuMicroArch::Amd(AmdMicroArch::Steamroller),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(28)),
},
0x60 => Self {
codename: CpuCodename::Amd(AmdCodename::Carrizo),
archname: CpuMicroArch::Amd(AmdMicroArch::Excavator),
step_info: match s {
0x0 => CpuStepping::A0,
0x1 => CpuStepping::A1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(28)),
},
0x65 => Self {
codename: CpuCodename::Amd(AmdCodename::BristolRidge),
archname: CpuMicroArch::Amd(AmdMicroArch::Excavator),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(28)),
},
0x70 => Self {
codename: CpuCodename::Amd(AmdCodename::StoneyRidge),
archname: CpuMicroArch::Amd(AmdMicroArch::Excavator),
step_info: match s {
0x0 => CpuStepping::A0,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(28)),
},
_ => Self {
codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x15, m),
archname: CpuMicroArch::Unknown,
step_info: CpuStepping::Unknown(s),
node: None,
},
}
}
pub(super) fn amd_fam16h(m: u32, s: u32) -> Self {
match m {
0x00 => Self {
codename: CpuCodename::Amd(AmdCodename::Kabini_Temash),
archname: CpuMicroArch::Amd(AmdMicroArch::Jaguar),
step_info: match s {
0x1 => CpuStepping::A1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(28)),
},
0x26 => Self {
codename: CpuCodename::Amd(AmdCodename::Cato),
archname: CpuMicroArch::Amd(AmdMicroArch::Jaguar),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(28)),
},
0x30 => Self {
codename: CpuCodename::Amd(AmdCodename::Beema_Mullins),
archname: CpuMicroArch::Amd(AmdMicroArch::Puma2014),
step_info: match s {
0x1 => CpuStepping::A1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(28)),
},
_ => Self {
codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x16, m),
archname: CpuMicroArch::Unknown,
step_info: CpuStepping::Unknown(s),
node: None,
},
}
}
pub(super) fn amd_fam17h(m: u32, s: u32) -> Self {
match m {
0x00 | 0x01 => Self {
codename: CpuCodename::Amd(AmdCodename::Naples),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen),
step_info: match (m, s) {
(0x00, _) => CpuStepping::A0,
(0x01, 0x1) => CpuStepping::B1, (0x01, 0x2) => CpuStepping::B2,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(14)),
},
0x11 => Self {
codename: CpuCodename::Amd(AmdCodename::RavenRidge),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(14)),
},
0x20 => Self {
codename: CpuCodename::Amd(AmdCodename::Raven2),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen),
step_info: match m {
0x1 => CpuStepping::A1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(14)),
},
0x08 => Self {
codename: CpuCodename::Amd(AmdCodename::PinnacleRidge),
archname: CpuMicroArch::Amd(AmdMicroArch::ZenPlus),
step_info: match s {
0x2 => CpuStepping::B2,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(12)),
},
0x18 => Self {
codename: CpuCodename::Amd(AmdCodename::Picasso),
archname: CpuMicroArch::Amd(AmdMicroArch::ZenPlus),
step_info: match s {
0x0 => CpuStepping::B0,
0x1 => CpuStepping::B1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(12)),
},
0x30 | 0x31 => Self {
codename: CpuCodename::Amd(AmdCodename::Rome),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
step_info: match (m, s) {
(0x30, 0x0) => CpuStepping::A0,
(0x31, 0x0) => CpuStepping::B0,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(7)),
},
0x60 => Self {
codename: CpuCodename::Amd(AmdCodename::Renoir),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
step_info: match s {
0x1 => CpuStepping::A1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(7)),
},
0x68 => Self {
codename: CpuCodename::Amd(AmdCodename::Lucienne),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(7)),
},
0x71 => Self {
codename: CpuCodename::Amd(AmdCodename::Matisse),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(7)),
},
0x90 => Self {
codename: CpuCodename::Amd(AmdCodename::VanGogh),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(7)),
},
0xA0..=0xAF => Self {
codename: CpuCodename::Amd(AmdCodename::Mendocino),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen2),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(6)),
},
_ => Self {
codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x17, m),
archname: CpuMicroArch::Unknown,
step_info: CpuStepping::Unknown(s),
node: None,
},
}
}
pub(crate) fn amd_fam19h(m: u32, s: u32) -> Self {
match m {
0x00 | 0x01 => Self {
codename: CpuCodename::Amd(AmdCodename::Milan),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
step_info: match (m, s) {
(0x00, _) => CpuStepping::A0,
(0x01, 0x0) => CpuStepping::B0,
(0x01, 0x1) => CpuStepping::B1, (0x01, 0x2) => CpuStepping::B2, _ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(7)),
},
0x08 => Self {
codename: CpuCodename::Amd(AmdCodename::Chagall),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(7)),
},
0x20 | 0x21 => Self {
codename: CpuCodename::Amd(AmdCodename::Vermeer),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
step_info: match (m, s) {
(0x20, _) => CpuStepping::A0,
(0x21, 0x0) => CpuStepping::B0,
(0x21, 0x2) => CpuStepping::B2,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(7)),
},
0x30 => Self {
codename: CpuCodename::Amd(AmdCodename::Trento),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(7)),
},
0x40..=0x4F => Self {
codename: CpuCodename::Amd(AmdCodename::Rembrandt),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen3Plus),
step_info: match (m, s) {
(0x40, _) => CpuStepping::A0,
(0x44, 0x0) => CpuStepping::B0,
(0x44, 0x1) => CpuStepping::B1, _ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(6)),
},
0x50..=0x5F => Self {
codename: CpuCodename::Amd(AmdCodename::Cezanne_Barcelo),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen3),
step_info: match (m, s) {
(0x50, 0x0) => CpuStepping::A0,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(7)),
},
0x10..=0x1F => Self {
codename: CpuCodename::Amd(AmdCodename::Genoa),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen4),
step_info: match (m, s) {
(0x10, _) => CpuStepping::A0,
(0x11, 0x0) => CpuStepping::B0,
(0x11, 0x1) => CpuStepping::B1,
_ => CpuStepping::Unknown(s),
},
node: Some(ProcessNode::NM(5)),
},
0x60..=0x6F => Self {
codename: CpuCodename::Amd(AmdCodename::Raphael),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen4),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(5)),
},
0x70..=0x7F => Self {
codename: match m {
0x78 => CpuCodename::Amd(AmdCodename::Phoenix2),
_ => CpuCodename::Amd(AmdCodename::Phoenix),
},
archname: CpuMicroArch::Amd(AmdMicroArch::Zen4),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(4)),
},
0x90..=0x9F => Self {
codename: CpuCodename::Amd(AmdCodename::MI300),
archname: CpuMicroArch::Amd(AmdMicroArch::Zen4),
step_info: CpuStepping::Unknown(s),
node: Some(ProcessNode::NM(5)),
},
_ => Self {
codename: CpuCodename::Unknown(CpuVendor::AuthenticAMD, 0x19, m),
archname: CpuMicroArch::Unknown,
step_info: CpuStepping::Unknown(s),
node: None,
},
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[allow(non_camel_case_types)]
pub enum AmdCodename {
Fam10h,
DR,
RB,
BL,
DA,
HY,
PH,
Griffin,
Llano,
Ontario_Zacate,
Orochi,
Trinity,
Richland,
Kaveri,
Carrizo,
Godavari,
BristolRidge,
StoneyRidge,
Kabini_Temash,
Cato,
Beema_Mullins,
Naples,
RavenRidge,
Raven2,
PinnacleRidge,
Picasso,
Rome,
Renoir,
Lucienne,
Matisse,
VanGogh,
Mendocino,
Milan,
Chagall,
Trento,
Vermeer,
Rembrandt,
Cezanne_Barcelo,
Genoa,
Raphael,
Phoenix,
Phoenix2,
MI300,
}
#[cfg(feature = "std")]
impl fmt::Display for AmdCodename {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Ontario_Zacate => write!(f, "Ontario/Zacate"),
Self::Kabini_Temash => write!(f, "Kabini/Temash"),
Self::Beema_Mullins => write!(f, "Beema/Mullins"),
Self::Cezanne_Barcelo => write!(f, "Cezanne/Barcelo"),
_ => write!(f, "{:?}", self),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum AmdMicroArch {
Puma2008,
K10,
Barcelona,
Shanghai,
Istanbul,
Bobcat,
Bulldozer,
Piledriver,
Steamroller,
Excavator,
Jaguar,
Puma2014,
Zen,
ZenPlus,
Zen2,
Zen3,
Zen3Plus,
Zen4,
_Reserved,
}
#[cfg(feature = "std")]
impl fmt::Display for AmdMicroArch {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::ZenPlus => write!(f, "Zen+"),
Self::Zen2 => write!(f, "Zen 2"),
Self::Zen3 => write!(f, "Zen 3"),
Self::Zen3Plus => write!(f, "Zen 3+"),
Self::Zen4 => write!(f, "Zen 4"),
_ => write!(f, "{:?}", self),
}
}
}