qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH qemu v20] spapr: Implement Open Firmware client interface


From: David Gibson
Subject: Re: [PATCH qemu v20] spapr: Implement Open Firmware client interface
Date: Mon, 24 May 2021 15:23:01 +1000

On Thu, May 20, 2021 at 11:59:07PM +0200, BALATON Zoltan wrote:
> On Thu, 20 May 2021, Alexey Kardashevskiy wrote:
> > The PAPR platform describes an OS environment that's presented by
> > a combination of a hypervisor and firmware. The features it specifies
> > require collaboration between the firmware and the hypervisor.
> > 
> > Since the beginning, the runtime component of the firmware (RTAS) has
> > been implemented as a 20 byte shim which simply forwards it to
> > a hypercall implemented in qemu. The boot time firmware component is
> > SLOF - but a build that's specific to qemu, and has always needed to be
> > updated in sync with it. Even though we've managed to limit the amount
> > of runtime communication we need between qemu and SLOF, there's some,
> > and it has become increasingly awkward to handle as we've implemented
> > new features.
> > 
> > This implements a boot time OF client interface (CI) which is
> > enabled by a new "x-vof" pseries machine option (stands for "Virtual Open
> > Firmware). When enabled, QEMU implements the custom H_OF_CLIENT hcall
> > which implements Open Firmware Client Interface (OF CI). This allows
> > using a smaller stateless firmware which does not have to manage
> > the device tree.
> > 
> > The new "vof.bin" firmware image is included with source code under
> > pc-bios/. It also includes RTAS blob.
> > 
> > This implements a handful of CI methods just to get -kernel/-initrd
> > working. In particular, this implements the device tree fetching and
> > simple memory allocator - "claim" (an OF CI memory allocator) and updates
> > "/memory@0/available" to report the client about available memory.
> > 
> > This implements changing some device tree properties which we know how
> > to deal with, the rest is ignored. To allow changes, this skips
> > fdt_pack() when x-vof=on as not packing the blob leaves some room for
> > appending.
> > 
> > In absence of SLOF, this assigns phandles to device tree nodes to make
> > device tree traversing work.
> > 
> > When x-vof=on, this adds "/chosen" every time QEMU (re)builds a tree.
> > 
> > This adds basic instances support which are managed by a hash map
> > ihandle -> [phandle].
> > 
> > Before the guest started, the used memory is:
> > 0..e60 - the initial firmware
> > 8000..10000 - stack
> > 400000.. - kernel
> > 3ea0000.. - initramdisk
> > 
> > This OF CI does not implement "interpret".
> > 
> > Unlike SLOF, this does not format uninitialized nvram. Instead, this
> > includes a disk image with pre-formatted nvram.
> > 
> > With this basic support, this can only boot into kernel directly.
> > However this is just enough for the petitboot kernel and initradmdisk to
> > boot from any possible source. Note this requires reasonably recent guest
> > kernel with:
> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=df5be5be8735
> > 
> > The immediate benefit is much faster booting time which especially
> > crucial with fully emulated early CPU bring up environments. Also this
> > may come handy when/if GRUB-in-the-userspace sees light of the day.
> > 
> > This separates VOF and sPAPR in a hope that VOF bits may be reused by
> > other POWERPC boards which do not support pSeries.
> > 
> > This is coded in assumption that later on we might be adding support for
> > booting from QEMU backends (blockdev is the first candidate) without
> > devices/drivers in between as OF1275 does not require that and
> > it is quite easy to so.
> > 
> > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> > ---
> > 
> > The example command line is:
> > 
> > /home/aik/pbuild/qemu-killslof-localhost-ppc64/qemu-system-ppc64 \
> > -nodefaults \
> > -chardev stdio,id=STDIO0,signal=off,mux=on \
> > -device spapr-vty,id=svty0,reg=0x71000110,chardev=STDIO0 \
> > -mon id=MON0,chardev=STDIO0,mode=readline \
> > -nographic \
> > -vga none \
> > -enable-kvm \
> > -m 8G \
> > -machine 
> > pseries,x-vof=on,cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken,cap-ccf-assist=off
> >  \
> > -kernel pbuild/kernel-le-guest/vmlinux \
> > -initrd pb/rootfs.cpio.xz \
> > -drive 
> > id=DRIVE0,if=none,file=./p/qemu-killslof/pc-bios/vof-nvram.bin,format=raw \
> > -global spapr-nvram.drive=DRIVE0 \
> > -snapshot \
> > -smp 8,threads=8 \
> > -L /home/aik/t/qemu-ppc64-bios/ \
> > -trace events=qemu_trace_events \
> > -d guest_errors \
> > -chardev socket,id=SOCKET0,server,nowait,path=qemu.mon.tmux26 \
> > -mon chardev=SOCKET0,mode=control
> > 
> > ---
> > Changes:
> > v20:
> > * compile vof.bin with -mcpu=power4 for better compatibility
> > * s/std/stw/ in entry.S to make it work on ppc32
> > * fixed dt_available property to support both 32 and 64bit
> > * shuffled prom_args handling code
> > * do not enforce 32bit in MSR (again, to support 32bit platforms)
> > 
> 
> [...]
> 
> > diff --git a/default-configs/devices/ppc64-softmmu.mak 
> > b/default-configs/devices/ppc64-softmmu.mak
> > index ae0841fa3a18..9fb201dfacfa 100644
> > --- a/default-configs/devices/ppc64-softmmu.mak
> > +++ b/default-configs/devices/ppc64-softmmu.mak
> > @@ -9,3 +9,4 @@ CONFIG_POWERNV=y
> >  # For pSeries
> >  CONFIG_PSERIES=y
> >  CONFIG_NVDIMM=y
> > +CONFIG_VOF=y
> > diff --git a/hw/ppc/Kconfig b/hw/ppc/Kconfig
> > index e51e0e5e5ac6..964510dfc73d 100644
> > --- a/hw/ppc/Kconfig
> > +++ b/hw/ppc/Kconfig
> > @@ -143,3 +143,6 @@ config FW_CFG_PPC
> > 
> >  config FDT_PPC
> >      bool
> > +
> > +config VOF
> > +    bool
> 
> I think you should just add "select VOF" to config PSERIES section in
> Kconfig instead of adding it to default-configs/devices/ppc64-softmmu.mak.
> That should do it, it works in my updated pegasos2 patch:

No, we don't want a "select": PSERIES doesn't require VOF while we
still support SLOF, and indeed we're quite a ways from being ready to
even make VOF the default pseries firmware.

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]