diff options
author | Greg Kurz <groug@kaod.org> | 2020-02-05 19:21:42 +0100 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2020-02-21 14:03:07 +1100 |
commit | b7e579c856937d4120fdf53a29cce0d38131483e (patch) | |
tree | bc81e9cf5440efba61c1acb66b40ad8a7d308827 | |
parent | dea21476b10262ef7e01e6e1cedd87fd8d0cfd26 (diff) | |
download | SLOF-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.fs | 14 |
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 |