#[path = "../../../os-pci-discovery/src/lib.rs"] mod pci_discovery; use pci_discovery::{ClaimTable, EcamWindow, Error, BUS_BYTES}; #[test] fn os_pci_discovery_ecam_positive() { let window = EcamWindow::new(0x40_1000_0000, 256 * BUS_BYTES, 0, 255).unwrap(); assert_eq!((window.base(), window.size(), window.first_bus(), window.last_bus()), (0x40_1000_0000, 256 * BUS_BYTES, 0, 255)); let mut claims = ClaimTable::<2>::new(); let address = claims.claim(window, 0, 1, 0, 0).unwrap(); assert_eq!(address.physical, 0x40_1000_8000); assert_eq!((address.bus, address.device, address.function, address.register), (0, 1, 0, 0)); assert_eq!(claims.snapshot().entries, [Some(address), None]); assert_eq!(claims.count(), 1); let last = window.address(255, 31, 7, 4092).unwrap(); assert_eq!(last.physical, window.base() + window.size() - 4); assert_eq!(claims.count(), 1); claims.release(address).unwrap(); assert_eq!(claims.snapshot().entries, [None, None]); assert_eq!(claims.count(), 0); } #[test] fn os_pci_discovery_ecam_negative() { let narrow = EcamWindow::new(0x40_1000_0000, BUS_BYTES, 0, 0).unwrap(); let mut claims = ClaimTable::<1>::new(); let healthy = claims.claim(narrow, 0, 1, 0, 0).unwrap(); let before = claims.snapshot(); assert_eq!(claims.claim(narrow, 255, 0, 0, 0), Err(Error::BusOutOfRange)); assert_eq!(claims.snapshot(), before); assert_eq!(claims.claim(narrow, 256, 0, 0, 0), Err(Error::BusOutOfRange)); assert_eq!(claims.claim(narrow, 0, 32, 0, 0), Err(Error::DeviceOutOfRange)); assert_eq!(claims.claim(narrow, 0, 1, 8, 0), Err(Error::FunctionOutOfRange)); assert_eq!(claims.claim(narrow, 0, 1, 0, 4096), Err(Error::RegisterOutOfRange)); assert_eq!(claims.claim(narrow, 0, 1, 0, 2), Err(Error::RegisterOutOfRange)); assert_eq!(claims.snapshot(), before); assert_eq!(claims.claim(narrow, 0, 1, 0, 0), Err(Error::DuplicateClaim)); assert_eq!(claims.claim(narrow, 0, 2, 0, 0), Err(Error::Full)); assert_eq!(claims.snapshot(), before); assert_eq!(narrow.address(0, 1, 0, 0).unwrap(), healthy); claims.release(healthy).unwrap(); assert_eq!(claims.count(), 0); assert_eq!(claims.release(healthy), Err(Error::UnknownClaim)); assert_eq!(claims.count(), 0); } #[test] fn os_pci_discovery_ecam_window_validation() { assert_eq!(EcamWindow::new(0x40_1000_0001, BUS_BYTES, 0, 0), Err(Error::InvalidWindow)); assert_eq!(EcamWindow::new(0x40_1000_0000, BUS_BYTES - 1, 0, 0), Err(Error::InvalidWindow)); assert_eq!(EcamWindow::new(0x40_1000_0000, BUS_BYTES, 0, 1), Err(Error::InvalidWindow)); assert_eq!(EcamWindow::new(0x40_1000_0000, BUS_BYTES, 1, 0), Err(Error::InvalidWindow)); assert_eq!(EcamWindow::new(u64::MAX - BUS_BYTES + 1, BUS_BYTES, 0, 0), Err(Error::AddressOverflow)); }