[SLOF] [PATCH 2/2] fdt: Fix update of "interrupt-controller" node at CAS

Greg Kurz groug at kaod.org
Thu Jan 30 05:21:11 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>;

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>
 board-qemu/slof/fdt.fs |   13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs
index 2ceb366d4f68..1e2378124b09 100644
--- a/board-qemu/slof/fdt.fs
+++ b/board-qemu/slof/fdt.fs
@@ -465,6 +465,19 @@ r> drop
+    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
     2dup find-node ?dup 0 <> IF
 	fdt-debug IF ." Setting node: " 2dup type cr THEN

More information about the SLOF mailing list