Updates for virtio-drivers 0.8.
Test: m pvmfw
Change-Id: I7a70f1718600fe866b5b4034dd8ab8d079bcada1
diff --git a/libs/libvmbase/src/fdt/pci.rs b/libs/libvmbase/src/fdt/pci.rs
index 44ad455..b526f3d 100644
--- a/libs/libvmbase/src/fdt/pci.rs
+++ b/libs/libvmbase/src/fdt/pci.rs
@@ -18,7 +18,7 @@
use libfdt::{AddressRange, Fdt, FdtError, FdtNode};
use log::debug;
use thiserror::Error;
-use virtio_drivers::transport::pci::bus::{Cam, PciRoot};
+use virtio_drivers::transport::pci::bus::{Cam, ConfigurationAccess, MmioCam, PciRoot};
/// PCI MMIO configuration region size.
const PCI_CFG_SIZE: usize = 0x100_0000;
@@ -94,10 +94,10 @@
/// To prevent concurrent access, only one `PciRoot` should exist in the program. Thus this
/// method must only be called once, and there must be no other `PciRoot` constructed using the
/// same CAM.
- pub unsafe fn make_pci_root(&self) -> PciRoot {
+ pub unsafe fn make_pci_root(&self) -> PciRoot<impl ConfigurationAccess> {
// SAFETY: We trust that the FDT gave us a valid MMIO base address for the CAM. The caller
// guarantees to only call us once, so there are no other references to it.
- unsafe { PciRoot::new(self.cam_range.start as *mut u8, Cam::MmioCam) }
+ PciRoot::new(unsafe { MmioCam::new(self.cam_range.start as *mut u8, Cam::MmioCam) })
}
}
diff --git a/libs/libvmbase/src/virtio/pci.rs b/libs/libvmbase/src/virtio/pci.rs
index ec89b6b..591ae54 100644
--- a/libs/libvmbase/src/virtio/pci.rs
+++ b/libs/libvmbase/src/virtio/pci.rs
@@ -26,7 +26,7 @@
use virtio_drivers::{
device::{blk, socket},
transport::pci::{
- bus::{BusDeviceIterator, PciRoot},
+ bus::{BusDeviceIterator, ConfigurationAccess, PciRoot},
virtio_device_type, PciTransport,
},
Hal,
@@ -66,7 +66,7 @@
/// 3. Creates and returns a `PciRoot`.
///
/// This must only be called once and after having switched to the dynamic page tables.
-pub fn initialize(pci_info: PciInfo) -> Result<PciRoot, PciError> {
+pub fn initialize(pci_info: PciInfo) -> Result<PciRoot<impl ConfigurationAccess>, PciError> {
PCI_INFO.set(Box::new(pci_info.clone())).map_err(|_| PciError::DuplicateInitialization)?;
let cam_start = pci_info.cam_range.start;
@@ -90,21 +90,21 @@
pub type VirtIOSocket<T> = socket::VirtIOSocket<T, PciTransport>;
/// An iterator that iterates over the PCI transport for each device.
-pub struct PciTransportIterator<'a, T: Hal> {
- pci_root: &'a mut PciRoot,
- bus: BusDeviceIterator,
+pub struct PciTransportIterator<'a, T: Hal, C: ConfigurationAccess> {
+ pci_root: &'a mut PciRoot<C>,
+ bus: BusDeviceIterator<C>,
_hal: PhantomData<T>,
}
-impl<'a, T: Hal> PciTransportIterator<'a, T> {
+impl<'a, T: Hal, C: ConfigurationAccess> PciTransportIterator<'a, T, C> {
/// Creates a new iterator.
- pub fn new(pci_root: &'a mut PciRoot) -> Self {
+ pub fn new(pci_root: &'a mut PciRoot<C>) -> Self {
let bus = pci_root.enumerate_bus(0);
Self { pci_root, bus, _hal: PhantomData }
}
}
-impl<'a, T: Hal> Iterator for PciTransportIterator<'a, T> {
+impl<'a, T: Hal, C: ConfigurationAccess> Iterator for PciTransportIterator<'a, T, C> {
type Item = PciTransport;
fn next(&mut self) -> Option<Self::Item> {
@@ -121,7 +121,7 @@
};
debug!(" VirtIO {:?}", virtio_type);
- return PciTransport::new::<T>(self.pci_root, device_function).ok();
+ return PciTransport::new::<T, C>(self.pci_root, device_function).ok();
}
}
}