From b7e579c856937d4120fdf53a29cce0d38131483e Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Wed, 5 Feb 2020 19:21:42 +0100 Subject: 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 : 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 Reviewed-by: Alexey Kardashevskiy Signed-off-by: Alexey Kardashevskiy --- 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 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 -- cgit v1.1