diff options
author | Gurchetan Singh <gurchetansingh@chromium.org> | 2019-02-20 18:56:22 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-03-01 01:08:28 -0800 |
commit | e32a6c9b930166a7e64cc9200abb4279eb097c56 (patch) | |
tree | ab801543fd8343a7cb0d63e675c81c640adbad77 /devices/src/virtio/virtio_pci_device.rs | |
parent | ebc156186b6263c06deee7f361d7e558d352c2e0 (diff) | |
download | crosvm-e32a6c9b930166a7e64cc9200abb4279eb097c56.tar crosvm-e32a6c9b930166a7e64cc9200abb4279eb097c56.tar.gz crosvm-e32a6c9b930166a7e64cc9200abb4279eb097c56.tar.bz2 crosvm-e32a6c9b930166a7e64cc9200abb4279eb097c56.tar.lz crosvm-e32a6c9b930166a7e64cc9200abb4279eb097c56.tar.xz crosvm-e32a6c9b930166a7e64cc9200abb4279eb097c56.tar.zst crosvm-e32a6c9b930166a7e64cc9200abb4279eb097c56.zip |
devices: PCI: use configuration callback
Not sure if adding the device addresses to the mmio bus is the desired behavior, but it seems to work. BUG=chromium:924405 TEST=boot VM Change-Id: I7f6057b3e7d041a52b251af1203353ba7a0d3c22 Reviewed-on: https://chromium-review.googlesource.com/1480743 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> 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 | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/devices/src/virtio/virtio_pci_device.rs b/devices/src/virtio/virtio_pci_device.rs index bdd10c2..e764569 100644 --- a/devices/src/virtio/virtio_pci_device.rs +++ b/devices/src/virtio/virtio_pci_device.rs @@ -329,6 +329,31 @@ impl PciDevice for VirtioPciDevice { Ok(ranges) } + fn allocate_device_bars( + &mut self, + resources: &mut SystemAllocator, + ) -> std::result::Result<Vec<(u64, u64)>, PciDeviceError> { + let mut ranges = Vec::new(); + let configs = self.device.get_device_bars(); + match configs { + Some(configs) => { + for mut config in configs { + let device_addr = resources + .allocate_device_addresses(config.get_size()) + .ok_or(PciDeviceError::IoAllocationFailed(config.get_size()))?; + config.set_address(device_addr); + let _device_bar = self + .config_regs + .add_pci_bar(&config) + .ok_or(PciDeviceError::IoRegistrationFailed(device_addr))?; + ranges.push((device_addr, config.get_size())); + } + } + None => (), + }; + Ok(ranges) + } + fn ioeventfds(&self) -> Vec<(&EventFd, u64, Datamatch)> { let bar0 = self.config_regs.get_bar_addr(self.settings_bar as usize) as u64; let notify_base = bar0 + NOTIFICATION_BAR_OFFSET; |