[SLOF] [PATCH v4] board-qemu: add private hcall to inform host on "phandle" update

Greg Kurz groug at kaod.org
Wed Sep 6 22:33:45 AEST 2017


On Tue, 25 Jul 2017 17:00:54 +1000
Alexey Kardashevskiy <aik at ozlabs.ru> wrote:

> On 24/07/17 22:34, Greg Kurz wrote:
> > 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.  
> 
> Thanks, applied.
> 

But David Gibson seems to be "really, really" opposed to this solution as
expressed in this thread:

https://lists.nongnu.org/archive/html/qemu-ppc/2017-07/msg00556.html

He's asking if we can change SLOF to not use phandles as raw pointers
instead... I must admit that this goes way beyond my very limited
knowledge on SLOF and forth... :-\

I hope that someone here can provide some hints on the feasibility
and effort needed to satisfy David's request.

Cheers,

--
Greg

> > 
> > Suggested-by: Thomas Huth <thuth at redhat.com>
> > Signed-off-by: Greg Kurz <groug at kaod.org>
> > ---
> > v4: - fix bad stack usage in fdt-hv-update-phandle error path
> > 
> > v3: - drop "<> 0" before IF
> > 
> > v2: - use ?dup
> >     - switch the order of the parameters of hv-update-phandle
> >     - added stack comment to hv-update-phandle
> > ---
> >  board-qemu/slof/fdt.fs    |   14 ++++++++++++--
> >  lib/libhvcall/hvcall.code |    7 +++++++
> >  lib/libhvcall/hvcall.in   |    1 +
> >  lib/libhvcall/libhvcall.h |    1 +
> >  4 files changed, 21 insertions(+), 2 deletions(-)
> > 
> > diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs
> > index 851645eae299..a24e3449e7c1 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 0ff50f27e8a9..834974862ef5 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 4437b77f001d..ab7513af8977 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 b2ea3f6bf944..5776a2b772f7 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__
> >  
> > 
> > _______________________________________________
> > SLOF mailing list
> > SLOF at lists.ozlabs.org
> > https://lists.ozlabs.org/listinfo/slof
> >   
> 
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 195 bytes
Desc: OpenPGP digital signature
URL: <http://lists.ozlabs.org/pipermail/slof/attachments/20170906/b984587a/attachment.sig>


More information about the SLOF mailing list