/* * Copyright (c) 2022, able * Copyright (c) 2022, Umut İnan Erdoğan * * SPDX-License-Identifier: MPL-2.0 */ use core::fmt::Display; #[allow(non_camel_case_types, dead_code)] #[derive(Debug, Clone, Copy, PartialEq)] #[repr(C)] /// Class specification for a PCI device pub enum PciClass { Unclassified = 0x00, MassStorage = 0x01, Network = 0x02, Display = 0x03, Multimedia = 0x04, Memory = 0x05, Bridge = 0x06, Unknown = 0xFF, } impl From for PciClass { /// Convert a u8 into the corresponding PciClass fn from(n: u8) -> Self { use PciClass::*; match n { 0x00 => Unclassified, 0x01 => MassStorage, 0x02 => Network, 0x03 => Display, 0x04 => Multimedia, 0x05 => Memory, 0x06 => Bridge, _ => Unknown, } } } #[allow(non_camel_case_types, dead_code)] #[derive(Debug, Clone, Copy, PartialEq)] #[repr(C)] /// Full class specification (type and subtype) for a PCI device. /// /// Uses non-camel-case types for readability. pub enum PciFullClass { Unclassified_NonVgaCompatible = 0x0000, Unclassified_VgaCompatible = 0x0001, MassStorage_ScsiBus = 0x0100, MassStorage_IDE = 0x0101, MassStorage_Floppy = 0x0102, MassStorage_IpiBus = 0x0103, MassStorage_RAID = 0x0104, MassStorage_ATA = 0x0105, MassStorage_SATA = 0x0106, MassStorage_SerialSCSI = 0x0107, MassStorage_NVM = 0x0108, MassStorage_Other = 0x0180, Network_Ethernet = 0x0200, Network_TokenRing = 0x0201, Network_FDDI = 0x0202, Network_ATM = 0x0203, Network_ISDN = 0x0204, Network_WorldFlip = 0x0205, Network_PICMG = 0x0206, Network_Infiniband = 0x0207, Network_Fabric = 0x0208, Network_Other = 0x0280, Display_VGA = 0x0300, Display_XGA = 0x0301, Display_3D = 0x0302, Display_Other = 0x0380, Multimedia_Video = 0x0400, Multimedia_AudioController = 0x0401, Multimedia_Telephony = 0x0402, Multimedia_AudioDevice = 0x0403, Multimedia_Other = 0x0480, Memory_RAM = 0x0500, Memory_Flash = 0x0501, Memory_Other = 0x0580, Bridge_Host = 0x0600, Bridge_ISA = 0x0601, Bridge_EISA = 0x0602, Bridge_MCA = 0x0603, Bridge_PciToPci = 0x0604, Bridge_PCMCIA = 0x0605, Bridge_NuBus = 0x0606, Bridge_CardBus = 0x0607, Bridge_RACEway = 0x0608, Bridge_PciToPciSemiTransparent = 0x0609, Bridge_InfinibandToPci = 0x060A, Bridge_Other = 0x0680, Unknown = 0xFFFF, } impl PciFullClass { // listen, i know this sucks, but i didn't want to include // `num`, `num-traits` and `num-derive` as dependencies for // this crate just for a convenience function /// Convert a u16 into the corresponding PciFullClass pub fn from_u16(n: u16) -> PciFullClass { match n { 0x0000 => PciFullClass::Unclassified_NonVgaCompatible, 0x0001 => PciFullClass::Unclassified_VgaCompatible, 0x0100 => PciFullClass::MassStorage_ScsiBus, 0x0101 => PciFullClass::MassStorage_IDE, 0x0102 => PciFullClass::MassStorage_Floppy, 0x0103 => PciFullClass::MassStorage_IpiBus, 0x0104 => PciFullClass::MassStorage_RAID, 0x0105 => PciFullClass::MassStorage_ATA, 0x0106 => PciFullClass::MassStorage_SATA, 0x0107 => PciFullClass::MassStorage_SerialSCSI, 0x0108 => PciFullClass::MassStorage_NVM, 0x0180 => PciFullClass::MassStorage_Other, 0x0200 => PciFullClass::Network_Ethernet, 0x0201 => PciFullClass::Network_TokenRing, 0x0202 => PciFullClass::Network_FDDI, 0x0203 => PciFullClass::Network_ATM, 0x0204 => PciFullClass::Network_ISDN, 0x0205 => PciFullClass::Network_WorldFlip, 0x0206 => PciFullClass::Network_PICMG, 0x0207 => PciFullClass::Network_Infiniband, 0x0208 => PciFullClass::Network_Fabric, 0x0280 => PciFullClass::Network_Other, 0x0300 => PciFullClass::Display_VGA, 0x0301 => PciFullClass::Display_XGA, 0x0302 => PciFullClass::Display_3D, 0x0380 => PciFullClass::Display_Other, 0x0400 => PciFullClass::Multimedia_Video, 0x0401 => PciFullClass::Multimedia_AudioController, 0x0402 => PciFullClass::Multimedia_Telephony, 0x0403 => PciFullClass::Multimedia_AudioDevice, 0x0480 => PciFullClass::Multimedia_Other, 0x0500 => PciFullClass::Memory_RAM, 0x0501 => PciFullClass::Memory_Flash, 0x0580 => PciFullClass::Memory_Other, 0x0600 => PciFullClass::Bridge_Host, 0x0601 => PciFullClass::Bridge_ISA, 0x0602 => PciFullClass::Bridge_EISA, 0x0603 => PciFullClass::Bridge_MCA, 0x0604 => PciFullClass::Bridge_PciToPci, 0x0605 => PciFullClass::Bridge_PCMCIA, 0x0606 => PciFullClass::Bridge_NuBus, 0x0607 => PciFullClass::Bridge_CardBus, 0x0608 => PciFullClass::Bridge_RACEway, 0x0609 => PciFullClass::Bridge_PciToPciSemiTransparent, 0x060A => PciFullClass::Bridge_InfinibandToPci, 0x0680 => PciFullClass::Bridge_Other, _ => PciFullClass::Unknown, } } /// Convert a PciFullClass to its u16 representation pub fn as_u16(&self) -> u16 { *self as u16 } } impl From for PciFullClass { /// Convert a u16 into the corresponding PciFullClass fn from(n: u16) -> Self { Self::from_u16(n) } } impl Display for PciFullClass { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, " Class: ")?; match self { PciFullClass::Unclassified_NonVgaCompatible => write!(f, "\u{001A}LIGHTBLUE\u{001A}")?, PciFullClass::Unclassified_VgaCompatible => write!(f, "\u{001A}LIGHTBLUE\u{001A}")?, PciFullClass::MassStorage_ScsiBus => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_IDE => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_Floppy => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_IpiBus => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_RAID => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_ATA => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_SATA => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_SerialSCSI => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_NVM => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::MassStorage_Other => write!(f, "\u{001A}CYAN\u{001A}")?, PciFullClass::Network_Ethernet => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_TokenRing => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_FDDI => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_ATM => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_ISDN => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_WorldFlip => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_PICMG => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_Infiniband => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_Fabric => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Network_Other => write!(f, "\u{001A}MAGENTA\u{001A}")?, PciFullClass::Display_VGA => write!(f, "\u{001A}YELLOW\u{001A}")?, PciFullClass::Display_XGA => write!(f, "\u{001A}YELLOW\u{001A}")?, PciFullClass::Display_3D => write!(f, "\u{001A}YELLOW\u{001A}")?, PciFullClass::Display_Other => write!(f, "\u{001A}YELLOW\u{001A}")?, PciFullClass::Multimedia_Video => write!(f, "\u{001A}LIGHTBLUE\u{001A}")?, PciFullClass::Multimedia_AudioController => write!(f, "\u{001A}LIGHTBLUE\u{001A}")?, PciFullClass::Multimedia_Telephony => write!(f, "\u{001A}LIGHTBLUE\u{001A}")?, PciFullClass::Multimedia_AudioDevice => write!(f, "\u{001A}LIGHTBLUE\u{001A}")?, PciFullClass::Multimedia_Other => write!(f, "\u{001A}LIGHTBLUE\u{001A}")?, PciFullClass::Memory_RAM => write!(f, "\u{001A}BLUE\u{001A}")?, PciFullClass::Memory_Flash => write!(f, "\u{001A}WHITE\u{001A}")?, PciFullClass::Memory_Other => write!(f, "\u{001A}LIGHTGREY\u{001A}")?, PciFullClass::Bridge_Host => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_ISA => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_EISA => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_MCA => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_PciToPci => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_PCMCIA => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_NuBus => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_CardBus => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_RACEway => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_PciToPciSemiTransparent => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_InfinibandToPci => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Bridge_Other => write!(f, "\u{001A}GREEN\u{001A}")?, PciFullClass::Unknown => write!(f, "\u{001A}RED\u{001A}")?, } write!( f, "{:?} ({:#06X})\u{001A}RESET\u{001A}", self, self.as_u16() )?; Ok(()) } }