From 150f34eaae5ce9bf6ae6397dd8526c4982f2b7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E7=9D=BF?= Date: Fri, 7 Feb 2025 16:11:11 +0800 Subject: [PATCH] [fix] PCI irq map --- dtb/qemu_pci.dtb | Bin 0 -> 1048576 bytes fdt-parser/Cargo.toml | 2 +- fdt-parser/src/pci.rs | 6 +++--- fdt-parser/tests/node.rs | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 dtb/qemu_pci.dtb diff --git a/dtb/qemu_pci.dtb b/dtb/qemu_pci.dtb new file mode 100644 index 0000000000000000000000000000000000000000..9dfd0242365994a26da291aef343c236d95f9d6d GIT binary patch literal 1048576 zcmeI%%c~?;836EVjgN`1_lTUu?gus#`CMeb#fF z5A99%51u){eK4Kg9Nw5LR&lOt&;IYat^S&0^}N37xjs)1=F9OU52CcO2fzD6RlVX^ z{nt^?wyynG-#QU{@Uv*o{JZuaU%N4mYN?;ggVADoKI058UATBuxp?97VI_N&`3$D@ zbhfy;^~lAh3pxw*zFi4r=6#V zsf!VlsOwPj8Km zrkrz#au_40_gp#ExOVe6jD3IG*ec}pc}>-ff4&XdINu&Krj}jr7BlD36SJFe*`F$A z+${Hs`KJDuc^hOoeay%19rMjGaL+tnSt4!{^YMGfd`o}KcC~CU&$y2=-@ARDZ|#rS z-9@Ljjpcf;m~ZQkS#Hy4I(^Lg-Z9_aAM^E@Ym`&RywpAf?q-{7zvmu$phVmx<{IlW zpJzQWa|vZR{XExLpZWKzCuZKxSxz5wjrI9p4BQhlZ>=n+kGaPBe0L1o6Ei>NET@mT z#`=6u4BQhl$+Mh3<{Insy)kf4%$$Cf)5lz6eZDUS?unVHWI1)r{41Ro-fexJjrN|H zc{sxJk@4)@Kgh6Z3-`$6RB5p6ieKp^am%u|9J`J@fp?#xd7e zpAYrN{Mg1Z*I1v4*fY=b8^>H@eSWw<=7mjTURh&(<_Fg^&$6zg>D24<${OqQqx~^2 zZ#>U6)@R-<{IlW7e&uJ zKfQ6xHP+|D{V|_dJLc|uG8DyA@uc3$UkF*6#_Sax24881 zZ_YM3Mcd16Mce1PlkGn4p<9{L@si`@9FCXhb4S1Ib9=wI_Ktq}uIToDQNN?#E1Q1Z zZ_yIIFTXbKiGF?gwQ*1M>&ve%ZeM<_OZf~+a`8`Jer?=?a$AfSE^YrKPIC-yf#~|hV^(f9q!iq^nM3%Zl5J&9?epnM&+{qA$-FLQUbj7i;{DyAIv6ch`Pe-6{CuvB zn+vjie%^}1lFRXDXl8R~j@h%6-W)HzWRBB(1fPhJ^xBJU*OH4{qe^ z*2aFazZ!4F7mqA?GD`a7wezZZhGqS1Y~@*f__S$FU)}DTkF#8x@BK==@ocfGpBauW zJv!Wt4?M@oEz66s<#EQj+q?T{uKpZb*EiQx9uIC@o<`dF6Sbt>wP((GoZADjH92>S ztDGur(Nz62w(M74?Bu-=Ne*M&;m%?-t*h#%(Uw=1dtqm9w7j-;B38C{#%JTW#EN|> z*^uS7ea0)_3C25-DPSHW=?6 zELZiSRI)8TgSxGBWBw$J@>A>P*6nl5W`;-cBS7ifUE9qu>u-qd#OM6zm2ww!eV>o< zvdiK4tM~%2$TQ9Onbvc$WiGFaUCuX;F8EH6I;eQ8{4t_yNQyY zXWs9h7#>E=JO;5|hwb;BysXPL=h@Zcxl?^L*7oH`rq`a0Rw%)8*Ohd>g95nU%Zypx#i^9x;>uGw(Gs>`e?bg7%uC2yISn;HV5ZQ`fa!7 zcxO?6{h;0-->jPY>|ixNSPl1Mp)9NUwbA}|1RL!=J-WFZ&i1Q#s?>|c!F;u>w(A>{ zasAZl=De;J^=_3n#nsXN_2JW#?bWrTp2PWQQSYy+bBEWq2^_1>_E(G9-d@~9i_!jW zM4m1u!|~DClH0OPvB_<@+Kyaf@QBs?A7K79+MZ2Ell?0Ge`;7ps6vqZaMU>(#mP&Ay>+4v%u#8(j_FCgeD%tLzXN*Q;x@?NoSbd9a+<`^|Cw8pv~D zH=XP*Myq)KC"] edition = "2021" repository = "https://github.com/qclic/fdt-parser" diff --git a/fdt-parser/src/pci.rs b/fdt-parser/src/pci.rs index aac6af6..aad97ed 100644 --- a/fdt-parser/src/pci.rs +++ b/fdt-parser/src/pci.rs @@ -44,10 +44,10 @@ impl<'a> Pci<'a> { let want0 = (bus as u32) << 16 | (device as u32) << 11 | (func as u32) << 8; - let mut want = mask; + let mut want = [0; 4]; - want[0] = want0 | mask[0]; - want[3] = irq_pin; + want[0] = want0 & mask[0]; + want[3] = irq_pin & mask[3]; let mut prop = self .node diff --git a/fdt-parser/tests/node.rs b/fdt-parser/tests/node.rs index 2a133ae..181792b 100644 --- a/fdt-parser/tests/node.rs +++ b/fdt-parser/tests/node.rs @@ -4,6 +4,7 @@ mod test { const TEST_FDT: &[u8] = include_bytes!("../../dtb/bcm2711-rpi-4-b.dtb"); const TEST_PHYTIUM_FDT: &[u8] = include_bytes!("../../dtb/phytium.dtb"); + const TEST_QEMU_FDT: &[u8] = include_bytes!("../../dtb/qemu_pci.dtb"); #[test] fn test_find_compatible() { @@ -202,4 +203,21 @@ mod test { println!("one: {:?}", one); } } + + #[test] + fn test_pci_irq_map2() { + let fdt = Fdt::from_bytes(TEST_QEMU_FDT).unwrap(); + let pci = fdt + .find_compatible(&["pci-host-ecam-generic"]) + .next() + .unwrap() + .into_pci() + .unwrap(); + + let irq = pci.child_interrupts(0, 2, 0, 1).unwrap(); + + for one in irq.irqs { + println!("one: {:?}", one); + } + } }