From 1d43e39b0e28593e4396c05466d720e48a6ee16a Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sat, 12 Apr 2025 14:55:17 +0200 Subject: [PATCH] pcid: Handle #address-cells on interrupt parent --- pcid/src/cfg_access/mod.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pcid/src/cfg_access/mod.rs b/pcid/src/cfg_access/mod.rs index b62be0a3ba..8e7f58b7be 100644 --- a/pcid/src/cfg_access/mod.rs +++ b/pcid/src/cfg_access/mod.rs @@ -55,6 +55,24 @@ fn locate_ecam_dtb( let mut interrupt_map = Vec::::new(); while let Ok([addr1, addr2, addr3, int1, phandle]) = interrupt_map_data.next_chunk::<5>() { let parent = dt.find_phandle(phandle).unwrap(); + let parent_address_cells = u32::from_be_bytes( + parent.property("#address-cells").unwrap().value[..4] + .try_into() + .unwrap(), + ); + match parent_address_cells { + 0 => {} + 1 => { + assert_eq!(interrupt_map_data.next().unwrap(), 0); + } + 2 => { + assert_eq!(interrupt_map_data.next_chunk::<2>().unwrap(), [0, 0]); + } + 3 => { + assert_eq!(interrupt_map_data.next_chunk::<3>().unwrap(), [0, 0, 0]); + } + _ => break, + }; let parent_interrupt_cells = parent.interrupt_cells().unwrap(); let parent_interrupt = match parent_interrupt_cells { 1 if let Some(a) = interrupt_map_data.next() => [a, 0, 0],