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 82954d4c10, 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>
This commit is contained in:
Greg Kurz 2017-07-24 14:34:33 +02:00 committed by Alexey Kardashevskiy
parent 89f519f09b
commit 604d28cc3f
4 changed files with 21 additions and 2 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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__