Hi,
I am bringing up linux kernel on Juno and I needed customized kernel so I have disabled most of the peripherals and customized my juno device tree.
I am facing an issue where my kernel is hanging while start_kernel during init_IRQ. I am setting following node for interrupt controller -
I am not sure what I am doing wrong but the interrupt controller node is not getting parsed ?
interrupt-parent = <&gic>;
gic: interrupt-controller@2c001000 {
compatible = "arm,cortex-a15-gic", "arm,cortex-a9-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x0 0x2c010000 0 0x1000>,
<0x0 0x2c02f000 0 0x2000>,
<0x0 0x2c04f000 0 0x2000>,
<0x0 0x2c06f000 0 0x2000>;
interrupts = <1 9 0xf04>;
};
Thanks.
Just a guess, but this line is wrong:
It should be 2C01000, but you have an extra '0' after the '2C'. Although, saying that, decompiling a working Juno DTB from the Linaro deliverables also shows 2c001000.
From building the LSK following the Linaro instructions, and then decompiling the DTB, the GIC entry is as follows:
interrupt-controller@2c001000 { compatible = "arm,gic-400", "arm,cortex-a15-gic"; reg = <0x0 0x2c010000 0x0 0x1000 0x0 0x2c02f000 0x0 0x2000 0x0 0x2c04f000 0x0 0x2000 0x0 0x2c06f000 0x0 0x2000>; #address-cells = <0x0>; #interrupt-cells = <0x3>; interrupt-controller; interrupts = <0x1 0x9 0x3f04>; linux,phandle = <0x1>; phandle = <0x1>; };
interrupt-controller@2c001000 {
compatible = "arm,gic-400", "arm,cortex-a15-gic";
reg = <0x0 0x2c010000 0x0 0x1000 0x0 0x2c02f000 0x0 0x2000 0x0 0x2c04f000 0x0 0x2000 0x0 0x2c06f000 0x0 0x2000>;
#address-cells = <0x0>;
#interrupt-cells = <0x3>;
interrupts = <0x1 0x9 0x3f04>;
linux,phandle = <0x1>;
phandle = <0x1>;
So you're missing "arm,gic-400" from the compatible entry, which may mean that Linux is failing to find a suitable driver. Adding that entry would ensure that Linux chooses the GIC-400 driver.
Looking at the Latest kernel prebuilt DTB (which is different to the LSK one), we see this instead:
interrupt-controller@2c010000 { compatible = "arm,gic-400", "arm,cortex-a15-gic"; reg = <0x0 0x2c010000 0x0 0x1000 0x0 0x2c02f000 0x0 0x2000 0x0 0x2c04f000 0x0 0x2000 0x0 0x2c06f000 0x0 0x2000>; #address-cells = <0x2>; #interrupt-cells = <0x3>; #size-cells = <0x2>; interrupt-controller; interrupts = <0x1 0x9 0x3f04>; ranges = <0x0 0x0 0x0 0x2c1c0000 0x0 0x40000>; linux,phandle = <0x1>; phandle = <0x1>; v2m@0 { compatible = "arm,gic-v2m-frame"; msi-controller; reg = <0x0 0x0 0x0 0x1000>; }; };
interrupt-controller@2c010000 {
#address-cells = <0x2>;
#size-cells = <0x2>;
ranges = <0x0 0x0 0x0 0x2c1c0000 0x0 0x40000>;
v2m@0 {
compatible = "arm,gic-v2m-frame";
msi-controller;
reg = <0x0 0x0 0x0 0x1000>;
Note that now the address is correct ("interrupt-controller@2c010000"). This entry also has the "arm,gic-400" tag on the compatible entry.
So from the above, I would say, first try adding "arm,gic-400" to the compatible tag and see if that works, then if that doesn't work, try changing the address to be correct (@2c010000).
I hope that helps,
Ash.