diff options
author | Dylan Reid <dgreid@chromium.org> | 2019-03-03 00:19:52 +0000 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-03-06 15:33:43 -0800 |
commit | 4a63b6876185da3027879d3c9d199d776cfe546a (patch) | |
tree | 10aa1a0150205dbec7ad8abe3b3522d364df048f /devices/src/virtio/virtio_pci_device.rs | |
parent | 52c48ae54380c27683569aaf070fbd0f850f62ed (diff) | |
download | crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.gz crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.bz2 crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.lz crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.xz crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.tar.zst crosvm-4a63b6876185da3027879d3c9d199d776cfe546a.zip |
PCI: Return results from pci setup functions
Enough failure cases have been added to `add_pci_bar` and `add_pci_capabilities` that they should return unique errors instead of an `Option`. BUG=none TEST=cargo test in devices Signed-off-by: Dylan Reid <dgreid@chromium.org> Change-Id: Ice2a06d2944011f95707f113f9d709da15c90cfe Reviewed-on: https://chromium-review.googlesource.com/1497740 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'devices/src/virtio/virtio_pci_device.rs')
-rw-r--r-- | devices/src/virtio/virtio_pci_device.rs | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/devices/src/virtio/virtio_pci_device.rs b/devices/src/virtio/virtio_pci_device.rs index e764569..bfff317 100644 --- a/devices/src/virtio/virtio_pci_device.rs +++ b/devices/src/virtio/virtio_pci_device.rs @@ -231,7 +231,10 @@ impl VirtioPciDevice { } } - fn add_pci_capabilities(&mut self, settings_bar: u8) { + fn add_pci_capabilities( + &mut self, + settings_bar: u8, + ) -> std::result::Result<(), PciDeviceError> { // Add pointers to the different configuration structures from the PCI capabilities. let common_cap = VirtioPciCap::new( PciCapabilityType::CommonConfig, @@ -239,7 +242,9 @@ impl VirtioPciDevice { COMMON_CONFIG_BAR_OFFSET as u32, COMMON_CONFIG_SIZE as u32, ); - self.config_regs.add_capability(&common_cap); + self.config_regs + .add_capability(&common_cap) + .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?; let isr_cap = VirtioPciCap::new( PciCapabilityType::IsrConfig, @@ -247,7 +252,9 @@ impl VirtioPciDevice { ISR_CONFIG_BAR_OFFSET as u32, ISR_CONFIG_SIZE as u32, ); - self.config_regs.add_capability(&isr_cap); + self.config_regs + .add_capability(&isr_cap) + .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?; // TODO(dgreid) - set based on device's configuration size? let device_cap = VirtioPciCap::new( @@ -256,7 +263,9 @@ impl VirtioPciDevice { DEVICE_CONFIG_BAR_OFFSET as u32, DEVICE_CONFIG_SIZE as u32, ); - self.config_regs.add_capability(&device_cap); + self.config_regs + .add_capability(&device_cap) + .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?; let notify_cap = VirtioPciNotifyCap::new( PciCapabilityType::NotifyConfig, @@ -265,13 +274,18 @@ impl VirtioPciDevice { NOTIFICATION_SIZE as u32, Le32::from(NOTIFY_OFF_MULTIPLIER), ); - self.config_regs.add_capability(¬ify_cap); + self.config_regs + .add_capability(¬ify_cap) + .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?; //TODO(dgreid) - How will the configuration_cap work? let configuration_cap = VirtioPciCap::new(PciCapabilityType::PciConfig, 0, 0, 0); - self.config_regs.add_capability(&configuration_cap); + self.config_regs + .add_capability(&configuration_cap) + .map_err(|e| PciDeviceError::CapabilitiesSetup(e))?; self.settings_bar = settings_bar; + Ok(()) } } @@ -319,12 +333,12 @@ impl PciDevice for VirtioPciDevice { let settings_bar = self .config_regs .add_pci_bar(&config) - .ok_or(PciDeviceError::IoRegistrationFailed(settings_config_addr))? + .map_err(|e| PciDeviceError::IoRegistrationFailed(settings_config_addr, e))? as u8; ranges.push((settings_config_addr, CAPABILITY_BAR_SIZE)); // Once the BARs are allocated, the capabilities can be added to the PCI configuration. - self.add_pci_capabilities(settings_bar); + self.add_pci_capabilities(settings_bar)?; Ok(ranges) } @@ -345,7 +359,7 @@ impl PciDevice for VirtioPciDevice { let _device_bar = self .config_regs .add_pci_bar(&config) - .ok_or(PciDeviceError::IoRegistrationFailed(device_addr))?; + .map_err(|e| PciDeviceError::IoRegistrationFailed(device_addr, e))?; ranges.push((device_addr, config.get_size())); } } |