use crate::PciInfoError;
use super::pci_config_buffer::PciConfigBuffer;
#[derive(Clone, Debug)]
pub struct PciGenericDeviceHeader {
pub base_addr: [u32; 6],
pub cardbus_cis_ptr: u32,
pub subsystem_device_id: u16,
pub subsystem_vendor_id: u16,
pub expansion_rom_base_addr: u32,
pub capabilities_ptr: u16,
pub max_latency: u8,
pub min_grant: u8,
pub interrupt_pin: u8,
pub interrupt_line: u8,
}
impl PciGenericDeviceHeader {
pub const LENGTH: usize = 64;
pub const ID: u8 = 0;
pub(super) fn with_pci_cfg(pci_cfg: &PciConfigBuffer<'_>) -> Result<Self, PciInfoError> {
pci_cfg.assert_registers_available(4, 0xF)?;
Ok(Self {
base_addr: [
pci_cfg.read_u32(0x4),
pci_cfg.read_u32(0x5),
pci_cfg.read_u32(0x6),
pci_cfg.read_u32(0x7),
pci_cfg.read_u32(0x8),
pci_cfg.read_u32(0x9),
],
cardbus_cis_ptr: pci_cfg.read_u32(0xA),
subsystem_device_id: pci_cfg.read_u16_hi(0xB),
subsystem_vendor_id: pci_cfg.read_u16_lo(0xB),
expansion_rom_base_addr: pci_cfg.read_u32(0xC),
capabilities_ptr: pci_cfg.read_u16_hi(0xD),
max_latency: pci_cfg.read_u8(0xF, 3),
min_grant: pci_cfg.read_u8(0xF, 2),
interrupt_pin: pci_cfg.read_u8(0xF, 1),
interrupt_line: pci_cfg.read_u8(0xF, 0),
})
}
}