xref: /DragonOS/kernel/src/driver/virtio/mmio.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
1731bc2b3SLoGin use fdt::node::FdtNode;
22eab6dd7S曾俊 use log::error;
3731bc2b3SLoGin use system_error::SystemError;
4731bc2b3SLoGin 
5731bc2b3SLoGin use crate::driver::{
6731bc2b3SLoGin     open_firmware::fdt::open_firmware_fdt_driver, virtio::transport_mmio::VirtIOMmioTransport,
7731bc2b3SLoGin };
8731bc2b3SLoGin 
9731bc2b3SLoGin use super::{transport::VirtIOTransport, virtio::virtio_device_init};
10731bc2b3SLoGin 
virtio_probe_mmio()11e32effb1SLoGin pub(super) fn virtio_probe_mmio() {
12731bc2b3SLoGin     if let Err(e) = do_probe_virtio_mmio() {
132eab6dd7S曾俊         error!("virtio_probe_mmio failed: {:?}", e);
14731bc2b3SLoGin     }
15731bc2b3SLoGin }
16731bc2b3SLoGin 
do_probe_virtio_mmio() -> Result<(), SystemError>17731bc2b3SLoGin fn do_probe_virtio_mmio() -> Result<(), SystemError> {
18731bc2b3SLoGin     let fdt = open_firmware_fdt_driver().fdt_ref()?;
19731bc2b3SLoGin 
20731bc2b3SLoGin     let do_check = |node: FdtNode| -> Result<(), SystemError> {
21731bc2b3SLoGin         let mmio_transport = VirtIOMmioTransport::new(node)?;
22731bc2b3SLoGin         let device_id = mmio_transport.device_id();
23*28fe4ad2S黄铭涛         virtio_device_init(VirtIOTransport::Mmio(mmio_transport), device_id, None);
24731bc2b3SLoGin         Ok(())
25731bc2b3SLoGin     };
26731bc2b3SLoGin 
27731bc2b3SLoGin     for node in open_firmware_fdt_driver().find_node_by_compatible(&fdt, "virtio,mmio") {
28731bc2b3SLoGin         do_check(node).ok();
29731bc2b3SLoGin     }
30731bc2b3SLoGin     Ok(())
31e32effb1SLoGin }
32