[SLOF] [PATCH 2/2] fdt: Fix update of "interrupt-controller" node at CAS
Alexey Kardashevskiy
aik at ozlabs.ru
Thu Jan 30 10:21:29 AEDT 2020
On 30/01/2020 05:21, Greg Kurz wrote:
> 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>
> ---
> 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
> 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
This does not look extremely nice but I really do not see a better way
now. Deleting all properties instead of deleting the node may have
problems with unit/space; deleting all nodes with QEMU-defined phandles
may also have undesired effects...
Reviewed-by: Alexey Kardashevskiy <aik at ozlabs.ru>
> 2dup find-node ?dup 0 <> IF
> set-node
> fdt-debug IF ." Setting node: " 2dup type cr THEN
>
--
Alexey
More information about the SLOF
mailing list