summary refs log tree commit diff
path: root/devices/src/virtio/virtio_pci_device.rs
diff options
context:
space:
mode:
authorGurchetan Singh <gurchetansingh@chromium.org>2019-02-20 18:56:22 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-03-01 01:08:28 -0800
commite32a6c9b930166a7e64cc9200abb4279eb097c56 (patch)
treeab801543fd8343a7cb0d63e675c81c640adbad77 /devices/src/virtio/virtio_pci_device.rs
parentebc156186b6263c06deee7f361d7e558d352c2e0 (diff)
downloadcrosvm-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.rs25
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;