[SLOF] [PATCH 2/3] fdt: Fix update of "interrupt-controller" node at CAS
Greg Kurz
groug at kaod.org
Thu Feb 6 05:21:42 AEDT 2020
Now that QEMU passes a full FDT at CAS without rebooting, a guest that
has switched from XICS to XIVE ends up being presented an malformed
"interrupt-controller" node in the DT:
# dtc -I fs -O dts /proc/device-tree
<stdout>: Warning (unit_address_vs_reg): /interrupt-controller: node has a reg or ranges property, but no unit name
...
interrupt-controller {
ibm,xive-eq-sizes = <0x10>;
device_type = "power-ivpe";
ibm,interrupt-server-ranges = <0x00 0x03>;
compatible = "ibm,power-ivpe";
#interrupt-cells = <0x02>;
reg = <0x60302 0x31b0000 0x00 0x10000 0x60302 0x31a0000 0x00 0x10000>;
phandle = <0xe7448a8>;
ibm,xive-lisn-ranges = <0x00 0x03>;
interrupt-controller;
};
The node should have its unit set to "60302031b0000" as reported by dtc.
Also the node still has an "ibm,interrupt-server-ranges" property which
only makes sense with XICS.
This happens because we find an existing "interrupt-controller" node,
which describes a XICS controller, and we _wrongly_ decide to copy
all the properties from the new node into it. Delete the existing node
instead so that we create a new node with the appropriate properties
and unit name.
Signed-off-by: Greg Kurz <groug at kaod.org>
Reviewed-by: Alexey Kardashevskiy <aik at ozlabs.ru>
---
board-qemu/slof/fdt.fs | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs
index 8001382708da..66f8fe74d9dd 100644
--- a/board-qemu/slof/fdt.fs
+++ b/board-qemu/slof/fdt.fs
@@ -470,6 +470,20 @@ r> drop
ELSE
drop
THEN
+
+ fdt-cas-pass 0= IF
+ \ The guest might have asked to change the interrupt controller
+ \ type. It doesn't make sense to merge the new node and the
+ \ existing "interrupt-controller" node in this case. Delete the
+ \ latter. A brand new one will be created with the appropriate
+ \ properties and unit name.
+ 2dup " interrupt-controller" find-substr 0= IF
+ " interrupt-controller" find-node ?dup 0 <> IF
+ fdt-debug IF ." Deleting existing node: " dup .node cr THEN
+ delete-node
+ THEN
+ THEN
+ THEN
2dup find-node ?dup 0 <> IF
set-node
fdt-debug IF ." Setting node: " 2dup type cr THEN
More information about the SLOF
mailing list