aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Kurz <groug@kaod.org>2017-07-24 14:34:33 +0200
committerAlexey Kardashevskiy <aik@ozlabs.ru>2017-07-25 15:10:03 +1000
commit604d28cc3f791657414f8b21103921fa0147fc63 (patch)
treeb441d3c6e41f8d1659782a4f4fb3c80f1101e67d
parent89f519f09bf850918b60526e50409afb663418aa (diff)
downloadSLOF-604d28cc3f791657414f8b21103921fa0147fc63.zip
SLOF-604d28cc3f791657414f8b21103921fa0147fc63.tar.gz
SLOF-604d28cc3f791657414f8b21103921fa0147fc63.tar.bz2
board-qemu: add private hcall to inform host on "phandle" update
The "interrupt-map" property in each PHB node references the "phandle" property of the "interrupt-controller" node. This is used by the guest OS to setup IRQs for any PCI device plugged into the PHB. QEMU sets this property to an arbitrary value in the flattened DT passed to SLOF. Since commit 82954d4c1088, SLOF has some generic code to convert all references to any "phandle" property to a SLOF specific value. This is is perfectly okay for coldplug devices, since the guest OS only sees the converted value in "interrupt-map". It is a problem though for hotplug devices. Since they don't go through SLOF, the guest OS receives the arbitrary value set by QEMU and fails to setup IRQs. In order to support PHB hotplug, this patch introduces a new private hcall, which allows SLOF to tell QEMU that a "phandle" was converted from an old value to a new value. Suggested-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Greg Kurz <groug@kaod.org> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
-rw-r--r--board-qemu/slof/fdt.fs14
-rw-r--r--lib/libhvcall/hvcall.code7
-rw-r--r--lib/libhvcall/hvcall.in1
-rw-r--r--lib/libhvcall/libhvcall.h1
4 files changed, 21 insertions, 2 deletions
diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs
index 851645e..a24e344 100644
--- a/board-qemu/slof/fdt.fs
+++ b/board-qemu/slof/fdt.fs
@@ -308,18 +308,28 @@ fdt-claim-reserve
3drop
;
+\ Tell QEMU about the updated phandle:
+: fdt-hv-update-phandle ( old new -- )
+ hv-update-phandle ?dup IF
+ \ Ignore hcall not implemented error, print error otherwise
+ dup -2 <> IF ." HV-UPDATE-PHANDLE error: " . cr ELSE drop THEN
+ THEN
+;
+
\ Replace one FDT phandle "val" with a OF1275 phandle "node" in the
\ whole tree:
: fdt-update-phandle ( val node -- )
>r
FALSE TO (fdt-phandle-replaced)
- r@ s" /" find-node ( val node root )
- fdt-replace-all-phandles
+ r@ 2dup s" /" find-node ( val node val node root )
+ fdt-replace-all-phandles ( val node )
(fdt-phandle-replaced) IF
+ fdt-hv-update-phandle
r@ set-node
s" phandle" delete-property
s" linux,phandle" delete-property
ELSE
+ 2drop
diagnostic-mode? IF
cr ." Warning: Did not replace phandle in " r@ node>path type cr
THEN
diff --git a/lib/libhvcall/hvcall.code b/lib/libhvcall/hvcall.code
index 0ff50f2..8349748 100644
--- a/lib/libhvcall/hvcall.code
+++ b/lib/libhvcall/hvcall.code
@@ -129,3 +129,10 @@ PRIM(check_X2d_and_X2d_patch_X2d_sc1)
patch_broken_sc1((void*)start, (void*)end, (void*)patch_ins);
MIRP
+
+// : hv-update-phandle ( old_phandle new_phandle -- res )
+PRIM(hv_X2d_update_X2d_phandle)
+ uint32_t new_phandle = TOS.u; POP;
+ uint32_t old_phandle = TOS.u;
+ TOS.u = hv_generic(KVMPPC_H_UPDATE_PHANDLE, old_phandle, new_phandle);
+MIRP
diff --git a/lib/libhvcall/hvcall.in b/lib/libhvcall/hvcall.in
index 4437b77..ab7513a 100644
--- a/lib/libhvcall/hvcall.in
+++ b/lib/libhvcall/hvcall.in
@@ -31,4 +31,5 @@ cod(RX!)
cod(hv-logical-memop)
cod(hv-cas)
cod(hv-rtas-update)
+cod(hv-update-phandle)
cod(get-print-version)
diff --git a/lib/libhvcall/libhvcall.h b/lib/libhvcall/libhvcall.h
index b2ea3f6..5776a2b 100644
--- a/lib/libhvcall/libhvcall.h
+++ b/lib/libhvcall/libhvcall.h
@@ -25,6 +25,7 @@
/* Client Architecture support */
#define KVMPPC_H_CAS (KVMPPC_HCALL_BASE + 0x2)
#define KVMPPC_H_RTAS_UPDATE (KVMPPC_HCALL_BASE + 0x3)
+#define KVMPPC_H_UPDATE_PHANDLE (KVMPPC_HCALL_BASE + 0x4)
#ifndef __ASSEMBLY__