diff --git a/Cargo.lock b/Cargo.lock index 482fa71..5c5b079 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -83,9 +83,8 @@ checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" [[package]] name = "fdt" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784a4df722dc6267a04af36895398f59d21d07dce47232adf31ec0ff2fa45e67" +version = "0.2.0-alpha1" +source = "git+https://github.com/panpaul/fdt.git#f913f139d02c936bbdea99371d9f1347e52b4953" [[package]] name = "flate2" diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 63bcd1b..871009c 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -29,7 +29,7 @@ utils = { path = "../lib/utils", default-features = false } bitflags = "2.5" cfg-if = "1.0" elf = { version = "0.7", default-features = false } -fdt = "0.1" +fdt = { git = "https://github.com/panpaul/fdt.git" } # fork from upstream log = "0.4" num-derive = "0.4" num-traits = { version = "0.2", default-features = false } diff --git a/kernel/src/drivers/mod.rs b/kernel/src/drivers/mod.rs index 327b014..f57f41c 100644 --- a/kernel/src/drivers/mod.rs +++ b/kernel/src/drivers/mod.rs @@ -3,9 +3,9 @@ pub mod serial; -use fdt::node::FdtNode; +use fdt::{node::FdtNode, Fdt}; pub trait Driver { fn compatible() -> &'static [&'static str]; - fn setup(_: FdtNode) -> Self; + fn setup(_: FdtNode, _: &Fdt) -> Self; } diff --git a/kernel/src/drivers/serial/sifive.rs b/kernel/src/drivers/serial/sifive.rs index cbeb280..db9211f 100644 --- a/kernel/src/drivers/serial/sifive.rs +++ b/kernel/src/drivers/serial/sifive.rs @@ -3,7 +3,7 @@ use crate::drivers::serial::SerialDriver; use crate::drivers::Driver; use crate::plat::console::ConsoleDevice; use core::sync::atomic::{AtomicPtr, Ordering}; -use fdt::node::FdtNode; +use fdt::{node::FdtNode, Fdt}; use utils::addr::PhysAddr; // https://static.dev.sifive.com/FU540-C000-v1.0.pdf @@ -122,8 +122,8 @@ impl Driver for UartSifive { &["sifive,uart0"] } - fn setup(fdt: FdtNode) -> Self { - let addr = fdt.reg().unwrap().next().unwrap().starting_address; + fn setup(node: FdtNode, _: &Fdt) -> Self { + let addr = node.reg().unwrap().next().unwrap().starting_address; let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) }; let addr: *mut u32 = addr.into(); let uart = unsafe { diff --git a/kernel/src/drivers/serial/uart16550.rs b/kernel/src/drivers/serial/uart16550.rs index 2fe22a7..c2f53f8 100644 --- a/kernel/src/drivers/serial/uart16550.rs +++ b/kernel/src/drivers/serial/uart16550.rs @@ -3,6 +3,7 @@ use crate::drivers::serial::SerialDriver; use crate::drivers::Driver; use crate::plat::console::ConsoleDevice; use fdt::node::FdtNode; +use fdt::Fdt; use uart_16550::MmioSerialPort; use utils::addr::PhysAddr; @@ -17,8 +18,8 @@ impl Driver for Uart16550 { &["ns16550", "ns16550a"] } - fn setup(fdt: FdtNode) -> Self { - let addr = fdt.reg().unwrap().next().unwrap().starting_address; + fn setup(node: FdtNode, _: &Fdt) -> Self { + let addr = node.reg().unwrap().next().unwrap().starting_address; let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) }; let mut serial_port = unsafe { MmioSerialPort::new(addr.into()) }; serial_port.init(); diff --git a/kernel/src/entry.rs b/kernel/src/entry.rs index a528b10..c701556 100644 --- a/kernel/src/entry.rs +++ b/kernel/src/entry.rs @@ -49,7 +49,11 @@ pub fn rust_main() -> ! { fn setup_console(fdt: &Fdt) { // NOTE: ignore stdin: both stdin and stdout will go through stdout device - match fdt.chosen().stdout().and_then(|stdout| ConsoleDriver::new(stdout)) { + match fdt + .chosen() + .stdout() + .and_then(|stdout| ConsoleDriver::new(stdout.node(), fdt)) + { None => warn!("No stdout device found or no compatible drivers found, falling back to platform default"), Some(driver) => set_console(driver), } diff --git a/kernel/src/plat/console.rs b/kernel/src/plat/console.rs index 8b4a810..d1e40d4 100644 --- a/kernel/src/plat/console.rs +++ b/kernel/src/plat/console.rs @@ -1,7 +1,7 @@ use crate::arch::EarlyConsole; use crate::drivers::serial::{Uart16550, UartSifive}; use crate::drivers::Driver; -use fdt::node::FdtNode; +use fdt::{node::FdtNode, Fdt}; use log::debug; use spin::Mutex; @@ -14,15 +14,15 @@ macro_rules! create_console_driver { } impl ConsoleDriver { - pub fn new(fdt: FdtNode) -> Option { - if let Some(compatible) = fdt.compatible() { + pub fn new(node: FdtNode, fdt: &Fdt) -> Option { + if let Some(compatible) = node.compatible() { $( if compatible .all() .any(|s| $dynamic_driver::compatible().contains(&s)) { debug!("Console: Using driver: {}", stringify!($dynamic_driver)); - return Some(ConsoleDriver::$dynamic_driver($dynamic_driver::setup(fdt))); + return Some(ConsoleDriver::$dynamic_driver($dynamic_driver::setup(node, fdt))); } )+ }