diff --git a/pci/src/bus.rs b/pci/src/bus.rs index 7cad62d8a..c29f5bd85 100644 --- a/pci/src/bus.rs +++ b/pci/src/bus.rs @@ -34,6 +34,8 @@ pub enum PciRootError { NoPciDeviceSlotAvailable, /// Invalid PCI device identifier provided. InvalidPciDeviceSlot(usize), + /// Valid PCI device identifier but already used. + AlreadyInUsePciDeviceSlot(usize), } pub type Result = std::result::Result; @@ -155,6 +157,19 @@ impl PciBus { Err(PciRootError::NoPciDeviceSlotAvailable) } + pub fn get_device_id(&mut self, id: usize) -> Result<()> { + if id < NUM_DEVICE_IDS { + if !self.device_ids[id] { + self.device_ids[id] = true; + Ok(()) + } else { + Err(PciRootError::AlreadyInUsePciDeviceSlot(id)) + } + } else { + Err(PciRootError::InvalidPciDeviceSlot(id)) + } + } + pub fn put_device_id(&mut self, id: usize) -> Result<()> { if id < NUM_DEVICE_IDS { self.device_ids[id] = false;