diff --git a/Cargo.lock b/Cargo.lock index 14a3c617fd..6954ea031f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -177,7 +177,7 @@ version = "0.1.0" dependencies = [ "common", "driver-block", - "fdt", + "fdt 0.2.0-alpha1", "libredox", "redox-daemon", "redox-scheme", @@ -433,6 +433,11 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784a4df722dc6267a04af36895398f59d21d07dce47232adf31ec0ff2fa45e67" +[[package]] +name = "fdt" +version = "0.2.0-alpha1" +source = "git+https://github.com/repnop/fdt.git#059bb2383873f8001959456e36ec123228f67642" + [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -947,7 +952,7 @@ dependencies = [ "bit_field", "bitflags 1.3.2", "common", - "fdt", + "fdt 0.1.5", "libc", "libredox", "log", diff --git a/storage/bcm2835-sdhcid/Cargo.toml b/storage/bcm2835-sdhcid/Cargo.toml index df313e6a93..ac42319149 100644 --- a/storage/bcm2835-sdhcid/Cargo.toml +++ b/storage/bcm2835-sdhcid/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -fdt = "0.1.5" +fdt = { git = "https://github.com/repnop/fdt.git" } common = { path = "../../common" } driver-block = { path = "../driver-block" } diff --git a/storage/bcm2835-sdhcid/src/main.rs b/storage/bcm2835-sdhcid/src/main.rs index 878604a0a4..c3a5bec63d 100644 --- a/storage/bcm2835-sdhcid/src/main.rs +++ b/storage/bcm2835-sdhcid/src/main.rs @@ -1,3 +1,5 @@ +#![feature(let_chains)] + use std::{ fs::File, io::{Read, Write}, @@ -50,17 +52,29 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! { let fdt = Fdt::new(&dtb_data).unwrap(); println!("DTB model = {}", fdt.root().model()); - let with = ["brcm,bcm2835-sdhcid"]; + let with = ["brcm,bcm2835-sdhci"]; let compat_node = fdt.find_compatible(&with).unwrap(); let reg = compat_node.reg().unwrap().next().unwrap(); let reg_size = reg.size.unwrap(); + let mut reg_addr = reg.starting_address as usize; println!( "DeviceMemory start = 0x{:08x}, size = 0x{:08x}", - reg.starting_address as usize, reg_size + reg_addr, reg_size ); + if let Some(mut ranges) = fdt.find_node("/soc").and_then(|f| f.ranges()) { + let range = ranges + .find(|f| f.child_bus_address <= reg_addr && reg_addr - f.child_bus_address < f.size) + .expect("Couldn't find device range in /soc/@ranges"); + reg_addr = range.parent_bus_address + (reg_addr - range.child_bus_address); + println!( + "DeviceMemory remapped onto CPU address space: start = 0x{:08x}, size = 0x{:08x}", + reg_addr, reg_size + ); + } + let addr = unsafe { common::physmap( - reg.starting_address as usize, + reg_addr, reg_size, common::Prot::RW, common::MemoryType::DeviceMemory,