chore: kernel: driver: update api, pass fdt header

This commit is contained in:
Paul Pan 2024-07-08 18:49:10 +08:00
parent a2c5ba1494
commit 392d5ce59e
7 changed files with 20 additions and 16 deletions

5
Cargo.lock generated
View File

@ -83,9 +83,8 @@ checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89"
[[package]] [[package]]
name = "fdt" name = "fdt"
version = "0.1.5" version = "0.2.0-alpha1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/panpaul/fdt.git#f913f139d02c936bbdea99371d9f1347e52b4953"
checksum = "784a4df722dc6267a04af36895398f59d21d07dce47232adf31ec0ff2fa45e67"
[[package]] [[package]]
name = "flate2" name = "flate2"

View File

@ -29,7 +29,7 @@ utils = { path = "../lib/utils", default-features = false }
bitflags = "2.5" bitflags = "2.5"
cfg-if = "1.0" cfg-if = "1.0"
elf = { version = "0.7", default-features = false } elf = { version = "0.7", default-features = false }
fdt = "0.1" fdt = { git = "https://github.com/panpaul/fdt.git" } # fork from upstream
log = "0.4" log = "0.4"
num-derive = "0.4" num-derive = "0.4"
num-traits = { version = "0.2", default-features = false } num-traits = { version = "0.2", default-features = false }

View File

@ -3,9 +3,9 @@
pub mod serial; pub mod serial;
use fdt::node::FdtNode; use fdt::{node::FdtNode, Fdt};
pub trait Driver { pub trait Driver {
fn compatible() -> &'static [&'static str]; fn compatible() -> &'static [&'static str];
fn setup(_: FdtNode) -> Self; fn setup(_: FdtNode, _: &Fdt) -> Self;
} }

View File

@ -3,7 +3,7 @@ use crate::drivers::serial::SerialDriver;
use crate::drivers::Driver; use crate::drivers::Driver;
use crate::plat::console::ConsoleDevice; use crate::plat::console::ConsoleDevice;
use core::sync::atomic::{AtomicPtr, Ordering}; use core::sync::atomic::{AtomicPtr, Ordering};
use fdt::node::FdtNode; use fdt::{node::FdtNode, Fdt};
use utils::addr::PhysAddr; use utils::addr::PhysAddr;
// https://static.dev.sifive.com/FU540-C000-v1.0.pdf // https://static.dev.sifive.com/FU540-C000-v1.0.pdf
@ -122,8 +122,8 @@ impl Driver for UartSifive {
&["sifive,uart0"] &["sifive,uart0"]
} }
fn setup(fdt: FdtNode) -> Self { fn setup(node: FdtNode, _: &Fdt) -> Self {
let addr = fdt.reg().unwrap().next().unwrap().starting_address; let addr = node.reg().unwrap().next().unwrap().starting_address;
let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) }; let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) };
let addr: *mut u32 = addr.into(); let addr: *mut u32 = addr.into();
let uart = unsafe { let uart = unsafe {

View File

@ -3,6 +3,7 @@ use crate::drivers::serial::SerialDriver;
use crate::drivers::Driver; use crate::drivers::Driver;
use crate::plat::console::ConsoleDevice; use crate::plat::console::ConsoleDevice;
use fdt::node::FdtNode; use fdt::node::FdtNode;
use fdt::Fdt;
use uart_16550::MmioSerialPort; use uart_16550::MmioSerialPort;
use utils::addr::PhysAddr; use utils::addr::PhysAddr;
@ -17,8 +18,8 @@ impl Driver for Uart16550 {
&["ns16550", "ns16550a"] &["ns16550", "ns16550a"]
} }
fn setup(fdt: FdtNode) -> Self { fn setup(node: FdtNode, _: &Fdt) -> Self {
let addr = fdt.reg().unwrap().next().unwrap().starting_address; let addr = node.reg().unwrap().next().unwrap().starting_address;
let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) }; let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) };
let mut serial_port = unsafe { MmioSerialPort::new(addr.into()) }; let mut serial_port = unsafe { MmioSerialPort::new(addr.into()) };
serial_port.init(); serial_port.init();

View File

@ -49,7 +49,11 @@ pub fn rust_main() -> ! {
fn setup_console(fdt: &Fdt) { fn setup_console(fdt: &Fdt) {
// NOTE: ignore stdin: both stdin and stdout will go through stdout device // 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"), None => warn!("No stdout device found or no compatible drivers found, falling back to platform default"),
Some(driver) => set_console(driver), Some(driver) => set_console(driver),
} }

View File

@ -1,7 +1,7 @@
use crate::arch::EarlyConsole; use crate::arch::EarlyConsole;
use crate::drivers::serial::{Uart16550, UartSifive}; use crate::drivers::serial::{Uart16550, UartSifive};
use crate::drivers::Driver; use crate::drivers::Driver;
use fdt::node::FdtNode; use fdt::{node::FdtNode, Fdt};
use log::debug; use log::debug;
use spin::Mutex; use spin::Mutex;
@ -14,15 +14,15 @@ macro_rules! create_console_driver {
} }
impl ConsoleDriver { impl ConsoleDriver {
pub fn new(fdt: FdtNode) -> Option<Self> { pub fn new(node: FdtNode, fdt: &Fdt) -> Option<Self> {
if let Some(compatible) = fdt.compatible() { if let Some(compatible) = node.compatible() {
$( $(
if compatible if compatible
.all() .all()
.any(|s| $dynamic_driver::compatible().contains(&s)) .any(|s| $dynamic_driver::compatible().contains(&s))
{ {
debug!("Console: Using driver: {}", stringify!($dynamic_driver)); 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)));
} }
)+ )+
} }