use crate::PciInfoError;
use super::pci_config_buffer::PciConfigBuffer;
#[derive(Clone, Debug)]
pub struct PciCommonHeader {
pub device_id: u16,
pub vendor_id: u16,
pub status: u16,
pub command: u16,
pub class_code: u8,
pub subclass_code: u8,
pub prog_iface_code: u8,
pub revision_id: u8,
pub bist: u8,
pub header_type: u8,
pub latency_timer: u8,
pub cache_line_size: u8,
}
impl PciCommonHeader {
pub const MAX_HEADER_LEN: usize = super::PciToCardbusBridgeHeader::LENGTH;
pub const COMMON_HEADER_LEN: usize = 16;
pub fn with_bytes(bytes: &[u8]) -> Result<Self, PciInfoError> {
Self::with_pci_cfg(&PciConfigBuffer::new(bytes, 0))
}
fn with_pci_cfg(pci_cfg: &PciConfigBuffer<'_>) -> Result<Self, PciInfoError> {
pci_cfg.assert_registers_available(0, 3)?;
Ok(Self {
vendor_id: pci_cfg.read_u16_lo(0),
device_id: pci_cfg.read_u16_hi(0),
command: pci_cfg.read_u16_lo(1),
status: pci_cfg.read_u16_hi(1),
revision_id: pci_cfg.read_u8(2, 0),
prog_iface_code: pci_cfg.read_u8(2, 1),
subclass_code: pci_cfg.read_u8(2, 2),
class_code: pci_cfg.read_u8(2, 3),
cache_line_size: pci_cfg.read_u8(3, 0),
latency_timer: pci_cfg.read_u8(3, 1),
header_type: pci_cfg.read_u8(3, 2),
bist: pci_cfg.read_u8(3, 3),
})
}
}