PCI: revision id, programming interface byte and device ID

This commit is contained in:
TheOddGarlic 2022-08-08 13:36:39 +03:00
parent 86b0ac95aa
commit b8f0074aa0

View file

@ -32,6 +32,8 @@ pub struct PciDeviceInfo {
pub bus: u8, pub bus: u8,
pub device_id: DeviceID, pub device_id: DeviceID,
pub full_class: PciFullClass, pub full_class: PciFullClass,
pub prog_if: u8,
pub rev_id: u8,
pub header_type: u8, pub header_type: u8,
pub bars: [u32; 6], pub bars: [u32; 6],
pub supported_fns: [bool; 8], pub supported_fns: [bool; 8],
@ -51,13 +53,16 @@ impl PciDeviceInfo {
impl Display for PciDeviceInfo { impl Display for PciDeviceInfo {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
let vendor_name = &self.device_id.vendor; let vendor_name = &self.device_id.vendor;
let device_id = &self.device_id.id;
writeln!( writeln!(
f, f,
"Device {} | Bus {:X} | Vendor: {}", "Device: {} | Bus: 0x{:X} | Vendor: {} | Device ID: 0x{:X}",
self.device, self.bus, vendor_name self.device, self.bus, vendor_name, device_id,
)?; )?;
writeln!(f, "{}", self.full_class)?; writeln!(f, "{}", self.full_class)?;
writeln!(f, " Header type: {:X}", self.header_type)?; writeln!(f, " Revision ID: {}", self.rev_id)?;
writeln!(f, " Prog IF: 0b{:b}", self.prog_if)?;
writeln!(f, " Header type: 0x{:X}", self.header_type)?;
write!(f, " Supported functions: 0")?; write!(f, " Supported functions: 0")?;
for (i, b) in self.supported_fns.iter().enumerate().skip(1) { for (i, b) in self.supported_fns.iter().enumerate().skip(1) {
if *b { if *b {
@ -110,9 +115,11 @@ fn check_device(bus: u8, device: u8) -> Option<PciDeviceInfo> {
return None; return None;
} }
let class = unsafe { pci_config_read(bus, device, 0, 0x8) }; let reg2 = unsafe { pci_config_read(bus, device, 0, 0x8) };
let class = (class >> 16) & 0x0000FFFF; let rev_id = (reg2 & 0x000000FF) as u8;
let pci_class = PciFullClass::from_u16(class as u16); let prog_if = ((reg2 >> 8) & 0x000000FF) as u8;
let class = ((reg2 >> 16) & 0x0000FFFF) as u16;
let pci_class = PciFullClass::from_u16(class);
let header_type = get_header_type(bus, device, function); let header_type = get_header_type(bus, device, function);
let mut supported_fns = [true, false, false, false, false, false, false, false]; let mut supported_fns = [true, false, false, false, false, false, false, false];
@ -148,6 +155,8 @@ fn check_device(bus: u8, device: u8) -> Option<PciDeviceInfo> {
}, },
// vendor_id, // vendor_id,
full_class: pci_class, full_class: pci_class,
prog_if,
rev_id,
header_type, header_type,
bars, bars,
supported_fns, supported_fns,