BusDevice trait functions currently holds a mutable reference to self, and exclusive access is guaranteed by taking a Mutex when dispatched by the Bus object. However, this prevents individual devices from serving accesses that do not require an mutable reference or is better served with different synchronization primitives. We switch Bus to dispatch via BusDeviceSync, which holds a shared reference, and delegate locking to the BusDeviceSync trait implementation for Mutex<BusDevice>. Other changes are made to make use of the dyn BusDeviceSync trait object. Signed-off-by: Yuanchu Xie <yuanchu@google.com>
60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
// Copyright © 2020 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
mod bus;
|
|
pub mod dma_mapping;
|
|
pub mod interrupt;
|
|
|
|
pub use self::bus::{Bus, BusDevice, BusDeviceSync, Error as BusError};
|
|
|
|
/// Type of Message Signalled Interrupt
|
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
|
pub enum MsiIrqType {
|
|
/// PCI MSI IRQ numbers.
|
|
PciMsi,
|
|
/// PCI MSIx IRQ numbers.
|
|
PciMsix,
|
|
/// Generic MSI IRQ numbers.
|
|
GenericMsi,
|
|
}
|
|
|
|
#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
|
|
pub enum PciBarType {
|
|
Io,
|
|
Mmio32,
|
|
Mmio64,
|
|
}
|
|
|
|
/// Enumeration for device resources.
|
|
#[allow(missing_docs)]
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
pub enum Resource {
|
|
/// IO Port address range.
|
|
PioAddressRange { base: u16, size: u16 },
|
|
/// Memory Mapped IO address range.
|
|
MmioAddressRange { base: u64, size: u64 },
|
|
/// PCI BAR
|
|
PciBar {
|
|
index: usize,
|
|
base: u64,
|
|
size: u64,
|
|
type_: PciBarType,
|
|
prefetchable: bool,
|
|
},
|
|
/// Legacy IRQ number.
|
|
LegacyIrq(u32),
|
|
/// Message Signaled Interrupt
|
|
MsiIrq {
|
|
ty: MsiIrqType,
|
|
base: u32,
|
|
size: u32,
|
|
},
|
|
/// Network Interface Card MAC address.
|
|
MacAddress(String),
|
|
/// KVM memslot index.
|
|
KvmMemSlot(u32),
|
|
}
|