diff options
author | Tomasz Jeznach <tjeznach@chromium.org> | 2020-04-29 12:58:11 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-05-01 05:49:39 +0000 |
commit | da0e0f939b731d89d067fb9382bbdc05e47f4067 (patch) | |
tree | 1233cb599fb9aa82c004f77a42692a0fd8728b62 /devices/src/virtio | |
parent | a4dd4af5de2d260b307eff873f5c5eb194f4ba57 (diff) | |
download | crosvm-da0e0f939b731d89d067fb9382bbdc05e47f4067.tar crosvm-da0e0f939b731d89d067fb9382bbdc05e47f4067.tar.gz crosvm-da0e0f939b731d89d067fb9382bbdc05e47f4067.tar.bz2 crosvm-da0e0f939b731d89d067fb9382bbdc05e47f4067.tar.lz crosvm-da0e0f939b731d89d067fb9382bbdc05e47f4067.tar.xz crosvm-da0e0f939b731d89d067fb9382bbdc05e47f4067.tar.zst crosvm-da0e0f939b731d89d067fb9382bbdc05e47f4067.zip |
devices: pci: refactor PCI devices to use PciAddress.
Simple refactor of PCI device addressing to use PciAddress type providing bus:device.function number. BUG=None TEST=build_test & tast run crostini.Sanity Change-Id: I7755ad6b31aa8c882475cd8212630e1cc86ef49e Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2172766 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Tomasz Jeznach <tjeznach@chromium.org>
Diffstat (limited to 'devices/src/virtio')
-rw-r--r-- | devices/src/virtio/gpu/mod.rs | 11 | ||||
-rw-r--r-- | devices/src/virtio/virtio_device.rs | 4 | ||||
-rw-r--r-- | devices/src/virtio/virtio_pci_device.rs | 40 |
3 files changed, 32 insertions, 23 deletions
diff --git a/devices/src/virtio/gpu/mod.rs b/devices/src/virtio/gpu/mod.rs index e8e7f4a..7ba800e 100644 --- a/devices/src/virtio/gpu/mod.rs +++ b/devices/src/virtio/gpu/mod.rs @@ -42,7 +42,9 @@ use self::virtio_2d_backend::Virtio2DBackend; use self::virtio_3d_backend::Virtio3DBackend; #[cfg(feature = "gfxstream")] use self::virtio_gfxstream_backend::VirtioGfxStreamBackend; -use crate::pci::{PciBarConfiguration, PciBarPrefetchable, PciBarRegionType, PciCapability}; +use crate::pci::{ + PciAddress, PciBarConfiguration, PciBarPrefetchable, PciBarRegionType, PciCapability, +}; use vm_control::VmMemoryControlRequestSocket; @@ -1206,10 +1208,11 @@ impl VirtioDevice for Gpu { } // Require 1 BAR for mapping 3D buffers - fn get_device_bars(&mut self, bus: u8, dev: u8) -> Vec<PciBarConfiguration> { + fn get_device_bars(&mut self, address: PciAddress) -> Vec<PciBarConfiguration> { self.pci_bar = Some(Alloc::PciBar { - bus, - dev, + bus: address.bus, + dev: address.dev, + func: address.func, bar: GPU_BAR_NUM, }); vec![PciBarConfiguration::new( diff --git a/devices/src/virtio/virtio_device.rs b/devices/src/virtio/virtio_device.rs index 6eb5548..7c07651 100644 --- a/devices/src/virtio/virtio_device.rs +++ b/devices/src/virtio/virtio_device.rs @@ -7,7 +7,7 @@ use std::os::unix::io::RawFd; use sys_util::{EventFd, GuestMemory}; use super::*; -use crate::pci::{MsixStatus, PciBarConfiguration, PciCapability}; +use crate::pci::{MsixStatus, PciAddress, PciBarConfiguration, PciCapability}; /// Trait for virtio devices to be driven by a virtio transport. /// @@ -75,7 +75,7 @@ pub trait VirtioDevice: Send { } /// Returns any additional BAR configuration required by the device. - fn get_device_bars(&mut self, _bus: u8, _dev: u8) -> Vec<PciBarConfiguration> { + fn get_device_bars(&mut self, _address: PciAddress) -> Vec<PciBarConfiguration> { Vec::new() } diff --git a/devices/src/virtio/virtio_pci_device.rs b/devices/src/virtio/virtio_pci_device.rs index 61409f3..eb91e58 100644 --- a/devices/src/virtio/virtio_pci_device.rs +++ b/devices/src/virtio/virtio_pci_device.rs @@ -15,10 +15,10 @@ use sys_util::{warn, EventFd, GuestMemory, Result}; use super::*; use crate::pci::{ - MsixCap, MsixConfig, PciBarConfiguration, PciCapability, PciCapabilityID, PciClassCode, - PciConfiguration, PciDevice, PciDeviceError, PciHeaderType, PciInterruptPin, PciSubclass, + MsixCap, MsixConfig, PciAddress, PciBarConfiguration, PciCapability, PciCapabilityID, + PciClassCode, PciConfiguration, PciDevice, PciDeviceError, PciHeaderType, PciInterruptPin, + PciSubclass, }; - use vm_control::VmIrqRequestSocket; use self::virtio_pci_common_config::VirtioPciCommonConfig; @@ -211,7 +211,7 @@ const VIRTIO_PCI_DEVICE_ID_BASE: u16 = 0x1040; // Add to device type to get devi /// transport for virtio devices. pub struct VirtioPciDevice { config_regs: PciConfiguration, - pci_bus_dev: Option<(u8, u8)>, + pci_address: Option<PciAddress>, device: Box<dyn VirtioDevice>, device_activated: bool, @@ -269,7 +269,7 @@ impl VirtioPciDevice { Ok(VirtioPciDevice { config_regs, - pci_bus_dev: None, + pci_address: None, device, device_activated: false, interrupt_status: Arc::new(AtomicUsize::new(0)), @@ -392,8 +392,8 @@ impl PciDevice for VirtioPciDevice { format!("virtio-pci ({})", self.device.debug_label()) } - fn assign_bus_dev(&mut self, bus: u8, device: u8) { - self.pci_bus_dev = Some((bus, device)); + fn assign_address(&mut self, address: PciAddress) { + self.pci_address = Some(address); } fn keep_fds(&self) -> Vec<RawFd> { @@ -425,16 +425,21 @@ impl PciDevice for VirtioPciDevice { &mut self, resources: &mut SystemAllocator, ) -> std::result::Result<Vec<(u64, u64)>, PciDeviceError> { - let (bus, dev) = self - .pci_bus_dev - .expect("assign_bus_dev must be called prior to allocate_io_bars"); + let address = self + .pci_address + .expect("assign_address must be called prior to allocate_io_bars"); // Allocate one bar for the structures pointed to by the capability structures. let mut ranges = Vec::new(); let settings_config_addr = resources .mmio_allocator(MmioType::Low) .allocate_with_align( CAPABILITY_BAR_SIZE, - Alloc::PciBar { bus, dev, bar: 0 }, + Alloc::PciBar { + bus: address.bus, + dev: address.dev, + func: address.func, + bar: 0, + }, format!( "virtio-{}-cap_bar", type_to_str(self.device.device_type()).unwrap_or("?") @@ -463,18 +468,19 @@ impl PciDevice for VirtioPciDevice { &mut self, resources: &mut SystemAllocator, ) -> std::result::Result<Vec<(u64, u64)>, PciDeviceError> { - let (bus, dev) = self - .pci_bus_dev - .expect("assign_bus_dev must be called prior to allocate_device_bars"); + let address = self + .pci_address + .expect("assign_address must be called prior to allocate_device_bars"); let mut ranges = Vec::new(); - for config in self.device.get_device_bars(bus, dev) { + for config in self.device.get_device_bars(address) { let device_addr = resources .mmio_allocator(MmioType::High) .allocate_with_align( config.get_size(), Alloc::PciBar { - bus, - dev, + bus: address.bus, + dev: address.dev, + func: address.func, bar: config.get_register_index() as u8, }, format!( |