All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Barrat <fbarrat@linux.ibm.com>
To: Daniel Henrique Barboza <danielhb413@gmail.com>, qemu-devel@nongnu.org
Cc: qemu-ppc@nongnu.org, david@gibson.dropbear.id.au, clg@kaod.org,
	mark.cave-ayland@ilande.co.uk
Subject: Re: [PATCH 00/17] powernv: introduce pnv-phb unified devices
Date: Tue, 10 May 2022 11:07:21 +0200	[thread overview]
Message-ID: <e953d8a6-e6e2-d124-c8f8-d2974b7a0e37@linux.ibm.com> (raw)
In-Reply-To: <20220507190624.507419-1-danielhb413@gmail.com>



On 07/05/2022 21:06, Daniel Henrique Barboza wrote:
> Hi,
> 
> Since the 7.0.0 release cycle we have a desire to use the powernv
> emulation with libvirt. To do that we need to enable user creatable
> pnv-phb devices to allow more user customization an to avoid spamming
> multiple default devices in the domain XML. In the middle of the
> previous cycle we experimented with user created
> pnv-phb3/pnv-phb3-root-port/pnv-phb4/pnv-phb4-root-port/pnv-phb5. The
> end result, although functional, is that the user needs to deal with a
> lot of versioned devices that, from the user perspective, does the same
> thing. In a way we outsourced the implementation details of the PHBs
> (e.g. pnv8 uses phb3, pnv9 uses phb4) to the command line. Having more
> devices also puts an extra burden in the libvirt support we want to
> have.
> 
> To solve this, Cedric and Frederic gave the idea of adding a common
> virtual pnv-phb device that the user can add in the command line, and
> QEMU handles the details internally. Unfortunatelly this idea turned out
> to be way harder than anticipated. Between creating a device that would
> just forward the callbacks to the existing devices internally, creating
> a PnvPHB device with the minimal attributes and making the other devices
> inherit from it, and making an 'abstract' device that could be casted
> for both phb3 and phb4 PHBs, all sorts of very obscure problems occured:
> PHBs not being detected, interrupts not being delivered and memory
> regions not being able to read/write registers. My initial impression is
> that there are assumptions made both in ppc/pnv and hw/pci-host that
> requires the memory region and the bus being in the same device. Even
> if we somehow figure all this out, the resulting code is hacky and
> annoying to maitain.
> 
> This brings us to this series. The cleaner way I found to accomplish
> what we want to do is to create real, unified pnv-phb/phb-phb-root-port
> devices, and get rid of all the versioned ones. This is done by
> merging all the PHB3/PHB4 attributes in unified devices. pnv_phb3* and pnv_phb4*
> files end up using the same pnv-phb and phb-phb-root-port unified devices,
> with the difference that pnv_phb3* only cares about version 3 attributes
> and pnv_phb4* only cares about PHB4 attributes. Introducing new PHB
> versions in the future will be a matter of adding any non-existent
> attributes in the unified pnv-phb* devices and using them in separated
> pnv_phbN* files.
> 
> The pnv-phb implementation per se is just a router for either phb3 or
> phb4 logic, done in init() and realize() time, after we check which powernv
> machine we're running. If running with powernv8 we redirect control to
> pnv_phb3_realize(), otherwise we redirect to pnv_phb4_realize(). The
> unified device does not do anything per se other than handling control
> to the right version.
> 
> After this series, this same powernv8 command line that boots a powernv8
> machine with some phbs and root ports and with network:
> 
> ./qemu-system-ppc64 -m 4G \
> -machine powernv8 -smp 2,sockets=2,cores=1,threads=1  \
> -accel tcg,thread=multi -bios skiboot.lid  \
> -kernel vmlinux -initrd buildroot.rootfs.cpio -append 'console=hvc0 ro xmon=on'  \
> -nodefaults  -serial mon:stdio -nographic  \
> -device pnv-phb,chip-id=0,index=0,id=pcie.0 \
> -device pnv-phb,chip-id=0,index=1,id=pcie.1 \
> -device pnv-phb,chip-id=1,index=2,id=pcie.2 \
> -device pnv-phb-root-port,id=root0,bus=pcie.2 \
> -device pnv-phb-root-port,id=root1,bus=pcie.1 \
> -device pcie-pci-bridge,id=bridge1,bus=root0,addr=0x0  \
> -device nvme,bus=bridge1,addr=0x1,drive=drive0,serial=1234  \
> -drive file=./simics-disk.raw,if=none,id=drive0,format=raw,cache=none  \
> -device e1000e,netdev=net0,mac=C0:ff:EE:00:01:04,bus=bridge1,addr=0x3 \
> -netdev bridge,helper=/usr/libexec/qemu-bridge-helper,br=virbr0,id=net0 \
> -device nec-usb-xhci,bus=bridge1,addr=0x2
> 
> 
> Can be used to boot powernv9 and powernv10 machines with the same attributes
> just by changing the machine type.
> 


Hello Daniel,

Thanks for trying to cleanup the phb3 and phb4 implementations!
Like you I'm sure, I'm not fond of that big struct PnvPHB, which is 
accumulating all the states of all the PHB versions. It's likely going 
to grow, with most of it being unused. I was about to suggest if it was 
possible to at least have a union for the phb3- or phb4-specific 
attributes, but I'm glad to see that Mark is helping and hasn't given up 
trying to fix it by using a parent object. Hopefully we can make it work.

Some random comments, which may or may not hold depending on how it is 
reworked:
- IODA2 is the I/O Design Architecture used by phb3 and IODA3 is used by 
phb4. So while it makes sense to use the "ioda2_" prefix for phb3, it is 
counter-intuitive to use the "ioda_" prefix for attributes related to phb4.

- the struct PnvPhb3DMASpace and struct PnvPhb4DMASpace are almost 
identical, save for the type of the backpointer to the PHB. It would be 
nice if we could merge them.

   Fred


> Daniel Henrique Barboza (17):
>    ppc/pnv: rename PnvPHB3.ioda* to PnvPHB3.ioda2*
>    ppc/pnv: rename PnvPHB3.regs[] to PnvPHB3.regs3[]
>    ppc/pnv: rename PnvPHB3.dma_spaces to PnvPHB3.v3_dma_spaces
>    ppc/pnv: add unified pnv-phb header
>    ppc/pnv: add pnv-phb device
>    ppc/pnv: remove PnvPHB3
>    ppc/pnv: user created pnv-phb for powernv8
>    ppc/pnv: remove PnvPHB4
>    ppc/pnv: user creatable pnv-phb for powernv9
>    ppc/pnv: use PnvPHB.version
>    ppc/pnv: change pnv_phb4_get_pec() to also retrieve chip10->pecs
>    ppc/pnv: user creatable pnv-phb for powernv10
>    ppc/pnv: add pnv_phb_get_current_machine()
>    ppc/pnv: add pnv-phb-root-port device
>    ppc/pnv: remove pnv-phb3-root-port
>    ppc/pnv: remove pnv-phb4-root-port
>    ppc/pnv: remove pecc->rp_model
> 
>   hw/pci-host/meson.build        |   3 +-
>   hw/pci-host/pnv_phb.c          | 258 ++++++++++++++++++++++++++++
>   hw/pci-host/pnv_phb3.c         | 256 +++++++++++-----------------
>   hw/pci-host/pnv_phb3_msi.c     |  12 +-
>   hw/pci-host/pnv_phb3_pbcq.c    |   8 +-
>   hw/pci-host/pnv_phb4.c         | 298 ++++++++++++---------------------
>   hw/pci-host/pnv_phb4_pec.c     |  14 +-
>   hw/ppc/pnv.c                   |  41 ++++-
>   include/hw/pci-host/pnv_phb.h  | 224 +++++++++++++++++++++++++
>   include/hw/pci-host/pnv_phb3.h | 118 +------------
>   include/hw/pci-host/pnv_phb4.h | 108 ++----------
>   include/hw/ppc/pnv.h           |   3 +-
>   12 files changed, 757 insertions(+), 586 deletions(-)
>   create mode 100644 hw/pci-host/pnv_phb.c
>   create mode 100644 include/hw/pci-host/pnv_phb.h
> 


      parent reply	other threads:[~2022-05-10  9:42 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-07 19:06 [PATCH 00/17] powernv: introduce pnv-phb unified devices Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 01/17] ppc/pnv: rename PnvPHB3.ioda* to PnvPHB3.ioda2* Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 02/17] ppc/pnv: rename PnvPHB3.regs[] to PnvPHB3.regs3[] Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 03/17] ppc/pnv: rename PnvPHB3.dma_spaces to PnvPHB3.v3_dma_spaces Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 04/17] ppc/pnv: add unified pnv-phb header Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 05/17] ppc/pnv: add pnv-phb device Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 06/17] ppc/pnv: remove PnvPHB3 Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 07/17] ppc/pnv: user created pnv-phb for powernv8 Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 08/17] ppc/pnv: remove PnvPHB4 Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 09/17] ppc/pnv: user creatable pnv-phb for powernv9 Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 10/17] ppc/pnv: use PnvPHB.version Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 11/17] ppc/pnv: change pnv_phb4_get_pec() to also retrieve chip10->pecs Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 12/17] ppc/pnv: user creatable pnv-phb for powernv10 Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 13/17] ppc/pnv: add pnv_phb_get_current_machine() Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 14/17] ppc/pnv: add pnv-phb-root-port device Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 15/17] ppc/pnv: remove pnv-phb3-root-port Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 16/17] ppc/pnv: remove pnv-phb4-root-port Daniel Henrique Barboza
2022-05-07 19:06 ` [PATCH 17/17] ppc/pnv: remove pecc->rp_model Daniel Henrique Barboza
2022-05-09 21:17 ` [PATCH 00/17] powernv: introduce pnv-phb unified devices Mark Cave-Ayland
2022-05-09 22:30   ` Daniel Henrique Barboza
2022-05-10  7:57     ` Mark Cave-Ayland
2022-05-11 18:30       ` Daniel Henrique Barboza
2022-05-12 15:03       ` Cédric Le Goater
2022-05-10  9:07 ` Frederic Barrat [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e953d8a6-e6e2-d124-c8f8-d2974b7a0e37@linux.ibm.com \
    --to=fbarrat@linux.ibm.com \
    --cc=clg@kaod.org \
    --cc=danielhb413@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.