mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-22 08:53:29 +00:00
Move virtio-mmio bus outside OSTD
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
238b89da46
commit
a3c5ab8cb4
@ -24,5 +24,9 @@ component = { path = "../../libs/comp-sys/component" }
|
||||
log = "0.4"
|
||||
int-to-c-enum = { path = "../../libs/int-to-c-enum" }
|
||||
|
||||
[features]
|
||||
all = ["cvm_guest"]
|
||||
cvm_guest = ["ostd/cvm_guest"]
|
||||
|
||||
[lints]
|
||||
workspace = true
|
||||
|
@ -2,14 +2,12 @@
|
||||
|
||||
//! MMIO bus.
|
||||
|
||||
#![expect(unused_variables)]
|
||||
|
||||
use alloc::{collections::VecDeque, fmt::Debug, sync::Arc, vec::Vec};
|
||||
|
||||
use log::{debug, error};
|
||||
use ostd::bus::BusProbeError;
|
||||
|
||||
use super::common_device::MmioCommonDevice;
|
||||
use crate::bus::BusProbeError;
|
||||
|
||||
/// MMIO device trait
|
||||
pub trait MmioDevice: Sync + Send + Debug {
|
||||
@ -45,7 +43,7 @@ impl MmioBus {
|
||||
pub fn register_driver(&mut self, driver: Arc<dyn MmioDriver>) {
|
||||
debug!("Register driver:{:#x?}", driver);
|
||||
let length = self.common_devices.len();
|
||||
for i in (0..length).rev() {
|
||||
for _ in (0..length).rev() {
|
||||
let common_device = self.common_devices.pop_front().unwrap();
|
||||
let device_id = common_device.read_device_id().unwrap();
|
||||
let device = match driver.probe(common_device) {
|
@ -4,12 +4,11 @@
|
||||
|
||||
use int_to_c_enum::TryFromInt;
|
||||
use log::info;
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
use crate::arch::kernel::MappedIrqLine;
|
||||
use ostd::arch::kernel::MappedIrqLine;
|
||||
#[cfg(target_arch = "riscv64")] // TODO: Add `MappedIrqLine` support for RISC-V.
|
||||
use crate::trap::IrqLine as MappedIrqLine;
|
||||
use crate::{io::IoMem, mm::VmIoOnce, trap::IrqLine, Error, Result};
|
||||
use ostd::trap::IrqLine as MappedIrqLine;
|
||||
use ostd::{io::IoMem, mm::VmIoOnce, trap::IrqLine, Error, Result};
|
||||
|
||||
/// A MMIO common device.
|
||||
#[derive(Debug)]
|
||||
@ -53,11 +52,6 @@ impl MmioCommonDevice {
|
||||
pub fn irq(&self) -> &IrqLine {
|
||||
&self.irq
|
||||
}
|
||||
|
||||
/// Returns a mutable reference to the IRQ line.
|
||||
pub fn irq_mut(&mut self) -> &mut IrqLine {
|
||||
&mut self.irq
|
||||
}
|
||||
}
|
||||
|
||||
/// Virtio MMIO version.
|
@ -3,18 +3,18 @@
|
||||
//! Virtio over MMIO
|
||||
|
||||
use bus::MmioBus;
|
||||
use ostd::sync::SpinLock;
|
||||
|
||||
use crate::sync::SpinLock;
|
||||
|
||||
pub mod bus;
|
||||
pub mod common_device;
|
||||
#[expect(clippy::module_inception)]
|
||||
pub(super) mod bus;
|
||||
pub(super) mod common_device;
|
||||
|
||||
/// The MMIO bus instance.
|
||||
pub static MMIO_BUS: SpinLock<MmioBus> = SpinLock::new(MmioBus::new());
|
||||
pub(super) static MMIO_BUS: SpinLock<MmioBus> = SpinLock::new(MmioBus::new());
|
||||
|
||||
pub(crate) fn init() {
|
||||
pub(super) fn init() {
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
crate::arch::if_tdx_enabled!({
|
||||
ostd::if_tdx_enabled!({
|
||||
// TODO: support virtio-mmio devices on TDX.
|
||||
//
|
||||
// Currently, virtio-mmio devices need to acquire sub-page MMIO regions,
|
||||
@ -28,8 +28,7 @@ pub(crate) fn init() {
|
||||
fn x86_probe() {
|
||||
use common_device::{mmio_check_magic, mmio_read_device_id, MmioCommonDevice};
|
||||
use log::debug;
|
||||
|
||||
use crate::{arch::kernel::IRQ_CHIP, io::IoMem, trap::IrqLine};
|
||||
use ostd::{arch::kernel::IRQ_CHIP, io::IoMem, trap::IrqLine};
|
||||
|
||||
// TODO: The correct method for detecting VirtIO-MMIO devices on x86_64 systems is to parse the
|
||||
// kernel command line if ACPI tables are absent [1], or the ACPI SSDT if ACPI tables are
|
@ -7,20 +7,21 @@ use aster_rights::{ReadOp, WriteOp};
|
||||
use aster_util::{field_ptr, safe_ptr::SafePtr};
|
||||
use log::warn;
|
||||
use ostd::{
|
||||
bus::{
|
||||
mmio::{
|
||||
bus::MmioDevice,
|
||||
common_device::{MmioCommonDevice, VirtioMmioVersion},
|
||||
},
|
||||
pci::cfg_space::Bar,
|
||||
},
|
||||
bus::pci::cfg_space::Bar,
|
||||
io::IoMem,
|
||||
mm::{DmaCoherent, PAGE_SIZE},
|
||||
sync::RwLock,
|
||||
trap::IrqCallbackFunction,
|
||||
};
|
||||
|
||||
use super::{layout::VirtioMmioLayout, multiplex::MultiplexIrq};
|
||||
use super::{
|
||||
bus::{
|
||||
bus::MmioDevice,
|
||||
common_device::{MmioCommonDevice, VirtioMmioVersion},
|
||||
},
|
||||
layout::VirtioMmioLayout,
|
||||
multiplex::MultiplexIrq,
|
||||
};
|
||||
use crate::{
|
||||
queue::{AvailRing, Descriptor, UsedRing},
|
||||
transport::{ConfigManager, DeviceStatus, VirtioTransport, VirtioTransportError},
|
||||
@ -36,7 +37,7 @@ pub struct VirtioMmioDevice {
|
||||
pub struct VirtioMmioTransport {
|
||||
layout: SafePtr<VirtioMmioLayout, IoMem>,
|
||||
device: Arc<VirtioMmioDevice>,
|
||||
common_device: ostd::bus::mmio::common_device::MmioCommonDevice,
|
||||
common_device: MmioCommonDevice,
|
||||
multiplex: Arc<RwLock<MultiplexIrq>>,
|
||||
}
|
||||
|
||||
|
@ -2,18 +2,15 @@
|
||||
|
||||
use alloc::{sync::Arc, vec::Vec};
|
||||
|
||||
use ostd::{
|
||||
bus::{
|
||||
mmio::{
|
||||
bus::{MmioDevice, MmioDriver},
|
||||
common_device::MmioCommonDevice,
|
||||
},
|
||||
BusProbeError,
|
||||
},
|
||||
sync::SpinLock,
|
||||
};
|
||||
use ostd::{bus::BusProbeError, sync::SpinLock};
|
||||
|
||||
use super::device::VirtioMmioTransport;
|
||||
use super::{
|
||||
bus::{
|
||||
bus::{MmioDevice, MmioDriver},
|
||||
common_device::MmioCommonDevice,
|
||||
},
|
||||
device::VirtioMmioTransport,
|
||||
};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct VirtioMmioDriver {
|
||||
|
@ -2,18 +2,22 @@
|
||||
|
||||
use alloc::sync::Arc;
|
||||
|
||||
use ostd::bus::mmio::MMIO_BUS;
|
||||
use bus::MMIO_BUS;
|
||||
use spin::Once;
|
||||
|
||||
use self::driver::VirtioMmioDriver;
|
||||
|
||||
mod bus;
|
||||
pub mod device;
|
||||
pub mod driver;
|
||||
pub mod layout;
|
||||
pub mod multiplex;
|
||||
|
||||
pub static VIRTIO_MMIO_DRIVER: Once<Arc<VirtioMmioDriver>> = Once::new();
|
||||
|
||||
pub fn virtio_mmio_init() {
|
||||
bus::init();
|
||||
|
||||
VIRTIO_MMIO_DRIVER.call_once(|| Arc::new(VirtioMmioDriver::new()));
|
||||
MMIO_BUS
|
||||
.lock()
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
//! Bus operations
|
||||
|
||||
pub mod mmio;
|
||||
pub mod pci;
|
||||
|
||||
/// An error that occurs during bus probing.
|
||||
@ -17,5 +16,4 @@ pub enum BusProbeError {
|
||||
/// Initializes the bus
|
||||
pub(crate) fn init() {
|
||||
pci::init();
|
||||
mmio::init();
|
||||
}
|
||||
|
Reference in New Issue
Block a user