Move virtio-mmio bus outside OSTD

This commit is contained in:
Ruihan Li
2025-05-26 23:51:37 +08:00
committed by Tate, Hongliang Tian
parent 238b89da46
commit a3c5ab8cb4
8 changed files with 40 additions and 45 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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.

View File

@ -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

View File

@ -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>>,
}

View File

@ -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 {

View File

@ -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()

View File

@ -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();
}