aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Kurz <groug@kaod.org>2020-02-05 19:21:42 +0100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2020-02-21 14:03:07 +1100
commitb7e579c856937d4120fdf53a29cce0d38131483e (patch)
treebc81e9cf5440efba61c1acb66b40ad8a7d308827
parentdea21476b10262ef7e01e6e1cedd87fd8d0cfd26 (diff)
downloadSLOF-b7e579c856937d4120fdf53a29cce0d38131483e.zip
SLOF-b7e579c856937d4120fdf53a29cce0d38131483e.tar.gz
SLOF-b7e579c856937d4120fdf53a29cce0d38131483e.tar.bz2
fdt: Fix update of "interrupt-controller" node at CAS
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@kaod.org> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
-rw-r--r--board-qemu/slof/fdt.fs14
1 files changed, 14 insertions, 0 deletions
diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs
index c1048d0..ca4cd7d 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