All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310
@ 2019-03-10  8:26 David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 01/60] vfio/spapr: Fix indirect levels calculation David Gibson
                   ` (61 more replies)
  0 siblings, 62 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell; +Cc: groug, qemu-ppc, qemu-devel, lvivier, David Gibson

The following changes since commit f5b4c31030f45293bb4517445722768434829d91:

  Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2019-03-09 17:35:48 +0000)

are available in the Git repository at:

  git://github.com/dgibson/qemu.git tags/ppc-for-4.0-20190310

for you to fetch changes up to 08d020471fcd41cb020fc9987ed1945eefcc8805:

  spapr: Use CamelCase properly (2019-03-10 14:35:44 +1100)

----------------------------------------------------------------
ppc patch queue for 2019-03-10

Here's a final pull request before the 4.0 soft freeze.  Changes
include:
  * A Great Renaming to use camel case properly in spapr code
  * Optimization of some vector instructions
  * Support for POWER9 cpus in the powernv machine
  * Fixes a regression from the last pull request in handling VSX
    instructions with mixed operands from the FPR and VMX parts of the
    register array
  * Optimization hack to avoid scanning all the (empty) entries on a
    new IOMMU window
  * Add FSL I2C controller model for E500
  * Support for KVM acceleration of the H_PAGE_INIT hypercall on spapr
  * Update u-boot image for E500
  * Enable Specre/Meltdown mitigations by default on the new machine type
  * Enable large decrementer support for POWER9

Plus a number of assorted bugfixes and cleanups.

----------------------------------------------------------------
Alexander Graf (1):
      PPC: E500: Update u-boot to v2019.01

Alexey Kardashevskiy (3):
      vfio/spapr: Fix indirect levels calculation
      vfio/spapr: Rename local systempagesize variable
      spapr_iommu: Do not replay mappings from just created DMA window

Andrew Randrianasulu (1):
      PPC: E500: Add FSL I2C controller and integrate RTC with it

Cédric Le Goater (27):
      ppc/xive: hardwire the Physical CAM line of the thread context
      ppc: externalize ppc_get_vcpu_by_pir()
      ppc/xive: export the TIMA memory accessors
      ppc/pnv: export the xive_router_notify() routine
      ppc/pnv: change the CPU machine_data presenter type to Object *
      ppc/pnv: add a XIVE interrupt controller model for POWER9
      ppc/pnv: introduce a new dt_populate() operation to the chip model
      ppc/pnv: introduce a new pic_print_info() operation to the chip model
      ppc/xive: activate HV support
      ppc/pnv: fix logging primitives using Ox
      ppc/pnv: psi: add a PSIHB_REG macro
      ppc/pnv: psi: add a reset handler
      ppc/pnv: add a PSI bridge class model
      ppc/pnv: add a PSI bridge model for POWER9
      ppc/pnv: lpc: fix OPB address ranges
      ppc/pnv: add a LPC Controller class model
      ppc/pnv: add a 'dt_isa_nodename' to the chip
      ppc/pnv: add a LPC Controller model for POWER9
      ppc/pnv: add SerIRQ routing registers
      ppc/pnv: add a OCC model class
      ppc/pnv: add a OCC model for POWER9
      ppc/pnv: extend XSCOM core support for POWER9
      ppc/pnv: POWER9 XSCOM quad support
      ppc/pnv: activate XSCOM tests for POWER9
      ppc/pnv: add more dummy XSCOM addresses
      ppc/pnv: add a "ibm,opal/power-mgt" device tree node on POWER9
      target/ppc: add HV support for POWER9

David Gibson (2):
      spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit)
      spapr: Use CamelCase properly

Fabiano Rosas (3):
      target/ppc: Move exception vector offset computation into a function
      target/ppc: Move handling of hardware breakpoints to a separate function
      target/ppc: Refactor kvm_handle_debug

Greg Kurz (2):
      spapr: Simulate CAS for qtest
      Revert "spapr: support memory unplug for qtest"

Mark Cave-Ayland (9):
      target/ppc: introduce single fpr_offset() function
      target/ppc: introduce single vsrl_offset() function
      target/ppc: move Vsr* macros from internal.h to cpu.h
      target/ppc: introduce avr_full_offset() function
      target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64()
      target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order
      target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l,h}() and set_cpu_vsr{l,h}()
      mac_oldworld: use node name instead of alias name for hd device in FWPathProvider
      mac_newworld: use node name instead of alias name for hd device in FWPathProvider

Philippe Mathieu-Daudé (2):
      target/ppc: Optimize xviexpdp() using deposit_i64()
      target/ppc: Optimize x[sv]xsigdp using deposit_i64()

Suraj Jitindar Singh (10):
      target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER
      target/ppc: Implement large decrementer support for TCG
      target/ppc: Implement large decrementer support for KVM
      target/ppc/spapr: Enable the large decrementer for pseries-4.0
      target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS
      target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST
      target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg
      target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type
      target/ppc/spapr: Clear partition table entry when allocating hash table
      target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling

 default-configs/ppc-softmmu.mak     |    2 +
 hw/char/spapr_vty.c                 |   58 +-
 hw/i2c/Kconfig                      |    4 +
 hw/i2c/Makefile.objs                |    1 +
 hw/i2c/mpc_i2c.c                    |  357 +++++++
 hw/intc/Makefile.objs               |    2 +-
 hw/intc/pnv_xive.c                  | 1753 +++++++++++++++++++++++++++++++++++
 hw/intc/pnv_xive_regs.h             |  248 +++++
 hw/intc/spapr_xive.c                |   86 +-
 hw/intc/xics_kvm.c                  |    4 +-
 hw/intc/xics_spapr.c                |   24 +-
 hw/intc/xive.c                      |  113 ++-
 hw/net/spapr_llan.c                 |  110 +--
 hw/nvram/spapr_nvram.c              |   42 +-
 hw/ppc/e500.c                       |   54 ++
 hw/ppc/mac_newworld.c               |    4 +-
 hw/ppc/mac_oldworld.c               |    4 +-
 hw/ppc/pnv.c                        |  252 ++++-
 hw/ppc/pnv_core.c                   |  189 +++-
 hw/ppc/pnv_lpc.c                    |  316 ++++++-
 hw/ppc/pnv_occ.c                    |  127 ++-
 hw/ppc/pnv_psi.c                    |  425 ++++++++-
 hw/ppc/pnv_xscom.c                  |   33 +-
 hw/ppc/ppc.c                        |  101 +-
 hw/ppc/spapr.c                      |  361 ++++----
 hw/ppc/spapr_caps.c                 |  247 +++--
 hw/ppc/spapr_cpu_core.c             |   52 +-
 hw/ppc/spapr_drc.c                  |  134 +--
 hw/ppc/spapr_events.c               |   92 +-
 hw/ppc/spapr_hcall.c                |  118 +--
 hw/ppc/spapr_iommu.c                |  107 ++-
 hw/ppc/spapr_irq.c                  |  104 +--
 hw/ppc/spapr_ovec.c                 |   46 +-
 hw/ppc/spapr_pci.c                  |  212 ++---
 hw/ppc/spapr_pci_vfio.c             |   14 +-
 hw/ppc/spapr_rng.c                  |   18 +-
 hw/ppc/spapr_rtas.c                 |   30 +-
 hw/ppc/spapr_rtas_ddw.c             |   42 +-
 hw/ppc/spapr_rtc.c                  |   16 +-
 hw/ppc/spapr_vio.c                  |  116 +--
 hw/scsi/spapr_vscsi.c               |   14 +-
 hw/vfio/spapr.c                     |   49 +-
 hw/vfio/trace-events                |    2 +-
 include/hw/pci-host/spapr.h         |   44 +-
 include/hw/ppc/pnv.h                |   42 +-
 include/hw/ppc/pnv_core.h           |   14 +-
 include/hw/ppc/pnv_lpc.h            |   26 +
 include/hw/ppc/pnv_occ.h            |   17 +
 include/hw/ppc/pnv_psi.h            |   59 +-
 include/hw/ppc/pnv_xive.h           |   93 ++
 include/hw/ppc/pnv_xscom.h          |   21 +-
 include/hw/ppc/ppc.h                |    1 +
 include/hw/ppc/spapr.h              |  194 ++--
 include/hw/ppc/spapr_cpu_core.h     |   24 +-
 include/hw/ppc/spapr_drc.h          |  108 +--
 include/hw/ppc/spapr_irq.h          |   58 +-
 include/hw/ppc/spapr_ovec.h         |   30 +-
 include/hw/ppc/spapr_vio.h          |   74 +-
 include/hw/ppc/spapr_xive.h         |   18 +-
 include/hw/ppc/xics_spapr.h         |    6 +-
 include/hw/ppc/xive.h               |    4 +
 pc-bios/u-boot.e500                 |  Bin 388672 -> 349148 bytes
 roms/u-boot                         |    2 +-
 target/ppc/cpu-qom.h                |    1 +
 target/ppc/cpu.h                    |   59 +-
 target/ppc/excp_helper.c            |   30 +-
 target/ppc/internal.h               |   27 +-
 target/ppc/kvm.c                    |  201 ++--
 target/ppc/kvm_ppc.h                |   23 +
 target/ppc/machine.c                |    8 +-
 target/ppc/mmu-hash64.c             |    2 +-
 target/ppc/translate.c              |   22 +-
 target/ppc/translate/vmx-impl.inc.c |   27 +-
 target/ppc/translate/vsx-impl.inc.c |   65 +-
 target/ppc/translate_init.inc.c     |    7 +-
 tests/pnv-xscom-test.c              |    2 -
 76 files changed, 5791 insertions(+), 1601 deletions(-)
 create mode 100644 hw/i2c/mpc_i2c.c
 create mode 100644 hw/intc/pnv_xive.c
 create mode 100644 hw/intc/pnv_xive_regs.h
 create mode 100644 include/hw/ppc/pnv_xive.h

^ permalink raw reply	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 01/60] vfio/spapr: Fix indirect levels calculation
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 02/60] vfio/spapr: Rename local systempagesize variable David Gibson
                   ` (60 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Alexey Kardashevskiy, David Gibson

From: Alexey Kardashevskiy <aik@ozlabs.ru>

The current code assumes that we can address more bits on a PCI bus
for DMA than we really can but there is no way knowing the actual limit.

This makes a better guess for the number of levels and if the kernel
fails to allocate that, this increases the level numbers till succeeded
or reached the 64bit limit.

This adds levels to the trace point.

This may cause the kernel to warn about failed allocation:
   [65122.837458] Failed to allocate a TCE memory, level shift=28
which might happen if MAX_ORDER is not large enough as it can vary:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/powerpc/Kconfig?h=v5.0-rc2#n727

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Message-Id: <20190227085149.38596-3-aik@ozlabs.ru>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/vfio/spapr.c      | 43 +++++++++++++++++++++++++++++++++----------
 hw/vfio/trace-events |  2 +-
 2 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c
index becf71a3fc..88437a79e6 100644
--- a/hw/vfio/spapr.c
+++ b/hw/vfio/spapr.c
@@ -143,10 +143,10 @@ int vfio_spapr_create_window(VFIOContainer *container,
                              MemoryRegionSection *section,
                              hwaddr *pgsize)
 {
-    int ret;
+    int ret = 0;
     IOMMUMemoryRegion *iommu_mr = IOMMU_MEMORY_REGION(section->mr);
     uint64_t pagesize = memory_region_iommu_get_min_page_size(iommu_mr);
-    unsigned entries, pages;
+    unsigned entries, bits_total, bits_per_level, max_levels;
     struct vfio_iommu_spapr_tce_create create = { .argsz = sizeof(create) };
     long systempagesize = qemu_getrampagesize();
 
@@ -176,16 +176,38 @@ int vfio_spapr_create_window(VFIOContainer *container,
     create.window_size = int128_get64(section->size);
     create.page_shift = ctz64(pagesize);
     /*
-     * SPAPR host supports multilevel TCE tables, there is some
-     * heuristic to decide how many levels we want for our table:
-     * 0..64 = 1; 65..4096 = 2; 4097..262144 = 3; 262145.. = 4
+     * SPAPR host supports multilevel TCE tables. We try to guess optimal
+     * levels number and if this fails (for example due to the host memory
+     * fragmentation), we increase levels. The DMA address structure is:
+     * rrrrrrrr rxxxxxxx xxxxxxxx xxxxxxxx  xxxxxxxx xxxxxxxx xxxxxxxx iiiiiiii
+     * where:
+     *   r = reserved (bits >= 55 are reserved in the existing hardware)
+     *   i = IOMMU page offset (64K in this example)
+     *   x = bits to index a TCE which can be split to equal chunks to index
+     *      within the level.
+     * The aim is to split "x" to smaller possible number of levels.
      */
     entries = create.window_size >> create.page_shift;
-    pages = MAX((entries * sizeof(uint64_t)) / getpagesize(), 1);
-    pages = MAX(pow2ceil(pages), 1); /* Round up */
-    create.levels = ctz64(pages) / 6 + 1;
-
-    ret = ioctl(container->fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create);
+    /* bits_total is number of "x" needed */
+    bits_total = ctz64(entries * sizeof(uint64_t));
+    /*
+     * bits_per_level is a safe guess of how much we can allocate per level:
+     * 8 is the current minimum for CONFIG_FORCE_MAX_ZONEORDER and MAX_ORDER
+     * is usually bigger than that.
+     * Below we look at getpagesize() as TCEs are allocated from system pages.
+     */
+    bits_per_level = ctz64(getpagesize()) + 8;
+    create.levels = bits_total / bits_per_level;
+    if (bits_total % bits_per_level) {
+        ++create.levels;
+    }
+    max_levels = (64 - create.page_shift) / ctz64(getpagesize());
+    for ( ; create.levels <= max_levels; ++create.levels) {
+        ret = ioctl(container->fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create);
+        if (!ret) {
+            break;
+        }
+    }
     if (ret) {
         error_report("Failed to create a window, ret = %d (%m)", ret);
         return -errno;
@@ -200,6 +222,7 @@ int vfio_spapr_create_window(VFIOContainer *container,
         return -EINVAL;
     }
     trace_vfio_spapr_create_window(create.page_shift,
+                                   create.levels,
                                    create.window_size,
                                    create.start_addr);
     *pgsize = pagesize;
diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
index ed2f333ad7..cf1e886818 100644
--- a/hw/vfio/trace-events
+++ b/hw/vfio/trace-events
@@ -129,6 +129,6 @@ vfio_prereg_listener_region_add_skip(uint64_t start, uint64_t end) "0x%"PRIx64"
 vfio_prereg_listener_region_del_skip(uint64_t start, uint64_t end) "0x%"PRIx64" - 0x%"PRIx64
 vfio_prereg_register(uint64_t va, uint64_t size, int ret) "va=0x%"PRIx64" size=0x%"PRIx64" ret=%d"
 vfio_prereg_unregister(uint64_t va, uint64_t size, int ret) "va=0x%"PRIx64" size=0x%"PRIx64" ret=%d"
-vfio_spapr_create_window(int ps, uint64_t ws, uint64_t off) "pageshift=0x%x winsize=0x%"PRIx64" offset=0x%"PRIx64
+vfio_spapr_create_window(int ps, unsigned int levels, uint64_t ws, uint64_t off) "pageshift=0x%x levels=%u winsize=0x%"PRIx64" offset=0x%"PRIx64
 vfio_spapr_remove_window(uint64_t off) "offset=0x%"PRIx64
 vfio_spapr_group_attach(int groupfd, int tablefd) "Attached groupfd %d to liobn fd %d"
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 02/60] vfio/spapr: Rename local systempagesize variable
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 01/60] vfio/spapr: Fix indirect levels calculation David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 03/60] spapr: Simulate CAS for qtest David Gibson
                   ` (59 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Alexey Kardashevskiy, David Gibson

From: Alexey Kardashevskiy <aik@ozlabs.ru>

The "systempagesize" name suggests that it is the host system page size
while it is the smallest page size of memory backing the guest RAM so
let's rename it to stop confusion. This should cause no behavioral change.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Message-Id: <20190227085149.38596-4-aik@ozlabs.ru>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/vfio/spapr.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c
index 88437a79e6..57fe758e54 100644
--- a/hw/vfio/spapr.c
+++ b/hw/vfio/spapr.c
@@ -148,14 +148,14 @@ int vfio_spapr_create_window(VFIOContainer *container,
     uint64_t pagesize = memory_region_iommu_get_min_page_size(iommu_mr);
     unsigned entries, bits_total, bits_per_level, max_levels;
     struct vfio_iommu_spapr_tce_create create = { .argsz = sizeof(create) };
-    long systempagesize = qemu_getrampagesize();
+    long rampagesize = qemu_getrampagesize();
 
     /*
      * The host might not support the guest supported IOMMU page size,
      * so we will use smaller physical IOMMU pages to back them.
      */
-    if (pagesize > systempagesize) {
-        pagesize = systempagesize;
+    if (pagesize > rampagesize) {
+        pagesize = rampagesize;
     }
     pagesize = 1ULL << (63 - clz64(container->pgsizes &
                                    (pagesize | (pagesize - 1))));
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 03/60] spapr: Simulate CAS for qtest
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 01/60] vfio/spapr: Fix indirect levels calculation David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 02/60] vfio/spapr: Rename local systempagesize variable David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 04/60] Revert "spapr: support memory unplug for qtest" David Gibson
                   ` (58 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Michael Roth, David Gibson

From: Greg Kurz <groug@kaod.org>

The RTAS event hotplug code for machine types 2.8 and newer depends on
the CAS negotiated ov5 in order to work properly. However, there's no
CAS when running under qtest. There has been a tentative to trick the
code by faking the OV5_HP_EVT bit, but it turned out to break other
assumptions in the code and the change got reverted.

Go for a more general approach and simulate a CAS when running under
qtest. For simplicity, this pseudo CAS simple simulates the case where
the guest supports the same features as the machine. It is done at
reset time, just before we reset the DRCs, which could potentially
exercise the unplug code.

This allows to test unplug on spapr with both older and newer machine
types.

Suggested-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <155146875704.147873.10563808578795890265.stgit@bahia.lan>
Tested-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 9e01226e18..f7d527464c 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -29,6 +29,7 @@
 #include "qapi/visitor.h"
 #include "sysemu/sysemu.h"
 #include "sysemu/numa.h"
+#include "sysemu/qtest.h"
 #include "hw/hw.h"
 #include "qemu/log.h"
 #include "hw/fw-path-provider.h"
@@ -1711,6 +1712,16 @@ static void spapr_machine_reset(void)
      */
     spapr_irq_reset(spapr, &error_fatal);
 
+    /*
+     * There is no CAS under qtest. Simulate one to please the code that
+     * depends on spapr->ov5_cas. This is especially needed to test device
+     * unplug, so we do that before resetting the DRCs.
+     */
+    if (qtest_enabled()) {
+        spapr_ovec_cleanup(spapr->ov5_cas);
+        spapr->ov5_cas = spapr_ovec_clone(spapr->ov5);
+    }
+
     /* DRC reset may cause a device to be unplugged. This will cause troubles
      * if this device is used by another device (eg, a running vhost backend
      * will crash QEMU if the DIMM holding the vring goes away). To avoid such
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 04/60] Revert "spapr: support memory unplug for qtest"
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (2 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 03/60] spapr: Simulate CAS for qtest David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-11 10:52   ` Greg Kurz
  2019-03-10  8:26 ` [Qemu-devel] [PULL 05/60] target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER David Gibson
                   ` (57 subsequent siblings)
  61 siblings, 1 reply; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Thomas Huth, Michael Roth,
	David Gibson

From: Greg Kurz <groug@kaod.org>

Commit b8165118f52c broke CPU hotplug tests for old machine types:

$ QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64 ./tests/cpu-plug-test -m=slow
/ppc64/cpu-plug/pseries-3.1/device-add/2x3x1&maxcpus=6: OK
/ppc64/cpu-plug/pseries-2.12-sxxm/device-add/2x3x1&maxcpus=6: OK
/ppc64/cpu-plug/pseries-3.0/device-add/2x3x1&maxcpus=6: OK
/ppc64/cpu-plug/pseries-2.10/device-add/2x3x1&maxcpus=6: OK
/ppc64/cpu-plug/pseries-2.11/device-add/2x3x1&maxcpus=6: OK
/ppc64/cpu-plug/pseries-2.12/device-add/2x3x1&maxcpus=6: OK
/ppc64/cpu-plug/pseries-2.9/device-add/2x3x1&maxcpus=6: OK
/ppc64/cpu-plug/pseries-2.7/device-add/2x3x1&maxcpus=6: **
ERROR:/home/thuth/devel/qemu/hw/ppc/spapr_events.c:313:rtas_event_log_to_source: assertion failed: (source->enabled)
Broken pipe
/home/thuth/devel/qemu/tests/libqtest.c:143: kill_qemu() detected QEMU death from signal 6 (Aborted) (core dumped)
Aborted (core dumped)

The approach of faking the availability of OV5_HP_EVT causes the
code to assume the hotplug event source is enabled, which is wrong
for older machines.

This reverts commit b8165118f52ce5ee88565d3cec83d30374efdc96.

A subsequent patch will address the problem of CAS under qtest from
a different angle.

Reported-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <155146875097.147873.1732264036668112686.stgit@bahia.lan>
Tested-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_ovec.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
index 12510b236a..318bf33de4 100644
--- a/hw/ppc/spapr_ovec.c
+++ b/hw/ppc/spapr_ovec.c
@@ -16,7 +16,6 @@
 #include "qemu/bitmap.h"
 #include "exec/address-spaces.h"
 #include "qemu/error-report.h"
-#include "sysemu/qtest.h"
 #include "trace.h"
 #include <libfdt.h>
 
@@ -132,11 +131,6 @@ bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr)
     g_assert(ov);
     g_assert(bitnr < OV_MAXBITS);
 
-    /* support memory unplug for qtest */
-    if (qtest_enabled() && bitnr == OV5_HP_EVT) {
-        return true;
-    }
-
     return test_bit(bitnr, ov->bitmap) ? true : false;
 }
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 05/60] target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (3 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 04/60] Revert "spapr: support memory unplug for qtest" David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 06/60] target/ppc: Implement large decrementer support for TCG David Gibson
                   ` (56 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

Add spapr_cap SPAPR_CAP_LARGE_DECREMENTER to be used to control the
availability of the large decrementer for a guest.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190301024317.22137-1-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c         |  2 ++
 hw/ppc/spapr_caps.c    | 17 +++++++++++++++++
 include/hw/ppc/spapr.h |  5 ++++-
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index f7d527464c..e07e5370d3 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2088,6 +2088,7 @@ static const VMStateDescription vmstate_spapr = {
         &vmstate_spapr_irq_map,
         &vmstate_spapr_cap_nested_kvm_hv,
         &vmstate_spapr_dtb,
+        &vmstate_spapr_cap_large_decr,
         NULL
     }
 };
@@ -4302,6 +4303,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN;
     smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */
     smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF;
+    smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF;
     spapr_caps_add_properties(smc, &error_abort);
     smc->irq = &spapr_irq_xics;
     smc->dr_phb_enabled = true;
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 64f98ae68d..3f90f5823e 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -390,6 +390,13 @@ static void cap_nested_kvm_hv_apply(sPAPRMachineState *spapr,
     }
 }
 
+static void cap_large_decr_apply(sPAPRMachineState *spapr,
+                                 uint8_t val, Error **errp)
+{
+    if (val)
+        error_setg(errp, "No large decrementer support, try cap-large-decr=off");
+}
+
 sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
     [SPAPR_CAP_HTM] = {
         .name = "htm",
@@ -468,6 +475,15 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
         .type = "bool",
         .apply = cap_nested_kvm_hv_apply,
     },
+    [SPAPR_CAP_LARGE_DECREMENTER] = {
+        .name = "large-decr",
+        .description = "Allow Large Decrementer",
+        .index = SPAPR_CAP_LARGE_DECREMENTER,
+        .get = spapr_cap_get_bool,
+        .set = spapr_cap_set_bool,
+        .type = "bool",
+        .apply = cap_large_decr_apply,
+    },
 };
 
 static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr,
@@ -596,6 +612,7 @@ SPAPR_CAP_MIG_STATE(cfpc, SPAPR_CAP_CFPC);
 SPAPR_CAP_MIG_STATE(sbbc, SPAPR_CAP_SBBC);
 SPAPR_CAP_MIG_STATE(ibs, SPAPR_CAP_IBS);
 SPAPR_CAP_MIG_STATE(nested_kvm_hv, SPAPR_CAP_NESTED_KVM_HV);
+SPAPR_CAP_MIG_STATE(large_decr, SPAPR_CAP_LARGE_DECREMENTER);
 
 void spapr_caps_init(sPAPRMachineState *spapr)
 {
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 59073a7579..8efc5e0779 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -74,8 +74,10 @@ typedef enum {
 #define SPAPR_CAP_HPT_MAXPAGESIZE       0x06
 /* Nested KVM-HV */
 #define SPAPR_CAP_NESTED_KVM_HV         0x07
+/* Large Decrementer */
+#define SPAPR_CAP_LARGE_DECREMENTER     0x08
 /* Num Caps */
-#define SPAPR_CAP_NUM                   (SPAPR_CAP_NESTED_KVM_HV + 1)
+#define SPAPR_CAP_NUM                   (SPAPR_CAP_LARGE_DECREMENTER + 1)
 
 /*
  * Capability Values
@@ -828,6 +830,7 @@ extern const VMStateDescription vmstate_spapr_cap_cfpc;
 extern const VMStateDescription vmstate_spapr_cap_sbbc;
 extern const VMStateDescription vmstate_spapr_cap_ibs;
 extern const VMStateDescription vmstate_spapr_cap_nested_kvm_hv;
+extern const VMStateDescription vmstate_spapr_cap_large_decr;
 
 static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap)
 {
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 06/60] target/ppc: Implement large decrementer support for TCG
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (4 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 05/60] target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 07/60] target/ppc: Implement large decrementer support for KVM David Gibson
                   ` (55 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh,
	Cédric Le Goater, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

Prior to POWER9 the decrementer was a 32-bit register which decremented
with each tick of the timebase. From POWER9 onwards the decrementer can
be set to operate in a mode called large decrementer where it acts as a
n-bit decrementing register which is visible as a 64-bit register, that
is the value of the decrementer is sign extended to 64 bits (where n is
implementation dependant).

The mode in which the decrementer operates is controlled by the LPCR_LD
bit in the logical paritition control register (LPCR).

>From POWER9 onwards the HDEC (hypervisor decrementer) was enlarged to
h-bits, also sign extended to 64 bits (where h is implementation
dependant). Note this isn't configurable and is always enabled.

On POWER9 the large decrementer and hdec are both 56 bits, as
represented by the lrg_decr_bits cpu class property. Since they are the
same size we only add one property for now, which could be extended in
the case they ever differ in the future.

We also add the lrg_decr_bits property for POWER5+/7/8 since it is used
to determine the size of the hdec, which is only generated on the
POWER5+ processor and later. On these processors it is 32 bits.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190301024317.22137-2-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/ppc.c                    | 85 +++++++++++++++++++++++----------
 hw/ppc/spapr.c                  |  8 ++++
 hw/ppc/spapr_caps.c             | 30 +++++++++++-
 target/ppc/cpu-qom.h            |  1 +
 target/ppc/cpu.h                |  8 ++--
 target/ppc/mmu-hash64.c         |  2 +-
 target/ppc/translate.c          |  2 +-
 target/ppc/translate_init.inc.c |  4 ++
 8 files changed, 107 insertions(+), 33 deletions(-)

diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
index d1e3d4cd20..9145aeddcb 100644
--- a/hw/ppc/ppc.c
+++ b/hw/ppc/ppc.c
@@ -744,11 +744,10 @@ bool ppc_decr_clear_on_delivery(CPUPPCState *env)
     return ((tb_env->flags & flags) == PPC_DECR_UNDERFLOW_TRIGGERED);
 }
 
-static inline uint32_t _cpu_ppc_load_decr(CPUPPCState *env, uint64_t next)
+static inline int64_t _cpu_ppc_load_decr(CPUPPCState *env, uint64_t next)
 {
     ppc_tb_t *tb_env = env->tb_env;
-    uint32_t decr;
-    int64_t diff;
+    int64_t decr, diff;
 
     diff = next - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
     if (diff >= 0) {
@@ -758,27 +757,47 @@ static inline uint32_t _cpu_ppc_load_decr(CPUPPCState *env, uint64_t next)
     }  else {
         decr = -muldiv64(-diff, tb_env->decr_freq, NANOSECONDS_PER_SECOND);
     }
-    LOG_TB("%s: %08" PRIx32 "\n", __func__, decr);
+    LOG_TB("%s: %016" PRIx64 "\n", __func__, decr);
 
     return decr;
 }
 
-uint32_t cpu_ppc_load_decr (CPUPPCState *env)
+target_ulong cpu_ppc_load_decr (CPUPPCState *env)
 {
     ppc_tb_t *tb_env = env->tb_env;
+    uint64_t decr;
 
     if (kvm_enabled()) {
         return env->spr[SPR_DECR];
     }
 
-    return _cpu_ppc_load_decr(env, tb_env->decr_next);
+    decr = _cpu_ppc_load_decr(env, tb_env->decr_next);
+
+    /*
+     * If large decrementer is enabled then the decrementer is signed extened
+     * to 64 bits, otherwise it is a 32 bit value.
+     */
+    if (env->spr[SPR_LPCR] & LPCR_LD)
+        return decr;
+    return (uint32_t) decr;
 }
 
-uint32_t cpu_ppc_load_hdecr (CPUPPCState *env)
+target_ulong cpu_ppc_load_hdecr (CPUPPCState *env)
 {
+    PowerPCCPU *cpu = ppc_env_get_cpu(env);
+    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     ppc_tb_t *tb_env = env->tb_env;
+    uint64_t hdecr;
 
-    return _cpu_ppc_load_decr(env, tb_env->hdecr_next);
+    hdecr =  _cpu_ppc_load_decr(env, tb_env->hdecr_next);
+
+    /*
+     * If we have a large decrementer (POWER9 or later) then hdecr is sign
+     * extended to 64 bits, otherwise it is 32 bits.
+     */
+    if (pcc->lrg_decr_bits > 32)
+        return hdecr;
+    return (uint32_t) hdecr;
 }
 
 uint64_t cpu_ppc_load_purr (CPUPPCState *env)
@@ -832,13 +851,21 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp,
                                  QEMUTimer *timer,
                                  void (*raise_excp)(void *),
                                  void (*lower_excp)(PowerPCCPU *),
-                                 uint32_t decr, uint32_t value)
+                                 target_ulong decr, target_ulong value,
+                                 int nr_bits)
 {
     CPUPPCState *env = &cpu->env;
     ppc_tb_t *tb_env = env->tb_env;
     uint64_t now, next;
+    bool negative;
+
+    /* Truncate value to decr_width and sign extend for simplicity */
+    value &= ((1ULL << nr_bits) - 1);
+    negative = !!(value & (1ULL << (nr_bits - 1)));
+    if (negative)
+        value |= (0xFFFFFFFFULL << nr_bits);
 
-    LOG_TB("%s: %08" PRIx32 " => %08" PRIx32 "\n", __func__,
+    LOG_TB("%s: " TARGET_FMT_lx " => " TARGET_FMT_lx "\n", __func__,
                 decr, value);
 
     if (kvm_enabled()) {
@@ -860,15 +887,15 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp,
      * an edge interrupt, so raise it here too.
      */
     if ((value < 3) ||
-        ((tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL) && (value & 0x80000000)) ||
-        ((tb_env->flags & PPC_DECR_UNDERFLOW_TRIGGERED) && (value & 0x80000000)
-          && !(decr & 0x80000000))) {
+        ((tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL) && negative) ||
+        ((tb_env->flags & PPC_DECR_UNDERFLOW_TRIGGERED) && negative
+          && !(decr & (1ULL << (nr_bits - 1))))) {
         (*raise_excp)(cpu);
         return;
     }
 
     /* On MSB level based systems a 0 for the MSB stops interrupt delivery */
-    if (!(value & 0x80000000) && (tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL)) {
+    if (!negative && (tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL)) {
         (*lower_excp)(cpu);
     }
 
@@ -881,21 +908,25 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp,
     timer_mod(timer, next);
 }
 
-static inline void _cpu_ppc_store_decr(PowerPCCPU *cpu, uint32_t decr,
-                                       uint32_t value)
+static inline void _cpu_ppc_store_decr(PowerPCCPU *cpu, target_ulong decr,
+                                       target_ulong value, int nr_bits)
 {
     ppc_tb_t *tb_env = cpu->env.tb_env;
 
     __cpu_ppc_store_decr(cpu, &tb_env->decr_next, tb_env->decr_timer,
                          tb_env->decr_timer->cb, &cpu_ppc_decr_lower, decr,
-                         value);
+                         value, nr_bits);
 }
 
-void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value)
+void cpu_ppc_store_decr (CPUPPCState *env, target_ulong value)
 {
     PowerPCCPU *cpu = ppc_env_get_cpu(env);
+    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+    int nr_bits = 32;
+    if (env->spr[SPR_LPCR] & LPCR_LD)
+        nr_bits = pcc->lrg_decr_bits;
 
-    _cpu_ppc_store_decr(cpu, cpu_ppc_load_decr(env), value);
+    _cpu_ppc_store_decr(cpu, cpu_ppc_load_decr(env), value, nr_bits);
 }
 
 static void cpu_ppc_decr_cb(void *opaque)
@@ -905,23 +936,25 @@ static void cpu_ppc_decr_cb(void *opaque)
     cpu_ppc_decr_excp(cpu);
 }
 
-static inline void _cpu_ppc_store_hdecr(PowerPCCPU *cpu, uint32_t hdecr,
-                                        uint32_t value)
+static inline void _cpu_ppc_store_hdecr(PowerPCCPU *cpu, target_ulong hdecr,
+                                        target_ulong value, int nr_bits)
 {
     ppc_tb_t *tb_env = cpu->env.tb_env;
 
     if (tb_env->hdecr_timer != NULL) {
         __cpu_ppc_store_decr(cpu, &tb_env->hdecr_next, tb_env->hdecr_timer,
                              tb_env->hdecr_timer->cb, &cpu_ppc_hdecr_lower,
-                             hdecr, value);
+                             hdecr, value, nr_bits);
     }
 }
 
-void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value)
+void cpu_ppc_store_hdecr (CPUPPCState *env, target_ulong value)
 {
     PowerPCCPU *cpu = ppc_env_get_cpu(env);
+    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
 
-    _cpu_ppc_store_hdecr(cpu, cpu_ppc_load_hdecr(env), value);
+    _cpu_ppc_store_hdecr(cpu, cpu_ppc_load_hdecr(env), value,
+                         pcc->lrg_decr_bits);
 }
 
 static void cpu_ppc_hdecr_cb(void *opaque)
@@ -951,8 +984,8 @@ static void cpu_ppc_set_tb_clk (void *opaque, uint32_t freq)
      * if a decrementer exception is pending when it enables msr_ee at startup,
      * it's not ready to handle it...
      */
-    _cpu_ppc_store_decr(cpu, 0xFFFFFFFF, 0xFFFFFFFF);
-    _cpu_ppc_store_hdecr(cpu, 0xFFFFFFFF, 0xFFFFFFFF);
+    _cpu_ppc_store_decr(cpu, 0xFFFFFFFF, 0xFFFFFFFF, 32);
+    _cpu_ppc_store_hdecr(cpu, 0xFFFFFFFF, 0xFFFFFFFF, 32);
     cpu_ppc_store_purr(cpu, 0x0000000000000000ULL);
 }
 
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index e07e5370d3..6b54ad260a 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -558,6 +558,14 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
                           pcc->radix_page_info->count *
                           sizeof(radix_AP_encodings[0]))));
     }
+
+    /*
+     * We set this property to let the guest know that it can use the large
+     * decrementer and its width in bits.
+     */
+    if (spapr_get_cap(spapr, SPAPR_CAP_LARGE_DECREMENTER) != SPAPR_CAP_OFF)
+        _FDT((fdt_setprop_u32(fdt, offset, "ibm,dec-bits",
+                              pcc->lrg_decr_bits)));
 }
 
 static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 3f90f5823e..9a34d1f4ed 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -393,8 +393,35 @@ static void cap_nested_kvm_hv_apply(sPAPRMachineState *spapr,
 static void cap_large_decr_apply(sPAPRMachineState *spapr,
                                  uint8_t val, Error **errp)
 {
-    if (val)
+    PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
+
+    if (!val)
+        return; /* Disabled by default */
+
+    if (tcg_enabled()) {
+        if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_00, 0,
+                              spapr->max_compat_pvr)) {
+            error_setg(errp,
+                "Large decrementer only supported on POWER9, try -cpu POWER9");
+            return;
+        }
+    } else {
         error_setg(errp, "No large decrementer support, try cap-large-decr=off");
+    }
+}
+
+static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr,
+                                     PowerPCCPU *cpu,
+                                     uint8_t val, Error **errp)
+{
+    CPUPPCState *env = &cpu->env;
+    target_ulong lpcr = env->spr[SPR_LPCR];
+
+    if (val)
+        lpcr |= LPCR_LD;
+    else
+        lpcr &= ~LPCR_LD;
+    ppc_store_lpcr(cpu, lpcr);
 }
 
 sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
@@ -483,6 +510,7 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
         .set = spapr_cap_set_bool,
         .type = "bool",
         .apply = cap_large_decr_apply,
+        .cpu_apply = cap_large_decr_cpu_apply,
     },
 };
 
diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
index ae51fe754e..be9b4c30c3 100644
--- a/target/ppc/cpu-qom.h
+++ b/target/ppc/cpu-qom.h
@@ -190,6 +190,7 @@ typedef struct PowerPCCPUClass {
 #endif
     const PPCHash64Options *hash64_opts;
     struct ppc_radix_page_info *radix_page_info;
+    uint32_t lrg_decr_bits;
     void (*init_proc)(CPUPPCState *env);
     int  (*check_pow)(CPUPPCState *env);
     int (*handle_mmu_fault)(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx);
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 26604ddf98..81763d72f9 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -1321,10 +1321,10 @@ uint32_t cpu_ppc_load_atbu (CPUPPCState *env);
 void cpu_ppc_store_atbl (CPUPPCState *env, uint32_t value);
 void cpu_ppc_store_atbu (CPUPPCState *env, uint32_t value);
 bool ppc_decr_clear_on_delivery(CPUPPCState *env);
-uint32_t cpu_ppc_load_decr (CPUPPCState *env);
-void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value);
-uint32_t cpu_ppc_load_hdecr (CPUPPCState *env);
-void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value);
+target_ulong cpu_ppc_load_decr (CPUPPCState *env);
+void cpu_ppc_store_decr (CPUPPCState *env, target_ulong value);
+target_ulong cpu_ppc_load_hdecr (CPUPPCState *env);
+void cpu_ppc_store_hdecr (CPUPPCState *env, target_ulong value);
 uint64_t cpu_ppc_load_purr (CPUPPCState *env);
 uint32_t cpu_ppc601_load_rtcl (CPUPPCState *env);
 uint32_t cpu_ppc601_load_rtcu (CPUPPCState *env);
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index c431303eff..a2b1ec5040 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -1109,7 +1109,7 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
     case POWERPC_MMU_3_00: /* P9 */
         lpcr = val & (LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
                       (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
-                      LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR |
+                      LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
                       (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
                       LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC |
                       LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE);
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index 819221f246..b156be4d98 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -7417,7 +7417,7 @@ void ppc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
 #if !defined(NO_TIMER_DUMP)
     cpu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64
 #if !defined(CONFIG_USER_ONLY)
-                " DECR %08" PRIu32
+                " DECR " TARGET_FMT_lu
 #endif
                 "\n",
                 cpu_ppc_load_tbu(env), cpu_ppc_load_tbl(env)
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index 58542c0fe0..af70a3b78c 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -8376,6 +8376,7 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
 #if defined(CONFIG_SOFTMMU)
     pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
     pcc->hash64_opts = &ppc_hash64_opts_basic;
+    pcc->lrg_decr_bits = 32;
 #endif
     pcc->excp_model = POWERPC_EXCP_970;
     pcc->bus_model = PPC_FLAGS_INPUT_970;
@@ -8550,6 +8551,7 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
 #if defined(CONFIG_SOFTMMU)
     pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
     pcc->hash64_opts = &ppc_hash64_opts_POWER7;
+    pcc->lrg_decr_bits = 32;
 #endif
     pcc->excp_model = POWERPC_EXCP_POWER7;
     pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
@@ -8718,6 +8720,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
 #if defined(CONFIG_SOFTMMU)
     pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
     pcc->hash64_opts = &ppc_hash64_opts_POWER7;
+    pcc->lrg_decr_bits = 32;
 #endif
     pcc->excp_model = POWERPC_EXCP_POWER8;
     pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
@@ -8926,6 +8929,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
     /* segment page size remain the same */
     pcc->hash64_opts = &ppc_hash64_opts_POWER7;
     pcc->radix_page_info = &POWER9_radix_page_info;
+    pcc->lrg_decr_bits = 56;
 #endif
     pcc->excp_model = POWERPC_EXCP_POWER9;
     pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 07/60] target/ppc: Implement large decrementer support for KVM
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (5 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 06/60] target/ppc: Implement large decrementer support for TCG David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 08/60] target/ppc/spapr: Enable the large decrementer for pseries-4.0 David Gibson
                   ` (54 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh,
	Cédric Le Goater, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

Implement support to allow KVM guests to take advantage of the large
decrementer introduced on POWER9 cpus.

To determine if the host can support the requested large decrementer
size, we check it matches that specified in the ibm,dec-bits device-tree
property. We also need to enable it in KVM by setting the LPCR_LD bit in
the LPCR. Note that to do this we need to try and set the bit, then read
it back to check the host allowed us to set it, if so we can use it but
if we were unable to set it the host cannot support it and we must not
use the large decrementer.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190301024317.22137-3-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_caps.c  | 18 ++++++++++++++++--
 target/ppc/kvm.c     | 39 +++++++++++++++++++++++++++++++++++++++
 target/ppc/kvm_ppc.h | 12 ++++++++++++
 3 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 9a34d1f4ed..1e76685199 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -394,6 +394,7 @@ static void cap_large_decr_apply(sPAPRMachineState *spapr,
                                  uint8_t val, Error **errp)
 {
     PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
+    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
 
     if (!val)
         return; /* Disabled by default */
@@ -405,8 +406,16 @@ static void cap_large_decr_apply(sPAPRMachineState *spapr,
                 "Large decrementer only supported on POWER9, try -cpu POWER9");
             return;
         }
-    } else {
-        error_setg(errp, "No large decrementer support, try cap-large-decr=off");
+    } else if (kvm_enabled()) {
+        int kvm_nr_bits = kvmppc_get_cap_large_decr();
+
+        if (!kvm_nr_bits) {
+            error_setg(errp, "No large decrementer support, try cap-large-decr=off");
+        } else if (pcc->lrg_decr_bits != kvm_nr_bits) {
+            error_setg(errp,
+"KVM large decrementer size (%d) differs to model (%d), try -cap-large-decr=off",
+                kvm_nr_bits, pcc->lrg_decr_bits);
+        }
     }
 }
 
@@ -417,6 +426,11 @@ static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr,
     CPUPPCState *env = &cpu->env;
     target_ulong lpcr = env->spr[SPR_LPCR];
 
+    if (kvm_enabled()) {
+        if (kvmppc_enable_cap_large_decr(cpu, val))
+            error_setg(errp, "No large decrementer support, try cap-large-decr=off");
+    }
+
     if (val)
         lpcr |= LPCR_LD;
     else
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index d01852fe31..3f650c8fc4 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -91,6 +91,7 @@ static int cap_ppc_safe_cache;
 static int cap_ppc_safe_bounds_check;
 static int cap_ppc_safe_indirect_branch;
 static int cap_ppc_nested_kvm_hv;
+static int cap_large_decr;
 
 static uint32_t debug_inst_opcode;
 
@@ -124,6 +125,7 @@ static bool kvmppc_is_pr(KVMState *ks)
 
 static int kvm_ppc_register_host_cpu_type(MachineState *ms);
 static void kvmppc_get_cpu_characteristics(KVMState *s);
+static int kvmppc_get_dec_bits(void);
 
 int kvm_arch_init(MachineState *ms, KVMState *s)
 {
@@ -151,6 +153,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
     cap_resize_hpt = kvm_vm_check_extension(s, KVM_CAP_SPAPR_RESIZE_HPT);
     kvmppc_get_cpu_characteristics(s);
     cap_ppc_nested_kvm_hv = kvm_vm_check_extension(s, KVM_CAP_PPC_NESTED_HV);
+    cap_large_decr = kvmppc_get_dec_bits();
     /*
      * Note: setting it to false because there is not such capability
      * in KVM at this moment.
@@ -1927,6 +1930,15 @@ uint64_t kvmppc_get_clockfreq(void)
     return kvmppc_read_int_cpu_dt("clock-frequency");
 }
 
+static int kvmppc_get_dec_bits(void)
+{
+    int nr_bits = kvmppc_read_int_cpu_dt("ibm,dec-bits");
+
+    if (nr_bits > 0)
+        return nr_bits;
+    return 0;
+}
+
 static int kvmppc_get_pvinfo(CPUPPCState *env, struct kvm_ppc_pvinfo *pvinfo)
  {
      PowerPCCPU *cpu = ppc_env_get_cpu(env);
@@ -2442,6 +2454,33 @@ bool kvmppc_has_cap_spapr_vfio(void)
     return cap_spapr_vfio;
 }
 
+int kvmppc_get_cap_large_decr(void)
+{
+    return cap_large_decr;
+}
+
+int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable)
+{
+    CPUState *cs = CPU(cpu);
+    uint64_t lpcr;
+
+    kvm_get_one_reg(cs, KVM_REG_PPC_LPCR_64, &lpcr);
+    /* Do we need to modify the LPCR? */
+    if (!!(lpcr & LPCR_LD) != !!enable) {
+        if (enable)
+            lpcr |= LPCR_LD;
+        else
+            lpcr &= ~LPCR_LD;
+        kvm_set_one_reg(cs, KVM_REG_PPC_LPCR_64, &lpcr);
+        kvm_get_one_reg(cs, KVM_REG_PPC_LPCR_64, &lpcr);
+
+        if (!!(lpcr & LPCR_LD) != !!enable)
+            return -1;
+    }
+
+    return 0;
+}
+
 PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void)
 {
     uint32_t host_pvr = mfpvr();
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index bdfaa4e70a..a79835bd14 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -64,6 +64,8 @@ int kvmppc_get_cap_safe_bounds_check(void);
 int kvmppc_get_cap_safe_indirect_branch(void);
 bool kvmppc_has_cap_nested_kvm_hv(void);
 int kvmppc_set_cap_nested_kvm_hv(int enable);
+int kvmppc_get_cap_large_decr(void);
+int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable);
 int kvmppc_enable_hwrng(void);
 int kvmppc_put_books_sregs(PowerPCCPU *cpu);
 PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void);
@@ -332,6 +334,16 @@ static inline int kvmppc_set_cap_nested_kvm_hv(int enable)
     return -1;
 }
 
+static inline int kvmppc_get_cap_large_decr(void)
+{
+    return 0;
+}
+
+static inline int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable)
+{
+    return -1;
+}
+
 static inline int kvmppc_enable_hwrng(void)
 {
     return -1;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 08/60] target/ppc/spapr: Enable the large decrementer for pseries-4.0
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (6 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 07/60] target/ppc: Implement large decrementer support for KVM David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 09/60] target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS David Gibson
                   ` (53 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

Enable the large decrementer by default for the pseries-4.0 machine type.
It is disabled again by default_caps_with_cpu() for pre-POWER9 cpus
since they don't support the large decrementer.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190301024317.22137-4-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c      | 3 ++-
 hw/ppc/spapr_caps.c | 5 +++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 6b54ad260a..8e24d7dc50 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4311,7 +4311,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN;
     smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */
     smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF;
-    smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF;
+    smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON;
     spapr_caps_add_properties(smc, &error_abort);
     smc->irq = &spapr_irq_xics;
     smc->dr_phb_enabled = true;
@@ -4387,6 +4387,7 @@ static void spapr_machine_3_1_class_options(MachineClass *mc)
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
     smc->update_dt_enabled = false;
     smc->dr_phb_enabled = false;
+    smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF;
 }
 
 DEFINE_SPAPR_MACHINE(3_1, "3.1", false);
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 1e76685199..920224d0c2 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -536,6 +536,11 @@ static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr,
 
     caps = smc->default_caps;
 
+    if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_3_00,
+                               0, spapr->max_compat_pvr)) {
+        caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF;
+    }
+
     if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_2_07,
                                0, spapr->max_compat_pvr)) {
         caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 09/60] target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (7 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 08/60] target/ppc/spapr: Enable the large decrementer for pseries-4.0 David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 10/60] target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST David Gibson
                   ` (52 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

The spapr_cap SPAPR_CAP_IBS is used to indicate the level of capability
for mitigations for indirect branch speculation. Currently the available
values are broken (default), fixed-ibs (fixed by serialising indirect
branches) and fixed-ccd (fixed by diabling the count cache).

Introduce a new value for this capability denoted workaround, meaning that
software can work around the issue by flushing the count cache on
context switch. This option is available if the hypervisor sets the
H_CPU_BEHAV_FLUSH_COUNT_CACHE flag in the cpu behaviours returned from
the KVM_PPC_GET_CPU_CHAR ioctl.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190301031912.28809-1-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_caps.c    | 21 ++++++++++-----------
 hw/ppc/spapr_hcall.c   |  5 +++++
 include/hw/ppc/spapr.h |  7 +++++++
 target/ppc/kvm.c       |  8 +++++++-
 4 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 920224d0c2..74a48a423a 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -276,11 +276,13 @@ static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t val,
 }
 
 sPAPRCapPossible cap_ibs_possible = {
-    .num = 4,
+    .num = 5,
     /* Note workaround only maintained for compatibility */
-    .vals = {"broken", "workaround", "fixed-ibs", "fixed-ccd"},
-    .help = "broken - no protection, fixed-ibs - indirect branch serialisation,"
-            " fixed-ccd - cache count disabled",
+    .vals = {"broken", "workaround", "fixed-ibs", "fixed-ccd", "fixed-na"},
+    .help = "broken - no protection, workaround - count cache flush"
+            ", fixed-ibs - indirect branch serialisation,"
+            " fixed-ccd - cache count disabled,"
+            " fixed-na - fixed in hardware (no longer applicable)",
 };
 
 static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr,
@@ -288,15 +290,11 @@ static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr,
 {
     uint8_t kvm_val = kvmppc_get_cap_safe_indirect_branch();
 
-    if (val == SPAPR_CAP_WORKAROUND) { /* Can only be Broken or Fixed */
-        error_setg(errp,
-"Requested safe indirect branch capability level \"workaround\" not valid, try cap-ibs=%s",
-                   cap_ibs_possible.vals[kvm_val]);
-    } else if (tcg_enabled() && val) {
+    if (tcg_enabled() && val) {
         /* TODO - for now only allow broken for TCG */
         error_setg(errp,
 "Requested safe indirect branch capability level not supported by tcg, try a different value for cap-ibs");
-    } else if (kvm_enabled() && val && (val != kvm_val)) {
+    } else if (kvm_enabled() && (val > kvm_val)) {
         error_setg(errp,
 "Requested safe indirect branch capability level not supported by kvm, try cap-ibs=%s",
                    cap_ibs_possible.vals[kvm_val]);
@@ -489,7 +487,8 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
     [SPAPR_CAP_IBS] = {
         .name = "ibs",
         .description =
-            "Indirect Branch Speculation (broken, fixed-ibs, fixed-ccd)",
+            "Indirect Branch Speculation (broken, workaround, fixed-ibs,"
+            "fixed-ccd, fixed-na)",
         .index = SPAPR_CAP_IBS,
         .get = spapr_cap_get_string,
         .set = spapr_cap_set_string,
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 476bad6271..4aa8036fc0 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1723,12 +1723,17 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
     }
 
     switch (safe_indirect_branch) {
+    case SPAPR_CAP_FIXED_NA:
+        break;
     case SPAPR_CAP_FIXED_CCD:
         characteristics |= H_CPU_CHAR_CACHE_COUNT_DIS;
         break;
     case SPAPR_CAP_FIXED_IBS:
         characteristics |= H_CPU_CHAR_BCCTRL_SERIALISED;
         break;
+    case SPAPR_CAP_WORKAROUND:
+        behaviour |= H_CPU_BEHAV_FLUSH_COUNT_CACHE;
+        break;
     default: /* broken */
         assert(safe_indirect_branch == SPAPR_CAP_BROKEN);
         break;
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 8efc5e0779..a7f3b1bfdd 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -85,12 +85,17 @@ typedef enum {
 /* Bool Caps */
 #define SPAPR_CAP_OFF                   0x00
 #define SPAPR_CAP_ON                    0x01
+
 /* Custom Caps */
+
+/* Generic */
 #define SPAPR_CAP_BROKEN                0x00
 #define SPAPR_CAP_WORKAROUND            0x01
 #define SPAPR_CAP_FIXED                 0x02
+/* SPAPR_CAP_IBS (cap-ibs) */
 #define SPAPR_CAP_FIXED_IBS             0x02
 #define SPAPR_CAP_FIXED_CCD             0x03
+#define SPAPR_CAP_FIXED_NA              0x10 /* Lets leave a bit of a gap... */
 
 typedef struct sPAPRCapabilities sPAPRCapabilities;
 struct sPAPRCapabilities {
@@ -339,9 +344,11 @@ struct sPAPRMachineState {
 #define H_CPU_CHAR_HON_BRANCH_HINTS             PPC_BIT(5)
 #define H_CPU_CHAR_THR_RECONF_TRIG              PPC_BIT(6)
 #define H_CPU_CHAR_CACHE_COUNT_DIS              PPC_BIT(7)
+#define H_CPU_CHAR_BCCTR_FLUSH_ASSIST           PPC_BIT(9)
 #define H_CPU_BEHAV_FAVOUR_SECURITY             PPC_BIT(0)
 #define H_CPU_BEHAV_L1D_FLUSH_PR                PPC_BIT(1)
 #define H_CPU_BEHAV_BNDS_CHK_SPEC_BAR           PPC_BIT(2)
+#define H_CPU_BEHAV_FLUSH_COUNT_CACHE           PPC_BIT(5)
 
 /* Each control block has to be on a 4K boundary */
 #define H_CB_ALIGNMENT     4096
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 3f650c8fc4..7a7a5adee3 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2391,7 +2391,13 @@ static int parse_cap_ppc_safe_bounds_check(struct kvm_ppc_cpu_char c)
 
 static int parse_cap_ppc_safe_indirect_branch(struct kvm_ppc_cpu_char c)
 {
-    if (c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) {
+    if ((~c.behaviour & c.behaviour_mask & H_CPU_BEHAV_FLUSH_COUNT_CACHE) &&
+        (~c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) &&
+        (~c.character & c.character_mask & H_CPU_CHAR_BCCTRL_SERIALISED)) {
+        return SPAPR_CAP_FIXED_NA;
+    } else if (c.behaviour & c.behaviour_mask & H_CPU_BEHAV_FLUSH_COUNT_CACHE) {
+        return SPAPR_CAP_WORKAROUND;
+    } else if (c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) {
         return  SPAPR_CAP_FIXED_CCD;
     } else if (c.character & c.character_mask & H_CPU_CHAR_BCCTRL_SERIALISED) {
         return SPAPR_CAP_FIXED_IBS;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 10/60] target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (8 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 09/60] target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 11/60] target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg David Gibson
                   ` (51 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

Introduce a new spapr_cap SPAPR_CAP_CCF_ASSIST to be used to indicate
the requirement for a hw-assisted version of the count cache flush
workaround.

The count cache flush workaround is a software workaround which can be
used to flush the count cache on context switch. Some revisions of
hardware may have a hardware accelerated flush, in which case the
software flush can be shortened. This cap is used to set the
availability of such hardware acceleration for the count cache flush
routine.

The availability of such hardware acceleration is indicated by the
H_CPU_CHAR_BCCTR_FLUSH_ASSIST flag being set in the characteristics
returned from the KVM_PPC_GET_CPU_CHAR ioctl.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190301031912.28809-2-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c         |  2 ++
 hw/ppc/spapr_caps.c    | 25 +++++++++++++++++++++++++
 hw/ppc/spapr_hcall.c   |  3 +++
 include/hw/ppc/spapr.h |  5 ++++-
 target/ppc/kvm.c       | 14 ++++++++++++++
 target/ppc/kvm_ppc.h   |  6 ++++++
 6 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 8e24d7dc50..37fd7a1411 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2097,6 +2097,7 @@ static const VMStateDescription vmstate_spapr = {
         &vmstate_spapr_cap_nested_kvm_hv,
         &vmstate_spapr_dtb,
         &vmstate_spapr_cap_large_decr,
+        &vmstate_spapr_cap_ccf_assist,
         NULL
     }
 };
@@ -4312,6 +4313,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */
     smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF;
     smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON;
+    smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF;
     spapr_caps_add_properties(smc, &error_abort);
     smc->irq = &spapr_irq_xics;
     smc->dr_phb_enabled = true;
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index 74a48a423a..f03f2f64e7 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -436,6 +436,21 @@ static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr,
     ppc_store_lpcr(cpu, lpcr);
 }
 
+static void cap_ccf_assist_apply(sPAPRMachineState *spapr, uint8_t val,
+                                 Error **errp)
+{
+    uint8_t kvm_val = kvmppc_get_cap_count_cache_flush_assist();
+
+    if (tcg_enabled() && val) {
+        /* TODO - for now only allow broken for TCG */
+        error_setg(errp,
+"Requested count cache flush assist capability level not supported by tcg, try cap-ccf-assist=off");
+    } else if (kvm_enabled() && (val > kvm_val)) {
+        error_setg(errp,
+"Requested count cache flush assist capability level not supported by kvm, try cap-ccf-assist=off");
+    }
+}
+
 sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
     [SPAPR_CAP_HTM] = {
         .name = "htm",
@@ -525,6 +540,15 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
         .apply = cap_large_decr_apply,
         .cpu_apply = cap_large_decr_cpu_apply,
     },
+    [SPAPR_CAP_CCF_ASSIST] = {
+        .name = "ccf-assist",
+        .description = "Count Cache Flush Assist via HW Instruction",
+        .index = SPAPR_CAP_CCF_ASSIST,
+        .get = spapr_cap_get_bool,
+        .set = spapr_cap_set_bool,
+        .type = "bool",
+        .apply = cap_ccf_assist_apply,
+    },
 };
 
 static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr,
@@ -659,6 +683,7 @@ SPAPR_CAP_MIG_STATE(sbbc, SPAPR_CAP_SBBC);
 SPAPR_CAP_MIG_STATE(ibs, SPAPR_CAP_IBS);
 SPAPR_CAP_MIG_STATE(nested_kvm_hv, SPAPR_CAP_NESTED_KVM_HV);
 SPAPR_CAP_MIG_STATE(large_decr, SPAPR_CAP_LARGE_DECREMENTER);
+SPAPR_CAP_MIG_STATE(ccf_assist, SPAPR_CAP_CCF_ASSIST);
 
 void spapr_caps_init(sPAPRMachineState *spapr)
 {
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 4aa8036fc0..8bfdddc964 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1693,6 +1693,7 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
     uint8_t safe_cache = spapr_get_cap(spapr, SPAPR_CAP_CFPC);
     uint8_t safe_bounds_check = spapr_get_cap(spapr, SPAPR_CAP_SBBC);
     uint8_t safe_indirect_branch = spapr_get_cap(spapr, SPAPR_CAP_IBS);
+    uint8_t count_cache_flush_assist = spapr_get_cap(spapr, SPAPR_CAP_CCF_ASSIST);
 
     switch (safe_cache) {
     case SPAPR_CAP_WORKAROUND:
@@ -1733,6 +1734,8 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
         break;
     case SPAPR_CAP_WORKAROUND:
         behaviour |= H_CPU_BEHAV_FLUSH_COUNT_CACHE;
+        if (count_cache_flush_assist)
+            characteristics |= H_CPU_CHAR_BCCTR_FLUSH_ASSIST;
         break;
     default: /* broken */
         assert(safe_indirect_branch == SPAPR_CAP_BROKEN);
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index a7f3b1bfdd..ff1bd60615 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -76,8 +76,10 @@ typedef enum {
 #define SPAPR_CAP_NESTED_KVM_HV         0x07
 /* Large Decrementer */
 #define SPAPR_CAP_LARGE_DECREMENTER     0x08
+/* Count Cache Flush Assist HW Instruction */
+#define SPAPR_CAP_CCF_ASSIST            0x09
 /* Num Caps */
-#define SPAPR_CAP_NUM                   (SPAPR_CAP_LARGE_DECREMENTER + 1)
+#define SPAPR_CAP_NUM                   (SPAPR_CAP_CCF_ASSIST + 1)
 
 /*
  * Capability Values
@@ -838,6 +840,7 @@ extern const VMStateDescription vmstate_spapr_cap_sbbc;
 extern const VMStateDescription vmstate_spapr_cap_ibs;
 extern const VMStateDescription vmstate_spapr_cap_nested_kvm_hv;
 extern const VMStateDescription vmstate_spapr_cap_large_decr;
+extern const VMStateDescription vmstate_spapr_cap_ccf_assist;
 
 static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap)
 {
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 7a7a5adee3..e0f0de0ce0 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -90,6 +90,7 @@ static int cap_ppc_pvr_compat;
 static int cap_ppc_safe_cache;
 static int cap_ppc_safe_bounds_check;
 static int cap_ppc_safe_indirect_branch;
+static int cap_ppc_count_cache_flush_assist;
 static int cap_ppc_nested_kvm_hv;
 static int cap_large_decr;
 
@@ -2406,6 +2407,13 @@ static int parse_cap_ppc_safe_indirect_branch(struct kvm_ppc_cpu_char c)
     return 0;
 }
 
+static int parse_cap_ppc_count_cache_flush_assist(struct kvm_ppc_cpu_char c)
+{
+    if (c.character & c.character_mask & H_CPU_CHAR_BCCTR_FLUSH_ASSIST)
+        return 1;
+    return 0;
+}
+
 static void kvmppc_get_cpu_characteristics(KVMState *s)
 {
     struct kvm_ppc_cpu_char c;
@@ -2428,6 +2436,7 @@ static void kvmppc_get_cpu_characteristics(KVMState *s)
     cap_ppc_safe_cache = parse_cap_ppc_safe_cache(c);
     cap_ppc_safe_bounds_check = parse_cap_ppc_safe_bounds_check(c);
     cap_ppc_safe_indirect_branch = parse_cap_ppc_safe_indirect_branch(c);
+    cap_ppc_count_cache_flush_assist = parse_cap_ppc_count_cache_flush_assist(c);
 }
 
 int kvmppc_get_cap_safe_cache(void)
@@ -2445,6 +2454,11 @@ int kvmppc_get_cap_safe_indirect_branch(void)
     return cap_ppc_safe_indirect_branch;
 }
 
+int kvmppc_get_cap_count_cache_flush_assist(void)
+{
+    return cap_ppc_count_cache_flush_assist;
+}
+
 bool kvmppc_has_cap_nested_kvm_hv(void)
 {
     return !!cap_ppc_nested_kvm_hv;
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index a79835bd14..2937b36cae 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -62,6 +62,7 @@ bool kvmppc_has_cap_mmu_hash_v3(void);
 int kvmppc_get_cap_safe_cache(void);
 int kvmppc_get_cap_safe_bounds_check(void);
 int kvmppc_get_cap_safe_indirect_branch(void);
+int kvmppc_get_cap_count_cache_flush_assist(void);
 bool kvmppc_has_cap_nested_kvm_hv(void);
 int kvmppc_set_cap_nested_kvm_hv(int enable);
 int kvmppc_get_cap_large_decr(void);
@@ -324,6 +325,11 @@ static inline int kvmppc_get_cap_safe_indirect_branch(void)
     return 0;
 }
 
+static inline int kvmppc_get_cap_count_cache_flush_assist(void)
+{
+    return 0;
+}
+
 static inline bool kvmppc_has_cap_nested_kvm_hv(void)
 {
     return false;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 11/60] target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (9 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 10/60] target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 12/60] target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type David Gibson
                   ` (50 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

The spapr_caps cap-cfpc, cap-sbbc and cap-ibs are used to control the
availability of certain mitigations to the guest. These haven't been
implemented under TCG, it is unlikely they ever will be, and it is unclear
as to whether they even need to be.

As such, make failure to apply these capabilities under TCG non-fatal.
Instead we print a warning message to the user but still allow the guest
to continue.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190301044609.9626-2-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_caps.c | 33 ++++++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 9 deletions(-)

diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index f03f2f64e7..b68d767d63 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -239,17 +239,22 @@ sPAPRCapPossible cap_cfpc_possible = {
 static void cap_safe_cache_apply(sPAPRMachineState *spapr, uint8_t val,
                                  Error **errp)
 {
+    Error *local_err = NULL;
     uint8_t kvm_val =  kvmppc_get_cap_safe_cache();
 
     if (tcg_enabled() && val) {
-        /* TODO - for now only allow broken for TCG */
-        error_setg(errp,
-"Requested safe cache capability level not supported by tcg, try a different value for cap-cfpc");
+        /* TCG only supports broken, allow other values and print a warning */
+        error_setg(&local_err,
+                   "TCG doesn't support requested feature, cap-cfpc=%s",
+                   cap_cfpc_possible.vals[val]);
     } else if (kvm_enabled() && (val > kvm_val)) {
         error_setg(errp,
 "Requested safe cache capability level not supported by kvm, try cap-cfpc=%s",
                    cap_cfpc_possible.vals[kvm_val]);
     }
+
+    if (local_err != NULL)
+        warn_report_err(local_err);
 }
 
 sPAPRCapPossible cap_sbbc_possible = {
@@ -262,17 +267,22 @@ sPAPRCapPossible cap_sbbc_possible = {
 static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t val,
                                         Error **errp)
 {
+    Error *local_err = NULL;
     uint8_t kvm_val =  kvmppc_get_cap_safe_bounds_check();
 
     if (tcg_enabled() && val) {
-        /* TODO - for now only allow broken for TCG */
-        error_setg(errp,
-"Requested safe bounds check capability level not supported by tcg, try a different value for cap-sbbc");
+        /* TCG only supports broken, allow other values and print a warning */
+        error_setg(&local_err,
+                   "TCG doesn't support requested feature, cap-sbbc=%s",
+                   cap_sbbc_possible.vals[val]);
     } else if (kvm_enabled() && (val > kvm_val)) {
         error_setg(errp,
 "Requested safe bounds check capability level not supported by kvm, try cap-sbbc=%s",
                    cap_sbbc_possible.vals[kvm_val]);
     }
+
+    if (local_err != NULL)
+        warn_report_err(local_err);
 }
 
 sPAPRCapPossible cap_ibs_possible = {
@@ -288,17 +298,22 @@ sPAPRCapPossible cap_ibs_possible = {
 static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr,
                                            uint8_t val, Error **errp)
 {
+    Error *local_err = NULL;
     uint8_t kvm_val = kvmppc_get_cap_safe_indirect_branch();
 
     if (tcg_enabled() && val) {
-        /* TODO - for now only allow broken for TCG */
-        error_setg(errp,
-"Requested safe indirect branch capability level not supported by tcg, try a different value for cap-ibs");
+        /* TCG only supports broken, allow other values and print a warning */
+        error_setg(&local_err,
+                   "TCG doesn't support requested feature, cap-ibs=%s",
+                   cap_ibs_possible.vals[val]);
     } else if (kvm_enabled() && (val > kvm_val)) {
         error_setg(errp,
 "Requested safe indirect branch capability level not supported by kvm, try cap-ibs=%s",
                    cap_ibs_possible.vals[kvm_val]);
     }
+
+    if (local_err != NULL)
+        warn_report_err(local_err);
 }
 
 #define VALUE_DESC_TRISTATE     " (broken, workaround, fixed)"
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 12/60] target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (10 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 11/60] target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 13/60] target/ppc: Move exception vector offset computation into a function David Gibson
                   ` (49 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

There are currently 3 mitigations the availability of which is controlled
by the spapr-caps mechanism, cap-cfpc, cap-sbbc, and cap-ibs. Enable these
mitigations by default for the pseries-4.0 machine type.

By now machine firmware should have been upgraded to allow these
settings.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190301044609.9626-3-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 37fd7a1411..946bbcf9ee 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4307,9 +4307,9 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
     smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
     smc->default_caps.caps[SPAPR_CAP_VSX] = SPAPR_CAP_ON;
     smc->default_caps.caps[SPAPR_CAP_DFP] = SPAPR_CAP_ON;
-    smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN;
-    smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN;
-    smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN;
+    smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_WORKAROUND;
+    smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_WORKAROUND;
+    smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_WORKAROUND;
     smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */
     smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF;
     smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON;
@@ -4389,6 +4389,9 @@ static void spapr_machine_3_1_class_options(MachineClass *mc)
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
     smc->update_dt_enabled = false;
     smc->dr_phb_enabled = false;
+    smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN;
+    smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN;
+    smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN;
     smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF;
 }
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 13/60] target/ppc: Move exception vector offset computation into a function
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (11 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 12/60] target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 14/60] target/ppc: Move handling of hardware breakpoints to a separate function David Gibson
                   ` (48 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Fabiano Rosas,
	Alexey Kardashevskiy, David Gibson

From: Fabiano Rosas <farosas@linux.ibm.com>

Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Message-Id: <20190228225759.21328-2-farosas@linux.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/excp_helper.c | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c
index 39bedbb11d..beafcf1ebd 100644
--- a/target/ppc/excp_helper.c
+++ b/target/ppc/excp_helper.c
@@ -107,6 +107,24 @@ static int powerpc_reset_wakeup(CPUState *cs, CPUPPCState *env, int excp,
     return POWERPC_EXCP_RESET;
 }
 
+static uint64_t ppc_excp_vector_offset(CPUState *cs, int ail)
+{
+    uint64_t offset = 0;
+
+    switch (ail) {
+    case AIL_0001_8000:
+        offset = 0x18000;
+        break;
+    case AIL_C000_0000_0000_4000:
+        offset = 0xc000000000004000ull;
+        break;
+    default:
+        cpu_abort(cs, "Invalid AIL combination %d\n", ail);
+        break;
+    }
+
+    return offset;
+}
 
 /* Note that this function should be greatly optimized
  * when called with a constant excp, from ppc_hw_interrupt
@@ -708,17 +726,7 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp)
     /* Handle AIL */
     if (ail) {
         new_msr |= (1 << MSR_IR) | (1 << MSR_DR);
-        switch(ail) {
-        case AIL_0001_8000:
-            vector |= 0x18000;
-            break;
-        case AIL_C000_0000_0000_4000:
-            vector |= 0xc000000000004000ull;
-            break;
-        default:
-            cpu_abort(cs, "Invalid AIL combination %d\n", ail);
-            break;
-        }
+        vector |= ppc_excp_vector_offset(cs, ail);
     }
 
 #if defined(TARGET_PPC64)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 14/60] target/ppc: Move handling of hardware breakpoints to a separate function
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (12 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 13/60] target/ppc: Move exception vector offset computation into a function David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 15/60] target/ppc: Refactor kvm_handle_debug David Gibson
                   ` (47 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Fabiano Rosas, David Gibson

From: Fabiano Rosas <farosas@linux.ibm.com>

This is in preparation for a refactoring of the kvm_handle_debug
function in the next patch.

Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com>
Message-Id: <20190228225759.21328-4-farosas@linux.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/kvm.c | 47 ++++++++++++++++++++++++++++-------------------
 1 file changed, 28 insertions(+), 19 deletions(-)

diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index e0f0de0ce0..996b08a1d3 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -1597,35 +1597,44 @@ void kvm_arch_update_guest_debug(CPUState *cs, struct kvm_guest_debug *dbg)
     }
 }
 
+static int kvm_handle_hw_breakpoint(CPUState *cs,
+                                    struct kvm_debug_exit_arch *arch_info)
+{
+    int handle = 0;
+    int n;
+    int flag = 0;
+
+    if (nb_hw_breakpoint + nb_hw_watchpoint > 0) {
+        if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) {
+            n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW);
+            if (n >= 0) {
+                handle = 1;
+            }
+        } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ |
+                                        KVMPPC_DEBUG_WATCH_WRITE)) {
+            n = find_hw_watchpoint(arch_info->address,  &flag);
+            if (n >= 0) {
+                handle = 1;
+                cs->watchpoint_hit = &hw_watchpoint;
+                hw_watchpoint.vaddr = hw_debug_points[n].addr;
+                hw_watchpoint.flags = flag;
+            }
+        }
+    }
+    return handle;
+}
+
 static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run)
 {
     CPUState *cs = CPU(cpu);
     CPUPPCState *env = &cpu->env;
     struct kvm_debug_exit_arch *arch_info = &run->debug.arch;
     int handle = 0;
-    int n;
-    int flag = 0;
 
     if (cs->singlestep_enabled) {
         handle = 1;
     } else if (arch_info->status) {
-        if (nb_hw_breakpoint + nb_hw_watchpoint > 0) {
-            if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) {
-                n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW);
-                if (n >= 0) {
-                    handle = 1;
-                }
-            } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ |
-                                            KVMPPC_DEBUG_WATCH_WRITE)) {
-                n = find_hw_watchpoint(arch_info->address,  &flag);
-                if (n >= 0) {
-                    handle = 1;
-                    cs->watchpoint_hit = &hw_watchpoint;
-                    hw_watchpoint.vaddr = hw_debug_points[n].addr;
-                    hw_watchpoint.flags = flag;
-                }
-            }
-        }
+        handle = kvm_handle_hw_breakpoint(cs, arch_info);
     } else if (kvm_find_sw_breakpoint(cs, arch_info->address)) {
         handle = 1;
     } else {
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 15/60] target/ppc: Refactor kvm_handle_debug
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (13 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 14/60] target/ppc: Move handling of hardware breakpoints to a separate function David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 16/60] PPC: E500: Update u-boot to v2019.01 David Gibson
                   ` (46 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Fabiano Rosas,
	Alexey Kardashevskiy, David Gibson

From: Fabiano Rosas <farosas@linux.ibm.com>

There are four scenarios being handled in this function:

- single stepping
- hardware breakpoints
- software breakpoints
- fallback (no debug supported)

A future patch will add code to handle specific single step and
software breakpoints cases so let's split each scenario into its own
function now to avoid hurting readability.

Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Message-Id: <20190228225759.21328-5-farosas@linux.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/kvm.c | 86 ++++++++++++++++++++++++++++--------------------
 1 file changed, 50 insertions(+), 36 deletions(-)

diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 996b08a1d3..4e3f1e4b78 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -1624,52 +1624,66 @@ static int kvm_handle_hw_breakpoint(CPUState *cs,
     return handle;
 }
 
+static int kvm_handle_singlestep(void)
+{
+    return 1;
+}
+
+static int kvm_handle_sw_breakpoint(void)
+{
+    return 1;
+}
+
 static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run)
 {
     CPUState *cs = CPU(cpu);
     CPUPPCState *env = &cpu->env;
     struct kvm_debug_exit_arch *arch_info = &run->debug.arch;
-    int handle = 0;
 
     if (cs->singlestep_enabled) {
-        handle = 1;
-    } else if (arch_info->status) {
-        handle = kvm_handle_hw_breakpoint(cs, arch_info);
-    } else if (kvm_find_sw_breakpoint(cs, arch_info->address)) {
-        handle = 1;
-    } else {
-        /* QEMU is not able to handle debug exception, so inject
-         * program exception to guest;
-         * Yes program exception NOT debug exception !!
-         * When QEMU is using debug resources then debug exception must
-         * be always set. To achieve this we set MSR_DE and also set
-         * MSRP_DEP so guest cannot change MSR_DE.
-         * When emulating debug resource for guest we want guest
-         * to control MSR_DE (enable/disable debug interrupt on need).
-         * Supporting both configurations are NOT possible.
-         * So the result is that we cannot share debug resources
-         * between QEMU and Guest on BOOKE architecture.
-         * In the current design QEMU gets the priority over guest,
-         * this means that if QEMU is using debug resources then guest
-         * cannot use them;
-         * For software breakpoint QEMU uses a privileged instruction;
-         * So there cannot be any reason that we are here for guest
-         * set debug exception, only possibility is guest executed a
-         * privileged / illegal instruction and that's why we are
-         * injecting a program interrupt.
-         */
+        return kvm_handle_singlestep();
+    }
 
-        cpu_synchronize_state(cs);
-        /* env->nip is PC, so increment this by 4 to use
-         * ppc_cpu_do_interrupt(), which set srr0 = env->nip - 4.
-         */
-        env->nip += 4;
-        cs->exception_index = POWERPC_EXCP_PROGRAM;
-        env->error_code = POWERPC_EXCP_INVAL;
-        ppc_cpu_do_interrupt(cs);
+    if (arch_info->status) {
+        return kvm_handle_hw_breakpoint(cs, arch_info);
     }
 
-    return handle;
+    if (kvm_find_sw_breakpoint(cs, arch_info->address)) {
+        return kvm_handle_sw_breakpoint();
+    }
+
+    /*
+     * QEMU is not able to handle debug exception, so inject
+     * program exception to guest;
+     * Yes program exception NOT debug exception !!
+     * When QEMU is using debug resources then debug exception must
+     * be always set. To achieve this we set MSR_DE and also set
+     * MSRP_DEP so guest cannot change MSR_DE.
+     * When emulating debug resource for guest we want guest
+     * to control MSR_DE (enable/disable debug interrupt on need).
+     * Supporting both configurations are NOT possible.
+     * So the result is that we cannot share debug resources
+     * between QEMU and Guest on BOOKE architecture.
+     * In the current design QEMU gets the priority over guest,
+     * this means that if QEMU is using debug resources then guest
+     * cannot use them;
+     * For software breakpoint QEMU uses a privileged instruction;
+     * So there cannot be any reason that we are here for guest
+     * set debug exception, only possibility is guest executed a
+     * privileged / illegal instruction and that's why we are
+     * injecting a program interrupt.
+     */
+    cpu_synchronize_state(cs);
+    /*
+     * env->nip is PC, so increment this by 4 to use
+     * ppc_cpu_do_interrupt(), which set srr0 = env->nip - 4.
+     */
+    env->nip += 4;
+    cs->exception_index = POWERPC_EXCP_PROGRAM;
+    env->error_code = POWERPC_EXCP_INVAL;
+    ppc_cpu_do_interrupt(cs);
+
+    return 0;
 }
 
 int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 16/60] PPC: E500: Update u-boot to v2019.01
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (14 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 15/60] target/ppc: Refactor kvm_handle_debug David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 17/60] target/ppc/spapr: Clear partition table entry when allocating hash table David Gibson
                   ` (45 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Alexander Graf, David Gibson

From: Alexander Graf <agraf@csgraf.de>

Quite a while has passed since we last updated U-Boot for e500. This patch
bumps it to the last released version 2019.01 to make sure users don't feel
like they're using out of date software.

Signed-off-by: Alexander Graf <agraf@csgraf.de>
Message-Id: <20190304103930.16319-1-agraf@csgraf.de>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 pc-bios/u-boot.e500 | Bin 388672 -> 349148 bytes
 roms/u-boot         |   2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)

diff --git a/pc-bios/u-boot.e500 b/pc-bios/u-boot.e500
index 25537f8fe35f1a3f559544d43274b4fb80b572e9..732660f348f6123d24144ee29ef38611428dc2d9 100644
GIT binary patch
literal 349148
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

literal 388672
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

diff --git a/roms/u-boot b/roms/u-boot
index d85ca029f2..d3689267f9 160000
--- a/roms/u-boot
+++ b/roms/u-boot
@@ -1 +1 @@
-Subproject commit d85ca029f257b53a96da6c2fb421e78a003a9943
+Subproject commit d3689267f92c5956e09cc7d1baa4700141662bff
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 17/60] target/ppc/spapr: Clear partition table entry when allocating hash table
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (15 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 16/60] PPC: E500: Update u-boot to v2019.01 David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 18/60] spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit) David Gibson
                   ` (44 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

If we allocate a hash page table then we know that the guest won't be
using process tables, so set the partition table entry maintained for
the guest to zero. If this isn't done, then the guest radix bit will
remain set in the entry. This means that when the guest calls
H_REGISTER_PROCESS_TABLE there will be a mismatch between then flags
and the value in spapr->patb_entry, and the call will fail. The guest
will then panic:

Failed to register process table (rc=-4)
kernel BUG at arch/powerpc/platforms/pseries/lpar.c:959

The result being that it isn't possible to boot a hash guest on a P9
system.

Also fix a bug in the flags parsing in h_register_process_table() which
was introduced by the same patch, and simplify the handling to make it
less likely that errors will be introduced in the future. The effect
would have been setting the host radix bit LPCR_HR for a hash guest
using process tables, which currently isn't supported and so couldn't
have been triggered.

Fixes: 00fd075e18 "target/ppc/spapr: Set LPCR:HR when using Radix mode"

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190305022102.17610-1-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c       |  1 +
 hw/ppc/spapr_hcall.c | 12 ++++++++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 946bbcf9ee..755056875c 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1632,6 +1632,7 @@ void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
         }
     }
     /* We're setting up a hash table, so that means we're not radix */
+    spapr->patb_entry = 0;
     spapr_set_all_lpcrs(0, LPCR_HR | LPCR_UPRT);
 }
 
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 8bfdddc964..7016a09386 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1339,6 +1339,7 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu,
     target_ulong proc_tbl = args[1];
     target_ulong page_size = args[2];
     target_ulong table_size = args[3];
+    target_ulong update_lpcr = 0;
     uint64_t cproc;
 
     if (flags & ~FLAGS_MASK) { /* Check no reserved bits are set */
@@ -1394,10 +1395,13 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu,
     spapr->patb_entry = cproc; /* Save new process table */
 
     /* Update the UPRT, HR and GTSE bits in the LPCR for all cpus */
-    spapr_set_all_lpcrs(((flags & (FLAG_RADIX | FLAG_HASH_PROC_TBL)) ?
-                         (LPCR_UPRT | LPCR_HR) : 0) |
-                        ((flags & FLAG_GTSE) ? LPCR_GTSE : 0),
-                        LPCR_UPRT | LPCR_HR | LPCR_GTSE);
+    if (flags & FLAG_RADIX)     /* Radix must use process tables, also set HR */
+        update_lpcr |= (LPCR_UPRT | LPCR_HR);
+    else if (flags & FLAG_HASH_PROC_TBL) /* Hash with process tables */
+        update_lpcr |= LPCR_UPRT;
+    if (flags & FLAG_GTSE)      /* Guest translation shootdown enable */
+        update_lpcr |= FLAG_GTSE;
+    spapr_set_all_lpcrs(update_lpcr, LPCR_UPRT | LPCR_HR | LPCR_GTSE);
 
     if (kvm_enabled()) {
         return kvmppc_configure_v3_mmu(cpu, flags & FLAG_RADIX,
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 18/60] spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit)
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (16 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 17/60] target/ppc/spapr: Clear partition table entry when allocating hash table David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 19/60] target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling David Gibson
                   ` (43 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell; +Cc: groug, qemu-ppc, qemu-devel, lvivier, David Gibson

SPAPR_MEMORY_BLOCK_SIZE is logically a difference in memory addresses, and
hence of type hwaddr which is 64-bit.  Previously it wasn't marked as such
which means that it could be treated as 32-bit.  That will work in some
circumstances but if multiplied by another 32-bit value it could lead to
a 32-bit overflow and an incorrect result.

One specific instance of this in spapr_lmb_dt_populate() was spotted by
Coverity (CID 1399145).

Reported-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 include/hw/ppc/spapr.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index ff1bd60615..1311ebe28e 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -792,7 +792,7 @@ int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset);
 
 #define TYPE_SPAPR_RNG "spapr-rng"
 
-#define SPAPR_MEMORY_BLOCK_SIZE (1 << 28) /* 256MB */
+#define SPAPR_MEMORY_BLOCK_SIZE ((hwaddr)1 << 28) /* 256MB */
 
 /*
  * This defines the maximum number of DIMM slots we can have for sPAPR
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 19/60] target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (17 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 18/60] spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit) David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 20/60] PPC: E500: Add FSL I2C controller and integrate RTC with it David Gibson
                   ` (42 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Suraj Jitindar Singh, David Gibson

From: Suraj Jitindar Singh <sjitindarsingh@gmail.com>

The H_CALL H_PAGE_INIT can be used to zero or copy a page of guest
memory. Enable the in-kernel H_PAGE_INIT handler.

The in-kernel handler takes half the time to complete compared to
handling the H_CALL in userspace.

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Message-Id: <20190306060608.19935-1-sjitindarsingh@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c       | 3 +++
 target/ppc/kvm.c     | 5 +++++
 target/ppc/kvm_ppc.h | 5 +++++
 3 files changed, 13 insertions(+)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 755056875c..e764e89806 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2822,6 +2822,9 @@ static void spapr_machine_init(MachineState *machine)
 
         /* H_CLEAR_MOD/_REF are mandatory in PAPR, but off by default */
         kvmppc_enable_clear_ref_mod_hcalls();
+
+        /* Enable H_PAGE_INIT */
+        kvmppc_enable_h_page_init();
     }
 
     /* allocate RAM */
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 4e3f1e4b78..d0bfb076df 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2043,6 +2043,11 @@ void kvmppc_enable_clear_ref_mod_hcalls(void)
     kvmppc_enable_hcall(kvm_state, H_CLEAR_MOD);
 }
 
+void kvmppc_enable_h_page_init(void)
+{
+    kvmppc_enable_hcall(kvm_state, H_PAGE_INIT);
+}
+
 void kvmppc_set_papr(PowerPCCPU *cpu)
 {
     CPUState *cs = CPU(cpu);
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index 2937b36cae..2c2ea30e87 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -23,6 +23,7 @@ int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level);
 void kvmppc_enable_logical_ci_hcalls(void);
 void kvmppc_enable_set_mode_hcall(void);
 void kvmppc_enable_clear_ref_mod_hcalls(void);
+void kvmppc_enable_h_page_init(void);
 void kvmppc_set_papr(PowerPCCPU *cpu);
 int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr);
 void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy);
@@ -138,6 +139,10 @@ static inline void kvmppc_enable_clear_ref_mod_hcalls(void)
 {
 }
 
+static inline void kvmppc_enable_h_page_init(void)
+{
+}
+
 static inline void kvmppc_set_papr(PowerPCCPU *cpu)
 {
 }
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 20/60] PPC: E500: Add FSL I2C controller and integrate RTC with it
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (18 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 19/60] target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 21/60] ppc/xive: hardwire the Physical CAM line of the thread context David Gibson
                   ` (41 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Andrew Randrianasulu,
	Amit Singh Tomar, David Gibson

From: Andrew Randrianasulu <randrianasulu@gmail.com>

Original commit message:
This patch adds an emulation model for i2c controller found on most of the FSL SoCs.
It also integrates the RTC (ds1338) that sits on the i2c Bus with e500 machine model.

Patch was originally written by Amit Singh Tomar <amit.tomar@freescale.com>
see http://patchwork.ozlabs.org/patch/431475/
I only fixed it enough for application on top of current qemu master
20b084c4b1401b7f8fbc385649d48c67b6f43d44, and hopefully fixed checkpatch errors

Tested by booting Linux kernel 4.20.12. Now e500 machine doesn't need
network time protocol daemon because it will have working RTC
(before all timestamps on files were from 2016)

Signed-off-by: Amit Singh Tomar <amit.tomar@freescale.com>
Signed-off-by: Andrew Randrianasulu <randrianasulu@gmail.com>
Message-Id: <20190306102812.28972-1-randrianasulu@gmail.com>
[dwg: Add Kconfig stanza to define the new symbol]
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 default-configs/ppc-softmmu.mak |   2 +
 hw/i2c/Kconfig                  |   4 +
 hw/i2c/Makefile.objs            |   1 +
 hw/i2c/mpc_i2c.c                | 357 ++++++++++++++++++++++++++++++++
 hw/ppc/e500.c                   |  54 +++++
 5 files changed, 418 insertions(+)
 create mode 100644 hw/i2c/mpc_i2c.c

diff --git a/default-configs/ppc-softmmu.mak b/default-configs/ppc-softmmu.mak
index 6ea36d4090..bf86128a0c 100644
--- a/default-configs/ppc-softmmu.mak
+++ b/default-configs/ppc-softmmu.mak
@@ -1,6 +1,8 @@
 # Default configuration for ppc-softmmu
 
 # For embedded PPCs:
+CONFIG_MPC_I2C=y
+CONFIG_DS1338=y
 CONFIG_E500=y
 CONFIG_PPC405=y
 CONFIG_PPC440=y
diff --git a/hw/i2c/Kconfig b/hw/i2c/Kconfig
index ef1caa6d89..820b24de5b 100644
--- a/hw/i2c/Kconfig
+++ b/hw/i2c/Kconfig
@@ -25,3 +25,7 @@ config BITBANG_I2C
 config IMX_I2C
     bool
     select I2C
+
+config MPC_I2C
+    bool
+    select I2C
diff --git a/hw/i2c/Makefile.objs b/hw/i2c/Makefile.objs
index 2a3c106551..5f76b6a990 100644
--- a/hw/i2c/Makefile.objs
+++ b/hw/i2c/Makefile.objs
@@ -9,5 +9,6 @@ common-obj-$(CONFIG_EXYNOS4) += exynos4210_i2c.o
 common-obj-$(CONFIG_IMX_I2C) += imx_i2c.o
 common-obj-$(CONFIG_ASPEED_SOC) += aspeed_i2c.o
 common-obj-$(CONFIG_NRF51_SOC) += microbit_i2c.o
+common-obj-$(CONFIG_MPC_I2C) += mpc_i2c.o
 obj-$(CONFIG_OMAP) += omap_i2c.o
 obj-$(CONFIG_PPC4XX) += ppc4xx_i2c.o
diff --git a/hw/i2c/mpc_i2c.c b/hw/i2c/mpc_i2c.c
new file mode 100644
index 0000000000..693ca7ef6b
--- /dev/null
+++ b/hw/i2c/mpc_i2c.c
@@ -0,0 +1,357 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Amit Tomar, <Amit.Tomar@freescale.com>
+ *
+ * Description:
+ * This file is derived from IMX I2C controller,
+ * by Jean-Christophe DUBOIS .
+ *
+ * Thanks to Scott Wood and Alexander Graf for their kind help on this.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2 or later,
+ * as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "qemu/osdep.h"
+#include "hw/i2c/i2c.h"
+#include "qemu/log.h"
+#include "hw/sysbus.h"
+
+/* #define DEBUG_I2C */
+
+#ifdef DEBUG_I2C
+#define DPRINTF(fmt, ...)              \
+    do { fprintf(stderr, "mpc_i2c[%s]: " fmt, __func__, ## __VA_ARGS__); \
+    } while (0)
+#else
+#define DPRINTF(fmt, ...) do {} while (0)
+#endif
+
+#define TYPE_MPC_I2C "mpc-i2c"
+#define MPC_I2C(obj) \
+    OBJECT_CHECK(MPCI2CState, (obj), TYPE_MPC_I2C)
+
+#define MPC_I2C_ADR   0x00
+#define MPC_I2C_FDR   0x04
+#define MPC_I2C_CR    0x08
+#define MPC_I2C_SR    0x0c
+#define MPC_I2C_DR    0x10
+#define MPC_I2C_DFSRR 0x14
+
+#define CCR_MEN  (1 << 7)
+#define CCR_MIEN (1 << 6)
+#define CCR_MSTA (1 << 5)
+#define CCR_MTX  (1 << 4)
+#define CCR_TXAK (1 << 3)
+#define CCR_RSTA (1 << 2)
+#define CCR_BCST (1 << 0)
+
+#define CSR_MCF  (1 << 7)
+#define CSR_MAAS (1 << 6)
+#define CSR_MBB  (1 << 5)
+#define CSR_MAL  (1 << 4)
+#define CSR_SRW  (1 << 2)
+#define CSR_MIF  (1 << 1)
+#define CSR_RXAK (1 << 0)
+
+#define CADR_MASK 0xFE
+#define CFDR_MASK 0x3F
+#define CCR_MASK  0xFC
+#define CSR_MASK  0xED
+#define CDR_MASK  0xFF
+
+#define CYCLE_RESET 0xFF
+
+typedef struct MPCI2CState {
+    SysBusDevice parent_obj;
+
+    I2CBus *bus;
+    qemu_irq irq;
+    MemoryRegion iomem;
+
+    uint8_t address;
+    uint8_t adr;
+    uint8_t fdr;
+    uint8_t cr;
+    uint8_t sr;
+    uint8_t dr;
+    uint8_t dfssr;
+} MPCI2CState;
+
+static bool mpc_i2c_is_enabled(MPCI2CState *s)
+{
+    return s->cr & CCR_MEN;
+}
+
+static bool mpc_i2c_is_master(MPCI2CState *s)
+{
+    return s->cr & CCR_MSTA;
+}
+
+static bool mpc_i2c_direction_is_tx(MPCI2CState *s)
+{
+    return s->cr & CCR_MTX;
+}
+
+static bool mpc_i2c_irq_pending(MPCI2CState *s)
+{
+    return s->sr & CSR_MIF;
+}
+
+static bool mpc_i2c_irq_is_enabled(MPCI2CState *s)
+{
+    return s->cr & CCR_MIEN;
+}
+
+static void mpc_i2c_reset(DeviceState *dev)
+{
+    MPCI2CState *i2c = MPC_I2C(dev);
+
+    i2c->address = 0xFF;
+    i2c->adr = 0x00;
+    i2c->fdr = 0x00;
+    i2c->cr =  0x00;
+    i2c->sr =  0x81;
+    i2c->dr =  0x00;
+}
+
+static void mpc_i2c_irq(MPCI2CState *s)
+{
+    bool irq_active = false;
+
+    if (mpc_i2c_is_enabled(s) && mpc_i2c_irq_is_enabled(s)
+                              && mpc_i2c_irq_pending(s)) {
+        irq_active = true;
+    }
+
+    if (irq_active) {
+        qemu_irq_raise(s->irq);
+    } else {
+        qemu_irq_lower(s->irq);
+    }
+}
+
+static void mpc_i2c_soft_reset(MPCI2CState *s)
+{
+    /* This is a soft reset. ADR is preserved during soft resets */
+    uint8_t adr = s->adr;
+    mpc_i2c_reset(DEVICE(s));
+    s->adr = adr;
+}
+
+static void  mpc_i2c_address_send(MPCI2CState *s)
+{
+    /* if returns non zero slave address is not right */
+    if (i2c_start_transfer(s->bus, s->dr >> 1, s->dr & (0x01))) {
+        s->sr |= CSR_RXAK;
+    } else {
+        s->address = s->dr;
+        s->sr &= ~CSR_RXAK;
+        s->sr |=  CSR_MCF; /* Set after Byte Transfer is completed */
+        s->sr |=  CSR_MIF; /* Set after Byte Transfer is completed */
+        mpc_i2c_irq(s);
+    }
+}
+
+static void  mpc_i2c_data_send(MPCI2CState *s)
+{
+    if (i2c_send(s->bus, s->dr)) {
+        /* End of transfer */
+        s->sr |= CSR_RXAK;
+        i2c_end_transfer(s->bus);
+    } else {
+        s->sr &= ~CSR_RXAK;
+        s->sr |=  CSR_MCF; /* Set after Byte Transfer is completed */
+        s->sr |=  CSR_MIF; /* Set after Byte Transfer is completed */
+        mpc_i2c_irq(s);
+    }
+}
+
+static void  mpc_i2c_data_recive(MPCI2CState *s)
+{
+    int ret;
+    /* get the next byte */
+    ret = i2c_recv(s->bus);
+    if (ret >= 0) {
+        s->sr |= CSR_MCF; /* Set after Byte Transfer is completed */
+        s->sr |= CSR_MIF; /* Set after Byte Transfer is completed */
+        mpc_i2c_irq(s);
+    } else {
+        DPRINTF("read failed for device");
+        ret = 0xff;
+    }
+    s->dr = ret;
+}
+
+static uint64_t mpc_i2c_read(void *opaque, hwaddr addr, unsigned size)
+{
+    MPCI2CState *s = opaque;
+    uint8_t value;
+
+    switch (addr) {
+    case MPC_I2C_ADR:
+        value = s->adr;
+        break;
+    case MPC_I2C_FDR:
+        value = s->fdr;
+        break;
+    case MPC_I2C_CR:
+        value = s->cr;
+        break;
+    case MPC_I2C_SR:
+        value = s->sr;
+        break;
+    case MPC_I2C_DR:
+        value = s->dr;
+        if (mpc_i2c_is_master(s)) { /* master mode */
+            if (mpc_i2c_direction_is_tx(s)) {
+                DPRINTF("MTX is set not in recv mode\n");
+            } else {
+                mpc_i2c_data_recive(s);
+            }
+        }
+        break;
+    default:
+        value = 0;
+        DPRINTF("ERROR: Bad read addr 0x%x\n", (unsigned int)addr);
+        break;
+    }
+
+    DPRINTF("%s: addr " TARGET_FMT_plx " %02" PRIx32 "\n", __func__,
+                                         addr, value);
+    return (uint64_t)value;
+}
+
+static void mpc_i2c_write(void *opaque, hwaddr addr,
+                            uint64_t value, unsigned size)
+{
+    MPCI2CState *s = opaque;
+
+    DPRINTF("%s: addr " TARGET_FMT_plx " val %08" PRIx64 "\n", __func__,
+                                             addr, value);
+    switch (addr) {
+    case MPC_I2C_ADR:
+        s->adr = value & CADR_MASK;
+        break;
+    case MPC_I2C_FDR:
+        s->fdr = value & CFDR_MASK;
+        break;
+    case MPC_I2C_CR:
+        if (mpc_i2c_is_enabled(s) && ((value & CCR_MEN) == 0)) {
+            mpc_i2c_soft_reset(s);
+            break;
+        }
+        /* normal write */
+        s->cr = value & CCR_MASK;
+        if (mpc_i2c_is_master(s)) { /* master mode */
+            /* set the bus to busy after master is set as per RM */
+            s->sr |= CSR_MBB;
+        } else {
+            /* bus is not busy anymore */
+            s->sr &= ~CSR_MBB;
+            /* Reset the address for fresh write/read cycle */
+        if (s->address != CYCLE_RESET) {
+            i2c_end_transfer(s->bus);
+            s->address = CYCLE_RESET;
+            }
+        }
+        /* For restart end the onging transfer */
+        if (s->cr & CCR_RSTA) {
+            if (s->address != CYCLE_RESET) {
+                s->address = CYCLE_RESET;
+                i2c_end_transfer(s->bus);
+                s->cr &= ~CCR_RSTA;
+            }
+        }
+        break;
+    case MPC_I2C_SR:
+        s->sr = value & CSR_MASK;
+        /* Lower the interrupt */
+        if (!(s->sr & CSR_MIF) || !(s->sr & CSR_MAL)) {
+            mpc_i2c_irq(s);
+        }
+        break;
+    case MPC_I2C_DR:
+        /* if the device is not enabled, nothing to do */
+        if (!mpc_i2c_is_enabled(s)) {
+            break;
+        }
+        s->dr = value & CDR_MASK;
+        if (mpc_i2c_is_master(s)) { /* master mode */
+            if (s->address == CYCLE_RESET) {
+                mpc_i2c_address_send(s);
+            } else {
+                mpc_i2c_data_send(s);
+            }
+        }
+        break;
+    case MPC_I2C_DFSRR:
+        s->dfssr = value;
+        break;
+    default:
+        DPRINTF("ERROR: Bad write addr 0x%x\n", (unsigned int)addr);
+        break;
+    }
+}
+
+static const MemoryRegionOps i2c_ops = {
+    .read =  mpc_i2c_read,
+    .write =  mpc_i2c_write,
+    .valid.max_access_size = 1,
+    .endianness = DEVICE_NATIVE_ENDIAN,
+};
+
+static const VMStateDescription mpc_i2c_vmstate = {
+    .name = TYPE_MPC_I2C,
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT8(address, MPCI2CState),
+        VMSTATE_UINT8(adr, MPCI2CState),
+        VMSTATE_UINT8(fdr, MPCI2CState),
+        VMSTATE_UINT8(cr, MPCI2CState),
+        VMSTATE_UINT8(sr, MPCI2CState),
+        VMSTATE_UINT8(dr, MPCI2CState),
+        VMSTATE_UINT8(dfssr, MPCI2CState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static void mpc_i2c_realize(DeviceState *dev, Error **errp)
+{
+    MPCI2CState  *i2c = MPC_I2C(dev);
+    sysbus_init_irq(SYS_BUS_DEVICE(dev), &i2c->irq);
+    memory_region_init_io(&i2c->iomem, OBJECT(i2c), &i2c_ops, i2c,
+                          "mpc-i2c", 0x14);
+    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &i2c->iomem);
+    i2c->bus = i2c_init_bus(DEVICE(dev), "i2c");
+}
+
+static void mpc_i2c_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->vmsd  = &mpc_i2c_vmstate ;
+    dc->reset = mpc_i2c_reset;
+    dc->realize = mpc_i2c_realize;
+    dc->desc = "MPC I2C Controller";
+}
+
+static const TypeInfo mpc_i2c_type_info = {
+    .name          = TYPE_MPC_I2C,
+    .parent        = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(MPCI2CState),
+    .class_init    = mpc_i2c_class_init,
+};
+
+static void mpc_i2c_register_types(void)
+{
+    type_register_static(&mpc_i2c_type_info);
+}
+
+type_init(mpc_i2c_register_types)
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 7553f674c9..beb2efd694 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -42,6 +42,7 @@
 #include "qemu/error-report.h"
 #include "hw/platform-bus.h"
 #include "hw/net/fsl_etsec/etsec.h"
+#include "hw/i2c/i2c.h"
 
 #define EPAPR_MAGIC                (0x45504150)
 #define BINARY_DEVICE_TREE_FILE    "mpc8544ds.dtb"
@@ -63,7 +64,10 @@
 #define MPC8544_PCI_REGS_SIZE      0x1000ULL
 #define MPC8544_UTIL_OFFSET        0xe0000ULL
 #define MPC8XXX_GPIO_OFFSET        0x000FF000ULL
+#define MPC8544_I2C_REGS_OFFSET    0x3000ULL
 #define MPC8XXX_GPIO_IRQ           47
+#define MPC8544_I2C_IRQ            43
+#define RTC_REGS_OFFSET            0x68
 
 struct boot_info
 {
@@ -161,6 +165,39 @@ static void create_dt_mpc8xxx_gpio(void *fdt, const char *soc, const char *mpic)
     g_free(poweroff);
 }
 
+static void dt_rtc_create(void *fdt, const char *i2c, const char *alias)
+{
+    int offset = RTC_REGS_OFFSET;
+
+    gchar *rtc = g_strdup_printf("%s/rtc@%"PRIx32, i2c, offset);
+    qemu_fdt_add_subnode(fdt, rtc);
+    qemu_fdt_setprop_string(fdt, rtc, "compatible", "pericom,pt7c4338");
+    qemu_fdt_setprop_cells(fdt, rtc, "reg", offset);
+    qemu_fdt_setprop_string(fdt, "/aliases", alias, rtc);
+
+    g_free(rtc);
+}
+
+static void dt_i2c_create(void *fdt, const char *soc, const char *mpic,
+                             const char *alias)
+{
+    hwaddr mmio0 = MPC8544_I2C_REGS_OFFSET;
+    int irq0 = MPC8544_I2C_IRQ;
+
+    gchar *i2c = g_strdup_printf("%s/i2c@%"PRIx64, soc, mmio0);
+    qemu_fdt_add_subnode(fdt, i2c);
+    qemu_fdt_setprop_string(fdt, i2c, "device_type", "i2c");
+    qemu_fdt_setprop_string(fdt, i2c, "compatible", "fsl-i2c");
+    qemu_fdt_setprop_cells(fdt, i2c, "reg", mmio0, 0x14);
+    qemu_fdt_setprop_cells(fdt, i2c, "cell-index", 0);
+    qemu_fdt_setprop_cells(fdt, i2c, "interrupts", irq0, 0x2);
+    qemu_fdt_setprop_phandle(fdt, i2c, "interrupt-parent", mpic);
+    qemu_fdt_setprop_string(fdt, "/aliases", alias, i2c);
+
+    g_free(i2c);
+}
+
+
 typedef struct PlatformDevtreeData {
     void *fdt;
     const char *mpic;
@@ -464,6 +501,12 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms,
                          soc, mpic, "serial0", 0, true);
     }
 
+    /* i2c */
+    dt_i2c_create(fdt, soc, mpic, "i2c");
+
+    dt_rtc_create(fdt, "i2c", "rtc");
+
+
     gutil = g_strdup_printf("%s/global-utilities@%llx", soc,
                             MPC8544_UTIL_OFFSET);
     qemu_fdt_add_subnode(fdt, gutil);
@@ -812,6 +855,7 @@ void ppce500_init(MachineState *machine)
     MemoryRegion *ccsr_addr_space;
     SysBusDevice *s;
     PPCE500CCSRState *ccsr;
+    I2CBus *i2c;
 
     irqs = g_new0(IrqLines, smp_cpus);
     for (i = 0; i < smp_cpus; i++) {
@@ -887,6 +931,16 @@ void ppce500_init(MachineState *machine)
                        0, qdev_get_gpio_in(mpicdev, 42), 399193,
                        serial_hd(1), DEVICE_BIG_ENDIAN);
     }
+        /* I2C */
+    dev = qdev_create(NULL, "mpc-i2c");
+    s = SYS_BUS_DEVICE(dev);
+    qdev_init_nofail(dev);
+    sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC8544_I2C_IRQ));
+    memory_region_add_subregion(ccsr_addr_space, MPC8544_I2C_REGS_OFFSET,
+                                sysbus_mmio_get_region(s, 0));
+    i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
+    i2c_create_slave(i2c, "ds1338", RTC_REGS_OFFSET);
+
 
     /* General Utility device */
     dev = qdev_create(NULL, "mpc8544-guts");
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 21/60] ppc/xive: hardwire the Physical CAM line of the thread context
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (19 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 20/60] PPC: E500: Add FSL I2C controller and integrate RTC with it David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 22/60] ppc: externalize ppc_get_vcpu_by_pir() David Gibson
                   ` (40 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

By default on P9, the HW CAM line (23bits) is hardwired to :

      0x000||0b1||4Bit chip number||7Bit Thread number.

When the block group mode is enabled at the controller level (PowerNV),
the CAM line is changed for CAM compares to :

      4Bit chip number||0x001||7Bit Thread number

This will require changes in xive_presenter_tctx_match() possibly.
This is a lowlevel functionality of the HW controller and it is not
strictly needed. Leave it for later.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-2-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/intc/xive.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index daa7badc84..b21759c938 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -1112,6 +1112,30 @@ XiveTCTX *xive_router_get_tctx(XiveRouter *xrtr, CPUState *cs)
     return xrc->get_tctx(xrtr, cs);
 }
 
+/*
+ * By default on P9, the HW CAM line (23bits) is hardwired to :
+ *
+ *   0x000||0b1||4Bit chip number||7Bit Thread number.
+ *
+ * When the block grouping is enabled, the CAM line is changed to :
+ *
+ *   4Bit chip number||0x001||7Bit Thread number.
+ */
+static uint32_t hw_cam_line(uint8_t chip_id, uint8_t tid)
+{
+    return 1 << 11 | (chip_id & 0xf) << 7 | (tid & 0x7f);
+}
+
+static bool xive_presenter_tctx_match_hw(XiveTCTX *tctx,
+                                         uint8_t nvt_blk, uint32_t nvt_idx)
+{
+    CPUPPCState *env = &POWERPC_CPU(tctx->cs)->env;
+    uint32_t pir = env->spr_cb[SPR_PIR].default_value;
+
+    return hw_cam_line((pir >> 8) & 0xf, pir & 0x7f) ==
+        hw_cam_line(nvt_blk, nvt_idx);
+}
+
 /*
  * The thread context register words are in big-endian format.
  */
@@ -1120,6 +1144,7 @@ static int xive_presenter_tctx_match(XiveTCTX *tctx, uint8_t format,
                                      bool cam_ignore, uint32_t logic_serv)
 {
     uint32_t cam = xive_nvt_cam_line(nvt_blk, nvt_idx);
+    uint32_t qw3w2 = xive_tctx_word2(&tctx->regs[TM_QW3_HV_PHYS]);
     uint32_t qw2w2 = xive_tctx_word2(&tctx->regs[TM_QW2_HV_POOL]);
     uint32_t qw1w2 = xive_tctx_word2(&tctx->regs[TM_QW1_OS]);
     uint32_t qw0w2 = xive_tctx_word2(&tctx->regs[TM_QW0_USER]);
@@ -1142,7 +1167,11 @@ static int xive_presenter_tctx_match(XiveTCTX *tctx, uint8_t format,
 
         /* F=0 & i=0: Specific NVT notification */
 
-        /* TODO (PowerNV) : PHYS ring */
+        /* PHYS ring */
+        if ((be32_to_cpu(qw3w2) & TM_QW3W2_VT) &&
+            xive_presenter_tctx_match_hw(tctx, nvt_blk, nvt_idx)) {
+            return TM_QW3_HV_PHYS;
+        }
 
         /* HV POOL ring */
         if ((be32_to_cpu(qw2w2) & TM_QW2W2_VP) &&
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 22/60] ppc: externalize ppc_get_vcpu_by_pir()
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (20 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 21/60] ppc/xive: hardwire the Physical CAM line of the thread context David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 23/60] ppc/xive: export the TIMA memory accessors David Gibson
                   ` (39 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

We will use it to get the CPU interrupt presenter in XIVE when the
TIMA is accessed from the indirect page.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-3-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c         | 16 ----------------
 hw/ppc/ppc.c         | 16 ++++++++++++++++
 include/hw/ppc/ppc.h |  1 +
 3 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 3d5dfef220..9aa81c7f09 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1082,22 +1082,6 @@ static void pnv_ics_resend(XICSFabric *xi)
     }
 }
 
-static PowerPCCPU *ppc_get_vcpu_by_pir(int pir)
-{
-    CPUState *cs;
-
-    CPU_FOREACH(cs) {
-        PowerPCCPU *cpu = POWERPC_CPU(cs);
-        CPUPPCState *env = &cpu->env;
-
-        if (env->spr_cb[SPR_PIR].default_value == pir) {
-            return cpu;
-        }
-    }
-
-    return NULL;
-}
-
 static ICPState *pnv_icp_get(XICSFabric *xi, int pir)
 {
     PowerPCCPU *cpu = ppc_get_vcpu_by_pir(pir);
diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c
index 9145aeddcb..b2ff99ec66 100644
--- a/hw/ppc/ppc.c
+++ b/hw/ppc/ppc.c
@@ -1487,3 +1487,19 @@ void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val)
         break;
     }
 }
+
+PowerPCCPU *ppc_get_vcpu_by_pir(int pir)
+{
+    CPUState *cs;
+
+    CPU_FOREACH(cs) {
+        PowerPCCPU *cpu = POWERPC_CPU(cs);
+        CPUPPCState *env = &cpu->env;
+
+        if (env->spr_cb[SPR_PIR].default_value == pir) {
+            return cpu;
+        }
+    }
+
+    return NULL;
+}
diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h
index 746170f635..4bdcb8bacd 100644
--- a/include/hw/ppc/ppc.h
+++ b/include/hw/ppc/ppc.h
@@ -4,6 +4,7 @@
 #include "target/ppc/cpu-qom.h"
 
 void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level);
+PowerPCCPU *ppc_get_vcpu_by_pir(int pir);
 
 /* PowerPC hardware exceptions management helpers */
 typedef void (*clk_setup_cb)(void *opaque, uint32_t freq);
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 23/60] ppc/xive: export the TIMA memory accessors
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (21 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 22/60] ppc: externalize ppc_get_vcpu_by_pir() David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 24/60] ppc/pnv: export the xive_router_notify() routine David Gibson
                   ` (38 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The PowerNV machine can perform indirect loads and stores on the TIMA
on behalf of another CPU. Give the controller the possibility to call
the TIMA memory accessors with a XiveTCTX of its choice.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-4-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/intc/xive.c        | 23 ++++++++++++++++++-----
 include/hw/ppc/xive.h |  3 +++
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index b21759c938..3d7de864e9 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -317,10 +317,9 @@ static const XiveTmOp *xive_tm_find_op(hwaddr offset, unsigned size, bool write)
 /*
  * TIMA MMIO handlers
  */
-static void xive_tm_write(void *opaque, hwaddr offset,
-                          uint64_t value, unsigned size)
+void xive_tctx_tm_write(XiveTCTX *tctx, hwaddr offset, uint64_t value,
+                        unsigned size)
 {
-    XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu);
     const XiveTmOp *xto;
 
     /*
@@ -356,9 +355,8 @@ static void xive_tm_write(void *opaque, hwaddr offset,
     xive_tm_raw_write(tctx, offset, value, size);
 }
 
-static uint64_t xive_tm_read(void *opaque, hwaddr offset, unsigned size)
+uint64_t xive_tctx_tm_read(XiveTCTX *tctx, hwaddr offset, unsigned size)
 {
-    XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu);
     const XiveTmOp *xto;
 
     /*
@@ -392,6 +390,21 @@ static uint64_t xive_tm_read(void *opaque, hwaddr offset, unsigned size)
     return xive_tm_raw_read(tctx, offset, size);
 }
 
+static void xive_tm_write(void *opaque, hwaddr offset,
+                          uint64_t value, unsigned size)
+{
+    XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu);
+
+    xive_tctx_tm_write(tctx, offset, value, size);
+}
+
+static uint64_t xive_tm_read(void *opaque, hwaddr offset, unsigned size)
+{
+    XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu);
+
+    return xive_tctx_tm_read(tctx, offset, size);
+}
+
 const MemoryRegionOps xive_tm_ops = {
     .read = xive_tm_read,
     .write = xive_tm_write,
diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
index 13a487527b..7dd80e0f46 100644
--- a/include/hw/ppc/xive.h
+++ b/include/hw/ppc/xive.h
@@ -410,6 +410,9 @@ void xive_end_queue_pic_print_info(XiveEND *end, uint32_t width, Monitor *mon);
 #define XIVE_TM_USER_PAGE       0x3
 
 extern const MemoryRegionOps xive_tm_ops;
+void xive_tctx_tm_write(XiveTCTX *tctx, hwaddr offset, uint64_t value,
+                        unsigned size);
+uint64_t xive_tctx_tm_read(XiveTCTX *tctx, hwaddr offset, unsigned size);
 
 void xive_tctx_pic_print_info(XiveTCTX *tctx, Monitor *mon);
 Object *xive_tctx_create(Object *cpu, XiveRouter *xrtr, Error **errp);
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 24/60] ppc/pnv: export the xive_router_notify() routine
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (22 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 23/60] ppc/xive: export the TIMA memory accessors David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 25/60] ppc/pnv: change the CPU machine_data presenter type to Object * David Gibson
                   ` (37 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The PowerNV machine with need to encode the block id in the source
interrupt number before forwarding the source event notification to
the Router.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-5-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/intc/xive.c        | 2 +-
 include/hw/ppc/xive.h | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index 3d7de864e9..7d7992c0ce 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -1404,7 +1404,7 @@ static void xive_router_end_notify(XiveRouter *xrtr, uint8_t end_blk,
     /* TODO: Auto EOI. */
 }
 
-static void xive_router_notify(XiveNotifier *xn, uint32_t lisn)
+void xive_router_notify(XiveNotifier *xn, uint32_t lisn)
 {
     XiveRouter *xrtr = XIVE_ROUTER(xn);
     uint8_t eas_blk = XIVE_SRCNO_BLOCK(lisn);
diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
index 7dd80e0f46..c4f27742ca 100644
--- a/include/hw/ppc/xive.h
+++ b/include/hw/ppc/xive.h
@@ -364,6 +364,7 @@ int xive_router_get_nvt(XiveRouter *xrtr, uint8_t nvt_blk, uint32_t nvt_idx,
 int xive_router_write_nvt(XiveRouter *xrtr, uint8_t nvt_blk, uint32_t nvt_idx,
                           XiveNVT *nvt, uint8_t word_number);
 XiveTCTX *xive_router_get_tctx(XiveRouter *xrtr, CPUState *cs);
+void xive_router_notify(XiveNotifier *xn, uint32_t lisn);
 
 /*
  * XIVE END ESBs
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 25/60] ppc/pnv: change the CPU machine_data presenter type to Object *
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (23 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 24/60] ppc/pnv: export the xive_router_notify() routine David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 26/60] ppc/pnv: add a XIVE interrupt controller model for POWER9 David Gibson
                   ` (36 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The POWER9 PowerNV machine will use a XIVE interrupt presenter type.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-6-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c              | 6 +++---
 hw/ppc/pnv_core.c         | 2 +-
 include/hw/ppc/pnv_core.h | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 9aa81c7f09..b90d03711a 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -684,7 +684,7 @@ static void pnv_chip_power8_intc_create(PnvChip *chip, PowerPCCPU *cpu,
         return;
     }
 
-    pnv_cpu->icp = ICP(obj);
+    pnv_cpu->intc = obj;
 }
 
 /*
@@ -1086,7 +1086,7 @@ static ICPState *pnv_icp_get(XICSFabric *xi, int pir)
 {
     PowerPCCPU *cpu = ppc_get_vcpu_by_pir(pir);
 
-    return cpu ? pnv_cpu_state(cpu)->icp : NULL;
+    return cpu ? ICP(pnv_cpu_state(cpu)->intc) : NULL;
 }
 
 static void pnv_pic_print_info(InterruptStatsProvider *obj,
@@ -1099,7 +1099,7 @@ static void pnv_pic_print_info(InterruptStatsProvider *obj,
     CPU_FOREACH(cs) {
         PowerPCCPU *cpu = POWERPC_CPU(cs);
 
-        icp_pic_print_info(pnv_cpu_state(cpu)->icp, mon);
+        icp_pic_print_info(ICP(pnv_cpu_state(cpu)->intc), mon);
     }
 
     for (i = 0; i < pnv->num_chips; i++) {
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 7c806da720..38179cdc53 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -198,7 +198,7 @@ static void pnv_unrealize_vcpu(PowerPCCPU *cpu)
     PnvCPUState *pnv_cpu = pnv_cpu_state(cpu);
 
     qemu_unregister_reset(pnv_cpu_reset, cpu);
-    object_unparent(OBJECT(pnv_cpu_state(cpu)->icp));
+    object_unparent(OBJECT(pnv_cpu_state(cpu)->intc));
     cpu_remove_sync(CPU(cpu));
     cpu->machine_data = NULL;
     g_free(pnv_cpu);
diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h
index 9961ea3a92..6874bb847a 100644
--- a/include/hw/ppc/pnv_core.h
+++ b/include/hw/ppc/pnv_core.h
@@ -48,7 +48,7 @@ typedef struct PnvCoreClass {
 #define PNV_CORE_TYPE_NAME(cpu_model) cpu_model PNV_CORE_TYPE_SUFFIX
 
 typedef struct PnvCPUState {
-    struct ICPState *icp;
+    Object *intc;
 } PnvCPUState;
 
 static inline PnvCPUState *pnv_cpu_state(PowerPCCPU *cpu)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 26/60] ppc/pnv: add a XIVE interrupt controller model for POWER9
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (24 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 25/60] ppc/pnv: change the CPU machine_data presenter type to Object * David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 27/60] ppc/pnv: introduce a new dt_populate() operation to the chip model David Gibson
                   ` (35 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

This is a simple model of the POWER9 XIVE interrupt controller for the
PowerNV machine which only addresses the needs of the skiboot
firmware. The PowerNV model reuses the common XIVE framework developed
for sPAPR as the fundamentals aspects are quite the same. The
difference are outlined below.

The controller initial BAR configuration is performed using the XSCOM
bus from there, MMIO are used for further configuration.

The MMIO regions exposed are :

 - Interrupt controller registers
 - ESB pages for IPIs and ENDs
 - Presenter MMIO (Not used)
 - Thread Interrupt Management Area MMIO, direct and indirect

The virtualization controller MMIO region containing the IPI ESB pages
and END ESB pages is sub-divided into "sets" which map portions of the
VC region to the different ESB pages. These are modeled with custom
address spaces and the XiveSource and XiveENDSource objects are sized
to the maximum allowed by HW. The memory regions are resized at
run-time using the configuration of EDT set translation table provided
by the firmware.

The XIVE virtualization structure tables (EAT, ENDT, NVTT) are now in
the machine RAM and not in the hypervisor anymore. The firmware
(skiboot) configures these tables using Virtual Structure Descriptor
defining the characteristics of each table : SBE, EAS, END and
NVT. These are later used to access the virtual interrupt entries. The
internal cache of these tables in the interrupt controller is updated
and invalidated using a set of registers.

Still to address to complete the model but not fully required is the
support for block grouping. Escalation support will be necessary for
KVM guests.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-7-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/intc/Makefile.objs      |    2 +-
 hw/intc/pnv_xive.c         | 1753 ++++++++++++++++++++++++++++++++++++
 hw/intc/pnv_xive_regs.h    |  248 +++++
 hw/ppc/pnv.c               |   44 +-
 include/hw/ppc/pnv.h       |   21 +
 include/hw/ppc/pnv_xive.h  |   93 ++
 include/hw/ppc/pnv_xscom.h |    3 +
 7 files changed, 2162 insertions(+), 2 deletions(-)
 create mode 100644 hw/intc/pnv_xive.c
 create mode 100644 hw/intc/pnv_xive_regs.h
 create mode 100644 include/hw/ppc/pnv_xive.h

diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
index 301a8e972d..df712c3e6c 100644
--- a/hw/intc/Makefile.objs
+++ b/hw/intc/Makefile.objs
@@ -39,7 +39,7 @@ obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
 obj-$(CONFIG_XICS_KVM) += xics_kvm.o
 obj-$(CONFIG_XIVE) += xive.o
 obj-$(CONFIG_XIVE_SPAPR) += spapr_xive.o
-obj-$(CONFIG_POWERNV) += xics_pnv.o
+obj-$(CONFIG_POWERNV) += xics_pnv.o pnv_xive.o
 obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
 obj-$(CONFIG_S390_FLIC) += s390_flic.o
 obj-$(CONFIG_S390_FLIC_KVM) += s390_flic_kvm.o
diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c
new file mode 100644
index 0000000000..bb0877cbdf
--- /dev/null
+++ b/hw/intc/pnv_xive.c
@@ -0,0 +1,1753 @@
+/*
+ * QEMU PowerPC XIVE interrupt controller model
+ *
+ * Copyright (c) 2017-2019, IBM Corporation.
+ *
+ * This code is licensed under the GPL version 2 or later. See the
+ * COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/log.h"
+#include "qapi/error.h"
+#include "target/ppc/cpu.h"
+#include "sysemu/cpus.h"
+#include "sysemu/dma.h"
+#include "monitor/monitor.h"
+#include "hw/ppc/fdt.h"
+#include "hw/ppc/pnv.h"
+#include "hw/ppc/pnv_core.h"
+#include "hw/ppc/pnv_xscom.h"
+#include "hw/ppc/pnv_xive.h"
+#include "hw/ppc/xive_regs.h"
+#include "hw/ppc/ppc.h"
+
+#include <libfdt.h>
+
+#include "pnv_xive_regs.h"
+
+#define XIVE_DEBUG
+
+/*
+ * Virtual structures table (VST)
+ */
+#define SBE_PER_BYTE   4
+
+typedef struct XiveVstInfo {
+    const char *name;
+    uint32_t    size;
+    uint32_t    max_blocks;
+} XiveVstInfo;
+
+static const XiveVstInfo vst_infos[] = {
+    [VST_TSEL_IVT]  = { "EAT",  sizeof(XiveEAS), 16 },
+    [VST_TSEL_SBE]  = { "SBE",  1,               16 },
+    [VST_TSEL_EQDT] = { "ENDT", sizeof(XiveEND), 16 },
+    [VST_TSEL_VPDT] = { "VPDT", sizeof(XiveNVT), 32 },
+
+    /*
+     *  Interrupt fifo backing store table (not modeled) :
+     *
+     * 0 - IPI,
+     * 1 - HWD,
+     * 2 - First escalate,
+     * 3 - Second escalate,
+     * 4 - Redistribution,
+     * 5 - IPI cascaded queue ?
+     */
+    [VST_TSEL_IRQ]  = { "IRQ",  1,               6  },
+};
+
+#define xive_error(xive, fmt, ...)                                      \
+    qemu_log_mask(LOG_GUEST_ERROR, "XIVE[%x] - " fmt "\n",              \
+                  (xive)->chip->chip_id, ## __VA_ARGS__);
+
+/*
+ * QEMU version of the GETFIELD/SETFIELD macros
+ *
+ * TODO: It might be better to use the existing extract64() and
+ * deposit64() but this means that all the register definitions will
+ * change and become incompatible with the ones found in skiboot.
+ *
+ * Keep it as it is for now until we find a common ground.
+ */
+static inline uint64_t GETFIELD(uint64_t mask, uint64_t word)
+{
+    return (word & mask) >> ctz64(mask);
+}
+
+static inline uint64_t SETFIELD(uint64_t mask, uint64_t word,
+                                uint64_t value)
+{
+    return (word & ~mask) | ((value << ctz64(mask)) & mask);
+}
+
+/*
+ * Remote access to controllers. HW uses MMIOs. For now, a simple scan
+ * of the chips is good enough.
+ *
+ * TODO: Block scope support
+ */
+static PnvXive *pnv_xive_get_ic(uint8_t blk)
+{
+    PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine());
+    int i;
+
+    for (i = 0; i < pnv->num_chips; i++) {
+        Pnv9Chip *chip9 = PNV9_CHIP(pnv->chips[i]);
+        PnvXive *xive = &chip9->xive;
+
+        if (xive->chip->chip_id == blk) {
+            return xive;
+        }
+    }
+    return NULL;
+}
+
+/*
+ * VST accessors for SBE, EAT, ENDT, NVT
+ *
+ * Indirect VST tables are arrays of VSDs pointing to a page (of same
+ * size). Each page is a direct VST table.
+ */
+
+#define XIVE_VSD_SIZE 8
+
+/* Indirect page size can be 4K, 64K, 2M, 16M. */
+static uint64_t pnv_xive_vst_page_size_allowed(uint32_t page_shift)
+{
+     return page_shift == 12 || page_shift == 16 ||
+         page_shift == 21 || page_shift == 24;
+}
+
+static uint64_t pnv_xive_vst_size(uint64_t vsd)
+{
+    uint64_t vst_tsize = 1ull << (GETFIELD(VSD_TSIZE, vsd) + 12);
+
+    /*
+     * Read the first descriptor to get the page size of the indirect
+     * table.
+     */
+    if (VSD_INDIRECT & vsd) {
+        uint32_t nr_pages = vst_tsize / XIVE_VSD_SIZE;
+        uint32_t page_shift;
+
+        vsd = ldq_be_dma(&address_space_memory, vsd & VSD_ADDRESS_MASK);
+        page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
+
+        if (!pnv_xive_vst_page_size_allowed(page_shift)) {
+            return 0;
+        }
+
+        return nr_pages * (1ull << page_shift);
+    }
+
+    return vst_tsize;
+}
+
+static uint64_t pnv_xive_vst_addr_direct(PnvXive *xive, uint32_t type,
+                                         uint64_t vsd, uint32_t idx)
+{
+    const XiveVstInfo *info = &vst_infos[type];
+    uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
+
+    return vst_addr + idx * info->size;
+}
+
+static uint64_t pnv_xive_vst_addr_indirect(PnvXive *xive, uint32_t type,
+                                           uint64_t vsd, uint32_t idx)
+{
+    const XiveVstInfo *info = &vst_infos[type];
+    uint64_t vsd_addr;
+    uint32_t vsd_idx;
+    uint32_t page_shift;
+    uint32_t vst_per_page;
+
+    /* Get the page size of the indirect table. */
+    vsd_addr = vsd & VSD_ADDRESS_MASK;
+    vsd = ldq_be_dma(&address_space_memory, vsd_addr);
+
+    if (!(vsd & VSD_ADDRESS_MASK)) {
+        xive_error(xive, "VST: invalid %s entry %x !?", info->name, 0);
+        return 0;
+    }
+
+    page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
+
+    if (!pnv_xive_vst_page_size_allowed(page_shift)) {
+        xive_error(xive, "VST: invalid %s page shift %d", info->name,
+                   page_shift);
+        return 0;
+    }
+
+    vst_per_page = (1ull << page_shift) / info->size;
+    vsd_idx = idx / vst_per_page;
+
+    /* Load the VSD we are looking for, if not already done */
+    if (vsd_idx) {
+        vsd_addr = vsd_addr + vsd_idx * XIVE_VSD_SIZE;
+        vsd = ldq_be_dma(&address_space_memory, vsd_addr);
+
+        if (!(vsd & VSD_ADDRESS_MASK)) {
+            xive_error(xive, "VST: invalid %s entry %x !?", info->name, 0);
+            return 0;
+        }
+
+        /*
+         * Check that the pages have a consistent size across the
+         * indirect table
+         */
+        if (page_shift != GETFIELD(VSD_TSIZE, vsd) + 12) {
+            xive_error(xive, "VST: %s entry %x indirect page size differ !?",
+                       info->name, idx);
+            return 0;
+        }
+    }
+
+    return pnv_xive_vst_addr_direct(xive, type, vsd, (idx % vst_per_page));
+}
+
+static uint64_t pnv_xive_vst_addr(PnvXive *xive, uint32_t type, uint8_t blk,
+                                  uint32_t idx)
+{
+    const XiveVstInfo *info = &vst_infos[type];
+    uint64_t vsd;
+    uint32_t idx_max;
+
+    if (blk >= info->max_blocks) {
+        xive_error(xive, "VST: invalid block id %d for VST %s %d !?",
+                   blk, info->name, idx);
+        return 0;
+    }
+
+    vsd = xive->vsds[type][blk];
+
+    /* Remote VST access */
+    if (GETFIELD(VSD_MODE, vsd) == VSD_MODE_FORWARD) {
+        xive = pnv_xive_get_ic(blk);
+
+        return xive ? pnv_xive_vst_addr(xive, type, blk, idx) : 0;
+    }
+
+    idx_max = pnv_xive_vst_size(vsd) / info->size - 1;
+    if (idx > idx_max) {
+#ifdef XIVE_DEBUG
+        xive_error(xive, "VST: %s entry %x/%x out of range [ 0 .. %x ] !?",
+                   info->name, blk, idx, idx_max);
+#endif
+        return 0;
+    }
+
+    if (VSD_INDIRECT & vsd) {
+        return pnv_xive_vst_addr_indirect(xive, type, vsd, idx);
+    }
+
+    return pnv_xive_vst_addr_direct(xive, type, vsd, idx);
+}
+
+static int pnv_xive_vst_read(PnvXive *xive, uint32_t type, uint8_t blk,
+                             uint32_t idx, void *data)
+{
+    const XiveVstInfo *info = &vst_infos[type];
+    uint64_t addr = pnv_xive_vst_addr(xive, type, blk, idx);
+
+    if (!addr) {
+        return -1;
+    }
+
+    cpu_physical_memory_read(addr, data, info->size);
+    return 0;
+}
+
+#define XIVE_VST_WORD_ALL -1
+
+static int pnv_xive_vst_write(PnvXive *xive, uint32_t type, uint8_t blk,
+                              uint32_t idx, void *data, uint32_t word_number)
+{
+    const XiveVstInfo *info = &vst_infos[type];
+    uint64_t addr = pnv_xive_vst_addr(xive, type, blk, idx);
+
+    if (!addr) {
+        return -1;
+    }
+
+    if (word_number == XIVE_VST_WORD_ALL) {
+        cpu_physical_memory_write(addr, data, info->size);
+    } else {
+        cpu_physical_memory_write(addr + word_number * 4,
+                                  data + word_number * 4, 4);
+    }
+    return 0;
+}
+
+static int pnv_xive_get_end(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
+                            XiveEND *end)
+{
+    return pnv_xive_vst_read(PNV_XIVE(xrtr), VST_TSEL_EQDT, blk, idx, end);
+}
+
+static int pnv_xive_write_end(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
+                              XiveEND *end, uint8_t word_number)
+{
+    return pnv_xive_vst_write(PNV_XIVE(xrtr), VST_TSEL_EQDT, blk, idx, end,
+                              word_number);
+}
+
+static int pnv_xive_end_update(PnvXive *xive, uint8_t blk, uint32_t idx)
+{
+    int i;
+    uint64_t eqc_watch[4];
+
+    for (i = 0; i < ARRAY_SIZE(eqc_watch); i++) {
+        eqc_watch[i] = cpu_to_be64(xive->regs[(VC_EQC_CWATCH_DAT0 >> 3) + i]);
+    }
+
+    return pnv_xive_vst_write(xive, VST_TSEL_EQDT, blk, idx, eqc_watch,
+                              XIVE_VST_WORD_ALL);
+}
+
+static int pnv_xive_get_nvt(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
+                            XiveNVT *nvt)
+{
+    return pnv_xive_vst_read(PNV_XIVE(xrtr), VST_TSEL_VPDT, blk, idx, nvt);
+}
+
+static int pnv_xive_write_nvt(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
+                              XiveNVT *nvt, uint8_t word_number)
+{
+    return pnv_xive_vst_write(PNV_XIVE(xrtr), VST_TSEL_VPDT, blk, idx, nvt,
+                              word_number);
+}
+
+static int pnv_xive_nvt_update(PnvXive *xive, uint8_t blk, uint32_t idx)
+{
+    int i;
+    uint64_t vpc_watch[8];
+
+    for (i = 0; i < ARRAY_SIZE(vpc_watch); i++) {
+        vpc_watch[i] = cpu_to_be64(xive->regs[(PC_VPC_CWATCH_DAT0 >> 3) + i]);
+    }
+
+    return pnv_xive_vst_write(xive, VST_TSEL_VPDT, blk, idx, vpc_watch,
+                              XIVE_VST_WORD_ALL);
+}
+
+static int pnv_xive_get_eas(XiveRouter *xrtr, uint8_t blk, uint32_t idx,
+                            XiveEAS *eas)
+{
+    PnvXive *xive = PNV_XIVE(xrtr);
+
+    if (pnv_xive_get_ic(blk) != xive) {
+        xive_error(xive, "VST: EAS %x is remote !?", XIVE_SRCNO(blk, idx));
+        return -1;
+    }
+
+    return pnv_xive_vst_read(xive, VST_TSEL_IVT, blk, idx, eas);
+}
+
+static int pnv_xive_eas_update(PnvXive *xive, uint8_t blk, uint32_t idx)
+{
+    /* All done. */
+    return 0;
+}
+
+static XiveTCTX *pnv_xive_get_tctx(XiveRouter *xrtr, CPUState *cs)
+{
+    PowerPCCPU *cpu = POWERPC_CPU(cs);
+    XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc);
+    PnvXive *xive = NULL;
+    CPUPPCState *env = &cpu->env;
+    int pir = env->spr_cb[SPR_PIR].default_value;
+
+    /*
+     * Perform an extra check on the HW thread enablement.
+     *
+     * The TIMA is shared among the chips and to identify the chip
+     * from which the access is being done, we extract the chip id
+     * from the PIR.
+     */
+    xive = pnv_xive_get_ic((pir >> 8) & 0xf);
+    if (!xive) {
+        return NULL;
+    }
+
+    if (!(xive->regs[PC_THREAD_EN_REG0 >> 3] & PPC_BIT(pir & 0x3f))) {
+        xive_error(PNV_XIVE(xrtr), "IC: CPU %x is not enabled", pir);
+    }
+
+    return tctx;
+}
+
+/*
+ * The internal sources (IPIs) of the interrupt controller have no
+ * knowledge of the XIVE chip on which they reside. Encode the block
+ * id in the source interrupt number before forwarding the source
+ * event notification to the Router. This is required on a multichip
+ * system.
+ */
+static void pnv_xive_notify(XiveNotifier *xn, uint32_t srcno)
+{
+    PnvXive *xive = PNV_XIVE(xn);
+    uint8_t blk = xive->chip->chip_id;
+
+    xive_router_notify(xn, XIVE_SRCNO(blk, srcno));
+}
+
+/*
+ * XIVE helpers
+ */
+
+static uint64_t pnv_xive_vc_size(PnvXive *xive)
+{
+    return (~xive->regs[CQ_VC_BARM >> 3] + 1) & CQ_VC_BARM_MASK;
+}
+
+static uint64_t pnv_xive_edt_shift(PnvXive *xive)
+{
+    return ctz64(pnv_xive_vc_size(xive) / XIVE_TABLE_EDT_MAX);
+}
+
+static uint64_t pnv_xive_pc_size(PnvXive *xive)
+{
+    return (~xive->regs[CQ_PC_BARM >> 3] + 1) & CQ_PC_BARM_MASK;
+}
+
+static uint32_t pnv_xive_nr_ipis(PnvXive *xive)
+{
+    uint8_t blk = xive->chip->chip_id;
+
+    return pnv_xive_vst_size(xive->vsds[VST_TSEL_SBE][blk]) * SBE_PER_BYTE;
+}
+
+static uint32_t pnv_xive_nr_ends(PnvXive *xive)
+{
+    uint8_t blk = xive->chip->chip_id;
+
+    return pnv_xive_vst_size(xive->vsds[VST_TSEL_EQDT][blk])
+        / vst_infos[VST_TSEL_EQDT].size;
+}
+
+/*
+ * EDT Table
+ *
+ * The Virtualization Controller MMIO region containing the IPI ESB
+ * pages and END ESB pages is sub-divided into "sets" which map
+ * portions of the VC region to the different ESB pages. It is
+ * configured at runtime through the EDT "Domain Table" to let the
+ * firmware decide how to split the VC address space between IPI ESB
+ * pages and END ESB pages.
+ */
+
+/*
+ * Computes the overall size of the IPI or the END ESB pages
+ */
+static uint64_t pnv_xive_edt_size(PnvXive *xive, uint64_t type)
+{
+    uint64_t edt_size = 1ull << pnv_xive_edt_shift(xive);
+    uint64_t size = 0;
+    int i;
+
+    for (i = 0; i < XIVE_TABLE_EDT_MAX; i++) {
+        uint64_t edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]);
+
+        if (edt_type == type) {
+            size += edt_size;
+        }
+    }
+
+    return size;
+}
+
+/*
+ * Maps an offset of the VC region in the IPI or END region using the
+ * layout defined by the EDT "Domaine Table"
+ */
+static uint64_t pnv_xive_edt_offset(PnvXive *xive, uint64_t vc_offset,
+                                              uint64_t type)
+{
+    int i;
+    uint64_t edt_size = 1ull << pnv_xive_edt_shift(xive);
+    uint64_t edt_offset = vc_offset;
+
+    for (i = 0; i < XIVE_TABLE_EDT_MAX && (i * edt_size) < vc_offset; i++) {
+        uint64_t edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]);
+
+        if (edt_type != type) {
+            edt_offset -= edt_size;
+        }
+    }
+
+    return edt_offset;
+}
+
+static void pnv_xive_edt_resize(PnvXive *xive)
+{
+    uint64_t ipi_edt_size = pnv_xive_edt_size(xive, CQ_TDR_EDT_IPI);
+    uint64_t end_edt_size = pnv_xive_edt_size(xive, CQ_TDR_EDT_EQ);
+
+    memory_region_set_size(&xive->ipi_edt_mmio, ipi_edt_size);
+    memory_region_add_subregion(&xive->ipi_mmio, 0, &xive->ipi_edt_mmio);
+
+    memory_region_set_size(&xive->end_edt_mmio, end_edt_size);
+    memory_region_add_subregion(&xive->end_mmio, 0, &xive->end_edt_mmio);
+}
+
+/*
+ * XIVE Table configuration. Only EDT is supported.
+ */
+static int pnv_xive_table_set_data(PnvXive *xive, uint64_t val)
+{
+    uint64_t tsel = xive->regs[CQ_TAR >> 3] & CQ_TAR_TSEL;
+    uint8_t tsel_index = GETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3]);
+    uint64_t *xive_table;
+    uint8_t max_index;
+
+    switch (tsel) {
+    case CQ_TAR_TSEL_BLK:
+        max_index = ARRAY_SIZE(xive->blk);
+        xive_table = xive->blk;
+        break;
+    case CQ_TAR_TSEL_MIG:
+        max_index = ARRAY_SIZE(xive->mig);
+        xive_table = xive->mig;
+        break;
+    case CQ_TAR_TSEL_EDT:
+        max_index = ARRAY_SIZE(xive->edt);
+        xive_table = xive->edt;
+        break;
+    case CQ_TAR_TSEL_VDT:
+        max_index = ARRAY_SIZE(xive->vdt);
+        xive_table = xive->vdt;
+        break;
+    default:
+        xive_error(xive, "IC: invalid table %d", (int) tsel);
+        return -1;
+    }
+
+    if (tsel_index >= max_index) {
+        xive_error(xive, "IC: invalid index %d", (int) tsel_index);
+        return -1;
+    }
+
+    xive_table[tsel_index] = val;
+
+    if (xive->regs[CQ_TAR >> 3] & CQ_TAR_TBL_AUTOINC) {
+        xive->regs[CQ_TAR >> 3] =
+            SETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3], ++tsel_index);
+    }
+
+    /*
+     * EDT configuration is complete. Resize the MMIO windows exposing
+     * the IPI and the END ESBs in the VC region.
+     */
+    if (tsel == CQ_TAR_TSEL_EDT && tsel_index == ARRAY_SIZE(xive->edt)) {
+        pnv_xive_edt_resize(xive);
+    }
+
+    return 0;
+}
+
+/*
+ * Virtual Structure Tables (VST) configuration
+ */
+static void pnv_xive_vst_set_exclusive(PnvXive *xive, uint8_t type,
+                                       uint8_t blk, uint64_t vsd)
+{
+    XiveENDSource *end_xsrc = &xive->end_source;
+    XiveSource *xsrc = &xive->ipi_source;
+    const XiveVstInfo *info = &vst_infos[type];
+    uint32_t page_shift = GETFIELD(VSD_TSIZE, vsd) + 12;
+    uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
+
+    /* Basic checks */
+
+    if (VSD_INDIRECT & vsd) {
+        if (!(xive->regs[VC_GLOBAL_CONFIG >> 3] & VC_GCONF_INDIRECT)) {
+            xive_error(xive, "VST: %s indirect tables are not enabled",
+                       info->name);
+            return;
+        }
+
+        if (!pnv_xive_vst_page_size_allowed(page_shift)) {
+            xive_error(xive, "VST: invalid %s page shift %d", info->name,
+                       page_shift);
+            return;
+        }
+    }
+
+    if (!QEMU_IS_ALIGNED(vst_addr, 1ull << page_shift)) {
+        xive_error(xive, "VST: %s table address 0x%"PRIx64" is not aligned with"
+                   " page shift %d", info->name, vst_addr, page_shift);
+        return;
+    }
+
+    /* Record the table configuration (in SRAM on HW) */
+    xive->vsds[type][blk] = vsd;
+
+    /* Now tune the models with the configuration provided by the FW */
+
+    switch (type) {
+    case VST_TSEL_IVT:  /* Nothing to be done */
+        break;
+
+    case VST_TSEL_EQDT:
+        /*
+         * Backing store pages for the END. Compute the number of ENDs
+         * provisioned by FW and resize the END ESB window accordingly.
+         */
+        memory_region_set_size(&end_xsrc->esb_mmio, pnv_xive_nr_ends(xive) *
+                               (1ull << (end_xsrc->esb_shift + 1)));
+        memory_region_add_subregion(&xive->end_edt_mmio, 0,
+                                    &end_xsrc->esb_mmio);
+        break;
+
+    case VST_TSEL_SBE:
+        /*
+         * Backing store pages for the source PQ bits. The model does
+         * not use these PQ bits backed in RAM because the XiveSource
+         * model has its own. Compute the number of IRQs provisioned
+         * by FW and resize the IPI ESB window accordingly.
+         */
+        memory_region_set_size(&xsrc->esb_mmio, pnv_xive_nr_ipis(xive) *
+                               (1ull << xsrc->esb_shift));
+        memory_region_add_subregion(&xive->ipi_edt_mmio, 0, &xsrc->esb_mmio);
+        break;
+
+    case VST_TSEL_VPDT: /* Not modeled */
+    case VST_TSEL_IRQ:  /* Not modeled */
+        /*
+         * These tables contains the backing store pages for the
+         * interrupt fifos of the VC sub-engine in case of overflow.
+         */
+        break;
+
+    default:
+        g_assert_not_reached();
+    }
+}
+
+/*
+ * Both PC and VC sub-engines are configured as each use the Virtual
+ * Structure Tables : SBE, EAS, END and NVT.
+ */
+static void pnv_xive_vst_set_data(PnvXive *xive, uint64_t vsd, bool pc_engine)
+{
+    uint8_t mode = GETFIELD(VSD_MODE, vsd);
+    uint8_t type = GETFIELD(VST_TABLE_SELECT,
+                            xive->regs[VC_VSD_TABLE_ADDR >> 3]);
+    uint8_t blk = GETFIELD(VST_TABLE_BLOCK,
+                           xive->regs[VC_VSD_TABLE_ADDR >> 3]);
+    uint64_t vst_addr = vsd & VSD_ADDRESS_MASK;
+
+    if (type > VST_TSEL_IRQ) {
+        xive_error(xive, "VST: invalid table type %d", type);
+        return;
+    }
+
+    if (blk >= vst_infos[type].max_blocks) {
+        xive_error(xive, "VST: invalid block id %d for"
+                      " %s table", blk, vst_infos[type].name);
+        return;
+    }
+
+    /*
+     * Only take the VC sub-engine configuration into account because
+     * the XiveRouter model combines both VC and PC sub-engines
+     */
+    if (pc_engine) {
+        return;
+    }
+
+    if (!vst_addr) {
+        xive_error(xive, "VST: invalid %s table address", vst_infos[type].name);
+        return;
+    }
+
+    switch (mode) {
+    case VSD_MODE_FORWARD:
+        xive->vsds[type][blk] = vsd;
+        break;
+
+    case VSD_MODE_EXCLUSIVE:
+        pnv_xive_vst_set_exclusive(xive, type, blk, vsd);
+        break;
+
+    default:
+        xive_error(xive, "VST: unsupported table mode %d", mode);
+        return;
+    }
+}
+
+/*
+ * Interrupt controller MMIO region. The layout is compatible between
+ * 4K and 64K pages :
+ *
+ * Page 0           sub-engine BARs
+ *  0x000 - 0x3FF   IC registers
+ *  0x400 - 0x7FF   PC registers
+ *  0x800 - 0xFFF   VC registers
+ *
+ * Page 1           Notify page (writes only)
+ *  0x000 - 0x7FF   HW interrupt triggers (PSI, PHB)
+ *  0x800 - 0xFFF   forwards and syncs
+ *
+ * Page 2           LSI Trigger page (writes only) (not modeled)
+ * Page 3           LSI SB EOI page (reads only) (not modeled)
+ *
+ * Page 4-7         indirect TIMA
+ */
+
+/*
+ * IC - registers MMIO
+ */
+static void pnv_xive_ic_reg_write(void *opaque, hwaddr offset,
+                                  uint64_t val, unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+    MemoryRegion *sysmem = get_system_memory();
+    uint32_t reg = offset >> 3;
+    bool is_chip0 = xive->chip->chip_id == 0;
+
+    switch (offset) {
+
+    /*
+     * XIVE CQ (PowerBus bridge) settings
+     */
+    case CQ_MSGSND:     /* msgsnd for doorbells */
+    case CQ_FIRMASK_OR: /* FIR error reporting */
+        break;
+    case CQ_PBI_CTL:
+        if (val & CQ_PBI_PC_64K) {
+            xive->pc_shift = 16;
+        }
+        if (val & CQ_PBI_VC_64K) {
+            xive->vc_shift = 16;
+        }
+        break;
+    case CQ_CFG_PB_GEN: /* PowerBus General Configuration */
+        /*
+         * TODO: CQ_INT_ADDR_OPT for 1-block-per-chip mode
+         */
+        break;
+
+    /*
+     * XIVE Virtualization Controller settings
+     */
+    case VC_GLOBAL_CONFIG:
+        break;
+
+    /*
+     * XIVE Presenter Controller settings
+     */
+    case PC_GLOBAL_CONFIG:
+        /*
+         * PC_GCONF_CHIPID_OVR
+         *   Overrides Int command Chip ID with the Chip ID field (DEBUG)
+         */
+        break;
+    case PC_TCTXT_CFG:
+        /*
+         * TODO: block group support
+         *
+         * PC_TCTXT_CFG_BLKGRP_EN
+         * PC_TCTXT_CFG_HARD_CHIPID_BLK :
+         *   Moves the chipid into block field for hardwired CAM compares.
+         *   Block offset value is adjusted to 0b0..01 & ThrdId
+         *
+         *   Will require changes in xive_presenter_tctx_match(). I am
+         *   not sure how to handle that yet.
+         */
+
+        /* Overrides hardwired chip ID with the chip ID field */
+        if (val & PC_TCTXT_CHIPID_OVERRIDE) {
+            xive->tctx_chipid = GETFIELD(PC_TCTXT_CHIPID, val);
+        }
+        break;
+    case PC_TCTXT_TRACK:
+        /*
+         * PC_TCTXT_TRACK_EN:
+         *   enable block tracking and exchange of block ownership
+         *   information between Interrupt controllers
+         */
+        break;
+
+    /*
+     * Misc settings
+     */
+    case VC_SBC_CONFIG: /* Store EOI configuration */
+        /*
+         * Configure store EOI if required by firwmare (skiboot has removed
+         * support recently though)
+         */
+        if (val & (VC_SBC_CONF_CPLX_CIST | VC_SBC_CONF_CIST_BOTH)) {
+            object_property_set_int(OBJECT(&xive->ipi_source),
+                                    XIVE_SRC_STORE_EOI, "flags", &error_fatal);
+        }
+        break;
+
+    case VC_EQC_CONFIG: /* TODO: silent escalation */
+    case VC_AIB_TX_ORDER_TAG2: /* relax ordering */
+        break;
+
+    /*
+     * XIVE BAR settings (XSCOM only)
+     */
+    case CQ_RST_CTL:
+        /* bit4: resets all BAR registers */
+        break;
+
+    case CQ_IC_BAR: /* IC BAR. 8 pages */
+        xive->ic_shift = val & CQ_IC_BAR_64K ? 16 : 12;
+        if (!(val & CQ_IC_BAR_VALID)) {
+            xive->ic_base = 0;
+            if (xive->regs[reg] & CQ_IC_BAR_VALID) {
+                memory_region_del_subregion(&xive->ic_mmio,
+                                            &xive->ic_reg_mmio);
+                memory_region_del_subregion(&xive->ic_mmio,
+                                            &xive->ic_notify_mmio);
+                memory_region_del_subregion(&xive->ic_mmio,
+                                            &xive->ic_lsi_mmio);
+                memory_region_del_subregion(&xive->ic_mmio,
+                                            &xive->tm_indirect_mmio);
+
+                memory_region_del_subregion(sysmem, &xive->ic_mmio);
+            }
+        } else {
+            xive->ic_base = val & ~(CQ_IC_BAR_VALID | CQ_IC_BAR_64K);
+            if (!(xive->regs[reg] & CQ_IC_BAR_VALID)) {
+                memory_region_add_subregion(sysmem, xive->ic_base,
+                                            &xive->ic_mmio);
+
+                memory_region_add_subregion(&xive->ic_mmio,  0,
+                                            &xive->ic_reg_mmio);
+                memory_region_add_subregion(&xive->ic_mmio,
+                                            1ul << xive->ic_shift,
+                                            &xive->ic_notify_mmio);
+                memory_region_add_subregion(&xive->ic_mmio,
+                                            2ul << xive->ic_shift,
+                                            &xive->ic_lsi_mmio);
+                memory_region_add_subregion(&xive->ic_mmio,
+                                            4ull << xive->ic_shift,
+                                            &xive->tm_indirect_mmio);
+            }
+        }
+        break;
+
+    case CQ_TM1_BAR: /* TM BAR. 4 pages. Map only once */
+    case CQ_TM2_BAR: /* second TM BAR. for hotplug. Not modeled */
+        xive->tm_shift = val & CQ_TM_BAR_64K ? 16 : 12;
+        if (!(val & CQ_TM_BAR_VALID)) {
+            xive->tm_base = 0;
+            if (xive->regs[reg] & CQ_TM_BAR_VALID && is_chip0) {
+                memory_region_del_subregion(sysmem, &xive->tm_mmio);
+            }
+        } else {
+            xive->tm_base = val & ~(CQ_TM_BAR_VALID | CQ_TM_BAR_64K);
+            if (!(xive->regs[reg] & CQ_TM_BAR_VALID) && is_chip0) {
+                memory_region_add_subregion(sysmem, xive->tm_base,
+                                            &xive->tm_mmio);
+            }
+        }
+        break;
+
+    case CQ_PC_BARM:
+        xive->regs[reg] = val;
+        memory_region_set_size(&xive->pc_mmio, pnv_xive_pc_size(xive));
+        break;
+    case CQ_PC_BAR: /* From 32M to 512G */
+        if (!(val & CQ_PC_BAR_VALID)) {
+            xive->pc_base = 0;
+            if (xive->regs[reg] & CQ_PC_BAR_VALID) {
+                memory_region_del_subregion(sysmem, &xive->pc_mmio);
+            }
+        } else {
+            xive->pc_base = val & ~(CQ_PC_BAR_VALID);
+            if (!(xive->regs[reg] & CQ_PC_BAR_VALID)) {
+                memory_region_add_subregion(sysmem, xive->pc_base,
+                                            &xive->pc_mmio);
+            }
+        }
+        break;
+
+    case CQ_VC_BARM:
+        xive->regs[reg] = val;
+        memory_region_set_size(&xive->vc_mmio, pnv_xive_vc_size(xive));
+        break;
+    case CQ_VC_BAR: /* From 64M to 4TB */
+        if (!(val & CQ_VC_BAR_VALID)) {
+            xive->vc_base = 0;
+            if (xive->regs[reg] & CQ_VC_BAR_VALID) {
+                memory_region_del_subregion(sysmem, &xive->vc_mmio);
+            }
+        } else {
+            xive->vc_base = val & ~(CQ_VC_BAR_VALID);
+            if (!(xive->regs[reg] & CQ_VC_BAR_VALID)) {
+                memory_region_add_subregion(sysmem, xive->vc_base,
+                                            &xive->vc_mmio);
+            }
+        }
+        break;
+
+    /*
+     * XIVE Table settings.
+     */
+    case CQ_TAR: /* Table Address */
+        break;
+    case CQ_TDR: /* Table Data */
+        pnv_xive_table_set_data(xive, val);
+        break;
+
+    /*
+     * XIVE VC & PC Virtual Structure Table settings
+     */
+    case VC_VSD_TABLE_ADDR:
+    case PC_VSD_TABLE_ADDR: /* Virtual table selector */
+        break;
+    case VC_VSD_TABLE_DATA: /* Virtual table setting */
+    case PC_VSD_TABLE_DATA:
+        pnv_xive_vst_set_data(xive, val, offset == PC_VSD_TABLE_DATA);
+        break;
+
+    /*
+     * Interrupt fifo overflow in memory backing store (Not modeled)
+     */
+    case VC_IRQ_CONFIG_IPI:
+    case VC_IRQ_CONFIG_HW:
+    case VC_IRQ_CONFIG_CASCADE1:
+    case VC_IRQ_CONFIG_CASCADE2:
+    case VC_IRQ_CONFIG_REDIST:
+    case VC_IRQ_CONFIG_IPI_CASC:
+        break;
+
+    /*
+     * XIVE hardware thread enablement
+     */
+    case PC_THREAD_EN_REG0: /* Physical Thread Enable */
+    case PC_THREAD_EN_REG1: /* Physical Thread Enable (fused core) */
+        break;
+
+    case PC_THREAD_EN_REG0_SET:
+        xive->regs[PC_THREAD_EN_REG0 >> 3] |= val;
+        break;
+    case PC_THREAD_EN_REG1_SET:
+        xive->regs[PC_THREAD_EN_REG1 >> 3] |= val;
+        break;
+    case PC_THREAD_EN_REG0_CLR:
+        xive->regs[PC_THREAD_EN_REG0 >> 3] &= ~val;
+        break;
+    case PC_THREAD_EN_REG1_CLR:
+        xive->regs[PC_THREAD_EN_REG1 >> 3] &= ~val;
+        break;
+
+    /*
+     * Indirect TIMA access set up. Defines the PIR of the HW thread
+     * to use.
+     */
+    case PC_TCTXT_INDIR0 ... PC_TCTXT_INDIR3:
+        break;
+
+    /*
+     * XIVE PC & VC cache updates for EAS, NVT and END
+     */
+    case VC_IVC_SCRUB_MASK:
+        break;
+    case VC_IVC_SCRUB_TRIG:
+        pnv_xive_eas_update(xive, GETFIELD(PC_SCRUB_BLOCK_ID, val),
+                            GETFIELD(VC_SCRUB_OFFSET, val));
+        break;
+
+    case VC_EQC_SCRUB_MASK:
+    case VC_EQC_CWATCH_SPEC:
+    case VC_EQC_CWATCH_DAT0 ... VC_EQC_CWATCH_DAT3:
+        break;
+    case VC_EQC_SCRUB_TRIG:
+        pnv_xive_end_update(xive, GETFIELD(VC_SCRUB_BLOCK_ID, val),
+                            GETFIELD(VC_SCRUB_OFFSET, val));
+        break;
+
+    case PC_VPC_SCRUB_MASK:
+    case PC_VPC_CWATCH_SPEC:
+    case PC_VPC_CWATCH_DAT0 ... PC_VPC_CWATCH_DAT7:
+        break;
+    case PC_VPC_SCRUB_TRIG:
+        pnv_xive_nvt_update(xive, GETFIELD(PC_SCRUB_BLOCK_ID, val),
+                           GETFIELD(PC_SCRUB_OFFSET, val));
+        break;
+
+
+    /*
+     * XIVE PC & VC cache invalidation
+     */
+    case PC_AT_KILL:
+        break;
+    case VC_AT_MACRO_KILL:
+        break;
+    case PC_AT_KILL_MASK:
+    case VC_AT_MACRO_KILL_MASK:
+        break;
+
+    default:
+        xive_error(xive, "IC: invalid write to reg=0x%"HWADDR_PRIx, offset);
+        return;
+    }
+
+    xive->regs[reg] = val;
+}
+
+static uint64_t pnv_xive_ic_reg_read(void *opaque, hwaddr offset, unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+    uint64_t val = 0;
+    uint32_t reg = offset >> 3;
+
+    switch (offset) {
+    case CQ_CFG_PB_GEN:
+    case CQ_IC_BAR:
+    case CQ_TM1_BAR:
+    case CQ_TM2_BAR:
+    case CQ_PC_BAR:
+    case CQ_PC_BARM:
+    case CQ_VC_BAR:
+    case CQ_VC_BARM:
+    case CQ_TAR:
+    case CQ_TDR:
+    case CQ_PBI_CTL:
+
+    case PC_TCTXT_CFG:
+    case PC_TCTXT_TRACK:
+    case PC_TCTXT_INDIR0:
+    case PC_TCTXT_INDIR1:
+    case PC_TCTXT_INDIR2:
+    case PC_TCTXT_INDIR3:
+    case PC_GLOBAL_CONFIG:
+
+    case PC_VPC_SCRUB_MASK:
+    case PC_VPC_CWATCH_SPEC:
+    case PC_VPC_CWATCH_DAT0:
+    case PC_VPC_CWATCH_DAT1:
+    case PC_VPC_CWATCH_DAT2:
+    case PC_VPC_CWATCH_DAT3:
+    case PC_VPC_CWATCH_DAT4:
+    case PC_VPC_CWATCH_DAT5:
+    case PC_VPC_CWATCH_DAT6:
+    case PC_VPC_CWATCH_DAT7:
+
+    case VC_GLOBAL_CONFIG:
+    case VC_AIB_TX_ORDER_TAG2:
+
+    case VC_IRQ_CONFIG_IPI:
+    case VC_IRQ_CONFIG_HW:
+    case VC_IRQ_CONFIG_CASCADE1:
+    case VC_IRQ_CONFIG_CASCADE2:
+    case VC_IRQ_CONFIG_REDIST:
+    case VC_IRQ_CONFIG_IPI_CASC:
+
+    case VC_EQC_SCRUB_MASK:
+    case VC_EQC_CWATCH_DAT0:
+    case VC_EQC_CWATCH_DAT1:
+    case VC_EQC_CWATCH_DAT2:
+    case VC_EQC_CWATCH_DAT3:
+
+    case VC_EQC_CWATCH_SPEC:
+    case VC_IVC_SCRUB_MASK:
+    case VC_SBC_CONFIG:
+    case VC_AT_MACRO_KILL_MASK:
+    case VC_VSD_TABLE_ADDR:
+    case PC_VSD_TABLE_ADDR:
+    case VC_VSD_TABLE_DATA:
+    case PC_VSD_TABLE_DATA:
+    case PC_THREAD_EN_REG0:
+    case PC_THREAD_EN_REG1:
+        val = xive->regs[reg];
+        break;
+
+    /*
+     * XIVE hardware thread enablement
+     */
+    case PC_THREAD_EN_REG0_SET:
+    case PC_THREAD_EN_REG0_CLR:
+        val = xive->regs[PC_THREAD_EN_REG0 >> 3];
+        break;
+    case PC_THREAD_EN_REG1_SET:
+    case PC_THREAD_EN_REG1_CLR:
+        val = xive->regs[PC_THREAD_EN_REG1 >> 3];
+        break;
+
+    case CQ_MSGSND: /* Identifies which cores have msgsnd enabled. */
+        val = 0xffffff0000000000;
+        break;
+
+    /*
+     * XIVE PC & VC cache updates for EAS, NVT and END
+     */
+    case PC_VPC_SCRUB_TRIG:
+    case VC_IVC_SCRUB_TRIG:
+    case VC_EQC_SCRUB_TRIG:
+        xive->regs[reg] &= ~VC_SCRUB_VALID;
+        val = xive->regs[reg];
+        break;
+
+    /*
+     * XIVE PC & VC cache invalidation
+     */
+    case PC_AT_KILL:
+        xive->regs[reg] &= ~PC_AT_KILL_VALID;
+        val = xive->regs[reg];
+        break;
+    case VC_AT_MACRO_KILL:
+        xive->regs[reg] &= ~VC_KILL_VALID;
+        val = xive->regs[reg];
+        break;
+
+    /*
+     * XIVE synchronisation
+     */
+    case VC_EQC_CONFIG:
+        val = VC_EQC_SYNC_MASK;
+        break;
+
+    default:
+        xive_error(xive, "IC: invalid read reg=0x%"HWADDR_PRIx, offset);
+    }
+
+    return val;
+}
+
+static const MemoryRegionOps pnv_xive_ic_reg_ops = {
+    .read = pnv_xive_ic_reg_read,
+    .write = pnv_xive_ic_reg_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+};
+
+/*
+ * IC - Notify MMIO port page (write only)
+ */
+#define PNV_XIVE_FORWARD_IPI        0x800 /* Forward IPI */
+#define PNV_XIVE_FORWARD_HW         0x880 /* Forward HW */
+#define PNV_XIVE_FORWARD_OS_ESC     0x900 /* Forward OS escalation */
+#define PNV_XIVE_FORWARD_HW_ESC     0x980 /* Forward Hyp escalation */
+#define PNV_XIVE_FORWARD_REDIS      0xa00 /* Forward Redistribution */
+#define PNV_XIVE_RESERVED5          0xa80 /* Cache line 5 PowerBUS operation */
+#define PNV_XIVE_RESERVED6          0xb00 /* Cache line 6 PowerBUS operation */
+#define PNV_XIVE_RESERVED7          0xb80 /* Cache line 7 PowerBUS operation */
+
+/* VC synchronisation */
+#define PNV_XIVE_SYNC_IPI           0xc00 /* Sync IPI */
+#define PNV_XIVE_SYNC_HW            0xc80 /* Sync HW */
+#define PNV_XIVE_SYNC_OS_ESC        0xd00 /* Sync OS escalation */
+#define PNV_XIVE_SYNC_HW_ESC        0xd80 /* Sync Hyp escalation */
+#define PNV_XIVE_SYNC_REDIS         0xe00 /* Sync Redistribution */
+
+/* PC synchronisation */
+#define PNV_XIVE_SYNC_PULL          0xe80 /* Sync pull context */
+#define PNV_XIVE_SYNC_PUSH          0xf00 /* Sync push context */
+#define PNV_XIVE_SYNC_VPC           0xf80 /* Sync remove VPC store */
+
+static void pnv_xive_ic_hw_trigger(PnvXive *xive, hwaddr addr, uint64_t val)
+{
+    /*
+     * Forward the source event notification directly to the Router.
+     * The source interrupt number should already be correctly encoded
+     * with the chip block id by the sending device (PHB, PSI).
+     */
+    xive_router_notify(XIVE_NOTIFIER(xive), val);
+}
+
+static void pnv_xive_ic_notify_write(void *opaque, hwaddr addr, uint64_t val,
+                                     unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+
+    /* VC: HW triggers */
+    switch (addr) {
+    case 0x000 ... 0x7FF:
+        pnv_xive_ic_hw_trigger(opaque, addr, val);
+        break;
+
+    /* VC: Forwarded IRQs */
+    case PNV_XIVE_FORWARD_IPI:
+    case PNV_XIVE_FORWARD_HW:
+    case PNV_XIVE_FORWARD_OS_ESC:
+    case PNV_XIVE_FORWARD_HW_ESC:
+    case PNV_XIVE_FORWARD_REDIS:
+        /* TODO: forwarded IRQs. Should be like HW triggers */
+        xive_error(xive, "IC: forwarded at @0x%"HWADDR_PRIx" IRQ 0x%"PRIx64,
+                   addr, val);
+        break;
+
+    /* VC syncs */
+    case PNV_XIVE_SYNC_IPI:
+    case PNV_XIVE_SYNC_HW:
+    case PNV_XIVE_SYNC_OS_ESC:
+    case PNV_XIVE_SYNC_HW_ESC:
+    case PNV_XIVE_SYNC_REDIS:
+        break;
+
+    /* PC syncs */
+    case PNV_XIVE_SYNC_PULL:
+    case PNV_XIVE_SYNC_PUSH:
+    case PNV_XIVE_SYNC_VPC:
+        break;
+
+    default:
+        xive_error(xive, "IC: invalid notify write @%"HWADDR_PRIx, addr);
+    }
+}
+
+static uint64_t pnv_xive_ic_notify_read(void *opaque, hwaddr addr,
+                                        unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+
+    /* loads are invalid */
+    xive_error(xive, "IC: invalid notify read @%"HWADDR_PRIx, addr);
+    return -1;
+}
+
+static const MemoryRegionOps pnv_xive_ic_notify_ops = {
+    .read = pnv_xive_ic_notify_read,
+    .write = pnv_xive_ic_notify_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+};
+
+/*
+ * IC - LSI MMIO handlers (not modeled)
+ */
+
+static void pnv_xive_ic_lsi_write(void *opaque, hwaddr addr,
+                              uint64_t val, unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+
+    xive_error(xive, "IC: LSI invalid write @%"HWADDR_PRIx, addr);
+}
+
+static uint64_t pnv_xive_ic_lsi_read(void *opaque, hwaddr addr, unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+
+    xive_error(xive, "IC: LSI invalid read @%"HWADDR_PRIx, addr);
+    return -1;
+}
+
+static const MemoryRegionOps pnv_xive_ic_lsi_ops = {
+    .read = pnv_xive_ic_lsi_read,
+    .write = pnv_xive_ic_lsi_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+};
+
+/*
+ * IC - Indirect TIMA MMIO handlers
+ */
+
+/*
+ * When the TIMA is accessed from the indirect page, the thread id
+ * (PIR) has to be configured in the IC registers before. This is used
+ * for resets and for debug purpose also.
+ */
+static XiveTCTX *pnv_xive_get_indirect_tctx(PnvXive *xive)
+{
+    uint64_t tctxt_indir = xive->regs[PC_TCTXT_INDIR0 >> 3];
+    PowerPCCPU *cpu = NULL;
+    int pir;
+
+    if (!(tctxt_indir & PC_TCTXT_INDIR_VALID)) {
+        xive_error(xive, "IC: no indirect TIMA access in progress");
+        return NULL;
+    }
+
+    pir = GETFIELD(PC_TCTXT_INDIR_THRDID, tctxt_indir) & 0xff;
+    cpu = ppc_get_vcpu_by_pir(pir);
+    if (!cpu) {
+        xive_error(xive, "IC: invalid PIR %x for indirect access", pir);
+        return NULL;
+    }
+
+    /* Check that HW thread is XIVE enabled */
+    if (!(xive->regs[PC_THREAD_EN_REG0 >> 3] & PPC_BIT(pir & 0x3f))) {
+        xive_error(xive, "IC: CPU %x is not enabled", pir);
+    }
+
+    return XIVE_TCTX(pnv_cpu_state(cpu)->intc);
+}
+
+static void xive_tm_indirect_write(void *opaque, hwaddr offset,
+                                   uint64_t value, unsigned size)
+{
+    XiveTCTX *tctx = pnv_xive_get_indirect_tctx(PNV_XIVE(opaque));
+
+    xive_tctx_tm_write(tctx, offset, value, size);
+}
+
+static uint64_t xive_tm_indirect_read(void *opaque, hwaddr offset,
+                                      unsigned size)
+{
+    XiveTCTX *tctx = pnv_xive_get_indirect_tctx(PNV_XIVE(opaque));
+
+    return xive_tctx_tm_read(tctx, offset, size);
+}
+
+static const MemoryRegionOps xive_tm_indirect_ops = {
+    .read = xive_tm_indirect_read,
+    .write = xive_tm_indirect_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 1,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 1,
+        .max_access_size = 8,
+    },
+};
+
+/*
+ * Interrupt controller XSCOM region.
+ */
+static uint64_t pnv_xive_xscom_read(void *opaque, hwaddr addr, unsigned size)
+{
+    switch (addr >> 3) {
+    case X_VC_EQC_CONFIG:
+        /* FIXME (skiboot): This is the only XSCOM load. Bizarre. */
+        return VC_EQC_SYNC_MASK;
+    default:
+        return pnv_xive_ic_reg_read(opaque, addr, size);
+    }
+}
+
+static void pnv_xive_xscom_write(void *opaque, hwaddr addr,
+                                uint64_t val, unsigned size)
+{
+    pnv_xive_ic_reg_write(opaque, addr, val, size);
+}
+
+static const MemoryRegionOps pnv_xive_xscom_ops = {
+    .read = pnv_xive_xscom_read,
+    .write = pnv_xive_xscom_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    }
+};
+
+/*
+ * Virtualization Controller MMIO region containing the IPI and END ESB pages
+ */
+static uint64_t pnv_xive_vc_read(void *opaque, hwaddr offset,
+                                 unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+    uint64_t edt_index = offset >> pnv_xive_edt_shift(xive);
+    uint64_t edt_type = 0;
+    uint64_t edt_offset;
+    MemTxResult result;
+    AddressSpace *edt_as = NULL;
+    uint64_t ret = -1;
+
+    if (edt_index < XIVE_TABLE_EDT_MAX) {
+        edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]);
+    }
+
+    switch (edt_type) {
+    case CQ_TDR_EDT_IPI:
+        edt_as = &xive->ipi_as;
+        break;
+    case CQ_TDR_EDT_EQ:
+        edt_as = &xive->end_as;
+        break;
+    default:
+        xive_error(xive, "VC: invalid EDT type for read @%"HWADDR_PRIx, offset);
+        return -1;
+    }
+
+    /* Remap the offset for the targeted address space */
+    edt_offset = pnv_xive_edt_offset(xive, offset, edt_type);
+
+    ret = address_space_ldq(edt_as, edt_offset, MEMTXATTRS_UNSPECIFIED,
+                            &result);
+
+    if (result != MEMTX_OK) {
+        xive_error(xive, "VC: %s read failed at @0x%"HWADDR_PRIx " -> @0x%"
+                   HWADDR_PRIx, edt_type == CQ_TDR_EDT_IPI ? "IPI" : "END",
+                   offset, edt_offset);
+        return -1;
+    }
+
+    return ret;
+}
+
+static void pnv_xive_vc_write(void *opaque, hwaddr offset,
+                              uint64_t val, unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+    uint64_t edt_index = offset >> pnv_xive_edt_shift(xive);
+    uint64_t edt_type = 0;
+    uint64_t edt_offset;
+    MemTxResult result;
+    AddressSpace *edt_as = NULL;
+
+    if (edt_index < XIVE_TABLE_EDT_MAX) {
+        edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]);
+    }
+
+    switch (edt_type) {
+    case CQ_TDR_EDT_IPI:
+        edt_as = &xive->ipi_as;
+        break;
+    case CQ_TDR_EDT_EQ:
+        edt_as = &xive->end_as;
+        break;
+    default:
+        xive_error(xive, "VC: invalid EDT type for write @%"HWADDR_PRIx,
+                   offset);
+        return;
+    }
+
+    /* Remap the offset for the targeted address space */
+    edt_offset = pnv_xive_edt_offset(xive, offset, edt_type);
+
+    address_space_stq(edt_as, edt_offset, val, MEMTXATTRS_UNSPECIFIED, &result);
+    if (result != MEMTX_OK) {
+        xive_error(xive, "VC: write failed at @0x%"HWADDR_PRIx, edt_offset);
+    }
+}
+
+static const MemoryRegionOps pnv_xive_vc_ops = {
+    .read = pnv_xive_vc_read,
+    .write = pnv_xive_vc_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+};
+
+/*
+ * Presenter Controller MMIO region. The Virtualization Controller
+ * updates the IPB in the NVT table when required. Not modeled.
+ */
+static uint64_t pnv_xive_pc_read(void *opaque, hwaddr addr,
+                                 unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+
+    xive_error(xive, "PC: invalid read @%"HWADDR_PRIx, addr);
+    return -1;
+}
+
+static void pnv_xive_pc_write(void *opaque, hwaddr addr,
+                              uint64_t value, unsigned size)
+{
+    PnvXive *xive = PNV_XIVE(opaque);
+
+    xive_error(xive, "PC: invalid write to VC @%"HWADDR_PRIx, addr);
+}
+
+static const MemoryRegionOps pnv_xive_pc_ops = {
+    .read = pnv_xive_pc_read,
+    .write = pnv_xive_pc_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+};
+
+void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon)
+{
+    XiveRouter *xrtr = XIVE_ROUTER(xive);
+    uint8_t blk = xive->chip->chip_id;
+    uint32_t srcno0 = XIVE_SRCNO(blk, 0);
+    uint32_t nr_ipis = pnv_xive_nr_ipis(xive);
+    uint32_t nr_ends = pnv_xive_nr_ends(xive);
+    XiveEAS eas;
+    XiveEND end;
+    int i;
+
+    monitor_printf(mon, "XIVE[%x] Source %08x .. %08x\n", blk, srcno0,
+                   srcno0 + nr_ipis - 1);
+    xive_source_pic_print_info(&xive->ipi_source, srcno0, mon);
+
+    monitor_printf(mon, "XIVE[%x] EAT %08x .. %08x\n", blk, srcno0,
+                   srcno0 + nr_ipis - 1);
+    for (i = 0; i < nr_ipis; i++) {
+        if (xive_router_get_eas(xrtr, blk, i, &eas)) {
+            break;
+        }
+        if (!xive_eas_is_masked(&eas)) {
+            xive_eas_pic_print_info(&eas, i, mon);
+        }
+    }
+
+    monitor_printf(mon, "XIVE[%x] ENDT %08x .. %08x\n", blk, 0, nr_ends - 1);
+    for (i = 0; i < nr_ends; i++) {
+        if (xive_router_get_end(xrtr, blk, i, &end)) {
+            break;
+        }
+        xive_end_pic_print_info(&end, i, mon);
+    }
+}
+
+static void pnv_xive_reset(void *dev)
+{
+    PnvXive *xive = PNV_XIVE(dev);
+    XiveSource *xsrc = &xive->ipi_source;
+    XiveENDSource *end_xsrc = &xive->end_source;
+
+    /*
+     * Use the PnvChip id to identify the XIVE interrupt controller.
+     * It can be overriden by configuration at runtime.
+     */
+    xive->tctx_chipid = xive->chip->chip_id;
+
+    /* Default page size (Should be changed at runtime to 64k) */
+    xive->ic_shift = xive->vc_shift = xive->pc_shift = 12;
+
+    /* Clear subregions */
+    if (memory_region_is_mapped(&xsrc->esb_mmio)) {
+        memory_region_del_subregion(&xive->ipi_edt_mmio, &xsrc->esb_mmio);
+    }
+
+    if (memory_region_is_mapped(&xive->ipi_edt_mmio)) {
+        memory_region_del_subregion(&xive->ipi_mmio, &xive->ipi_edt_mmio);
+    }
+
+    if (memory_region_is_mapped(&end_xsrc->esb_mmio)) {
+        memory_region_del_subregion(&xive->end_edt_mmio, &end_xsrc->esb_mmio);
+    }
+
+    if (memory_region_is_mapped(&xive->end_edt_mmio)) {
+        memory_region_del_subregion(&xive->end_mmio, &xive->end_edt_mmio);
+    }
+}
+
+static void pnv_xive_init(Object *obj)
+{
+    PnvXive *xive = PNV_XIVE(obj);
+
+    object_initialize_child(obj, "ipi_source", &xive->ipi_source,
+                            sizeof(xive->ipi_source), TYPE_XIVE_SOURCE,
+                            &error_abort, NULL);
+    object_initialize_child(obj, "end_source", &xive->end_source,
+                            sizeof(xive->end_source), TYPE_XIVE_END_SOURCE,
+                            &error_abort, NULL);
+}
+
+/*
+ *  Maximum number of IRQs and ENDs supported by HW
+ */
+#define PNV_XIVE_NR_IRQS (PNV9_XIVE_VC_SIZE / (1ull << XIVE_ESB_64K_2PAGE))
+#define PNV_XIVE_NR_ENDS (PNV9_XIVE_VC_SIZE / (1ull << XIVE_ESB_64K_2PAGE))
+
+static void pnv_xive_realize(DeviceState *dev, Error **errp)
+{
+    PnvXive *xive = PNV_XIVE(dev);
+    XiveSource *xsrc = &xive->ipi_source;
+    XiveENDSource *end_xsrc = &xive->end_source;
+    Error *local_err = NULL;
+    Object *obj;
+
+    obj = object_property_get_link(OBJECT(dev), "chip", &local_err);
+    if (!obj) {
+        error_propagate(errp, local_err);
+        error_prepend(errp, "required link 'chip' not found: ");
+        return;
+    }
+
+    /* The PnvChip id identifies the XIVE interrupt controller. */
+    xive->chip = PNV_CHIP(obj);
+
+    /*
+     * The XiveSource and XiveENDSource objects are realized with the
+     * maximum allowed HW configuration. The ESB MMIO regions will be
+     * resized dynamically when the controller is configured by the FW
+     * to limit accesses to resources not provisioned.
+     */
+    object_property_set_int(OBJECT(xsrc), PNV_XIVE_NR_IRQS, "nr-irqs",
+                            &error_fatal);
+    object_property_add_const_link(OBJECT(xsrc), "xive", OBJECT(xive),
+                                   &error_fatal);
+    object_property_set_bool(OBJECT(xsrc), true, "realized", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    object_property_set_int(OBJECT(end_xsrc), PNV_XIVE_NR_ENDS, "nr-ends",
+                            &error_fatal);
+    object_property_add_const_link(OBJECT(end_xsrc), "xive", OBJECT(xive),
+                                   &error_fatal);
+    object_property_set_bool(OBJECT(end_xsrc), true, "realized", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    /* Default page size. Generally changed at runtime to 64k */
+    xive->ic_shift = xive->vc_shift = xive->pc_shift = 12;
+
+    /* XSCOM region, used for initial configuration of the BARs */
+    memory_region_init_io(&xive->xscom_regs, OBJECT(dev), &pnv_xive_xscom_ops,
+                          xive, "xscom-xive", PNV9_XSCOM_XIVE_SIZE << 3);
+
+    /* Interrupt controller MMIO regions */
+    memory_region_init(&xive->ic_mmio, OBJECT(dev), "xive-ic",
+                       PNV9_XIVE_IC_SIZE);
+
+    memory_region_init_io(&xive->ic_reg_mmio, OBJECT(dev), &pnv_xive_ic_reg_ops,
+                          xive, "xive-ic-reg", 1 << xive->ic_shift);
+    memory_region_init_io(&xive->ic_notify_mmio, OBJECT(dev),
+                          &pnv_xive_ic_notify_ops,
+                          xive, "xive-ic-notify", 1 << xive->ic_shift);
+
+    /* The Pervasive LSI trigger and EOI pages (not modeled) */
+    memory_region_init_io(&xive->ic_lsi_mmio, OBJECT(dev), &pnv_xive_ic_lsi_ops,
+                          xive, "xive-ic-lsi", 2 << xive->ic_shift);
+
+    /* Thread Interrupt Management Area (Indirect) */
+    memory_region_init_io(&xive->tm_indirect_mmio, OBJECT(dev),
+                          &xive_tm_indirect_ops,
+                          xive, "xive-tima-indirect", PNV9_XIVE_TM_SIZE);
+    /*
+     * Overall Virtualization Controller MMIO region containing the
+     * IPI ESB pages and END ESB pages. The layout is defined by the
+     * EDT "Domain table" and the accesses are dispatched using
+     * address spaces for each.
+     */
+    memory_region_init_io(&xive->vc_mmio, OBJECT(xive), &pnv_xive_vc_ops, xive,
+                          "xive-vc", PNV9_XIVE_VC_SIZE);
+
+    memory_region_init(&xive->ipi_mmio, OBJECT(xive), "xive-vc-ipi",
+                       PNV9_XIVE_VC_SIZE);
+    address_space_init(&xive->ipi_as, &xive->ipi_mmio, "xive-vc-ipi");
+    memory_region_init(&xive->end_mmio, OBJECT(xive), "xive-vc-end",
+                       PNV9_XIVE_VC_SIZE);
+    address_space_init(&xive->end_as, &xive->end_mmio, "xive-vc-end");
+
+    /*
+     * The MMIO windows exposing the IPI ESBs and the END ESBs in the
+     * VC region. Their size is configured by the FW in the EDT table.
+     */
+    memory_region_init(&xive->ipi_edt_mmio, OBJECT(xive), "xive-vc-ipi-edt", 0);
+    memory_region_init(&xive->end_edt_mmio, OBJECT(xive), "xive-vc-end-edt", 0);
+
+    /* Presenter Controller MMIO region (not modeled) */
+    memory_region_init_io(&xive->pc_mmio, OBJECT(xive), &pnv_xive_pc_ops, xive,
+                          "xive-pc", PNV9_XIVE_PC_SIZE);
+
+    /* Thread Interrupt Management Area (Direct) */
+    memory_region_init_io(&xive->tm_mmio, OBJECT(xive), &xive_tm_ops,
+                          xive, "xive-tima", PNV9_XIVE_TM_SIZE);
+
+    qemu_register_reset(pnv_xive_reset, dev);
+}
+
+static int pnv_xive_dt_xscom(PnvXScomInterface *dev, void *fdt,
+                             int xscom_offset)
+{
+    const char compat[] = "ibm,power9-xive-x";
+    char *name;
+    int offset;
+    uint32_t lpc_pcba = PNV9_XSCOM_XIVE_BASE;
+    uint32_t reg[] = {
+        cpu_to_be32(lpc_pcba),
+        cpu_to_be32(PNV9_XSCOM_XIVE_SIZE)
+    };
+
+    name = g_strdup_printf("xive@%x", lpc_pcba);
+    offset = fdt_add_subnode(fdt, xscom_offset, name);
+    _FDT(offset);
+    g_free(name);
+
+    _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
+    _FDT((fdt_setprop(fdt, offset, "compatible", compat,
+                      sizeof(compat))));
+    return 0;
+}
+
+static Property pnv_xive_properties[] = {
+    DEFINE_PROP_UINT64("ic-bar", PnvXive, ic_base, 0),
+    DEFINE_PROP_UINT64("vc-bar", PnvXive, vc_base, 0),
+    DEFINE_PROP_UINT64("pc-bar", PnvXive, pc_base, 0),
+    DEFINE_PROP_UINT64("tm-bar", PnvXive, tm_base, 0),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void pnv_xive_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
+    XiveRouterClass *xrc = XIVE_ROUTER_CLASS(klass);
+    XiveNotifierClass *xnc = XIVE_NOTIFIER_CLASS(klass);
+
+    xdc->dt_xscom = pnv_xive_dt_xscom;
+
+    dc->desc = "PowerNV XIVE Interrupt Controller";
+    dc->realize = pnv_xive_realize;
+    dc->props = pnv_xive_properties;
+
+    xrc->get_eas = pnv_xive_get_eas;
+    xrc->get_end = pnv_xive_get_end;
+    xrc->write_end = pnv_xive_write_end;
+    xrc->get_nvt = pnv_xive_get_nvt;
+    xrc->write_nvt = pnv_xive_write_nvt;
+    xrc->get_tctx = pnv_xive_get_tctx;
+
+    xnc->notify = pnv_xive_notify;
+};
+
+static const TypeInfo pnv_xive_info = {
+    .name          = TYPE_PNV_XIVE,
+    .parent        = TYPE_XIVE_ROUTER,
+    .instance_init = pnv_xive_init,
+    .instance_size = sizeof(PnvXive),
+    .class_init    = pnv_xive_class_init,
+    .interfaces    = (InterfaceInfo[]) {
+        { TYPE_PNV_XSCOM_INTERFACE },
+        { }
+    }
+};
+
+static void pnv_xive_register_types(void)
+{
+    type_register_static(&pnv_xive_info);
+}
+
+type_init(pnv_xive_register_types)
diff --git a/hw/intc/pnv_xive_regs.h b/hw/intc/pnv_xive_regs.h
new file mode 100644
index 0000000000..c78f030c02
--- /dev/null
+++ b/hw/intc/pnv_xive_regs.h
@@ -0,0 +1,248 @@
+/*
+ * QEMU PowerPC XIVE interrupt controller model
+ *
+ * Copyright (c) 2017-2018, IBM Corporation.
+ *
+ * This code is licensed under the GPL version 2 or later. See the
+ * COPYING file in the top-level directory.
+ */
+
+#ifndef PPC_PNV_XIVE_REGS_H
+#define PPC_PNV_XIVE_REGS_H
+
+/* IC register offsets 0x0 - 0x400 */
+#define CQ_SWI_CMD_HIST         0x020
+#define CQ_SWI_CMD_POLL         0x028
+#define CQ_SWI_CMD_BCAST        0x030
+#define CQ_SWI_CMD_ASSIGN       0x038
+#define CQ_SWI_CMD_BLK_UPD      0x040
+#define CQ_SWI_RSP              0x048
+#define CQ_CFG_PB_GEN           0x050
+#define   CQ_INT_ADDR_OPT       PPC_BITMASK(14, 15)
+#define CQ_MSGSND               0x058
+#define CQ_CNPM_SEL             0x078
+#define CQ_IC_BAR               0x080
+#define   CQ_IC_BAR_VALID       PPC_BIT(0)
+#define   CQ_IC_BAR_64K         PPC_BIT(1)
+#define CQ_TM1_BAR              0x90
+#define CQ_TM2_BAR              0x0a0
+#define   CQ_TM_BAR_VALID       PPC_BIT(0)
+#define   CQ_TM_BAR_64K         PPC_BIT(1)
+#define CQ_PC_BAR               0x0b0
+#define  CQ_PC_BAR_VALID        PPC_BIT(0)
+#define CQ_PC_BARM              0x0b8
+#define  CQ_PC_BARM_MASK        PPC_BITMASK(26, 38)
+#define CQ_VC_BAR               0x0c0
+#define  CQ_VC_BAR_VALID        PPC_BIT(0)
+#define CQ_VC_BARM              0x0c8
+#define  CQ_VC_BARM_MASK        PPC_BITMASK(21, 37)
+#define CQ_TAR                  0x0f0
+#define  CQ_TAR_TBL_AUTOINC     PPC_BIT(0)
+#define  CQ_TAR_TSEL            PPC_BITMASK(12, 15)
+#define  CQ_TAR_TSEL_BLK        PPC_BIT(12)
+#define  CQ_TAR_TSEL_MIG        PPC_BIT(13)
+#define  CQ_TAR_TSEL_VDT        PPC_BIT(14)
+#define  CQ_TAR_TSEL_EDT        PPC_BIT(15)
+#define  CQ_TAR_TSEL_INDEX      PPC_BITMASK(26, 31)
+#define CQ_TDR                  0x0f8
+#define  CQ_TDR_VDT_VALID       PPC_BIT(0)
+#define  CQ_TDR_VDT_BLK         PPC_BITMASK(11, 15)
+#define  CQ_TDR_VDT_INDEX       PPC_BITMASK(28, 31)
+#define  CQ_TDR_EDT_TYPE        PPC_BITMASK(0, 1)
+#define  CQ_TDR_EDT_INVALID     0
+#define  CQ_TDR_EDT_IPI         1
+#define  CQ_TDR_EDT_EQ          2
+#define  CQ_TDR_EDT_BLK         PPC_BITMASK(12, 15)
+#define  CQ_TDR_EDT_INDEX       PPC_BITMASK(26, 31)
+#define CQ_PBI_CTL              0x100
+#define  CQ_PBI_PC_64K          PPC_BIT(5)
+#define  CQ_PBI_VC_64K          PPC_BIT(6)
+#define  CQ_PBI_LNX_TRIG        PPC_BIT(7)
+#define  CQ_PBI_FORCE_TM_LOCAL  PPC_BIT(22)
+#define CQ_PBO_CTL              0x108
+#define CQ_AIB_CTL              0x110
+#define CQ_RST_CTL              0x118
+#define CQ_FIRMASK              0x198
+#define CQ_FIRMASK_AND          0x1a0
+#define CQ_FIRMASK_OR           0x1a8
+
+/* PC LBS1 register offsets 0x400 - 0x800 */
+#define PC_TCTXT_CFG            0x400
+#define  PC_TCTXT_CFG_BLKGRP_EN         PPC_BIT(0)
+#define  PC_TCTXT_CFG_TARGET_EN         PPC_BIT(1)
+#define  PC_TCTXT_CFG_LGS_EN            PPC_BIT(2)
+#define  PC_TCTXT_CFG_STORE_ACK         PPC_BIT(3)
+#define  PC_TCTXT_CFG_HARD_CHIPID_BLK   PPC_BIT(8)
+#define  PC_TCTXT_CHIPID_OVERRIDE       PPC_BIT(9)
+#define  PC_TCTXT_CHIPID                PPC_BITMASK(12, 15)
+#define  PC_TCTXT_INIT_AGE              PPC_BITMASK(30, 31)
+#define PC_TCTXT_TRACK          0x408
+#define  PC_TCTXT_TRACK_EN              PPC_BIT(0)
+#define PC_TCTXT_INDIR0         0x420
+#define  PC_TCTXT_INDIR_VALID           PPC_BIT(0)
+#define  PC_TCTXT_INDIR_THRDID          PPC_BITMASK(9, 15)
+#define PC_TCTXT_INDIR1         0x428
+#define PC_TCTXT_INDIR2         0x430
+#define PC_TCTXT_INDIR3         0x438
+#define PC_THREAD_EN_REG0       0x440
+#define PC_THREAD_EN_REG0_SET   0x448
+#define PC_THREAD_EN_REG0_CLR   0x450
+#define PC_THREAD_EN_REG1       0x460
+#define PC_THREAD_EN_REG1_SET   0x468
+#define PC_THREAD_EN_REG1_CLR   0x470
+#define PC_GLOBAL_CONFIG        0x480
+#define  PC_GCONF_INDIRECT      PPC_BIT(32)
+#define  PC_GCONF_CHIPID_OVR    PPC_BIT(40)
+#define  PC_GCONF_CHIPID        PPC_BITMASK(44, 47)
+#define PC_VSD_TABLE_ADDR       0x488
+#define PC_VSD_TABLE_DATA       0x490
+#define PC_AT_KILL              0x4b0
+#define  PC_AT_KILL_VALID       PPC_BIT(0)
+#define  PC_AT_KILL_BLOCK_ID    PPC_BITMASK(27, 31)
+#define  PC_AT_KILL_OFFSET      PPC_BITMASK(48, 60)
+#define PC_AT_KILL_MASK         0x4b8
+
+/* PC LBS2 register offsets */
+#define PC_VPC_CACHE_ENABLE     0x708
+#define  PC_VPC_CACHE_EN_MASK   PPC_BITMASK(0, 31)
+#define PC_VPC_SCRUB_TRIG       0x710
+#define PC_VPC_SCRUB_MASK       0x718
+#define  PC_SCRUB_VALID         PPC_BIT(0)
+#define  PC_SCRUB_WANT_DISABLE  PPC_BIT(1)
+#define  PC_SCRUB_WANT_INVAL    PPC_BIT(2)
+#define  PC_SCRUB_BLOCK_ID      PPC_BITMASK(27, 31)
+#define  PC_SCRUB_OFFSET        PPC_BITMASK(45, 63)
+#define PC_VPC_CWATCH_SPEC      0x738
+#define  PC_VPC_CWATCH_CONFLICT PPC_BIT(0)
+#define  PC_VPC_CWATCH_FULL     PPC_BIT(8)
+#define  PC_VPC_CWATCH_BLOCKID  PPC_BITMASK(27, 31)
+#define  PC_VPC_CWATCH_OFFSET   PPC_BITMASK(45, 63)
+#define PC_VPC_CWATCH_DAT0      0x740
+#define PC_VPC_CWATCH_DAT1      0x748
+#define PC_VPC_CWATCH_DAT2      0x750
+#define PC_VPC_CWATCH_DAT3      0x758
+#define PC_VPC_CWATCH_DAT4      0x760
+#define PC_VPC_CWATCH_DAT5      0x768
+#define PC_VPC_CWATCH_DAT6      0x770
+#define PC_VPC_CWATCH_DAT7      0x778
+
+/* VC0 register offsets 0x800 - 0xFFF */
+#define VC_GLOBAL_CONFIG        0x800
+#define  VC_GCONF_INDIRECT      PPC_BIT(32)
+#define VC_VSD_TABLE_ADDR       0x808
+#define VC_VSD_TABLE_DATA       0x810
+#define VC_IVE_ISB_BLOCK_MODE   0x818
+#define VC_EQD_BLOCK_MODE       0x820
+#define VC_VPS_BLOCK_MODE       0x828
+#define VC_IRQ_CONFIG_IPI       0x840
+#define  VC_IRQ_CONFIG_MEMB_EN  PPC_BIT(45)
+#define  VC_IRQ_CONFIG_MEMB_SZ  PPC_BITMASK(46, 51)
+#define VC_IRQ_CONFIG_HW        0x848
+#define VC_IRQ_CONFIG_CASCADE1  0x850
+#define VC_IRQ_CONFIG_CASCADE2  0x858
+#define VC_IRQ_CONFIG_REDIST    0x860
+#define VC_IRQ_CONFIG_IPI_CASC  0x868
+#define  VC_AIB_TX_ORDER_TAG2_REL_TF    PPC_BIT(20)
+#define VC_AIB_TX_ORDER_TAG2    0x890
+#define VC_AT_MACRO_KILL        0x8b0
+#define VC_AT_MACRO_KILL_MASK   0x8b8
+#define  VC_KILL_VALID          PPC_BIT(0)
+#define  VC_KILL_TYPE           PPC_BITMASK(14, 15)
+#define   VC_KILL_IRQ   0
+#define   VC_KILL_IVC   1
+#define   VC_KILL_SBC   2
+#define   VC_KILL_EQD   3
+#define  VC_KILL_BLOCK_ID       PPC_BITMASK(27, 31)
+#define  VC_KILL_OFFSET         PPC_BITMASK(48, 60)
+#define VC_EQC_CACHE_ENABLE     0x908
+#define  VC_EQC_CACHE_EN_MASK   PPC_BITMASK(0, 15)
+#define VC_EQC_SCRUB_TRIG       0x910
+#define VC_EQC_SCRUB_MASK       0x918
+#define VC_EQC_CONFIG           0x920
+#define X_VC_EQC_CONFIG         0x214 /* XSCOM register */
+#define  VC_EQC_CONF_SYNC_IPI           PPC_BIT(32)
+#define  VC_EQC_CONF_SYNC_HW            PPC_BIT(33)
+#define  VC_EQC_CONF_SYNC_ESC1          PPC_BIT(34)
+#define  VC_EQC_CONF_SYNC_ESC2          PPC_BIT(35)
+#define  VC_EQC_CONF_SYNC_REDI          PPC_BIT(36)
+#define  VC_EQC_CONF_EQP_INTERLEAVE     PPC_BIT(38)
+#define  VC_EQC_CONF_ENABLE_END_s_BIT   PPC_BIT(39)
+#define  VC_EQC_CONF_ENABLE_END_u_BIT   PPC_BIT(40)
+#define  VC_EQC_CONF_ENABLE_END_c_BIT   PPC_BIT(41)
+#define  VC_EQC_CONF_ENABLE_MORE_QSZ    PPC_BIT(42)
+#define  VC_EQC_CONF_SKIP_ESCALATE      PPC_BIT(43)
+#define VC_EQC_CWATCH_SPEC      0x928
+#define  VC_EQC_CWATCH_CONFLICT PPC_BIT(0)
+#define  VC_EQC_CWATCH_FULL     PPC_BIT(8)
+#define  VC_EQC_CWATCH_BLOCKID  PPC_BITMASK(28, 31)
+#define  VC_EQC_CWATCH_OFFSET   PPC_BITMASK(40, 63)
+#define VC_EQC_CWATCH_DAT0      0x930
+#define VC_EQC_CWATCH_DAT1      0x938
+#define VC_EQC_CWATCH_DAT2      0x940
+#define VC_EQC_CWATCH_DAT3      0x948
+#define VC_IVC_SCRUB_TRIG       0x990
+#define VC_IVC_SCRUB_MASK       0x998
+#define VC_SBC_SCRUB_TRIG       0xa10
+#define VC_SBC_SCRUB_MASK       0xa18
+#define  VC_SCRUB_VALID         PPC_BIT(0)
+#define  VC_SCRUB_WANT_DISABLE  PPC_BIT(1)
+#define  VC_SCRUB_WANT_INVAL    PPC_BIT(2) /* EQC and SBC only */
+#define  VC_SCRUB_BLOCK_ID      PPC_BITMASK(28, 31)
+#define  VC_SCRUB_OFFSET        PPC_BITMASK(40, 63)
+#define VC_IVC_CACHE_ENABLE     0x988
+#define  VC_IVC_CACHE_EN_MASK   PPC_BITMASK(0, 15)
+#define VC_SBC_CACHE_ENABLE     0xa08
+#define  VC_SBC_CACHE_EN_MASK   PPC_BITMASK(0, 15)
+#define VC_IVC_CACHE_SCRUB_TRIG 0x990
+#define VC_IVC_CACHE_SCRUB_MASK 0x998
+#define VC_SBC_CACHE_ENABLE     0xa08
+#define VC_SBC_CACHE_SCRUB_TRIG 0xa10
+#define VC_SBC_CACHE_SCRUB_MASK 0xa18
+#define VC_SBC_CONFIG           0xa20
+#define  VC_SBC_CONF_CPLX_CIST  PPC_BIT(44)
+#define  VC_SBC_CONF_CIST_BOTH  PPC_BIT(45)
+#define  VC_SBC_CONF_NO_UPD_PRF PPC_BIT(59)
+
+/* VC1 register offsets */
+
+/* VSD Table address register definitions (shared) */
+#define VST_ADDR_AUTOINC        PPC_BIT(0)
+#define VST_TABLE_SELECT        PPC_BITMASK(13, 15)
+#define  VST_TSEL_IVT   0
+#define  VST_TSEL_SBE   1
+#define  VST_TSEL_EQDT  2
+#define  VST_TSEL_VPDT  3
+#define  VST_TSEL_IRQ   4       /* VC only */
+#define VST_TABLE_BLOCK        PPC_BITMASK(27, 31)
+
+/* Number of queue overflow pages */
+#define VC_QUEUE_OVF_COUNT      6
+
+/*
+ * Bits in a VSD entry.
+ *
+ * Note: the address is naturally aligned,  we don't use a PPC_BITMASK,
+ *       but just a mask to apply to the address before OR'ing it in.
+ *
+ * Note: VSD_FIRMWARE is a SW bit ! It hijacks an unused bit in the
+ *       VSD and is only meant to be used in indirect mode !
+ */
+#define VSD_MODE                PPC_BITMASK(0, 1)
+#define  VSD_MODE_SHARED        1
+#define  VSD_MODE_EXCLUSIVE     2
+#define  VSD_MODE_FORWARD       3
+#define VSD_ADDRESS_MASK        0x0ffffffffffff000ull
+#define VSD_MIGRATION_REG       PPC_BITMASK(52, 55)
+#define VSD_INDIRECT            PPC_BIT(56)
+#define VSD_TSIZE               PPC_BITMASK(59, 63)
+#define VSD_FIRMWARE            PPC_BIT(2) /* Read warning above */
+
+#define VC_EQC_SYNC_MASK         \
+        (VC_EQC_CONF_SYNC_IPI  | \
+         VC_EQC_CONF_SYNC_HW   | \
+         VC_EQC_CONF_SYNC_ESC1 | \
+         VC_EQC_CONF_SYNC_ESC2 | \
+         VC_EQC_CONF_SYNC_REDI)
+
+
+#endif /* PPC_PNV_XIVE_REGS_H */
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index b90d03711a..a7ec76dbd6 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -705,7 +705,23 @@ static uint32_t pnv_chip_core_pir_p9(PnvChip *chip, uint32_t core_id)
 static void pnv_chip_power9_intc_create(PnvChip *chip, PowerPCCPU *cpu,
                                         Error **errp)
 {
-    return;
+    Pnv9Chip *chip9 = PNV9_CHIP(chip);
+    Error *local_err = NULL;
+    Object *obj;
+    PnvCPUState *pnv_cpu = pnv_cpu_state(cpu);
+
+    /*
+     * The core creates its interrupt presenter but the XIVE interrupt
+     * controller object is initialized afterwards. Hopefully, it's
+     * only used at runtime.
+     */
+    obj = xive_tctx_create(OBJECT(cpu), XIVE_ROUTER(&chip9->xive), errp);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    pnv_cpu->intc = obj;
 }
 
 /* Allowed core identifiers on a POWER8 Processor Chip :
@@ -887,11 +903,19 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
 
 static void pnv_chip_power9_instance_init(Object *obj)
 {
+    Pnv9Chip *chip9 = PNV9_CHIP(obj);
+
+    object_initialize_child(obj, "xive", &chip9->xive, sizeof(chip9->xive),
+                            TYPE_PNV_XIVE, &error_abort, NULL);
+    object_property_add_const_link(OBJECT(&chip9->xive), "chip", obj,
+                                   &error_abort);
 }
 
 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
 {
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev);
+    Pnv9Chip *chip9 = PNV9_CHIP(dev);
+    PnvChip *chip = PNV_CHIP(dev);
     Error *local_err = NULL;
 
     pcc->parent_realize(dev, &local_err);
@@ -899,6 +923,24 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, local_err);
         return;
     }
+
+    /* XIVE interrupt controller (POWER9) */
+    object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_IC_BASE(chip),
+                            "ic-bar", &error_fatal);
+    object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_VC_BASE(chip),
+                            "vc-bar", &error_fatal);
+    object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_PC_BASE(chip),
+                            "pc-bar", &error_fatal);
+    object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_TM_BASE(chip),
+                            "tm-bar", &error_fatal);
+    object_property_set_bool(OBJECT(&chip9->xive), true, "realized",
+                             &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+    pnv_xscom_add_subregion(chip, PNV9_XSCOM_XIVE_BASE,
+                            &chip9->xive.xscom_regs);
 }
 
 static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 6b65397b7e..ebbb3d0e9a 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -25,6 +25,7 @@
 #include "hw/ppc/pnv_lpc.h"
 #include "hw/ppc/pnv_psi.h"
 #include "hw/ppc/pnv_occ.h"
+#include "hw/ppc/pnv_xive.h"
 
 #define TYPE_PNV_CHIP "pnv-chip"
 #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
@@ -82,6 +83,7 @@ typedef struct Pnv9Chip {
     PnvChip      parent_obj;
 
     /*< public >*/
+    PnvXive      xive;
 } Pnv9Chip;
 
 typedef struct PnvChipClass {
@@ -215,4 +217,23 @@ void pnv_bmc_powerdown(IPMIBmc *bmc);
     (0x0003ffe000000000ull + (uint64_t)PNV_CHIP_INDEX(chip) * \
      PNV_PSIHB_FSP_SIZE)
 
+/*
+ * POWER9 MMIO base addresses
+ */
+#define PNV9_CHIP_BASE(chip, base)   \
+    ((base) + ((uint64_t) (chip)->chip_id << 42))
+
+#define PNV9_XIVE_VC_SIZE            0x0000008000000000ull
+#define PNV9_XIVE_VC_BASE(chip)      PNV9_CHIP_BASE(chip, 0x0006010000000000ull)
+
+#define PNV9_XIVE_PC_SIZE            0x0000001000000000ull
+#define PNV9_XIVE_PC_BASE(chip)      PNV9_CHIP_BASE(chip, 0x0006018000000000ull)
+
+#define PNV9_XIVE_IC_SIZE            0x0000000000080000ull
+#define PNV9_XIVE_IC_BASE(chip)      PNV9_CHIP_BASE(chip, 0x0006030203100000ull)
+
+#define PNV9_XIVE_TM_SIZE            0x0000000000040000ull
+#define PNV9_XIVE_TM_BASE(chip)      PNV9_CHIP_BASE(chip, 0x0006030203180000ull)
+
+
 #endif /* _PPC_PNV_H */
diff --git a/include/hw/ppc/pnv_xive.h b/include/hw/ppc/pnv_xive.h
new file mode 100644
index 0000000000..4fdaa9247d
--- /dev/null
+++ b/include/hw/ppc/pnv_xive.h
@@ -0,0 +1,93 @@
+/*
+ * QEMU PowerPC XIVE interrupt controller model
+ *
+ * Copyright (c) 2017-2019, IBM Corporation.
+ *
+ * This code is licensed under the GPL version 2 or later. See the
+ * COPYING file in the top-level directory.
+ */
+
+#ifndef PPC_PNV_XIVE_H
+#define PPC_PNV_XIVE_H
+
+#include "hw/ppc/xive.h"
+
+struct PnvChip;
+
+#define TYPE_PNV_XIVE "pnv-xive"
+#define PNV_XIVE(obj) OBJECT_CHECK(PnvXive, (obj), TYPE_PNV_XIVE)
+
+#define XIVE_BLOCK_MAX      16
+
+#define XIVE_TABLE_BLK_MAX  16  /* Block Scope Table (0-15) */
+#define XIVE_TABLE_MIG_MAX  16  /* Migration Register Table (1-15) */
+#define XIVE_TABLE_VDT_MAX  16  /* VDT Domain Table (0-15) */
+#define XIVE_TABLE_EDT_MAX  64  /* EDT Domain Table (0-63) */
+
+typedef struct PnvXive {
+    XiveRouter    parent_obj;
+
+    /* Owning chip */
+    struct PnvChip *chip;
+
+    /* XSCOM addresses giving access to the controller registers */
+    MemoryRegion  xscom_regs;
+
+    /* Main MMIO regions that can be configured by FW */
+    MemoryRegion  ic_mmio;
+    MemoryRegion    ic_reg_mmio;
+    MemoryRegion    ic_notify_mmio;
+    MemoryRegion    ic_lsi_mmio;
+    MemoryRegion    tm_indirect_mmio;
+    MemoryRegion  vc_mmio;
+    MemoryRegion  pc_mmio;
+    MemoryRegion  tm_mmio;
+
+    /*
+     * IPI and END address spaces modeling the EDT segmentation in the
+     * VC region
+     */
+    AddressSpace  ipi_as;
+    MemoryRegion  ipi_mmio;
+    MemoryRegion    ipi_edt_mmio;
+
+    AddressSpace  end_as;
+    MemoryRegion  end_mmio;
+    MemoryRegion    end_edt_mmio;
+
+    /* Shortcut values for the Main MMIO regions */
+    hwaddr        ic_base;
+    uint32_t      ic_shift;
+    hwaddr        vc_base;
+    uint32_t      vc_shift;
+    hwaddr        pc_base;
+    uint32_t      pc_shift;
+    hwaddr        tm_base;
+    uint32_t      tm_shift;
+
+    /* Our XIVE source objects for IPIs and ENDs */
+    XiveSource    ipi_source;
+    XiveENDSource end_source;
+
+    /* Interrupt controller registers */
+    uint64_t      regs[0x300];
+
+    /* Can be configured by FW */
+    uint32_t      tctx_chipid;
+
+    /*
+     * Virtual Structure Descriptor tables : EAT, SBE, ENDT, NVTT, IRQ
+     * These are in a SRAM protected by ECC.
+     */
+    uint64_t      vsds[5][XIVE_BLOCK_MAX];
+
+    /* Translation tables */
+    uint64_t      blk[XIVE_TABLE_BLK_MAX];
+    uint64_t      mig[XIVE_TABLE_MIG_MAX];
+    uint64_t      vdt[XIVE_TABLE_VDT_MAX];
+    uint64_t      edt[XIVE_TABLE_EDT_MAX];
+} PnvXive;
+
+void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon);
+
+#endif /* PPC_PNV_XIVE_H */
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index 255b26a5aa..6623ec54a7 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -73,6 +73,9 @@ typedef struct PnvXScomInterfaceClass {
 #define PNV_XSCOM_OCC_BASE        0x0066000
 #define PNV_XSCOM_OCC_SIZE        0x6000
 
+#define PNV9_XSCOM_XIVE_BASE      0x5013000
+#define PNV9_XSCOM_XIVE_SIZE      0x300
+
 extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
 extern int pnv_dt_xscom(PnvChip *chip, void *fdt, int offset);
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 27/60] ppc/pnv: introduce a new dt_populate() operation to the chip model
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (25 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 26/60] ppc/pnv: add a XIVE interrupt controller model for POWER9 David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 28/60] ppc/pnv: introduce a new pic_print_info() " David Gibson
                   ` (34 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The POWER9 and POWER8 processors have a different set of devices and a
different device tree layout.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-8-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c         | 27 +++++++++++++++++++++++++--
 include/hw/ppc/pnv.h |  1 +
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index a7ec76dbd6..087541a91a 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -267,7 +267,7 @@ static void pnv_dt_icp(PnvChip *chip, void *fdt, uint32_t pir,
     g_free(reg);
 }
 
-static void pnv_dt_chip(PnvChip *chip, void *fdt)
+static void pnv_chip_power8_dt_populate(PnvChip *chip, void *fdt)
 {
     const char *typename = pnv_chip_core_typename(chip);
     size_t typesize = object_type_get_instance_size(typename);
@@ -289,6 +289,25 @@ static void pnv_dt_chip(PnvChip *chip, void *fdt)
     }
 }
 
+static void pnv_chip_power9_dt_populate(PnvChip *chip, void *fdt)
+{
+    const char *typename = pnv_chip_core_typename(chip);
+    size_t typesize = object_type_get_instance_size(typename);
+    int i;
+
+    pnv_dt_xscom(chip, fdt, 0);
+
+    for (i = 0; i < chip->nr_cores; i++) {
+        PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
+
+        pnv_dt_core(chip, pnv_core, fdt);
+    }
+
+    if (chip->ram_size) {
+        pnv_dt_memory(fdt, chip->chip_id, chip->ram_start, chip->ram_size);
+    }
+}
+
 static void pnv_dt_rtc(ISADevice *d, void *fdt, int lpc_off)
 {
     uint32_t io_base = d->ioport_id;
@@ -474,7 +493,7 @@ static void *pnv_dt_create(MachineState *machine)
 
     /* Populate device tree for each chip */
     for (i = 0; i < pnv->num_chips; i++) {
-        pnv_dt_chip(pnv->chips[i], fdt);
+        PNV_CHIP_GET_CLASS(pnv->chips[i])->dt_populate(pnv->chips[i], fdt);
     }
 
     /* Populate ISA devices on chip 0 */
@@ -858,6 +877,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
     k->core_pir = pnv_chip_core_pir_p8;
     k->intc_create = pnv_chip_power8_intc_create;
     k->isa_create = pnv_chip_power8_isa_create;
+    k->dt_populate = pnv_chip_power8_dt_populate;
     k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8E";
 
@@ -876,6 +896,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
     k->core_pir = pnv_chip_core_pir_p8;
     k->intc_create = pnv_chip_power8_intc_create;
     k->isa_create = pnv_chip_power8_isa_create;
+    k->dt_populate = pnv_chip_power8_dt_populate;
     k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8";
 
@@ -894,6 +915,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
     k->core_pir = pnv_chip_core_pir_p8;
     k->intc_create = pnv_chip_power8_intc_create;
     k->isa_create = pnv_chip_power8nvl_isa_create;
+    k->dt_populate = pnv_chip_power8_dt_populate;
     k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8NVL";
 
@@ -954,6 +976,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
     k->core_pir = pnv_chip_core_pir_p9;
     k->intc_create = pnv_chip_power9_intc_create;
     k->isa_create = pnv_chip_power9_isa_create;
+    k->dt_populate = pnv_chip_power9_dt_populate;
     k->xscom_base = 0x00603fc00000000ull;
     dc->desc = "PowerNV Chip POWER9";
 
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index ebbb3d0e9a..fa9ec50fd5 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -102,6 +102,7 @@ typedef struct PnvChipClass {
     uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id);
     void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp);
     ISABus *(*isa_create)(PnvChip *chip, Error **errp);
+    void (*dt_populate)(PnvChip *chip, void *fdt);
 } PnvChipClass;
 
 #define PNV_CHIP_TYPE_SUFFIX "-" TYPE_PNV_CHIP
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 28/60] ppc/pnv: introduce a new pic_print_info() operation to the chip model
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (26 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 27/60] ppc/pnv: introduce a new dt_populate() operation to the chip model David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 29/60] ppc/xive: activate HV support David Gibson
                   ` (33 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The POWER9 and POWER8 processors have different interrupt controllers,
and reporting their state requires calling different helper routines.

However, the interrupt presenters are still handled in the higher
level pic_print_info() routine because they are not related to the
chip.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-9-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c         | 27 ++++++++++++++++++++++++---
 include/hw/ppc/pnv.h |  1 +
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 087541a91a..7660eaa22c 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -567,6 +567,20 @@ static ISABus *pnv_isa_create(PnvChip *chip, Error **errp)
     return PNV_CHIP_GET_CLASS(chip)->isa_create(chip, errp);
 }
 
+static void pnv_chip_power8_pic_print_info(PnvChip *chip, Monitor *mon)
+{
+    Pnv8Chip *chip8 = PNV8_CHIP(chip);
+
+    ics_pic_print_info(&chip8->psi.ics, mon);
+}
+
+static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon)
+{
+    Pnv9Chip *chip9 = PNV9_CHIP(chip);
+
+    pnv_xive_pic_print_info(&chip9->xive, mon);
+}
+
 static void pnv_init(MachineState *machine)
 {
     PnvMachineState *pnv = PNV_MACHINE(machine);
@@ -878,6 +892,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
     k->intc_create = pnv_chip_power8_intc_create;
     k->isa_create = pnv_chip_power8_isa_create;
     k->dt_populate = pnv_chip_power8_dt_populate;
+    k->pic_print_info = pnv_chip_power8_pic_print_info;
     k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8E";
 
@@ -897,6 +912,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
     k->intc_create = pnv_chip_power8_intc_create;
     k->isa_create = pnv_chip_power8_isa_create;
     k->dt_populate = pnv_chip_power8_dt_populate;
+    k->pic_print_info = pnv_chip_power8_pic_print_info;
     k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8";
 
@@ -916,6 +932,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
     k->intc_create = pnv_chip_power8_intc_create;
     k->isa_create = pnv_chip_power8nvl_isa_create;
     k->dt_populate = pnv_chip_power8_dt_populate;
+    k->pic_print_info = pnv_chip_power8_pic_print_info;
     k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8NVL";
 
@@ -977,6 +994,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
     k->intc_create = pnv_chip_power9_intc_create;
     k->isa_create = pnv_chip_power9_isa_create;
     k->dt_populate = pnv_chip_power9_dt_populate;
+    k->pic_print_info = pnv_chip_power9_pic_print_info;
     k->xscom_base = 0x00603fc00000000ull;
     dc->desc = "PowerNV Chip POWER9";
 
@@ -1164,12 +1182,15 @@ static void pnv_pic_print_info(InterruptStatsProvider *obj,
     CPU_FOREACH(cs) {
         PowerPCCPU *cpu = POWERPC_CPU(cs);
 
-        icp_pic_print_info(ICP(pnv_cpu_state(cpu)->intc), mon);
+        if (pnv_chip_is_power9(pnv->chips[0])) {
+            xive_tctx_pic_print_info(XIVE_TCTX(pnv_cpu_state(cpu)->intc), mon);
+        } else {
+            icp_pic_print_info(ICP(pnv_cpu_state(cpu)->intc), mon);
+        }
     }
 
     for (i = 0; i < pnv->num_chips; i++) {
-        Pnv8Chip *chip8 = PNV8_CHIP(pnv->chips[i]);
-        ics_pic_print_info(&chip8->psi.ics, mon);
+        PNV_CHIP_GET_CLASS(pnv->chips[i])->pic_print_info(pnv->chips[i], mon);
     }
 }
 
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index fa9ec50fd5..eb4bba25b3 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -103,6 +103,7 @@ typedef struct PnvChipClass {
     void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp);
     ISABus *(*isa_create)(PnvChip *chip, Error **errp);
     void (*dt_populate)(PnvChip *chip, void *fdt);
+    void (*pic_print_info)(PnvChip *chip, Monitor *mon);
 } PnvChipClass;
 
 #define PNV_CHIP_TYPE_SUFFIX "-" TYPE_PNV_CHIP
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 29/60] ppc/xive: activate HV support
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (27 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 28/60] ppc/pnv: introduce a new pic_print_info() " David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 30/60] ppc/pnv: fix logging primitives using Ox David Gibson
                   ` (32 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The NSR register of the HV ring has a different, although similar, bit
layout. TM_QW3_NSR_HE_PHYS bit should now be raised when the
Hypervisor interrupt line is signaled. Other bits TM_QW3_NSR_HE_POOL
and TM_QW3_NSR_HE_LSI are not modeled. LSI are for special interrupts
reserved for HW bringup and the POOL bit is used when signaling a
group of VPs. This is not currently implemented in Linux but it is in
pHyp.

The most important special commands on the HV TIMA page are added to
let the core manage interrupts : acking and changing the CPU priority.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-10-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/intc/xive.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 54 insertions(+), 3 deletions(-)

diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index 7d7992c0ce..a0b87001da 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -54,6 +54,8 @@ static uint8_t exception_mask(uint8_t ring)
     switch (ring) {
     case TM_QW1_OS:
         return TM_QW1_NSR_EO;
+    case TM_QW3_HV_PHYS:
+        return TM_QW3_NSR_HE;
     default:
         g_assert_not_reached();
     }
@@ -88,7 +90,16 @@ static void xive_tctx_notify(XiveTCTX *tctx, uint8_t ring)
     uint8_t *regs = &tctx->regs[ring];
 
     if (regs[TM_PIPR] < regs[TM_CPPR]) {
-        regs[TM_NSR] |= exception_mask(ring);
+        switch (ring) {
+        case TM_QW1_OS:
+            regs[TM_NSR] |= TM_QW1_NSR_EO;
+            break;
+        case TM_QW3_HV_PHYS:
+            regs[TM_NSR] |= (TM_QW3_NSR_HE_PHYS << 6);
+            break;
+        default:
+            g_assert_not_reached();
+        }
         qemu_irq_raise(tctx->output);
     }
 }
@@ -109,6 +120,38 @@ static void xive_tctx_set_cppr(XiveTCTX *tctx, uint8_t ring, uint8_t cppr)
  * XIVE Thread Interrupt Management Area (TIMA)
  */
 
+static void xive_tm_set_hv_cppr(XiveTCTX *tctx, hwaddr offset,
+                                uint64_t value, unsigned size)
+{
+    xive_tctx_set_cppr(tctx, TM_QW3_HV_PHYS, value & 0xff);
+}
+
+static uint64_t xive_tm_ack_hv_reg(XiveTCTX *tctx, hwaddr offset, unsigned size)
+{
+    return xive_tctx_accept(tctx, TM_QW3_HV_PHYS);
+}
+
+static uint64_t xive_tm_pull_pool_ctx(XiveTCTX *tctx, hwaddr offset,
+                                      unsigned size)
+{
+    uint64_t ret;
+
+    ret = tctx->regs[TM_QW2_HV_POOL + TM_WORD2] & TM_QW2W2_POOL_CAM;
+    tctx->regs[TM_QW2_HV_POOL + TM_WORD2] &= ~TM_QW2W2_POOL_CAM;
+    return ret;
+}
+
+static void xive_tm_vt_push(XiveTCTX *tctx, hwaddr offset,
+                            uint64_t value, unsigned size)
+{
+    tctx->regs[TM_QW3_HV_PHYS + TM_WORD2] = value & 0xff;
+}
+
+static uint64_t xive_tm_vt_poll(XiveTCTX *tctx, hwaddr offset, unsigned size)
+{
+    return tctx->regs[TM_QW3_HV_PHYS + TM_WORD2] & 0xff;
+}
+
 /*
  * Define an access map for each page of the TIMA that we will use in
  * the memory region ops to filter values when doing loads and stores
@@ -288,10 +331,16 @@ static const XiveTmOp xive_tm_operations[] = {
      * effects
      */
     { XIVE_TM_OS_PAGE, TM_QW1_OS + TM_CPPR,   1, xive_tm_set_os_cppr, NULL },
+    { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_CPPR, 1, xive_tm_set_hv_cppr, NULL },
+    { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_WORD2, 1, xive_tm_vt_push, NULL },
+    { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_WORD2, 1, NULL, xive_tm_vt_poll },
 
     /* MMIOs above 2K : special operations with side effects */
     { XIVE_TM_OS_PAGE, TM_SPC_ACK_OS_REG,     2, NULL, xive_tm_ack_os_reg },
     { XIVE_TM_OS_PAGE, TM_SPC_SET_OS_PENDING, 1, xive_tm_set_os_pending, NULL },
+    { XIVE_TM_HV_PAGE, TM_SPC_ACK_HV_REG,     2, NULL, xive_tm_ack_hv_reg },
+    { XIVE_TM_HV_PAGE, TM_SPC_PULL_POOL_CTX,  4, NULL, xive_tm_pull_pool_ctx },
+    { XIVE_TM_HV_PAGE, TM_SPC_PULL_POOL_CTX,  8, NULL, xive_tm_pull_pool_ctx },
 };
 
 static const XiveTmOp *xive_tm_find_op(hwaddr offset, unsigned size, bool write)
@@ -323,7 +372,7 @@ void xive_tctx_tm_write(XiveTCTX *tctx, hwaddr offset, uint64_t value,
     const XiveTmOp *xto;
 
     /*
-     * TODO: check V bit in Q[0-3]W2, check PTER bit associated with CPU
+     * TODO: check V bit in Q[0-3]W2
      */
 
     /*
@@ -360,7 +409,7 @@ uint64_t xive_tctx_tm_read(XiveTCTX *tctx, hwaddr offset, unsigned size)
     const XiveTmOp *xto;
 
     /*
-     * TODO: check V bit in Q[0-3]W2, check PTER bit associated with CPU
+     * TODO: check V bit in Q[0-3]W2
      */
 
     /*
@@ -472,6 +521,8 @@ static void xive_tctx_reset(void *dev)
      */
     tctx->regs[TM_QW1_OS + TM_PIPR] =
         ipb_to_pipr(tctx->regs[TM_QW1_OS + TM_IPB]);
+    tctx->regs[TM_QW3_HV_PHYS + TM_PIPR] =
+        ipb_to_pipr(tctx->regs[TM_QW3_HV_PHYS + TM_IPB]);
 }
 
 static void xive_tctx_realize(DeviceState *dev, Error **errp)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 30/60] ppc/pnv: fix logging primitives using Ox
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (28 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 29/60] ppc/xive: activate HV support David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 31/60] ppc/pnv: psi: add a PSIHB_REG macro David Gibson
                   ` (31 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-12-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv_lpc.c | 10 +++++-----
 hw/ppc/pnv_psi.c |  4 ++--
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index 172a915cfc..9b18ce55e3 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -294,7 +294,7 @@ static uint64_t lpc_hc_read(void *opaque, hwaddr addr, unsigned size)
         val =  lpc->lpc_hc_error_addr;
         break;
     default:
-        qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: Ox%"
+        qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: 0x%"
                       HWADDR_PRIx "\n", addr);
     }
     return val;
@@ -332,7 +332,7 @@ static void lpc_hc_write(void *opaque, hwaddr addr, uint64_t val,
     case LPC_HC_ERROR_ADDRESS:
         break;
     default:
-        qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: Ox%"
+        qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: 0x%"
                       HWADDR_PRIx "\n", addr);
     }
 }
@@ -370,7 +370,7 @@ static uint64_t opb_master_read(void *opaque, hwaddr addr, unsigned size)
         val = lpc->opb_irq_input;
         break;
     default:
-        qemu_log_mask(LOG_UNIMP, "OPB MASTER Unimplemented register: Ox%"
+        qemu_log_mask(LOG_UNIMP, "OPBM: read on unimplemented register: 0x%"
                       HWADDR_PRIx "\n", addr);
     }
 
@@ -399,8 +399,8 @@ static void opb_master_write(void *opaque, hwaddr addr,
         /* Read only */
         break;
     default:
-        qemu_log_mask(LOG_UNIMP, "OPB MASTER Unimplemented register: Ox%"
-                      HWADDR_PRIx "\n", addr);
+        qemu_log_mask(LOG_UNIMP, "OPBM: write on unimplemented register: 0x%"
+                      HWADDR_PRIx " val=0x%08"PRIx64"\n", addr, val);
     }
 }
 
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 44bc0cbf58..c872be0b9c 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -323,7 +323,7 @@ static uint64_t pnv_psi_reg_read(PnvPsi *psi, uint32_t offset, bool mmio)
         val = psi->regs[offset];
         break;
     default:
-        qemu_log_mask(LOG_UNIMP, "PSI: read at Ox%" PRIx32 "\n", offset);
+        qemu_log_mask(LOG_UNIMP, "PSI: read at 0x%" PRIx32 "\n", offset);
     }
     return val;
 }
@@ -382,7 +382,7 @@ static void pnv_psi_reg_write(PnvPsi *psi, uint32_t offset, uint64_t val,
         pnv_psi_set_irsn(psi, val);
         break;
     default:
-        qemu_log_mask(LOG_UNIMP, "PSI: write at Ox%" PRIx32 "\n", offset);
+        qemu_log_mask(LOG_UNIMP, "PSI: write at 0x%" PRIx32 "\n", offset);
     }
 }
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 31/60] ppc/pnv: psi: add a PSIHB_REG macro
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (29 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 30/60] ppc/pnv: fix logging primitives using Ox David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 32/60] ppc/pnv: psi: add a reset handler David Gibson
                   ` (30 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

This is a simple helper to translate XSCOM addresses to MMIO addresses

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-13-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv_psi.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index c872be0b9c..a2f8d0dece 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -114,6 +114,8 @@
 #define PSIHB_BAR_MASK                  0x0003fffffff00000ull
 #define PSIHB_FSPBAR_MASK               0x0003ffff00000000ull
 
+#define PSIHB_REG(addr) (((addr) >> 3) + PSIHB_XSCOM_BAR)
+
 static void pnv_psi_set_bar(PnvPsi *psi, uint64_t bar)
 {
     MemoryRegion *sysmem = get_system_memory();
@@ -392,13 +394,13 @@ static void pnv_psi_reg_write(PnvPsi *psi, uint32_t offset, uint64_t val,
  */
 static uint64_t pnv_psi_mmio_read(void *opaque, hwaddr addr, unsigned size)
 {
-    return pnv_psi_reg_read(opaque, (addr >> 3) + PSIHB_XSCOM_BAR, true);
+    return pnv_psi_reg_read(opaque, PSIHB_REG(addr), true);
 }
 
 static void pnv_psi_mmio_write(void *opaque, hwaddr addr,
                               uint64_t val, unsigned size)
 {
-    pnv_psi_reg_write(opaque, (addr >> 3) + PSIHB_XSCOM_BAR, val, true);
+    pnv_psi_reg_write(opaque, PSIHB_REG(addr), val, true);
 }
 
 static const MemoryRegionOps psi_mmio_ops = {
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 32/60] ppc/pnv: psi: add a reset handler
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (30 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 31/60] ppc/pnv: psi: add a PSIHB_REG macro David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 33/60] spapr_iommu: Do not replay mappings from just created DMA window David Gibson
                   ` (29 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

Reset all regs but keep the MMIO BAR enabled as it is at realize time.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190306085032.15744-14-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv_psi.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index a2f8d0dece..e61861bfd3 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -442,6 +442,15 @@ static const MemoryRegionOps pnv_psi_xscom_ops = {
     }
 };
 
+static void pnv_psi_reset(void *dev)
+{
+    PnvPsi *psi = PNV_PSI(dev);
+
+    memset(psi->regs, 0x0, sizeof(psi->regs));
+
+    psi->regs[PSIHB_XSCOM_BAR] = psi->bar | PSIHB_BAR_EN;
+}
+
 static void pnv_psi_init(Object *obj)
 {
     PnvPsi *psi = PNV_PSI(obj);
@@ -511,6 +520,8 @@ static void pnv_psi_realize(DeviceState *dev, Error **errp)
         psi->regs[xivr] = PSIHB_XIVR_PRIO_MSK |
             ((uint64_t) i << PSIHB_XIVR_SRC_SH);
     }
+
+    qemu_register_reset(pnv_psi_reset, dev);
 }
 
 static int pnv_psi_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_offset)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 33/60] spapr_iommu: Do not replay mappings from just created DMA window
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (31 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 32/60] ppc/pnv: psi: add a reset handler David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 34/60] target/ppc: introduce single fpr_offset() function David Gibson
                   ` (28 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Alexey Kardashevskiy, David Gibson

From: Alexey Kardashevskiy <aik@ozlabs.ru>

On sPAPR vfio_listener_region_add() is called in 2 situations:
1. a new listener is registered from vfio_connect_container();
2. a new IOMMU Memory Region is added from rtas_ibm_create_pe_dma_window().

In both cases vfio_listener_region_add() calls
memory_region_iommu_replay() to notify newly registered IOMMU notifiers
about existing mappings which is totally desirable for case 1.

However for case 2 it is nothing but noop as the window has just been
created and has no valid mappings so replaying those does not do anything.
It is barely noticeable with usual guests but if the window happens to be
really big, such no-op replay might take minutes and trigger RCU stall
warnings in the guest.

For example, a upcoming GPU RAM memory region mapped at 64TiB (right
after SPAPR_PCI_LIMIT) causes a 64bit DMA window to be at least 128TiB
which is (128<<40)/0x10000=2.147.483.648 TCEs to replay.

This mitigates the problem by adding an "skipping_replay" flag to
sPAPRTCETable and defining sPAPR own IOMMU MR replay() hook which does
exactly the same thing as the generic one except it returns early if
@skipping_replay==true.

Another way of fixing this would be delaying replay till the very first
H_PUT_TCE but this does not work if in-kernel H_PUT_TCE handler is
enabled (a likely case).

When "ibm,create-pe-dma-window" is complete, the guest will map only
required regions of the huge DMA window.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Message-Id: <20190307050518.64968-2-aik@ozlabs.ru>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr_iommu.c    | 31 +++++++++++++++++++++++++++++++
 hw/ppc/spapr_rtas_ddw.c | 10 ++++++++++
 include/hw/ppc/spapr.h  |  1 +
 3 files changed, 42 insertions(+)

diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index 37e98f9321..8f231799b2 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -141,6 +141,36 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(IOMMUMemoryRegion *iommu,
     return ret;
 }
 
+static void spapr_tce_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n)
+{
+    MemoryRegion *mr = MEMORY_REGION(iommu_mr);
+    IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr);
+    hwaddr addr, granularity;
+    IOMMUTLBEntry iotlb;
+    sPAPRTCETable *tcet = container_of(iommu_mr, sPAPRTCETable, iommu);
+
+    if (tcet->skipping_replay) {
+        return;
+    }
+
+    granularity = memory_region_iommu_get_min_page_size(iommu_mr);
+
+    for (addr = 0; addr < memory_region_size(mr); addr += granularity) {
+        iotlb = imrc->translate(iommu_mr, addr, IOMMU_NONE, n->iommu_idx);
+        if (iotlb.perm != IOMMU_NONE) {
+            n->notify(n, &iotlb);
+        }
+
+        /*
+         * if (2^64 - MR size) < granularity, it's possible to get an
+         * infinite loop here.  This should catch such a wraparound.
+         */
+        if ((addr + granularity) < addr) {
+            break;
+        }
+    }
+}
+
 static int spapr_tce_table_pre_save(void *opaque)
 {
     sPAPRTCETable *tcet = SPAPR_TCE_TABLE(opaque);
@@ -659,6 +689,7 @@ static void spapr_iommu_memory_region_class_init(ObjectClass *klass, void *data)
     IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_CLASS(klass);
 
     imrc->translate = spapr_tce_translate_iommu;
+    imrc->replay = spapr_tce_replay;
     imrc->get_min_page_size = spapr_tce_get_min_page_size;
     imrc->notify_flag_changed = spapr_tce_notify_flag_changed;
     imrc->get_attr = spapr_tce_get_attr;
diff --git a/hw/ppc/spapr_rtas_ddw.c b/hw/ppc/spapr_rtas_ddw.c
index cb8a410359..cc9d1f5c1c 100644
--- a/hw/ppc/spapr_rtas_ddw.c
+++ b/hw/ppc/spapr_rtas_ddw.c
@@ -171,8 +171,18 @@ static void rtas_ibm_create_pe_dma_window(PowerPCCPU *cpu,
     }
 
     win_addr = (windows == 0) ? sphb->dma_win_addr : sphb->dma64_win_addr;
+    /*
+     * We have just created a window, we know for the fact that it is empty,
+     * use a hack to avoid iterating over the table as it is quite possible
+     * to have billions of TCEs, all empty.
+     * Note that we cannot delay this to the first H_PUT_TCE as this hcall is
+     * mostly likely to be handled in KVM so QEMU just does not know if it
+     * happened.
+     */
+    tcet->skipping_replay = true;
     spapr_tce_table_enable(tcet, page_shift, win_addr,
                            1ULL << (window_shift - page_shift));
+    tcet->skipping_replay = false;
     if (!tcet->nb_table) {
         goto hw_error_exit;
     }
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 1311ebe28e..f117a7ce6e 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -723,6 +723,7 @@ struct sPAPRTCETable {
     uint64_t *mig_table;
     bool bypass;
     bool need_vfio;
+    bool skipping_replay;
     int fd;
     MemoryRegion root;
     IOMMUMemoryRegion iommu;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 34/60] target/ppc: introduce single fpr_offset() function
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (32 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 33/60] spapr_iommu: Do not replay mappings from just created DMA window David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 35/60] target/ppc: introduce single vsrl_offset() function David Gibson
                   ` (27 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland,
	Richard Henderson, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

Instead of having multiple copies of the offset calculation logic, move it to a
single fpr_offset() function.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20190307180520.13868-2-mark.cave-ayland@ilande.co.uk>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/cpu.h       | 7 ++++++-
 target/ppc/translate.c | 4 ++--
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 81763d72f9..15e053becd 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -2563,9 +2563,14 @@ static inline bool lsw_reg_in_range(int start, int nregs, int rx)
 }
 
 /* Accessors for FP, VMX and VSX registers */
+static inline int fpr_offset(int i)
+{
+    return offsetof(CPUPPCState, vsr[i].u64[0]);
+}
+
 static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i)
 {
-    return &env->vsr[i].u64[0];
+    return (uint64_t *)((uintptr_t)env + fpr_offset(i));
 }
 
 static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i)
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index b156be4d98..668d4cf75a 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -6677,12 +6677,12 @@ GEN_TM_PRIV_NOOP(trechkpt);
 
 static inline void get_fpr(TCGv_i64 dst, int regno)
 {
-    tcg_gen_ld_i64(dst, cpu_env, offsetof(CPUPPCState, vsr[regno].u64[0]));
+    tcg_gen_ld_i64(dst, cpu_env, fpr_offset(regno));
 }
 
 static inline void set_fpr(int regno, TCGv_i64 src)
 {
-    tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState, vsr[regno].u64[0]));
+    tcg_gen_st_i64(src, cpu_env, fpr_offset(regno));
 }
 
 static inline void get_avr64(TCGv_i64 dst, int regno, bool high)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 35/60] target/ppc: introduce single vsrl_offset() function
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (33 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 34/60] target/ppc: introduce single fpr_offset() function David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 36/60] target/ppc: move Vsr* macros from internal.h to cpu.h David Gibson
                   ` (26 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland,
	Richard Henderson, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

Instead of having multiple copies of the offset calculation logic, move it to a
single vsrl_offset() function.

This commit also renames the existing get_vsr()/set_vsr() functions to
get_vsrl()/set_vsrl() which better describes their purpose.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20190307180520.13868-3-mark.cave-ayland@ilande.co.uk>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/cpu.h                    |  7 ++++++-
 target/ppc/translate/vsx-impl.inc.c | 12 ++++++------
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 15e053becd..0c3fc8e084 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -2573,9 +2573,14 @@ static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i)
     return (uint64_t *)((uintptr_t)env + fpr_offset(i));
 }
 
+static inline int vsrl_offset(int i)
+{
+    return offsetof(CPUPPCState, vsr[i].u64[1]);
+}
+
 static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i)
 {
-    return &env->vsr[i].u64[1];
+    return (uint64_t *)((uintptr_t)env + vsrl_offset(i));
 }
 
 static inline ppc_avr_t *cpu_avr_ptr(CPUPPCState *env, int i)
diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx-impl.inc.c
index e73197e717..381ae0f2e9 100644
--- a/target/ppc/translate/vsx-impl.inc.c
+++ b/target/ppc/translate/vsx-impl.inc.c
@@ -1,13 +1,13 @@
 /***                           VSX extension                               ***/
 
-static inline void get_vsr(TCGv_i64 dst, int n)
+static inline void get_vsrl(TCGv_i64 dst, int n)
 {
-    tcg_gen_ld_i64(dst, cpu_env, offsetof(CPUPPCState, vsr[n].u64[1]));
+    tcg_gen_ld_i64(dst, cpu_env, vsrl_offset(n));
 }
 
-static inline void set_vsr(int n, TCGv_i64 src)
+static inline void set_vsrl(int n, TCGv_i64 src)
 {
-    tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState, vsr[n].u64[1]));
+    tcg_gen_st_i64(src, cpu_env, vsrl_offset(n));
 }
 
 static inline int vsr_full_offset(int n)
@@ -27,7 +27,7 @@ static inline void get_cpu_vsrh(TCGv_i64 dst, int n)
 static inline void get_cpu_vsrl(TCGv_i64 dst, int n)
 {
     if (n < 32) {
-        get_vsr(dst, n);
+        get_vsrl(dst, n);
     } else {
         get_avr64(dst, n - 32, false);
     }
@@ -45,7 +45,7 @@ static inline void set_cpu_vsrh(int n, TCGv_i64 src)
 static inline void set_cpu_vsrl(int n, TCGv_i64 src)
 {
     if (n < 32) {
-        set_vsr(n, src);
+        set_vsrl(n, src);
     } else {
         set_avr64(n - 32, src, false);
     }
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 36/60] target/ppc: move Vsr* macros from internal.h to cpu.h
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (34 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 35/60] target/ppc: introduce single vsrl_offset() function David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 37/60] target/ppc: introduce avr_full_offset() function David Gibson
                   ` (25 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland,
	Richard Henderson, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

It isn't possible to include internal.h from cpu.h so move the Vsr* macros
into cpu.h alongside the other VMX/VSX register access functions.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20190307180520.13868-4-mark.cave-ayland@ilande.co.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/cpu.h      | 20 ++++++++++++++++++++
 target/ppc/internal.h | 19 -------------------
 2 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 0c3fc8e084..1c4af4a1dc 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -2563,6 +2563,26 @@ static inline bool lsw_reg_in_range(int start, int nregs, int rx)
 }
 
 /* Accessors for FP, VMX and VSX registers */
+#if defined(HOST_WORDS_BIGENDIAN)
+#define VsrB(i) u8[i]
+#define VsrSB(i) s8[i]
+#define VsrH(i) u16[i]
+#define VsrSH(i) s16[i]
+#define VsrW(i) u32[i]
+#define VsrSW(i) s32[i]
+#define VsrD(i) u64[i]
+#define VsrSD(i) s64[i]
+#else
+#define VsrB(i) u8[15 - (i)]
+#define VsrSB(i) s8[15 - (i)]
+#define VsrH(i) u16[7 - (i)]
+#define VsrSH(i) s16[7 - (i)]
+#define VsrW(i) u32[3 - (i)]
+#define VsrSW(i) s32[3 - (i)]
+#define VsrD(i) u64[1 - (i)]
+#define VsrSD(i) s64[1 - (i)]
+#endif
+
 static inline int fpr_offset(int i)
 {
     return offsetof(CPUPPCState, vsr[i].u64[0]);
diff --git a/target/ppc/internal.h b/target/ppc/internal.h
index f26a71ffcf..3ebbdf4da4 100644
--- a/target/ppc/internal.h
+++ b/target/ppc/internal.h
@@ -204,25 +204,6 @@ EXTRACT_HELPER(IMM8, 11, 8);
 EXTRACT_HELPER(DCMX, 16, 7);
 EXTRACT_HELPER_SPLIT_3(DCMX_XV, 5, 16, 0, 1, 2, 5, 1, 6, 6);
 
-#if defined(HOST_WORDS_BIGENDIAN)
-#define VsrB(i) u8[i]
-#define VsrSB(i) s8[i]
-#define VsrH(i) u16[i]
-#define VsrSH(i) s16[i]
-#define VsrW(i) u32[i]
-#define VsrSW(i) s32[i]
-#define VsrD(i) u64[i]
-#define VsrSD(i) s64[i]
-#else
-#define VsrB(i) u8[15 - (i)]
-#define VsrSB(i) s8[15 - (i)]
-#define VsrH(i) u16[7 - (i)]
-#define VsrSH(i) s16[7 - (i)]
-#define VsrW(i) u32[3 - (i)]
-#define VsrSW(i) s32[3 - (i)]
-#define VsrD(i) u64[1 - (i)]
-#define VsrSD(i) s64[1 - (i)]
-#endif
 static inline void getVSR(int n, ppc_vsr_t *vsr, CPUPPCState *env)
 {
     vsr->VsrD(0) = env->vsr[n].u64[0];
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 37/60] target/ppc: introduce avr_full_offset() function
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (35 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 36/60] target/ppc: move Vsr* macros from internal.h to cpu.h David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 38/60] target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64() David Gibson
                   ` (24 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland,
	Richard Henderson, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

All TCG vector operations require pointers to the base address of the vector
rather than separate access to the top and bottom 64-bits. Convert the VMX TCG
instructions to use a new avr_full_offset() function instead of avr64_offset()
which can then itself be written as a simple wrapper onto vsr_full_offset().

This same function can also reused in cpu_avr_ptr() to avoid having more than
one copy of the offset calculation logic.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20190307180520.13868-5-mark.cave-ayland@ilande.co.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/cpu.h                    | 12 +++++++++++-
 target/ppc/translate/vmx-impl.inc.c | 22 +++++++++++-----------
 target/ppc/translate/vsx-impl.inc.c |  5 -----
 3 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 1c4af4a1dc..caddbd012c 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -2598,14 +2598,24 @@ static inline int vsrl_offset(int i)
     return offsetof(CPUPPCState, vsr[i].u64[1]);
 }
 
+static inline int vsr_full_offset(int i)
+{
+    return offsetof(CPUPPCState, vsr[i].u64[0]);
+}
+
 static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i)
 {
     return (uint64_t *)((uintptr_t)env + vsrl_offset(i));
 }
 
+static inline int avr_full_offset(int i)
+{
+    return vsr_full_offset(i + 32);
+}
+
 static inline ppc_avr_t *cpu_avr_ptr(CPUPPCState *env, int i)
 {
-    return &env->vsr[32 + i];
+    return (ppc_avr_t *)((uintptr_t)env + avr_full_offset(i));
 }
 
 void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env);
diff --git a/target/ppc/translate/vmx-impl.inc.c b/target/ppc/translate/vmx-impl.inc.c
index f1b15ae2cb..4e5d0bc0e0 100644
--- a/target/ppc/translate/vmx-impl.inc.c
+++ b/target/ppc/translate/vmx-impl.inc.c
@@ -10,7 +10,7 @@
 static inline TCGv_ptr gen_avr_ptr(int reg)
 {
     TCGv_ptr r = tcg_temp_new_ptr();
-    tcg_gen_addi_ptr(r, cpu_env, offsetof(CPUPPCState, vsr[32 + reg].u64[0]));
+    tcg_gen_addi_ptr(r, cpu_env, avr_full_offset(reg));
     return r;
 }
 
@@ -205,7 +205,7 @@ static void gen_mtvscr(DisasContext *ctx)
     }
 
     val = tcg_temp_new_i32();
-    bofs = avr64_offset(rB(ctx->opcode), true);
+    bofs = avr_full_offset(rB(ctx->opcode));
 #ifdef HOST_WORDS_BIGENDIAN
     bofs += 3 * 4;
 #endif
@@ -284,9 +284,9 @@ static void glue(gen_, name)(DisasContext *ctx)                         \
     }                                                                   \
                                                                         \
     tcg_op(vece,                                                        \
-           avr64_offset(rD(ctx->opcode), true),                         \
-           avr64_offset(rA(ctx->opcode), true),                         \
-           avr64_offset(rB(ctx->opcode), true),                         \
+           avr_full_offset(rD(ctx->opcode)),                            \
+           avr_full_offset(rA(ctx->opcode)),                            \
+           avr_full_offset(rB(ctx->opcode)),                            \
            16, 16);                                                     \
 }
 
@@ -578,10 +578,10 @@ static void glue(gen_, NAME)(DisasContext *ctx)                         \
         gen_exception(ctx, POWERPC_EXCP_VPU);                           \
         return;                                                         \
     }                                                                   \
-    tcg_gen_gvec_4(avr64_offset(rD(ctx->opcode), true),                 \
+    tcg_gen_gvec_4(avr_full_offset(rD(ctx->opcode)),                    \
                    offsetof(CPUPPCState, vscr_sat),                     \
-                   avr64_offset(rA(ctx->opcode), true),                 \
-                   avr64_offset(rB(ctx->opcode), true),                 \
+                   avr_full_offset(rA(ctx->opcode)),                    \
+                   avr_full_offset(rB(ctx->opcode)),                    \
                    16, 16, &g);                                         \
 }
 
@@ -755,7 +755,7 @@ static void glue(gen_, name)(DisasContext *ctx)                         \
             return;                                                     \
         }                                                               \
         simm = SIMM5(ctx->opcode);                                      \
-        tcg_op(avr64_offset(rD(ctx->opcode), true), 16, 16, simm);      \
+        tcg_op(avr_full_offset(rD(ctx->opcode)), 16, 16, simm);         \
     }
 
 GEN_VXFORM_DUPI(vspltisb, tcg_gen_gvec_dup8i, 6, 12);
@@ -850,8 +850,8 @@ static void gen_vsplt(DisasContext *ctx, int vece)
     }
 
     uimm = UIMM5(ctx->opcode);
-    bofs = avr64_offset(rB(ctx->opcode), true);
-    dofs = avr64_offset(rD(ctx->opcode), true);
+    bofs = avr_full_offset(rB(ctx->opcode));
+    dofs = avr_full_offset(rD(ctx->opcode));
 
     /* Experimental testing shows that hardware masks the immediate.  */
     bofs += (uimm << vece) & 15;
diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx-impl.inc.c
index 381ae0f2e9..7d02a235e7 100644
--- a/target/ppc/translate/vsx-impl.inc.c
+++ b/target/ppc/translate/vsx-impl.inc.c
@@ -10,11 +10,6 @@ static inline void set_vsrl(int n, TCGv_i64 src)
     tcg_gen_st_i64(src, cpu_env, vsrl_offset(n));
 }
 
-static inline int vsr_full_offset(int n)
-{
-    return offsetof(CPUPPCState, vsr[n].u64[0]);
-}
-
 static inline void get_cpu_vsrh(TCGv_i64 dst, int n)
 {
     if (n < 32) {
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 38/60] target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64()
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (36 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 37/60] target/ppc: introduce avr_full_offset() function David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 39/60] target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order David Gibson
                   ` (23 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland,
	Richard Henderson, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

By using the VsrD macro in avr64_offset() the same offset calculation can be
used regardless of the host endian. This allows get_avr64() and set_avr64() to
be simplified accordingly.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20190307180520.13868-6-mark.cave-ayland@ilande.co.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/cpu.h                    |  5 +++++
 target/ppc/translate.c              | 16 ++--------------
 target/ppc/translate/vmx-impl.inc.c |  5 -----
 3 files changed, 7 insertions(+), 19 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index caddbd012c..3050982707 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -2608,6 +2608,11 @@ static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i)
     return (uint64_t *)((uintptr_t)env + vsrl_offset(i));
 }
 
+static inline long avr64_offset(int i, bool high)
+{
+    return offsetof(CPUPPCState, vsr[32 + i].VsrD(high ? 0 : 1));
+}
+
 static inline int avr_full_offset(int i)
 {
     return vsr_full_offset(i + 32);
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index 668d4cf75a..98b37cebc2 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -6687,24 +6687,12 @@ static inline void set_fpr(int regno, TCGv_i64 src)
 
 static inline void get_avr64(TCGv_i64 dst, int regno, bool high)
 {
-#ifdef HOST_WORDS_BIGENDIAN
-    tcg_gen_ld_i64(dst, cpu_env, offsetof(CPUPPCState,
-                                          vsr[32 + regno].u64[(high ? 0 : 1)]));
-#else
-    tcg_gen_ld_i64(dst, cpu_env, offsetof(CPUPPCState,
-                                          vsr[32 + regno].u64[(high ? 1 : 0)]));
-#endif
+    tcg_gen_ld_i64(dst, cpu_env, avr64_offset(regno, high));
 }
 
 static inline void set_avr64(int regno, TCGv_i64 src, bool high)
 {
-#ifdef HOST_WORDS_BIGENDIAN
-    tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState,
-                                          vsr[32 + regno].u64[(high ? 0 : 1)]));
-#else
-    tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState,
-                                          vsr[32 + regno].u64[(high ? 1 : 0)]));
-#endif
+    tcg_gen_st_i64(src, cpu_env, avr64_offset(regno, high));
 }
 
 #include "translate/fp-impl.inc.c"
diff --git a/target/ppc/translate/vmx-impl.inc.c b/target/ppc/translate/vmx-impl.inc.c
index 4e5d0bc0e0..eb10c533ca 100644
--- a/target/ppc/translate/vmx-impl.inc.c
+++ b/target/ppc/translate/vmx-impl.inc.c
@@ -14,11 +14,6 @@ static inline TCGv_ptr gen_avr_ptr(int reg)
     return r;
 }
 
-static inline long avr64_offset(int reg, bool high)
-{
-    return offsetof(CPUPPCState, vsr[32 + reg].u64[(high ? 0 : 1)]);
-}
-
 #define GEN_VR_LDX(name, opc2, opc3)                                          \
 static void glue(gen_, name)(DisasContext *ctx)                                       \
 {                                                                             \
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 39/60] target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (37 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 38/60] target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64() David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 40/60] target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l, h}() and set_cpu_vsr{l, h}() David Gibson
                   ` (22 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland,
	Richard Henderson, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

When VSX support was initially added, the fpr registers were added at
offset 0 of the VSR register and the vsrl registers were added at offset
1. This is in contrast to the VMX registers (the last 32 VSX registers) which
are stored in host-endian order.

Switch the fpr/vsrl registers so that the lower 32 VSX registers are now also
stored in host endian order to match the VMX registers. This ensures that TCG
vector operations involving mixed VMX and VSX registers will function
correctly.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20190307180520.13868-7-mark.cave-ayland@ilande.co.uk>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/cpu.h      | 4 ++--
 target/ppc/internal.h | 8 ++++----
 target/ppc/machine.c  | 8 ++++----
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 3050982707..8905edbfd0 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -2585,7 +2585,7 @@ static inline bool lsw_reg_in_range(int start, int nregs, int rx)
 
 static inline int fpr_offset(int i)
 {
-    return offsetof(CPUPPCState, vsr[i].u64[0]);
+    return offsetof(CPUPPCState, vsr[i].VsrD(0));
 }
 
 static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i)
@@ -2595,7 +2595,7 @@ static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i)
 
 static inline int vsrl_offset(int i)
 {
-    return offsetof(CPUPPCState, vsr[i].u64[1]);
+    return offsetof(CPUPPCState, vsr[i].VsrD(1));
 }
 
 static inline int vsr_full_offset(int i)
diff --git a/target/ppc/internal.h b/target/ppc/internal.h
index 3ebbdf4da4..fb6f64ed1e 100644
--- a/target/ppc/internal.h
+++ b/target/ppc/internal.h
@@ -206,14 +206,14 @@ EXTRACT_HELPER_SPLIT_3(DCMX_XV, 5, 16, 0, 1, 2, 5, 1, 6, 6);
 
 static inline void getVSR(int n, ppc_vsr_t *vsr, CPUPPCState *env)
 {
-    vsr->VsrD(0) = env->vsr[n].u64[0];
-    vsr->VsrD(1) = env->vsr[n].u64[1];
+    vsr->VsrD(0) = env->vsr[n].VsrD(0);
+    vsr->VsrD(1) = env->vsr[n].VsrD(1);
 }
 
 static inline void putVSR(int n, ppc_vsr_t *vsr, CPUPPCState *env)
 {
-    env->vsr[n].u64[0] = vsr->VsrD(0);
-    env->vsr[n].u64[1] = vsr->VsrD(1);
+    env->vsr[n].VsrD(0) = vsr->VsrD(0);
+    env->vsr[n].VsrD(1) = vsr->VsrD(1);
 }
 
 void helper_compute_fprf_float16(CPUPPCState *env, float16 arg);
diff --git a/target/ppc/machine.c b/target/ppc/machine.c
index 756b6d2971..a92d0ad3a3 100644
--- a/target/ppc/machine.c
+++ b/target/ppc/machine.c
@@ -150,7 +150,7 @@ static int get_fpr(QEMUFile *f, void *pv, size_t size,
 {
     ppc_vsr_t *v = pv;
 
-    v->u64[0] = qemu_get_be64(f);
+    v->VsrD(0) = qemu_get_be64(f);
 
     return 0;
 }
@@ -160,7 +160,7 @@ static int put_fpr(QEMUFile *f, void *pv, size_t size,
 {
     ppc_vsr_t *v = pv;
 
-    qemu_put_be64(f, v->u64[0]);
+    qemu_put_be64(f, v->VsrD(0));
     return 0;
 }
 
@@ -181,7 +181,7 @@ static int get_vsr(QEMUFile *f, void *pv, size_t size,
 {
     ppc_vsr_t *v = pv;
 
-    v->u64[1] = qemu_get_be64(f);
+    v->VsrD(1) = qemu_get_be64(f);
 
     return 0;
 }
@@ -191,7 +191,7 @@ static int put_vsr(QEMUFile *f, void *pv, size_t size,
 {
     ppc_vsr_t *v = pv;
 
-    qemu_put_be64(f, v->u64[1]);
+    qemu_put_be64(f, v->VsrD(1));
     return 0;
 }
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 40/60] target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l, h}() and set_cpu_vsr{l, h}()
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (38 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 39/60] target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 41/60] mac_oldworld: use node name instead of alias name for hd device in FWPathProvider David Gibson
                   ` (21 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland,
	Richard Henderson, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

Now that all VSX registers are stored in host endian order, there is no need
to go via different accessors depending upon the register number. Instead we
introduce vsr64_offset() and use it directly from within get_cpu_vsr{l,h}() and
set_cpu_vsr{l,h}().

This also allows us to rewrite avr64_offset() and fpr_offset() in terms of the
new vsr64_offset() function to more clearly express the relationship between the
VSX, FPR and VMX registers, and also remove vsrl_offset() which is no longer
required.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20190307180520.13868-8-mark.cave-ayland@ilande.co.uk>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/cpu.h                    | 20 ++++++++---------
 target/ppc/translate/vsx-impl.inc.c | 34 ++++-------------------------
 2 files changed, 14 insertions(+), 40 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 8905edbfd0..c1fce44303 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -2583,34 +2583,34 @@ static inline bool lsw_reg_in_range(int start, int nregs, int rx)
 #define VsrSD(i) s64[1 - (i)]
 #endif
 
-static inline int fpr_offset(int i)
+static inline int vsr64_offset(int i, bool high)
 {
-    return offsetof(CPUPPCState, vsr[i].VsrD(0));
+    return offsetof(CPUPPCState, vsr[i].VsrD(high ? 0 : 1));
 }
 
-static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i)
+static inline int vsr_full_offset(int i)
 {
-    return (uint64_t *)((uintptr_t)env + fpr_offset(i));
+    return offsetof(CPUPPCState, vsr[i].u64[0]);
 }
 
-static inline int vsrl_offset(int i)
+static inline int fpr_offset(int i)
 {
-    return offsetof(CPUPPCState, vsr[i].VsrD(1));
+    return vsr64_offset(i, true);
 }
 
-static inline int vsr_full_offset(int i)
+static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i)
 {
-    return offsetof(CPUPPCState, vsr[i].u64[0]);
+    return (uint64_t *)((uintptr_t)env + fpr_offset(i));
 }
 
 static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i)
 {
-    return (uint64_t *)((uintptr_t)env + vsrl_offset(i));
+    return (uint64_t *)((uintptr_t)env + vsr64_offset(i, false));
 }
 
 static inline long avr64_offset(int i, bool high)
 {
-    return offsetof(CPUPPCState, vsr[32 + i].VsrD(high ? 0 : 1));
+    return vsr64_offset(i + 32, high);
 }
 
 static inline int avr_full_offset(int i)
diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx-impl.inc.c
index 7d02a235e7..95a269fff0 100644
--- a/target/ppc/translate/vsx-impl.inc.c
+++ b/target/ppc/translate/vsx-impl.inc.c
@@ -1,49 +1,23 @@
 /***                           VSX extension                               ***/
 
-static inline void get_vsrl(TCGv_i64 dst, int n)
-{
-    tcg_gen_ld_i64(dst, cpu_env, vsrl_offset(n));
-}
-
-static inline void set_vsrl(int n, TCGv_i64 src)
-{
-    tcg_gen_st_i64(src, cpu_env, vsrl_offset(n));
-}
-
 static inline void get_cpu_vsrh(TCGv_i64 dst, int n)
 {
-    if (n < 32) {
-        get_fpr(dst, n);
-    } else {
-        get_avr64(dst, n - 32, true);
-    }
+    tcg_gen_ld_i64(dst, cpu_env, vsr64_offset(n, true));
 }
 
 static inline void get_cpu_vsrl(TCGv_i64 dst, int n)
 {
-    if (n < 32) {
-        get_vsrl(dst, n);
-    } else {
-        get_avr64(dst, n - 32, false);
-    }
+    tcg_gen_ld_i64(dst, cpu_env, vsr64_offset(n, false));
 }
 
 static inline void set_cpu_vsrh(int n, TCGv_i64 src)
 {
-    if (n < 32) {
-        set_fpr(n, src);
-    } else {
-        set_avr64(n - 32, src, true);
-    }
+    tcg_gen_st_i64(src, cpu_env, vsr64_offset(n, true));
 }
 
 static inline void set_cpu_vsrl(int n, TCGv_i64 src)
 {
-    if (n < 32) {
-        set_vsrl(n, src);
-    } else {
-        set_avr64(n - 32, src, false);
-    }
+    tcg_gen_st_i64(src, cpu_env, vsr64_offset(n, false));
 }
 
 #define VSX_LOAD_SCALAR(name, operation)                      \
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 41/60] mac_oldworld: use node name instead of alias name for hd device in FWPathProvider
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (39 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 40/60] target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l, h}() and set_cpu_vsr{l, h}() David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 42/60] mac_newworld: " David Gibson
                   ` (20 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

When using -drive to configure the hd drive for the Old World machine, the node
name "disk" should be used instead of the "hd" alias.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20190307212058.4890-2-mark.cave-ayland@ilande.co.uk>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/mac_oldworld.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index cc1e463466..460cbc7923 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -402,11 +402,11 @@ static char *heathrow_fw_dev_path(FWPathProvider *p, BusState *bus,
             return g_strdup("cdrom");
         }
 
-        return g_strdup("hd");
+        return g_strdup("disk");
     }
 
     if (!strcmp(object_get_typename(OBJECT(dev)), "ide-hd")) {
-        return g_strdup("hd");
+        return g_strdup("disk");
     }
 
     if (!strcmp(object_get_typename(OBJECT(dev)), "ide-cd")) {
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 42/60] mac_newworld: use node name instead of alias name for hd device in FWPathProvider
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (40 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 41/60] mac_oldworld: use node name instead of alias name for hd device in FWPathProvider David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 43/60] ppc/pnv: add a PSI bridge class model David Gibson
                   ` (19 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Mark Cave-Ayland, David Gibson

From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>

When using -drive to configure the hd drive for the New World machine, the node
name "disk" should be used instead of the "hd" alias.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20190307212058.4890-3-mark.cave-ayland@ilande.co.uk>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/mac_newworld.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 97e8817145..02d8559621 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -547,11 +547,11 @@ static char *core99_fw_dev_path(FWPathProvider *p, BusState *bus,
             return g_strdup("cdrom");
         }
 
-        return g_strdup("hd");
+        return g_strdup("disk");
     }
 
     if (!strcmp(object_get_typename(OBJECT(dev)), "ide-hd")) {
-        return g_strdup("hd");
+        return g_strdup("disk");
     }
 
     if (!strcmp(object_get_typename(OBJECT(dev)), "ide-cd")) {
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 43/60] ppc/pnv: add a PSI bridge class model
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (41 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 42/60] mac_newworld: " David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 44/60] ppc/pnv: add a PSI bridge model for POWER9 David Gibson
                   ` (18 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

To ease the introduction of the PSI bridge model for POWER9, abstract
the POWER chip differences in a PnvPsi class model and introduce a
specific Pnv8Psi type for POWER8. POWER8 interface to the interrupt
controller is still XICS whereas POWER9 uses the new XIVE model.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-2-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c             |  6 ++-
 hw/ppc/pnv_psi.c         | 79 ++++++++++++++++++++++++++++------------
 include/hw/ppc/pnv.h     |  2 +-
 include/hw/ppc/pnv_psi.h | 29 ++++++++++++++-
 4 files changed, 87 insertions(+), 29 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 7660eaa22c..5bb2332f16 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -788,7 +788,7 @@ static void pnv_chip_power8_instance_init(Object *obj)
     Pnv8Chip *chip8 = PNV8_CHIP(obj);
 
     object_initialize_child(obj, "psi",  &chip8->psi, sizeof(chip8->psi),
-                            TYPE_PNV_PSI, &error_abort, NULL);
+                            TYPE_PNV8_PSI, &error_abort, NULL);
     object_property_add_const_link(OBJECT(&chip8->psi), "xics",
                                    OBJECT(qdev_get_machine()), &error_abort);
 
@@ -840,6 +840,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev);
     PnvChip *chip = PNV_CHIP(dev);
     Pnv8Chip *chip8 = PNV8_CHIP(dev);
+    Pnv8Psi *psi8 = &chip8->psi;
     Error *local_err = NULL;
 
     pcc->parent_realize(dev, &local_err);
@@ -856,7 +857,8 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, local_err);
         return;
     }
-    pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE, &chip8->psi.xscom_regs);
+    pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE,
+                            &PNV_PSI(psi8)->xscom_regs);
 
     /* Create LPC controller */
     object_property_set_bool(OBJECT(&chip8->lpc), true, "realized",
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index e61861bfd3..067f733f1e 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -118,10 +118,11 @@
 
 static void pnv_psi_set_bar(PnvPsi *psi, uint64_t bar)
 {
+    PnvPsiClass *ppc = PNV_PSI_GET_CLASS(psi);
     MemoryRegion *sysmem = get_system_memory();
     uint64_t old = psi->regs[PSIHB_XSCOM_BAR];
 
-    psi->regs[PSIHB_XSCOM_BAR] = bar & (PSIHB_BAR_MASK | PSIHB_BAR_EN);
+    psi->regs[PSIHB_XSCOM_BAR] = bar & (ppc->bar_mask | PSIHB_BAR_EN);
 
     /* Update MR, always remove it first */
     if (old & PSIHB_BAR_EN) {
@@ -130,7 +131,7 @@ static void pnv_psi_set_bar(PnvPsi *psi, uint64_t bar)
 
     /* Then add it back if needed */
     if (bar & PSIHB_BAR_EN) {
-        uint64_t addr = bar & PSIHB_BAR_MASK;
+        uint64_t addr = bar & ppc->bar_mask;
         memory_region_add_subregion(sysmem, addr, &psi->regs_mr);
     }
 }
@@ -154,7 +155,7 @@ static void pnv_psi_set_cr(PnvPsi *psi, uint64_t cr)
 
 static void pnv_psi_set_irsn(PnvPsi *psi, uint64_t val)
 {
-    ICSState *ics = &psi->ics;
+    ICSState *ics = &PNV8_PSI(psi)->ics;
 
     /* In this model we ignore the up/down enable bits for now
      * as SW doesn't use them (other than setting them at boot).
@@ -207,7 +208,12 @@ static const uint64_t stat_bits[] = {
     [PSIHB_IRQ_EXTERNAL]  = PSIHB_IRQ_STAT_EXT,
 };
 
-void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool state)
+void pnv_psi_irq_set(PnvPsi *psi, int irq, bool state)
+{
+    PNV_PSI_GET_CLASS(psi)->irq_set(psi, irq, state);
+}
+
+static void pnv_psi_power8_irq_set(PnvPsi *psi, int irq, bool state)
 {
     uint32_t xivr_reg;
     uint32_t stat_reg;
@@ -262,7 +268,7 @@ void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool state)
 
 static void pnv_psi_set_xivr(PnvPsi *psi, uint32_t reg, uint64_t val)
 {
-    ICSState *ics = &psi->ics;
+    ICSState *ics = &PNV8_PSI(psi)->ics;
     uint16_t server;
     uint8_t prio;
     uint8_t src;
@@ -451,11 +457,11 @@ static void pnv_psi_reset(void *dev)
     psi->regs[PSIHB_XSCOM_BAR] = psi->bar | PSIHB_BAR_EN;
 }
 
-static void pnv_psi_init(Object *obj)
+static void pnv_psi_power8_instance_init(Object *obj)
 {
-    PnvPsi *psi = PNV_PSI(obj);
+    Pnv8Psi *psi8 = PNV8_PSI(obj);
 
-    object_initialize_child(obj, "ics-psi",  &psi->ics, sizeof(psi->ics),
+    object_initialize_child(obj, "ics-psi",  &psi8->ics, sizeof(psi8->ics),
                             TYPE_ICS_SIMPLE, &error_abort, NULL);
 }
 
@@ -468,10 +474,10 @@ static const uint8_t irq_to_xivr[] = {
     PSIHB_XSCOM_XIVR_EXT,
 };
 
-static void pnv_psi_realize(DeviceState *dev, Error **errp)
+static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
 {
     PnvPsi *psi = PNV_PSI(dev);
-    ICSState *ics = &psi->ics;
+    ICSState *ics = &PNV8_PSI(psi)->ics;
     Object *obj;
     Error *err = NULL;
     unsigned int i;
@@ -524,28 +530,28 @@ static void pnv_psi_realize(DeviceState *dev, Error **errp)
     qemu_register_reset(pnv_psi_reset, dev);
 }
 
+static const char compat_p8[] = "ibm,power8-psihb-x\0ibm,psihb-x";
+
 static int pnv_psi_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_offset)
 {
-    const char compat[] = "ibm,power8-psihb-x\0ibm,psihb-x";
+    PnvPsiClass *ppc = PNV_PSI_GET_CLASS(dev);
     char *name;
     int offset;
-    uint32_t lpc_pcba = PNV_XSCOM_PSIHB_BASE;
     uint32_t reg[] = {
-        cpu_to_be32(lpc_pcba),
-        cpu_to_be32(PNV_XSCOM_PSIHB_SIZE)
+        cpu_to_be32(ppc->xscom_pcba),
+        cpu_to_be32(ppc->xscom_size)
     };
 
-    name = g_strdup_printf("psihb@%x", lpc_pcba);
+    name = g_strdup_printf("psihb@%x", ppc->xscom_pcba);
     offset = fdt_add_subnode(fdt, xscom_offset, name);
     _FDT(offset);
     g_free(name);
 
-    _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
-
-    _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 2)));
-    _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1)));
-    _FDT((fdt_setprop(fdt, offset, "compatible", compat,
-                      sizeof(compat))));
+    _FDT(fdt_setprop(fdt, offset, "reg", reg, sizeof(reg)));
+    _FDT(fdt_setprop_cell(fdt, offset, "#address-cells", 2));
+    _FDT(fdt_setprop_cell(fdt, offset, "#size-cells", 1));
+    _FDT(fdt_setprop(fdt, offset, "compatible", compat_p8,
+                     sizeof(compat_p8)));
     return 0;
 }
 
@@ -555,6 +561,29 @@ static Property pnv_psi_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
+static void pnv_psi_power8_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvPsiClass *ppc = PNV_PSI_CLASS(klass);
+
+    dc->desc    = "PowerNV PSI Controller POWER8";
+    dc->realize = pnv_psi_power8_realize;
+
+    ppc->chip_type =  PNV_CHIP_POWER8;
+    ppc->xscom_pcba = PNV_XSCOM_PSIHB_BASE;
+    ppc->xscom_size = PNV_XSCOM_PSIHB_SIZE;
+    ppc->bar_mask   = PSIHB_BAR_MASK;
+    ppc->irq_set    = pnv_psi_power8_irq_set;
+}
+
+static const TypeInfo pnv_psi_power8_info = {
+    .name          = TYPE_PNV8_PSI,
+    .parent        = TYPE_PNV_PSI,
+    .instance_size = sizeof(Pnv8Psi),
+    .instance_init = pnv_psi_power8_instance_init,
+    .class_init    = pnv_psi_power8_class_init,
+};
+
 static void pnv_psi_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -562,7 +591,7 @@ static void pnv_psi_class_init(ObjectClass *klass, void *data)
 
     xdc->dt_xscom = pnv_psi_dt_xscom;
 
-    dc->realize = pnv_psi_realize;
+    dc->desc = "PowerNV PSI Controller";
     dc->props = pnv_psi_properties;
 }
 
@@ -570,8 +599,9 @@ static const TypeInfo pnv_psi_info = {
     .name          = TYPE_PNV_PSI,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .instance_size = sizeof(PnvPsi),
-    .instance_init = pnv_psi_init,
     .class_init    = pnv_psi_class_init,
+    .class_size    = sizeof(PnvPsiClass),
+    .abstract      = true,
     .interfaces    = (InterfaceInfo[]) {
         { TYPE_PNV_XSCOM_INTERFACE },
         { }
@@ -581,6 +611,7 @@ static const TypeInfo pnv_psi_info = {
 static void pnv_psi_register_types(void)
 {
     type_register_static(&pnv_psi_info);
+    type_register_static(&pnv_psi_power8_info);
 }
 
-type_init(pnv_psi_register_types)
+type_init(pnv_psi_register_types);
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index eb4bba25b3..3b5f9cd531 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -71,7 +71,7 @@ typedef struct Pnv8Chip {
     MemoryRegion icp_mmio;
 
     PnvLpcController lpc;
-    PnvPsi       psi;
+    Pnv8Psi      psi;
     PnvOCC       occ;
 } Pnv8Chip;
 
diff --git a/include/hw/ppc/pnv_psi.h b/include/hw/ppc/pnv_psi.h
index 64ac73512e..7087cbcb9a 100644
--- a/include/hw/ppc/pnv_psi.h
+++ b/include/hw/ppc/pnv_psi.h
@@ -39,7 +39,6 @@ typedef struct PnvPsi {
     uint64_t fsp_bar;
 
     /* Interrupt generation */
-    ICSState ics;
     qemu_irq *qirqs;
 
     /* Registers */
@@ -48,6 +47,32 @@ typedef struct PnvPsi {
     MemoryRegion xscom_regs;
 } PnvPsi;
 
+#define TYPE_PNV8_PSI TYPE_PNV_PSI "-POWER8"
+#define PNV8_PSI(obj) \
+    OBJECT_CHECK(Pnv8Psi, (obj), TYPE_PNV8_PSI)
+
+typedef struct Pnv8Psi {
+    PnvPsi   parent;
+
+    ICSState ics;
+} Pnv8Psi;
+
+#define PNV_PSI_CLASS(klass) \
+     OBJECT_CLASS_CHECK(PnvPsiClass, (klass), TYPE_PNV_PSI)
+#define PNV_PSI_GET_CLASS(obj) \
+     OBJECT_GET_CLASS(PnvPsiClass, (obj), TYPE_PNV_PSI)
+
+typedef struct PnvPsiClass {
+    SysBusDeviceClass parent_class;
+
+    int chip_type;
+    uint32_t xscom_pcba;
+    uint32_t xscom_size;
+    uint64_t bar_mask;
+
+    void (*irq_set)(PnvPsi *psi, int, bool state);
+} PnvPsiClass;
+
 /* The PSI and FSP interrupts are muxed on the same IRQ number */
 typedef enum PnvPsiIrq {
     PSIHB_IRQ_PSI, /* internal use only */
@@ -61,6 +86,6 @@ typedef enum PnvPsiIrq {
 
 #define PSI_NUM_INTERRUPTS 6
 
-extern void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool state);
+void pnv_psi_irq_set(PnvPsi *psi, int irq, bool state);
 
 #endif /* _PPC_PNV_PSI_H */
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 44/60] ppc/pnv: add a PSI bridge model for POWER9
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (42 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 43/60] ppc/pnv: add a PSI bridge class model David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 45/60] ppc/pnv: lpc: fix OPB address ranges David Gibson
                   ` (17 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The PSI bridge on POWER9 is very similar to POWER8. The BAR is still
set through XSCOM but the controls are now entirely done with MMIOs.
More interrupts are defined and the interrupt controller interface has
changed to XIVE. The POWER9 model is a first example of the usage of
the notify() handler of the XiveNotifier interface, linking the PSI
XiveSource to its owning device model.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-3-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c               |  18 ++
 hw/ppc/pnv_psi.c           | 329 ++++++++++++++++++++++++++++++++++++-
 include/hw/ppc/pnv.h       |   6 +
 include/hw/ppc/pnv_psi.h   |  30 ++++
 include/hw/ppc/pnv_xscom.h |   3 +
 5 files changed, 384 insertions(+), 2 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 5bb2332f16..1cc454cbbc 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -579,6 +579,7 @@ static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon)
     Pnv9Chip *chip9 = PNV9_CHIP(chip);
 
     pnv_xive_pic_print_info(&chip9->xive, mon);
+    pnv_psi_pic_print_info(&chip9->psi, mon);
 }
 
 static void pnv_init(MachineState *machine)
@@ -950,6 +951,11 @@ static void pnv_chip_power9_instance_init(Object *obj)
                             TYPE_PNV_XIVE, &error_abort, NULL);
     object_property_add_const_link(OBJECT(&chip9->xive), "chip", obj,
                                    &error_abort);
+
+    object_initialize_child(obj, "psi",  &chip9->psi, sizeof(chip9->psi),
+                            TYPE_PNV9_PSI, &error_abort, NULL);
+    object_property_add_const_link(OBJECT(&chip9->psi), "chip", obj,
+                                   &error_abort);
 }
 
 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
@@ -957,6 +963,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev);
     Pnv9Chip *chip9 = PNV9_CHIP(dev);
     PnvChip *chip = PNV_CHIP(dev);
+    Pnv9Psi *psi9 = &chip9->psi;
     Error *local_err = NULL;
 
     pcc->parent_realize(dev, &local_err);
@@ -982,6 +989,17 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     }
     pnv_xscom_add_subregion(chip, PNV9_XSCOM_XIVE_BASE,
                             &chip9->xive.xscom_regs);
+
+    /* Processor Service Interface (PSI) Host Bridge */
+    object_property_set_int(OBJECT(&chip9->psi), PNV9_PSIHB_BASE(chip),
+                            "bar", &error_fatal);
+    object_property_set_bool(OBJECT(&chip9->psi), true, "realized", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+    pnv_xscom_add_subregion(chip, PNV9_XSCOM_PSIHB_BASE,
+                            &PNV_PSI(psi9)->xscom_regs);
 }
 
 static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
index 067f733f1e..5a923e4151 100644
--- a/hw/ppc/pnv_psi.c
+++ b/hw/ppc/pnv_psi.c
@@ -22,6 +22,7 @@
 #include "target/ppc/cpu.h"
 #include "qemu/log.h"
 #include "qapi/error.h"
+#include "monitor/monitor.h"
 
 #include "exec/address-spaces.h"
 
@@ -114,6 +115,9 @@
 #define PSIHB_BAR_MASK                  0x0003fffffff00000ull
 #define PSIHB_FSPBAR_MASK               0x0003ffff00000000ull
 
+#define PSIHB9_BAR_MASK                 0x00fffffffff00000ull
+#define PSIHB9_FSPBAR_MASK              0x00ffffff00000000ull
+
 #define PSIHB_REG(addr) (((addr) >> 3) + PSIHB_XSCOM_BAR)
 
 static void pnv_psi_set_bar(PnvPsi *psi, uint64_t bar)
@@ -531,6 +535,7 @@ static void pnv_psi_power8_realize(DeviceState *dev, Error **errp)
 }
 
 static const char compat_p8[] = "ibm,power8-psihb-x\0ibm,psihb-x";
+static const char compat_p9[] = "ibm,power9-psihb-x\0ibm,psihb-x";
 
 static int pnv_psi_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_offset)
 {
@@ -550,8 +555,13 @@ static int pnv_psi_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_offset)
     _FDT(fdt_setprop(fdt, offset, "reg", reg, sizeof(reg)));
     _FDT(fdt_setprop_cell(fdt, offset, "#address-cells", 2));
     _FDT(fdt_setprop_cell(fdt, offset, "#size-cells", 1));
-    _FDT(fdt_setprop(fdt, offset, "compatible", compat_p8,
-                     sizeof(compat_p8)));
+    if (ppc->chip_type == PNV_CHIP_POWER9) {
+        _FDT(fdt_setprop(fdt, offset, "compatible", compat_p9,
+                         sizeof(compat_p9)));
+    } else {
+        _FDT(fdt_setprop(fdt, offset, "compatible", compat_p8,
+                         sizeof(compat_p8)));
+    }
     return 0;
 }
 
@@ -584,6 +594,308 @@ static const TypeInfo pnv_psi_power8_info = {
     .class_init    = pnv_psi_power8_class_init,
 };
 
+
+/* Common registers */
+
+#define PSIHB9_CR                       0x20
+#define PSIHB9_SEMR                     0x28
+
+/* P9 registers */
+
+#define PSIHB9_INTERRUPT_CONTROL        0x58
+#define   PSIHB9_IRQ_METHOD             PPC_BIT(0)
+#define   PSIHB9_IRQ_RESET              PPC_BIT(1)
+#define PSIHB9_ESB_CI_BASE              0x60
+#define   PSIHB9_ESB_CI_VALID           1
+#define PSIHB9_ESB_NOTIF_ADDR           0x68
+#define   PSIHB9_ESB_NOTIF_VALID        1
+#define PSIHB9_IVT_OFFSET               0x70
+#define   PSIHB9_IVT_OFF_SHIFT          32
+
+#define PSIHB9_IRQ_LEVEL                0x78 /* assertion */
+#define   PSIHB9_IRQ_LEVEL_PSI          PPC_BIT(0)
+#define   PSIHB9_IRQ_LEVEL_OCC          PPC_BIT(1)
+#define   PSIHB9_IRQ_LEVEL_FSI          PPC_BIT(2)
+#define   PSIHB9_IRQ_LEVEL_LPCHC        PPC_BIT(3)
+#define   PSIHB9_IRQ_LEVEL_LOCAL_ERR    PPC_BIT(4)
+#define   PSIHB9_IRQ_LEVEL_GLOBAL_ERR   PPC_BIT(5)
+#define   PSIHB9_IRQ_LEVEL_TPM          PPC_BIT(6)
+#define   PSIHB9_IRQ_LEVEL_LPC_SIRQ1    PPC_BIT(7)
+#define   PSIHB9_IRQ_LEVEL_LPC_SIRQ2    PPC_BIT(8)
+#define   PSIHB9_IRQ_LEVEL_LPC_SIRQ3    PPC_BIT(9)
+#define   PSIHB9_IRQ_LEVEL_LPC_SIRQ4    PPC_BIT(10)
+#define   PSIHB9_IRQ_LEVEL_SBE_I2C      PPC_BIT(11)
+#define   PSIHB9_IRQ_LEVEL_DIO          PPC_BIT(12)
+#define   PSIHB9_IRQ_LEVEL_PSU          PPC_BIT(13)
+#define   PSIHB9_IRQ_LEVEL_I2C_C        PPC_BIT(14)
+#define   PSIHB9_IRQ_LEVEL_I2C_D        PPC_BIT(15)
+#define   PSIHB9_IRQ_LEVEL_I2C_E        PPC_BIT(16)
+#define   PSIHB9_IRQ_LEVEL_SBE          PPC_BIT(19)
+
+#define PSIHB9_IRQ_STAT                 0x80 /* P bit */
+#define   PSIHB9_IRQ_STAT_PSI           PPC_BIT(0)
+#define   PSIHB9_IRQ_STAT_OCC           PPC_BIT(1)
+#define   PSIHB9_IRQ_STAT_FSI           PPC_BIT(2)
+#define   PSIHB9_IRQ_STAT_LPCHC         PPC_BIT(3)
+#define   PSIHB9_IRQ_STAT_LOCAL_ERR     PPC_BIT(4)
+#define   PSIHB9_IRQ_STAT_GLOBAL_ERR    PPC_BIT(5)
+#define   PSIHB9_IRQ_STAT_TPM           PPC_BIT(6)
+#define   PSIHB9_IRQ_STAT_LPC_SIRQ1     PPC_BIT(7)
+#define   PSIHB9_IRQ_STAT_LPC_SIRQ2     PPC_BIT(8)
+#define   PSIHB9_IRQ_STAT_LPC_SIRQ3     PPC_BIT(9)
+#define   PSIHB9_IRQ_STAT_LPC_SIRQ4     PPC_BIT(10)
+#define   PSIHB9_IRQ_STAT_SBE_I2C       PPC_BIT(11)
+#define   PSIHB9_IRQ_STAT_DIO           PPC_BIT(12)
+#define   PSIHB9_IRQ_STAT_PSU           PPC_BIT(13)
+
+static void pnv_psi_notify(XiveNotifier *xf, uint32_t srcno)
+{
+    PnvPsi *psi = PNV_PSI(xf);
+    uint64_t notif_port = psi->regs[PSIHB_REG(PSIHB9_ESB_NOTIF_ADDR)];
+    bool valid = notif_port & PSIHB9_ESB_NOTIF_VALID;
+    uint64_t notify_addr = notif_port & ~PSIHB9_ESB_NOTIF_VALID;
+
+    uint32_t offset =
+        (psi->regs[PSIHB_REG(PSIHB9_IVT_OFFSET)] >> PSIHB9_IVT_OFF_SHIFT);
+    uint64_t lisn = cpu_to_be64(offset + srcno);
+
+    if (valid) {
+        cpu_physical_memory_write(notify_addr, &lisn, sizeof(lisn));
+    }
+}
+
+static uint64_t pnv_psi_p9_mmio_read(void *opaque, hwaddr addr, unsigned size)
+{
+    PnvPsi *psi = PNV_PSI(opaque);
+    uint32_t reg = PSIHB_REG(addr);
+    uint64_t val = -1;
+
+    switch (addr) {
+    case PSIHB9_CR:
+    case PSIHB9_SEMR:
+        /* FSP stuff */
+    case PSIHB9_INTERRUPT_CONTROL:
+    case PSIHB9_ESB_CI_BASE:
+    case PSIHB9_ESB_NOTIF_ADDR:
+    case PSIHB9_IVT_OFFSET:
+        val = psi->regs[reg];
+        break;
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR, "PSI: read at 0x%" PRIx64 "\n", addr);
+    }
+
+    return val;
+}
+
+static void pnv_psi_p9_mmio_write(void *opaque, hwaddr addr,
+                                  uint64_t val, unsigned size)
+{
+    PnvPsi *psi = PNV_PSI(opaque);
+    Pnv9Psi *psi9 = PNV9_PSI(psi);
+    uint32_t reg = PSIHB_REG(addr);
+    MemoryRegion *sysmem = get_system_memory();
+
+    switch (addr) {
+    case PSIHB9_CR:
+    case PSIHB9_SEMR:
+        /* FSP stuff */
+        break;
+    case PSIHB9_INTERRUPT_CONTROL:
+        if (val & PSIHB9_IRQ_RESET) {
+            device_reset(DEVICE(&psi9->source));
+        }
+        psi->regs[reg] = val;
+        break;
+
+    case PSIHB9_ESB_CI_BASE:
+        if (!(val & PSIHB9_ESB_CI_VALID)) {
+            if (psi->regs[reg] & PSIHB9_ESB_CI_VALID) {
+                memory_region_del_subregion(sysmem, &psi9->source.esb_mmio);
+            }
+        } else {
+            if (!(psi->regs[reg] & PSIHB9_ESB_CI_VALID)) {
+                memory_region_add_subregion(sysmem,
+                                        val & ~PSIHB9_ESB_CI_VALID,
+                                        &psi9->source.esb_mmio);
+            }
+        }
+        psi->regs[reg] = val;
+        break;
+
+    case PSIHB9_ESB_NOTIF_ADDR:
+        psi->regs[reg] = val;
+        break;
+    case PSIHB9_IVT_OFFSET:
+        psi->regs[reg] = val;
+        break;
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR, "PSI: write at 0x%" PRIx64 "\n", addr);
+    }
+}
+
+static const MemoryRegionOps pnv_psi_p9_mmio_ops = {
+    .read = pnv_psi_p9_mmio_read,
+    .write = pnv_psi_p9_mmio_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+};
+
+static uint64_t pnv_psi_p9_xscom_read(void *opaque, hwaddr addr, unsigned size)
+{
+    /* No read are expected */
+    qemu_log_mask(LOG_GUEST_ERROR, "PSI: xscom read at 0x%" PRIx64 "\n", addr);
+    return -1;
+}
+
+static void pnv_psi_p9_xscom_write(void *opaque, hwaddr addr,
+                                uint64_t val, unsigned size)
+{
+    PnvPsi *psi = PNV_PSI(opaque);
+
+    /* XSCOM is only used to set the PSIHB MMIO region */
+    switch (addr >> 3) {
+    case PSIHB_XSCOM_BAR:
+        pnv_psi_set_bar(psi, val);
+        break;
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR, "PSI: xscom write at 0x%" PRIx64 "\n",
+                      addr);
+    }
+}
+
+static const MemoryRegionOps pnv_psi_p9_xscom_ops = {
+    .read = pnv_psi_p9_xscom_read,
+    .write = pnv_psi_p9_xscom_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    },
+    .impl = {
+        .min_access_size = 8,
+        .max_access_size = 8,
+    }
+};
+
+static void pnv_psi_power9_irq_set(PnvPsi *psi, int irq, bool state)
+{
+    uint32_t irq_method = psi->regs[PSIHB_REG(PSIHB9_INTERRUPT_CONTROL)];
+
+    if (irq > PSIHB9_NUM_IRQS) {
+        qemu_log_mask(LOG_GUEST_ERROR, "PSI: Unsupported irq %d\n", irq);
+        return;
+    }
+
+    if (irq_method & PSIHB9_IRQ_METHOD) {
+        qemu_log_mask(LOG_GUEST_ERROR, "PSI: LSI IRQ method no supported\n");
+        return;
+    }
+
+    /* Update LSI levels */
+    if (state) {
+        psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |= PPC_BIT(irq);
+    } else {
+        psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &= ~PPC_BIT(irq);
+    }
+
+    qemu_set_irq(psi->qirqs[irq], state);
+}
+
+static void pnv_psi_power9_reset(void *dev)
+{
+    Pnv9Psi *psi = PNV9_PSI(dev);
+
+    pnv_psi_reset(dev);
+
+    if (memory_region_is_mapped(&psi->source.esb_mmio)) {
+        memory_region_del_subregion(get_system_memory(), &psi->source.esb_mmio);
+    }
+}
+
+static void pnv_psi_power9_instance_init(Object *obj)
+{
+    Pnv9Psi *psi = PNV9_PSI(obj);
+
+    object_initialize_child(obj, "source", &psi->source, sizeof(psi->source),
+                            TYPE_XIVE_SOURCE, &error_abort, NULL);
+}
+
+static void pnv_psi_power9_realize(DeviceState *dev, Error **errp)
+{
+    PnvPsi *psi = PNV_PSI(dev);
+    XiveSource *xsrc = &PNV9_PSI(psi)->source;
+    Error *local_err = NULL;
+    int i;
+
+    /* This is the only device with 4k ESB pages */
+    object_property_set_int(OBJECT(xsrc), XIVE_ESB_4K, "shift",
+                            &error_fatal);
+    object_property_set_int(OBJECT(xsrc), PSIHB9_NUM_IRQS, "nr-irqs",
+                            &error_fatal);
+    object_property_add_const_link(OBJECT(xsrc), "xive", OBJECT(psi),
+                                   &error_fatal);
+    object_property_set_bool(OBJECT(xsrc), true, "realized", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    for (i = 0; i < xsrc->nr_irqs; i++) {
+        xive_source_irq_set_lsi(xsrc, i);
+    }
+
+    psi->qirqs = qemu_allocate_irqs(xive_source_set_irq, xsrc, xsrc->nr_irqs);
+
+    /* XSCOM region for PSI registers */
+    pnv_xscom_region_init(&psi->xscom_regs, OBJECT(dev), &pnv_psi_p9_xscom_ops,
+                psi, "xscom-psi", PNV9_XSCOM_PSIHB_SIZE);
+
+    /* MMIO region for PSI registers */
+    memory_region_init_io(&psi->regs_mr, OBJECT(dev), &pnv_psi_p9_mmio_ops, psi,
+                          "psihb", PNV9_PSIHB_SIZE);
+
+    pnv_psi_set_bar(psi, psi->bar | PSIHB_BAR_EN);
+
+    qemu_register_reset(pnv_psi_power9_reset, dev);
+}
+
+static void pnv_psi_power9_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvPsiClass *ppc = PNV_PSI_CLASS(klass);
+    XiveNotifierClass *xfc = XIVE_NOTIFIER_CLASS(klass);
+
+    dc->desc    = "PowerNV PSI Controller POWER9";
+    dc->realize = pnv_psi_power9_realize;
+
+    ppc->chip_type  = PNV_CHIP_POWER9;
+    ppc->xscom_pcba = PNV9_XSCOM_PSIHB_BASE;
+    ppc->xscom_size = PNV9_XSCOM_PSIHB_SIZE;
+    ppc->bar_mask   = PSIHB9_BAR_MASK;
+    ppc->irq_set    = pnv_psi_power9_irq_set;
+
+    xfc->notify      = pnv_psi_notify;
+}
+
+static const TypeInfo pnv_psi_power9_info = {
+    .name          = TYPE_PNV9_PSI,
+    .parent        = TYPE_PNV_PSI,
+    .instance_size = sizeof(Pnv9Psi),
+    .instance_init = pnv_psi_power9_instance_init,
+    .class_init    = pnv_psi_power9_class_init,
+    .interfaces = (InterfaceInfo[]) {
+            { TYPE_XIVE_NOTIFIER },
+            { },
+    },
+};
+
 static void pnv_psi_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -612,6 +924,19 @@ static void pnv_psi_register_types(void)
 {
     type_register_static(&pnv_psi_info);
     type_register_static(&pnv_psi_power8_info);
+    type_register_static(&pnv_psi_power9_info);
 }
 
 type_init(pnv_psi_register_types);
+
+void pnv_psi_pic_print_info(Pnv9Psi *psi9, Monitor *mon)
+{
+    PnvPsi *psi = PNV_PSI(psi9);
+
+    uint32_t offset =
+        (psi->regs[PSIHB_REG(PSIHB9_IVT_OFFSET)] >> PSIHB9_IVT_OFF_SHIFT);
+
+    monitor_printf(mon, "PSIHB Source %08x .. %08x\n",
+                  offset, offset + psi9->source.nr_irqs - 1);
+    xive_source_pic_print_info(&psi9->source, offset, mon);
+}
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 3b5f9cd531..8d80cb34ee 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -84,6 +84,7 @@ typedef struct Pnv9Chip {
 
     /*< public >*/
     PnvXive      xive;
+    Pnv9Psi      psi;
 } Pnv9Chip;
 
 typedef struct PnvChipClass {
@@ -231,11 +232,16 @@ void pnv_bmc_powerdown(IPMIBmc *bmc);
 #define PNV9_XIVE_PC_SIZE            0x0000001000000000ull
 #define PNV9_XIVE_PC_BASE(chip)      PNV9_CHIP_BASE(chip, 0x0006018000000000ull)
 
+#define PNV9_PSIHB_SIZE              0x0000000000100000ull
+#define PNV9_PSIHB_BASE(chip)        PNV9_CHIP_BASE(chip, 0x0006030203000000ull)
+
 #define PNV9_XIVE_IC_SIZE            0x0000000000080000ull
 #define PNV9_XIVE_IC_BASE(chip)      PNV9_CHIP_BASE(chip, 0x0006030203100000ull)
 
 #define PNV9_XIVE_TM_SIZE            0x0000000000040000ull
 #define PNV9_XIVE_TM_BASE(chip)      PNV9_CHIP_BASE(chip, 0x0006030203180000ull)
 
+#define PNV9_PSIHB_ESB_SIZE          0x0000000000010000ull
+#define PNV9_PSIHB_ESB_BASE(chip)    PNV9_CHIP_BASE(chip, 0x00060302031c0000ull)
 
 #endif /* _PPC_PNV_H */
diff --git a/include/hw/ppc/pnv_psi.h b/include/hw/ppc/pnv_psi.h
index 7087cbcb9a..2c1b27e865 100644
--- a/include/hw/ppc/pnv_psi.h
+++ b/include/hw/ppc/pnv_psi.h
@@ -21,6 +21,7 @@
 
 #include "hw/sysbus.h"
 #include "hw/ppc/xics.h"
+#include "hw/ppc/xive.h"
 
 #define TYPE_PNV_PSI "pnv-psi"
 #define PNV_PSI(obj) \
@@ -57,6 +58,16 @@ typedef struct Pnv8Psi {
     ICSState ics;
 } Pnv8Psi;
 
+#define TYPE_PNV9_PSI TYPE_PNV_PSI "-POWER9"
+#define PNV9_PSI(obj) \
+    OBJECT_CHECK(Pnv9Psi, (obj), TYPE_PNV9_PSI)
+
+typedef struct Pnv9Psi {
+    PnvPsi   parent;
+
+    XiveSource source;
+} Pnv9Psi;
+
 #define PNV_PSI_CLASS(klass) \
      OBJECT_CLASS_CHECK(PnvPsiClass, (klass), TYPE_PNV_PSI)
 #define PNV_PSI_GET_CLASS(obj) \
@@ -88,4 +99,23 @@ typedef enum PnvPsiIrq {
 
 void pnv_psi_irq_set(PnvPsi *psi, int irq, bool state);
 
+/* P9 PSI Interrupts */
+#define PSIHB9_IRQ_PSI          0
+#define PSIHB9_IRQ_OCC          1
+#define PSIHB9_IRQ_FSI          2
+#define PSIHB9_IRQ_LPCHC        3
+#define PSIHB9_IRQ_LOCAL_ERR    4
+#define PSIHB9_IRQ_GLOBAL_ERR   5
+#define PSIHB9_IRQ_TPM          6
+#define PSIHB9_IRQ_LPC_SIRQ0    7
+#define PSIHB9_IRQ_LPC_SIRQ1    8
+#define PSIHB9_IRQ_LPC_SIRQ2    9
+#define PSIHB9_IRQ_LPC_SIRQ3    10
+#define PSIHB9_IRQ_SBE_I2C      11
+#define PSIHB9_IRQ_DIO          12
+#define PSIHB9_IRQ_PSU          13
+#define PSIHB9_NUM_IRQS         14
+
+void pnv_psi_pic_print_info(Pnv9Psi *psi, Monitor *mon);
+
 #endif /* _PPC_PNV_PSI_H */
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index 6623ec54a7..403a365ed2 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -73,6 +73,9 @@ typedef struct PnvXScomInterfaceClass {
 #define PNV_XSCOM_OCC_BASE        0x0066000
 #define PNV_XSCOM_OCC_SIZE        0x6000
 
+#define PNV9_XSCOM_PSIHB_BASE     0x5012900
+#define PNV9_XSCOM_PSIHB_SIZE     0x100
+
 #define PNV9_XSCOM_XIVE_BASE      0x5013000
 #define PNV9_XSCOM_XIVE_SIZE      0x300
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 45/60] ppc/pnv: lpc: fix OPB address ranges
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (43 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 44/60] ppc/pnv: add a PSI bridge model for POWER9 David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 46/60] ppc/pnv: add a LPC Controller class model David Gibson
                   ` (16 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The PowerNV LPC Controller exposes different sets of registers for
each of the functional units it encompasses, among which the OPB
(On-Chip Peripheral Bus) Master and Arbitrer and the LPC HOST
Controller.

The mapping addresses of each register range are correct but the sizes
are too large. Fix the sizes and define the OPB Arbitrer range to fill
the gap between the OPB Master registers and the LPC HOST Controller
registers.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-4-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv_lpc.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index 9b18ce55e3..547be609ca 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -89,10 +89,11 @@ enum {
 #define LPC_FW_OPB_SIZE         0x10000000
 
 #define LPC_OPB_REGS_OPB_ADDR   0xc0010000
-#define LPC_OPB_REGS_OPB_SIZE   0x00002000
+#define LPC_OPB_REGS_OPB_SIZE   0x00000060
+#define LPC_OPB_REGS_OPBA_ADDR  0xc0011000
+#define LPC_OPB_REGS_OPBA_SIZE  0x00000008
 #define LPC_HC_REGS_OPB_ADDR    0xc0012000
-#define LPC_HC_REGS_OPB_SIZE    0x00001000
-
+#define LPC_HC_REGS_OPB_SIZE    0x00000100
 
 static int pnv_lpc_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_offset)
 {
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 46/60] ppc/pnv: add a LPC Controller class model
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (44 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 45/60] ppc/pnv: lpc: fix OPB address ranges David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 47/60] ppc/pnv: add a 'dt_isa_nodename' to the chip David Gibson
                   ` (15 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

It will ease the introduction of the LPC Controller model for POWER9.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Message-Id: <20190307223548.20516-5-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c             |  2 +-
 hw/ppc/pnv_lpc.c         | 85 ++++++++++++++++++++++++++++------------
 include/hw/ppc/pnv_lpc.h | 15 +++++++
 3 files changed, 77 insertions(+), 25 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 1cc454cbbc..922e3ec48b 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -794,7 +794,7 @@ static void pnv_chip_power8_instance_init(Object *obj)
                                    OBJECT(qdev_get_machine()), &error_abort);
 
     object_initialize_child(obj, "lpc",  &chip8->lpc, sizeof(chip8->lpc),
-                            TYPE_PNV_LPC, &error_abort, NULL);
+                            TYPE_PNV8_LPC, &error_abort, NULL);
     object_property_add_const_link(OBJECT(&chip8->lpc), "psi",
                                    OBJECT(&chip8->psi), &error_abort);
 
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index 547be609ca..3c509a30a0 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -245,6 +245,7 @@ static const MemoryRegionOps pnv_lpc_xscom_ops = {
 static void pnv_lpc_eval_irqs(PnvLpcController *lpc)
 {
     bool lpc_to_opb_irq = false;
+    PnvLpcClass *plc = PNV_LPC_GET_CLASS(lpc);
 
     /* Update LPC controller to OPB line */
     if (lpc->lpc_hc_irqser_ctrl & LPC_HC_IRQSER_EN) {
@@ -267,7 +268,7 @@ static void pnv_lpc_eval_irqs(PnvLpcController *lpc)
     lpc->opb_irq_stat |= lpc->opb_irq_input & lpc->opb_irq_mask;
 
     /* Reflect the interrupt */
-    pnv_psi_irq_set(lpc->psi, PSIHB_IRQ_LPC_I2C, lpc->opb_irq_stat != 0);
+    pnv_psi_irq_set(lpc->psi, plc->psi_irq, lpc->opb_irq_stat != 0);
 }
 
 static uint64_t lpc_hc_read(void *opaque, hwaddr addr, unsigned size)
@@ -419,11 +420,65 @@ static const MemoryRegionOps opb_master_ops = {
     },
 };
 
+static void pnv_lpc_power8_realize(DeviceState *dev, Error **errp)
+{
+    PnvLpcController *lpc = PNV_LPC(dev);
+    PnvLpcClass *plc = PNV_LPC_GET_CLASS(dev);
+    Error *local_err = NULL;
+
+    plc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    /* P8 uses a XSCOM region for LPC registers */
+    pnv_xscom_region_init(&lpc->xscom_regs, OBJECT(lpc),
+                          &pnv_lpc_xscom_ops, lpc, "xscom-lpc",
+                          PNV_XSCOM_LPC_SIZE);
+}
+
+static void pnv_lpc_power8_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
+    PnvLpcClass *plc = PNV_LPC_CLASS(klass);
+
+    dc->desc = "PowerNV LPC Controller POWER8";
+
+    xdc->dt_xscom = pnv_lpc_dt_xscom;
+
+    plc->psi_irq = PSIHB_IRQ_LPC_I2C;
+
+    device_class_set_parent_realize(dc, pnv_lpc_power8_realize,
+                                    &plc->parent_realize);
+}
+
+static const TypeInfo pnv_lpc_power8_info = {
+    .name          = TYPE_PNV8_LPC,
+    .parent        = TYPE_PNV_LPC,
+    .instance_size = sizeof(PnvLpcController),
+    .class_init    = pnv_lpc_power8_class_init,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_PNV_XSCOM_INTERFACE },
+        { }
+    }
+};
+
 static void pnv_lpc_realize(DeviceState *dev, Error **errp)
 {
     PnvLpcController *lpc = PNV_LPC(dev);
     Object *obj;
-    Error *error = NULL;
+    Error *local_err = NULL;
+
+    obj = object_property_get_link(OBJECT(dev), "psi", &local_err);
+    if (!obj) {
+        error_propagate(errp, local_err);
+        error_prepend(errp, "required link 'psi' not found: ");
+        return;
+    }
+    /* The LPC controller needs PSI to generate interrupts  */
+    lpc->psi = PNV_PSI(obj);
 
     /* Reg inits */
     lpc->lpc_hc_fw_rd_acc_size = LPC_HC_FW_RD_4B;
@@ -463,46 +518,28 @@ static void pnv_lpc_realize(DeviceState *dev, Error **errp)
                           "lpc-hc", LPC_HC_REGS_OPB_SIZE);
     memory_region_add_subregion(&lpc->opb_mr, LPC_HC_REGS_OPB_ADDR,
                                 &lpc->lpc_hc_regs);
-
-    /* XScom region for LPC registers */
-    pnv_xscom_region_init(&lpc->xscom_regs, OBJECT(dev),
-                          &pnv_lpc_xscom_ops, lpc, "xscom-lpc",
-                          PNV_XSCOM_LPC_SIZE);
-
-    /* get PSI object from chip */
-    obj = object_property_get_link(OBJECT(dev), "psi", &error);
-    if (!obj) {
-        error_setg(errp, "%s: required link 'psi' not found: %s",
-                   __func__, error_get_pretty(error));
-        return;
-    }
-    lpc->psi = PNV_PSI(obj);
 }
 
 static void pnv_lpc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
-
-    xdc->dt_xscom = pnv_lpc_dt_xscom;
 
     dc->realize = pnv_lpc_realize;
+    dc->desc = "PowerNV LPC Controller";
 }
 
 static const TypeInfo pnv_lpc_info = {
     .name          = TYPE_PNV_LPC,
     .parent        = TYPE_DEVICE,
-    .instance_size = sizeof(PnvLpcController),
     .class_init    = pnv_lpc_class_init,
-    .interfaces = (InterfaceInfo[]) {
-        { TYPE_PNV_XSCOM_INTERFACE },
-        { }
-    }
+    .class_size    = sizeof(PnvLpcClass),
+    .abstract      = true,
 };
 
 static void pnv_lpc_register_types(void)
 {
     type_register_static(&pnv_lpc_info);
+    type_register_static(&pnv_lpc_power8_info);
 }
 
 type_init(pnv_lpc_register_types)
diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h
index d657489b07..f3f24419b1 100644
--- a/include/hw/ppc/pnv_lpc.h
+++ b/include/hw/ppc/pnv_lpc.h
@@ -24,6 +24,8 @@
 #define TYPE_PNV_LPC "pnv-lpc"
 #define PNV_LPC(obj) \
      OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV_LPC)
+#define TYPE_PNV8_LPC TYPE_PNV_LPC "-POWER8"
+#define PNV8_LPC(obj) OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV8_LPC)
 
 typedef struct PnvLpcController {
     DeviceState parent;
@@ -70,6 +72,19 @@ typedef struct PnvLpcController {
     PnvPsi *psi;
 } PnvLpcController;
 
+#define PNV_LPC_CLASS(klass) \
+     OBJECT_CLASS_CHECK(PnvLpcClass, (klass), TYPE_PNV_LPC)
+#define PNV_LPC_GET_CLASS(obj) \
+     OBJECT_GET_CLASS(PnvLpcClass, (obj), TYPE_PNV_LPC)
+
+typedef struct PnvLpcClass {
+    DeviceClass parent_class;
+
+    int psi_irq;
+
+    DeviceRealize parent_realize;
+} PnvLpcClass;
+
 ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp);
 
 #endif /* _PPC_PNV_LPC_H */
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 47/60] ppc/pnv: add a 'dt_isa_nodename' to the chip
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (45 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 46/60] ppc/pnv: add a LPC Controller class model David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 48/60] ppc/pnv: add a LPC Controller model for POWER9 David Gibson
                   ` (14 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The ISA bus has a different DT nodename on POWER9. Compute the name
when the PnvChip is realized, that is before it is used by the machine
to populate the device tree with the ISA devices.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-6-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c         | 18 +++++-------------
 include/hw/ppc/pnv.h |  2 ++
 2 files changed, 7 insertions(+), 13 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 922e3ec48b..6625562d27 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -417,24 +417,12 @@ static int pnv_dt_isa_device(DeviceState *dev, void *opaque)
     return 0;
 }
 
-static int pnv_chip_isa_offset(PnvChip *chip, void *fdt)
-{
-    char *name;
-    int offset;
-
-    name = g_strdup_printf("/xscom@%" PRIx64 "/isa@%x",
-                           (uint64_t) PNV_XSCOM_BASE(chip), PNV_XSCOM_LPC_BASE);
-    offset = fdt_path_offset(fdt, name);
-    g_free(name);
-    return offset;
-}
-
 /* The default LPC bus of a multichip system is on chip 0. It's
  * recognized by the firmware (skiboot) using a "primary" property.
  */
 static void pnv_dt_isa(PnvMachineState *pnv, void *fdt)
 {
-    int isa_offset = pnv_chip_isa_offset(pnv->chips[0], fdt);
+    int isa_offset = fdt_path_offset(fdt, pnv->chips[0]->dt_isa_nodename);
     ForeachPopulateArgs args = {
         .fdt = fdt,
         .offset = isa_offset,
@@ -866,6 +854,10 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp)
                              &error_fatal);
     pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip8->lpc.xscom_regs);
 
+    chip->dt_isa_nodename = g_strdup_printf("/xscom@%" PRIx64 "/isa@%x",
+                                            (uint64_t) PNV_XSCOM_BASE(chip),
+                                            PNV_XSCOM_LPC_BASE);
+
     /* Interrupt Management Area. This is the memory region holding
      * all the Interrupt Control Presenter (ICP) registers */
     pnv_chip_icp_realize(chip8, &local_err);
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 8d80cb34ee..c81f157f41 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -58,6 +58,8 @@ typedef struct PnvChip {
     MemoryRegion xscom_mmio;
     MemoryRegion xscom;
     AddressSpace xscom_as;
+
+    gchar        *dt_isa_nodename;
 } PnvChip;
 
 #define TYPE_PNV8_CHIP "pnv8-chip"
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 48/60] ppc/pnv: add a LPC Controller model for POWER9
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (46 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 47/60] ppc/pnv: add a 'dt_isa_nodename' to the chip David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 49/60] ppc/pnv: add SerIRQ routing registers David Gibson
                   ` (13 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The LPC Controller on POWER9 is very similar to the one found on
POWER8 but accesses are now done via on MMIOs, without the XSCOM and
ECCB logic. The device tree is populated differently so we add a
specific POWER9 routine for the purpose.

SerIRQ routing is yet to be done.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-7-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c             |  22 ++++-
 hw/ppc/pnv_lpc.c         | 200 +++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h     |   4 +
 include/hw/ppc/pnv_lpc.h |   9 ++
 4 files changed, 234 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 6625562d27..918fae057b 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -306,6 +306,8 @@ static void pnv_chip_power9_dt_populate(PnvChip *chip, void *fdt)
     if (chip->ram_size) {
         pnv_dt_memory(fdt, chip->chip_id, chip->ram_start, chip->ram_size);
     }
+
+    pnv_dt_lpc(chip, fdt, 0);
 }
 
 static void pnv_dt_rtc(ISADevice *d, void *fdt, int lpc_off)
@@ -547,7 +549,8 @@ static ISABus *pnv_chip_power8nvl_isa_create(PnvChip *chip, Error **errp)
 
 static ISABus *pnv_chip_power9_isa_create(PnvChip *chip, Error **errp)
 {
-    return NULL;
+    Pnv9Chip *chip9 = PNV9_CHIP(chip);
+    return pnv_lpc_isa_create(&chip9->lpc, false, errp);
 }
 
 static ISABus *pnv_isa_create(PnvChip *chip, Error **errp)
@@ -948,6 +951,11 @@ static void pnv_chip_power9_instance_init(Object *obj)
                             TYPE_PNV9_PSI, &error_abort, NULL);
     object_property_add_const_link(OBJECT(&chip9->psi), "chip", obj,
                                    &error_abort);
+
+    object_initialize_child(obj, "lpc",  &chip9->lpc, sizeof(chip9->lpc),
+                            TYPE_PNV9_LPC, &error_abort, NULL);
+    object_property_add_const_link(OBJECT(&chip9->lpc), "psi",
+                                   OBJECT(&chip9->psi), &error_abort);
 }
 
 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
@@ -992,6 +1000,18 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
     }
     pnv_xscom_add_subregion(chip, PNV9_XSCOM_PSIHB_BASE,
                             &PNV_PSI(psi9)->xscom_regs);
+
+    /* LPC */
+    object_property_set_bool(OBJECT(&chip9->lpc), true, "realized", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+    memory_region_add_subregion(get_system_memory(), PNV9_LPCM_BASE(chip),
+                                &chip9->lpc.xscom_regs);
+
+    chip->dt_isa_nodename = g_strdup_printf("/lpcm-opb@%" PRIx64 "/lpc@0",
+                                            (uint64_t) PNV9_LPCM_BASE(chip));
 }
 
 static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index 3c509a30a0..6df694e0ab 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -118,6 +118,100 @@ static int pnv_lpc_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_offset)
     return 0;
 }
 
+/* POWER9 only */
+int pnv_dt_lpc(PnvChip *chip, void *fdt, int root_offset)
+{
+    const char compat[] = "ibm,power9-lpcm-opb\0simple-bus";
+    const char lpc_compat[] = "ibm,power9-lpc\0ibm,lpc";
+    char *name;
+    int offset, lpcm_offset;
+    uint64_t lpcm_addr = PNV9_LPCM_BASE(chip);
+    uint32_t opb_ranges[8] = { 0,
+                               cpu_to_be32(lpcm_addr >> 32),
+                               cpu_to_be32((uint32_t)lpcm_addr),
+                               cpu_to_be32(PNV9_LPCM_SIZE / 2),
+                               cpu_to_be32(PNV9_LPCM_SIZE / 2),
+                               cpu_to_be32(lpcm_addr >> 32),
+                               cpu_to_be32(PNV9_LPCM_SIZE / 2),
+                               cpu_to_be32(PNV9_LPCM_SIZE / 2),
+    };
+    uint32_t opb_reg[4] = { cpu_to_be32(lpcm_addr >> 32),
+                            cpu_to_be32((uint32_t)lpcm_addr),
+                            cpu_to_be32(PNV9_LPCM_SIZE >> 32),
+                            cpu_to_be32((uint32_t)PNV9_LPCM_SIZE),
+    };
+    uint32_t reg[2];
+
+    /*
+     * OPB bus
+     */
+    name = g_strdup_printf("lpcm-opb@%"PRIx64, lpcm_addr);
+    lpcm_offset = fdt_add_subnode(fdt, root_offset, name);
+    _FDT(lpcm_offset);
+    g_free(name);
+
+    _FDT((fdt_setprop(fdt, lpcm_offset, "reg", opb_reg, sizeof(opb_reg))));
+    _FDT((fdt_setprop_cell(fdt, lpcm_offset, "#address-cells", 1)));
+    _FDT((fdt_setprop_cell(fdt, lpcm_offset, "#size-cells", 1)));
+    _FDT((fdt_setprop(fdt, lpcm_offset, "compatible", compat, sizeof(compat))));
+    _FDT((fdt_setprop_cell(fdt, lpcm_offset, "ibm,chip-id", chip->chip_id)));
+    _FDT((fdt_setprop(fdt, lpcm_offset, "ranges", opb_ranges,
+                      sizeof(opb_ranges))));
+
+    /*
+     * OPB Master registers
+     */
+    name = g_strdup_printf("opb-master@%x", LPC_OPB_REGS_OPB_ADDR);
+    offset = fdt_add_subnode(fdt, lpcm_offset, name);
+    _FDT(offset);
+    g_free(name);
+
+    reg[0] = cpu_to_be32(LPC_OPB_REGS_OPB_ADDR);
+    reg[1] = cpu_to_be32(LPC_OPB_REGS_OPB_SIZE);
+    _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
+    _FDT((fdt_setprop_string(fdt, offset, "compatible",
+                             "ibm,power9-lpcm-opb-master")));
+
+    /*
+     * OPB arbitrer registers
+     */
+    name = g_strdup_printf("opb-arbitrer@%x", LPC_OPB_REGS_OPBA_ADDR);
+    offset = fdt_add_subnode(fdt, lpcm_offset, name);
+    _FDT(offset);
+    g_free(name);
+
+    reg[0] = cpu_to_be32(LPC_OPB_REGS_OPBA_ADDR);
+    reg[1] = cpu_to_be32(LPC_OPB_REGS_OPBA_SIZE);
+    _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
+    _FDT((fdt_setprop_string(fdt, offset, "compatible",
+                             "ibm,power9-lpcm-opb-arbiter")));
+
+    /*
+     * LPC Host Controller registers
+     */
+    name = g_strdup_printf("lpc-controller@%x", LPC_HC_REGS_OPB_ADDR);
+    offset = fdt_add_subnode(fdt, lpcm_offset, name);
+    _FDT(offset);
+    g_free(name);
+
+    reg[0] = cpu_to_be32(LPC_HC_REGS_OPB_ADDR);
+    reg[1] = cpu_to_be32(LPC_HC_REGS_OPB_SIZE);
+    _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))));
+    _FDT((fdt_setprop_string(fdt, offset, "compatible",
+                             "ibm,power9-lpc-controller")));
+
+    name = g_strdup_printf("lpc@0");
+    offset = fdt_add_subnode(fdt, lpcm_offset, name);
+    _FDT(offset);
+    g_free(name);
+    _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 2)));
+    _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1)));
+    _FDT((fdt_setprop(fdt, offset, "compatible", lpc_compat,
+                      sizeof(lpc_compat))));
+
+    return 0;
+}
+
 /*
  * These read/write handlers of the OPB address space should be common
  * with the P9 LPC Controller which uses direct MMIOs.
@@ -242,6 +336,74 @@ static const MemoryRegionOps pnv_lpc_xscom_ops = {
     .endianness = DEVICE_BIG_ENDIAN,
 };
 
+static uint64_t pnv_lpc_mmio_read(void *opaque, hwaddr addr, unsigned size)
+{
+    PnvLpcController *lpc = PNV_LPC(opaque);
+    uint64_t val = 0;
+    uint32_t opb_addr = addr & ECCB_CTL_ADDR_MASK;
+    MemTxResult result;
+
+    switch (size) {
+    case 4:
+        val = address_space_ldl(&lpc->opb_as, opb_addr, MEMTXATTRS_UNSPECIFIED,
+                                &result);
+        break;
+    case 1:
+        val = address_space_ldub(&lpc->opb_as, opb_addr, MEMTXATTRS_UNSPECIFIED,
+                                 &result);
+        break;
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR, "OPB read failed at @0x%"
+                      HWADDR_PRIx " invalid size %d\n", addr, size);
+        return 0;
+    }
+
+    if (result != MEMTX_OK) {
+        qemu_log_mask(LOG_GUEST_ERROR, "OPB read failed at @0x%"
+                      HWADDR_PRIx "\n", addr);
+    }
+
+    return val;
+}
+
+static void pnv_lpc_mmio_write(void *opaque, hwaddr addr,
+                                uint64_t val, unsigned size)
+{
+    PnvLpcController *lpc = PNV_LPC(opaque);
+    uint32_t opb_addr = addr & ECCB_CTL_ADDR_MASK;
+    MemTxResult result;
+
+    switch (size) {
+    case 4:
+        address_space_stl(&lpc->opb_as, opb_addr, val, MEMTXATTRS_UNSPECIFIED,
+                          &result);
+         break;
+    case 1:
+        address_space_stb(&lpc->opb_as, opb_addr, val, MEMTXATTRS_UNSPECIFIED,
+                          &result);
+        break;
+    default:
+        qemu_log_mask(LOG_GUEST_ERROR, "OPB write failed at @0x%"
+                      HWADDR_PRIx " invalid size %d\n", addr, size);
+        return;
+    }
+
+    if (result != MEMTX_OK) {
+        qemu_log_mask(LOG_GUEST_ERROR, "OPB write failed at @0x%"
+                      HWADDR_PRIx "\n", addr);
+    }
+}
+
+static const MemoryRegionOps pnv_lpc_mmio_ops = {
+    .read = pnv_lpc_mmio_read,
+    .write = pnv_lpc_mmio_write,
+    .impl = {
+        .min_access_size = 1,
+        .max_access_size = 4,
+    },
+    .endianness = DEVICE_BIG_ENDIAN,
+};
+
 static void pnv_lpc_eval_irqs(PnvLpcController *lpc)
 {
     bool lpc_to_opb_irq = false;
@@ -465,6 +627,43 @@ static const TypeInfo pnv_lpc_power8_info = {
     }
 };
 
+static void pnv_lpc_power9_realize(DeviceState *dev, Error **errp)
+{
+    PnvLpcController *lpc = PNV_LPC(dev);
+    PnvLpcClass *plc = PNV_LPC_GET_CLASS(dev);
+    Error *local_err = NULL;
+
+    plc->parent_realize(dev, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    /* P9 uses a MMIO region */
+    memory_region_init_io(&lpc->xscom_regs, OBJECT(lpc), &pnv_lpc_mmio_ops,
+                          lpc, "lpcm", PNV9_LPCM_SIZE);
+}
+
+static void pnv_lpc_power9_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvLpcClass *plc = PNV_LPC_CLASS(klass);
+
+    dc->desc = "PowerNV LPC Controller POWER9";
+
+    plc->psi_irq = PSIHB9_IRQ_LPCHC;
+
+    device_class_set_parent_realize(dc, pnv_lpc_power9_realize,
+                                    &plc->parent_realize);
+}
+
+static const TypeInfo pnv_lpc_power9_info = {
+    .name          = TYPE_PNV9_LPC,
+    .parent        = TYPE_PNV_LPC,
+    .instance_size = sizeof(PnvLpcController),
+    .class_init    = pnv_lpc_power9_class_init,
+};
+
 static void pnv_lpc_realize(DeviceState *dev, Error **errp)
 {
     PnvLpcController *lpc = PNV_LPC(dev);
@@ -540,6 +739,7 @@ static void pnv_lpc_register_types(void)
 {
     type_register_static(&pnv_lpc_info);
     type_register_static(&pnv_lpc_power8_info);
+    type_register_static(&pnv_lpc_power9_info);
 }
 
 type_init(pnv_lpc_register_types)
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index c81f157f41..1cd1ad622d 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -87,6 +87,7 @@ typedef struct Pnv9Chip {
     /*< public >*/
     PnvXive      xive;
     Pnv9Psi      psi;
+    PnvLpcController lpc;
 } Pnv9Chip;
 
 typedef struct PnvChipClass {
@@ -234,6 +235,9 @@ void pnv_bmc_powerdown(IPMIBmc *bmc);
 #define PNV9_XIVE_PC_SIZE            0x0000001000000000ull
 #define PNV9_XIVE_PC_BASE(chip)      PNV9_CHIP_BASE(chip, 0x0006018000000000ull)
 
+#define PNV9_LPCM_SIZE               0x0000000100000000ull
+#define PNV9_LPCM_BASE(chip)         PNV9_CHIP_BASE(chip, 0x0006030000000000ull)
+
 #define PNV9_PSIHB_SIZE              0x0000000000100000ull
 #define PNV9_PSIHB_BASE(chip)        PNV9_CHIP_BASE(chip, 0x0006030203000000ull)
 
diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h
index f3f24419b1..242b18081c 100644
--- a/include/hw/ppc/pnv_lpc.h
+++ b/include/hw/ppc/pnv_lpc.h
@@ -27,6 +27,9 @@
 #define TYPE_PNV8_LPC TYPE_PNV_LPC "-POWER8"
 #define PNV8_LPC(obj) OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV8_LPC)
 
+#define TYPE_PNV9_LPC TYPE_PNV_LPC "-POWER9"
+#define PNV9_LPC(obj) OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV9_LPC)
+
 typedef struct PnvLpcController {
     DeviceState parent;
 
@@ -85,6 +88,12 @@ typedef struct PnvLpcClass {
     DeviceRealize parent_realize;
 } PnvLpcClass;
 
+/*
+ * Old compilers error on typdef forward declarations. Keep them happy.
+ */
+struct PnvChip;
+
 ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp);
+int pnv_dt_lpc(struct PnvChip *chip, void *fdt, int root_offset);
 
 #endif /* _PPC_PNV_LPC_H */
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 49/60] ppc/pnv: add SerIRQ routing registers
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (47 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 48/60] ppc/pnv: add a LPC Controller model for POWER9 David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 50/60] ppc/pnv: add a OCC model class David Gibson
                   ` (12 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

This is just a simple reminder that SerIRQ routing should be
addressed.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-8-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv_lpc.c         | 14 ++++++++++++++
 include/hw/ppc/pnv_lpc.h |  2 ++
 2 files changed, 16 insertions(+)

diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index 6df694e0ab..641e2046db 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -39,6 +39,8 @@ enum {
 };
 
 /* OPB Master LS registers */
+#define OPB_MASTER_LS_ROUTE0    0x8
+#define OPB_MASTER_LS_ROUTE1    0xC
 #define OPB_MASTER_LS_IRQ_STAT  0x50
 #define   OPB_MASTER_IRQ_LPC            0x00000800
 #define OPB_MASTER_LS_IRQ_MASK  0x54
@@ -521,6 +523,12 @@ static uint64_t opb_master_read(void *opaque, hwaddr addr, unsigned size)
     uint64_t val = 0xfffffffffffffffful;
 
     switch (addr) {
+    case OPB_MASTER_LS_ROUTE0: /* TODO */
+        val = lpc->opb_irq_route0;
+        break;
+    case OPB_MASTER_LS_ROUTE1: /* TODO */
+        val = lpc->opb_irq_route1;
+        break;
     case OPB_MASTER_LS_IRQ_STAT:
         val = lpc->opb_irq_stat;
         break;
@@ -547,6 +555,12 @@ static void opb_master_write(void *opaque, hwaddr addr,
     PnvLpcController *lpc = opaque;
 
     switch (addr) {
+    case OPB_MASTER_LS_ROUTE0: /* TODO */
+        lpc->opb_irq_route0 = val;
+        break;
+    case OPB_MASTER_LS_ROUTE1: /* TODO */
+        lpc->opb_irq_route1 = val;
+        break;
     case OPB_MASTER_LS_IRQ_STAT:
         lpc->opb_irq_stat &= ~val;
         pnv_lpc_eval_irqs(lpc);
diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h
index 242b18081c..413579792e 100644
--- a/include/hw/ppc/pnv_lpc.h
+++ b/include/hw/ppc/pnv_lpc.h
@@ -55,6 +55,8 @@ typedef struct PnvLpcController {
     MemoryRegion opb_master_regs;
 
     /* OPB Master LS registers */
+    uint32_t opb_irq_route0;
+    uint32_t opb_irq_route1;
     uint32_t opb_irq_stat;
     uint32_t opb_irq_mask;
     uint32_t opb_irq_pol;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 50/60] ppc/pnv: add a OCC model class
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (48 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 49/60] ppc/pnv: add SerIRQ routing registers David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 51/60] ppc/pnv: add a OCC model for POWER9 David Gibson
                   ` (11 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

To ease the introduction of the OCC model for POWER9, provide a new
class attributes to define XSCOM operations per CPU family and a PSI
IRQ number.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Message-Id: <20190307223548.20516-9-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c             |  2 +-
 hw/ppc/pnv_occ.c         | 55 +++++++++++++++++++++++++++-------------
 include/hw/ppc/pnv_occ.h | 15 +++++++++++
 3 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 918fae057b..6ae9ce6795 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -790,7 +790,7 @@ static void pnv_chip_power8_instance_init(Object *obj)
                                    OBJECT(&chip8->psi), &error_abort);
 
     object_initialize_child(obj, "occ",  &chip8->occ, sizeof(chip8->occ),
-                            TYPE_PNV_OCC, &error_abort, NULL);
+                            TYPE_PNV8_OCC, &error_abort, NULL);
     object_property_add_const_link(OBJECT(&chip8->occ), "psi",
                                    OBJECT(&chip8->psi), &error_abort);
 }
diff --git a/hw/ppc/pnv_occ.c b/hw/ppc/pnv_occ.c
index 04880f26d6..ea725647c9 100644
--- a/hw/ppc/pnv_occ.c
+++ b/hw/ppc/pnv_occ.c
@@ -34,15 +34,17 @@
 static void pnv_occ_set_misc(PnvOCC *occ, uint64_t val)
 {
     bool irq_state;
+    PnvOCCClass *poc = PNV_OCC_GET_CLASS(occ);
 
     val &= 0xffff000000000000ull;
 
     occ->occmisc = val;
     irq_state = !!(val >> 63);
-    pnv_psi_irq_set(occ->psi, PSIHB_IRQ_OCC, irq_state);
+    pnv_psi_irq_set(occ->psi, poc->psi_irq, irq_state);
 }
 
-static uint64_t pnv_occ_xscom_read(void *opaque, hwaddr addr, unsigned size)
+static uint64_t pnv_occ_power8_xscom_read(void *opaque, hwaddr addr,
+                                          unsigned size)
 {
     PnvOCC *occ = PNV_OCC(opaque);
     uint32_t offset = addr >> 3;
@@ -54,13 +56,13 @@ static uint64_t pnv_occ_xscom_read(void *opaque, hwaddr addr, unsigned size)
         break;
     default:
         qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
-                      HWADDR_PRIx "\n", addr);
+                      HWADDR_PRIx "\n", addr >> 3);
     }
     return val;
 }
 
-static void pnv_occ_xscom_write(void *opaque, hwaddr addr,
-                                uint64_t val, unsigned size)
+static void pnv_occ_power8_xscom_write(void *opaque, hwaddr addr,
+                                       uint64_t val, unsigned size)
 {
     PnvOCC *occ = PNV_OCC(opaque);
     uint32_t offset = addr >> 3;
@@ -77,13 +79,13 @@ static void pnv_occ_xscom_write(void *opaque, hwaddr addr,
         break;
     default:
         qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
-                      HWADDR_PRIx "\n", addr);
+                      HWADDR_PRIx "\n", addr >> 3);
     }
 }
 
-static const MemoryRegionOps pnv_occ_xscom_ops = {
-    .read = pnv_occ_xscom_read,
-    .write = pnv_occ_xscom_write,
+static const MemoryRegionOps pnv_occ_power8_xscom_ops = {
+    .read = pnv_occ_power8_xscom_read,
+    .write = pnv_occ_power8_xscom_write,
     .valid.min_access_size = 8,
     .valid.max_access_size = 8,
     .impl.min_access_size = 8,
@@ -91,27 +93,42 @@ static const MemoryRegionOps pnv_occ_xscom_ops = {
     .endianness = DEVICE_BIG_ENDIAN,
 };
 
+static void pnv_occ_power8_class_init(ObjectClass *klass, void *data)
+{
+    PnvOCCClass *poc = PNV_OCC_CLASS(klass);
+
+    poc->xscom_size = PNV_XSCOM_OCC_SIZE;
+    poc->xscom_ops = &pnv_occ_power8_xscom_ops;
+    poc->psi_irq = PSIHB_IRQ_OCC;
+}
+
+static const TypeInfo pnv_occ_power8_type_info = {
+    .name          = TYPE_PNV8_OCC,
+    .parent        = TYPE_PNV_OCC,
+    .instance_size = sizeof(PnvOCC),
+    .class_init    = pnv_occ_power8_class_init,
+};
 
 static void pnv_occ_realize(DeviceState *dev, Error **errp)
 {
     PnvOCC *occ = PNV_OCC(dev);
+    PnvOCCClass *poc = PNV_OCC_GET_CLASS(occ);
     Object *obj;
-    Error *error = NULL;
+    Error *local_err = NULL;
 
     occ->occmisc = 0;
 
-    /* get PSI object from chip */
-    obj = object_property_get_link(OBJECT(dev), "psi", &error);
+    obj = object_property_get_link(OBJECT(dev), "psi", &local_err);
     if (!obj) {
-        error_setg(errp, "%s: required link 'psi' not found: %s",
-                   __func__, error_get_pretty(error));
+        error_propagate(errp, local_err);
+        error_prepend(errp, "required link 'psi' not found: ");
         return;
     }
     occ->psi = PNV_PSI(obj);
 
     /* XScom region for OCC registers */
-    pnv_xscom_region_init(&occ->xscom_regs, OBJECT(dev), &pnv_occ_xscom_ops,
-                  occ, "xscom-occ", PNV_XSCOM_OCC_SIZE);
+    pnv_xscom_region_init(&occ->xscom_regs, OBJECT(dev), poc->xscom_ops,
+                          occ, "xscom-occ", poc->xscom_size);
 }
 
 static void pnv_occ_class_init(ObjectClass *klass, void *data)
@@ -119,6 +136,7 @@ static void pnv_occ_class_init(ObjectClass *klass, void *data)
     DeviceClass *dc = DEVICE_CLASS(klass);
 
     dc->realize = pnv_occ_realize;
+    dc->desc = "PowerNV OCC Controller";
 }
 
 static const TypeInfo pnv_occ_type_info = {
@@ -126,11 +144,14 @@ static const TypeInfo pnv_occ_type_info = {
     .parent        = TYPE_DEVICE,
     .instance_size = sizeof(PnvOCC),
     .class_init    = pnv_occ_class_init,
+    .class_size    = sizeof(PnvOCCClass),
+    .abstract      = true,
 };
 
 static void pnv_occ_register_types(void)
 {
     type_register_static(&pnv_occ_type_info);
+    type_register_static(&pnv_occ_power8_type_info);
 }
 
-type_init(pnv_occ_register_types)
+type_init(pnv_occ_register_types);
diff --git a/include/hw/ppc/pnv_occ.h b/include/hw/ppc/pnv_occ.h
index 82f299dc76..dab5a05f8e 100644
--- a/include/hw/ppc/pnv_occ.h
+++ b/include/hw/ppc/pnv_occ.h
@@ -23,6 +23,8 @@
 
 #define TYPE_PNV_OCC "pnv-occ"
 #define PNV_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV_OCC)
+#define TYPE_PNV8_OCC TYPE_PNV_OCC "-POWER8"
+#define PNV8_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV8_OCC)
 
 typedef struct PnvOCC {
     DeviceState xd;
@@ -35,4 +37,17 @@ typedef struct PnvOCC {
     MemoryRegion xscom_regs;
 } PnvOCC;
 
+#define PNV_OCC_CLASS(klass) \
+     OBJECT_CLASS_CHECK(PnvOCCClass, (klass), TYPE_PNV_OCC)
+#define PNV_OCC_GET_CLASS(obj) \
+     OBJECT_GET_CLASS(PnvOCCClass, (obj), TYPE_PNV_OCC)
+
+typedef struct PnvOCCClass {
+    DeviceClass parent_class;
+
+    int xscom_size;
+    const MemoryRegionOps *xscom_ops;
+    int psi_irq;
+} PnvOCCClass;
+
 #endif /* _PPC_PNV_OCC_H */
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 51/60] ppc/pnv: add a OCC model for POWER9
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (49 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 50/60] ppc/pnv: add a OCC model class David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 52/60] ppc/pnv: extend XSCOM core support " David Gibson
                   ` (10 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The OCC on POWER9 is very similar to the one found on POWER8. Provide
the same routines with P9 values for the registers and IRQ number.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-10-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c               | 13 +++++++
 hw/ppc/pnv_occ.c           | 72 ++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h       |  1 +
 include/hw/ppc/pnv_occ.h   |  2 ++
 include/hw/ppc/pnv_xscom.h |  3 ++
 5 files changed, 91 insertions(+)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 6ae9ce6795..1559a73323 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -956,6 +956,11 @@ static void pnv_chip_power9_instance_init(Object *obj)
                             TYPE_PNV9_LPC, &error_abort, NULL);
     object_property_add_const_link(OBJECT(&chip9->lpc), "psi",
                                    OBJECT(&chip9->psi), &error_abort);
+
+    object_initialize_child(obj, "occ",  &chip9->occ, sizeof(chip9->occ),
+                            TYPE_PNV9_OCC, &error_abort, NULL);
+    object_property_add_const_link(OBJECT(&chip9->occ), "psi",
+                                   OBJECT(&chip9->psi), &error_abort);
 }
 
 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
@@ -1012,6 +1017,14 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
 
     chip->dt_isa_nodename = g_strdup_printf("/lpcm-opb@%" PRIx64 "/lpc@0",
                                             (uint64_t) PNV9_LPCM_BASE(chip));
+
+    /* Create the simplified OCC model */
+    object_property_set_bool(OBJECT(&chip9->occ), true, "realized", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+    pnv_xscom_add_subregion(chip, PNV9_XSCOM_OCC_BASE, &chip9->occ.xscom_regs);
 }
 
 static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
diff --git a/hw/ppc/pnv_occ.c b/hw/ppc/pnv_occ.c
index ea725647c9..fdd9296e1b 100644
--- a/hw/ppc/pnv_occ.c
+++ b/hw/ppc/pnv_occ.c
@@ -109,6 +109,77 @@ static const TypeInfo pnv_occ_power8_type_info = {
     .class_init    = pnv_occ_power8_class_init,
 };
 
+#define P9_OCB_OCI_OCCMISC              0x6080
+#define P9_OCB_OCI_OCCMISC_CLEAR        0x6081
+#define P9_OCB_OCI_OCCMISC_OR           0x6082
+
+
+static uint64_t pnv_occ_power9_xscom_read(void *opaque, hwaddr addr,
+                                          unsigned size)
+{
+    PnvOCC *occ = PNV_OCC(opaque);
+    uint32_t offset = addr >> 3;
+    uint64_t val = 0;
+
+    switch (offset) {
+    case P9_OCB_OCI_OCCMISC:
+        val = occ->occmisc;
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
+                      HWADDR_PRIx "\n", addr >> 3);
+    }
+    return val;
+}
+
+static void pnv_occ_power9_xscom_write(void *opaque, hwaddr addr,
+                                       uint64_t val, unsigned size)
+{
+    PnvOCC *occ = PNV_OCC(opaque);
+    uint32_t offset = addr >> 3;
+
+    switch (offset) {
+    case P9_OCB_OCI_OCCMISC_CLEAR:
+        pnv_occ_set_misc(occ, 0);
+        break;
+    case P9_OCB_OCI_OCCMISC_OR:
+        pnv_occ_set_misc(occ, occ->occmisc | val);
+        break;
+    case P9_OCB_OCI_OCCMISC:
+        pnv_occ_set_misc(occ, val);
+       break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
+                      HWADDR_PRIx "\n", addr >> 3);
+    }
+}
+
+static const MemoryRegionOps pnv_occ_power9_xscom_ops = {
+    .read = pnv_occ_power9_xscom_read,
+    .write = pnv_occ_power9_xscom_write,
+    .valid.min_access_size = 8,
+    .valid.max_access_size = 8,
+    .impl.min_access_size = 8,
+    .impl.max_access_size = 8,
+    .endianness = DEVICE_BIG_ENDIAN,
+};
+
+static void pnv_occ_power9_class_init(ObjectClass *klass, void *data)
+{
+    PnvOCCClass *poc = PNV_OCC_CLASS(klass);
+
+    poc->xscom_size = PNV9_XSCOM_OCC_SIZE;
+    poc->xscom_ops = &pnv_occ_power9_xscom_ops;
+    poc->psi_irq = PSIHB9_IRQ_OCC;
+}
+
+static const TypeInfo pnv_occ_power9_type_info = {
+    .name          = TYPE_PNV9_OCC,
+    .parent        = TYPE_PNV_OCC,
+    .instance_size = sizeof(PnvOCC),
+    .class_init    = pnv_occ_power9_class_init,
+};
+
 static void pnv_occ_realize(DeviceState *dev, Error **errp)
 {
     PnvOCC *occ = PNV_OCC(dev);
@@ -152,6 +223,7 @@ static void pnv_occ_register_types(void)
 {
     type_register_static(&pnv_occ_type_info);
     type_register_static(&pnv_occ_power8_type_info);
+    type_register_static(&pnv_occ_power9_type_info);
 }
 
 type_init(pnv_occ_register_types);
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 1cd1ad622d..39888f9d52 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -88,6 +88,7 @@ typedef struct Pnv9Chip {
     PnvXive      xive;
     Pnv9Psi      psi;
     PnvLpcController lpc;
+    PnvOCC       occ;
 } Pnv9Chip;
 
 typedef struct PnvChipClass {
diff --git a/include/hw/ppc/pnv_occ.h b/include/hw/ppc/pnv_occ.h
index dab5a05f8e..d22b65a71a 100644
--- a/include/hw/ppc/pnv_occ.h
+++ b/include/hw/ppc/pnv_occ.h
@@ -25,6 +25,8 @@
 #define PNV_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV_OCC)
 #define TYPE_PNV8_OCC TYPE_PNV_OCC "-POWER8"
 #define PNV8_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV8_OCC)
+#define TYPE_PNV9_OCC TYPE_PNV_OCC "-POWER9"
+#define PNV9_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV9_OCC)
 
 typedef struct PnvOCC {
     DeviceState xd;
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index 403a365ed2..3292459fbb 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -73,6 +73,9 @@ typedef struct PnvXScomInterfaceClass {
 #define PNV_XSCOM_OCC_BASE        0x0066000
 #define PNV_XSCOM_OCC_SIZE        0x6000
 
+#define PNV9_XSCOM_OCC_BASE       PNV_XSCOM_OCC_BASE
+#define PNV9_XSCOM_OCC_SIZE       0x8000
+
 #define PNV9_XSCOM_PSIHB_BASE     0x5012900
 #define PNV9_XSCOM_PSIHB_SIZE     0x100
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 52/60] ppc/pnv: extend XSCOM core support for POWER9
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (50 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 51/60] ppc/pnv: add a OCC model for POWER9 David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 53/60] ppc/pnv: POWER9 XSCOM quad support David Gibson
                   ` (9 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

Provide a new class attribute to define XSCOM operations per CPU
family and add a couple of XSCOM addresses controlling the power
management states of the core on POWER9.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-11-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv_core.c         | 100 +++++++++++++++++++++++++++++++++-----
 include/hw/ppc/pnv_core.h |   2 +
 2 files changed, 89 insertions(+), 13 deletions(-)

diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 38179cdc53..171474e080 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -60,8 +60,8 @@ static void pnv_cpu_reset(void *opaque)
 #define PNV_XSCOM_EX_DTS_RESULT0     0x50000
 #define PNV_XSCOM_EX_DTS_RESULT1     0x50001
 
-static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr,
-                                    unsigned int width)
+static uint64_t pnv_core_power8_xscom_read(void *opaque, hwaddr addr,
+                                           unsigned int width)
 {
     uint32_t offset = addr >> 3;
     uint64_t val = 0;
@@ -82,16 +82,74 @@ static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr,
     return val;
 }
 
-static void pnv_core_xscom_write(void *opaque, hwaddr addr, uint64_t val,
-                                 unsigned int width)
+static void pnv_core_power8_xscom_write(void *opaque, hwaddr addr, uint64_t val,
+                                        unsigned int width)
 {
     qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx "\n",
                   addr);
 }
 
-static const MemoryRegionOps pnv_core_xscom_ops = {
-    .read = pnv_core_xscom_read,
-    .write = pnv_core_xscom_write,
+static const MemoryRegionOps pnv_core_power8_xscom_ops = {
+    .read = pnv_core_power8_xscom_read,
+    .write = pnv_core_power8_xscom_write,
+    .valid.min_access_size = 8,
+    .valid.max_access_size = 8,
+    .impl.min_access_size = 8,
+    .impl.max_access_size = 8,
+    .endianness = DEVICE_BIG_ENDIAN,
+};
+
+
+/*
+ * POWER9 core controls
+ */
+#define PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_HYP 0xf010d
+#define PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_OTR 0xf010a
+
+static uint64_t pnv_core_power9_xscom_read(void *opaque, hwaddr addr,
+                                           unsigned int width)
+{
+    uint32_t offset = addr >> 3;
+    uint64_t val = 0;
+
+    /* The result should be 38 C */
+    switch (offset) {
+    case PNV_XSCOM_EX_DTS_RESULT0:
+        val = 0x26f024f023f0000ull;
+        break;
+    case PNV_XSCOM_EX_DTS_RESULT1:
+        val = 0x24f000000000000ull;
+        break;
+    case PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_HYP:
+    case PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_OTR:
+        val = 0x0;
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx "\n",
+                  addr);
+    }
+
+    return val;
+}
+
+static void pnv_core_power9_xscom_write(void *opaque, hwaddr addr, uint64_t val,
+                                        unsigned int width)
+{
+    uint32_t offset = addr >> 3;
+
+    switch (offset) {
+    case PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_HYP:
+    case PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_OTR:
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx "\n",
+                      addr);
+    }
+}
+
+static const MemoryRegionOps pnv_core_power9_xscom_ops = {
+    .read = pnv_core_power9_xscom_read,
+    .write = pnv_core_power9_xscom_write,
     .valid.min_access_size = 8,
     .valid.max_access_size = 8,
     .impl.min_access_size = 8,
@@ -138,6 +196,7 @@ static void pnv_realize_vcpu(PowerPCCPU *cpu, PnvChip *chip, Error **errp)
 static void pnv_core_realize(DeviceState *dev, Error **errp)
 {
     PnvCore *pc = PNV_CORE(OBJECT(dev));
+    PnvCoreClass *pcc = PNV_CORE_GET_CLASS(pc);
     CPUCore *cc = CPU_CORE(OBJECT(dev));
     const char *typename = pnv_core_cpu_typename(pc);
     Error *local_err = NULL;
@@ -180,7 +239,7 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
     }
 
     snprintf(name, sizeof(name), "xscom-core.%d", cc->core_id);
-    pnv_xscom_region_init(&pc->xscom_regs, OBJECT(dev), &pnv_core_xscom_ops,
+    pnv_xscom_region_init(&pc->xscom_regs, OBJECT(dev), pcc->xscom_ops,
                           pc, name, PNV_XSCOM_EX_SIZE);
     return;
 
@@ -222,6 +281,20 @@ static Property pnv_core_properties[] = {
     DEFINE_PROP_END_OF_LIST(),
 };
 
+static void pnv_core_power8_class_init(ObjectClass *oc, void *data)
+{
+    PnvCoreClass *pcc = PNV_CORE_CLASS(oc);
+
+    pcc->xscom_ops = &pnv_core_power8_xscom_ops;
+}
+
+static void pnv_core_power9_class_init(ObjectClass *oc, void *data)
+{
+    PnvCoreClass *pcc = PNV_CORE_CLASS(oc);
+
+    pcc->xscom_ops = &pnv_core_power9_xscom_ops;
+}
+
 static void pnv_core_class_init(ObjectClass *oc, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(oc);
@@ -231,10 +304,11 @@ static void pnv_core_class_init(ObjectClass *oc, void *data)
     dc->props = pnv_core_properties;
 }
 
-#define DEFINE_PNV_CORE_TYPE(cpu_model)         \
+#define DEFINE_PNV_CORE_TYPE(family, cpu_model) \
     {                                           \
         .parent = TYPE_PNV_CORE,                \
         .name = PNV_CORE_TYPE_NAME(cpu_model),  \
+        .class_init = pnv_core_##family##_class_init, \
     }
 
 static const TypeInfo pnv_core_infos[] = {
@@ -246,10 +320,10 @@ static const TypeInfo pnv_core_infos[] = {
         .class_init = pnv_core_class_init,
         .abstract       = true,
     },
-    DEFINE_PNV_CORE_TYPE("power8e_v2.1"),
-    DEFINE_PNV_CORE_TYPE("power8_v2.0"),
-    DEFINE_PNV_CORE_TYPE("power8nvl_v1.0"),
-    DEFINE_PNV_CORE_TYPE("power9_v2.0"),
+    DEFINE_PNV_CORE_TYPE(power8, "power8e_v2.1"),
+    DEFINE_PNV_CORE_TYPE(power8, "power8_v2.0"),
+    DEFINE_PNV_CORE_TYPE(power8, "power8nvl_v1.0"),
+    DEFINE_PNV_CORE_TYPE(power9, "power9_v2.0"),
 };
 
 DEFINE_TYPES(pnv_core_infos)
diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h
index 6874bb847a..cbe9ad36f3 100644
--- a/include/hw/ppc/pnv_core.h
+++ b/include/hw/ppc/pnv_core.h
@@ -42,6 +42,8 @@ typedef struct PnvCore {
 
 typedef struct PnvCoreClass {
     DeviceClass parent_class;
+
+    const MemoryRegionOps *xscom_ops;
 } PnvCoreClass;
 
 #define PNV_CORE_TYPE_SUFFIX "-" TYPE_PNV_CORE
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 53/60] ppc/pnv: POWER9 XSCOM quad support
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (51 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 52/60] ppc/pnv: extend XSCOM core support " David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 54/60] ppc/pnv: activate XSCOM tests for POWER9 David Gibson
                   ` (8 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

The POWER9 processor does not support per-core frequency control. The
cores are arranged in groups of four, along with their respective L2
and L3 caches, into a structure known as a Quad. The frequency must be
managed at the Quad level.

Provide a basic Quad model to fake the settings done by the firmware
on the Non-Cacheable Unit (NCU). Each core pair (EX) needs a special
BAR setting for the TIMA area of XIVE because it resides on the same
address on all chips.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-12-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c               | 38 ++++++++++++++++-
 hw/ppc/pnv_core.c          | 87 ++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h       |  4 ++
 include/hw/ppc/pnv_core.h  | 10 +++++
 include/hw/ppc/pnv_xscom.h | 12 ++++--
 5 files changed, 146 insertions(+), 5 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 1559a73323..e68d419203 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -963,6 +963,36 @@ static void pnv_chip_power9_instance_init(Object *obj)
                                    OBJECT(&chip9->psi), &error_abort);
 }
 
+static void pnv_chip_quad_realize(Pnv9Chip *chip9, Error **errp)
+{
+    PnvChip *chip = PNV_CHIP(chip9);
+    const char *typename = pnv_chip_core_typename(chip);
+    size_t typesize = object_type_get_instance_size(typename);
+    int i;
+
+    chip9->nr_quads = DIV_ROUND_UP(chip->nr_cores, 4);
+    chip9->quads = g_new0(PnvQuad, chip9->nr_quads);
+
+    for (i = 0; i < chip9->nr_quads; i++) {
+        char eq_name[32];
+        PnvQuad *eq = &chip9->quads[i];
+        PnvCore *pnv_core = PNV_CORE(chip->cores + (i * 4) * typesize);
+        int core_id = CPU_CORE(pnv_core)->core_id;
+
+        object_initialize(eq, sizeof(*eq), TYPE_PNV_QUAD);
+        snprintf(eq_name, sizeof(eq_name), "eq[%d]", core_id);
+
+        object_property_add_child(OBJECT(chip), eq_name, OBJECT(eq),
+                                  &error_fatal);
+        object_property_set_int(OBJECT(eq), core_id, "id", &error_fatal);
+        object_property_set_bool(OBJECT(eq), true, "realized", &error_fatal);
+        object_unref(OBJECT(eq));
+
+        pnv_xscom_add_subregion(chip, PNV9_XSCOM_EQ_BASE(eq->id),
+                                &eq->xscom_regs);
+    }
+}
+
 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
 {
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev);
@@ -977,6 +1007,12 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp)
         return;
     }
 
+    pnv_chip_quad_realize(chip9, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
     /* XIVE interrupt controller (POWER9) */
     object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_IC_BASE(chip),
                             "ic-bar", &error_fatal);
@@ -1135,7 +1171,7 @@ static void pnv_chip_core_realize(PnvChip *chip, Error **errp)
         if (!pnv_chip_is_power9(chip)) {
             xscom_core_base = PNV_XSCOM_EX_BASE(core_hwid);
         } else {
-            xscom_core_base = PNV_XSCOM_P9_EC_BASE(core_hwid);
+            xscom_core_base = PNV9_XSCOM_EC_BASE(core_hwid);
         }
 
         pnv_xscom_add_subregion(chip, xscom_core_base,
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 171474e080..5feeed6bc4 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -327,3 +327,90 @@ static const TypeInfo pnv_core_infos[] = {
 };
 
 DEFINE_TYPES(pnv_core_infos)
+
+/*
+ * POWER9 Quads
+ */
+
+#define P9X_EX_NCU_SPEC_BAR                     0x11010
+
+static uint64_t pnv_quad_xscom_read(void *opaque, hwaddr addr,
+                                    unsigned int width)
+{
+    uint32_t offset = addr >> 3;
+    uint64_t val = -1;
+
+    switch (offset) {
+    case P9X_EX_NCU_SPEC_BAR:
+    case P9X_EX_NCU_SPEC_BAR + 0x400: /* Second EX */
+        val = 0;
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "%s: writing @0x%08x\n", __func__,
+                      offset);
+    }
+
+    return val;
+}
+
+static void pnv_quad_xscom_write(void *opaque, hwaddr addr, uint64_t val,
+                                 unsigned int width)
+{
+    uint32_t offset = addr >> 3;
+
+    switch (offset) {
+    case P9X_EX_NCU_SPEC_BAR:
+    case P9X_EX_NCU_SPEC_BAR + 0x400: /* Second EX */
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "%s: writing @0x%08x\n", __func__,
+                  offset);
+    }
+}
+
+static const MemoryRegionOps pnv_quad_xscom_ops = {
+    .read = pnv_quad_xscom_read,
+    .write = pnv_quad_xscom_write,
+    .valid.min_access_size = 8,
+    .valid.max_access_size = 8,
+    .impl.min_access_size = 8,
+    .impl.max_access_size = 8,
+    .endianness = DEVICE_BIG_ENDIAN,
+};
+
+static void pnv_quad_realize(DeviceState *dev, Error **errp)
+{
+    PnvQuad *eq = PNV_QUAD(dev);
+    char name[32];
+
+    snprintf(name, sizeof(name), "xscom-quad.%d", eq->id);
+    pnv_xscom_region_init(&eq->xscom_regs, OBJECT(dev), &pnv_quad_xscom_ops,
+                          eq, name, PNV9_XSCOM_EQ_SIZE);
+}
+
+static Property pnv_quad_properties[] = {
+    DEFINE_PROP_UINT32("id", PnvQuad, id, 0),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void pnv_quad_class_init(ObjectClass *oc, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(oc);
+
+    dc->realize = pnv_quad_realize;
+    dc->props = pnv_quad_properties;
+}
+
+static const TypeInfo pnv_quad_info = {
+    .name          = TYPE_PNV_QUAD,
+    .parent        = TYPE_DEVICE,
+    .instance_size = sizeof(PnvQuad),
+    .class_init    = pnv_quad_class_init,
+};
+
+static void pnv_core_register_types(void)
+{
+    type_register_static(&pnv_quad_info);
+}
+
+type_init(pnv_core_register_types)
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 39888f9d52..e5b00d373e 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -26,6 +26,7 @@
 #include "hw/ppc/pnv_psi.h"
 #include "hw/ppc/pnv_occ.h"
 #include "hw/ppc/pnv_xive.h"
+#include "hw/ppc/pnv_core.h"
 
 #define TYPE_PNV_CHIP "pnv-chip"
 #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
@@ -89,6 +90,9 @@ typedef struct Pnv9Chip {
     Pnv9Psi      psi;
     PnvLpcController lpc;
     PnvOCC       occ;
+
+    uint32_t     nr_quads;
+    PnvQuad      *quads;
 } Pnv9Chip;
 
 typedef struct PnvChipClass {
diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h
index cbe9ad36f3..50cdb2b358 100644
--- a/include/hw/ppc/pnv_core.h
+++ b/include/hw/ppc/pnv_core.h
@@ -58,4 +58,14 @@ static inline PnvCPUState *pnv_cpu_state(PowerPCCPU *cpu)
     return (PnvCPUState *)cpu->machine_data;
 }
 
+#define TYPE_PNV_QUAD "powernv-cpu-quad"
+#define PNV_QUAD(obj) \
+    OBJECT_CHECK(PnvQuad, (obj), TYPE_PNV_QUAD)
+
+typedef struct PnvQuad {
+    DeviceState parent_obj;
+
+    uint32_t id;
+    MemoryRegion xscom_regs;
+} PnvQuad;
 #endif /* _PPC_PNV_CORE_H */
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index 3292459fbb..68dfae0dfe 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -60,10 +60,6 @@ typedef struct PnvXScomInterfaceClass {
     (PNV_XSCOM_EX_CORE_BASE | ((uint64_t)(core) << 24))
 #define PNV_XSCOM_EX_SIZE         0x100000
 
-#define PNV_XSCOM_P9_EC_BASE(core) \
-    ((uint64_t)(((core) & 0x1F) + 0x20) << 24)
-#define PNV_XSCOM_P9_EC_SIZE      0x100000
-
 #define PNV_XSCOM_LPC_BASE        0xb0020
 #define PNV_XSCOM_LPC_SIZE        0x4
 
@@ -73,6 +69,14 @@ typedef struct PnvXScomInterfaceClass {
 #define PNV_XSCOM_OCC_BASE        0x0066000
 #define PNV_XSCOM_OCC_SIZE        0x6000
 
+#define PNV9_XSCOM_EC_BASE(core) \
+    ((uint64_t)(((core) & 0x1F) + 0x20) << 24)
+#define PNV9_XSCOM_EC_SIZE        0x100000
+
+#define PNV9_XSCOM_EQ_BASE(core) \
+    ((uint64_t)(((core) & 0x1C) + 0x40) << 22)
+#define PNV9_XSCOM_EQ_SIZE        0x100000
+
 #define PNV9_XSCOM_OCC_BASE       PNV_XSCOM_OCC_BASE
 #define PNV9_XSCOM_OCC_SIZE       0x8000
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 54/60] ppc/pnv: activate XSCOM tests for POWER9
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (52 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 53/60] ppc/pnv: POWER9 XSCOM quad support David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 55/60] ppc/pnv: add more dummy XSCOM addresses David Gibson
                   ` (7 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

We now have enough support to let the XSCOM test run on POWER9.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-13-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 tests/pnv-xscom-test.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/tests/pnv-xscom-test.c b/tests/pnv-xscom-test.c
index 974f8da5b2..63d464048d 100644
--- a/tests/pnv-xscom-test.c
+++ b/tests/pnv-xscom-test.c
@@ -39,7 +39,6 @@ static const PnvChip pnv_chips[] = {
         .cfam_id    = 0x120d304980000000ull,
         .first_core = 0x1,
     },
-#if 0 /* POWER9 support is not ready yet */
     {
         .chip_type  = PNV_CHIP_POWER9,
         .cpu_model  = "POWER9",
@@ -47,7 +46,6 @@ static const PnvChip pnv_chips[] = {
         .cfam_id    = 0x220d104900008000ull,
         .first_core = 0x0,
     },
-#endif
 };
 
 static uint64_t pnv_xscom_addr(const PnvChip *chip, uint32_t pcba)
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 55/60] ppc/pnv: add more dummy XSCOM addresses
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (53 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 54/60] ppc/pnv: activate XSCOM tests for POWER9 David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:26 ` [Qemu-devel] [PULL 56/60] ppc/pnv: add a "ibm, opal/power-mgt" device tree node on POWER9 David Gibson
                   ` (6 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

To improve OPAL/skiboot support. We don't need to strictly model these
XSCOM accesses.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-14-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv_xscom.c | 33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
index 46fae41f32..c285ef514e 100644
--- a/hw/ppc/pnv_xscom.c
+++ b/hw/ppc/pnv_xscom.c
@@ -64,11 +64,21 @@ static uint64_t xscom_read_default(PnvChip *chip, uint32_t pcba)
     switch (pcba) {
     case 0xf000f:
         return PNV_CHIP_GET_CLASS(chip)->chip_cfam_id;
+    case 0x18002:       /* ECID2 */
+        return 0;
+
     case 0x1010c00:     /* PIBAM FIR */
     case 0x1010c03:     /* PIBAM FIR MASK */
-    case 0x2020007:     /* ADU stuff */
-    case 0x2020009:     /* ADU stuff */
-    case 0x202000f:     /* ADU stuff */
+
+        /* P9 xscom reset */
+    case 0x0090018:     /* Receive status reg */
+    case 0x0090012:     /* log register */
+    case 0x0090013:     /* error register */
+
+        /* P8 xscom reset */
+    case 0x2020007:     /* ADU stuff, log register */
+    case 0x2020009:     /* ADU stuff, error register */
+    case 0x202000f:     /* ADU stuff, receive status register*/
         return 0;
     case 0x2013f00:     /* PBA stuff */
     case 0x2013f01:     /* PBA stuff */
@@ -100,9 +110,20 @@ static bool xscom_write_default(PnvChip *chip, uint32_t pcba, uint64_t val)
     case 0x1010c03:     /* PIBAM FIR MASK */
     case 0x1010c04:     /* PIBAM FIR MASK */
     case 0x1010c05:     /* PIBAM FIR MASK */
-    case 0x2020007:     /* ADU stuff */
-    case 0x2020009:     /* ADU stuff */
-    case 0x202000f:     /* ADU stuff */
+        /* P9 xscom reset */
+    case 0x0090018:     /* Receive status reg */
+    case 0x0090012:     /* log register */
+    case 0x0090013:     /* error register */
+
+        /* P8 xscom reset */
+    case 0x2020007:     /* ADU stuff, log register */
+    case 0x2020009:     /* ADU stuff, error register */
+    case 0x202000f:     /* ADU stuff, receive status register*/
+
+    case 0x2013028:     /* CAPP stuff */
+    case 0x201302a:     /* CAPP stuff */
+    case 0x2013801:     /* CAPP stuff */
+    case 0x2013802:     /* CAPP stuff */
         return true;
     default:
         return false;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 56/60] ppc/pnv: add a "ibm, opal/power-mgt" device tree node on POWER9
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (54 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 55/60] ppc/pnv: add more dummy XSCOM addresses David Gibson
@ 2019-03-10  8:26 ` David Gibson
  2019-03-10  8:27 ` [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9 David Gibson
                   ` (5 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:26 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

Activate only stop0 and stop1 levels. We should not need more levels
when under QEMU.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-15-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/pnv.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index e68d419203..8be4d4cbf7 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -438,6 +438,16 @@ static void pnv_dt_isa(PnvMachineState *pnv, void *fdt)
                        &args);
 }
 
+static void pnv_dt_power_mgt(void *fdt)
+{
+    int off;
+
+    off = fdt_add_subnode(fdt, 0, "ibm,opal");
+    off = fdt_add_subnode(fdt, off, "power-mgt");
+
+    _FDT(fdt_setprop_cell(fdt, off, "ibm,enabled-stop-levels", 0xc0000000));
+}
+
 static void *pnv_dt_create(MachineState *machine)
 {
     const char plat_compat[] = "qemu,powernv\0ibm,powernv";
@@ -493,6 +503,11 @@ static void *pnv_dt_create(MachineState *machine)
         pnv_dt_bmc_sensors(pnv->bmc, fdt);
     }
 
+    /* Create an extra node for power management on Power9 */
+    if (pnv_is_power9(pnv)) {
+        pnv_dt_power_mgt(fdt);
+    }
+
     return fdt;
 }
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (55 preceding siblings ...)
  2019-03-10  8:26 ` [Qemu-devel] [PULL 56/60] ppc/pnv: add a "ibm, opal/power-mgt" device tree node on POWER9 David Gibson
@ 2019-03-10  8:27 ` David Gibson
       [not found]   ` <20190312150115.6zuaid43gr7hklt5@unused>
  2019-03-10  8:27 ` [Qemu-devel] [PULL 58/60] target/ppc: Optimize xviexpdp() using deposit_i64() David Gibson
                   ` (4 subsequent siblings)
  61 siblings, 1 reply; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:27 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Cédric Le Goater,
	David Gibson

From: Cédric Le Goater <clg@kaod.org>

We now have enough support to boot a PowerNV machine with a POWER9
processor. Allow HV mode on POWER9.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20190307223548.20516-16-clg@kaod.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/translate_init.inc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index af70a3b78c..0bd555eb19 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -8895,7 +8895,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
                        PPC_MEM_TLBSYNC |
-                       PPC_64B | PPC_64BX | PPC_ALTIVEC |
+                       PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
                        PPC_SEGMENT_64B | PPC_SLBI |
                        PPC_POPCNTB | PPC_POPCNTWD |
                        PPC_CILDST;
@@ -8907,6 +8907,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
                         PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
                         PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
     pcc->msr_mask = (1ull << MSR_SF) |
+                    (1ull << MSR_SHV) |
                     (1ull << MSR_TM) |
                     (1ull << MSR_VR) |
                     (1ull << MSR_VSX) |
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 58/60] target/ppc: Optimize xviexpdp() using deposit_i64()
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (56 preceding siblings ...)
  2019-03-10  8:27 ` [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9 David Gibson
@ 2019-03-10  8:27 ` David Gibson
  2019-03-10  8:27 ` [Qemu-devel] [PULL 59/60] target/ppc: Optimize x[sv]xsigdp " David Gibson
                   ` (3 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:27 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Philippe Mathieu-Daudé,
	David Gibson

From: Philippe Mathieu-Daudé <f4bug@amsat.org>

The t0 tcg_temp register is now unused, remove it.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20190309214255.9952-2-f4bug@amsat.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/translate/vsx-impl.inc.c | 14 +++-----------
 1 file changed, 3 insertions(+), 11 deletions(-)

diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx-impl.inc.c
index 95a269fff0..30d8aabd92 100644
--- a/target/ppc/translate/vsx-impl.inc.c
+++ b/target/ppc/translate/vsx-impl.inc.c
@@ -1695,7 +1695,6 @@ static void gen_xviexpdp(DisasContext *ctx)
     TCGv_i64 xal;
     TCGv_i64 xbh;
     TCGv_i64 xbl;
-    TCGv_i64 t0;
 
     if (unlikely(!ctx->vsx_enabled)) {
         gen_exception(ctx, POWERPC_EXCP_VSXU);
@@ -1711,20 +1710,13 @@ static void gen_xviexpdp(DisasContext *ctx)
     get_cpu_vsrl(xal, xA(ctx->opcode));
     get_cpu_vsrh(xbh, xB(ctx->opcode));
     get_cpu_vsrl(xbl, xB(ctx->opcode));
-    t0 = tcg_temp_new_i64();
 
-    tcg_gen_andi_i64(xth, xah, 0x800FFFFFFFFFFFFF);
-    tcg_gen_andi_i64(t0, xbh, 0x7FF);
-    tcg_gen_shli_i64(t0, t0, 52);
-    tcg_gen_or_i64(xth, xth, t0);
+    tcg_gen_deposit_i64(xth, xah, xbh, 52, 11);
     set_cpu_vsrh(xT(ctx->opcode), xth);
-    tcg_gen_andi_i64(xtl, xal, 0x800FFFFFFFFFFFFF);
-    tcg_gen_andi_i64(t0, xbl, 0x7FF);
-    tcg_gen_shli_i64(t0, t0, 52);
-    tcg_gen_or_i64(xtl, xtl, t0);
+
+    tcg_gen_deposit_i64(xtl, xal, xbl, 52, 11);
     set_cpu_vsrl(xT(ctx->opcode), xtl);
 
-    tcg_temp_free_i64(t0);
     tcg_temp_free_i64(xth);
     tcg_temp_free_i64(xtl);
     tcg_temp_free_i64(xah);
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 59/60] target/ppc: Optimize x[sv]xsigdp using deposit_i64()
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (57 preceding siblings ...)
  2019-03-10  8:27 ` [Qemu-devel] [PULL 58/60] target/ppc: Optimize xviexpdp() using deposit_i64() David Gibson
@ 2019-03-10  8:27 ` David Gibson
  2019-03-10  8:27 ` [Qemu-devel] [PULL 60/60] spapr: Use CamelCase properly David Gibson
                   ` (2 subsequent siblings)
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:27 UTC (permalink / raw)
  To: peter.maydell
  Cc: groug, qemu-ppc, qemu-devel, lvivier, Philippe Mathieu-Daudé,
	David Gibson

From: Philippe Mathieu-Daudé <f4bug@amsat.org>

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20190309214255.9952-3-f4bug@amsat.org>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/translate/vsx-impl.inc.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx-impl.inc.c
index 30d8aabd92..508e9199c8 100644
--- a/target/ppc/translate/vsx-impl.inc.c
+++ b/target/ppc/translate/vsx-impl.inc.c
@@ -1587,8 +1587,7 @@ static void gen_xsxsigdp(DisasContext *ctx)
     tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, zr, zr, t0);
     tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0);
     get_cpu_vsrh(t1, xB(ctx->opcode));
-    tcg_gen_andi_i64(rt, t1, 0x000FFFFFFFFFFFFF);
-    tcg_gen_or_i64(rt, rt, t0);
+    tcg_gen_deposit_i64(rt, t0, t1, 0, 52);
 
     tcg_temp_free_i64(t0);
     tcg_temp_free_i64(t1);
@@ -1624,8 +1623,7 @@ static void gen_xsxsigqp(DisasContext *ctx)
     tcg_gen_movi_i64(t0, 0x0001000000000000);
     tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, zr, zr, t0);
     tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0);
-    tcg_gen_andi_i64(xth, xbh, 0x0000FFFFFFFFFFFF);
-    tcg_gen_or_i64(xth, xth, t0);
+    tcg_gen_deposit_i64(xth, t0, xbh, 0, 48);
     set_cpu_vsrh(rD(ctx->opcode) + 32, xth);
     tcg_gen_mov_i64(xtl, xbl);
     set_cpu_vsrl(rD(ctx->opcode) + 32, xtl);
@@ -1814,16 +1812,14 @@ static void gen_xvxsigdp(DisasContext *ctx)
     tcg_gen_movi_i64(t0, 0x0010000000000000);
     tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, zr, zr, t0);
     tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0);
-    tcg_gen_andi_i64(xth, xbh, 0x000FFFFFFFFFFFFF);
-    tcg_gen_or_i64(xth, xth, t0);
+    tcg_gen_deposit_i64(xth, t0, xbh, 0, 52);
     set_cpu_vsrh(xT(ctx->opcode), xth);
 
     tcg_gen_extract_i64(exp, xbl, 52, 11);
     tcg_gen_movi_i64(t0, 0x0010000000000000);
     tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, zr, zr, t0);
     tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0);
-    tcg_gen_andi_i64(xtl, xbl, 0x000FFFFFFFFFFFFF);
-    tcg_gen_or_i64(xtl, xtl, t0);
+    tcg_gen_deposit_i64(xth, t0, xbl, 0, 52);
     set_cpu_vsrl(xT(ctx->opcode), xtl);
 
     tcg_temp_free_i64(t0);
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* [Qemu-devel] [PULL 60/60] spapr: Use CamelCase properly
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (58 preceding siblings ...)
  2019-03-10  8:27 ` [Qemu-devel] [PULL 59/60] target/ppc: Optimize x[sv]xsigdp " David Gibson
@ 2019-03-10  8:27 ` David Gibson
  2019-03-10  9:23 ` [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 no-reply
  2019-03-10 16:06 ` Peter Maydell
  61 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-10  8:27 UTC (permalink / raw)
  To: peter.maydell; +Cc: groug, qemu-ppc, qemu-devel, lvivier, David Gibson

The qemu coding standard is to use CamelCase for type and structure names,
and the pseries code follows that... sort of.  There are quite a lot of
places where we bend the rules in order to preserve the capitalization of
internal acronyms like "PHB", "TCE", "DIMM" and most commonly "sPAPR".

That was a bad idea - it frequently leads to names ending up with hard to
read clusters of capital letters, and means they don't catch the eye as
type identifiers, which is kind of the point of the CamelCase convention in
the first place.

In short, keeping type identifiers look like CamelCase is more important
than preserving standard capitalization of internal "words".  So, this
patch renames a heap of spapr internal type names to a more standard
CamelCase.

In addition to case changes, we also make some other identifier renames:
  VIOsPAPR* -> SpaprVio*
    The reverse word ordering was only ever used to mitigate the capital
    cluster, so revert to the natural ordering.
  VIOsPAPRVTYDevice -> SpaprVioVty
  VIOsPAPRVLANDevice -> SpaprVioVlan
    Brevity, since the "Device" didn't add useful information
  sPAPRDRConnector -> SpaprDrc
  sPAPRDRConnectorClass -> SpaprDrcClass
    Brevity, and makes it clearer this is the same thing as a "DRC"
    mentioned in many other places in the code

This is 100% a mechanical search-and-replace patch.  It will, however,
conflict with essentially any and all outstanding patches touching the
spapr code.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/char/spapr_vty.c             |  58 +++---
 hw/intc/spapr_xive.c            |  86 ++++-----
 hw/intc/xics_kvm.c              |   4 +-
 hw/intc/xics_spapr.c            |  24 +--
 hw/net/spapr_llan.c             | 110 +++++------
 hw/nvram/spapr_nvram.c          |  42 ++---
 hw/ppc/spapr.c                  | 324 ++++++++++++++++----------------
 hw/ppc/spapr_caps.c             | 110 +++++------
 hw/ppc/spapr_cpu_core.c         |  52 ++---
 hw/ppc/spapr_drc.c              | 134 ++++++-------
 hw/ppc/spapr_events.c           |  92 ++++-----
 hw/ppc/spapr_hcall.c            |  98 +++++-----
 hw/ppc/spapr_iommu.c            |  78 ++++----
 hw/ppc/spapr_irq.c              | 104 +++++-----
 hw/ppc/spapr_ovec.c             |  40 ++--
 hw/ppc/spapr_pci.c              | 212 ++++++++++-----------
 hw/ppc/spapr_pci_vfio.c         |  14 +-
 hw/ppc/spapr_rng.c              |  18 +-
 hw/ppc/spapr_rtas.c             |  30 +--
 hw/ppc/spapr_rtas_ddw.c         |  32 ++--
 hw/ppc/spapr_rtc.c              |  16 +-
 hw/ppc/spapr_vio.c              | 116 ++++++------
 hw/scsi/spapr_vscsi.c           |  14 +-
 include/hw/pci-host/spapr.h     |  44 ++---
 include/hw/ppc/spapr.h          | 176 ++++++++---------
 include/hw/ppc/spapr_cpu_core.h |  24 +--
 include/hw/ppc/spapr_drc.h      | 108 +++++------
 include/hw/ppc/spapr_irq.h      |  58 +++---
 include/hw/ppc/spapr_ovec.h     |  30 +--
 include/hw/ppc/spapr_vio.h      |  74 ++++----
 include/hw/ppc/spapr_xive.h     |  18 +-
 include/hw/ppc/xics_spapr.h     |   6 +-
 target/ppc/kvm.c                |   4 +-
 33 files changed, 1175 insertions(+), 1175 deletions(-)

diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c
index 6748334ded..617303dbaf 100644
--- a/hw/char/spapr_vty.c
+++ b/hw/char/spapr_vty.c
@@ -10,27 +10,27 @@
 
 #define VTERM_BUFSIZE   16
 
-typedef struct VIOsPAPRVTYDevice {
-    VIOsPAPRDevice sdev;
+typedef struct SpaprVioVty {
+    SpaprVioDevice sdev;
     CharBackend chardev;
     uint32_t in, out;
     uint8_t buf[VTERM_BUFSIZE];
-} VIOsPAPRVTYDevice;
+} SpaprVioVty;
 
 #define TYPE_VIO_SPAPR_VTY_DEVICE "spapr-vty"
 #define VIO_SPAPR_VTY_DEVICE(obj) \
-     OBJECT_CHECK(VIOsPAPRVTYDevice, (obj), TYPE_VIO_SPAPR_VTY_DEVICE)
+     OBJECT_CHECK(SpaprVioVty, (obj), TYPE_VIO_SPAPR_VTY_DEVICE)
 
 static int vty_can_receive(void *opaque)
 {
-    VIOsPAPRVTYDevice *dev = VIO_SPAPR_VTY_DEVICE(opaque);
+    SpaprVioVty *dev = VIO_SPAPR_VTY_DEVICE(opaque);
 
     return VTERM_BUFSIZE - (dev->in - dev->out);
 }
 
 static void vty_receive(void *opaque, const uint8_t *buf, int size)
 {
-    VIOsPAPRVTYDevice *dev = VIO_SPAPR_VTY_DEVICE(opaque);
+    SpaprVioVty *dev = VIO_SPAPR_VTY_DEVICE(opaque);
     int i;
 
     if ((dev->in == dev->out) && size) {
@@ -51,9 +51,9 @@ static void vty_receive(void *opaque, const uint8_t *buf, int size)
     }
 }
 
-static int vty_getchars(VIOsPAPRDevice *sdev, uint8_t *buf, int max)
+static int vty_getchars(SpaprVioDevice *sdev, uint8_t *buf, int max)
 {
-    VIOsPAPRVTYDevice *dev = VIO_SPAPR_VTY_DEVICE(sdev);
+    SpaprVioVty *dev = VIO_SPAPR_VTY_DEVICE(sdev);
     int n = 0;
 
     while ((n < max) && (dev->out != dev->in)) {
@@ -83,18 +83,18 @@ static int vty_getchars(VIOsPAPRDevice *sdev, uint8_t *buf, int max)
     return n;
 }
 
-void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len)
+void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len)
 {
-    VIOsPAPRVTYDevice *dev = VIO_SPAPR_VTY_DEVICE(sdev);
+    SpaprVioVty *dev = VIO_SPAPR_VTY_DEVICE(sdev);
 
     /* XXX this blocks entire thread. Rewrite to use
      * qemu_chr_fe_write and background I/O callbacks */
     qemu_chr_fe_write_all(&dev->chardev, buf, len);
 }
 
-static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error **errp)
+static void spapr_vty_realize(SpaprVioDevice *sdev, Error **errp)
 {
-    VIOsPAPRVTYDevice *dev = VIO_SPAPR_VTY_DEVICE(sdev);
+    SpaprVioVty *dev = VIO_SPAPR_VTY_DEVICE(sdev);
 
     if (!qemu_chr_fe_backend_connected(&dev->chardev)) {
         error_setg(errp, "chardev property not set");
@@ -106,14 +106,14 @@ static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error **errp)
 }
 
 /* Forward declaration */
-static target_ulong h_put_term_char(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_put_term_char(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                     target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
     target_ulong len = args[1];
     target_ulong char0_7 = args[2];
     target_ulong char8_15 = args[3];
-    VIOsPAPRDevice *sdev;
+    SpaprVioDevice *sdev;
     uint8_t buf[16];
 
     sdev = vty_lookup(spapr, reg);
@@ -133,14 +133,14 @@ static target_ulong h_put_term_char(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_get_term_char(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_get_term_char(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                     target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
     target_ulong *len = args + 0;
     target_ulong *char0_7 = args + 1;
     target_ulong *char8_15 = args + 2;
-    VIOsPAPRDevice *sdev;
+    SpaprVioDevice *sdev;
     uint8_t buf[16];
 
     sdev = vty_lookup(spapr, reg);
@@ -159,7 +159,7 @@ static target_ulong h_get_term_char(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-void spapr_vty_create(VIOsPAPRBus *bus, Chardev *chardev)
+void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev)
 {
     DeviceState *dev;
 
@@ -169,8 +169,8 @@ void spapr_vty_create(VIOsPAPRBus *bus, Chardev *chardev)
 }
 
 static Property spapr_vty_properties[] = {
-    DEFINE_SPAPR_PROPERTIES(VIOsPAPRVTYDevice, sdev),
-    DEFINE_PROP_CHR("chardev", VIOsPAPRVTYDevice, chardev),
+    DEFINE_SPAPR_PROPERTIES(SpaprVioVty, sdev),
+    DEFINE_PROP_CHR("chardev", SpaprVioVty, chardev),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -179,11 +179,11 @@ static const VMStateDescription vmstate_spapr_vty = {
     .version_id = 1,
     .minimum_version_id = 1,
     .fields = (VMStateField[]) {
-        VMSTATE_SPAPR_VIO(sdev, VIOsPAPRVTYDevice),
+        VMSTATE_SPAPR_VIO(sdev, SpaprVioVty),
 
-        VMSTATE_UINT32(in, VIOsPAPRVTYDevice),
-        VMSTATE_UINT32(out, VIOsPAPRVTYDevice),
-        VMSTATE_BUFFER(buf, VIOsPAPRVTYDevice),
+        VMSTATE_UINT32(in, SpaprVioVty),
+        VMSTATE_UINT32(out, SpaprVioVty),
+        VMSTATE_BUFFER(buf, SpaprVioVty),
         VMSTATE_END_OF_LIST()
     },
 };
@@ -191,7 +191,7 @@ static const VMStateDescription vmstate_spapr_vty = {
 static void spapr_vty_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
+    SpaprVioDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
 
     k->realize = spapr_vty_realize;
     k->dt_name = "vty";
@@ -205,13 +205,13 @@ static void spapr_vty_class_init(ObjectClass *klass, void *data)
 static const TypeInfo spapr_vty_info = {
     .name          = TYPE_VIO_SPAPR_VTY_DEVICE,
     .parent        = TYPE_VIO_SPAPR_DEVICE,
-    .instance_size = sizeof(VIOsPAPRVTYDevice),
+    .instance_size = sizeof(SpaprVioVty),
     .class_init    = spapr_vty_class_init,
 };
 
-VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus)
+SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus)
 {
-    VIOsPAPRDevice *sdev, *selected;
+    SpaprVioDevice *sdev, *selected;
     BusChild *kid;
 
     /*
@@ -246,9 +246,9 @@ VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus)
     return selected;
 }
 
-VIOsPAPRDevice *vty_lookup(sPAPRMachineState *spapr, target_ulong reg)
+SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg)
 {
-    VIOsPAPRDevice *sdev;
+    SpaprVioDevice *sdev;
 
     sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
     if (!sdev && reg == 0) {
diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c
index e0e5cb5d8e..097f88d460 100644
--- a/hw/intc/spapr_xive.c
+++ b/hw/intc/spapr_xive.c
@@ -117,7 +117,7 @@ static int spapr_xive_target_to_end(uint32_t target, uint8_t prio,
  * On sPAPR machines, use a simplified output for the XIVE END
  * structure dumping only the information related to the OS EQ.
  */
-static void spapr_xive_end_pic_print_info(sPAPRXive *xive, XiveEND *end,
+static void spapr_xive_end_pic_print_info(SpaprXive *xive, XiveEND *end,
                                           Monitor *mon)
 {
     uint32_t qindex = xive_get_field32(END_W1_PAGE_OFF, end->w1);
@@ -135,7 +135,7 @@ static void spapr_xive_end_pic_print_info(sPAPRXive *xive, XiveEND *end,
     monitor_printf(mon, "]");
 }
 
-void spapr_xive_pic_print_info(sPAPRXive *xive, Monitor *mon)
+void spapr_xive_pic_print_info(SpaprXive *xive, Monitor *mon)
 {
     XiveSource *xsrc = &xive->source;
     int i;
@@ -173,14 +173,14 @@ void spapr_xive_pic_print_info(sPAPRXive *xive, Monitor *mon)
     }
 }
 
-static void spapr_xive_map_mmio(sPAPRXive *xive)
+static void spapr_xive_map_mmio(SpaprXive *xive)
 {
     sysbus_mmio_map(SYS_BUS_DEVICE(xive), 0, xive->vc_base);
     sysbus_mmio_map(SYS_BUS_DEVICE(xive), 1, xive->end_base);
     sysbus_mmio_map(SYS_BUS_DEVICE(xive), 2, xive->tm_base);
 }
 
-void spapr_xive_mmio_set_enabled(sPAPRXive *xive, bool enable)
+void spapr_xive_mmio_set_enabled(SpaprXive *xive, bool enable)
 {
     memory_region_set_enabled(&xive->source.esb_mmio, enable);
     memory_region_set_enabled(&xive->tm_mmio, enable);
@@ -216,7 +216,7 @@ static void spapr_xive_end_reset(XiveEND *end)
 
 static void spapr_xive_reset(void *dev)
 {
-    sPAPRXive *xive = SPAPR_XIVE(dev);
+    SpaprXive *xive = SPAPR_XIVE(dev);
     int i;
 
     /*
@@ -242,7 +242,7 @@ static void spapr_xive_reset(void *dev)
 
 static void spapr_xive_instance_init(Object *obj)
 {
-    sPAPRXive *xive = SPAPR_XIVE(obj);
+    SpaprXive *xive = SPAPR_XIVE(obj);
 
     object_initialize_child(obj, "source", &xive->source, sizeof(xive->source),
                             TYPE_XIVE_SOURCE, &error_abort, NULL);
@@ -254,7 +254,7 @@ static void spapr_xive_instance_init(Object *obj)
 
 static void spapr_xive_realize(DeviceState *dev, Error **errp)
 {
-    sPAPRXive *xive = SPAPR_XIVE(dev);
+    SpaprXive *xive = SPAPR_XIVE(dev);
     XiveSource *xsrc = &xive->source;
     XiveENDSource *end_xsrc = &xive->end_source;
     Error *local_err = NULL;
@@ -325,7 +325,7 @@ static void spapr_xive_realize(DeviceState *dev, Error **errp)
 static int spapr_xive_get_eas(XiveRouter *xrtr, uint8_t eas_blk,
                               uint32_t eas_idx, XiveEAS *eas)
 {
-    sPAPRXive *xive = SPAPR_XIVE(xrtr);
+    SpaprXive *xive = SPAPR_XIVE(xrtr);
 
     if (eas_idx >= xive->nr_irqs) {
         return -1;
@@ -338,7 +338,7 @@ static int spapr_xive_get_eas(XiveRouter *xrtr, uint8_t eas_blk,
 static int spapr_xive_get_end(XiveRouter *xrtr,
                               uint8_t end_blk, uint32_t end_idx, XiveEND *end)
 {
-    sPAPRXive *xive = SPAPR_XIVE(xrtr);
+    SpaprXive *xive = SPAPR_XIVE(xrtr);
 
     if (end_idx >= xive->nr_ends) {
         return -1;
@@ -352,7 +352,7 @@ static int spapr_xive_write_end(XiveRouter *xrtr, uint8_t end_blk,
                                 uint32_t end_idx, XiveEND *end,
                                 uint8_t word_number)
 {
-    sPAPRXive *xive = SPAPR_XIVE(xrtr);
+    SpaprXive *xive = SPAPR_XIVE(xrtr);
 
     if (end_idx >= xive->nr_ends) {
         return -1;
@@ -432,20 +432,20 @@ static const VMStateDescription vmstate_spapr_xive = {
     .version_id = 1,
     .minimum_version_id = 1,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT32_EQUAL(nr_irqs, sPAPRXive, NULL),
-        VMSTATE_STRUCT_VARRAY_POINTER_UINT32(eat, sPAPRXive, nr_irqs,
+        VMSTATE_UINT32_EQUAL(nr_irqs, SpaprXive, NULL),
+        VMSTATE_STRUCT_VARRAY_POINTER_UINT32(eat, SpaprXive, nr_irqs,
                                      vmstate_spapr_xive_eas, XiveEAS),
-        VMSTATE_STRUCT_VARRAY_POINTER_UINT32(endt, sPAPRXive, nr_ends,
+        VMSTATE_STRUCT_VARRAY_POINTER_UINT32(endt, SpaprXive, nr_ends,
                                              vmstate_spapr_xive_end, XiveEND),
         VMSTATE_END_OF_LIST()
     },
 };
 
 static Property spapr_xive_properties[] = {
-    DEFINE_PROP_UINT32("nr-irqs", sPAPRXive, nr_irqs, 0),
-    DEFINE_PROP_UINT32("nr-ends", sPAPRXive, nr_ends, 0),
-    DEFINE_PROP_UINT64("vc-base", sPAPRXive, vc_base, SPAPR_XIVE_VC_BASE),
-    DEFINE_PROP_UINT64("tm-base", sPAPRXive, tm_base, SPAPR_XIVE_TM_BASE),
+    DEFINE_PROP_UINT32("nr-irqs", SpaprXive, nr_irqs, 0),
+    DEFINE_PROP_UINT32("nr-ends", SpaprXive, nr_ends, 0),
+    DEFINE_PROP_UINT64("vc-base", SpaprXive, vc_base, SPAPR_XIVE_VC_BASE),
+    DEFINE_PROP_UINT64("tm-base", SpaprXive, tm_base, SPAPR_XIVE_TM_BASE),
     DEFINE_PROP_END_OF_LIST(),
 };
 
@@ -471,7 +471,7 @@ static const TypeInfo spapr_xive_info = {
     .name = TYPE_SPAPR_XIVE,
     .parent = TYPE_XIVE_ROUTER,
     .instance_init = spapr_xive_instance_init,
-    .instance_size = sizeof(sPAPRXive),
+    .instance_size = sizeof(SpaprXive),
     .class_init = spapr_xive_class_init,
 };
 
@@ -482,7 +482,7 @@ static void spapr_xive_register_types(void)
 
 type_init(spapr_xive_register_types)
 
-bool spapr_xive_irq_claim(sPAPRXive *xive, uint32_t lisn, bool lsi)
+bool spapr_xive_irq_claim(SpaprXive *xive, uint32_t lisn, bool lsi)
 {
     XiveSource *xsrc = &xive->source;
 
@@ -497,7 +497,7 @@ bool spapr_xive_irq_claim(sPAPRXive *xive, uint32_t lisn, bool lsi)
     return true;
 }
 
-bool spapr_xive_irq_free(sPAPRXive *xive, uint32_t lisn)
+bool spapr_xive_irq_free(SpaprXive *xive, uint32_t lisn)
 {
     if (lisn >= xive->nr_irqs) {
         return false;
@@ -576,11 +576,11 @@ static bool spapr_xive_priority_is_reserved(uint8_t priority)
 #define SPAPR_XIVE_SRC_STORE_EOI     PPC_BIT(63) /* Store EOI support */
 
 static target_ulong h_int_get_source_info(PowerPCCPU *cpu,
-                                          sPAPRMachineState *spapr,
+                                          SpaprMachineState *spapr,
                                           target_ulong opcode,
                                           target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     XiveSource *xsrc = &xive->source;
     target_ulong flags  = args[0];
     target_ulong lisn   = args[1];
@@ -686,11 +686,11 @@ static target_ulong h_int_get_source_info(PowerPCCPU *cpu,
 #define SPAPR_XIVE_SRC_MASK     PPC_BIT(63)
 
 static target_ulong h_int_set_source_config(PowerPCCPU *cpu,
-                                            sPAPRMachineState *spapr,
+                                            SpaprMachineState *spapr,
                                             target_ulong opcode,
                                             target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     XiveEAS eas, new_eas;
     target_ulong flags    = args[0];
     target_ulong lisn     = args[1];
@@ -783,11 +783,11 @@ out:
  *       equivalent to the LISN if not changed by H_INT_SET_SOURCE_CONFIG)
  */
 static target_ulong h_int_get_source_config(PowerPCCPU *cpu,
-                                            sPAPRMachineState *spapr,
+                                            SpaprMachineState *spapr,
                                             target_ulong opcode,
                                             target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     target_ulong flags = args[0];
     target_ulong lisn = args[1];
     XiveEAS eas;
@@ -856,11 +856,11 @@ static target_ulong h_int_get_source_config(PowerPCCPU *cpu,
  * - R5: Power of 2 page size of the notification page
  */
 static target_ulong h_int_get_queue_info(PowerPCCPU *cpu,
-                                         sPAPRMachineState *spapr,
+                                         SpaprMachineState *spapr,
                                          target_ulong opcode,
                                          target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     XiveENDSource *end_xsrc = &xive->end_source;
     target_ulong flags = args[0];
     target_ulong target = args[1];
@@ -942,11 +942,11 @@ static target_ulong h_int_get_queue_info(PowerPCCPU *cpu,
 #define SPAPR_XIVE_END_ALWAYS_NOTIFY PPC_BIT(63)
 
 static target_ulong h_int_set_queue_config(PowerPCCPU *cpu,
-                                           sPAPRMachineState *spapr,
+                                           SpaprMachineState *spapr,
                                            target_ulong opcode,
                                            target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     target_ulong flags = args[0];
     target_ulong target = args[1];
     target_ulong priority = args[2];
@@ -1095,11 +1095,11 @@ out:
 #define SPAPR_XIVE_END_DEBUG     PPC_BIT(63)
 
 static target_ulong h_int_get_queue_config(PowerPCCPU *cpu,
-                                           sPAPRMachineState *spapr,
+                                           SpaprMachineState *spapr,
                                            target_ulong opcode,
                                            target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     target_ulong flags = args[0];
     target_ulong target = args[1];
     target_ulong priority = args[2];
@@ -1187,7 +1187,7 @@ static target_ulong h_int_get_queue_config(PowerPCCPU *cpu,
  * - None
  */
 static target_ulong h_int_set_os_reporting_line(PowerPCCPU *cpu,
-                                                sPAPRMachineState *spapr,
+                                                SpaprMachineState *spapr,
                                                 target_ulong opcode,
                                                 target_ulong *args)
 {
@@ -1223,7 +1223,7 @@ static target_ulong h_int_set_os_reporting_line(PowerPCCPU *cpu,
  * - R4: The logical real address of the reporting line if set, else -1
  */
 static target_ulong h_int_get_os_reporting_line(PowerPCCPU *cpu,
-                                                sPAPRMachineState *spapr,
+                                                SpaprMachineState *spapr,
                                                 target_ulong opcode,
                                                 target_ulong *args)
 {
@@ -1266,11 +1266,11 @@ static target_ulong h_int_get_os_reporting_line(PowerPCCPU *cpu,
 #define SPAPR_XIVE_ESB_STORE PPC_BIT(63)
 
 static target_ulong h_int_esb(PowerPCCPU *cpu,
-                              sPAPRMachineState *spapr,
+                              SpaprMachineState *spapr,
                               target_ulong opcode,
                               target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     XiveEAS eas;
     target_ulong flags  = args[0];
     target_ulong lisn   = args[1];
@@ -1334,11 +1334,11 @@ static target_ulong h_int_esb(PowerPCCPU *cpu,
  * - None
  */
 static target_ulong h_int_sync(PowerPCCPU *cpu,
-                               sPAPRMachineState *spapr,
+                               SpaprMachineState *spapr,
                                target_ulong opcode,
                                target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     XiveEAS eas;
     target_ulong flags = args[0];
     target_ulong lisn = args[1];
@@ -1388,11 +1388,11 @@ static target_ulong h_int_sync(PowerPCCPU *cpu,
  * - None
  */
 static target_ulong h_int_reset(PowerPCCPU *cpu,
-                                sPAPRMachineState *spapr,
+                                SpaprMachineState *spapr,
                                 target_ulong opcode,
                                 target_ulong *args)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     target_ulong flags   = args[0];
 
     if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) {
@@ -1407,7 +1407,7 @@ static target_ulong h_int_reset(PowerPCCPU *cpu,
     return H_SUCCESS;
 }
 
-void spapr_xive_hcall_init(sPAPRMachineState *spapr)
+void spapr_xive_hcall_init(SpaprMachineState *spapr)
 {
     spapr_register_hypercall(H_INT_GET_SOURCE_INFO, h_int_get_source_info);
     spapr_register_hypercall(H_INT_SET_SOURCE_CONFIG, h_int_set_source_config);
@@ -1424,10 +1424,10 @@ void spapr_xive_hcall_init(sPAPRMachineState *spapr)
     spapr_register_hypercall(H_INT_RESET, h_int_reset);
 }
 
-void spapr_dt_xive(sPAPRMachineState *spapr, uint32_t nr_servers, void *fdt,
+void spapr_dt_xive(SpaprMachineState *spapr, uint32_t nr_servers, void *fdt,
                    uint32_t phandle)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
     int node;
     uint64_t timas[2 * 2];
     /* Interrupt number ranges for the IPIs */
diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c
index c6e1b630a4..78a252e6df 100644
--- a/hw/intc/xics_kvm.c
+++ b/hw/intc/xics_kvm.c
@@ -291,7 +291,7 @@ void ics_kvm_set_irq(ICSState *ics, int srcno, int val)
     }
 }
 
-static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_dummy(PowerPCCPU *cpu, SpaprMachineState *spapr,
                        uint32_t token,
                        uint32_t nargs, target_ulong args,
                        uint32_t nret, target_ulong rets)
@@ -300,7 +300,7 @@ static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr,
                  __func__);
 }
 
-int xics_kvm_init(sPAPRMachineState *spapr, Error **errp)
+int xics_kvm_init(SpaprMachineState *spapr, Error **errp)
 {
     int rc;
 
diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c
index 53bda6661b..607e1c167b 100644
--- a/hw/intc/xics_spapr.c
+++ b/hw/intc/xics_spapr.c
@@ -41,7 +41,7 @@
  * Guest interfaces
  */
 
-static target_ulong h_cppr(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_cppr(PowerPCCPU *cpu, SpaprMachineState *spapr,
                            target_ulong opcode, target_ulong *args)
 {
     target_ulong cppr = args[0];
@@ -50,7 +50,7 @@ static target_ulong h_cppr(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_ipi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_ipi(PowerPCCPU *cpu, SpaprMachineState *spapr,
                           target_ulong opcode, target_ulong *args)
 {
     target_ulong mfrr = args[1];
@@ -64,7 +64,7 @@ static target_ulong h_ipi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_xirr(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_xirr(PowerPCCPU *cpu, SpaprMachineState *spapr,
                            target_ulong opcode, target_ulong *args)
 {
     uint32_t xirr = icp_accept(spapr_cpu_state(cpu)->icp);
@@ -73,7 +73,7 @@ static target_ulong h_xirr(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_xirr_x(PowerPCCPU *cpu, SpaprMachineState *spapr,
                              target_ulong opcode, target_ulong *args)
 {
     uint32_t xirr = icp_accept(spapr_cpu_state(cpu)->icp);
@@ -83,7 +83,7 @@ static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_eoi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_eoi(PowerPCCPU *cpu, SpaprMachineState *spapr,
                           target_ulong opcode, target_ulong *args)
 {
     target_ulong xirr = args[0];
@@ -92,7 +92,7 @@ static target_ulong h_eoi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_ipoll(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_ipoll(PowerPCCPU *cpu, SpaprMachineState *spapr,
                             target_ulong opcode, target_ulong *args)
 {
     uint32_t mfrr;
@@ -104,7 +104,7 @@ static target_ulong h_ipoll(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static void rtas_set_xive(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_set_xive(PowerPCCPU *cpu, SpaprMachineState *spapr,
                           uint32_t token,
                           uint32_t nargs, target_ulong args,
                           uint32_t nret, target_ulong rets)
@@ -137,7 +137,7 @@ static void rtas_set_xive(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static void rtas_get_xive(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_get_xive(PowerPCCPU *cpu, SpaprMachineState *spapr,
                           uint32_t token,
                           uint32_t nargs, target_ulong args,
                           uint32_t nret, target_ulong rets)
@@ -167,7 +167,7 @@ static void rtas_get_xive(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 2, ics->irqs[srcno].priority);
 }
 
-static void rtas_int_off(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_int_off(PowerPCCPU *cpu, SpaprMachineState *spapr,
                          uint32_t token,
                          uint32_t nargs, target_ulong args,
                          uint32_t nret, target_ulong rets)
@@ -198,7 +198,7 @@ static void rtas_int_off(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static void rtas_int_on(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_int_on(PowerPCCPU *cpu, SpaprMachineState *spapr,
                         uint32_t token,
                         uint32_t nargs, target_ulong args,
                         uint32_t nret, target_ulong rets)
@@ -230,7 +230,7 @@ static void rtas_int_on(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-void xics_spapr_init(sPAPRMachineState *spapr)
+void xics_spapr_init(SpaprMachineState *spapr)
 {
     /* Registration of global state belongs into realize */
     spapr_rtas_register(RTAS_IBM_SET_XIVE, "ibm,set-xive", rtas_set_xive);
@@ -246,7 +246,7 @@ void xics_spapr_init(sPAPRMachineState *spapr)
     spapr_register_hypercall(H_IPOLL, h_ipoll);
 }
 
-void spapr_dt_xics(sPAPRMachineState *spapr, uint32_t nr_servers, void *fdt,
+void spapr_dt_xics(SpaprMachineState *spapr, uint32_t nr_servers, void *fdt,
                    uint32_t phandle)
 {
     uint32_t interrupt_server_ranges_prop[] = {
diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c
index d239e4bd7d..63ba3929e9 100644
--- a/hw/net/spapr_llan.c
+++ b/hw/net/spapr_llan.c
@@ -84,7 +84,7 @@ typedef uint64_t vlan_bd_t;
 
 #define TYPE_VIO_SPAPR_VLAN_DEVICE "spapr-vlan"
 #define VIO_SPAPR_VLAN_DEVICE(obj) \
-     OBJECT_CHECK(VIOsPAPRVLANDevice, (obj), TYPE_VIO_SPAPR_VLAN_DEVICE)
+     OBJECT_CHECK(SpaprVioVlan, (obj), TYPE_VIO_SPAPR_VLAN_DEVICE)
 
 #define RX_POOL_MAX_BDS 4096
 #define RX_MAX_POOLS 5
@@ -95,8 +95,8 @@ typedef struct {
     vlan_bd_t bds[RX_POOL_MAX_BDS];
 } RxBufPool;
 
-typedef struct VIOsPAPRVLANDevice {
-    VIOsPAPRDevice sdev;
+typedef struct SpaprVioVlan {
+    SpaprVioDevice sdev;
     NICConf nicconf;
     NICState *nic;
     MACAddr perm_mac;
@@ -107,11 +107,11 @@ typedef struct VIOsPAPRVLANDevice {
     QEMUTimer *rxp_timer;
     uint32_t compat_flags;             /* Compatibility flags for migration */
     RxBufPool *rx_pool[RX_MAX_POOLS];  /* Receive buffer descriptor pools */
-} VIOsPAPRVLANDevice;
+} SpaprVioVlan;
 
 static int spapr_vlan_can_receive(NetClientState *nc)
 {
-    VIOsPAPRVLANDevice *dev = qemu_get_nic_opaque(nc);
+    SpaprVioVlan *dev = qemu_get_nic_opaque(nc);
 
     return (dev->isopen && dev->rx_bufs > 0);
 }
@@ -123,7 +123,7 @@ static int spapr_vlan_can_receive(NetClientState *nc)
  * suitable receive buffer available. This function is used to increase
  * this counter by one.
  */
-static void spapr_vlan_record_dropped_rx_frame(VIOsPAPRVLANDevice *dev)
+static void spapr_vlan_record_dropped_rx_frame(SpaprVioVlan *dev)
 {
     uint64_t cnt;
 
@@ -134,7 +134,7 @@ static void spapr_vlan_record_dropped_rx_frame(VIOsPAPRVLANDevice *dev)
 /**
  * Get buffer descriptor from one of our receive buffer pools
  */
-static vlan_bd_t spapr_vlan_get_rx_bd_from_pool(VIOsPAPRVLANDevice *dev,
+static vlan_bd_t spapr_vlan_get_rx_bd_from_pool(SpaprVioVlan *dev,
                                                 size_t size)
 {
     vlan_bd_t bd;
@@ -168,7 +168,7 @@ static vlan_bd_t spapr_vlan_get_rx_bd_from_pool(VIOsPAPRVLANDevice *dev,
  * Get buffer descriptor from the receive buffer list page that has been
  * supplied by the guest with the H_REGISTER_LOGICAL_LAN call
  */
-static vlan_bd_t spapr_vlan_get_rx_bd_from_page(VIOsPAPRVLANDevice *dev,
+static vlan_bd_t spapr_vlan_get_rx_bd_from_page(SpaprVioVlan *dev,
                                                 size_t size)
 {
     int buf_ptr = dev->use_buf_ptr;
@@ -203,8 +203,8 @@ static vlan_bd_t spapr_vlan_get_rx_bd_from_page(VIOsPAPRVLANDevice *dev,
 static ssize_t spapr_vlan_receive(NetClientState *nc, const uint8_t *buf,
                                   size_t size)
 {
-    VIOsPAPRVLANDevice *dev = qemu_get_nic_opaque(nc);
-    VIOsPAPRDevice *sdev = VIO_SPAPR_DEVICE(dev);
+    SpaprVioVlan *dev = qemu_get_nic_opaque(nc);
+    SpaprVioDevice *sdev = VIO_SPAPR_DEVICE(dev);
     vlan_bd_t rxq_bd = vio_ldq(sdev, dev->buf_list + VLAN_RXQ_BD_OFF);
     vlan_bd_t bd;
     uint64_t handle;
@@ -280,7 +280,7 @@ static NetClientInfo net_spapr_vlan_info = {
 
 static void spapr_vlan_flush_rx_queue(void *opaque)
 {
-    VIOsPAPRVLANDevice *dev = opaque;
+    SpaprVioVlan *dev = opaque;
 
     qemu_flush_queued_packets(qemu_get_queue(dev->nic));
 }
@@ -296,9 +296,9 @@ static void spapr_vlan_reset_rx_pool(RxBufPool *rxp)
     memset(rxp->bds, 0, sizeof(rxp->bds));
 }
 
-static void spapr_vlan_reset(VIOsPAPRDevice *sdev)
+static void spapr_vlan_reset(SpaprVioDevice *sdev)
 {
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
     int i;
 
     dev->buf_list = 0;
@@ -316,9 +316,9 @@ static void spapr_vlan_reset(VIOsPAPRDevice *sdev)
     qemu_format_nic_info_str(qemu_get_queue(dev->nic), dev->nicconf.macaddr.a);
 }
 
-static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Error **errp)
+static void spapr_vlan_realize(SpaprVioDevice *sdev, Error **errp)
 {
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
 
     qemu_macaddr_default_if_unset(&dev->nicconf.macaddr);
 
@@ -334,7 +334,7 @@ static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Error **errp)
 
 static void spapr_vlan_instance_init(Object *obj)
 {
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(obj);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(obj);
     int i;
 
     device_add_bootindex_property(obj, &dev->nicconf.bootindex,
@@ -351,7 +351,7 @@ static void spapr_vlan_instance_init(Object *obj)
 
 static void spapr_vlan_instance_finalize(Object *obj)
 {
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(obj);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(obj);
     int i;
 
     if (dev->compat_flags & SPAPRVLAN_FLAG_RX_BUF_POOLS) {
@@ -367,7 +367,7 @@ static void spapr_vlan_instance_finalize(Object *obj)
     }
 }
 
-void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd)
+void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd)
 {
     DeviceState *dev;
 
@@ -378,9 +378,9 @@ void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd)
     qdev_init_nofail(dev);
 }
 
-static int spapr_vlan_devnode(VIOsPAPRDevice *dev, void *fdt, int node_off)
+static int spapr_vlan_devnode(SpaprVioDevice *dev, void *fdt, int node_off)
 {
-    VIOsPAPRVLANDevice *vdev = VIO_SPAPR_VLAN_DEVICE(dev);
+    SpaprVioVlan *vdev = VIO_SPAPR_VLAN_DEVICE(dev);
     uint8_t padded_mac[8] = {0, 0};
     int ret;
 
@@ -415,7 +415,7 @@ static int spapr_vlan_devnode(VIOsPAPRDevice *dev, void *fdt, int node_off)
     return 0;
 }
 
-static int check_bd(VIOsPAPRVLANDevice *dev, vlan_bd_t bd,
+static int check_bd(SpaprVioVlan *dev, vlan_bd_t bd,
                     target_ulong alignment)
 {
     if ((VLAN_BD_ADDR(bd) % alignment)
@@ -434,7 +434,7 @@ static int check_bd(VIOsPAPRVLANDevice *dev, vlan_bd_t bd,
 }
 
 static target_ulong h_register_logical_lan(PowerPCCPU *cpu,
-                                           sPAPRMachineState *spapr,
+                                           SpaprMachineState *spapr,
                                            target_ulong opcode,
                                            target_ulong *args)
 {
@@ -442,8 +442,8 @@ static target_ulong h_register_logical_lan(PowerPCCPU *cpu,
     target_ulong buf_list = args[1];
     target_ulong rec_queue = args[2];
     target_ulong filter_list = args[3];
-    VIOsPAPRDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
+    SpaprVioDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
     vlan_bd_t filter_list_bd;
 
     if (!dev) {
@@ -500,12 +500,12 @@ static target_ulong h_register_logical_lan(PowerPCCPU *cpu,
 
 
 static target_ulong h_free_logical_lan(PowerPCCPU *cpu,
-                                       sPAPRMachineState *spapr,
+                                       SpaprMachineState *spapr,
                                        target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
-    VIOsPAPRDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
+    SpaprVioDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
 
     if (!dev) {
         return H_PARAMETER;
@@ -539,7 +539,7 @@ static int rx_pool_size_compare(const void *p1, const void *p2)
  * Search for a matching buffer pool with exact matching size,
  * or return -1 if no matching pool has been found.
  */
-static int spapr_vlan_get_rx_pool_id(VIOsPAPRVLANDevice *dev, int size)
+static int spapr_vlan_get_rx_pool_id(SpaprVioVlan *dev, int size)
 {
     int pool;
 
@@ -555,7 +555,7 @@ static int spapr_vlan_get_rx_pool_id(VIOsPAPRVLANDevice *dev, int size)
 /**
  * Enqueuing receive buffer by adding it to one of our receive buffer pools
  */
-static target_long spapr_vlan_add_rxbuf_to_pool(VIOsPAPRVLANDevice *dev,
+static target_long spapr_vlan_add_rxbuf_to_pool(SpaprVioVlan *dev,
                                                 target_ulong buf)
 {
     int size = VLAN_BD_LEN(buf);
@@ -602,7 +602,7 @@ static target_long spapr_vlan_add_rxbuf_to_pool(VIOsPAPRVLANDevice *dev,
  * This is the old way of enqueuing receive buffers: Add it to the rx queue
  * page that has been supplied by the guest (which is quite limited in size).
  */
-static target_long spapr_vlan_add_rxbuf_to_page(VIOsPAPRVLANDevice *dev,
+static target_long spapr_vlan_add_rxbuf_to_page(SpaprVioVlan *dev,
                                                 target_ulong buf)
 {
     vlan_bd_t bd;
@@ -628,14 +628,14 @@ static target_long spapr_vlan_add_rxbuf_to_page(VIOsPAPRVLANDevice *dev,
 }
 
 static target_ulong h_add_logical_lan_buffer(PowerPCCPU *cpu,
-                                             sPAPRMachineState *spapr,
+                                             SpaprMachineState *spapr,
                                              target_ulong opcode,
                                              target_ulong *args)
 {
     target_ulong reg = args[0];
     target_ulong buf = args[1];
-    VIOsPAPRDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
+    SpaprVioDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
     target_long ret;
 
     trace_spapr_vlan_h_add_logical_lan_buffer(reg, buf);
@@ -678,14 +678,14 @@ static target_ulong h_add_logical_lan_buffer(PowerPCCPU *cpu,
 }
 
 static target_ulong h_send_logical_lan(PowerPCCPU *cpu,
-                                       sPAPRMachineState *spapr,
+                                       SpaprMachineState *spapr,
                                        target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
     target_ulong *bufs = args + 1;
     target_ulong continue_token = args[7];
-    VIOsPAPRDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
+    SpaprVioDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
     unsigned total_len;
     uint8_t *lbuf, *p;
     int i, nbufs;
@@ -745,11 +745,11 @@ static target_ulong h_send_logical_lan(PowerPCCPU *cpu,
     return H_SUCCESS;
 }
 
-static target_ulong h_multicast_ctrl(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_multicast_ctrl(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                      target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
-    VIOsPAPRDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
 
     if (!dev) {
         return H_PARAMETER;
@@ -759,14 +759,14 @@ static target_ulong h_multicast_ctrl(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 }
 
 static target_ulong h_change_logical_lan_mac(PowerPCCPU *cpu,
-                                             sPAPRMachineState *spapr,
+                                             SpaprMachineState *spapr,
                                              target_ulong opcode,
                                              target_ulong *args)
 {
     target_ulong reg = args[0];
     target_ulong macaddr = args[1];
-    VIOsPAPRDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
-    VIOsPAPRVLANDevice *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
+    SpaprVioDevice *sdev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioVlan *dev = VIO_SPAPR_VLAN_DEVICE(sdev);
     int i;
 
     for (i = 0; i < ETH_ALEN; i++) {
@@ -780,16 +780,16 @@ static target_ulong h_change_logical_lan_mac(PowerPCCPU *cpu,
 }
 
 static Property spapr_vlan_properties[] = {
-    DEFINE_SPAPR_PROPERTIES(VIOsPAPRVLANDevice, sdev),
-    DEFINE_NIC_PROPERTIES(VIOsPAPRVLANDevice, nicconf),
-    DEFINE_PROP_BIT("use-rx-buffer-pools", VIOsPAPRVLANDevice,
+    DEFINE_SPAPR_PROPERTIES(SpaprVioVlan, sdev),
+    DEFINE_NIC_PROPERTIES(SpaprVioVlan, nicconf),
+    DEFINE_PROP_BIT("use-rx-buffer-pools", SpaprVioVlan,
                     compat_flags, SPAPRVLAN_FLAG_RX_BUF_POOLS_BIT, true),
     DEFINE_PROP_END_OF_LIST(),
 };
 
 static bool spapr_vlan_rx_buffer_pools_needed(void *opaque)
 {
-    VIOsPAPRVLANDevice *dev = opaque;
+    SpaprVioVlan *dev = opaque;
 
     return (dev->compat_flags & SPAPRVLAN_FLAG_RX_BUF_POOLS) != 0;
 }
@@ -813,7 +813,7 @@ static const VMStateDescription vmstate_rx_pools = {
     .minimum_version_id = 1,
     .needed = spapr_vlan_rx_buffer_pools_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_ARRAY_OF_POINTER_TO_STRUCT(rx_pool, VIOsPAPRVLANDevice,
+        VMSTATE_ARRAY_OF_POINTER_TO_STRUCT(rx_pool, SpaprVioVlan,
                                            RX_MAX_POOLS, 1,
                                            vmstate_rx_buffer_pool, RxBufPool),
         VMSTATE_END_OF_LIST()
@@ -825,14 +825,14 @@ static const VMStateDescription vmstate_spapr_llan = {
     .version_id = 1,
     .minimum_version_id = 1,
     .fields = (VMStateField[]) {
-        VMSTATE_SPAPR_VIO(sdev, VIOsPAPRVLANDevice),
+        VMSTATE_SPAPR_VIO(sdev, SpaprVioVlan),
         /* LLAN state */
-        VMSTATE_BOOL(isopen, VIOsPAPRVLANDevice),
-        VMSTATE_UINT64(buf_list, VIOsPAPRVLANDevice),
-        VMSTATE_UINT32(add_buf_ptr, VIOsPAPRVLANDevice),
-        VMSTATE_UINT32(use_buf_ptr, VIOsPAPRVLANDevice),
-        VMSTATE_UINT32(rx_bufs, VIOsPAPRVLANDevice),
-        VMSTATE_UINT64(rxq_ptr, VIOsPAPRVLANDevice),
+        VMSTATE_BOOL(isopen, SpaprVioVlan),
+        VMSTATE_UINT64(buf_list, SpaprVioVlan),
+        VMSTATE_UINT32(add_buf_ptr, SpaprVioVlan),
+        VMSTATE_UINT32(use_buf_ptr, SpaprVioVlan),
+        VMSTATE_UINT32(rx_bufs, SpaprVioVlan),
+        VMSTATE_UINT64(rxq_ptr, SpaprVioVlan),
 
         VMSTATE_END_OF_LIST()
     },
@@ -845,7 +845,7 @@ static const VMStateDescription vmstate_spapr_llan = {
 static void spapr_vlan_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
+    SpaprVioDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
 
     k->realize = spapr_vlan_realize;
     k->reset = spapr_vlan_reset;
@@ -863,7 +863,7 @@ static void spapr_vlan_class_init(ObjectClass *klass, void *data)
 static const TypeInfo spapr_vlan_info = {
     .name          = TYPE_VIO_SPAPR_VLAN_DEVICE,
     .parent        = TYPE_VIO_SPAPR_DEVICE,
-    .instance_size = sizeof(VIOsPAPRVLANDevice),
+    .instance_size = sizeof(SpaprVioVlan),
     .class_init    = spapr_vlan_class_init,
     .instance_init = spapr_vlan_instance_init,
     .instance_finalize = spapr_vlan_instance_finalize,
diff --git a/hw/nvram/spapr_nvram.c b/hw/nvram/spapr_nvram.c
index bed1557d83..c98c7576e6 100644
--- a/hw/nvram/spapr_nvram.c
+++ b/hw/nvram/spapr_nvram.c
@@ -36,28 +36,28 @@
 #include "hw/ppc/spapr.h"
 #include "hw/ppc/spapr_vio.h"
 
-typedef struct sPAPRNVRAM {
-    VIOsPAPRDevice sdev;
+typedef struct SpaprNvram {
+    SpaprVioDevice sdev;
     uint32_t size;
     uint8_t *buf;
     BlockBackend *blk;
     VMChangeStateEntry *vmstate;
-} sPAPRNVRAM;
+} SpaprNvram;
 
 #define TYPE_VIO_SPAPR_NVRAM "spapr-nvram"
 #define VIO_SPAPR_NVRAM(obj) \
-     OBJECT_CHECK(sPAPRNVRAM, (obj), TYPE_VIO_SPAPR_NVRAM)
+     OBJECT_CHECK(SpaprNvram, (obj), TYPE_VIO_SPAPR_NVRAM)
 
 #define MIN_NVRAM_SIZE      (8 * KiB)
 #define DEFAULT_NVRAM_SIZE  (64 * KiB)
 #define MAX_NVRAM_SIZE      (1 * MiB)
 
-static void rtas_nvram_fetch(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_nvram_fetch(PowerPCCPU *cpu, SpaprMachineState *spapr,
                              uint32_t token, uint32_t nargs,
                              target_ulong args,
                              uint32_t nret, target_ulong rets)
 {
-    sPAPRNVRAM *nvram = spapr->nvram;
+    SpaprNvram *nvram = spapr->nvram;
     hwaddr offset, buffer, len;
     void *membuf;
 
@@ -93,12 +93,12 @@ static void rtas_nvram_fetch(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 1, len);
 }
 
-static void rtas_nvram_store(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_nvram_store(PowerPCCPU *cpu, SpaprMachineState *spapr,
                              uint32_t token, uint32_t nargs,
                              target_ulong args,
                              uint32_t nret, target_ulong rets)
 {
-    sPAPRNVRAM *nvram = spapr->nvram;
+    SpaprNvram *nvram = spapr->nvram;
     hwaddr offset, buffer, len;
     int alen;
     void *membuf;
@@ -139,9 +139,9 @@ static void rtas_nvram_store(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 1, (alen < 0) ? 0 : alen);
 }
 
-static void spapr_nvram_realize(VIOsPAPRDevice *dev, Error **errp)
+static void spapr_nvram_realize(SpaprVioDevice *dev, Error **errp)
 {
-    sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(dev);
+    SpaprNvram *nvram = VIO_SPAPR_NVRAM(dev);
     int ret;
 
     if (nvram->blk) {
@@ -193,16 +193,16 @@ static void spapr_nvram_realize(VIOsPAPRDevice *dev, Error **errp)
     spapr_rtas_register(RTAS_NVRAM_STORE, "nvram-store", rtas_nvram_store);
 }
 
-static int spapr_nvram_devnode(VIOsPAPRDevice *dev, void *fdt, int node_off)
+static int spapr_nvram_devnode(SpaprVioDevice *dev, void *fdt, int node_off)
 {
-    sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(dev);
+    SpaprNvram *nvram = VIO_SPAPR_NVRAM(dev);
 
     return fdt_setprop_cell(fdt, node_off, "#bytes", nvram->size);
 }
 
 static int spapr_nvram_pre_load(void *opaque)
 {
-    sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(opaque);
+    SpaprNvram *nvram = VIO_SPAPR_NVRAM(opaque);
 
     g_free(nvram->buf);
     nvram->buf = NULL;
@@ -213,7 +213,7 @@ static int spapr_nvram_pre_load(void *opaque)
 
 static void postload_update_cb(void *opaque, int running, RunState state)
 {
-    sPAPRNVRAM *nvram = opaque;
+    SpaprNvram *nvram = opaque;
 
     /* This is called after bdrv_invalidate_cache_all.  */
 
@@ -225,7 +225,7 @@ static void postload_update_cb(void *opaque, int running, RunState state)
 
 static int spapr_nvram_post_load(void *opaque, int version_id)
 {
-    sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(opaque);
+    SpaprNvram *nvram = VIO_SPAPR_NVRAM(opaque);
 
     if (nvram->blk) {
         nvram->vmstate = qemu_add_vm_change_state_handler(postload_update_cb,
@@ -242,22 +242,22 @@ static const VMStateDescription vmstate_spapr_nvram = {
     .pre_load = spapr_nvram_pre_load,
     .post_load = spapr_nvram_post_load,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT32(size, sPAPRNVRAM),
-        VMSTATE_VBUFFER_ALLOC_UINT32(buf, sPAPRNVRAM, 1, NULL, size),
+        VMSTATE_UINT32(size, SpaprNvram),
+        VMSTATE_VBUFFER_ALLOC_UINT32(buf, SpaprNvram, 1, NULL, size),
         VMSTATE_END_OF_LIST()
     },
 };
 
 static Property spapr_nvram_properties[] = {
-    DEFINE_SPAPR_PROPERTIES(sPAPRNVRAM, sdev),
-    DEFINE_PROP_DRIVE("drive", sPAPRNVRAM, blk),
+    DEFINE_SPAPR_PROPERTIES(SpaprNvram, sdev),
+    DEFINE_PROP_DRIVE("drive", SpaprNvram, blk),
     DEFINE_PROP_END_OF_LIST(),
 };
 
 static void spapr_nvram_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
+    SpaprVioDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
 
     k->realize = spapr_nvram_realize;
     k->devnode = spapr_nvram_devnode;
@@ -274,7 +274,7 @@ static void spapr_nvram_class_init(ObjectClass *klass, void *data)
 static const TypeInfo spapr_nvram_type_info = {
     .name          = TYPE_VIO_SPAPR_NVRAM,
     .parent        = TYPE_VIO_SPAPR_DEVICE,
-    .instance_size = sizeof(sPAPRNVRAM),
+    .instance_size = sizeof(SpaprNvram),
     .class_init    = spapr_nvram_class_init,
 };
 
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index e764e89806..6c16d6cfaf 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -103,13 +103,13 @@
  * all and one to identify thread 0 of a VCORE. Any change to the first one
  * is likely to have an impact on the second one, so let's keep them close.
  */
-static int spapr_vcpu_id(sPAPRMachineState *spapr, int cpu_index)
+static int spapr_vcpu_id(SpaprMachineState *spapr, int cpu_index)
 {
     assert(spapr->vsmt);
     return
         (cpu_index / smp_threads) * spapr->vsmt + cpu_index % smp_threads;
 }
-static bool spapr_is_thread0_in_vcore(sPAPRMachineState *spapr,
+static bool spapr_is_thread0_in_vcore(SpaprMachineState *spapr,
                                       PowerPCCPU *cpu)
 {
     assert(spapr->vsmt);
@@ -150,7 +150,7 @@ static void pre_2_10_vmstate_unregister_dummy_icp(int i)
                        (void *)(uintptr_t) i);
 }
 
-int spapr_max_server_number(sPAPRMachineState *spapr)
+int spapr_max_server_number(SpaprMachineState *spapr)
 {
     assert(spapr->vsmt);
     return DIV_ROUND_UP(max_cpus * spapr->vsmt, smp_threads);
@@ -205,7 +205,7 @@ static int spapr_fixup_cpu_numa_dt(void *fdt, int offset, PowerPCCPU *cpu)
 }
 
 /* Populate the "ibm,pa-features" property */
-static void spapr_populate_pa_features(sPAPRMachineState *spapr,
+static void spapr_populate_pa_features(SpaprMachineState *spapr,
                                        PowerPCCPU *cpu,
                                        void *fdt, int offset,
                                        bool legacy_guest)
@@ -284,7 +284,7 @@ static void spapr_populate_pa_features(sPAPRMachineState *spapr,
     _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size)));
 }
 
-static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr)
+static int spapr_fixup_cpu_dt(void *fdt, SpaprMachineState *spapr)
 {
     int ret = 0, offset, cpus_offset;
     CPUState *cs;
@@ -387,7 +387,7 @@ static int spapr_populate_memory_node(void *fdt, int nodeid, hwaddr start,
     return off;
 }
 
-static int spapr_populate_memory(sPAPRMachineState *spapr, void *fdt)
+static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt)
 {
     MachineState *machine = MACHINE(spapr);
     hwaddr mem_start, node_size;
@@ -439,7 +439,7 @@ static int spapr_populate_memory(sPAPRMachineState *spapr, void *fdt)
 }
 
 static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
-                                  sPAPRMachineState *spapr)
+                                  SpaprMachineState *spapr)
 {
     PowerPCCPU *cpu = POWERPC_CPU(cs);
     CPUPPCState *env = &cpu->env;
@@ -455,7 +455,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
     uint32_t vcpus_per_socket = smp_threads * smp_cores;
     uint32_t pft_size_prop[] = {0, cpu_to_be32(spapr->htab_shift)};
     int compat_smt = MIN(smp_threads, ppc_compat_max_vthreads(cpu));
-    sPAPRDRConnector *drc;
+    SpaprDrc *drc;
     int drc_index;
     uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ];
     int i;
@@ -568,7 +568,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
                               pcc->lrg_decr_bits)));
 }
 
-static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr)
+static void spapr_populate_cpus_dt_node(void *fdt, SpaprMachineState *spapr)
 {
     CPUState **rev;
     CPUState *cs;
@@ -692,7 +692,7 @@ spapr_get_drconf_cell(uint32_t seq_lmbs, uint64_t base_addr,
 }
 
 /* ibm,dynamic-memory-v2 */
-static int spapr_populate_drmem_v2(sPAPRMachineState *spapr, void *fdt,
+static int spapr_populate_drmem_v2(SpaprMachineState *spapr, void *fdt,
                                    int offset, MemoryDeviceInfoList *dimms)
 {
     MachineState *machine = MACHINE(spapr);
@@ -704,7 +704,7 @@ static int spapr_populate_drmem_v2(sPAPRMachineState *spapr, void *fdt,
     uint64_t mem_end = machine->device_memory->base +
                        memory_region_size(&machine->device_memory->mr);
     uint32_t node, buf_len, nr_entries = 0;
-    sPAPRDRConnector *drc;
+    SpaprDrc *drc;
     DrconfCellQueue *elem, *next;
     MemoryDeviceInfoList *info;
     QSIMPLEQ_HEAD(, DrconfCellQueue) drconf_queue
@@ -777,7 +777,7 @@ static int spapr_populate_drmem_v2(sPAPRMachineState *spapr, void *fdt,
 }
 
 /* ibm,dynamic-memory */
-static int spapr_populate_drmem_v1(sPAPRMachineState *spapr, void *fdt,
+static int spapr_populate_drmem_v1(SpaprMachineState *spapr, void *fdt,
                                    int offset, MemoryDeviceInfoList *dimms)
 {
     MachineState *machine = MACHINE(spapr);
@@ -801,7 +801,7 @@ static int spapr_populate_drmem_v1(sPAPRMachineState *spapr, void *fdt,
         uint32_t *dynamic_memory = cur_index;
 
         if (i >= device_lmb_start) {
-            sPAPRDRConnector *drc;
+            SpaprDrc *drc;
 
             drc = spapr_drc_by_id(TYPE_SPAPR_DRC_LMB, i);
             g_assert(drc);
@@ -846,7 +846,7 @@ static int spapr_populate_drmem_v1(sPAPRMachineState *spapr, void *fdt,
  * Refer to docs/specs/ppc-spapr-hotplug.txt for the documentation
  * of this device tree node.
  */
-static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
+static int spapr_populate_drconf_memory(SpaprMachineState *spapr, void *fdt)
 {
     MachineState *machine = MACHINE(spapr);
     int ret, i, offset;
@@ -917,10 +917,10 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
     return ret;
 }
 
-static int spapr_dt_cas_updates(sPAPRMachineState *spapr, void *fdt,
-                                sPAPROptionVector *ov5_updates)
+static int spapr_dt_cas_updates(SpaprMachineState *spapr, void *fdt,
+                                SpaprOptionVector *ov5_updates)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
     int ret = 0, offset;
 
     /* Generate ibm,dynamic-reconfiguration-memory node if required */
@@ -966,12 +966,12 @@ static bool spapr_hotplugged_dev_before_cas(void)
     return false;
 }
 
-int spapr_h_cas_compose_response(sPAPRMachineState *spapr,
+int spapr_h_cas_compose_response(SpaprMachineState *spapr,
                                  target_ulong addr, target_ulong size,
-                                 sPAPROptionVector *ov5_updates)
+                                 SpaprOptionVector *ov5_updates)
 {
     void *fdt, *fdt_skel;
-    sPAPRDeviceTreeUpdateHeader hdr = { .version_id = 1 };
+    SpaprDeviceTreeUpdateHeader hdr = { .version_id = 1 };
 
     if (spapr_hotplugged_dev_before_cas()) {
         return 1;
@@ -1020,7 +1020,7 @@ int spapr_h_cas_compose_response(sPAPRMachineState *spapr,
     return 0;
 }
 
-static void spapr_dt_rtas(sPAPRMachineState *spapr, void *fdt)
+static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
 {
     int rtas;
     GString *hypertas = g_string_sized_new(256);
@@ -1109,7 +1109,7 @@ static void spapr_dt_rtas(sPAPRMachineState *spapr, void *fdt)
  * and the XIVE features that the guest may request and thus the valid
  * values for bytes 23..26 of option vector 5:
  */
-static void spapr_dt_ov5_platform_support(sPAPRMachineState *spapr, void *fdt,
+static void spapr_dt_ov5_platform_support(SpaprMachineState *spapr, void *fdt,
                                           int chosen)
 {
     PowerPCCPU *first_ppc_cpu = POWERPC_CPU(first_cpu);
@@ -1145,7 +1145,7 @@ static void spapr_dt_ov5_platform_support(sPAPRMachineState *spapr, void *fdt,
                      val, sizeof(val)));
 }
 
-static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt)
+static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt)
 {
     MachineState *machine = MACHINE(spapr);
     int chosen;
@@ -1211,7 +1211,7 @@ static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt)
     g_free(bootlist);
 }
 
-static void spapr_dt_hypervisor(sPAPRMachineState *spapr, void *fdt)
+static void spapr_dt_hypervisor(SpaprMachineState *spapr, void *fdt)
 {
     /* The /hypervisor node isn't in PAPR - this is a hack to allow PR
      * KVM to work under pHyp with some guest co-operation */
@@ -1234,14 +1234,14 @@ static void spapr_dt_hypervisor(sPAPRMachineState *spapr, void *fdt)
     }
 }
 
-static void *spapr_build_fdt(sPAPRMachineState *spapr)
+static void *spapr_build_fdt(SpaprMachineState *spapr)
 {
     MachineState *machine = MACHINE(spapr);
     MachineClass *mc = MACHINE_GET_CLASS(machine);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
     int ret;
     void *fdt;
-    sPAPRPHBState *phb;
+    SpaprPhbState *phb;
     char *buf;
 
     fdt = g_malloc0(FDT_MAX_SIZE);
@@ -1439,7 +1439,7 @@ void spapr_set_all_lpcrs(target_ulong value, target_ulong mask)
 
 static void spapr_get_pate(PPCVirtualHypervisor *vhyp, ppc_v3_pate_t *entry)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
+    SpaprMachineState *spapr = SPAPR_MACHINE(vhyp);
 
     /* Copy PATE1:GR into PATE0:HR */
     entry->dw0 = spapr->patb_entry & PATE0_HR;
@@ -1455,7 +1455,7 @@ static void spapr_get_pate(PPCVirtualHypervisor *vhyp, ppc_v3_pate_t *entry)
 /*
  * Get the fd to access the kernel htab, re-opening it if necessary
  */
-static int get_htab_fd(sPAPRMachineState *spapr)
+static int get_htab_fd(SpaprMachineState *spapr)
 {
     Error *local_err = NULL;
 
@@ -1471,7 +1471,7 @@ static int get_htab_fd(sPAPRMachineState *spapr)
     return spapr->htab_fd;
 }
 
-void close_htab_fd(sPAPRMachineState *spapr)
+void close_htab_fd(SpaprMachineState *spapr)
 {
     if (spapr->htab_fd >= 0) {
         close(spapr->htab_fd);
@@ -1481,14 +1481,14 @@ void close_htab_fd(sPAPRMachineState *spapr)
 
 static hwaddr spapr_hpt_mask(PPCVirtualHypervisor *vhyp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
+    SpaprMachineState *spapr = SPAPR_MACHINE(vhyp);
 
     return HTAB_SIZE(spapr) / HASH_PTEG_SIZE_64 - 1;
 }
 
 static target_ulong spapr_encode_hpt_for_kvm_pr(PPCVirtualHypervisor *vhyp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
+    SpaprMachineState *spapr = SPAPR_MACHINE(vhyp);
 
     assert(kvm_enabled());
 
@@ -1502,7 +1502,7 @@ static target_ulong spapr_encode_hpt_for_kvm_pr(PPCVirtualHypervisor *vhyp)
 static const ppc_hash_pte64_t *spapr_map_hptes(PPCVirtualHypervisor *vhyp,
                                                 hwaddr ptex, int n)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
+    SpaprMachineState *spapr = SPAPR_MACHINE(vhyp);
     hwaddr pte_offset = ptex * HASH_PTE_SIZE_64;
 
     if (!spapr->htab) {
@@ -1525,7 +1525,7 @@ static void spapr_unmap_hptes(PPCVirtualHypervisor *vhyp,
                               const ppc_hash_pte64_t *hptes,
                               hwaddr ptex, int n)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
+    SpaprMachineState *spapr = SPAPR_MACHINE(vhyp);
 
     if (!spapr->htab) {
         g_free((void *)hptes);
@@ -1537,7 +1537,7 @@ static void spapr_unmap_hptes(PPCVirtualHypervisor *vhyp,
 static void spapr_store_hpte(PPCVirtualHypervisor *vhyp, hwaddr ptex,
                              uint64_t pte0, uint64_t pte1)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(vhyp);
+    SpaprMachineState *spapr = SPAPR_MACHINE(vhyp);
     hwaddr offset = ptex * HASH_PTE_SIZE_64;
 
     if (!spapr->htab) {
@@ -1578,7 +1578,7 @@ int spapr_hpt_shift_for_ramsize(uint64_t ramsize)
     return shift;
 }
 
-void spapr_free_hpt(sPAPRMachineState *spapr)
+void spapr_free_hpt(SpaprMachineState *spapr)
 {
     g_free(spapr->htab);
     spapr->htab = NULL;
@@ -1586,7 +1586,7 @@ void spapr_free_hpt(sPAPRMachineState *spapr)
     close_htab_fd(spapr);
 }
 
-void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
+void spapr_reallocate_hpt(SpaprMachineState *spapr, int shift,
                           Error **errp)
 {
     long rc;
@@ -1636,7 +1636,7 @@ void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
     spapr_set_all_lpcrs(0, LPCR_HR | LPCR_UPRT);
 }
 
-void spapr_setup_hpt_and_vrma(sPAPRMachineState *spapr)
+void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr)
 {
     int hpt_shift;
 
@@ -1660,8 +1660,8 @@ void spapr_setup_hpt_and_vrma(sPAPRMachineState *spapr)
 
 static int spapr_reset_drcs(Object *child, void *opaque)
 {
-    sPAPRDRConnector *drc =
-        (sPAPRDRConnector *) object_dynamic_cast(child,
+    SpaprDrc *drc =
+        (SpaprDrc *) object_dynamic_cast(child,
                                                  TYPE_SPAPR_DR_CONNECTOR);
 
     if (drc) {
@@ -1674,7 +1674,7 @@ static int spapr_reset_drcs(Object *child, void *opaque)
 static void spapr_machine_reset(void)
 {
     MachineState *machine = MACHINE(qdev_get_machine());
-    sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
+    SpaprMachineState *spapr = SPAPR_MACHINE(machine);
     PowerPCCPU *first_ppc_cpu;
     uint32_t rtas_limit;
     hwaddr rtas_addr, fdt_addr;
@@ -1779,7 +1779,7 @@ static void spapr_machine_reset(void)
     spapr->cas_reboot = false;
 }
 
-static void spapr_create_nvram(sPAPRMachineState *spapr)
+static void spapr_create_nvram(SpaprMachineState *spapr)
 {
     DeviceState *dev = qdev_create(&spapr->vio_bus->bus, "spapr-nvram");
     DriveInfo *dinfo = drive_get(IF_PFLASH, 0, 0);
@@ -1791,10 +1791,10 @@ static void spapr_create_nvram(sPAPRMachineState *spapr)
 
     qdev_init_nofail(dev);
 
-    spapr->nvram = (struct sPAPRNVRAM *)dev;
+    spapr->nvram = (struct SpaprNvram *)dev;
 }
 
-static void spapr_rtc_create(sPAPRMachineState *spapr)
+static void spapr_rtc_create(SpaprMachineState *spapr)
 {
     object_initialize_child(OBJECT(spapr), "rtc",
                             &spapr->rtc, sizeof(spapr->rtc), TYPE_SPAPR_RTC,
@@ -1838,7 +1838,7 @@ static int spapr_pre_load(void *opaque)
 
 static int spapr_post_load(void *opaque, int version_id)
 {
-    sPAPRMachineState *spapr = (sPAPRMachineState *)opaque;
+    SpaprMachineState *spapr = (SpaprMachineState *)opaque;
     int err = 0;
 
     err = spapr_caps_post_migration(spapr);
@@ -1905,7 +1905,7 @@ static bool version_before_3(void *opaque, int version_id)
 
 static bool spapr_pending_events_needed(void *opaque)
 {
-    sPAPRMachineState *spapr = (sPAPRMachineState *)opaque;
+    SpaprMachineState *spapr = (SpaprMachineState *)opaque;
     return !QTAILQ_EMPTY(&spapr->pending_events);
 }
 
@@ -1914,9 +1914,9 @@ static const VMStateDescription vmstate_spapr_event_entry = {
     .version_id = 1,
     .minimum_version_id = 1,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT32(summary, sPAPREventLogEntry),
-        VMSTATE_UINT32(extended_length, sPAPREventLogEntry),
-        VMSTATE_VBUFFER_ALLOC_UINT32(extended_log, sPAPREventLogEntry, 0,
+        VMSTATE_UINT32(summary, SpaprEventLogEntry),
+        VMSTATE_UINT32(extended_length, SpaprEventLogEntry),
+        VMSTATE_VBUFFER_ALLOC_UINT32(extended_log, SpaprEventLogEntry, 0,
                                      NULL, extended_length),
         VMSTATE_END_OF_LIST()
     },
@@ -1928,21 +1928,21 @@ static const VMStateDescription vmstate_spapr_pending_events = {
     .minimum_version_id = 1,
     .needed = spapr_pending_events_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_QTAILQ_V(pending_events, sPAPRMachineState, 1,
-                         vmstate_spapr_event_entry, sPAPREventLogEntry, next),
+        VMSTATE_QTAILQ_V(pending_events, SpaprMachineState, 1,
+                         vmstate_spapr_event_entry, SpaprEventLogEntry, next),
         VMSTATE_END_OF_LIST()
     },
 };
 
 static bool spapr_ov5_cas_needed(void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
-    sPAPROptionVector *ov5_mask = spapr_ovec_new();
-    sPAPROptionVector *ov5_legacy = spapr_ovec_new();
-    sPAPROptionVector *ov5_removed = spapr_ovec_new();
+    SpaprMachineState *spapr = opaque;
+    SpaprOptionVector *ov5_mask = spapr_ovec_new();
+    SpaprOptionVector *ov5_legacy = spapr_ovec_new();
+    SpaprOptionVector *ov5_removed = spapr_ovec_new();
     bool cas_needed;
 
-    /* Prior to the introduction of sPAPROptionVector, we had two option
+    /* Prior to the introduction of SpaprOptionVector, we had two option
      * vectors we dealt with: OV5_FORM1_AFFINITY, and OV5_DRCONF_MEMORY.
      * Both of these options encode machine topology into the device-tree
      * in such a way that the now-booted OS should still be able to interact
@@ -1992,15 +1992,15 @@ static const VMStateDescription vmstate_spapr_ov5_cas = {
     .minimum_version_id = 1,
     .needed = spapr_ov5_cas_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_STRUCT_POINTER_V(ov5_cas, sPAPRMachineState, 1,
-                                 vmstate_spapr_ovec, sPAPROptionVector),
+        VMSTATE_STRUCT_POINTER_V(ov5_cas, SpaprMachineState, 1,
+                                 vmstate_spapr_ovec, SpaprOptionVector),
         VMSTATE_END_OF_LIST()
     },
 };
 
 static bool spapr_patb_entry_needed(void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     return !!spapr->patb_entry;
 }
@@ -2011,14 +2011,14 @@ static const VMStateDescription vmstate_spapr_patb_entry = {
     .minimum_version_id = 1,
     .needed = spapr_patb_entry_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT64(patb_entry, sPAPRMachineState),
+        VMSTATE_UINT64(patb_entry, SpaprMachineState),
         VMSTATE_END_OF_LIST()
     },
 };
 
 static bool spapr_irq_map_needed(void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     return spapr->irq_map && !bitmap_empty(spapr->irq_map, spapr->irq_map_nr);
 }
@@ -2029,21 +2029,21 @@ static const VMStateDescription vmstate_spapr_irq_map = {
     .minimum_version_id = 1,
     .needed = spapr_irq_map_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_BITMAP(irq_map, sPAPRMachineState, 0, irq_map_nr),
+        VMSTATE_BITMAP(irq_map, SpaprMachineState, 0, irq_map_nr),
         VMSTATE_END_OF_LIST()
     },
 };
 
 static bool spapr_dtb_needed(void *opaque)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(opaque);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(opaque);
 
     return smc->update_dt_enabled;
 }
 
 static int spapr_dtb_pre_load(void *opaque)
 {
-    sPAPRMachineState *spapr = (sPAPRMachineState *)opaque;
+    SpaprMachineState *spapr = (SpaprMachineState *)opaque;
 
     g_free(spapr->fdt_blob);
     spapr->fdt_blob = NULL;
@@ -2059,9 +2059,9 @@ static const VMStateDescription vmstate_spapr_dtb = {
     .needed = spapr_dtb_needed,
     .pre_load = spapr_dtb_pre_load,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT32(fdt_initial_size, sPAPRMachineState),
-        VMSTATE_UINT32(fdt_size, sPAPRMachineState),
-        VMSTATE_VBUFFER_ALLOC_UINT32(fdt_blob, sPAPRMachineState, 0, NULL,
+        VMSTATE_UINT32(fdt_initial_size, SpaprMachineState),
+        VMSTATE_UINT32(fdt_size, SpaprMachineState),
+        VMSTATE_VBUFFER_ALLOC_UINT32(fdt_blob, SpaprMachineState, 0, NULL,
                                      fdt_size),
         VMSTATE_END_OF_LIST()
     },
@@ -2079,9 +2079,9 @@ static const VMStateDescription vmstate_spapr = {
         VMSTATE_UNUSED_BUFFER(version_before_3, 0, 4),
 
         /* RTC offset */
-        VMSTATE_UINT64_TEST(rtc_offset, sPAPRMachineState, version_before_3),
+        VMSTATE_UINT64_TEST(rtc_offset, SpaprMachineState, version_before_3),
 
-        VMSTATE_PPC_TIMEBASE_V(tb, sPAPRMachineState, 2),
+        VMSTATE_PPC_TIMEBASE_V(tb, SpaprMachineState, 2),
         VMSTATE_END_OF_LIST()
     },
     .subsections = (const VMStateDescription*[]) {
@@ -2105,7 +2105,7 @@ static const VMStateDescription vmstate_spapr = {
 
 static int htab_save_setup(QEMUFile *f, void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     /* "Iteration" header */
     if (!spapr->htab_shift) {
@@ -2127,7 +2127,7 @@ static int htab_save_setup(QEMUFile *f, void *opaque)
     return 0;
 }
 
-static void htab_save_chunk(QEMUFile *f, sPAPRMachineState *spapr,
+static void htab_save_chunk(QEMUFile *f, SpaprMachineState *spapr,
                             int chunkstart, int n_valid, int n_invalid)
 {
     qemu_put_be32(f, chunkstart);
@@ -2144,7 +2144,7 @@ static void htab_save_end_marker(QEMUFile *f)
     qemu_put_be16(f, 0);
 }
 
-static void htab_save_first_pass(QEMUFile *f, sPAPRMachineState *spapr,
+static void htab_save_first_pass(QEMUFile *f, SpaprMachineState *spapr,
                                  int64_t max_ns)
 {
     bool has_timeout = max_ns != -1;
@@ -2192,7 +2192,7 @@ static void htab_save_first_pass(QEMUFile *f, sPAPRMachineState *spapr,
     spapr->htab_save_index = index;
 }
 
-static int htab_save_later_pass(QEMUFile *f, sPAPRMachineState *spapr,
+static int htab_save_later_pass(QEMUFile *f, SpaprMachineState *spapr,
                                 int64_t max_ns)
 {
     bool final = max_ns < 0;
@@ -2270,7 +2270,7 @@ static int htab_save_later_pass(QEMUFile *f, sPAPRMachineState *spapr,
 
 static int htab_save_iterate(QEMUFile *f, void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
     int fd;
     int rc = 0;
 
@@ -2307,7 +2307,7 @@ static int htab_save_iterate(QEMUFile *f, void *opaque)
 
 static int htab_save_complete(QEMUFile *f, void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
     int fd;
 
     /* Iteration header */
@@ -2347,7 +2347,7 @@ static int htab_save_complete(QEMUFile *f, void *opaque)
 
 static int htab_load(QEMUFile *f, void *opaque, int version_id)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
     uint32_t section_hdr;
     int fd = -1;
     Error *local_err = NULL;
@@ -2437,7 +2437,7 @@ static int htab_load(QEMUFile *f, void *opaque, int version_id)
 
 static void htab_save_cleanup(void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     close_htab_fd(spapr);
 }
@@ -2457,7 +2457,7 @@ static void spapr_boot_set(void *opaque, const char *boot_device,
     machine->boot_order = g_strdup(boot_device);
 }
 
-static void spapr_create_lmb_dr_connectors(sPAPRMachineState *spapr)
+static void spapr_create_lmb_dr_connectors(SpaprMachineState *spapr)
 {
     MachineState *machine = MACHINE(spapr);
     uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE;
@@ -2524,7 +2524,7 @@ static CPUArchId *spapr_find_cpu_slot(MachineState *ms, uint32_t id, int *idx)
     return &ms->possible_cpus->cpus[index];
 }
 
-static void spapr_set_vsmt_mode(sPAPRMachineState *spapr, Error **errp)
+static void spapr_set_vsmt_mode(SpaprMachineState *spapr, Error **errp)
 {
     Error *local_err = NULL;
     bool vsmt_user = !!spapr->vsmt;
@@ -2596,11 +2596,11 @@ out:
     error_propagate(errp, local_err);
 }
 
-static void spapr_init_cpus(sPAPRMachineState *spapr)
+static void spapr_init_cpus(SpaprMachineState *spapr)
 {
     MachineState *machine = MACHINE(spapr);
     MachineClass *mc = MACHINE_GET_CLASS(machine);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
     const char *type = spapr_get_cpu_core_type(machine->cpu_type);
     const CPUArchIdList *possible_cpus;
     int boot_cores_nr = smp_cpus / smp_threads;
@@ -2679,8 +2679,8 @@ static PCIHostState *spapr_create_default_phb(void)
 /* pSeries LPAR / sPAPR hardware init */
 static void spapr_machine_init(MachineState *machine)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(machine);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
+    SpaprMachineState *spapr = SPAPR_MACHINE(machine);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(machine);
     const char *kernel_filename = machine->kernel_filename;
     const char *initrd_filename = machine->initrd_filename;
     PCIHostState *phb;
@@ -3076,7 +3076,7 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus,
 #define CAST(type, obj, name) \
     ((type *)object_dynamic_cast(OBJECT(obj), (name)))
     SCSIDevice *d = CAST(SCSIDevice,  dev, TYPE_SCSI_DEVICE);
-    sPAPRPHBState *phb = CAST(sPAPRPHBState, dev, TYPE_SPAPR_PCI_HOST_BRIDGE);
+    SpaprPhbState *phb = CAST(SpaprPhbState, dev, TYPE_SPAPR_PCI_HOST_BRIDGE);
     VHostSCSICommon *vsc = CAST(VHostSCSICommon, dev, TYPE_VHOST_SCSI_COMMON);
 
     if (d) {
@@ -3156,14 +3156,14 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p, BusState *bus,
 
 static char *spapr_get_kvm_type(Object *obj, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     return g_strdup(spapr->kvm_type);
 }
 
 static void spapr_set_kvm_type(Object *obj, const char *value, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     g_free(spapr->kvm_type);
     spapr->kvm_type = g_strdup(value);
@@ -3171,7 +3171,7 @@ static void spapr_set_kvm_type(Object *obj, const char *value, Error **errp)
 
 static bool spapr_get_modern_hotplug_events(Object *obj, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     return spapr->use_hotplug_event_source;
 }
@@ -3179,7 +3179,7 @@ static bool spapr_get_modern_hotplug_events(Object *obj, Error **errp)
 static void spapr_set_modern_hotplug_events(Object *obj, bool value,
                                             Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     spapr->use_hotplug_event_source = value;
 }
@@ -3191,7 +3191,7 @@ static bool spapr_get_msix_emulation(Object *obj, Error **errp)
 
 static char *spapr_get_resize_hpt(Object *obj, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     switch (spapr->resize_hpt) {
     case SPAPR_RESIZE_HPT_DEFAULT:
@@ -3208,7 +3208,7 @@ static char *spapr_get_resize_hpt(Object *obj, Error **errp)
 
 static void spapr_set_resize_hpt(Object *obj, const char *value, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     if (strcmp(value, "default") == 0) {
         spapr->resize_hpt = SPAPR_RESIZE_HPT_DEFAULT;
@@ -3237,7 +3237,7 @@ static void spapr_set_vsmt(Object *obj, Visitor *v, const char *name,
 
 static char *spapr_get_ic_mode(Object *obj, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     if (spapr->irq == &spapr_irq_xics_legacy) {
         return g_strdup("legacy");
@@ -3253,7 +3253,7 @@ static char *spapr_get_ic_mode(Object *obj, Error **errp)
 
 static void spapr_set_ic_mode(Object *obj, const char *value, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     if (SPAPR_MACHINE_GET_CLASS(spapr)->legacy_irq_allocation) {
         error_setg(errp, "This machine only uses the legacy XICS backend, don't pass ic-mode");
@@ -3274,14 +3274,14 @@ static void spapr_set_ic_mode(Object *obj, const char *value, Error **errp)
 
 static char *spapr_get_host_model(Object *obj, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     return g_strdup(spapr->host_model);
 }
 
 static void spapr_set_host_model(Object *obj, const char *value, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     g_free(spapr->host_model);
     spapr->host_model = g_strdup(value);
@@ -3289,14 +3289,14 @@ static void spapr_set_host_model(Object *obj, const char *value, Error **errp)
 
 static char *spapr_get_host_serial(Object *obj, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     return g_strdup(spapr->host_serial);
 }
 
 static void spapr_set_host_serial(Object *obj, const char *value, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     g_free(spapr->host_serial);
     spapr->host_serial = g_strdup(value);
@@ -3304,8 +3304,8 @@ static void spapr_set_host_serial(Object *obj, const char *value, Error **errp)
 
 static void spapr_instance_init(Object *obj)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
 
     spapr->htab_fd = -1;
     spapr->use_hotplug_event_source = true;
@@ -3362,7 +3362,7 @@ static void spapr_instance_init(Object *obj)
 
 static void spapr_machine_finalizefn(Object *obj)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     g_free(spapr->kvm_type);
 }
@@ -3382,7 +3382,7 @@ static void spapr_nmi(NMIState *n, int cpu_index, Error **errp)
     }
 }
 
-int spapr_lmb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
+int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
                           void *fdt, int *fdt_start_offset, Error **errp)
 {
     uint64_t addr;
@@ -3399,7 +3399,7 @@ int spapr_lmb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
 static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t size,
                            bool dedicated_hp_event_source, Error **errp)
 {
-    sPAPRDRConnector *drc;
+    SpaprDrc *drc;
     uint32_t nr_lmbs = size/SPAPR_MEMORY_BLOCK_SIZE;
     int i;
     uint64_t addr = addr_start;
@@ -3448,7 +3448,7 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                               Error **errp)
 {
     Error *local_err = NULL;
-    sPAPRMachineState *ms = SPAPR_MACHINE(hotplug_dev);
+    SpaprMachineState *ms = SPAPR_MACHINE(hotplug_dev);
     PCDIMMDevice *dimm = PC_DIMM(dev);
     uint64_t size, addr;
 
@@ -3482,8 +3482,8 @@ out:
 static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                                   Error **errp)
 {
-    const sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(hotplug_dev);
-    sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
+    const SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(hotplug_dev);
+    SpaprMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
     PCDIMMDevice *dimm = PC_DIMM(dev);
     Error *local_err = NULL;
     uint64_t size;
@@ -3519,16 +3519,16 @@ static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
     pc_dimm_pre_plug(dimm, MACHINE(hotplug_dev), NULL, errp);
 }
 
-struct sPAPRDIMMState {
+struct SpaprDimmState {
     PCDIMMDevice *dimm;
     uint32_t nr_lmbs;
-    QTAILQ_ENTRY(sPAPRDIMMState) next;
+    QTAILQ_ENTRY(SpaprDimmState) next;
 };
 
-static sPAPRDIMMState *spapr_pending_dimm_unplugs_find(sPAPRMachineState *s,
+static SpaprDimmState *spapr_pending_dimm_unplugs_find(SpaprMachineState *s,
                                                        PCDIMMDevice *dimm)
 {
-    sPAPRDIMMState *dimm_state = NULL;
+    SpaprDimmState *dimm_state = NULL;
 
     QTAILQ_FOREACH(dimm_state, &s->pending_dimm_unplugs, next) {
         if (dimm_state->dimm == dimm) {
@@ -3538,11 +3538,11 @@ static sPAPRDIMMState *spapr_pending_dimm_unplugs_find(sPAPRMachineState *s,
     return dimm_state;
 }
 
-static sPAPRDIMMState *spapr_pending_dimm_unplugs_add(sPAPRMachineState *spapr,
+static SpaprDimmState *spapr_pending_dimm_unplugs_add(SpaprMachineState *spapr,
                                                       uint32_t nr_lmbs,
                                                       PCDIMMDevice *dimm)
 {
-    sPAPRDIMMState *ds = NULL;
+    SpaprDimmState *ds = NULL;
 
     /*
      * If this request is for a DIMM whose removal had failed earlier
@@ -3552,7 +3552,7 @@ static sPAPRDIMMState *spapr_pending_dimm_unplugs_add(sPAPRMachineState *spapr,
      */
     ds = spapr_pending_dimm_unplugs_find(spapr, dimm);
     if (!ds) {
-        ds = g_malloc0(sizeof(sPAPRDIMMState));
+        ds = g_malloc0(sizeof(SpaprDimmState));
         ds->nr_lmbs = nr_lmbs;
         ds->dimm = dimm;
         QTAILQ_INSERT_HEAD(&spapr->pending_dimm_unplugs, ds, next);
@@ -3560,17 +3560,17 @@ static sPAPRDIMMState *spapr_pending_dimm_unplugs_add(sPAPRMachineState *spapr,
     return ds;
 }
 
-static void spapr_pending_dimm_unplugs_remove(sPAPRMachineState *spapr,
-                                              sPAPRDIMMState *dimm_state)
+static void spapr_pending_dimm_unplugs_remove(SpaprMachineState *spapr,
+                                              SpaprDimmState *dimm_state)
 {
     QTAILQ_REMOVE(&spapr->pending_dimm_unplugs, dimm_state, next);
     g_free(dimm_state);
 }
 
-static sPAPRDIMMState *spapr_recover_pending_dimm_state(sPAPRMachineState *ms,
+static SpaprDimmState *spapr_recover_pending_dimm_state(SpaprMachineState *ms,
                                                         PCDIMMDevice *dimm)
 {
-    sPAPRDRConnector *drc;
+    SpaprDrc *drc;
     uint64_t size = memory_device_get_region_size(MEMORY_DEVICE(dimm),
                                                   &error_abort);
     uint32_t nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE;
@@ -3599,8 +3599,8 @@ static sPAPRDIMMState *spapr_recover_pending_dimm_state(sPAPRMachineState *ms,
 void spapr_lmb_release(DeviceState *dev)
 {
     HotplugHandler *hotplug_ctrl = qdev_get_hotplug_handler(dev);
-    sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_ctrl);
-    sPAPRDIMMState *ds = spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(dev));
+    SpaprMachineState *spapr = SPAPR_MACHINE(hotplug_ctrl);
+    SpaprDimmState *ds = spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(dev));
 
     /* This information will get lost if a migration occurs
      * during the unplug process. In this case recover it. */
@@ -3625,8 +3625,8 @@ void spapr_lmb_release(DeviceState *dev)
 
 static void spapr_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
-    sPAPRDIMMState *ds = spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(dev));
+    SpaprMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
+    SpaprDimmState *ds = spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(dev));
 
     pc_dimm_unplug(PC_DIMM(dev), MACHINE(hotplug_dev));
     object_property_set_bool(OBJECT(dev), false, "realized", NULL);
@@ -3636,13 +3636,13 @@ static void spapr_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev)
 static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
                                         DeviceState *dev, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
+    SpaprMachineState *spapr = SPAPR_MACHINE(hotplug_dev);
     Error *local_err = NULL;
     PCDIMMDevice *dimm = PC_DIMM(dev);
     uint32_t nr_lmbs;
     uint64_t size, addr_start, addr;
     int i;
-    sPAPRDRConnector *drc;
+    SpaprDrc *drc;
 
     size = memory_device_get_region_size(MEMORY_DEVICE(dimm), &error_abort);
     nr_lmbs = size / SPAPR_MEMORY_BLOCK_SIZE;
@@ -3699,12 +3699,12 @@ void spapr_core_release(DeviceState *dev)
 static void spapr_core_unplug(HotplugHandler *hotplug_dev, DeviceState *dev)
 {
     MachineState *ms = MACHINE(hotplug_dev);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(ms);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(ms);
     CPUCore *cc = CPU_CORE(dev);
     CPUArchId *core_slot = spapr_find_cpu_slot(ms, cc->core_id, NULL);
 
     if (smc->pre_2_10_has_unused_icps) {
-        sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
+        SpaprCpuCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
         int i;
 
         for (i = 0; i < cc->nr_threads; i++) {
@@ -3723,9 +3723,9 @@ static
 void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev,
                                Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
+    SpaprMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
     int index;
-    sPAPRDRConnector *drc;
+    SpaprDrc *drc;
     CPUCore *cc = CPU_CORE(dev);
 
     if (!spapr_find_cpu_slot(MACHINE(hotplug_dev), cc->core_id, &index)) {
@@ -3747,10 +3747,10 @@ void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev,
     spapr_hotplug_req_remove_by_index(drc);
 }
 
-int spapr_core_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
+int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
                            void *fdt, int *fdt_start_offset, Error **errp)
 {
-    sPAPRCPUCore *core = SPAPR_CPU_CORE(drc->dev);
+    SpaprCpuCore *core = SPAPR_CPU_CORE(drc->dev);
     CPUState *cs = CPU(core->threads[0]);
     PowerPCCPU *cpu = POWERPC_CPU(cs);
     DeviceClass *dc = DEVICE_GET_CLASS(cs);
@@ -3771,13 +3771,13 @@ int spapr_core_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
 static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                             Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
+    SpaprMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
     MachineClass *mc = MACHINE_GET_CLASS(spapr);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
-    sPAPRCPUCore *core = SPAPR_CPU_CORE(OBJECT(dev));
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprCpuCore *core = SPAPR_CPU_CORE(OBJECT(dev));
     CPUCore *cc = CPU_CORE(dev);
     CPUState *cs;
-    sPAPRDRConnector *drc;
+    SpaprDrc *drc;
     Error *local_err = NULL;
     CPUArchId *core_slot;
     int index;
@@ -3880,10 +3880,10 @@ out:
     error_propagate(errp, local_err);
 }
 
-int spapr_phb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
+int spapr_phb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
                           void *fdt, int *fdt_start_offset, Error **errp)
 {
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(drc->dev);
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(drc->dev);
     int intc_phandle;
 
     intc_phandle = spapr_irq_get_phandle(spapr, spapr->fdt_blob, errp);
@@ -3906,9 +3906,9 @@ int spapr_phb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
 static void spapr_phb_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                                Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(dev);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+    SpaprMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(dev);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
     const unsigned windows_supported = spapr_phb_windows_supported(sphb);
 
     if (dev->hotplugged && !smc->dr_phb_enabled) {
@@ -3934,10 +3934,10 @@ static void spapr_phb_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
 static void spapr_phb_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
                            Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(dev);
-    sPAPRDRConnector *drc;
+    SpaprMachineState *spapr = SPAPR_MACHINE(OBJECT(hotplug_dev));
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(dev);
+    SpaprDrc *drc;
     bool hotplugged = spapr_drc_hotplugged(dev);
     Error *local_err = NULL;
 
@@ -3978,8 +3978,8 @@ static void spapr_phb_unplug(HotplugHandler *hotplug_dev, DeviceState *dev)
 static void spapr_phb_unplug_request(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(dev);
-    sPAPRDRConnector *drc;
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(dev);
+    SpaprDrc *drc;
 
     drc = spapr_drc_by_id(TYPE_SPAPR_DRC_PHB, sphb->index);
     assert(drc);
@@ -4017,9 +4017,9 @@ static void spapr_machine_device_unplug(HotplugHandler *hotplug_dev,
 static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
                                                 DeviceState *dev, Error **errp)
 {
-    sPAPRMachineState *sms = SPAPR_MACHINE(OBJECT(hotplug_dev));
+    SpaprMachineState *sms = SPAPR_MACHINE(OBJECT(hotplug_dev));
     MachineClass *mc = MACHINE_GET_CLASS(sms);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 
     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
         if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) {
@@ -4126,7 +4126,7 @@ static const CPUArchIdList *spapr_possible_cpu_arch_ids(MachineState *machine)
     return machine->possible_cpus;
 }
 
-static void spapr_phb_placement(sPAPRMachineState *spapr, uint32_t index,
+static void spapr_phb_placement(SpaprMachineState *spapr, uint32_t index,
                                 uint64_t *buid, hwaddr *pio,
                                 hwaddr *mmio32, hwaddr *mmio64,
                                 unsigned n_dma, uint32_t *liobns, Error **errp)
@@ -4178,14 +4178,14 @@ static void spapr_phb_placement(sPAPRMachineState *spapr, uint32_t index,
 
 static ICSState *spapr_ics_get(XICSFabric *dev, int irq)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(dev);
+    SpaprMachineState *spapr = SPAPR_MACHINE(dev);
 
     return ics_valid_irq(spapr->ics, irq) ? spapr->ics : NULL;
 }
 
 static void spapr_ics_resend(XICSFabric *dev)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(dev);
+    SpaprMachineState *spapr = SPAPR_MACHINE(dev);
 
     ics_resend(spapr->ics);
 }
@@ -4200,7 +4200,7 @@ static ICPState *spapr_icp_get(XICSFabric *xi, int vcpu_id)
 static void spapr_pic_print_info(InterruptStatsProvider *obj,
                                  Monitor *mon)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
 
     spapr->irq->print_info(spapr, mon);
 }
@@ -4212,7 +4212,7 @@ int spapr_get_vcpu_id(PowerPCCPU *cpu)
 
 void spapr_set_vcpu_id(PowerPCCPU *cpu, int cpu_index, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
     int vcpu_id;
 
     vcpu_id = spapr_vcpu_id(spapr, cpu_index);
@@ -4246,7 +4246,7 @@ PowerPCCPU *spapr_find_cpu(int vcpu_id)
 static void spapr_machine_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(oc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(oc);
     FWPathProviderClass *fwc = FW_PATH_PROVIDER_CLASS(oc);
     NMIClass *nc = NMI_CLASS(oc);
     HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
@@ -4327,10 +4327,10 @@ static const TypeInfo spapr_machine_info = {
     .name          = TYPE_SPAPR_MACHINE,
     .parent        = TYPE_MACHINE,
     .abstract      = true,
-    .instance_size = sizeof(sPAPRMachineState),
+    .instance_size = sizeof(SpaprMachineState),
     .instance_init = spapr_instance_init,
     .instance_finalize = spapr_machine_finalizefn,
-    .class_size    = sizeof(sPAPRMachineClass),
+    .class_size    = sizeof(SpaprMachineClass),
     .class_init    = spapr_machine_class_init,
     .interfaces = (InterfaceInfo[]) {
         { TYPE_FW_PATH_PROVIDER },
@@ -4380,7 +4380,7 @@ DEFINE_SPAPR_MACHINE(4_0, "4.0", true);
  */
 static void spapr_machine_3_1_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
     static GlobalProperty compat[] = {
         { TYPE_SPAPR_MACHINE, "host-model", "passthrough" },
         { TYPE_SPAPR_MACHINE, "host-serial", "passthrough" },
@@ -4407,7 +4407,7 @@ DEFINE_SPAPR_MACHINE(3_1, "3.1", false);
 
 static void spapr_machine_3_0_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 
     spapr_machine_3_1_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_3_0, hw_compat_3_0_len);
@@ -4423,7 +4423,7 @@ DEFINE_SPAPR_MACHINE(3_0, "3.0", false);
  */
 static void spapr_machine_2_12_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
     static GlobalProperty compat[] = {
         { TYPE_POWERPC_CPU, "pre-3.0-migration", "on" },
         { TYPE_SPAPR_CPU_CORE, "pre-3.0-migration", "on" },
@@ -4445,7 +4445,7 @@ DEFINE_SPAPR_MACHINE(2_12, "2.12", false);
 
 static void spapr_machine_2_12_sxxm_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 
     spapr_machine_2_12_class_options(mc);
     smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_WORKAROUND;
@@ -4461,7 +4461,7 @@ DEFINE_SPAPR_MACHINE(2_12_sxxm, "2.12-sxxm", false);
 
 static void spapr_machine_2_11_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 
     spapr_machine_2_12_class_options(mc);
     smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_ON;
@@ -4488,7 +4488,7 @@ DEFINE_SPAPR_MACHINE(2_10, "2.10", false);
 
 static void spapr_machine_2_9_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
     static GlobalProperty compat[] = {
         { TYPE_POWERPC_CPU, "pre-2.10-migration", "on" },
     };
@@ -4525,7 +4525,7 @@ DEFINE_SPAPR_MACHINE(2_8, "2.8", false);
  * pseries-2.7
  */
 
-static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index,
+static void phb_placement_2_7(SpaprMachineState *spapr, uint32_t index,
                               uint64_t *buid, hwaddr *pio,
                               hwaddr *mmio32, hwaddr *mmio64,
                               unsigned n_dma, uint32_t *liobns, Error **errp)
@@ -4576,7 +4576,7 @@ static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index,
 
 static void spapr_machine_2_7_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
     static GlobalProperty compat[] = {
         { TYPE_SPAPR_PCI_HOST_BRIDGE, "mem_win_size", "0xf80000000", },
         { TYPE_SPAPR_PCI_HOST_BRIDGE, "mem64_win_size", "0", },
@@ -4618,7 +4618,7 @@ DEFINE_SPAPR_MACHINE(2_6, "2.6", false);
 
 static void spapr_machine_2_5_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
     static GlobalProperty compat[] = {
         { "spapr-vlan", "use-rx-buffer-pools", "off" },
     };
@@ -4637,7 +4637,7 @@ DEFINE_SPAPR_MACHINE(2_5, "2.5", false);
 
 static void spapr_machine_2_4_class_options(MachineClass *mc)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+    SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
 
     spapr_machine_2_5_class_options(mc);
     smc->dr_lmb_enabled = false;
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
index b68d767d63..3278c09b0f 100644
--- a/hw/ppc/spapr_caps.c
+++ b/hw/ppc/spapr_caps.c
@@ -34,7 +34,7 @@
 
 #include "hw/ppc/spapr.h"
 
-typedef struct sPAPRCapPossible {
+typedef struct SpaprCapPossible {
     int num;            /* size of vals array below */
     const char *help;   /* help text for vals */
     /*
@@ -46,9 +46,9 @@ typedef struct sPAPRCapPossible {
      *   point is observed
      */
     const char *vals[];
-} sPAPRCapPossible;
+} SpaprCapPossible;
 
-typedef struct sPAPRCapabilityInfo {
+typedef struct SpaprCapabilityInfo {
     const char *name;
     const char *description;
     int index;
@@ -58,18 +58,18 @@ typedef struct sPAPRCapabilityInfo {
     ObjectPropertyAccessor *set;
     const char *type;
     /* Possible values if this is a custom string type */
-    sPAPRCapPossible *possible;
+    SpaprCapPossible *possible;
     /* Make sure the virtual hardware can support this capability */
-    void (*apply)(sPAPRMachineState *spapr, uint8_t val, Error **errp);
-    void (*cpu_apply)(sPAPRMachineState *spapr, PowerPCCPU *cpu,
+    void (*apply)(SpaprMachineState *spapr, uint8_t val, Error **errp);
+    void (*cpu_apply)(SpaprMachineState *spapr, PowerPCCPU *cpu,
                       uint8_t val, Error **errp);
-} sPAPRCapabilityInfo;
+} SpaprCapabilityInfo;
 
 static void spapr_cap_get_bool(Object *obj, Visitor *v, const char *name,
                                void *opaque, Error **errp)
 {
-    sPAPRCapabilityInfo *cap = opaque;
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprCapabilityInfo *cap = opaque;
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
     bool value = spapr_get_cap(spapr, cap->index) == SPAPR_CAP_ON;
 
     visit_type_bool(v, name, &value, errp);
@@ -78,8 +78,8 @@ static void spapr_cap_get_bool(Object *obj, Visitor *v, const char *name,
 static void spapr_cap_set_bool(Object *obj, Visitor *v, const char *name,
                                void *opaque, Error **errp)
 {
-    sPAPRCapabilityInfo *cap = opaque;
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprCapabilityInfo *cap = opaque;
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
     bool value;
     Error *local_err = NULL;
 
@@ -97,8 +97,8 @@ static void spapr_cap_set_bool(Object *obj, Visitor *v, const char *name,
 static void  spapr_cap_get_string(Object *obj, Visitor *v, const char *name,
                                   void *opaque, Error **errp)
 {
-    sPAPRCapabilityInfo *cap = opaque;
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprCapabilityInfo *cap = opaque;
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
     char *val = NULL;
     uint8_t value = spapr_get_cap(spapr, cap->index);
 
@@ -116,8 +116,8 @@ static void  spapr_cap_get_string(Object *obj, Visitor *v, const char *name,
 static void spapr_cap_set_string(Object *obj, Visitor *v, const char *name,
                                  void *opaque, Error **errp)
 {
-    sPAPRCapabilityInfo *cap = opaque;
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprCapabilityInfo *cap = opaque;
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
     Error *local_err = NULL;
     uint8_t i;
     char *val;
@@ -149,8 +149,8 @@ out:
 static void spapr_cap_get_pagesize(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
 {
-    sPAPRCapabilityInfo *cap = opaque;
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprCapabilityInfo *cap = opaque;
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
     uint8_t val = spapr_get_cap(spapr, cap->index);
     uint64_t pagesize = (1ULL << val);
 
@@ -160,8 +160,8 @@ static void spapr_cap_get_pagesize(Object *obj, Visitor *v, const char *name,
 static void spapr_cap_set_pagesize(Object *obj, Visitor *v, const char *name,
                                    void *opaque, Error **errp)
 {
-    sPAPRCapabilityInfo *cap = opaque;
-    sPAPRMachineState *spapr = SPAPR_MACHINE(obj);
+    SpaprCapabilityInfo *cap = opaque;
+    SpaprMachineState *spapr = SPAPR_MACHINE(obj);
     uint64_t pagesize;
     uint8_t val;
     Error *local_err = NULL;
@@ -182,7 +182,7 @@ static void spapr_cap_set_pagesize(Object *obj, Visitor *v, const char *name,
     spapr->eff.caps[cap->index] = val;
 }
 
-static void cap_htm_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp)
+static void cap_htm_apply(SpaprMachineState *spapr, uint8_t val, Error **errp)
 {
     if (!val) {
         /* TODO: We don't support disabling htm yet */
@@ -198,7 +198,7 @@ static void cap_htm_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp)
     }
 }
 
-static void cap_vsx_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp)
+static void cap_vsx_apply(SpaprMachineState *spapr, uint8_t val, Error **errp)
 {
     PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
     CPUPPCState *env = &cpu->env;
@@ -215,7 +215,7 @@ static void cap_vsx_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp)
     }
 }
 
-static void cap_dfp_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp)
+static void cap_dfp_apply(SpaprMachineState *spapr, uint8_t val, Error **errp)
 {
     PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
     CPUPPCState *env = &cpu->env;
@@ -229,14 +229,14 @@ static void cap_dfp_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp)
     }
 }
 
-sPAPRCapPossible cap_cfpc_possible = {
+SpaprCapPossible cap_cfpc_possible = {
     .num = 3,
     .vals = {"broken", "workaround", "fixed"},
     .help = "broken - no protection, workaround - workaround available,"
             " fixed - fixed in hardware",
 };
 
-static void cap_safe_cache_apply(sPAPRMachineState *spapr, uint8_t val,
+static void cap_safe_cache_apply(SpaprMachineState *spapr, uint8_t val,
                                  Error **errp)
 {
     Error *local_err = NULL;
@@ -257,14 +257,14 @@ static void cap_safe_cache_apply(sPAPRMachineState *spapr, uint8_t val,
         warn_report_err(local_err);
 }
 
-sPAPRCapPossible cap_sbbc_possible = {
+SpaprCapPossible cap_sbbc_possible = {
     .num = 3,
     .vals = {"broken", "workaround", "fixed"},
     .help = "broken - no protection, workaround - workaround available,"
             " fixed - fixed in hardware",
 };
 
-static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t val,
+static void cap_safe_bounds_check_apply(SpaprMachineState *spapr, uint8_t val,
                                         Error **errp)
 {
     Error *local_err = NULL;
@@ -285,7 +285,7 @@ static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t val,
         warn_report_err(local_err);
 }
 
-sPAPRCapPossible cap_ibs_possible = {
+SpaprCapPossible cap_ibs_possible = {
     .num = 5,
     /* Note workaround only maintained for compatibility */
     .vals = {"broken", "workaround", "fixed-ibs", "fixed-ccd", "fixed-na"},
@@ -295,7 +295,7 @@ sPAPRCapPossible cap_ibs_possible = {
             " fixed-na - fixed in hardware (no longer applicable)",
 };
 
-static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr,
+static void cap_safe_indirect_branch_apply(SpaprMachineState *spapr,
                                            uint8_t val, Error **errp)
 {
     Error *local_err = NULL;
@@ -318,7 +318,7 @@ static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr,
 
 #define VALUE_DESC_TRISTATE     " (broken, workaround, fixed)"
 
-void spapr_check_pagesize(sPAPRMachineState *spapr, hwaddr pagesize,
+void spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize,
                           Error **errp)
 {
     hwaddr maxpagesize = (1ULL << spapr->eff.caps[SPAPR_CAP_HPT_MAXPAGESIZE]);
@@ -335,7 +335,7 @@ void spapr_check_pagesize(sPAPRMachineState *spapr, hwaddr pagesize,
     }
 }
 
-static void cap_hpt_maxpagesize_apply(sPAPRMachineState *spapr,
+static void cap_hpt_maxpagesize_apply(SpaprMachineState *spapr,
                                       uint8_t val, Error **errp)
 {
     if (val < 12) {
@@ -372,7 +372,7 @@ static bool spapr_pagesize_cb(void *opaque, uint32_t seg_pshift,
     return true;
 }
 
-static void cap_hpt_maxpagesize_cpu_apply(sPAPRMachineState *spapr,
+static void cap_hpt_maxpagesize_cpu_apply(SpaprMachineState *spapr,
                                           PowerPCCPU *cpu,
                                           uint8_t val, Error **errp)
 {
@@ -381,7 +381,7 @@ static void cap_hpt_maxpagesize_cpu_apply(sPAPRMachineState *spapr,
     ppc_hash64_filter_pagesizes(cpu, spapr_pagesize_cb, &maxshift);
 }
 
-static void cap_nested_kvm_hv_apply(sPAPRMachineState *spapr,
+static void cap_nested_kvm_hv_apply(SpaprMachineState *spapr,
                                     uint8_t val, Error **errp)
 {
     if (!val) {
@@ -403,7 +403,7 @@ static void cap_nested_kvm_hv_apply(sPAPRMachineState *spapr,
     }
 }
 
-static void cap_large_decr_apply(sPAPRMachineState *spapr,
+static void cap_large_decr_apply(SpaprMachineState *spapr,
                                  uint8_t val, Error **errp)
 {
     PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
@@ -432,7 +432,7 @@ static void cap_large_decr_apply(sPAPRMachineState *spapr,
     }
 }
 
-static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr,
+static void cap_large_decr_cpu_apply(SpaprMachineState *spapr,
                                      PowerPCCPU *cpu,
                                      uint8_t val, Error **errp)
 {
@@ -451,7 +451,7 @@ static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr,
     ppc_store_lpcr(cpu, lpcr);
 }
 
-static void cap_ccf_assist_apply(sPAPRMachineState *spapr, uint8_t val,
+static void cap_ccf_assist_apply(SpaprMachineState *spapr, uint8_t val,
                                  Error **errp)
 {
     uint8_t kvm_val = kvmppc_get_cap_count_cache_flush_assist();
@@ -466,7 +466,7 @@ static void cap_ccf_assist_apply(sPAPRMachineState *spapr, uint8_t val,
     }
 }
 
-sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
+SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
     [SPAPR_CAP_HTM] = {
         .name = "htm",
         .description = "Allow Hardware Transactional Memory (HTM)",
@@ -566,11 +566,11 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = {
     },
 };
 
-static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr,
+static SpaprCapabilities default_caps_with_cpu(SpaprMachineState *spapr,
                                                const char *cputype)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
-    sPAPRCapabilities caps;
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+    SpaprCapabilities caps;
 
     caps = smc->default_caps;
 
@@ -615,7 +615,7 @@ static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr,
 
 int spapr_caps_pre_load(void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     /* Set to default so we can tell if this came in with the migration */
     spapr->mig = spapr->def;
@@ -624,7 +624,7 @@ int spapr_caps_pre_load(void *opaque)
 
 int spapr_caps_pre_save(void *opaque)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     spapr->mig = spapr->eff;
     return 0;
@@ -634,12 +634,12 @@ int spapr_caps_pre_save(void *opaque)
  * caps specific one.  Otherwise it wouldn't be called when the source
  * caps are all defaults, which could still conflict with overridden
  * caps on the destination */
-int spapr_caps_post_migration(sPAPRMachineState *spapr)
+int spapr_caps_post_migration(SpaprMachineState *spapr)
 {
     int i;
     bool ok = true;
-    sPAPRCapabilities dstcaps = spapr->eff;
-    sPAPRCapabilities srccaps;
+    SpaprCapabilities dstcaps = spapr->eff;
+    SpaprCapabilities srccaps;
 
     srccaps = default_caps_with_cpu(spapr, MACHINE(spapr)->cpu_type);
     for (i = 0; i < SPAPR_CAP_NUM; i++) {
@@ -650,7 +650,7 @@ int spapr_caps_post_migration(sPAPRMachineState *spapr)
     }
 
     for (i = 0; i < SPAPR_CAP_NUM; i++) {
-        sPAPRCapabilityInfo *info = &capability_table[i];
+        SpaprCapabilityInfo *info = &capability_table[i];
 
         if (srccaps.caps[i] > dstcaps.caps[i]) {
             error_report("cap-%s higher level (%d) in incoming stream than on destination (%d)",
@@ -671,7 +671,7 @@ int spapr_caps_post_migration(sPAPRMachineState *spapr)
 #define SPAPR_CAP_MIG_STATE(sname, cap)                 \
 static bool spapr_cap_##sname##_needed(void *opaque)    \
 {                                                       \
-    sPAPRMachineState *spapr = opaque;                  \
+    SpaprMachineState *spapr = opaque;                  \
                                                         \
     return spapr->cmd_line_caps[cap] &&                 \
            (spapr->eff.caps[cap] !=                     \
@@ -685,7 +685,7 @@ const VMStateDescription vmstate_spapr_cap_##sname = {  \
     .needed = spapr_cap_##sname##_needed,               \
     .fields = (VMStateField[]) {                        \
         VMSTATE_UINT8(mig.caps[cap],                    \
-                      sPAPRMachineState),               \
+                      SpaprMachineState),               \
         VMSTATE_END_OF_LIST()                           \
     },                                                  \
 }
@@ -700,9 +700,9 @@ SPAPR_CAP_MIG_STATE(nested_kvm_hv, SPAPR_CAP_NESTED_KVM_HV);
 SPAPR_CAP_MIG_STATE(large_decr, SPAPR_CAP_LARGE_DECREMENTER);
 SPAPR_CAP_MIG_STATE(ccf_assist, SPAPR_CAP_CCF_ASSIST);
 
-void spapr_caps_init(sPAPRMachineState *spapr)
+void spapr_caps_init(SpaprMachineState *spapr)
 {
-    sPAPRCapabilities default_caps;
+    SpaprCapabilities default_caps;
     int i;
 
     /* Compute the actual set of caps we should run with */
@@ -718,12 +718,12 @@ void spapr_caps_init(sPAPRMachineState *spapr)
     }
 }
 
-void spapr_caps_apply(sPAPRMachineState *spapr)
+void spapr_caps_apply(SpaprMachineState *spapr)
 {
     int i;
 
     for (i = 0; i < SPAPR_CAP_NUM; i++) {
-        sPAPRCapabilityInfo *info = &capability_table[i];
+        SpaprCapabilityInfo *info = &capability_table[i];
 
         /*
          * If the apply function can't set the desired level and thinks it's
@@ -733,12 +733,12 @@ void spapr_caps_apply(sPAPRMachineState *spapr)
     }
 }
 
-void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu)
+void spapr_caps_cpu_apply(SpaprMachineState *spapr, PowerPCCPU *cpu)
 {
     int i;
 
     for (i = 0; i < SPAPR_CAP_NUM; i++) {
-        sPAPRCapabilityInfo *info = &capability_table[i];
+        SpaprCapabilityInfo *info = &capability_table[i];
 
         /*
          * If the apply function can't set the desired level and thinks it's
@@ -750,14 +750,14 @@ void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu)
     }
 }
 
-void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp)
+void spapr_caps_add_properties(SpaprMachineClass *smc, Error **errp)
 {
     Error *local_err = NULL;
     ObjectClass *klass = OBJECT_CLASS(smc);
     int i;
 
     for (i = 0; i < ARRAY_SIZE(capability_table); i++) {
-        sPAPRCapabilityInfo *cap = &capability_table[i];
+        SpaprCapabilityInfo *cap = &capability_table[i];
         const char *name = g_strdup_printf("cap-%s", cap->name);
         char *desc;
 
diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index ef6cbb9c29..f04e06cdf6 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -28,7 +28,7 @@ static void spapr_cpu_reset(void *opaque)
     CPUState *cs = CPU(cpu);
     CPUPPCState *env = &cpu->env;
     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
     target_ulong lpcr;
 
     cpu_reset(cs);
@@ -116,7 +116,7 @@ const char *spapr_get_cpu_core_type(const char *cpu_type)
 
 static bool slb_shadow_needed(void *opaque)
 {
-    sPAPRCPUState *spapr_cpu = opaque;
+    SpaprCpuState *spapr_cpu = opaque;
 
     return spapr_cpu->slb_shadow_addr != 0;
 }
@@ -127,15 +127,15 @@ static const VMStateDescription vmstate_spapr_cpu_slb_shadow = {
     .minimum_version_id = 1,
     .needed = slb_shadow_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT64(slb_shadow_addr, sPAPRCPUState),
-        VMSTATE_UINT64(slb_shadow_size, sPAPRCPUState),
+        VMSTATE_UINT64(slb_shadow_addr, SpaprCpuState),
+        VMSTATE_UINT64(slb_shadow_size, SpaprCpuState),
         VMSTATE_END_OF_LIST()
     }
 };
 
 static bool dtl_needed(void *opaque)
 {
-    sPAPRCPUState *spapr_cpu = opaque;
+    SpaprCpuState *spapr_cpu = opaque;
 
     return spapr_cpu->dtl_addr != 0;
 }
@@ -146,15 +146,15 @@ static const VMStateDescription vmstate_spapr_cpu_dtl = {
     .minimum_version_id = 1,
     .needed = dtl_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT64(dtl_addr, sPAPRCPUState),
-        VMSTATE_UINT64(dtl_size, sPAPRCPUState),
+        VMSTATE_UINT64(dtl_addr, SpaprCpuState),
+        VMSTATE_UINT64(dtl_size, SpaprCpuState),
         VMSTATE_END_OF_LIST()
     }
 };
 
 static bool vpa_needed(void *opaque)
 {
-    sPAPRCPUState *spapr_cpu = opaque;
+    SpaprCpuState *spapr_cpu = opaque;
 
     return spapr_cpu->vpa_addr != 0;
 }
@@ -165,7 +165,7 @@ static const VMStateDescription vmstate_spapr_cpu_vpa = {
     .minimum_version_id = 1,
     .needed = vpa_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT64(vpa_addr, sPAPRCPUState),
+        VMSTATE_UINT64(vpa_addr, SpaprCpuState),
         VMSTATE_END_OF_LIST()
     },
     .subsections = (const VMStateDescription * []) {
@@ -188,7 +188,7 @@ static const VMStateDescription vmstate_spapr_cpu_state = {
     }
 };
 
-static void spapr_unrealize_vcpu(PowerPCCPU *cpu, sPAPRCPUCore *sc)
+static void spapr_unrealize_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc)
 {
     if (!sc->pre_3_0_migration) {
         vmstate_unregister(NULL, &vmstate_spapr_cpu_state, cpu->machine_data);
@@ -206,7 +206,7 @@ static void spapr_unrealize_vcpu(PowerPCCPU *cpu, sPAPRCPUCore *sc)
 
 static void spapr_cpu_core_unrealize(DeviceState *dev, Error **errp)
 {
-    sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
+    SpaprCpuCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
     CPUCore *cc = CPU_CORE(dev);
     int i;
 
@@ -216,8 +216,8 @@ static void spapr_cpu_core_unrealize(DeviceState *dev, Error **errp)
     g_free(sc->threads);
 }
 
-static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr,
-                               sPAPRCPUCore *sc, Error **errp)
+static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr,
+                               SpaprCpuCore *sc, Error **errp)
 {
     CPUPPCState *env = &cpu->env;
     CPUState *cs = CPU(cpu);
@@ -256,9 +256,9 @@ error:
     error_propagate(errp, local_err);
 }
 
-static PowerPCCPU *spapr_create_vcpu(sPAPRCPUCore *sc, int i, Error **errp)
+static PowerPCCPU *spapr_create_vcpu(SpaprCpuCore *sc, int i, Error **errp)
 {
-    sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(sc);
+    SpaprCpuCoreClass *scc = SPAPR_CPU_CORE_GET_CLASS(sc);
     CPUCore *cc = CPU_CORE(sc);
     Object *obj;
     char *id;
@@ -285,7 +285,7 @@ static PowerPCCPU *spapr_create_vcpu(sPAPRCPUCore *sc, int i, Error **errp)
         goto err;
     }
 
-    cpu->machine_data = g_new0(sPAPRCPUState, 1);
+    cpu->machine_data = g_new0(SpaprCpuState, 1);
 
     object_unref(obj);
     return cpu;
@@ -296,9 +296,9 @@ err:
     return NULL;
 }
 
-static void spapr_delete_vcpu(PowerPCCPU *cpu, sPAPRCPUCore *sc)
+static void spapr_delete_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc)
 {
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
 
     cpu->machine_data = NULL;
     g_free(spapr_cpu);
@@ -310,10 +310,10 @@ static void spapr_cpu_core_realize(DeviceState *dev, Error **errp)
     /* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
      * tries to add a sPAPR CPU core to a non-pseries machine.
      */
-    sPAPRMachineState *spapr =
-        (sPAPRMachineState *) object_dynamic_cast(qdev_get_machine(),
+    SpaprMachineState *spapr =
+        (SpaprMachineState *) object_dynamic_cast(qdev_get_machine(),
                                                   TYPE_SPAPR_MACHINE);
-    sPAPRCPUCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
+    SpaprCpuCore *sc = SPAPR_CPU_CORE(OBJECT(dev));
     CPUCore *cc = CPU_CORE(OBJECT(dev));
     Error *local_err = NULL;
     int i, j;
@@ -352,8 +352,8 @@ err:
 }
 
 static Property spapr_cpu_core_properties[] = {
-    DEFINE_PROP_INT32("node-id", sPAPRCPUCore, node_id, CPU_UNSET_NUMA_NODE_ID),
-    DEFINE_PROP_BOOL("pre-3.0-migration", sPAPRCPUCore, pre_3_0_migration,
+    DEFINE_PROP_INT32("node-id", SpaprCpuCore, node_id, CPU_UNSET_NUMA_NODE_ID),
+    DEFINE_PROP_BOOL("pre-3.0-migration", SpaprCpuCore, pre_3_0_migration,
                      false),
     DEFINE_PROP_END_OF_LIST()
 };
@@ -361,7 +361,7 @@ static Property spapr_cpu_core_properties[] = {
 static void spapr_cpu_core_class_init(ObjectClass *oc, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(oc);
-    sPAPRCPUCoreClass *scc = SPAPR_CPU_CORE_CLASS(oc);
+    SpaprCpuCoreClass *scc = SPAPR_CPU_CORE_CLASS(oc);
 
     dc->realize = spapr_cpu_core_realize;
     dc->unrealize = spapr_cpu_core_unrealize;
@@ -382,8 +382,8 @@ static const TypeInfo spapr_cpu_core_type_infos[] = {
         .name = TYPE_SPAPR_CPU_CORE,
         .parent = TYPE_CPU_CORE,
         .abstract = true,
-        .instance_size = sizeof(sPAPRCPUCore),
-        .class_size = sizeof(sPAPRCPUCoreClass),
+        .instance_size = sizeof(SpaprCpuCore),
+        .class_size = sizeof(SpaprCpuCoreClass),
     },
     DEFINE_SPAPR_CPU_CORE_TYPE("970_v2.2"),
     DEFINE_SPAPR_CPU_CORE_TYPE("970mp_v1.0"),
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 2943cf47d4..597f236b9c 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -29,16 +29,16 @@
 #define DRC_INDEX_TYPE_SHIFT 28
 #define DRC_INDEX_ID_MASK ((1ULL << DRC_INDEX_TYPE_SHIFT) - 1)
 
-sPAPRDRConnectorType spapr_drc_type(sPAPRDRConnector *drc)
+SpaprDrcType spapr_drc_type(SpaprDrc *drc)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     return 1 << drck->typeshift;
 }
 
-uint32_t spapr_drc_index(sPAPRDRConnector *drc)
+uint32_t spapr_drc_index(SpaprDrc *drc)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     /* no set format for a drc index: it only needs to be globally
      * unique. this is how we encode the DRC type on bare-metal
@@ -48,7 +48,7 @@ uint32_t spapr_drc_index(sPAPRDRConnector *drc)
         | (drc->id & DRC_INDEX_ID_MASK);
 }
 
-static uint32_t drc_isolate_physical(sPAPRDRConnector *drc)
+static uint32_t drc_isolate_physical(SpaprDrc *drc)
 {
     switch (drc->state) {
     case SPAPR_DRC_STATE_PHYSICAL_POWERON:
@@ -72,7 +72,7 @@ static uint32_t drc_isolate_physical(sPAPRDRConnector *drc)
     return RTAS_OUT_SUCCESS;
 }
 
-static uint32_t drc_unisolate_physical(sPAPRDRConnector *drc)
+static uint32_t drc_unisolate_physical(SpaprDrc *drc)
 {
     switch (drc->state) {
     case SPAPR_DRC_STATE_PHYSICAL_UNISOLATE:
@@ -99,7 +99,7 @@ static uint32_t drc_unisolate_physical(sPAPRDRConnector *drc)
     return RTAS_OUT_SUCCESS;
 }
 
-static uint32_t drc_isolate_logical(sPAPRDRConnector *drc)
+static uint32_t drc_isolate_logical(SpaprDrc *drc)
 {
     switch (drc->state) {
     case SPAPR_DRC_STATE_LOGICAL_AVAILABLE:
@@ -146,7 +146,7 @@ static uint32_t drc_isolate_logical(sPAPRDRConnector *drc)
     return RTAS_OUT_SUCCESS;
 }
 
-static uint32_t drc_unisolate_logical(sPAPRDRConnector *drc)
+static uint32_t drc_unisolate_logical(SpaprDrc *drc)
 {
     switch (drc->state) {
     case SPAPR_DRC_STATE_LOGICAL_UNISOLATE:
@@ -170,7 +170,7 @@ static uint32_t drc_unisolate_logical(sPAPRDRConnector *drc)
     return RTAS_OUT_SUCCESS;
 }
 
-static uint32_t drc_set_usable(sPAPRDRConnector *drc)
+static uint32_t drc_set_usable(SpaprDrc *drc)
 {
     switch (drc->state) {
     case SPAPR_DRC_STATE_LOGICAL_AVAILABLE:
@@ -202,7 +202,7 @@ static uint32_t drc_set_usable(sPAPRDRConnector *drc)
     return RTAS_OUT_SUCCESS;
 }
 
-static uint32_t drc_set_unusable(sPAPRDRConnector *drc)
+static uint32_t drc_set_unusable(SpaprDrc *drc)
 {
     switch (drc->state) {
     case SPAPR_DRC_STATE_LOGICAL_UNUSABLE:
@@ -226,9 +226,9 @@ static uint32_t drc_set_unusable(sPAPRDRConnector *drc)
     return RTAS_OUT_SUCCESS;
 }
 
-static const char *spapr_drc_name(sPAPRDRConnector *drc)
+static const char *spapr_drc_name(SpaprDrc *drc)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     /* human-readable name for a DRC to encode into the DT
      * description. this is mainly only used within a guest in place
@@ -261,7 +261,7 @@ static const char *spapr_drc_name(sPAPRDRConnector *drc)
  * based on the current allocation/indicator/power states
  * for the DR connector.
  */
-static sPAPRDREntitySense physical_entity_sense(sPAPRDRConnector *drc)
+static SpaprDREntitySense physical_entity_sense(SpaprDrc *drc)
 {
     /* this assumes all PCI devices are assigned to a 'live insertion'
      * power domain, where QEMU manages power state automatically as
@@ -272,7 +272,7 @@ static sPAPRDREntitySense physical_entity_sense(sPAPRDRConnector *drc)
         : SPAPR_DR_ENTITY_SENSE_EMPTY;
 }
 
-static sPAPRDREntitySense logical_entity_sense(sPAPRDRConnector *drc)
+static SpaprDREntitySense logical_entity_sense(SpaprDrc *drc)
 {
     switch (drc->state) {
     case SPAPR_DRC_STATE_LOGICAL_UNUSABLE:
@@ -290,7 +290,7 @@ static sPAPRDREntitySense logical_entity_sense(sPAPRDRConnector *drc)
 static void prop_get_index(Object *obj, Visitor *v, const char *name,
                            void *opaque, Error **errp)
 {
-    sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
+    SpaprDrc *drc = SPAPR_DR_CONNECTOR(obj);
     uint32_t value = spapr_drc_index(drc);
     visit_type_uint32(v, name, &value, errp);
 }
@@ -298,7 +298,7 @@ static void prop_get_index(Object *obj, Visitor *v, const char *name,
 static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
                          void *opaque, Error **errp)
 {
-    sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
+    SpaprDrc *drc = SPAPR_DR_CONNECTOR(obj);
     QNull *null = NULL;
     Error *err = NULL;
     int fdt_offset_next, fdt_offset, fdt_depth;
@@ -374,7 +374,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name,
     } while (fdt_depth != 0);
 }
 
-void spapr_drc_attach(sPAPRDRConnector *drc, DeviceState *d, Error **errp)
+void spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp)
 {
     trace_spapr_drc_attach(spapr_drc_index(drc));
 
@@ -393,9 +393,9 @@ void spapr_drc_attach(sPAPRDRConnector *drc, DeviceState *d, Error **errp)
                              NULL, 0, NULL);
 }
 
-static void spapr_drc_release(sPAPRDRConnector *drc)
+static void spapr_drc_release(SpaprDrc *drc)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     drck->release(drc->dev);
 
@@ -407,9 +407,9 @@ static void spapr_drc_release(sPAPRDRConnector *drc)
     drc->dev = NULL;
 }
 
-void spapr_drc_detach(sPAPRDRConnector *drc)
+void spapr_drc_detach(SpaprDrc *drc)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     trace_spapr_drc_detach(spapr_drc_index(drc));
 
@@ -425,9 +425,9 @@ void spapr_drc_detach(sPAPRDRConnector *drc)
     spapr_drc_release(drc);
 }
 
-void spapr_drc_reset(sPAPRDRConnector *drc)
+void spapr_drc_reset(SpaprDrc *drc)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     trace_spapr_drc_reset(spapr_drc_index(drc));
 
@@ -456,8 +456,8 @@ void spapr_drc_reset(sPAPRDRConnector *drc)
 
 bool spapr_drc_needed(void *opaque)
 {
-    sPAPRDRConnector *drc = (sPAPRDRConnector *)opaque;
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    SpaprDrc *drc = (SpaprDrc *)opaque;
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     /* If no dev is plugged in there is no need to migrate the DRC state */
     if (!drc->dev) {
@@ -477,14 +477,14 @@ static const VMStateDescription vmstate_spapr_drc = {
     .minimum_version_id = 1,
     .needed = spapr_drc_needed,
     .fields  = (VMStateField []) {
-        VMSTATE_UINT32(state, sPAPRDRConnector),
+        VMSTATE_UINT32(state, SpaprDrc),
         VMSTATE_END_OF_LIST()
     }
 };
 
 static void realize(DeviceState *d, Error **errp)
 {
-    sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(d);
+    SpaprDrc *drc = SPAPR_DR_CONNECTOR(d);
     Object *root_container;
     gchar *link_name;
     gchar *child_name;
@@ -517,7 +517,7 @@ static void realize(DeviceState *d, Error **errp)
 
 static void unrealize(DeviceState *d, Error **errp)
 {
-    sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(d);
+    SpaprDrc *drc = SPAPR_DR_CONNECTOR(d);
     Object *root_container;
     gchar *name;
 
@@ -529,10 +529,10 @@ static void unrealize(DeviceState *d, Error **errp)
     g_free(name);
 }
 
-sPAPRDRConnector *spapr_dr_connector_new(Object *owner, const char *type,
+SpaprDrc *spapr_dr_connector_new(Object *owner, const char *type,
                                          uint32_t id)
 {
-    sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(object_new(type));
+    SpaprDrc *drc = SPAPR_DR_CONNECTOR(object_new(type));
     char *prop_name;
 
     drc->id = id;
@@ -549,8 +549,8 @@ sPAPRDRConnector *spapr_dr_connector_new(Object *owner, const char *type,
 
 static void spapr_dr_connector_instance_init(Object *obj)
 {
-    sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(obj);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
+    SpaprDrc *drc = SPAPR_DR_CONNECTOR(obj);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
 
     object_property_add_uint32_ptr(obj, "id", &drc->id, NULL);
     object_property_add(obj, "index", "uint32", prop_get_index,
@@ -574,8 +574,8 @@ static void spapr_dr_connector_class_init(ObjectClass *k, void *data)
 
 static bool drc_physical_needed(void *opaque)
 {
-    sPAPRDRCPhysical *drcp = (sPAPRDRCPhysical *)opaque;
-    sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(drcp);
+    SpaprDrcPhysical *drcp = (SpaprDrcPhysical *)opaque;
+    SpaprDrc *drc = SPAPR_DR_CONNECTOR(drcp);
 
     if ((drc->dev && (drcp->dr_indicator == SPAPR_DR_INDICATOR_ACTIVE))
         || (!drc->dev && (drcp->dr_indicator == SPAPR_DR_INDICATOR_INACTIVE))) {
@@ -590,15 +590,15 @@ static const VMStateDescription vmstate_spapr_drc_physical = {
     .minimum_version_id = 1,
     .needed = drc_physical_needed,
     .fields  = (VMStateField []) {
-        VMSTATE_UINT32(dr_indicator, sPAPRDRCPhysical),
+        VMSTATE_UINT32(dr_indicator, SpaprDrcPhysical),
         VMSTATE_END_OF_LIST()
     }
 };
 
 static void drc_physical_reset(void *opaque)
 {
-    sPAPRDRConnector *drc = SPAPR_DR_CONNECTOR(opaque);
-    sPAPRDRCPhysical *drcp = SPAPR_DRC_PHYSICAL(drc);
+    SpaprDrc *drc = SPAPR_DR_CONNECTOR(opaque);
+    SpaprDrcPhysical *drcp = SPAPR_DRC_PHYSICAL(drc);
 
     if (drc->dev) {
         drcp->dr_indicator = SPAPR_DR_INDICATOR_ACTIVE;
@@ -609,7 +609,7 @@ static void drc_physical_reset(void *opaque)
 
 static void realize_physical(DeviceState *d, Error **errp)
 {
-    sPAPRDRCPhysical *drcp = SPAPR_DRC_PHYSICAL(d);
+    SpaprDrcPhysical *drcp = SPAPR_DRC_PHYSICAL(d);
     Error *local_err = NULL;
 
     realize(d, &local_err);
@@ -625,7 +625,7 @@ static void realize_physical(DeviceState *d, Error **errp)
 
 static void unrealize_physical(DeviceState *d, Error **errp)
 {
-    sPAPRDRCPhysical *drcp = SPAPR_DRC_PHYSICAL(d);
+    SpaprDrcPhysical *drcp = SPAPR_DRC_PHYSICAL(d);
     Error *local_err = NULL;
 
     unrealize(d, &local_err);
@@ -641,7 +641,7 @@ static void unrealize_physical(DeviceState *d, Error **errp)
 static void spapr_drc_physical_class_init(ObjectClass *k, void *data)
 {
     DeviceClass *dk = DEVICE_CLASS(k);
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
 
     dk->realize = realize_physical;
     dk->unrealize = unrealize_physical;
@@ -654,7 +654,7 @@ static void spapr_drc_physical_class_init(ObjectClass *k, void *data)
 
 static void spapr_drc_logical_class_init(ObjectClass *k, void *data)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
 
     drck->dr_entity_sense = logical_entity_sense;
     drck->isolate = drc_isolate_logical;
@@ -665,7 +665,7 @@ static void spapr_drc_logical_class_init(ObjectClass *k, void *data)
 
 static void spapr_drc_cpu_class_init(ObjectClass *k, void *data)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
 
     drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_CPU;
     drck->typename = "CPU";
@@ -676,7 +676,7 @@ static void spapr_drc_cpu_class_init(ObjectClass *k, void *data)
 
 static void spapr_drc_pci_class_init(ObjectClass *k, void *data)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
 
     drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_PCI;
     drck->typename = "28";
@@ -687,7 +687,7 @@ static void spapr_drc_pci_class_init(ObjectClass *k, void *data)
 
 static void spapr_drc_lmb_class_init(ObjectClass *k, void *data)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
 
     drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_LMB;
     drck->typename = "MEM";
@@ -698,7 +698,7 @@ static void spapr_drc_lmb_class_init(ObjectClass *k, void *data)
 
 static void spapr_drc_phb_class_init(ObjectClass *k, void *data)
 {
-    sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
+    SpaprDrcClass *drck = SPAPR_DR_CONNECTOR_CLASS(k);
 
     drck->typeshift = SPAPR_DR_CONNECTOR_TYPE_SHIFT_PHB;
     drck->typename = "PHB";
@@ -710,9 +710,9 @@ static void spapr_drc_phb_class_init(ObjectClass *k, void *data)
 static const TypeInfo spapr_dr_connector_info = {
     .name          = TYPE_SPAPR_DR_CONNECTOR,
     .parent        = TYPE_DEVICE,
-    .instance_size = sizeof(sPAPRDRConnector),
+    .instance_size = sizeof(SpaprDrc),
     .instance_init = spapr_dr_connector_instance_init,
-    .class_size    = sizeof(sPAPRDRConnectorClass),
+    .class_size    = sizeof(SpaprDrcClass),
     .class_init    = spapr_dr_connector_class_init,
     .abstract      = true,
 };
@@ -720,7 +720,7 @@ static const TypeInfo spapr_dr_connector_info = {
 static const TypeInfo spapr_drc_physical_info = {
     .name          = TYPE_SPAPR_DRC_PHYSICAL,
     .parent        = TYPE_SPAPR_DR_CONNECTOR,
-    .instance_size = sizeof(sPAPRDRCPhysical),
+    .instance_size = sizeof(SpaprDrcPhysical),
     .class_init    = spapr_drc_physical_class_init,
     .abstract      = true,
 };
@@ -753,13 +753,13 @@ static const TypeInfo spapr_drc_lmb_info = {
 static const TypeInfo spapr_drc_phb_info = {
     .name          = TYPE_SPAPR_DRC_PHB,
     .parent        = TYPE_SPAPR_DRC_LOGICAL,
-    .instance_size = sizeof(sPAPRDRConnector),
+    .instance_size = sizeof(SpaprDrc),
     .class_init    = spapr_drc_phb_class_init,
 };
 
 /* helper functions for external users */
 
-sPAPRDRConnector *spapr_drc_by_index(uint32_t index)
+SpaprDrc *spapr_drc_by_index(uint32_t index)
 {
     Object *obj;
     gchar *name;
@@ -771,9 +771,9 @@ sPAPRDRConnector *spapr_drc_by_index(uint32_t index)
     return !obj ? NULL : SPAPR_DR_CONNECTOR(obj);
 }
 
-sPAPRDRConnector *spapr_drc_by_id(const char *type, uint32_t id)
+SpaprDrc *spapr_drc_by_id(const char *type, uint32_t id)
 {
-    sPAPRDRConnectorClass *drck
+    SpaprDrcClass *drck
         = SPAPR_DR_CONNECTOR_CLASS(object_class_by_name(type));
 
     return spapr_drc_by_index(drck->typeshift << DRC_INDEX_TYPE_SHIFT
@@ -787,7 +787,7 @@ sPAPRDRConnector *spapr_drc_by_id(const char *type, uint32_t id)
  * @path: path in the DT to generate properties
  * @owner: parent Object/DeviceState for which to generate DRC
  *         descriptions for
- * @drc_type_mask: mask of sPAPRDRConnectorType values corresponding
+ * @drc_type_mask: mask of SpaprDrcType values corresponding
  *   to the types of DRCs to generate entries for
  *
  * generate OF properties to describe DRC topology/indices to guests
@@ -826,8 +826,8 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner,
     object_property_iter_init(&iter, root_container);
     while ((prop = object_property_iter_next(&iter))) {
         Object *obj;
-        sPAPRDRConnector *drc;
-        sPAPRDRConnectorClass *drck;
+        SpaprDrc *drc;
+        SpaprDrcClass *drck;
         uint32_t drc_index, drc_power_domain;
 
         if (!strstart(prop->type, "link<", NULL)) {
@@ -918,8 +918,8 @@ out:
 
 static uint32_t rtas_set_isolation_state(uint32_t idx, uint32_t state)
 {
-    sPAPRDRConnector *drc = spapr_drc_by_index(idx);
-    sPAPRDRConnectorClass *drck;
+    SpaprDrc *drc = spapr_drc_by_index(idx);
+    SpaprDrcClass *drck;
 
     if (!drc) {
         return RTAS_OUT_NO_SUCH_INDICATOR;
@@ -943,7 +943,7 @@ static uint32_t rtas_set_isolation_state(uint32_t idx, uint32_t state)
 
 static uint32_t rtas_set_allocation_state(uint32_t idx, uint32_t state)
 {
-    sPAPRDRConnector *drc = spapr_drc_by_index(idx);
+    SpaprDrc *drc = spapr_drc_by_index(idx);
 
     if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_LOGICAL)) {
         return RTAS_OUT_NO_SUCH_INDICATOR;
@@ -965,7 +965,7 @@ static uint32_t rtas_set_allocation_state(uint32_t idx, uint32_t state)
 
 static uint32_t rtas_set_dr_indicator(uint32_t idx, uint32_t state)
 {
-    sPAPRDRConnector *drc = spapr_drc_by_index(idx);
+    SpaprDrc *drc = spapr_drc_by_index(idx);
 
     if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_PHYSICAL)) {
         return RTAS_OUT_NO_SUCH_INDICATOR;
@@ -982,7 +982,7 @@ static uint32_t rtas_set_dr_indicator(uint32_t idx, uint32_t state)
     return RTAS_OUT_SUCCESS;
 }
 
-static void rtas_set_indicator(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_set_indicator(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                uint32_t token,
                                uint32_t nargs, target_ulong args,
                                uint32_t nret, target_ulong rets)
@@ -1017,7 +1017,7 @@ out:
     rtas_st(rets, 0, ret);
 }
 
-static void rtas_get_sensor_state(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_get_sensor_state(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                   uint32_t token, uint32_t nargs,
                                   target_ulong args, uint32_t nret,
                                   target_ulong rets)
@@ -1025,8 +1025,8 @@ static void rtas_get_sensor_state(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     uint32_t sensor_type;
     uint32_t sensor_index;
     uint32_t sensor_state = 0;
-    sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
+    SpaprDrc *drc;
+    SpaprDrcClass *drck;
     uint32_t ret = RTAS_OUT_SUCCESS;
 
     if (nargs != 2 || nret != 2) {
@@ -1079,7 +1079,7 @@ static void configure_connector_st(target_ulong addr, target_ulong offset,
 }
 
 static void rtas_ibm_configure_connector(PowerPCCPU *cpu,
-                                         sPAPRMachineState *spapr,
+                                         SpaprMachineState *spapr,
                                          uint32_t token, uint32_t nargs,
                                          target_ulong args, uint32_t nret,
                                          target_ulong rets)
@@ -1087,9 +1087,9 @@ static void rtas_ibm_configure_connector(PowerPCCPU *cpu,
     uint64_t wa_addr;
     uint64_t wa_offset;
     uint32_t drc_index;
-    sPAPRDRConnector *drc;
-    sPAPRDRConnectorClass *drck;
-    sPAPRDRCCResponse resp = SPAPR_DR_CC_RESPONSE_CONTINUE;
+    SpaprDrc *drc;
+    SpaprDrcClass *drck;
+    SpaprDRCCResponse resp = SPAPR_DR_CC_RESPONSE_CONTINUE;
     int rc;
 
     if (nargs != 2 || nret != 1) {
diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
index ab9a1f0063..ae0f093f59 100644
--- a/hw/ppc/spapr_events.c
+++ b/hw/ppc/spapr_events.c
@@ -229,18 +229,18 @@ static const char * const event_names[EVENT_CLASS_MAX] = {
     [EVENT_CLASS_IO]                    = "ibm,io-events",
 };
 
-struct sPAPREventSource {
+struct SpaprEventSource {
     int irq;
     uint32_t mask;
     bool enabled;
 };
 
-static sPAPREventSource *spapr_event_sources_new(void)
+static SpaprEventSource *spapr_event_sources_new(void)
 {
-    return g_new0(sPAPREventSource, EVENT_CLASS_MAX);
+    return g_new0(SpaprEventSource, EVENT_CLASS_MAX);
 }
 
-static void spapr_event_sources_register(sPAPREventSource *event_sources,
+static void spapr_event_sources_register(SpaprEventSource *event_sources,
                                         EventClassIndex index, int irq)
 {
     /* we only support 1 irq per event class at the moment */
@@ -251,8 +251,8 @@ static void spapr_event_sources_register(sPAPREventSource *event_sources,
     event_sources[index].enabled = true;
 }
 
-static const sPAPREventSource *
-spapr_event_sources_get_source(sPAPREventSource *event_sources,
+static const SpaprEventSource *
+spapr_event_sources_get_source(SpaprEventSource *event_sources,
                                EventClassIndex index)
 {
     g_assert(index < EVENT_CLASS_MAX);
@@ -261,11 +261,11 @@ spapr_event_sources_get_source(sPAPREventSource *event_sources,
     return &event_sources[index];
 }
 
-void spapr_dt_events(sPAPRMachineState *spapr, void *fdt)
+void spapr_dt_events(SpaprMachineState *spapr, void *fdt)
 {
     uint32_t irq_ranges[EVENT_CLASS_MAX * 2];
     int i, count = 0, event_sources;
-    sPAPREventSource *events = spapr->event_sources;
+    SpaprEventSource *events = spapr->event_sources;
 
     g_assert(events);
 
@@ -274,7 +274,7 @@ void spapr_dt_events(sPAPRMachineState *spapr, void *fdt)
     for (i = 0, count = 0; i < EVENT_CLASS_MAX; i++) {
         int node_offset;
         uint32_t interrupts[2];
-        const sPAPREventSource *source =
+        const SpaprEventSource *source =
             spapr_event_sources_get_source(events, i);
         const char *source_name = event_names[i];
 
@@ -298,10 +298,10 @@ void spapr_dt_events(sPAPRMachineState *spapr, void *fdt)
                       irq_ranges, count * sizeof(uint32_t))));
 }
 
-static const sPAPREventSource *
-rtas_event_log_to_source(sPAPRMachineState *spapr, int log_type)
+static const SpaprEventSource *
+rtas_event_log_to_source(SpaprMachineState *spapr, int log_type)
 {
-    const sPAPREventSource *source;
+    const SpaprEventSource *source;
 
     g_assert(spapr->event_sources);
 
@@ -325,9 +325,9 @@ rtas_event_log_to_source(sPAPRMachineState *spapr, int log_type)
     return source;
 }
 
-static int rtas_event_log_to_irq(sPAPRMachineState *spapr, int log_type)
+static int rtas_event_log_to_irq(SpaprMachineState *spapr, int log_type)
 {
-    const sPAPREventSource *source;
+    const SpaprEventSource *source;
 
     source = rtas_event_log_to_source(spapr, log_type);
     g_assert(source);
@@ -336,24 +336,24 @@ static int rtas_event_log_to_irq(sPAPRMachineState *spapr, int log_type)
     return source->irq;
 }
 
-static uint32_t spapr_event_log_entry_type(sPAPREventLogEntry *entry)
+static uint32_t spapr_event_log_entry_type(SpaprEventLogEntry *entry)
 {
     return entry->summary & RTAS_LOG_TYPE_MASK;
 }
 
-static void rtas_event_log_queue(sPAPRMachineState *spapr,
-                                 sPAPREventLogEntry *entry)
+static void rtas_event_log_queue(SpaprMachineState *spapr,
+                                 SpaprEventLogEntry *entry)
 {
     QTAILQ_INSERT_TAIL(&spapr->pending_events, entry, next);
 }
 
-static sPAPREventLogEntry *rtas_event_log_dequeue(sPAPRMachineState *spapr,
+static SpaprEventLogEntry *rtas_event_log_dequeue(SpaprMachineState *spapr,
                                                   uint32_t event_mask)
 {
-    sPAPREventLogEntry *entry = NULL;
+    SpaprEventLogEntry *entry = NULL;
 
     QTAILQ_FOREACH(entry, &spapr->pending_events, next) {
-        const sPAPREventSource *source =
+        const SpaprEventSource *source =
             rtas_event_log_to_source(spapr,
                                      spapr_event_log_entry_type(entry));
 
@@ -371,11 +371,11 @@ static sPAPREventLogEntry *rtas_event_log_dequeue(sPAPRMachineState *spapr,
 
 static bool rtas_event_log_contains(uint32_t event_mask)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
-    sPAPREventLogEntry *entry = NULL;
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprEventLogEntry *entry = NULL;
 
     QTAILQ_FOREACH(entry, &spapr->pending_events, next) {
-        const sPAPREventSource *source =
+        const SpaprEventSource *source =
             rtas_event_log_to_source(spapr,
                                      spapr_event_log_entry_type(entry));
 
@@ -401,7 +401,7 @@ static void spapr_init_v6hdr(struct rtas_event_log_v6 *v6hdr)
 static void spapr_init_maina(struct rtas_event_log_v6_maina *maina,
                              int section_count)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
     struct tm tm;
     int year;
 
@@ -424,15 +424,15 @@ static void spapr_init_maina(struct rtas_event_log_v6_maina *maina,
 
 static void spapr_powerdown_req(Notifier *n, void *opaque)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
-    sPAPREventLogEntry *entry;
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprEventLogEntry *entry;
     struct rtas_event_log_v6 *v6hdr;
     struct rtas_event_log_v6_maina *maina;
     struct rtas_event_log_v6_mainb *mainb;
     struct rtas_event_log_v6_epow *epow;
     struct epow_extended_log *new_epow;
 
-    entry = g_new(sPAPREventLogEntry, 1);
+    entry = g_new(SpaprEventLogEntry, 1);
     new_epow = g_malloc0(sizeof(*new_epow));
     entry->extended_log = new_epow;
 
@@ -473,18 +473,18 @@ static void spapr_powerdown_req(Notifier *n, void *opaque)
 }
 
 static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action,
-                                    sPAPRDRConnectorType drc_type,
+                                    SpaprDrcType drc_type,
                                     union drc_identifier *drc_id)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
-    sPAPREventLogEntry *entry;
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprEventLogEntry *entry;
     struct hp_extended_log *new_hp;
     struct rtas_event_log_v6 *v6hdr;
     struct rtas_event_log_v6_maina *maina;
     struct rtas_event_log_v6_mainb *mainb;
     struct rtas_event_log_v6_hp *hp;
 
-    entry = g_new(sPAPREventLogEntry, 1);
+    entry = g_new(SpaprEventLogEntry, 1);
     new_hp = g_malloc0(sizeof(struct hp_extended_log));
     entry->extended_log = new_hp;
 
@@ -558,9 +558,9 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action,
                    rtas_event_log_to_irq(spapr, RTAS_LOG_TYPE_HOTPLUG)));
 }
 
-void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc)
+void spapr_hotplug_req_add_by_index(SpaprDrc *drc)
 {
-    sPAPRDRConnectorType drc_type = spapr_drc_type(drc);
+    SpaprDrcType drc_type = spapr_drc_type(drc);
     union drc_identifier drc_id;
 
     drc_id.index = spapr_drc_index(drc);
@@ -568,9 +568,9 @@ void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc)
                             RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id);
 }
 
-void spapr_hotplug_req_remove_by_index(sPAPRDRConnector *drc)
+void spapr_hotplug_req_remove_by_index(SpaprDrc *drc)
 {
-    sPAPRDRConnectorType drc_type = spapr_drc_type(drc);
+    SpaprDrcType drc_type = spapr_drc_type(drc);
     union drc_identifier drc_id;
 
     drc_id.index = spapr_drc_index(drc);
@@ -578,7 +578,7 @@ void spapr_hotplug_req_remove_by_index(sPAPRDRConnector *drc)
                             RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_id);
 }
 
-void spapr_hotplug_req_add_by_count(sPAPRDRConnectorType drc_type,
+void spapr_hotplug_req_add_by_count(SpaprDrcType drc_type,
                                        uint32_t count)
 {
     union drc_identifier drc_id;
@@ -588,7 +588,7 @@ void spapr_hotplug_req_add_by_count(sPAPRDRConnectorType drc_type,
                             RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id);
 }
 
-void spapr_hotplug_req_remove_by_count(sPAPRDRConnectorType drc_type,
+void spapr_hotplug_req_remove_by_count(SpaprDrcType drc_type,
                                           uint32_t count)
 {
     union drc_identifier drc_id;
@@ -598,7 +598,7 @@ void spapr_hotplug_req_remove_by_count(sPAPRDRConnectorType drc_type,
                             RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_id);
 }
 
-void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConnectorType drc_type,
+void spapr_hotplug_req_add_by_count_indexed(SpaprDrcType drc_type,
                                             uint32_t count, uint32_t index)
 {
     union drc_identifier drc_id;
@@ -609,7 +609,7 @@ void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConnectorType drc_type,
                             RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id);
 }
 
-void spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_type,
+void spapr_hotplug_req_remove_by_count_indexed(SpaprDrcType drc_type,
                                                uint32_t count, uint32_t index)
 {
     union drc_identifier drc_id;
@@ -620,14 +620,14 @@ void spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_type,
                             RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_id);
 }
 
-static void check_exception(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void check_exception(PowerPCCPU *cpu, SpaprMachineState *spapr,
                             uint32_t token, uint32_t nargs,
                             target_ulong args,
                             uint32_t nret, target_ulong rets)
 {
     uint32_t mask, buf, len, event_len;
     uint64_t xinfo;
-    sPAPREventLogEntry *event;
+    SpaprEventLogEntry *event;
     struct rtas_error_log header;
     int i;
 
@@ -671,7 +671,7 @@ static void check_exception(PowerPCCPU *cpu, sPAPRMachineState *spapr,
      */
     for (i = 0; i < EVENT_CLASS_MAX; i++) {
         if (rtas_event_log_contains(EVENT_CLASS_MASK(i))) {
-            const sPAPREventSource *source =
+            const SpaprEventSource *source =
                 spapr_event_sources_get_source(spapr->event_sources, i);
 
             g_assert(source->enabled);
@@ -685,7 +685,7 @@ out_no_events:
     rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND);
 }
 
-static void event_scan(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void event_scan(PowerPCCPU *cpu, SpaprMachineState *spapr,
                        uint32_t token, uint32_t nargs,
                        target_ulong args,
                        uint32_t nret, target_ulong rets)
@@ -697,9 +697,9 @@ static void event_scan(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND);
 }
 
-void spapr_clear_pending_events(sPAPRMachineState *spapr)
+void spapr_clear_pending_events(SpaprMachineState *spapr)
 {
-    sPAPREventLogEntry *entry = NULL, *next_entry;
+    SpaprEventLogEntry *entry = NULL, *next_entry;
 
     QTAILQ_FOREACH_SAFE(entry, &spapr->pending_events, next, next_entry) {
         QTAILQ_REMOVE(&spapr->pending_events, entry, next);
@@ -708,7 +708,7 @@ void spapr_clear_pending_events(sPAPRMachineState *spapr)
     }
 }
 
-void spapr_events_init(sPAPRMachineState *spapr)
+void spapr_events_init(SpaprMachineState *spapr)
 {
     int epow_irq = SPAPR_IRQ_EPOW;
 
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 7016a09386..4486ffd37d 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -34,7 +34,7 @@ static inline bool valid_ptex(PowerPCCPU *cpu, target_ulong ptex)
     return true;
 }
 
-static bool is_ram_address(sPAPRMachineState *spapr, hwaddr addr)
+static bool is_ram_address(SpaprMachineState *spapr, hwaddr addr)
 {
     MachineState *machine = MACHINE(spapr);
     DeviceMemoryState *dms = machine->device_memory;
@@ -50,7 +50,7 @@ static bool is_ram_address(sPAPRMachineState *spapr, hwaddr addr)
     return false;
 }
 
-static target_ulong h_enter(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_enter(PowerPCCPU *cpu, SpaprMachineState *spapr,
                             target_ulong opcode, target_ulong *args)
 {
     target_ulong flags = args[0];
@@ -160,7 +160,7 @@ static RemoveResult remove_hpte(PowerPCCPU *cpu, target_ulong ptex,
     return REMOVE_SUCCESS;
 }
 
-static target_ulong h_remove(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_remove(PowerPCCPU *cpu, SpaprMachineState *spapr,
                              target_ulong opcode, target_ulong *args)
 {
     CPUPPCState *env = &cpu->env;
@@ -208,7 +208,7 @@ static target_ulong h_remove(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 
 #define H_BULK_REMOVE_MAX_BATCH        4
 
-static target_ulong h_bulk_remove(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_bulk_remove(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                   target_ulong opcode, target_ulong *args)
 {
     CPUPPCState *env = &cpu->env;
@@ -260,7 +260,7 @@ static target_ulong h_bulk_remove(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return rc;
 }
 
-static target_ulong h_protect(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_protect(PowerPCCPU *cpu, SpaprMachineState *spapr,
                               target_ulong opcode, target_ulong *args)
 {
     CPUPPCState *env = &cpu->env;
@@ -299,7 +299,7 @@ static target_ulong h_protect(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_read(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_read(PowerPCCPU *cpu, SpaprMachineState *spapr,
                            target_ulong opcode, target_ulong *args)
 {
     target_ulong flags = args[0];
@@ -328,7 +328,7 @@ static target_ulong h_read(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-struct sPAPRPendingHPT {
+struct SpaprPendingHpt {
     /* These fields are read-only after initialization */
     int shift;
     QemuThread thread;
@@ -342,7 +342,7 @@ struct sPAPRPendingHPT {
     void *hpt;
 };
 
-static void free_pending_hpt(sPAPRPendingHPT *pending)
+static void free_pending_hpt(SpaprPendingHpt *pending)
 {
     if (pending->hpt) {
         qemu_vfree(pending->hpt);
@@ -353,7 +353,7 @@ static void free_pending_hpt(sPAPRPendingHPT *pending)
 
 static void *hpt_prepare_thread(void *opaque)
 {
-    sPAPRPendingHPT *pending = opaque;
+    SpaprPendingHpt *pending = opaque;
     size_t size = 1ULL << pending->shift;
 
     pending->hpt = qemu_memalign(size, size);
@@ -379,9 +379,9 @@ static void *hpt_prepare_thread(void *opaque)
 }
 
 /* Must be called with BQL held */
-static void cancel_hpt_prepare(sPAPRMachineState *spapr)
+static void cancel_hpt_prepare(SpaprMachineState *spapr)
 {
-    sPAPRPendingHPT *pending = spapr->pending_hpt;
+    SpaprPendingHpt *pending = spapr->pending_hpt;
 
     /* Let the thread know it's cancelled */
     spapr->pending_hpt = NULL;
@@ -438,13 +438,13 @@ static target_ulong resize_hpt_convert_rc(int ret)
 }
 
 static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu,
-                                         sPAPRMachineState *spapr,
+                                         SpaprMachineState *spapr,
                                          target_ulong opcode,
                                          target_ulong *args)
 {
     target_ulong flags = args[0];
     int shift = args[1];
-    sPAPRPendingHPT *pending = spapr->pending_hpt;
+    SpaprPendingHpt *pending = spapr->pending_hpt;
     uint64_t current_ram_size;
     int rc;
 
@@ -503,7 +503,7 @@ static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu,
 
     /* start new prepare */
 
-    pending = g_new0(sPAPRPendingHPT, 1);
+    pending = g_new0(SpaprPendingHpt, 1);
     pending->shift = shift;
     pending->ret = H_HARDWARE;
 
@@ -672,7 +672,7 @@ static void do_push_sregs_to_kvm_pr(CPUState *cs, run_on_cpu_data data)
     }
 }
 
-static void push_sregs_to_kvm_pr(sPAPRMachineState *spapr)
+static void push_sregs_to_kvm_pr(SpaprMachineState *spapr)
 {
     CPUState *cs;
 
@@ -691,13 +691,13 @@ static void push_sregs_to_kvm_pr(sPAPRMachineState *spapr)
 }
 
 static target_ulong h_resize_hpt_commit(PowerPCCPU *cpu,
-                                        sPAPRMachineState *spapr,
+                                        SpaprMachineState *spapr,
                                         target_ulong opcode,
                                         target_ulong *args)
 {
     target_ulong flags = args[0];
     target_ulong shift = args[1];
-    sPAPRPendingHPT *pending = spapr->pending_hpt;
+    SpaprPendingHpt *pending = spapr->pending_hpt;
     int rc;
     size_t newsize;
 
@@ -759,7 +759,7 @@ static target_ulong h_resize_hpt_commit(PowerPCCPU *cpu,
     return rc;
 }
 
-static target_ulong h_set_sprg0(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_set_sprg0(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                 target_ulong opcode, target_ulong *args)
 {
     cpu_synchronize_state(CPU(cpu));
@@ -768,7 +768,7 @@ static target_ulong h_set_sprg0(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_set_dabr(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_set_dabr(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                target_ulong opcode, target_ulong *args)
 {
     if (!has_spr(cpu, SPR_DABR)) {
@@ -786,7 +786,7 @@ static target_ulong h_set_dabr(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_set_xdabr(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_set_xdabr(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                 target_ulong opcode, target_ulong *args)
 {
     target_ulong dabrx = args[1];
@@ -807,7 +807,7 @@ static target_ulong h_set_xdabr(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_page_init(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_page_init(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                 target_ulong opcode, target_ulong *args)
 {
     target_ulong flags = args[0];
@@ -882,7 +882,7 @@ static target_ulong register_vpa(PowerPCCPU *cpu, target_ulong vpa)
 {
     CPUState *cs = CPU(cpu);
     CPUPPCState *env = &cpu->env;
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
     uint16_t size;
     uint8_t tmp;
 
@@ -918,7 +918,7 @@ static target_ulong register_vpa(PowerPCCPU *cpu, target_ulong vpa)
 
 static target_ulong deregister_vpa(PowerPCCPU *cpu, target_ulong vpa)
 {
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
 
     if (spapr_cpu->slb_shadow_addr) {
         return H_RESOURCE;
@@ -934,7 +934,7 @@ static target_ulong deregister_vpa(PowerPCCPU *cpu, target_ulong vpa)
 
 static target_ulong register_slb_shadow(PowerPCCPU *cpu, target_ulong addr)
 {
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
     uint32_t size;
 
     if (addr == 0) {
@@ -963,7 +963,7 @@ static target_ulong register_slb_shadow(PowerPCCPU *cpu, target_ulong addr)
 
 static target_ulong deregister_slb_shadow(PowerPCCPU *cpu, target_ulong addr)
 {
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
 
     spapr_cpu->slb_shadow_addr = 0;
     spapr_cpu->slb_shadow_size = 0;
@@ -972,7 +972,7 @@ static target_ulong deregister_slb_shadow(PowerPCCPU *cpu, target_ulong addr)
 
 static target_ulong register_dtl(PowerPCCPU *cpu, target_ulong addr)
 {
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
     uint32_t size;
 
     if (addr == 0) {
@@ -998,7 +998,7 @@ static target_ulong register_dtl(PowerPCCPU *cpu, target_ulong addr)
 
 static target_ulong deregister_dtl(PowerPCCPU *cpu, target_ulong addr)
 {
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
 
     spapr_cpu->dtl_addr = 0;
     spapr_cpu->dtl_size = 0;
@@ -1006,7 +1006,7 @@ static target_ulong deregister_dtl(PowerPCCPU *cpu, target_ulong addr)
     return H_SUCCESS;
 }
 
-static target_ulong h_register_vpa(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_register_vpa(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                    target_ulong opcode, target_ulong *args)
 {
     target_ulong flags = args[0];
@@ -1049,7 +1049,7 @@ static target_ulong h_register_vpa(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return ret;
 }
 
-static target_ulong h_cede(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_cede(PowerPCCPU *cpu, SpaprMachineState *spapr,
                            target_ulong opcode, target_ulong *args)
 {
     CPUPPCState *env = &cpu->env;
@@ -1065,7 +1065,7 @@ static target_ulong h_cede(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_rtas(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_rtas(PowerPCCPU *cpu, SpaprMachineState *spapr,
                            target_ulong opcode, target_ulong *args)
 {
     target_ulong rtas_r3 = args[0];
@@ -1077,7 +1077,7 @@ static target_ulong h_rtas(PowerPCCPU *cpu, sPAPRMachineState *spapr,
                            nret, rtas_r3 + 12 + 4*nargs);
 }
 
-static target_ulong h_logical_load(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_logical_load(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                    target_ulong opcode, target_ulong *args)
 {
     CPUState *cs = CPU(cpu);
@@ -1101,7 +1101,7 @@ static target_ulong h_logical_load(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_PARAMETER;
 }
 
-static target_ulong h_logical_store(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_logical_store(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                     target_ulong opcode, target_ulong *args)
 {
     CPUState *cs = CPU(cpu);
@@ -1127,7 +1127,7 @@ static target_ulong h_logical_store(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_PARAMETER;
 }
 
-static target_ulong h_logical_memop(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_logical_memop(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                     target_ulong opcode, target_ulong *args)
 {
     CPUState *cs = CPU(cpu);
@@ -1196,14 +1196,14 @@ static target_ulong h_logical_memop(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong h_logical_icbi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_logical_icbi(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                    target_ulong opcode, target_ulong *args)
 {
     /* Nothing to do on emulation, KVM will trap this in the kernel */
     return H_SUCCESS;
 }
 
-static target_ulong h_logical_dcbf(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_logical_dcbf(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                    target_ulong opcode, target_ulong *args)
 {
     /* Nothing to do on emulation, KVM will trap this in the kernel */
@@ -1263,7 +1263,7 @@ static target_ulong h_set_mode_resource_addr_trans_mode(PowerPCCPU *cpu,
     return H_SUCCESS;
 }
 
-static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_set_mode(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                target_ulong opcode, target_ulong *args)
 {
     target_ulong resource = args[1];
@@ -1282,7 +1282,7 @@ static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return ret;
 }
 
-static target_ulong h_clean_slb(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_clean_slb(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                 target_ulong opcode, target_ulong *args)
 {
     qemu_log_mask(LOG_UNIMP, "Unimplemented SPAPR hcall 0x"TARGET_FMT_lx"%s\n",
@@ -1290,7 +1290,7 @@ static target_ulong h_clean_slb(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_FUNCTION;
 }
 
-static target_ulong h_invalidate_pid(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_invalidate_pid(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                      target_ulong opcode, target_ulong *args)
 {
     qemu_log_mask(LOG_UNIMP, "Unimplemented SPAPR hcall 0x"TARGET_FMT_lx"%s\n",
@@ -1298,7 +1298,7 @@ static target_ulong h_invalidate_pid(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_FUNCTION;
 }
 
-static void spapr_check_setup_free_hpt(sPAPRMachineState *spapr,
+static void spapr_check_setup_free_hpt(SpaprMachineState *spapr,
                                        uint64_t patbe_old, uint64_t patbe_new)
 {
     /*
@@ -1331,7 +1331,7 @@ static void spapr_check_setup_free_hpt(sPAPRMachineState *spapr,
 #define FLAG_GTSE               0x01
 
 static target_ulong h_register_process_table(PowerPCCPU *cpu,
-                                             sPAPRMachineState *spapr,
+                                             SpaprMachineState *spapr,
                                              target_ulong opcode,
                                              target_ulong *args)
 {
@@ -1414,7 +1414,7 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu,
 #define H_SIGNAL_SYS_RESET_ALLBUTSELF  -2
 
 static target_ulong h_signal_sys_reset(PowerPCCPU *cpu,
-                                       sPAPRMachineState *spapr,
+                                       SpaprMachineState *spapr,
                                        target_ulong opcode, target_ulong *args)
 {
     target_long target = args[0];
@@ -1449,7 +1449,7 @@ static target_ulong h_signal_sys_reset(PowerPCCPU *cpu,
     }
 }
 
-static uint32_t cas_check_pvr(sPAPRMachineState *spapr, PowerPCCPU *cpu,
+static uint32_t cas_check_pvr(SpaprMachineState *spapr, PowerPCCPU *cpu,
                               target_ulong *addr, bool *raw_mode_supported,
                               Error **errp)
 {
@@ -1500,7 +1500,7 @@ static uint32_t cas_check_pvr(sPAPRMachineState *spapr, PowerPCCPU *cpu,
 }
 
 static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
-                                                  sPAPRMachineState *spapr,
+                                                  SpaprMachineState *spapr,
                                                   target_ulong opcode,
                                                   target_ulong *args)
 {
@@ -1508,7 +1508,7 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
     target_ulong addr = ppc64_phys_to_real(args[0]);
     target_ulong ov_table;
     uint32_t cas_pvr;
-    sPAPROptionVector *ov1_guest, *ov5_guest, *ov5_cas_old, *ov5_updates;
+    SpaprOptionVector *ov1_guest, *ov5_guest, *ov5_cas_old, *ov5_updates;
     bool guest_radix;
     Error *local_err = NULL;
     bool raw_mode_supported = false;
@@ -1651,7 +1651,7 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
 }
 
 static target_ulong h_home_node_associativity(PowerPCCPU *cpu,
-                                              sPAPRMachineState *spapr,
+                                              SpaprMachineState *spapr,
                                               target_ulong opcode,
                                               target_ulong *args)
 {
@@ -1687,7 +1687,7 @@ static target_ulong h_home_node_associativity(PowerPCCPU *cpu,
 }
 
 static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
-                                              sPAPRMachineState *spapr,
+                                              SpaprMachineState *spapr,
                                               target_ulong opcode,
                                               target_ulong *args)
 {
@@ -1751,13 +1751,13 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu,
     return H_SUCCESS;
 }
 
-static target_ulong h_update_dt(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_update_dt(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                 target_ulong opcode, target_ulong *args)
 {
     target_ulong dt = ppc64_phys_to_real(args[0]);
     struct fdt_header hdr = { 0 };
     unsigned cb;
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
     void *fdt;
 
     cpu_physical_memory_read(dt, &hdr, sizeof(hdr));
@@ -1816,7 +1816,7 @@ void spapr_register_hypercall(target_ulong opcode, spapr_hcall_fn fn)
 target_ulong spapr_hypercall(PowerPCCPU *cpu, target_ulong opcode,
                              target_ulong *args)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
 
     if ((opcode <= MAX_HCALL_OPCODE)
         && ((opcode & 0x3) == 0)) {
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index 8f231799b2..5aff4d5a05 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -32,7 +32,7 @@
 
 #include <libfdt.h>
 
-enum sPAPRTCEAccess {
+enum SpaprTceAccess {
     SPAPR_TCE_FAULT = 0,
     SPAPR_TCE_RO = 1,
     SPAPR_TCE_WO = 2,
@@ -42,11 +42,11 @@ enum sPAPRTCEAccess {
 #define IOMMU_PAGE_SIZE(shift)      (1ULL << (shift))
 #define IOMMU_PAGE_MASK(shift)      (~(IOMMU_PAGE_SIZE(shift) - 1))
 
-static QLIST_HEAD(, sPAPRTCETable) spapr_tce_tables;
+static QLIST_HEAD(, SpaprTceTable) spapr_tce_tables;
 
-sPAPRTCETable *spapr_tce_find_by_liobn(target_ulong liobn)
+SpaprTceTable *spapr_tce_find_by_liobn(target_ulong liobn)
 {
-    sPAPRTCETable *tcet;
+    SpaprTceTable *tcet;
 
     if (liobn & 0xFFFFFFFF00000000ULL) {
         hcall_dprintf("Request for out-of-bounds LIOBN 0x" TARGET_FMT_lx "\n",
@@ -115,7 +115,7 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(IOMMUMemoryRegion *iommu,
                                                IOMMUAccessFlags flag,
                                                int iommu_idx)
 {
-    sPAPRTCETable *tcet = container_of(iommu, sPAPRTCETable, iommu);
+    SpaprTceTable *tcet = container_of(iommu, SpaprTceTable, iommu);
     uint64_t tce;
     IOMMUTLBEntry ret = {
         .target_as = &address_space_memory,
@@ -147,7 +147,7 @@ static void spapr_tce_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n)
     IOMMUMemoryRegionClass *imrc = IOMMU_MEMORY_REGION_GET_CLASS(iommu_mr);
     hwaddr addr, granularity;
     IOMMUTLBEntry iotlb;
-    sPAPRTCETable *tcet = container_of(iommu_mr, sPAPRTCETable, iommu);
+    SpaprTceTable *tcet = container_of(iommu_mr, SpaprTceTable, iommu);
 
     if (tcet->skipping_replay) {
         return;
@@ -173,7 +173,7 @@ static void spapr_tce_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n)
 
 static int spapr_tce_table_pre_save(void *opaque)
 {
-    sPAPRTCETable *tcet = SPAPR_TCE_TABLE(opaque);
+    SpaprTceTable *tcet = SPAPR_TCE_TABLE(opaque);
 
     tcet->mig_table = tcet->table;
     tcet->mig_nb_table = tcet->nb_table;
@@ -186,7 +186,7 @@ static int spapr_tce_table_pre_save(void *opaque)
 
 static uint64_t spapr_tce_get_min_page_size(IOMMUMemoryRegion *iommu)
 {
-    sPAPRTCETable *tcet = container_of(iommu, sPAPRTCETable, iommu);
+    SpaprTceTable *tcet = container_of(iommu, SpaprTceTable, iommu);
 
     return 1ULL << tcet->page_shift;
 }
@@ -194,7 +194,7 @@ static uint64_t spapr_tce_get_min_page_size(IOMMUMemoryRegion *iommu)
 static int spapr_tce_get_attr(IOMMUMemoryRegion *iommu,
                               enum IOMMUMemoryRegionAttr attr, void *data)
 {
-    sPAPRTCETable *tcet = container_of(iommu, sPAPRTCETable, iommu);
+    SpaprTceTable *tcet = container_of(iommu, SpaprTceTable, iommu);
 
     if (attr == IOMMU_ATTR_SPAPR_TCE_FD && kvmppc_has_cap_spapr_vfio()) {
         *(int *) data = tcet->fd;
@@ -208,7 +208,7 @@ static void spapr_tce_notify_flag_changed(IOMMUMemoryRegion *iommu,
                                           IOMMUNotifierFlag old,
                                           IOMMUNotifierFlag new)
 {
-    struct sPAPRTCETable *tbl = container_of(iommu, sPAPRTCETable, iommu);
+    struct SpaprTceTable *tbl = container_of(iommu, SpaprTceTable, iommu);
 
     if (old == IOMMU_NOTIFIER_NONE && new != IOMMU_NOTIFIER_NONE) {
         spapr_tce_set_need_vfio(tbl, true);
@@ -219,7 +219,7 @@ static void spapr_tce_notify_flag_changed(IOMMUMemoryRegion *iommu,
 
 static int spapr_tce_table_post_load(void *opaque, int version_id)
 {
-    sPAPRTCETable *tcet = SPAPR_TCE_TABLE(opaque);
+    SpaprTceTable *tcet = SPAPR_TCE_TABLE(opaque);
     uint32_t old_nb_table = tcet->nb_table;
     uint64_t old_bus_offset = tcet->bus_offset;
     uint32_t old_page_shift = tcet->page_shift;
@@ -253,7 +253,7 @@ static int spapr_tce_table_post_load(void *opaque, int version_id)
 
 static bool spapr_tce_table_ex_needed(void *opaque)
 {
-    sPAPRTCETable *tcet = opaque;
+    SpaprTceTable *tcet = opaque;
 
     return tcet->bus_offset || tcet->page_shift != 0xC;
 }
@@ -264,8 +264,8 @@ static const VMStateDescription vmstate_spapr_tce_table_ex = {
     .minimum_version_id = 1,
     .needed = spapr_tce_table_ex_needed,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT64(bus_offset, sPAPRTCETable),
-        VMSTATE_UINT32(page_shift, sPAPRTCETable),
+        VMSTATE_UINT64(bus_offset, SpaprTceTable),
+        VMSTATE_UINT32(page_shift, SpaprTceTable),
         VMSTATE_END_OF_LIST()
     },
 };
@@ -278,12 +278,12 @@ static const VMStateDescription vmstate_spapr_tce_table = {
     .post_load = spapr_tce_table_post_load,
     .fields      = (VMStateField []) {
         /* Sanity check */
-        VMSTATE_UINT32_EQUAL(liobn, sPAPRTCETable, NULL),
+        VMSTATE_UINT32_EQUAL(liobn, SpaprTceTable, NULL),
 
         /* IOMMU state */
-        VMSTATE_UINT32(mig_nb_table, sPAPRTCETable),
-        VMSTATE_BOOL(bypass, sPAPRTCETable),
-        VMSTATE_VARRAY_UINT32_ALLOC(mig_table, sPAPRTCETable, mig_nb_table, 0,
+        VMSTATE_UINT32(mig_nb_table, SpaprTceTable),
+        VMSTATE_BOOL(bypass, SpaprTceTable),
+        VMSTATE_VARRAY_UINT32_ALLOC(mig_table, SpaprTceTable, mig_nb_table, 0,
                                     vmstate_info_uint64, uint64_t),
 
         VMSTATE_END_OF_LIST()
@@ -296,7 +296,7 @@ static const VMStateDescription vmstate_spapr_tce_table = {
 
 static void spapr_tce_table_realize(DeviceState *dev, Error **errp)
 {
-    sPAPRTCETable *tcet = SPAPR_TCE_TABLE(dev);
+    SpaprTceTable *tcet = SPAPR_TCE_TABLE(dev);
     Object *tcetobj = OBJECT(tcet);
     gchar *tmp;
 
@@ -318,7 +318,7 @@ static void spapr_tce_table_realize(DeviceState *dev, Error **errp)
                      tcet);
 }
 
-void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio)
+void spapr_tce_set_need_vfio(SpaprTceTable *tcet, bool need_vfio)
 {
     size_t table_size = tcet->nb_table * sizeof(uint64_t);
     uint64_t *oldtable;
@@ -347,9 +347,9 @@ void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio)
     tcet->fd = newfd;
 }
 
-sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn)
+SpaprTceTable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn)
 {
-    sPAPRTCETable *tcet;
+    SpaprTceTable *tcet;
     gchar *tmp;
 
     if (spapr_tce_find_by_liobn(liobn)) {
@@ -371,7 +371,7 @@ sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn)
     return tcet;
 }
 
-void spapr_tce_table_enable(sPAPRTCETable *tcet,
+void spapr_tce_table_enable(SpaprTceTable *tcet,
                             uint32_t page_shift, uint64_t bus_offset,
                             uint32_t nb_table)
 {
@@ -396,7 +396,7 @@ void spapr_tce_table_enable(sPAPRTCETable *tcet,
                                 MEMORY_REGION(&tcet->iommu));
 }
 
-void spapr_tce_table_disable(sPAPRTCETable *tcet)
+void spapr_tce_table_disable(SpaprTceTable *tcet)
 {
     if (!tcet->nb_table) {
         return;
@@ -415,7 +415,7 @@ void spapr_tce_table_disable(sPAPRTCETable *tcet)
 
 static void spapr_tce_table_unrealize(DeviceState *dev, Error **errp)
 {
-    sPAPRTCETable *tcet = SPAPR_TCE_TABLE(dev);
+    SpaprTceTable *tcet = SPAPR_TCE_TABLE(dev);
 
     vmstate_unregister(DEVICE(tcet), &vmstate_spapr_tce_table, tcet);
 
@@ -424,14 +424,14 @@ static void spapr_tce_table_unrealize(DeviceState *dev, Error **errp)
     spapr_tce_table_disable(tcet);
 }
 
-MemoryRegion *spapr_tce_get_iommu(sPAPRTCETable *tcet)
+MemoryRegion *spapr_tce_get_iommu(SpaprTceTable *tcet)
 {
     return &tcet->root;
 }
 
 static void spapr_tce_reset(DeviceState *dev)
 {
-    sPAPRTCETable *tcet = SPAPR_TCE_TABLE(dev);
+    SpaprTceTable *tcet = SPAPR_TCE_TABLE(dev);
     size_t table_size = tcet->nb_table * sizeof(uint64_t);
 
     if (tcet->nb_table) {
@@ -439,7 +439,7 @@ static void spapr_tce_reset(DeviceState *dev)
     }
 }
 
-static target_ulong put_tce_emu(sPAPRTCETable *tcet, target_ulong ioba,
+static target_ulong put_tce_emu(SpaprTceTable *tcet, target_ulong ioba,
                                 target_ulong tce)
 {
     IOMMUTLBEntry entry;
@@ -465,7 +465,7 @@ static target_ulong put_tce_emu(sPAPRTCETable *tcet, target_ulong ioba,
 }
 
 static target_ulong h_put_tce_indirect(PowerPCCPU *cpu,
-                                       sPAPRMachineState *spapr,
+                                       SpaprMachineState *spapr,
                                        target_ulong opcode, target_ulong *args)
 {
     int i;
@@ -475,7 +475,7 @@ static target_ulong h_put_tce_indirect(PowerPCCPU *cpu,
     target_ulong tce_list = args[2];
     target_ulong npages = args[3];
     target_ulong ret = H_PARAMETER, tce = 0;
-    sPAPRTCETable *tcet = spapr_tce_find_by_liobn(liobn);
+    SpaprTceTable *tcet = spapr_tce_find_by_liobn(liobn);
     CPUState *cs = CPU(cpu);
     hwaddr page_mask, page_size;
 
@@ -510,7 +510,7 @@ static target_ulong h_put_tce_indirect(PowerPCCPU *cpu,
     return ret;
 }
 
-static target_ulong h_stuff_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_stuff_tce(PowerPCCPU *cpu, SpaprMachineState *spapr,
                               target_ulong opcode, target_ulong *args)
 {
     int i;
@@ -519,7 +519,7 @@ static target_ulong h_stuff_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     target_ulong tce_value = args[2];
     target_ulong npages = args[3];
     target_ulong ret = H_PARAMETER;
-    sPAPRTCETable *tcet = spapr_tce_find_by_liobn(liobn);
+    SpaprTceTable *tcet = spapr_tce_find_by_liobn(liobn);
     hwaddr page_mask, page_size;
 
     if (!tcet) {
@@ -549,14 +549,14 @@ static target_ulong h_stuff_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return ret;
 }
 
-static target_ulong h_put_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_put_tce(PowerPCCPU *cpu, SpaprMachineState *spapr,
                               target_ulong opcode, target_ulong *args)
 {
     target_ulong liobn = args[0];
     target_ulong ioba = args[1];
     target_ulong tce = args[2];
     target_ulong ret = H_PARAMETER;
-    sPAPRTCETable *tcet = spapr_tce_find_by_liobn(liobn);
+    SpaprTceTable *tcet = spapr_tce_find_by_liobn(liobn);
 
     if (tcet) {
         hwaddr page_mask = IOMMU_PAGE_MASK(tcet->page_shift);
@@ -574,7 +574,7 @@ static target_ulong h_put_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return ret;
 }
 
-static target_ulong get_tce_emu(sPAPRTCETable *tcet, target_ulong ioba,
+static target_ulong get_tce_emu(SpaprTceTable *tcet, target_ulong ioba,
                                 target_ulong *tce)
 {
     unsigned long index = (ioba - tcet->bus_offset) >> tcet->page_shift;
@@ -590,14 +590,14 @@ static target_ulong get_tce_emu(sPAPRTCETable *tcet, target_ulong ioba,
     return H_SUCCESS;
 }
 
-static target_ulong h_get_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_get_tce(PowerPCCPU *cpu, SpaprMachineState *spapr,
                               target_ulong opcode, target_ulong *args)
 {
     target_ulong liobn = args[0];
     target_ulong ioba = args[1];
     target_ulong tce = 0;
     target_ulong ret = H_PARAMETER;
-    sPAPRTCETable *tcet = spapr_tce_find_by_liobn(liobn);
+    SpaprTceTable *tcet = spapr_tce_find_by_liobn(liobn);
 
     if (tcet) {
         hwaddr page_mask = IOMMU_PAGE_MASK(tcet->page_shift);
@@ -649,7 +649,7 @@ int spapr_dma_dt(void *fdt, int node_off, const char *propname,
 }
 
 int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname,
-                      sPAPRTCETable *tcet)
+                      SpaprTceTable *tcet)
 {
     if (!tcet) {
         return 0;
@@ -680,7 +680,7 @@ static void spapr_tce_table_class_init(ObjectClass *klass, void *data)
 static TypeInfo spapr_tce_table_info = {
     .name = TYPE_SPAPR_TCE_TABLE,
     .parent = TYPE_DEVICE,
-    .instance_size = sizeof(sPAPRTCETable),
+    .instance_size = sizeof(SpaprTceTable),
     .class_init = spapr_tce_table_class_init,
 };
 
diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c
index 4145079d7f..253e4de7fd 100644
--- a/hw/ppc/spapr_irq.c
+++ b/hw/ppc/spapr_irq.c
@@ -20,13 +20,13 @@
 
 #include "trace.h"
 
-void spapr_irq_msi_init(sPAPRMachineState *spapr, uint32_t nr_msis)
+void spapr_irq_msi_init(SpaprMachineState *spapr, uint32_t nr_msis)
 {
     spapr->irq_map_nr = nr_msis;
     spapr->irq_map = bitmap_new(spapr->irq_map_nr);
 }
 
-int spapr_irq_msi_alloc(sPAPRMachineState *spapr, uint32_t num, bool align,
+int spapr_irq_msi_alloc(SpaprMachineState *spapr, uint32_t num, bool align,
                         Error **errp)
 {
     int irq;
@@ -51,12 +51,12 @@ int spapr_irq_msi_alloc(sPAPRMachineState *spapr, uint32_t num, bool align,
     return irq + SPAPR_IRQ_MSI;
 }
 
-void spapr_irq_msi_free(sPAPRMachineState *spapr, int irq, uint32_t num)
+void spapr_irq_msi_free(SpaprMachineState *spapr, int irq, uint32_t num)
 {
     bitmap_clear(spapr->irq_map, irq - SPAPR_IRQ_MSI, num);
 }
 
-void spapr_irq_msi_reset(sPAPRMachineState *spapr)
+void spapr_irq_msi_reset(SpaprMachineState *spapr)
 {
     bitmap_clear(spapr->irq_map, 0, spapr->irq_map_nr);
 }
@@ -66,7 +66,7 @@ void spapr_irq_msi_reset(sPAPRMachineState *spapr)
  * XICS IRQ backend.
  */
 
-static ICSState *spapr_ics_create(sPAPRMachineState *spapr,
+static ICSState *spapr_ics_create(SpaprMachineState *spapr,
                                   int nr_irqs, Error **errp)
 {
     Error *local_err = NULL;
@@ -92,7 +92,7 @@ error:
     return NULL;
 }
 
-static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs,
+static void spapr_irq_init_xics(SpaprMachineState *spapr, int nr_irqs,
                                 Error **errp)
 {
     MachineState *machine = MACHINE(spapr);
@@ -126,7 +126,7 @@ error:
 #define ICS_IRQ_FREE(ics, srcno)   \
     (!((ics)->irqs[(srcno)].flags & (XICS_FLAGS_IRQ_MASK)))
 
-static int spapr_irq_claim_xics(sPAPRMachineState *spapr, int irq, bool lsi,
+static int spapr_irq_claim_xics(SpaprMachineState *spapr, int irq, bool lsi,
                                 Error **errp)
 {
     ICSState *ics = spapr->ics;
@@ -147,7 +147,7 @@ static int spapr_irq_claim_xics(sPAPRMachineState *spapr, int irq, bool lsi,
     return 0;
 }
 
-static void spapr_irq_free_xics(sPAPRMachineState *spapr, int irq, int num)
+static void spapr_irq_free_xics(SpaprMachineState *spapr, int irq, int num)
 {
     ICSState *ics = spapr->ics;
     uint32_t srcno = irq - ics->offset;
@@ -164,7 +164,7 @@ static void spapr_irq_free_xics(sPAPRMachineState *spapr, int irq, int num)
     }
 }
 
-static qemu_irq spapr_qirq_xics(sPAPRMachineState *spapr, int irq)
+static qemu_irq spapr_qirq_xics(SpaprMachineState *spapr, int irq)
 {
     ICSState *ics = spapr->ics;
     uint32_t srcno = irq - ics->offset;
@@ -176,7 +176,7 @@ static qemu_irq spapr_qirq_xics(sPAPRMachineState *spapr, int irq)
     return NULL;
 }
 
-static void spapr_irq_print_info_xics(sPAPRMachineState *spapr, Monitor *mon)
+static void spapr_irq_print_info_xics(SpaprMachineState *spapr, Monitor *mon)
 {
     CPUState *cs;
 
@@ -189,12 +189,12 @@ static void spapr_irq_print_info_xics(sPAPRMachineState *spapr, Monitor *mon)
     ics_pic_print_info(spapr->ics, mon);
 }
 
-static void spapr_irq_cpu_intc_create_xics(sPAPRMachineState *spapr,
+static void spapr_irq_cpu_intc_create_xics(SpaprMachineState *spapr,
                                            PowerPCCPU *cpu, Error **errp)
 {
     Error *local_err = NULL;
     Object *obj;
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
 
     obj = icp_create(OBJECT(cpu), TYPE_ICP, XICS_FABRIC(spapr),
                      &local_err);
@@ -206,7 +206,7 @@ static void spapr_irq_cpu_intc_create_xics(sPAPRMachineState *spapr,
     spapr_cpu->icp = ICP(obj);
 }
 
-static int spapr_irq_post_load_xics(sPAPRMachineState *spapr, int version_id)
+static int spapr_irq_post_load_xics(SpaprMachineState *spapr, int version_id)
 {
     if (!kvm_irqchip_in_kernel()) {
         CPUState *cs;
@@ -220,17 +220,17 @@ static int spapr_irq_post_load_xics(sPAPRMachineState *spapr, int version_id)
 
 static void spapr_irq_set_irq_xics(void *opaque, int srcno, int val)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     ics_simple_set_irq(spapr->ics, srcno, val);
 }
 
-static void spapr_irq_reset_xics(sPAPRMachineState *spapr, Error **errp)
+static void spapr_irq_reset_xics(SpaprMachineState *spapr, Error **errp)
 {
     /* TODO: create the KVM XICS device */
 }
 
-static const char *spapr_irq_get_nodename_xics(sPAPRMachineState *spapr)
+static const char *spapr_irq_get_nodename_xics(SpaprMachineState *spapr)
 {
     return XICS_NODENAME;
 }
@@ -239,7 +239,7 @@ static const char *spapr_irq_get_nodename_xics(sPAPRMachineState *spapr)
 #define SPAPR_IRQ_XICS_NR_MSIS     \
     (XICS_IRQ_BASE + SPAPR_IRQ_XICS_NR_IRQS - SPAPR_IRQ_MSI)
 
-sPAPRIrq spapr_irq_xics = {
+SpaprIrq spapr_irq_xics = {
     .nr_irqs     = SPAPR_IRQ_XICS_NR_IRQS,
     .nr_msis     = SPAPR_IRQ_XICS_NR_MSIS,
     .ov5         = SPAPR_OV5_XIVE_LEGACY,
@@ -260,7 +260,7 @@ sPAPRIrq spapr_irq_xics = {
 /*
  * XIVE IRQ backend.
  */
-static void spapr_irq_init_xive(sPAPRMachineState *spapr, int nr_irqs,
+static void spapr_irq_init_xive(SpaprMachineState *spapr, int nr_irqs,
                                 Error **errp)
 {
     MachineState *machine = MACHINE(spapr);
@@ -294,7 +294,7 @@ static void spapr_irq_init_xive(sPAPRMachineState *spapr, int nr_irqs,
     spapr_xive_hcall_init(spapr);
 }
 
-static int spapr_irq_claim_xive(sPAPRMachineState *spapr, int irq, bool lsi,
+static int spapr_irq_claim_xive(SpaprMachineState *spapr, int irq, bool lsi,
                                 Error **errp)
 {
     if (!spapr_xive_irq_claim(spapr->xive, irq, lsi)) {
@@ -304,7 +304,7 @@ static int spapr_irq_claim_xive(sPAPRMachineState *spapr, int irq, bool lsi,
     return 0;
 }
 
-static void spapr_irq_free_xive(sPAPRMachineState *spapr, int irq, int num)
+static void spapr_irq_free_xive(SpaprMachineState *spapr, int irq, int num)
 {
     int i;
 
@@ -313,9 +313,9 @@ static void spapr_irq_free_xive(sPAPRMachineState *spapr, int irq, int num)
     }
 }
 
-static qemu_irq spapr_qirq_xive(sPAPRMachineState *spapr, int irq)
+static qemu_irq spapr_qirq_xive(SpaprMachineState *spapr, int irq)
 {
-    sPAPRXive *xive = spapr->xive;
+    SpaprXive *xive = spapr->xive;
 
     if (irq >= xive->nr_irqs) {
         return NULL;
@@ -327,7 +327,7 @@ static qemu_irq spapr_qirq_xive(sPAPRMachineState *spapr, int irq)
     return spapr->qirqs[irq];
 }
 
-static void spapr_irq_print_info_xive(sPAPRMachineState *spapr,
+static void spapr_irq_print_info_xive(SpaprMachineState *spapr,
                                       Monitor *mon)
 {
     CPUState *cs;
@@ -341,12 +341,12 @@ static void spapr_irq_print_info_xive(sPAPRMachineState *spapr,
     spapr_xive_pic_print_info(spapr->xive, mon);
 }
 
-static void spapr_irq_cpu_intc_create_xive(sPAPRMachineState *spapr,
+static void spapr_irq_cpu_intc_create_xive(SpaprMachineState *spapr,
                                            PowerPCCPU *cpu, Error **errp)
 {
     Error *local_err = NULL;
     Object *obj;
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
 
     obj = xive_tctx_create(OBJECT(cpu), XIVE_ROUTER(spapr->xive), &local_err);
     if (local_err) {
@@ -363,12 +363,12 @@ static void spapr_irq_cpu_intc_create_xive(sPAPRMachineState *spapr,
     spapr_xive_set_tctx_os_cam(spapr_cpu->tctx);
 }
 
-static int spapr_irq_post_load_xive(sPAPRMachineState *spapr, int version_id)
+static int spapr_irq_post_load_xive(SpaprMachineState *spapr, int version_id)
 {
     return 0;
 }
 
-static void spapr_irq_reset_xive(sPAPRMachineState *spapr, Error **errp)
+static void spapr_irq_reset_xive(SpaprMachineState *spapr, Error **errp)
 {
     CPUState *cs;
 
@@ -385,12 +385,12 @@ static void spapr_irq_reset_xive(sPAPRMachineState *spapr, Error **errp)
 
 static void spapr_irq_set_irq_xive(void *opaque, int srcno, int val)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     xive_source_set_irq(&spapr->xive->source, srcno, val);
 }
 
-static const char *spapr_irq_get_nodename_xive(sPAPRMachineState *spapr)
+static const char *spapr_irq_get_nodename_xive(SpaprMachineState *spapr)
 {
     return spapr->xive->nodename;
 }
@@ -403,7 +403,7 @@ static const char *spapr_irq_get_nodename_xive(sPAPRMachineState *spapr)
 #define SPAPR_IRQ_XIVE_NR_IRQS     0x2000
 #define SPAPR_IRQ_XIVE_NR_MSIS     (SPAPR_IRQ_XIVE_NR_IRQS - SPAPR_IRQ_MSI)
 
-sPAPRIrq spapr_irq_xive = {
+SpaprIrq spapr_irq_xive = {
     .nr_irqs     = SPAPR_IRQ_XIVE_NR_IRQS,
     .nr_msis     = SPAPR_IRQ_XIVE_NR_MSIS,
     .ov5         = SPAPR_OV5_XIVE_EXPLOIT,
@@ -434,13 +434,13 @@ sPAPRIrq spapr_irq_xive = {
  * Returns the sPAPR IRQ backend negotiated by CAS. XICS is the
  * default.
  */
-static sPAPRIrq *spapr_irq_current(sPAPRMachineState *spapr)
+static SpaprIrq *spapr_irq_current(SpaprMachineState *spapr)
 {
     return spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT) ?
         &spapr_irq_xive : &spapr_irq_xics;
 }
 
-static void spapr_irq_init_dual(sPAPRMachineState *spapr, int nr_irqs,
+static void spapr_irq_init_dual(SpaprMachineState *spapr, int nr_irqs,
                                 Error **errp)
 {
     MachineState *machine = MACHINE(spapr);
@@ -464,7 +464,7 @@ static void spapr_irq_init_dual(sPAPRMachineState *spapr, int nr_irqs,
     }
 }
 
-static int spapr_irq_claim_dual(sPAPRMachineState *spapr, int irq, bool lsi,
+static int spapr_irq_claim_dual(SpaprMachineState *spapr, int irq, bool lsi,
                                 Error **errp)
 {
     Error *local_err = NULL;
@@ -485,30 +485,30 @@ static int spapr_irq_claim_dual(sPAPRMachineState *spapr, int irq, bool lsi,
     return ret;
 }
 
-static void spapr_irq_free_dual(sPAPRMachineState *spapr, int irq, int num)
+static void spapr_irq_free_dual(SpaprMachineState *spapr, int irq, int num)
 {
     spapr_irq_xics.free(spapr, irq, num);
     spapr_irq_xive.free(spapr, irq, num);
 }
 
-static qemu_irq spapr_qirq_dual(sPAPRMachineState *spapr, int irq)
+static qemu_irq spapr_qirq_dual(SpaprMachineState *spapr, int irq)
 {
     return spapr_irq_current(spapr)->qirq(spapr, irq);
 }
 
-static void spapr_irq_print_info_dual(sPAPRMachineState *spapr, Monitor *mon)
+static void spapr_irq_print_info_dual(SpaprMachineState *spapr, Monitor *mon)
 {
     spapr_irq_current(spapr)->print_info(spapr, mon);
 }
 
-static void spapr_irq_dt_populate_dual(sPAPRMachineState *spapr,
+static void spapr_irq_dt_populate_dual(SpaprMachineState *spapr,
                                        uint32_t nr_servers, void *fdt,
                                        uint32_t phandle)
 {
     spapr_irq_current(spapr)->dt_populate(spapr, nr_servers, fdt, phandle);
 }
 
-static void spapr_irq_cpu_intc_create_dual(sPAPRMachineState *spapr,
+static void spapr_irq_cpu_intc_create_dual(SpaprMachineState *spapr,
                                            PowerPCCPU *cpu, Error **errp)
 {
     Error *local_err = NULL;
@@ -522,7 +522,7 @@ static void spapr_irq_cpu_intc_create_dual(sPAPRMachineState *spapr,
     spapr_irq_xics.cpu_intc_create(spapr, cpu, errp);
 }
 
-static int spapr_irq_post_load_dual(sPAPRMachineState *spapr, int version_id)
+static int spapr_irq_post_load_dual(SpaprMachineState *spapr, int version_id)
 {
     /*
      * Force a reset of the XIVE backend after migration. The machine
@@ -535,7 +535,7 @@ static int spapr_irq_post_load_dual(sPAPRMachineState *spapr, int version_id)
     return spapr_irq_current(spapr)->post_load(spapr, version_id);
 }
 
-static void spapr_irq_reset_dual(sPAPRMachineState *spapr, Error **errp)
+static void spapr_irq_reset_dual(SpaprMachineState *spapr, Error **errp)
 {
     /*
      * Deactivate the XIVE MMIOs. The XIVE backend will reenable them
@@ -548,12 +548,12 @@ static void spapr_irq_reset_dual(sPAPRMachineState *spapr, Error **errp)
 
 static void spapr_irq_set_irq_dual(void *opaque, int srcno, int val)
 {
-    sPAPRMachineState *spapr = opaque;
+    SpaprMachineState *spapr = opaque;
 
     spapr_irq_current(spapr)->set_irq(spapr, srcno, val);
 }
 
-static const char *spapr_irq_get_nodename_dual(sPAPRMachineState *spapr)
+static const char *spapr_irq_get_nodename_dual(SpaprMachineState *spapr)
 {
     return spapr_irq_current(spapr)->get_nodename(spapr);
 }
@@ -564,7 +564,7 @@ static const char *spapr_irq_get_nodename_dual(sPAPRMachineState *spapr)
 #define SPAPR_IRQ_DUAL_NR_IRQS     0x2000
 #define SPAPR_IRQ_DUAL_NR_MSIS     (SPAPR_IRQ_DUAL_NR_IRQS - SPAPR_IRQ_MSI)
 
-sPAPRIrq spapr_irq_dual = {
+SpaprIrq spapr_irq_dual = {
     .nr_irqs     = SPAPR_IRQ_DUAL_NR_IRQS,
     .nr_msis     = SPAPR_IRQ_DUAL_NR_MSIS,
     .ov5         = SPAPR_OV5_XIVE_BOTH,
@@ -585,7 +585,7 @@ sPAPRIrq spapr_irq_dual = {
 /*
  * sPAPR IRQ frontend routines for devices
  */
-void spapr_irq_init(sPAPRMachineState *spapr, Error **errp)
+void spapr_irq_init(SpaprMachineState *spapr, Error **errp)
 {
     MachineState *machine = MACHINE(spapr);
 
@@ -611,34 +611,34 @@ void spapr_irq_init(sPAPRMachineState *spapr, Error **errp)
                                       spapr->irq->nr_irqs);
 }
 
-int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp)
+int spapr_irq_claim(SpaprMachineState *spapr, int irq, bool lsi, Error **errp)
 {
     return spapr->irq->claim(spapr, irq, lsi, errp);
 }
 
-void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num)
+void spapr_irq_free(SpaprMachineState *spapr, int irq, int num)
 {
     spapr->irq->free(spapr, irq, num);
 }
 
-qemu_irq spapr_qirq(sPAPRMachineState *spapr, int irq)
+qemu_irq spapr_qirq(SpaprMachineState *spapr, int irq)
 {
     return spapr->irq->qirq(spapr, irq);
 }
 
-int spapr_irq_post_load(sPAPRMachineState *spapr, int version_id)
+int spapr_irq_post_load(SpaprMachineState *spapr, int version_id)
 {
     return spapr->irq->post_load(spapr, version_id);
 }
 
-void spapr_irq_reset(sPAPRMachineState *spapr, Error **errp)
+void spapr_irq_reset(SpaprMachineState *spapr, Error **errp)
 {
     if (spapr->irq->reset) {
         spapr->irq->reset(spapr, errp);
     }
 }
 
-int spapr_irq_get_phandle(sPAPRMachineState *spapr, void *fdt, Error **errp)
+int spapr_irq_get_phandle(SpaprMachineState *spapr, void *fdt, Error **errp)
 {
     const char *nodename = spapr->irq->get_nodename(spapr);
     int offset, phandle;
@@ -684,7 +684,7 @@ static int ics_find_free_block(ICSState *ics, int num, int alignnum)
     return -1;
 }
 
-int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp)
+int spapr_irq_find(SpaprMachineState *spapr, int num, bool align, Error **errp)
 {
     ICSState *ics = spapr->ics;
     int first = -1;
@@ -716,7 +716,7 @@ int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp)
 
 #define SPAPR_IRQ_XICS_LEGACY_NR_IRQS     0x400
 
-sPAPRIrq spapr_irq_xics_legacy = {
+SpaprIrq spapr_irq_xics_legacy = {
     .nr_irqs     = SPAPR_IRQ_XICS_LEGACY_NR_IRQS,
     .nr_msis     = SPAPR_IRQ_XICS_LEGACY_NR_IRQS,
     .ov5         = SPAPR_OV5_XIVE_LEGACY,
diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
index 318bf33de4..a65b7c7da9 100644
--- a/hw/ppc/spapr_ovec.c
+++ b/hw/ppc/spapr_ovec.c
@@ -26,7 +26,7 @@
  * allows us to more safely make assumptions about the bitmap size and
  * simplify the calling code somewhat
  */
-struct sPAPROptionVector {
+struct SpaprOptionVector {
     unsigned long *bitmap;
     int32_t bitmap_size; /* only used for migration */
 };
@@ -36,25 +36,25 @@ const VMStateDescription vmstate_spapr_ovec = {
     .version_id = 1,
     .minimum_version_id = 1,
     .fields = (VMStateField[]) {
-        VMSTATE_BITMAP(bitmap, sPAPROptionVector, 1, bitmap_size),
+        VMSTATE_BITMAP(bitmap, SpaprOptionVector, 1, bitmap_size),
         VMSTATE_END_OF_LIST()
     }
 };
 
-sPAPROptionVector *spapr_ovec_new(void)
+SpaprOptionVector *spapr_ovec_new(void)
 {
-    sPAPROptionVector *ov;
+    SpaprOptionVector *ov;
 
-    ov = g_new0(sPAPROptionVector, 1);
+    ov = g_new0(SpaprOptionVector, 1);
     ov->bitmap = bitmap_new(OV_MAXBITS);
     ov->bitmap_size = OV_MAXBITS;
 
     return ov;
 }
 
-sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov_orig)
+SpaprOptionVector *spapr_ovec_clone(SpaprOptionVector *ov_orig)
 {
-    sPAPROptionVector *ov;
+    SpaprOptionVector *ov;
 
     g_assert(ov_orig);
 
@@ -64,9 +64,9 @@ sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov_orig)
     return ov;
 }
 
-void spapr_ovec_intersect(sPAPROptionVector *ov,
-                          sPAPROptionVector *ov1,
-                          sPAPROptionVector *ov2)
+void spapr_ovec_intersect(SpaprOptionVector *ov,
+                          SpaprOptionVector *ov1,
+                          SpaprOptionVector *ov2)
 {
     g_assert(ov);
     g_assert(ov1);
@@ -76,9 +76,9 @@ void spapr_ovec_intersect(sPAPROptionVector *ov,
 }
 
 /* returns true if options bits were removed, false otherwise */
-bool spapr_ovec_diff(sPAPROptionVector *ov,
-                     sPAPROptionVector *ov_old,
-                     sPAPROptionVector *ov_new)
+bool spapr_ovec_diff(SpaprOptionVector *ov,
+                     SpaprOptionVector *ov_old,
+                     SpaprOptionVector *ov_new)
 {
     unsigned long *change_mask = bitmap_new(OV_MAXBITS);
     unsigned long *removed_bits = bitmap_new(OV_MAXBITS);
@@ -102,7 +102,7 @@ bool spapr_ovec_diff(sPAPROptionVector *ov,
     return bits_were_removed;
 }
 
-void spapr_ovec_cleanup(sPAPROptionVector *ov)
+void spapr_ovec_cleanup(SpaprOptionVector *ov)
 {
     if (ov) {
         g_free(ov->bitmap);
@@ -110,7 +110,7 @@ void spapr_ovec_cleanup(sPAPROptionVector *ov)
     }
 }
 
-void spapr_ovec_set(sPAPROptionVector *ov, long bitnr)
+void spapr_ovec_set(SpaprOptionVector *ov, long bitnr)
 {
     g_assert(ov);
     g_assert(bitnr < OV_MAXBITS);
@@ -118,7 +118,7 @@ void spapr_ovec_set(sPAPROptionVector *ov, long bitnr)
     set_bit(bitnr, ov->bitmap);
 }
 
-void spapr_ovec_clear(sPAPROptionVector *ov, long bitnr)
+void spapr_ovec_clear(SpaprOptionVector *ov, long bitnr)
 {
     g_assert(ov);
     g_assert(bitnr < OV_MAXBITS);
@@ -126,7 +126,7 @@ void spapr_ovec_clear(sPAPROptionVector *ov, long bitnr)
     clear_bit(bitnr, ov->bitmap);
 }
 
-bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr)
+bool spapr_ovec_test(SpaprOptionVector *ov, long bitnr)
 {
     g_assert(ov);
     g_assert(bitnr < OV_MAXBITS);
@@ -178,9 +178,9 @@ static target_ulong vector_addr(target_ulong table_addr, int vector)
     return table_addr;
 }
 
-sPAPROptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector)
+SpaprOptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector)
 {
-    sPAPROptionVector *ov;
+    SpaprOptionVector *ov;
     target_ulong addr;
     uint16_t vector_len;
     int i;
@@ -210,7 +210,7 @@ sPAPROptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector)
 }
 
 int spapr_ovec_populate_dt(void *fdt, int fdt_offset,
-                           sPAPROptionVector *ov, const char *name)
+                           SpaprOptionVector *ov, const char *name)
 {
     uint8_t vec[OV_MAXBYTES + 1];
     uint16_t vec_len;
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 69059c36eb..20915d2b3c 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -61,9 +61,9 @@
 #define RTAS_TYPE_MSI           1
 #define RTAS_TYPE_MSIX          2
 
-sPAPRPHBState *spapr_pci_find_phb(sPAPRMachineState *spapr, uint64_t buid)
+SpaprPhbState *spapr_pci_find_phb(SpaprMachineState *spapr, uint64_t buid)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
 
     QLIST_FOREACH(sphb, &spapr->phbs, list) {
         if (sphb->buid != buid) {
@@ -75,10 +75,10 @@ sPAPRPHBState *spapr_pci_find_phb(sPAPRMachineState *spapr, uint64_t buid)
     return NULL;
 }
 
-PCIDevice *spapr_pci_find_dev(sPAPRMachineState *spapr, uint64_t buid,
+PCIDevice *spapr_pci_find_dev(SpaprMachineState *spapr, uint64_t buid,
                               uint32_t config_addr)
 {
-    sPAPRPHBState *sphb = spapr_pci_find_phb(spapr, buid);
+    SpaprPhbState *sphb = spapr_pci_find_phb(spapr, buid);
     PCIHostState *phb = PCI_HOST_BRIDGE(sphb);
     int bus_num = (config_addr >> 16) & 0xFF;
     int devfn = (config_addr >> 8) & 0xFF;
@@ -96,7 +96,7 @@ static uint32_t rtas_pci_cfgaddr(uint32_t arg)
     return ((arg >> 20) & 0xf00) | (arg & 0xff);
 }
 
-static void finish_read_pci_config(sPAPRMachineState *spapr, uint64_t buid,
+static void finish_read_pci_config(SpaprMachineState *spapr, uint64_t buid,
                                    uint32_t addr, uint32_t size,
                                    target_ulong rets)
 {
@@ -126,7 +126,7 @@ static void finish_read_pci_config(sPAPRMachineState *spapr, uint64_t buid,
     rtas_st(rets, 1, val);
 }
 
-static void rtas_ibm_read_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_ibm_read_pci_config(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                      uint32_t token, uint32_t nargs,
                                      target_ulong args,
                                      uint32_t nret, target_ulong rets)
@@ -146,7 +146,7 @@ static void rtas_ibm_read_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     finish_read_pci_config(spapr, buid, addr, size, rets);
 }
 
-static void rtas_read_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_read_pci_config(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                  uint32_t token, uint32_t nargs,
                                  target_ulong args,
                                  uint32_t nret, target_ulong rets)
@@ -164,7 +164,7 @@ static void rtas_read_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     finish_read_pci_config(spapr, 0, addr, size, rets);
 }
 
-static void finish_write_pci_config(sPAPRMachineState *spapr, uint64_t buid,
+static void finish_write_pci_config(SpaprMachineState *spapr, uint64_t buid,
                                     uint32_t addr, uint32_t size,
                                     uint32_t val, target_ulong rets)
 {
@@ -192,7 +192,7 @@ static void finish_write_pci_config(sPAPRMachineState *spapr, uint64_t buid,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static void rtas_ibm_write_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_ibm_write_pci_config(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                       uint32_t token, uint32_t nargs,
                                       target_ulong args,
                                       uint32_t nret, target_ulong rets)
@@ -213,7 +213,7 @@ static void rtas_ibm_write_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     finish_write_pci_config(spapr, buid, addr, size, val, rets);
 }
 
-static void rtas_write_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_write_pci_config(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                   uint32_t token, uint32_t nargs,
                                   target_ulong args,
                                   uint32_t nret, target_ulong rets)
@@ -262,12 +262,12 @@ static void spapr_msi_setmsg(PCIDevice *pdev, hwaddr addr, bool msix,
     }
 }
 
-static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_ibm_change_msi(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                 uint32_t token, uint32_t nargs,
                                 target_ulong args, uint32_t nret,
                                 target_ulong rets)
 {
-    sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
+    SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr);
     uint32_t config_addr = rtas_ld(args, 0);
     uint64_t buid = rtas_ldq(args, 1);
     unsigned int func = rtas_ld(args, 3);
@@ -275,14 +275,14 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     unsigned int seq_num = rtas_ld(args, 5);
     unsigned int ret_intr_type;
     unsigned int irq, max_irqs = 0;
-    sPAPRPHBState *phb = NULL;
+    SpaprPhbState *phb = NULL;
     PCIDevice *pdev = NULL;
     spapr_pci_msi *msi;
     int *config_addr_key;
     Error *err = NULL;
     int i;
 
-    /* Fins sPAPRPHBState */
+    /* Fins SpaprPhbState */
     phb = spapr_pci_find_phb(spapr, buid);
     if (phb) {
         pdev = spapr_pci_find_dev(spapr, buid, config_addr);
@@ -439,7 +439,7 @@ out:
 }
 
 static void rtas_ibm_query_interrupt_source_number(PowerPCCPU *cpu,
-                                                   sPAPRMachineState *spapr,
+                                                   SpaprMachineState *spapr,
                                                    uint32_t token,
                                                    uint32_t nargs,
                                                    target_ulong args,
@@ -449,11 +449,11 @@ static void rtas_ibm_query_interrupt_source_number(PowerPCCPU *cpu,
     uint32_t config_addr = rtas_ld(args, 0);
     uint64_t buid = rtas_ldq(args, 1);
     unsigned int intr_src_num = -1, ioa_intr_num = rtas_ld(args, 3);
-    sPAPRPHBState *phb = NULL;
+    SpaprPhbState *phb = NULL;
     PCIDevice *pdev = NULL;
     spapr_pci_msi *msi;
 
-    /* Find sPAPRPHBState */
+    /* Find SpaprPhbState */
     phb = spapr_pci_find_phb(spapr, buid);
     if (phb) {
         pdev = spapr_pci_find_dev(spapr, buid, config_addr);
@@ -480,12 +480,12 @@ static void rtas_ibm_query_interrupt_source_number(PowerPCCPU *cpu,
 }
 
 static void rtas_ibm_set_eeh_option(PowerPCCPU *cpu,
-                                    sPAPRMachineState *spapr,
+                                    SpaprMachineState *spapr,
                                     uint32_t token, uint32_t nargs,
                                     target_ulong args, uint32_t nret,
                                     target_ulong rets)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
     uint32_t addr, option;
     uint64_t buid;
     int ret;
@@ -516,12 +516,12 @@ param_error_exit:
 }
 
 static void rtas_ibm_get_config_addr_info2(PowerPCCPU *cpu,
-                                           sPAPRMachineState *spapr,
+                                           SpaprMachineState *spapr,
                                            uint32_t token, uint32_t nargs,
                                            target_ulong args, uint32_t nret,
                                            target_ulong rets)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
     PCIDevice *pdev;
     uint32_t addr, option;
     uint64_t buid;
@@ -570,12 +570,12 @@ param_error_exit:
 }
 
 static void rtas_ibm_read_slot_reset_state2(PowerPCCPU *cpu,
-                                            sPAPRMachineState *spapr,
+                                            SpaprMachineState *spapr,
                                             uint32_t token, uint32_t nargs,
                                             target_ulong args, uint32_t nret,
                                             target_ulong rets)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
     uint64_t buid;
     int state, ret;
 
@@ -612,12 +612,12 @@ param_error_exit:
 }
 
 static void rtas_ibm_set_slot_reset(PowerPCCPU *cpu,
-                                    sPAPRMachineState *spapr,
+                                    SpaprMachineState *spapr,
                                     uint32_t token, uint32_t nargs,
                                     target_ulong args, uint32_t nret,
                                     target_ulong rets)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
     uint32_t option;
     uint64_t buid;
     int ret;
@@ -646,12 +646,12 @@ param_error_exit:
 }
 
 static void rtas_ibm_configure_pe(PowerPCCPU *cpu,
-                                  sPAPRMachineState *spapr,
+                                  SpaprMachineState *spapr,
                                   uint32_t token, uint32_t nargs,
                                   target_ulong args, uint32_t nret,
                                   target_ulong rets)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
     uint64_t buid;
     int ret;
 
@@ -679,12 +679,12 @@ param_error_exit:
 
 /* To support it later */
 static void rtas_ibm_slot_error_detail(PowerPCCPU *cpu,
-                                       sPAPRMachineState *spapr,
+                                       SpaprMachineState *spapr,
                                        uint32_t token, uint32_t nargs,
                                        target_ulong args, uint32_t nret,
                                        target_ulong rets)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
     int option;
     uint64_t buid;
 
@@ -741,7 +741,7 @@ static void pci_spapr_set_irq(void *opaque, int irq_num, int level)
      * Here we use the number returned by pci_spapr_map_irq to find a
      * corresponding qemu_irq.
      */
-    sPAPRPHBState *phb = opaque;
+    SpaprPhbState *phb = opaque;
 
     trace_spapr_pci_lsi_set(phb->dtbusname, irq_num, phb->lsi_table[irq_num].irq);
     qemu_set_irq(spapr_phb_lsi_qirq(phb, irq_num), level);
@@ -749,7 +749,7 @@ static void pci_spapr_set_irq(void *opaque, int irq_num, int level)
 
 static PCIINTxRoute spapr_route_intx_pin_to_irq(void *opaque, int pin)
 {
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(opaque);
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(opaque);
     PCIINTxRoute route;
 
     route.mode = PCI_INTX_ENABLED;
@@ -766,7 +766,7 @@ static PCIINTxRoute spapr_route_intx_pin_to_irq(void *opaque, int pin)
 static void spapr_msi_write(void *opaque, hwaddr addr,
                             uint64_t data, unsigned size)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
     uint32_t irq = data;
 
     trace_spapr_pci_msi_write(addr, data, irq);
@@ -786,12 +786,12 @@ static const MemoryRegionOps spapr_msi_ops = {
  */
 static AddressSpace *spapr_pci_dma_iommu(PCIBus *bus, void *opaque, int devfn)
 {
-    sPAPRPHBState *phb = opaque;
+    SpaprPhbState *phb = opaque;
 
     return &phb->iommu_as;
 }
 
-static char *spapr_phb_vfio_get_loc_code(sPAPRPHBState *sphb,  PCIDevice *pdev)
+static char *spapr_phb_vfio_get_loc_code(SpaprPhbState *sphb,  PCIDevice *pdev)
 {
     char *path = NULL, *buf = NULL, *host = NULL;
 
@@ -822,7 +822,7 @@ err_out:
     return NULL;
 }
 
-static char *spapr_phb_get_loc_code(sPAPRPHBState *sphb, PCIDevice *pdev)
+static char *spapr_phb_get_loc_code(SpaprPhbState *sphb, PCIDevice *pdev)
 {
     char *buf;
     const char *devtype = "qemu";
@@ -1249,11 +1249,11 @@ static gchar *pci_get_node_name(PCIDevice *dev)
     }
 }
 
-static uint32_t spapr_phb_get_pci_drc_index(sPAPRPHBState *phb,
+static uint32_t spapr_phb_get_pci_drc_index(SpaprPhbState *phb,
                                             PCIDevice *pdev);
 
 static void spapr_populate_pci_child_dt(PCIDevice *dev, void *fdt, int offset,
-                                       sPAPRPHBState *sphb)
+                                       SpaprPhbState *sphb)
 {
     ResourceProps rp;
     bool is_bridge = false;
@@ -1358,7 +1358,7 @@ static void spapr_populate_pci_child_dt(PCIDevice *dev, void *fdt, int offset,
 }
 
 /* create OF node for pci device and required OF DT properties */
-static int spapr_create_pci_child_dt(sPAPRPHBState *phb, PCIDevice *dev,
+static int spapr_create_pci_child_dt(SpaprPhbState *phb, PCIDevice *dev,
                                      void *fdt, int node_offset)
 {
     int offset;
@@ -1382,7 +1382,7 @@ void spapr_phb_remove_pci_device_cb(DeviceState *dev)
     object_unparent(OBJECT(dev));
 }
 
-static sPAPRDRConnector *spapr_phb_get_pci_func_drc(sPAPRPHBState *phb,
+static SpaprDrc *spapr_phb_get_pci_func_drc(SpaprPhbState *phb,
                                                     uint32_t busnr,
                                                     int32_t devfn)
 {
@@ -1390,17 +1390,17 @@ static sPAPRDRConnector *spapr_phb_get_pci_func_drc(sPAPRPHBState *phb,
                            (phb->index << 16) | (busnr << 8) | devfn);
 }
 
-static sPAPRDRConnector *spapr_phb_get_pci_drc(sPAPRPHBState *phb,
+static SpaprDrc *spapr_phb_get_pci_drc(SpaprPhbState *phb,
                                                PCIDevice *pdev)
 {
     uint32_t busnr = pci_bus_num(PCI_BUS(qdev_get_parent_bus(DEVICE(pdev))));
     return spapr_phb_get_pci_func_drc(phb, busnr, pdev->devfn);
 }
 
-static uint32_t spapr_phb_get_pci_drc_index(sPAPRPHBState *phb,
+static uint32_t spapr_phb_get_pci_drc_index(SpaprPhbState *phb,
                                             PCIDevice *pdev)
 {
-    sPAPRDRConnector *drc = spapr_phb_get_pci_drc(phb, pdev);
+    SpaprDrc *drc = spapr_phb_get_pci_drc(phb, pdev);
 
     if (!drc) {
         return 0;
@@ -1409,11 +1409,11 @@ static uint32_t spapr_phb_get_pci_drc_index(sPAPRPHBState *phb,
     return spapr_drc_index(drc);
 }
 
-int spapr_pci_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
+int spapr_pci_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
                           void *fdt, int *fdt_start_offset, Error **errp)
 {
     HotplugHandler *plug_handler = qdev_get_hotplug_handler(drc->dev);
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(plug_handler);
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(plug_handler);
     PCIDevice *pdev = PCI_DEVICE(drc->dev);
 
     *fdt_start_offset = spapr_create_pci_child_dt(sphb, pdev, fdt, 0);
@@ -1423,9 +1423,9 @@ int spapr_pci_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
 static void spapr_pci_plug(HotplugHandler *plug_handler,
                            DeviceState *plugged_dev, Error **errp)
 {
-    sPAPRPHBState *phb = SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler));
+    SpaprPhbState *phb = SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler));
     PCIDevice *pdev = PCI_DEVICE(plugged_dev);
-    sPAPRDRConnector *drc = spapr_phb_get_pci_drc(phb, pdev);
+    SpaprDrc *drc = spapr_phb_get_pci_drc(phb, pdev);
     Error *local_err = NULL;
     PCIBus *bus = PCI_BUS(qdev_get_parent_bus(DEVICE(pdev)));
     uint32_t slotnr = PCI_SLOT(pdev->devfn);
@@ -1472,9 +1472,9 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
         int i;
 
         for (i = 0; i < 8; i++) {
-            sPAPRDRConnector *func_drc;
-            sPAPRDRConnectorClass *func_drck;
-            sPAPRDREntitySense state;
+            SpaprDrc *func_drc;
+            SpaprDrcClass *func_drck;
+            SpaprDREntitySense state;
 
             func_drc = spapr_phb_get_pci_func_drc(phb, pci_bus_num(bus),
                                                   PCI_DEVFN(slotnr, i));
@@ -1513,9 +1513,9 @@ static void spapr_pci_unplug(HotplugHandler *plug_handler,
 static void spapr_pci_unplug_request(HotplugHandler *plug_handler,
                                      DeviceState *plugged_dev, Error **errp)
 {
-    sPAPRPHBState *phb = SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler));
+    SpaprPhbState *phb = SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler));
     PCIDevice *pdev = PCI_DEVICE(plugged_dev);
-    sPAPRDRConnector *drc = spapr_phb_get_pci_drc(phb, pdev);
+    SpaprDrc *drc = spapr_phb_get_pci_drc(phb, pdev);
 
     if (!phb->dr_enabled) {
         error_setg(errp, QERR_BUS_NO_HOTPLUG,
@@ -1529,9 +1529,9 @@ static void spapr_pci_unplug_request(HotplugHandler *plug_handler,
     if (!spapr_drc_unplug_requested(drc)) {
         PCIBus *bus = PCI_BUS(qdev_get_parent_bus(DEVICE(pdev)));
         uint32_t slotnr = PCI_SLOT(pdev->devfn);
-        sPAPRDRConnector *func_drc;
-        sPAPRDRConnectorClass *func_drck;
-        sPAPRDREntitySense state;
+        SpaprDrc *func_drc;
+        SpaprDrcClass *func_drck;
+        SpaprDREntitySense state;
         int i;
 
         /* ensure any other present functions are pending unplug */
@@ -1573,7 +1573,7 @@ static void spapr_pci_unplug_request(HotplugHandler *plug_handler,
 
 static void spapr_phb_finalizefn(Object *obj)
 {
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(obj);
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(obj);
 
     g_free(sphb->dtbusname);
     sphb->dtbusname = NULL;
@@ -1581,11 +1581,11 @@ static void spapr_phb_finalizefn(Object *obj)
 
 static void spapr_phb_unrealize(DeviceState *dev, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
     SysBusDevice *s = SYS_BUS_DEVICE(dev);
     PCIHostState *phb = PCI_HOST_BRIDGE(s);
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(phb);
-    sPAPRTCETable *tcet;
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(phb);
+    SpaprTceTable *tcet;
     int i;
     const unsigned windows_supported = spapr_phb_windows_supported(sphb);
 
@@ -1608,7 +1608,7 @@ static void spapr_phb_unrealize(DeviceState *dev, Error **errp)
 
     if (sphb->dr_enabled) {
         for (i = PCI_SLOT_MAX * 8 - 1; i >= 0; i--) {
-            sPAPRDRConnector *drc = spapr_drc_by_id(TYPE_SPAPR_DRC_PCI,
+            SpaprDrc *drc = spapr_drc_by_id(TYPE_SPAPR_DRC_PCI,
                                                     (sphb->index << 16) | i);
 
             if (drc) {
@@ -1645,18 +1645,18 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
     /* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
      * tries to add a sPAPR PHB to a non-pseries machine.
      */
-    sPAPRMachineState *spapr =
-        (sPAPRMachineState *) object_dynamic_cast(qdev_get_machine(),
+    SpaprMachineState *spapr =
+        (SpaprMachineState *) object_dynamic_cast(qdev_get_machine(),
                                                   TYPE_SPAPR_MACHINE);
-    sPAPRMachineClass *smc = spapr ? SPAPR_MACHINE_GET_CLASS(spapr) : NULL;
+    SpaprMachineClass *smc = spapr ? SPAPR_MACHINE_GET_CLASS(spapr) : NULL;
     SysBusDevice *s = SYS_BUS_DEVICE(dev);
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(s);
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(s);
     PCIHostState *phb = PCI_HOST_BRIDGE(s);
     char *namebuf;
     int i;
     PCIBus *bus;
     uint64_t msi_window_size = 4096;
-    sPAPRTCETable *tcet;
+    SpaprTceTable *tcet;
     const unsigned windows_supported = spapr_phb_windows_supported(sphb);
 
     if (!spapr) {
@@ -1855,10 +1855,10 @@ static int spapr_phb_children_reset(Object *child, void *opaque)
     return 0;
 }
 
-void spapr_phb_dma_reset(sPAPRPHBState *sphb)
+void spapr_phb_dma_reset(SpaprPhbState *sphb)
 {
     int i;
-    sPAPRTCETable *tcet;
+    SpaprTceTable *tcet;
 
     for (i = 0; i < SPAPR_PCI_DMA_MAX_WINDOWS; ++i) {
         tcet = spapr_tce_find_by_liobn(sphb->dma_liobn[i]);
@@ -1876,7 +1876,7 @@ void spapr_phb_dma_reset(sPAPRPHBState *sphb)
 
 static void spapr_phb_reset(DeviceState *qdev)
 {
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(qdev);
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(qdev);
 
     spapr_phb_dma_reset(sphb);
 
@@ -1889,27 +1889,27 @@ static void spapr_phb_reset(DeviceState *qdev)
 }
 
 static Property spapr_phb_properties[] = {
-    DEFINE_PROP_UINT32("index", sPAPRPHBState, index, -1),
-    DEFINE_PROP_UINT64("mem_win_size", sPAPRPHBState, mem_win_size,
+    DEFINE_PROP_UINT32("index", SpaprPhbState, index, -1),
+    DEFINE_PROP_UINT64("mem_win_size", SpaprPhbState, mem_win_size,
                        SPAPR_PCI_MEM32_WIN_SIZE),
-    DEFINE_PROP_UINT64("mem64_win_size", sPAPRPHBState, mem64_win_size,
+    DEFINE_PROP_UINT64("mem64_win_size", SpaprPhbState, mem64_win_size,
                        SPAPR_PCI_MEM64_WIN_SIZE),
-    DEFINE_PROP_UINT64("io_win_size", sPAPRPHBState, io_win_size,
+    DEFINE_PROP_UINT64("io_win_size", SpaprPhbState, io_win_size,
                        SPAPR_PCI_IO_WIN_SIZE),
-    DEFINE_PROP_BOOL("dynamic-reconfiguration", sPAPRPHBState, dr_enabled,
+    DEFINE_PROP_BOOL("dynamic-reconfiguration", SpaprPhbState, dr_enabled,
                      true),
     /* Default DMA window is 0..1GB */
-    DEFINE_PROP_UINT64("dma_win_addr", sPAPRPHBState, dma_win_addr, 0),
-    DEFINE_PROP_UINT64("dma_win_size", sPAPRPHBState, dma_win_size, 0x40000000),
-    DEFINE_PROP_UINT64("dma64_win_addr", sPAPRPHBState, dma64_win_addr,
+    DEFINE_PROP_UINT64("dma_win_addr", SpaprPhbState, dma_win_addr, 0),
+    DEFINE_PROP_UINT64("dma_win_size", SpaprPhbState, dma_win_size, 0x40000000),
+    DEFINE_PROP_UINT64("dma64_win_addr", SpaprPhbState, dma64_win_addr,
                        0x800000000000000ULL),
-    DEFINE_PROP_BOOL("ddw", sPAPRPHBState, ddw_enabled, true),
-    DEFINE_PROP_UINT64("pgsz", sPAPRPHBState, page_size_mask,
+    DEFINE_PROP_BOOL("ddw", SpaprPhbState, ddw_enabled, true),
+    DEFINE_PROP_UINT64("pgsz", SpaprPhbState, page_size_mask,
                        (1ULL << 12) | (1ULL << 16)),
-    DEFINE_PROP_UINT32("numa_node", sPAPRPHBState, numa_node, -1),
-    DEFINE_PROP_BOOL("pre-2.8-migration", sPAPRPHBState,
+    DEFINE_PROP_UINT32("numa_node", SpaprPhbState, numa_node, -1),
+    DEFINE_PROP_BOOL("pre-2.8-migration", SpaprPhbState,
                      pre_2_8_migration, false),
-    DEFINE_PROP_BOOL("pcie-extended-configuration-space", sPAPRPHBState,
+    DEFINE_PROP_BOOL("pcie-extended-configuration-space", SpaprPhbState,
                      pcie_ecs, true),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -1939,7 +1939,7 @@ static const VMStateDescription vmstate_spapr_pci_msi = {
 
 static int spapr_pci_pre_save(void *opaque)
 {
-    sPAPRPHBState *sphb = opaque;
+    SpaprPhbState *sphb = opaque;
     GHashTableIter iter;
     gpointer key, value;
     int i;
@@ -1977,7 +1977,7 @@ static int spapr_pci_pre_save(void *opaque)
 
 static int spapr_pci_post_load(void *opaque, int version_id)
 {
-    sPAPRPHBState *sphb = opaque;
+    SpaprPhbState *sphb = opaque;
     gpointer key, value;
     int i;
 
@@ -1997,7 +1997,7 @@ static int spapr_pci_post_load(void *opaque, int version_id)
 
 static bool pre_2_8_migration(void *opaque, int version_id)
 {
-    sPAPRPHBState *sphb = opaque;
+    SpaprPhbState *sphb = opaque;
 
     return sphb->pre_2_8_migration;
 }
@@ -2009,16 +2009,16 @@ static const VMStateDescription vmstate_spapr_pci = {
     .pre_save = spapr_pci_pre_save,
     .post_load = spapr_pci_post_load,
     .fields = (VMStateField[]) {
-        VMSTATE_UINT64_EQUAL(buid, sPAPRPHBState, NULL),
-        VMSTATE_UINT32_TEST(mig_liobn, sPAPRPHBState, pre_2_8_migration),
-        VMSTATE_UINT64_TEST(mig_mem_win_addr, sPAPRPHBState, pre_2_8_migration),
-        VMSTATE_UINT64_TEST(mig_mem_win_size, sPAPRPHBState, pre_2_8_migration),
-        VMSTATE_UINT64_TEST(mig_io_win_addr, sPAPRPHBState, pre_2_8_migration),
-        VMSTATE_UINT64_TEST(mig_io_win_size, sPAPRPHBState, pre_2_8_migration),
-        VMSTATE_STRUCT_ARRAY(lsi_table, sPAPRPHBState, PCI_NUM_PINS, 0,
+        VMSTATE_UINT64_EQUAL(buid, SpaprPhbState, NULL),
+        VMSTATE_UINT32_TEST(mig_liobn, SpaprPhbState, pre_2_8_migration),
+        VMSTATE_UINT64_TEST(mig_mem_win_addr, SpaprPhbState, pre_2_8_migration),
+        VMSTATE_UINT64_TEST(mig_mem_win_size, SpaprPhbState, pre_2_8_migration),
+        VMSTATE_UINT64_TEST(mig_io_win_addr, SpaprPhbState, pre_2_8_migration),
+        VMSTATE_UINT64_TEST(mig_io_win_size, SpaprPhbState, pre_2_8_migration),
+        VMSTATE_STRUCT_ARRAY(lsi_table, SpaprPhbState, PCI_NUM_PINS, 0,
                              vmstate_spapr_pci_lsi, struct spapr_pci_lsi),
-        VMSTATE_INT32(msi_devs_num, sPAPRPHBState),
-        VMSTATE_STRUCT_VARRAY_ALLOC(msi_devs, sPAPRPHBState, msi_devs_num, 0,
+        VMSTATE_INT32(msi_devs_num, SpaprPhbState),
+        VMSTATE_STRUCT_VARRAY_ALLOC(msi_devs, SpaprPhbState, msi_devs_num, 0,
                                     vmstate_spapr_pci_msi, spapr_pci_msi_mig),
         VMSTATE_END_OF_LIST()
     },
@@ -2027,7 +2027,7 @@ static const VMStateDescription vmstate_spapr_pci = {
 static const char *spapr_phb_root_bus_path(PCIHostState *host_bridge,
                                            PCIBus *rootbus)
 {
-    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(host_bridge);
+    SpaprPhbState *sphb = SPAPR_PCI_HOST_BRIDGE(host_bridge);
 
     return sphb->dtbusname;
 }
@@ -2055,7 +2055,7 @@ static void spapr_phb_class_init(ObjectClass *klass, void *data)
 static const TypeInfo spapr_phb_info = {
     .name          = TYPE_SPAPR_PCI_HOST_BRIDGE,
     .parent        = TYPE_PCI_HOST_BRIDGE,
-    .instance_size = sizeof(sPAPRPHBState),
+    .instance_size = sizeof(SpaprPhbState),
     .instance_finalize = spapr_phb_finalizefn,
     .class_init    = spapr_phb_class_init,
     .interfaces    = (InterfaceInfo[]) {
@@ -2064,19 +2064,19 @@ static const TypeInfo spapr_phb_info = {
     }
 };
 
-typedef struct sPAPRFDT {
+typedef struct SpaprFdt {
     void *fdt;
     int node_off;
-    sPAPRPHBState *sphb;
-} sPAPRFDT;
+    SpaprPhbState *sphb;
+} SpaprFdt;
 
 static void spapr_populate_pci_devices_dt(PCIBus *bus, PCIDevice *pdev,
                                           void *opaque)
 {
     PCIBus *sec_bus;
-    sPAPRFDT *p = opaque;
+    SpaprFdt *p = opaque;
     int offset;
-    sPAPRFDT s_fdt;
+    SpaprFdt s_fdt;
 
     offset = spapr_create_pci_child_dt(p->sphb, pdev, p->fdt, p->node_off);
     if (!offset) {
@@ -2128,7 +2128,7 @@ static void spapr_phb_pci_enumerate_bridge(PCIBus *bus, PCIDevice *pdev,
     pci_default_write_config(pdev, PCI_SUBORDINATE_BUS, *bus_no, 1);
 }
 
-static void spapr_phb_pci_enumerate(sPAPRPHBState *phb)
+static void spapr_phb_pci_enumerate(SpaprPhbState *phb)
 {
     PCIBus *bus = PCI_HOST_BRIDGE(phb)->bus;
     unsigned int bus_no = 0;
@@ -2139,7 +2139,7 @@ static void spapr_phb_pci_enumerate(sPAPRPHBState *phb)
 
 }
 
-int spapr_populate_pci_dt(sPAPRPHBState *phb, uint32_t intc_phandle, void *fdt,
+int spapr_populate_pci_dt(SpaprPhbState *phb, uint32_t intc_phandle, void *fdt,
                           uint32_t nr_msis, int *node_offset)
 {
     int bus_off, i, j, ret;
@@ -2187,10 +2187,10 @@ int spapr_populate_pci_dt(sPAPRPHBState *phb, uint32_t intc_phandle, void *fdt,
                                 cpu_to_be32(0x0),
                                 cpu_to_be32(0x0),
                                 cpu_to_be32(phb->numa_node)};
-    sPAPRTCETable *tcet;
+    SpaprTceTable *tcet;
     PCIBus *bus = PCI_HOST_BRIDGE(phb)->bus;
-    sPAPRFDT s_fdt;
-    sPAPRDRConnector *drc;
+    SpaprFdt s_fdt;
+    SpaprDrc *drc;
 
     /* Start populating the FDT */
     nodename = g_strdup_printf("pci@%" PRIx64, phb->buid);
@@ -2345,8 +2345,8 @@ static int spapr_switch_one_vga(DeviceState *dev, void *opaque)
 
 void spapr_pci_switch_vga(bool big_endian)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
-    sPAPRPHBState *sphb;
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprPhbState *sphb;
 
     /*
      * For backward compatibility with existing guests, we switch
diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c
index 71491dbd28..5f5dde567d 100644
--- a/hw/ppc/spapr_pci_vfio.c
+++ b/hw/ppc/spapr_pci_vfio.c
@@ -28,12 +28,12 @@
 #include "qemu/error-report.h"
 #include "sysemu/qtest.h"
 
-bool spapr_phb_eeh_available(sPAPRPHBState *sphb)
+bool spapr_phb_eeh_available(SpaprPhbState *sphb)
 {
     return vfio_eeh_as_ok(&sphb->iommu_as);
 }
 
-static void spapr_phb_vfio_eeh_reenable(sPAPRPHBState *sphb)
+static void spapr_phb_vfio_eeh_reenable(SpaprPhbState *sphb)
 {
     vfio_eeh_as_op(&sphb->iommu_as, VFIO_EEH_PE_ENABLE);
 }
@@ -49,7 +49,7 @@ void spapr_phb_vfio_reset(DeviceState *qdev)
     spapr_phb_vfio_eeh_reenable(SPAPR_PCI_HOST_BRIDGE(qdev));
 }
 
-int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb,
+int spapr_phb_vfio_eeh_set_option(SpaprPhbState *sphb,
                                   unsigned int addr, int option)
 {
     uint32_t op;
@@ -96,7 +96,7 @@ int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb,
     return RTAS_OUT_SUCCESS;
 }
 
-int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state)
+int spapr_phb_vfio_eeh_get_state(SpaprPhbState *sphb, int *state)
 {
     int ret;
 
@@ -145,14 +145,14 @@ static void spapr_phb_vfio_eeh_clear_bus_msix(PCIBus *bus, void *opaque)
                            spapr_phb_vfio_eeh_clear_dev_msix, NULL);
 }
 
-static void spapr_phb_vfio_eeh_pre_reset(sPAPRPHBState *sphb)
+static void spapr_phb_vfio_eeh_pre_reset(SpaprPhbState *sphb)
 {
        PCIHostState *phb = PCI_HOST_BRIDGE(sphb);
 
        pci_for_each_bus(phb->bus, spapr_phb_vfio_eeh_clear_bus_msix, NULL);
 }
 
-int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option)
+int spapr_phb_vfio_eeh_reset(SpaprPhbState *sphb, int option)
 {
     uint32_t op;
     int ret;
@@ -181,7 +181,7 @@ int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option)
     return RTAS_OUT_SUCCESS;
 }
 
-int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb)
+int spapr_phb_vfio_eeh_configure(SpaprPhbState *sphb)
 {
     int ret;
 
diff --git a/hw/ppc/spapr_rng.c b/hw/ppc/spapr_rng.c
index 644bac96f8..4060987590 100644
--- a/hw/ppc/spapr_rng.c
+++ b/hw/ppc/spapr_rng.c
@@ -29,15 +29,15 @@
 #include "kvm_ppc.h"
 
 #define SPAPR_RNG(obj) \
-    OBJECT_CHECK(sPAPRRngState, (obj), TYPE_SPAPR_RNG)
+    OBJECT_CHECK(SpaprRngState, (obj), TYPE_SPAPR_RNG)
 
-struct sPAPRRngState {
+struct SpaprRngState {
     /*< private >*/
     DeviceState ds;
     RngBackend *backend;
     bool use_kvm;
 };
-typedef struct sPAPRRngState sPAPRRngState;
+typedef struct SpaprRngState SpaprRngState;
 
 struct HRandomData {
     QemuSemaphore sem;
@@ -64,10 +64,10 @@ static void random_recv(void *dest, const void *src, size_t size)
 }
 
 /* Handler for the H_RANDOM hypercall */
-static target_ulong h_random(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_random(PowerPCCPU *cpu, SpaprMachineState *spapr,
                              target_ulong opcode, target_ulong *args)
 {
-    sPAPRRngState *rngstate;
+    SpaprRngState *rngstate;
     HRandomData hrdata;
 
     rngstate = SPAPR_RNG(object_resolve_path_type("", TYPE_SPAPR_RNG, NULL));
@@ -109,7 +109,7 @@ static void spapr_rng_instance_init(Object *obj)
 static void spapr_rng_realize(DeviceState *dev, Error **errp)
 {
 
-    sPAPRRngState *rngstate = SPAPR_RNG(dev);
+    SpaprRngState *rngstate = SPAPR_RNG(dev);
 
     if (rngstate->use_kvm) {
         if (kvmppc_enable_hwrng() == 0) {
@@ -133,8 +133,8 @@ static void spapr_rng_realize(DeviceState *dev, Error **errp)
 }
 
 static Property spapr_rng_properties[] = {
-    DEFINE_PROP_BOOL("use-kvm", sPAPRRngState, use_kvm, false),
-    DEFINE_PROP_LINK("rng", sPAPRRngState, backend, TYPE_RNG_BACKEND,
+    DEFINE_PROP_BOOL("use-kvm", SpaprRngState, use_kvm, false),
+    DEFINE_PROP_LINK("rng", SpaprRngState, backend, TYPE_RNG_BACKEND,
                      RngBackend *),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -152,7 +152,7 @@ static void spapr_rng_class_init(ObjectClass *oc, void *data)
 static const TypeInfo spapr_rng_info = {
     .name          = TYPE_SPAPR_RNG,
     .parent        = TYPE_DEVICE,
-    .instance_size = sizeof(sPAPRRngState),
+    .instance_size = sizeof(SpaprRngState),
     .instance_init = spapr_rng_instance_init,
     .class_init    = spapr_rng_class_init,
 };
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index 7a2cb786a3..24c45b12d4 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -50,13 +50,13 @@
 #include "target/ppc/mmu-hash64.h"
 #include "target/ppc/mmu-book3s-v3.h"
 
-static void rtas_display_character(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_display_character(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                    uint32_t token, uint32_t nargs,
                                    target_ulong args,
                                    uint32_t nret, target_ulong rets)
 {
     uint8_t c = rtas_ld(args, 0);
-    VIOsPAPRDevice *sdev = vty_lookup(spapr, 0);
+    SpaprVioDevice *sdev = vty_lookup(spapr, 0);
 
     if (!sdev) {
         rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
@@ -66,7 +66,7 @@ static void rtas_display_character(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     }
 }
 
-static void rtas_power_off(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_power_off(PowerPCCPU *cpu, SpaprMachineState *spapr,
                            uint32_t token, uint32_t nargs, target_ulong args,
                            uint32_t nret, target_ulong rets)
 {
@@ -79,7 +79,7 @@ static void rtas_power_off(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static void rtas_system_reboot(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_system_reboot(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                uint32_t token, uint32_t nargs,
                                target_ulong args,
                                uint32_t nret, target_ulong rets)
@@ -93,7 +93,7 @@ static void rtas_system_reboot(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 }
 
 static void rtas_query_cpu_stopped_state(PowerPCCPU *cpu_,
-                                         sPAPRMachineState *spapr,
+                                         SpaprMachineState *spapr,
                                          uint32_t token, uint32_t nargs,
                                          target_ulong args,
                                          uint32_t nret, target_ulong rets)
@@ -123,7 +123,7 @@ static void rtas_query_cpu_stopped_state(PowerPCCPU *cpu_,
     rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
 }
 
-static void rtas_start_cpu(PowerPCCPU *callcpu, sPAPRMachineState *spapr,
+static void rtas_start_cpu(PowerPCCPU *callcpu, SpaprMachineState *spapr,
                            uint32_t token, uint32_t nargs,
                            target_ulong args,
                            uint32_t nret, target_ulong rets)
@@ -194,7 +194,7 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, sPAPRMachineState *spapr,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static void rtas_stop_self(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_stop_self(PowerPCCPU *cpu, SpaprMachineState *spapr,
                            uint32_t token, uint32_t nargs,
                            target_ulong args,
                            uint32_t nret, target_ulong rets)
@@ -226,7 +226,7 @@ static inline int sysparm_st(target_ulong addr, target_ulong len,
 }
 
 static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu,
-                                          sPAPRMachineState *spapr,
+                                          SpaprMachineState *spapr,
                                           uint32_t token, uint32_t nargs,
                                           target_ulong args,
                                           uint32_t nret, target_ulong rets)
@@ -268,7 +268,7 @@ static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu,
 }
 
 static void rtas_ibm_set_system_parameter(PowerPCCPU *cpu,
-                                          sPAPRMachineState *spapr,
+                                          SpaprMachineState *spapr,
                                           uint32_t token, uint32_t nargs,
                                           target_ulong args,
                                           uint32_t nret, target_ulong rets)
@@ -288,7 +288,7 @@ static void rtas_ibm_set_system_parameter(PowerPCCPU *cpu,
 }
 
 static void rtas_ibm_os_term(PowerPCCPU *cpu,
-                            sPAPRMachineState *spapr,
+                            SpaprMachineState *spapr,
                             uint32_t token, uint32_t nargs,
                             target_ulong args,
                             uint32_t nret, target_ulong rets)
@@ -298,7 +298,7 @@ static void rtas_ibm_os_term(PowerPCCPU *cpu,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static void rtas_set_power_level(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_set_power_level(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                  uint32_t token, uint32_t nargs,
                                  target_ulong args, uint32_t nret,
                                  target_ulong rets)
@@ -323,7 +323,7 @@ static void rtas_set_power_level(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 1, 100);
 }
 
-static void rtas_get_power_level(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_get_power_level(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                   uint32_t token, uint32_t nargs,
                                   target_ulong args, uint32_t nret,
                                   target_ulong rets)
@@ -353,7 +353,7 @@ static struct rtas_call {
     spapr_rtas_fn fn;
 } rtas_table[RTAS_TOKEN_MAX - RTAS_TOKEN_BASE];
 
-target_ulong spapr_rtas_call(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+target_ulong spapr_rtas_call(PowerPCCPU *cpu, SpaprMachineState *spapr,
                              uint32_t token, uint32_t nargs, target_ulong args,
                              uint32_t nret, target_ulong rets)
 {
@@ -387,7 +387,7 @@ uint64_t qtest_rtas_call(char *cmd, uint32_t nargs, uint64_t args,
 
     for (token = 0; token < RTAS_TOKEN_MAX - RTAS_TOKEN_BASE; token++) {
         if (strcmp(cmd, rtas_table[token].name) == 0) {
-            sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+            SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
             PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
 
             rtas_table[token].fn(cpu, spapr, token + RTAS_TOKEN_BASE,
@@ -425,7 +425,7 @@ void spapr_dt_rtas_tokens(void *fdt, int rtas)
     }
 }
 
-void spapr_load_rtas(sPAPRMachineState *spapr, void *fdt, hwaddr addr)
+void spapr_load_rtas(SpaprMachineState *spapr, void *fdt, hwaddr addr)
 {
     int rtas_node;
     int ret;
diff --git a/hw/ppc/spapr_rtas_ddw.c b/hw/ppc/spapr_rtas_ddw.c
index cc9d1f5c1c..f6538189f4 100644
--- a/hw/ppc/spapr_rtas_ddw.c
+++ b/hw/ppc/spapr_rtas_ddw.c
@@ -26,16 +26,16 @@
 
 static int spapr_phb_get_active_win_num_cb(Object *child, void *opaque)
 {
-    sPAPRTCETable *tcet;
+    SpaprTceTable *tcet;
 
-    tcet = (sPAPRTCETable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_TABLE);
+    tcet = (SpaprTceTable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_TABLE);
     if (tcet && tcet->nb_table) {
         ++*(unsigned *)opaque;
     }
     return 0;
 }
 
-static unsigned spapr_phb_get_active_win_num(sPAPRPHBState *sphb)
+static unsigned spapr_phb_get_active_win_num(SpaprPhbState *sphb)
 {
     unsigned ret = 0;
 
@@ -46,9 +46,9 @@ static unsigned spapr_phb_get_active_win_num(sPAPRPHBState *sphb)
 
 static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque)
 {
-    sPAPRTCETable *tcet;
+    SpaprTceTable *tcet;
 
-    tcet = (sPAPRTCETable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_TABLE);
+    tcet = (SpaprTceTable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_TABLE);
     if (tcet && !tcet->nb_table) {
         *(uint32_t *)opaque = tcet->liobn;
         return 1;
@@ -56,7 +56,7 @@ static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque)
     return 0;
 }
 
-static unsigned spapr_phb_get_free_liobn(sPAPRPHBState *sphb)
+static unsigned spapr_phb_get_free_liobn(SpaprPhbState *sphb)
 {
     uint32_t liobn = 0;
 
@@ -90,12 +90,12 @@ static uint32_t spapr_page_mask_to_query_mask(uint64_t page_mask)
 }
 
 static void rtas_ibm_query_pe_dma_window(PowerPCCPU *cpu,
-                                         sPAPRMachineState *spapr,
+                                         SpaprMachineState *spapr,
                                          uint32_t token, uint32_t nargs,
                                          target_ulong args,
                                          uint32_t nret, target_ulong rets)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
     uint64_t buid;
     uint32_t avail, addr, pgmask = 0;
 
@@ -129,13 +129,13 @@ param_error_exit:
 }
 
 static void rtas_ibm_create_pe_dma_window(PowerPCCPU *cpu,
-                                          sPAPRMachineState *spapr,
+                                          SpaprMachineState *spapr,
                                           uint32_t token, uint32_t nargs,
                                           target_ulong args,
                                           uint32_t nret, target_ulong rets)
 {
-    sPAPRPHBState *sphb;
-    sPAPRTCETable *tcet = NULL;
+    SpaprPhbState *sphb;
+    SpaprTceTable *tcet = NULL;
     uint32_t addr, page_shift, window_shift, liobn;
     uint64_t buid, win_addr;
     int windows;
@@ -206,13 +206,13 @@ param_error_exit:
 }
 
 static void rtas_ibm_remove_pe_dma_window(PowerPCCPU *cpu,
-                                          sPAPRMachineState *spapr,
+                                          SpaprMachineState *spapr,
                                           uint32_t token, uint32_t nargs,
                                           target_ulong args,
                                           uint32_t nret, target_ulong rets)
 {
-    sPAPRPHBState *sphb;
-    sPAPRTCETable *tcet;
+    SpaprPhbState *sphb;
+    SpaprTceTable *tcet;
     uint32_t liobn;
 
     if ((nargs != 1) || (nret != 1)) {
@@ -241,12 +241,12 @@ param_error_exit:
 }
 
 static void rtas_ibm_reset_pe_dma_window(PowerPCCPU *cpu,
-                                         sPAPRMachineState *spapr,
+                                         SpaprMachineState *spapr,
                                          uint32_t token, uint32_t nargs,
                                          target_ulong args,
                                          uint32_t nret, target_ulong rets)
 {
-    sPAPRPHBState *sphb;
+    SpaprPhbState *sphb;
     uint64_t buid;
     uint32_t addr;
 
diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c
index eb95a7077d..d732a3ea95 100644
--- a/hw/ppc/spapr_rtc.c
+++ b/hw/ppc/spapr_rtc.c
@@ -34,7 +34,7 @@
 #include "qapi/qapi-events-target.h"
 #include "qemu/cutils.h"
 
-void spapr_rtc_read(sPAPRRTCState *rtc, struct tm *tm, uint32_t *ns)
+void spapr_rtc_read(SpaprRtcState *rtc, struct tm *tm, uint32_t *ns)
 {
     int64_t host_ns = qemu_clock_get_ns(rtc_clock);
     int64_t guest_ns;
@@ -53,7 +53,7 @@ void spapr_rtc_read(sPAPRRTCState *rtc, struct tm *tm, uint32_t *ns)
     }
 }
 
-int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset)
+int spapr_rtc_import_offset(SpaprRtcState *rtc, int64_t legacy_offset)
 {
     if (!rtc) {
         return -ENODEV;
@@ -64,7 +64,7 @@ int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset)
     return 0;
 }
 
-static void rtas_get_time_of_day(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_get_time_of_day(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                  uint32_t token, uint32_t nargs,
                                  target_ulong args,
                                  uint32_t nret, target_ulong rets)
@@ -89,12 +89,12 @@ static void rtas_get_time_of_day(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 7, ns);
 }
 
-static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_set_time_of_day(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                  uint32_t token, uint32_t nargs,
                                  target_ulong args,
                                  uint32_t nret, target_ulong rets)
 {
-    sPAPRRTCState *rtc = &spapr->rtc;
+    SpaprRtcState *rtc = &spapr->rtc;
     struct tm tm;
     time_t new_s;
     int64_t host_ns;
@@ -134,7 +134,7 @@ static void spapr_rtc_qom_date(Object *obj, struct tm *current_tm, Error **errp)
 
 static void spapr_rtc_realize(DeviceState *dev, Error **errp)
 {
-    sPAPRRTCState *rtc = SPAPR_RTC(dev);
+    SpaprRtcState *rtc = SPAPR_RTC(dev);
     struct tm tm;
     time_t host_s;
     int64_t rtc_ns;
@@ -154,7 +154,7 @@ static const VMStateDescription vmstate_spapr_rtc = {
     .version_id = 1,
     .minimum_version_id = 1,
     .fields = (VMStateField[]) {
-        VMSTATE_INT64(ns_offset, sPAPRRTCState),
+        VMSTATE_INT64(ns_offset, SpaprRtcState),
         VMSTATE_END_OF_LIST()
     },
 };
@@ -177,7 +177,7 @@ static void spapr_rtc_class_init(ObjectClass *oc, void *data)
 static const TypeInfo spapr_rtc_info = {
     .name          = TYPE_SPAPR_RTC,
     .parent        = TYPE_DEVICE,
-    .instance_size = sizeof(sPAPRRTCState),
+    .instance_size = sizeof(SpaprRtcState),
     .class_init    = spapr_rtc_class_init,
 };
 
diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c
index 2b7e7ecac5..583c13deda 100644
--- a/hw/ppc/spapr_vio.c
+++ b/hw/ppc/spapr_vio.c
@@ -46,8 +46,8 @@
 
 static char *spapr_vio_get_dev_name(DeviceState *qdev)
 {
-    VIOsPAPRDevice *dev = VIO_SPAPR_DEVICE(qdev);
-    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+    SpaprVioDevice *dev = VIO_SPAPR_DEVICE(qdev);
+    SpaprVioDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 
     /* Device tree style name device@reg */
     return g_strdup_printf("%s@%x", pc->dt_name, dev->reg);
@@ -65,16 +65,16 @@ static const TypeInfo spapr_vio_bus_info = {
     .name = TYPE_SPAPR_VIO_BUS,
     .parent = TYPE_BUS,
     .class_init = spapr_vio_bus_class_init,
-    .instance_size = sizeof(VIOsPAPRBus),
+    .instance_size = sizeof(SpaprVioBus),
 };
 
-VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg)
+SpaprVioDevice *spapr_vio_find_by_reg(SpaprVioBus *bus, uint32_t reg)
 {
     BusChild *kid;
-    VIOsPAPRDevice *dev = NULL;
+    SpaprVioDevice *dev = NULL;
 
     QTAILQ_FOREACH(kid, &bus->bus.children, sibling) {
-        dev = (VIOsPAPRDevice *)kid->child;
+        dev = (SpaprVioDevice *)kid->child;
         if (dev->reg == reg) {
             return dev;
         }
@@ -83,10 +83,10 @@ VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg)
     return NULL;
 }
 
-static int vio_make_devnode(VIOsPAPRDevice *dev,
+static int vio_make_devnode(SpaprVioDevice *dev,
                             void *fdt)
 {
-    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+    SpaprVioDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
     int vdevice_off, node_off, ret;
     char *dt_name;
 
@@ -152,13 +152,13 @@ static int vio_make_devnode(VIOsPAPRDevice *dev,
 /*
  * CRQ handling
  */
-static target_ulong h_reg_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_reg_crq(PowerPCCPU *cpu, SpaprMachineState *spapr,
                               target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
     target_ulong queue_addr = args[1];
     target_ulong queue_len = args[2];
-    VIOsPAPRDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
 
     if (!dev) {
         hcall_dprintf("Unit 0x" TARGET_FMT_lx " does not exist\n", reg);
@@ -197,7 +197,7 @@ static target_ulong h_reg_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-static target_ulong free_crq(VIOsPAPRDevice *dev)
+static target_ulong free_crq(SpaprVioDevice *dev)
 {
     dev->crq.qladdr = 0;
     dev->crq.qsize = 0;
@@ -208,11 +208,11 @@ static target_ulong free_crq(VIOsPAPRDevice *dev)
     return H_SUCCESS;
 }
 
-static target_ulong h_free_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_free_crq(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
-    VIOsPAPRDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
 
     if (!dev) {
         hcall_dprintf("Unit 0x" TARGET_FMT_lx " does not exist\n", reg);
@@ -222,13 +222,13 @@ static target_ulong h_free_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return free_crq(dev);
 }
 
-static target_ulong h_send_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_send_crq(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
     target_ulong msg_hi = args[1];
     target_ulong msg_lo = args[2];
-    VIOsPAPRDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
     uint64_t crq_mangle[2];
 
     if (!dev) {
@@ -245,11 +245,11 @@ static target_ulong h_send_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_HARDWARE;
 }
 
-static target_ulong h_enable_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_enable_crq(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                  target_ulong opcode, target_ulong *args)
 {
     target_ulong reg = args[0];
-    VIOsPAPRDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
 
     if (!dev) {
         hcall_dprintf("Unit 0x" TARGET_FMT_lx " does not exist\n", reg);
@@ -260,7 +260,7 @@ static target_ulong h_enable_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 }
 
 /* Returns negative error, 0 success, or positive: queue full */
-int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq)
+int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq)
 {
     int rc;
     uint8_t byte;
@@ -303,7 +303,7 @@ int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq)
 
 /* "quiesce" handling */
 
-static void spapr_vio_quiesce_one(VIOsPAPRDevice *dev)
+static void spapr_vio_quiesce_one(SpaprVioDevice *dev)
 {
     if (dev->tcet) {
         device_reset(DEVICE(dev->tcet));
@@ -311,7 +311,7 @@ static void spapr_vio_quiesce_one(VIOsPAPRDevice *dev)
     free_crq(dev);
 }
 
-void spapr_vio_set_bypass(VIOsPAPRDevice *dev, bool bypass)
+void spapr_vio_set_bypass(SpaprVioDevice *dev, bool bypass)
 {
     if (!dev->tcet) {
         return;
@@ -323,13 +323,13 @@ void spapr_vio_set_bypass(VIOsPAPRDevice *dev, bool bypass)
     dev->tcet->bypass = bypass;
 }
 
-static void rtas_set_tce_bypass(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_set_tce_bypass(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                 uint32_t token,
                                 uint32_t nargs, target_ulong args,
                                 uint32_t nret, target_ulong rets)
 {
-    VIOsPAPRBus *bus = spapr->vio_bus;
-    VIOsPAPRDevice *dev;
+    SpaprVioBus *bus = spapr->vio_bus;
+    SpaprVioDevice *dev;
     uint32_t unit, enable;
 
     if (nargs != 2) {
@@ -354,14 +354,14 @@ static void rtas_set_tce_bypass(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static void rtas_quiesce(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static void rtas_quiesce(PowerPCCPU *cpu, SpaprMachineState *spapr,
                          uint32_t token,
                          uint32_t nargs, target_ulong args,
                          uint32_t nret, target_ulong rets)
 {
-    VIOsPAPRBus *bus = spapr->vio_bus;
+    SpaprVioBus *bus = spapr->vio_bus;
     BusChild *kid;
-    VIOsPAPRDevice *dev = NULL;
+    SpaprVioDevice *dev = NULL;
 
     if (nargs != 0) {
         rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
@@ -369,18 +369,18 @@ static void rtas_quiesce(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     }
 
     QTAILQ_FOREACH(kid, &bus->bus.children, sibling) {
-        dev = (VIOsPAPRDevice *)kid->child;
+        dev = (SpaprVioDevice *)kid->child;
         spapr_vio_quiesce_one(dev);
     }
 
     rtas_st(rets, 0, RTAS_OUT_SUCCESS);
 }
 
-static VIOsPAPRDevice *reg_conflict(VIOsPAPRDevice *dev)
+static SpaprVioDevice *reg_conflict(SpaprVioDevice *dev)
 {
-    VIOsPAPRBus *bus = SPAPR_VIO_BUS(dev->qdev.parent_bus);
+    SpaprVioBus *bus = SPAPR_VIO_BUS(dev->qdev.parent_bus);
     BusChild *kid;
-    VIOsPAPRDevice *other;
+    SpaprVioDevice *other;
 
     /*
      * Check for a device other than the given one which is already
@@ -400,8 +400,8 @@ static VIOsPAPRDevice *reg_conflict(VIOsPAPRDevice *dev)
 
 static void spapr_vio_busdev_reset(DeviceState *qdev)
 {
-    VIOsPAPRDevice *dev = VIO_SPAPR_DEVICE(qdev);
-    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+    SpaprVioDevice *dev = VIO_SPAPR_DEVICE(qdev);
+    SpaprVioDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 
     /* Shut down the request queue and TCEs if necessary */
     spapr_vio_quiesce_one(dev);
@@ -465,9 +465,9 @@ static inline uint32_t spapr_vio_reg_to_irq(uint32_t reg)
 
 static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
-    VIOsPAPRDevice *dev = (VIOsPAPRDevice *)qdev;
-    VIOsPAPRDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprVioDevice *dev = (SpaprVioDevice *)qdev;
+    SpaprVioDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
     char *id;
     Error *local_err = NULL;
 
@@ -478,7 +478,7 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
          * rather than using spapr_vio_find_by_reg() because sdev
          * itself is already in the list.
          */
-        VIOsPAPRDevice *other = reg_conflict(dev);
+        SpaprVioDevice *other = reg_conflict(dev);
 
         if (other) {
             error_setg(errp, "%s and %s devices conflict at address %#x",
@@ -489,7 +489,7 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
         }
     } else {
         /* Need to assign an address */
-        VIOsPAPRBus *bus = SPAPR_VIO_BUS(dev->qdev.parent_bus);
+        SpaprVioBus *bus = SPAPR_VIO_BUS(dev->qdev.parent_bus);
 
         do {
             dev->reg = bus->next_reg++;
@@ -540,14 +540,14 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp)
     pc->realize(dev, errp);
 }
 
-static target_ulong h_vio_signal(PowerPCCPU *cpu, sPAPRMachineState *spapr,
+static target_ulong h_vio_signal(PowerPCCPU *cpu, SpaprMachineState *spapr,
                                  target_ulong opcode,
                                  target_ulong *args)
 {
     target_ulong reg = args[0];
     target_ulong mode = args[1];
-    VIOsPAPRDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
-    VIOsPAPRDeviceClass *pc;
+    SpaprVioDevice *dev = spapr_vio_find_by_reg(spapr->vio_bus, reg);
+    SpaprVioDeviceClass *pc;
 
     if (!dev) {
         return H_PARAMETER;
@@ -564,9 +564,9 @@ static target_ulong h_vio_signal(PowerPCCPU *cpu, sPAPRMachineState *spapr,
     return H_SUCCESS;
 }
 
-VIOsPAPRBus *spapr_vio_bus_init(void)
+SpaprVioBus *spapr_vio_bus_init(void)
 {
-    VIOsPAPRBus *bus;
+    SpaprVioBus *bus;
     BusState *qbus;
     DeviceState *dev;
 
@@ -615,14 +615,14 @@ const VMStateDescription vmstate_spapr_vio = {
     .minimum_version_id = 1,
     .fields = (VMStateField[]) {
         /* Sanity check */
-        VMSTATE_UINT32_EQUAL(reg, VIOsPAPRDevice, NULL),
-        VMSTATE_UINT32_EQUAL(irq, VIOsPAPRDevice, NULL),
+        VMSTATE_UINT32_EQUAL(reg, SpaprVioDevice, NULL),
+        VMSTATE_UINT32_EQUAL(irq, SpaprVioDevice, NULL),
 
         /* General VIO device state */
-        VMSTATE_UINT64(signal_state, VIOsPAPRDevice),
-        VMSTATE_UINT64(crq.qladdr, VIOsPAPRDevice),
-        VMSTATE_UINT32(crq.qsize, VIOsPAPRDevice),
-        VMSTATE_UINT32(crq.qnext, VIOsPAPRDevice),
+        VMSTATE_UINT64(signal_state, SpaprVioDevice),
+        VMSTATE_UINT64(crq.qladdr, SpaprVioDevice),
+        VMSTATE_UINT32(crq.qsize, SpaprVioDevice),
+        VMSTATE_UINT32(crq.qnext, SpaprVioDevice),
 
         VMSTATE_END_OF_LIST()
     },
@@ -639,9 +639,9 @@ static void vio_spapr_device_class_init(ObjectClass *klass, void *data)
 static const TypeInfo spapr_vio_type_info = {
     .name = TYPE_VIO_SPAPR_DEVICE,
     .parent = TYPE_DEVICE,
-    .instance_size = sizeof(VIOsPAPRDevice),
+    .instance_size = sizeof(SpaprVioDevice),
     .abstract = true,
-    .class_size = sizeof(VIOsPAPRDeviceClass),
+    .class_size = sizeof(SpaprVioDeviceClass),
     .class_init = vio_spapr_device_class_init,
 };
 
@@ -656,10 +656,10 @@ type_init(spapr_vio_register_types)
 
 static int compare_reg(const void *p1, const void *p2)
 {
-    VIOsPAPRDevice const *dev1, *dev2;
+    SpaprVioDevice const *dev1, *dev2;
 
-    dev1 = (VIOsPAPRDevice *)*(DeviceState **)p1;
-    dev2 = (VIOsPAPRDevice *)*(DeviceState **)p2;
+    dev1 = (SpaprVioDevice *)*(DeviceState **)p1;
+    dev2 = (SpaprVioDevice *)*(DeviceState **)p2;
 
     if (dev1->reg < dev2->reg) {
         return -1;
@@ -672,7 +672,7 @@ static int compare_reg(const void *p1, const void *p2)
     return 1;
 }
 
-void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt)
+void spapr_dt_vdevice(SpaprVioBus *bus, void *fdt)
 {
     DeviceState *qdev, **qdevs;
     BusChild *kid;
@@ -707,8 +707,8 @@ void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt)
     /* Hack alert. Give the devices to libfdt in reverse order, we happen
      * to know that will mean they are in forward order in the tree. */
     for (i = num - 1; i >= 0; i--) {
-        VIOsPAPRDevice *dev = (VIOsPAPRDevice *)(qdevs[i]);
-        VIOsPAPRDeviceClass *vdc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
+        SpaprVioDevice *dev = (SpaprVioDevice *)(qdevs[i]);
+        SpaprVioDeviceClass *vdc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
 
         ret = vio_make_devnode(dev, fdt);
         if (ret < 0) {
@@ -721,9 +721,9 @@ void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt)
     g_free(qdevs);
 }
 
-gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus)
+gchar *spapr_vio_stdout_path(SpaprVioBus *bus)
 {
-    VIOsPAPRDevice *dev;
+    SpaprVioDevice *dev;
     char *name, *path;
 
     dev = spapr_vty_get_default(bus);
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index a9e49c7cb5..26dfc0340f 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -91,7 +91,7 @@ typedef struct vscsi_req {
      OBJECT_CHECK(VSCSIState, (obj), TYPE_VIO_SPAPR_VSCSI_DEVICE)
 
 typedef struct {
-    VIOsPAPRDevice vdev;
+    SpaprVioDevice vdev;
     SCSIBus bus;
     vscsi_req reqs[VSCSI_REQ_LIMIT];
 } VSCSIState;
@@ -1115,7 +1115,7 @@ static void vscsi_got_payload(VSCSIState *s, vscsi_crq *crq)
 }
 
 
-static int vscsi_do_crq(struct VIOsPAPRDevice *dev, uint8_t *crq_data)
+static int vscsi_do_crq(struct SpaprVioDevice *dev, uint8_t *crq_data)
 {
     VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev);
     vscsi_crq crq;
@@ -1187,7 +1187,7 @@ static const struct SCSIBusInfo vscsi_scsi_info = {
     .load_request = vscsi_load_request,
 };
 
-static void spapr_vscsi_reset(VIOsPAPRDevice *dev)
+static void spapr_vscsi_reset(SpaprVioDevice *dev)
 {
     VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev);
     int i;
@@ -1198,7 +1198,7 @@ static void spapr_vscsi_reset(VIOsPAPRDevice *dev)
     }
 }
 
-static void spapr_vscsi_realize(VIOsPAPRDevice *dev, Error **errp)
+static void spapr_vscsi_realize(SpaprVioDevice *dev, Error **errp)
 {
     VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(dev);
 
@@ -1208,7 +1208,7 @@ static void spapr_vscsi_realize(VIOsPAPRDevice *dev, Error **errp)
                  &vscsi_scsi_info, NULL);
 }
 
-void spapr_vscsi_create(VIOsPAPRBus *bus)
+void spapr_vscsi_create(SpaprVioBus *bus)
 {
     DeviceState *dev;
 
@@ -1218,7 +1218,7 @@ void spapr_vscsi_create(VIOsPAPRBus *bus)
     scsi_bus_legacy_handle_cmdline(&VIO_SPAPR_VSCSI_DEVICE(dev)->bus);
 }
 
-static int spapr_vscsi_devnode(VIOsPAPRDevice *dev, void *fdt, int node_off)
+static int spapr_vscsi_devnode(SpaprVioDevice *dev, void *fdt, int node_off)
 {
     int ret;
 
@@ -1256,7 +1256,7 @@ static const VMStateDescription vmstate_spapr_vscsi = {
 static void spapr_vscsi_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
-    VIOsPAPRDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
+    SpaprVioDeviceClass *k = VIO_SPAPR_DEVICE_CLASS(klass);
 
     k->realize = spapr_vscsi_realize;
     k->reset = spapr_vscsi_reset;
diff --git a/include/hw/pci-host/spapr.h b/include/hw/pci-host/spapr.h
index ab0e3a0a6f..b4aad26798 100644
--- a/include/hw/pci-host/spapr.h
+++ b/include/hw/pci-host/spapr.h
@@ -28,11 +28,11 @@
 #define TYPE_SPAPR_PCI_HOST_BRIDGE "spapr-pci-host-bridge"
 
 #define SPAPR_PCI_HOST_BRIDGE(obj) \
-    OBJECT_CHECK(sPAPRPHBState, (obj), TYPE_SPAPR_PCI_HOST_BRIDGE)
+    OBJECT_CHECK(SpaprPhbState, (obj), TYPE_SPAPR_PCI_HOST_BRIDGE)
 
 #define SPAPR_PCI_DMA_MAX_WINDOWS    2
 
-typedef struct sPAPRPHBState sPAPRPHBState;
+typedef struct SpaprPhbState SpaprPhbState;
 
 typedef struct spapr_pci_msi {
     uint32_t first_irq;
@@ -44,7 +44,7 @@ typedef struct spapr_pci_msi_mig {
     spapr_pci_msi value;
 } spapr_pci_msi_mig;
 
-struct sPAPRPHBState {
+struct SpaprPhbState {
     PCIHostState parent_obj;
 
     uint32_t index;
@@ -72,7 +72,7 @@ struct sPAPRPHBState {
     int32_t msi_devs_num;
     spapr_pci_msi_mig *msi_devs;
 
-    QLIST_ENTRY(sPAPRPHBState) list;
+    QLIST_ENTRY(SpaprPhbState) list;
 
     bool ddw_enabled;
     uint64_t page_size_mask;
@@ -105,56 +105,56 @@ struct sPAPRPHBState {
 
 #define SPAPR_PCI_MSI_WINDOW         0x40000000000ULL
 
-static inline qemu_irq spapr_phb_lsi_qirq(struct sPAPRPHBState *phb, int pin)
+static inline qemu_irq spapr_phb_lsi_qirq(struct SpaprPhbState *phb, int pin)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
 
     return spapr_qirq(spapr, phb->lsi_table[pin].irq);
 }
 
-int spapr_populate_pci_dt(sPAPRPHBState *phb, uint32_t intc_phandle, void *fdt,
+int spapr_populate_pci_dt(SpaprPhbState *phb, uint32_t intc_phandle, void *fdt,
                           uint32_t nr_msis, int *node_offset);
 
 void spapr_pci_rtas_init(void);
 
-sPAPRPHBState *spapr_pci_find_phb(sPAPRMachineState *spapr, uint64_t buid);
-PCIDevice *spapr_pci_find_dev(sPAPRMachineState *spapr, uint64_t buid,
+SpaprPhbState *spapr_pci_find_phb(SpaprMachineState *spapr, uint64_t buid);
+PCIDevice *spapr_pci_find_dev(SpaprMachineState *spapr, uint64_t buid,
                               uint32_t config_addr);
 
 /* DRC callbacks */
 void spapr_phb_remove_pci_device_cb(DeviceState *dev);
-int spapr_pci_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
+int spapr_pci_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
                           void *fdt, int *fdt_start_offset, Error **errp);
 
 /* VFIO EEH hooks */
 #ifdef CONFIG_LINUX
-bool spapr_phb_eeh_available(sPAPRPHBState *sphb);
-int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb,
+bool spapr_phb_eeh_available(SpaprPhbState *sphb);
+int spapr_phb_vfio_eeh_set_option(SpaprPhbState *sphb,
                                   unsigned int addr, int option);
-int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state);
-int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option);
-int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb);
+int spapr_phb_vfio_eeh_get_state(SpaprPhbState *sphb, int *state);
+int spapr_phb_vfio_eeh_reset(SpaprPhbState *sphb, int option);
+int spapr_phb_vfio_eeh_configure(SpaprPhbState *sphb);
 void spapr_phb_vfio_reset(DeviceState *qdev);
 #else
-static inline bool spapr_phb_eeh_available(sPAPRPHBState *sphb)
+static inline bool spapr_phb_eeh_available(SpaprPhbState *sphb)
 {
     return false;
 }
-static inline int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb,
+static inline int spapr_phb_vfio_eeh_set_option(SpaprPhbState *sphb,
                                                 unsigned int addr, int option)
 {
     return RTAS_OUT_HW_ERROR;
 }
-static inline int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb,
+static inline int spapr_phb_vfio_eeh_get_state(SpaprPhbState *sphb,
                                                int *state)
 {
     return RTAS_OUT_HW_ERROR;
 }
-static inline int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option)
+static inline int spapr_phb_vfio_eeh_reset(SpaprPhbState *sphb, int option)
 {
     return RTAS_OUT_HW_ERROR;
 }
-static inline int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb)
+static inline int spapr_phb_vfio_eeh_configure(SpaprPhbState *sphb)
 {
     return RTAS_OUT_HW_ERROR;
 }
@@ -163,9 +163,9 @@ static inline void spapr_phb_vfio_reset(DeviceState *qdev)
 }
 #endif
 
-void spapr_phb_dma_reset(sPAPRPHBState *sphb);
+void spapr_phb_dma_reset(SpaprPhbState *sphb);
 
-static inline unsigned spapr_phb_windows_supported(sPAPRPHBState *sphb)
+static inline unsigned spapr_phb_windows_supported(SpaprPhbState *sphb)
 {
     return sphb->ddw_enabled ? SPAPR_PCI_DMA_MAX_WINDOWS : 1;
 }
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index f117a7ce6e..2b4c05a2ec 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -8,16 +8,16 @@
 #include "hw/mem/pc-dimm.h"
 #include "hw/ppc/spapr_ovec.h"
 #include "hw/ppc/spapr_irq.h"
-#include "hw/ppc/spapr_xive.h"  /* For sPAPRXive */
+#include "hw/ppc/spapr_xive.h"  /* For SpaprXive */
 #include "hw/ppc/xics.h"        /* For ICSState */
 
-struct VIOsPAPRBus;
-struct sPAPRPHBState;
-struct sPAPRNVRAM;
+struct SpaprVioBus;
+struct SpaprPhbState;
+struct SpaprNvram;
 
-typedef struct sPAPREventLogEntry sPAPREventLogEntry;
-typedef struct sPAPREventSource sPAPREventSource;
-typedef struct sPAPRPendingHPT sPAPRPendingHPT;
+typedef struct SpaprEventLogEntry SpaprEventLogEntry;
+typedef struct SpaprEventSource SpaprEventSource;
+typedef struct SpaprPendingHpt SpaprPendingHpt;
 
 #define HPTE64_V_HPTE_DIRTY     0x0000000000000040ULL
 #define SPAPR_ENTRY_POINT       0x100
@@ -27,32 +27,32 @@ typedef struct sPAPRPendingHPT sPAPRPendingHPT;
 #define TYPE_SPAPR_RTC "spapr-rtc"
 
 #define SPAPR_RTC(obj)                                  \
-    OBJECT_CHECK(sPAPRRTCState, (obj), TYPE_SPAPR_RTC)
+    OBJECT_CHECK(SpaprRtcState, (obj), TYPE_SPAPR_RTC)
 
-typedef struct sPAPRRTCState sPAPRRTCState;
-struct sPAPRRTCState {
+typedef struct SpaprRtcState SpaprRtcState;
+struct SpaprRtcState {
     /*< private >*/
     DeviceState parent_obj;
     int64_t ns_offset;
 };
 
-typedef struct sPAPRDIMMState sPAPRDIMMState;
-typedef struct sPAPRMachineClass sPAPRMachineClass;
+typedef struct SpaprDimmState SpaprDimmState;
+typedef struct SpaprMachineClass SpaprMachineClass;
 
 #define TYPE_SPAPR_MACHINE      "spapr-machine"
 #define SPAPR_MACHINE(obj) \
-    OBJECT_CHECK(sPAPRMachineState, (obj), TYPE_SPAPR_MACHINE)
+    OBJECT_CHECK(SpaprMachineState, (obj), TYPE_SPAPR_MACHINE)
 #define SPAPR_MACHINE_GET_CLASS(obj) \
-    OBJECT_GET_CLASS(sPAPRMachineClass, obj, TYPE_SPAPR_MACHINE)
+    OBJECT_GET_CLASS(SpaprMachineClass, obj, TYPE_SPAPR_MACHINE)
 #define SPAPR_MACHINE_CLASS(klass) \
-    OBJECT_CLASS_CHECK(sPAPRMachineClass, klass, TYPE_SPAPR_MACHINE)
+    OBJECT_CLASS_CHECK(SpaprMachineClass, klass, TYPE_SPAPR_MACHINE)
 
 typedef enum {
     SPAPR_RESIZE_HPT_DEFAULT = 0,
     SPAPR_RESIZE_HPT_DISABLED,
     SPAPR_RESIZE_HPT_ENABLED,
     SPAPR_RESIZE_HPT_REQUIRED,
-} sPAPRResizeHPT;
+} SpaprResizeHpt;
 
 /**
  * Capabilities
@@ -99,15 +99,15 @@ typedef enum {
 #define SPAPR_CAP_FIXED_CCD             0x03
 #define SPAPR_CAP_FIXED_NA              0x10 /* Lets leave a bit of a gap... */
 
-typedef struct sPAPRCapabilities sPAPRCapabilities;
-struct sPAPRCapabilities {
+typedef struct SpaprCapabilities SpaprCapabilities;
+struct SpaprCapabilities {
     uint8_t caps[SPAPR_CAP_NUM];
 };
 
 /**
- * sPAPRMachineClass:
+ * SpaprMachineClass:
  */
-struct sPAPRMachineClass {
+struct SpaprMachineClass {
     /*< private >*/
     MachineClass parent_class;
 
@@ -119,33 +119,33 @@ struct sPAPRMachineClass {
     bool pre_2_10_has_unused_icps;
     bool legacy_irq_allocation;
 
-    void (*phb_placement)(sPAPRMachineState *spapr, uint32_t index,
+    void (*phb_placement)(SpaprMachineState *spapr, uint32_t index,
                           uint64_t *buid, hwaddr *pio, 
                           hwaddr *mmio32, hwaddr *mmio64,
                           unsigned n_dma, uint32_t *liobns, Error **errp);
-    sPAPRResizeHPT resize_hpt_default;
-    sPAPRCapabilities default_caps;
-    sPAPRIrq *irq;
+    SpaprResizeHpt resize_hpt_default;
+    SpaprCapabilities default_caps;
+    SpaprIrq *irq;
 };
 
 /**
- * sPAPRMachineState:
+ * SpaprMachineState:
  */
-struct sPAPRMachineState {
+struct SpaprMachineState {
     /*< private >*/
     MachineState parent_obj;
 
-    struct VIOsPAPRBus *vio_bus;
-    QLIST_HEAD(, sPAPRPHBState) phbs;
-    struct sPAPRNVRAM *nvram;
+    struct SpaprVioBus *vio_bus;
+    QLIST_HEAD(, SpaprPhbState) phbs;
+    struct SpaprNvram *nvram;
     ICSState *ics;
-    sPAPRRTCState rtc;
+    SpaprRtcState rtc;
 
-    sPAPRResizeHPT resize_hpt;
+    SpaprResizeHpt resize_hpt;
     void *htab;
     uint32_t htab_shift;
     uint64_t patb_entry; /* Process tbl registed in H_REGISTER_PROCESS_TABLE */
-    sPAPRPendingHPT *pending_hpt; /* in-progress resize */
+    SpaprPendingHpt *pending_hpt; /* in-progress resize */
 
     hwaddr rma_size;
     int vrma_adjust;
@@ -164,15 +164,15 @@ struct sPAPRMachineState {
     uint32_t vsmt;       /* Virtual SMT mode (KVM's "core stride") */
 
     Notifier epow_notifier;
-    QTAILQ_HEAD(, sPAPREventLogEntry) pending_events;
+    QTAILQ_HEAD(, SpaprEventLogEntry) pending_events;
     bool use_hotplug_event_source;
-    sPAPREventSource *event_sources;
+    SpaprEventSource *event_sources;
 
     /* ibm,client-architecture-support option negotiation */
     bool cas_reboot;
     bool cas_legacy_guest_workaround;
-    sPAPROptionVector *ov5;         /* QEMU-supported option vectors */
-    sPAPROptionVector *ov5_cas;     /* negotiated (via CAS) option vectors */
+    SpaprOptionVector *ov5;         /* QEMU-supported option vectors */
+    SpaprOptionVector *ov5_cas;     /* negotiated (via CAS) option vectors */
     uint32_t max_compat_pvr;
 
     /* Migration state */
@@ -183,7 +183,7 @@ struct sPAPRMachineState {
     /* Pending DIMM unplug cache. It is populated when a LMB
      * unplug starts. It can be regenerated if a migration
      * occurs during the unplug process. */
-    QTAILQ_HEAD(, sPAPRDIMMState) pending_dimm_unplugs;
+    QTAILQ_HEAD(, SpaprDimmState) pending_dimm_unplugs;
 
     /*< public >*/
     char *kvm_type;
@@ -192,12 +192,12 @@ struct sPAPRMachineState {
 
     int32_t irq_map_nr;
     unsigned long *irq_map;
-    sPAPRXive  *xive;
-    sPAPRIrq *irq;
+    SpaprXive  *xive;
+    SpaprIrq *irq;
     qemu_irq *qirqs;
 
     bool cmd_line_caps[SPAPR_CAP_NUM];
-    sPAPRCapabilities def, eff, mig;
+    SpaprCapabilities def, eff, mig;
 };
 
 #define H_SUCCESS         0
@@ -503,16 +503,16 @@ struct sPAPRMachineState {
 #define KVMPPC_H_UPDATE_DT      (KVMPPC_HCALL_BASE + 0x3)
 #define KVMPPC_HCALL_MAX        KVMPPC_H_UPDATE_DT
 
-typedef struct sPAPRDeviceTreeUpdateHeader {
+typedef struct SpaprDeviceTreeUpdateHeader {
     uint32_t version_id;
-} sPAPRDeviceTreeUpdateHeader;
+} SpaprDeviceTreeUpdateHeader;
 
 #define hcall_dprintf(fmt, ...) \
     do { \
         qemu_log_mask(LOG_GUEST_ERROR, "%s: " fmt, __func__, ## __VA_ARGS__); \
     } while (0)
 
-typedef target_ulong (*spapr_hcall_fn)(PowerPCCPU *cpu, sPAPRMachineState *sm,
+typedef target_ulong (*spapr_hcall_fn)(PowerPCCPU *cpu, SpaprMachineState *sm,
                                        target_ulong opcode,
                                        target_ulong *args);
 
@@ -666,16 +666,16 @@ static inline void rtas_st(target_ulong phys, int n, uint32_t val)
     stl_be_phys(&address_space_memory, ppc64_phys_to_real(phys + 4*n), val);
 }
 
-typedef void (*spapr_rtas_fn)(PowerPCCPU *cpu, sPAPRMachineState *sm,
+typedef void (*spapr_rtas_fn)(PowerPCCPU *cpu, SpaprMachineState *sm,
                               uint32_t token,
                               uint32_t nargs, target_ulong args,
                               uint32_t nret, target_ulong rets);
 void spapr_rtas_register(int token, const char *name, spapr_rtas_fn fn);
-target_ulong spapr_rtas_call(PowerPCCPU *cpu, sPAPRMachineState *sm,
+target_ulong spapr_rtas_call(PowerPCCPU *cpu, SpaprMachineState *sm,
                              uint32_t token, uint32_t nargs, target_ulong args,
                              uint32_t nret, target_ulong rets);
 void spapr_dt_rtas_tokens(void *fdt, int rtas);
-void spapr_load_rtas(sPAPRMachineState *spapr, void *fdt, hwaddr addr);
+void spapr_load_rtas(SpaprMachineState *spapr, void *fdt, hwaddr addr);
 
 #define SPAPR_TCE_PAGE_SHIFT   12
 #define SPAPR_TCE_PAGE_SIZE    (1ULL << SPAPR_TCE_PAGE_SHIFT)
@@ -702,17 +702,17 @@ static inline void spapr_dt_irq(uint32_t *intspec, int irq, bool is_lsi)
     intspec[1] = is_lsi ? cpu_to_be32(1) : 0;
 }
 
-typedef struct sPAPRTCETable sPAPRTCETable;
+typedef struct SpaprTceTable SpaprTceTable;
 
 #define TYPE_SPAPR_TCE_TABLE "spapr-tce-table"
 #define SPAPR_TCE_TABLE(obj) \
-    OBJECT_CHECK(sPAPRTCETable, (obj), TYPE_SPAPR_TCE_TABLE)
+    OBJECT_CHECK(SpaprTceTable, (obj), TYPE_SPAPR_TCE_TABLE)
 
 #define TYPE_SPAPR_IOMMU_MEMORY_REGION "spapr-iommu-memory-region"
 #define SPAPR_IOMMU_MEMORY_REGION(obj) \
         OBJECT_CHECK(IOMMUMemoryRegion, (obj), TYPE_SPAPR_IOMMU_MEMORY_REGION)
 
-struct sPAPRTCETable {
+struct SpaprTceTable {
     DeviceState parent;
     uint32_t liobn;
     uint32_t nb_table;
@@ -727,69 +727,69 @@ struct sPAPRTCETable {
     int fd;
     MemoryRegion root;
     IOMMUMemoryRegion iommu;
-    struct VIOsPAPRDevice *vdev; /* for @bypass migration compatibility only */
-    QLIST_ENTRY(sPAPRTCETable) list;
+    struct SpaprVioDevice *vdev; /* for @bypass migration compatibility only */
+    QLIST_ENTRY(SpaprTceTable) list;
 };
 
-sPAPRTCETable *spapr_tce_find_by_liobn(target_ulong liobn);
+SpaprTceTable *spapr_tce_find_by_liobn(target_ulong liobn);
 
-struct sPAPREventLogEntry {
+struct SpaprEventLogEntry {
     uint32_t summary;
     uint32_t extended_length;
     void *extended_log;
-    QTAILQ_ENTRY(sPAPREventLogEntry) next;
+    QTAILQ_ENTRY(SpaprEventLogEntry) next;
 };
 
-void spapr_events_init(sPAPRMachineState *sm);
-void spapr_dt_events(sPAPRMachineState *sm, void *fdt);
-int spapr_h_cas_compose_response(sPAPRMachineState *sm,
+void spapr_events_init(SpaprMachineState *sm);
+void spapr_dt_events(SpaprMachineState *sm, void *fdt);
+int spapr_h_cas_compose_response(SpaprMachineState *sm,
                                  target_ulong addr, target_ulong size,
-                                 sPAPROptionVector *ov5_updates);
-void close_htab_fd(sPAPRMachineState *spapr);
-void spapr_setup_hpt_and_vrma(sPAPRMachineState *spapr);
-void spapr_free_hpt(sPAPRMachineState *spapr);
-sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn);
-void spapr_tce_table_enable(sPAPRTCETable *tcet,
+                                 SpaprOptionVector *ov5_updates);
+void close_htab_fd(SpaprMachineState *spapr);
+void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr);
+void spapr_free_hpt(SpaprMachineState *spapr);
+SpaprTceTable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn);
+void spapr_tce_table_enable(SpaprTceTable *tcet,
                             uint32_t page_shift, uint64_t bus_offset,
                             uint32_t nb_table);
-void spapr_tce_table_disable(sPAPRTCETable *tcet);
-void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio);
+void spapr_tce_table_disable(SpaprTceTable *tcet);
+void spapr_tce_set_need_vfio(SpaprTceTable *tcet, bool need_vfio);
 
-MemoryRegion *spapr_tce_get_iommu(sPAPRTCETable *tcet);
+MemoryRegion *spapr_tce_get_iommu(SpaprTceTable *tcet);
 int spapr_dma_dt(void *fdt, int node_off, const char *propname,
                  uint32_t liobn, uint64_t window, uint32_t size);
 int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname,
-                      sPAPRTCETable *tcet);
+                      SpaprTceTable *tcet);
 void spapr_pci_switch_vga(bool big_endian);
-void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc);
-void spapr_hotplug_req_remove_by_index(sPAPRDRConnector *drc);
-void spapr_hotplug_req_add_by_count(sPAPRDRConnectorType drc_type,
+void spapr_hotplug_req_add_by_index(SpaprDrc *drc);
+void spapr_hotplug_req_remove_by_index(SpaprDrc *drc);
+void spapr_hotplug_req_add_by_count(SpaprDrcType drc_type,
                                        uint32_t count);
-void spapr_hotplug_req_remove_by_count(sPAPRDRConnectorType drc_type,
+void spapr_hotplug_req_remove_by_count(SpaprDrcType drc_type,
                                           uint32_t count);
-void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConnectorType drc_type,
+void spapr_hotplug_req_add_by_count_indexed(SpaprDrcType drc_type,
                                             uint32_t count, uint32_t index);
-void spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_type,
+void spapr_hotplug_req_remove_by_count_indexed(SpaprDrcType drc_type,
                                                uint32_t count, uint32_t index);
 int spapr_hpt_shift_for_ramsize(uint64_t ramsize);
-void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift,
+void spapr_reallocate_hpt(SpaprMachineState *spapr, int shift,
                           Error **errp);
-void spapr_clear_pending_events(sPAPRMachineState *spapr);
-int spapr_max_server_number(sPAPRMachineState *spapr);
+void spapr_clear_pending_events(SpaprMachineState *spapr);
+int spapr_max_server_number(SpaprMachineState *spapr);
 
 /* DRC callbacks. */
 void spapr_core_release(DeviceState *dev);
-int spapr_core_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
+int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
                            void *fdt, int *fdt_start_offset, Error **errp);
 void spapr_lmb_release(DeviceState *dev);
-int spapr_lmb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
+int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
                           void *fdt, int *fdt_start_offset, Error **errp);
 void spapr_phb_release(DeviceState *dev);
-int spapr_phb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr,
+int spapr_phb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
                           void *fdt, int *fdt_start_offset, Error **errp);
 
-void spapr_rtc_read(sPAPRRTCState *rtc, struct tm *tm, uint32_t *ns);
-int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset);
+void spapr_rtc_read(SpaprRtcState *rtc, struct tm *tm, uint32_t *ns);
+int spapr_rtc_import_offset(SpaprRtcState *rtc, int64_t legacy_offset);
 
 #define TYPE_SPAPR_RNG "spapr-rng"
 
@@ -843,18 +843,18 @@ extern const VMStateDescription vmstate_spapr_cap_nested_kvm_hv;
 extern const VMStateDescription vmstate_spapr_cap_large_decr;
 extern const VMStateDescription vmstate_spapr_cap_ccf_assist;
 
-static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap)
+static inline uint8_t spapr_get_cap(SpaprMachineState *spapr, int cap)
 {
     return spapr->eff.caps[cap];
 }
 
-void spapr_caps_init(sPAPRMachineState *spapr);
-void spapr_caps_apply(sPAPRMachineState *spapr);
-void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu);
-void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp);
-int spapr_caps_post_migration(sPAPRMachineState *spapr);
+void spapr_caps_init(SpaprMachineState *spapr);
+void spapr_caps_apply(SpaprMachineState *spapr);
+void spapr_caps_cpu_apply(SpaprMachineState *spapr, PowerPCCPU *cpu);
+void spapr_caps_add_properties(SpaprMachineClass *smc, Error **errp);
+int spapr_caps_post_migration(SpaprMachineState *spapr);
 
-void spapr_check_pagesize(sPAPRMachineState *spapr, hwaddr pagesize,
+void spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize,
                           Error **errp);
 /*
  * XIVE definitions
diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_core.h
index d64f86bc28..f9645a7290 100644
--- a/include/hw/ppc/spapr_cpu_core.h
+++ b/include/hw/ppc/spapr_cpu_core.h
@@ -16,43 +16,43 @@
 
 #define TYPE_SPAPR_CPU_CORE "spapr-cpu-core"
 #define SPAPR_CPU_CORE(obj) \
-    OBJECT_CHECK(sPAPRCPUCore, (obj), TYPE_SPAPR_CPU_CORE)
+    OBJECT_CHECK(SpaprCpuCore, (obj), TYPE_SPAPR_CPU_CORE)
 #define SPAPR_CPU_CORE_CLASS(klass) \
-    OBJECT_CLASS_CHECK(sPAPRCPUCoreClass, (klass), TYPE_SPAPR_CPU_CORE)
+    OBJECT_CLASS_CHECK(SpaprCpuCoreClass, (klass), TYPE_SPAPR_CPU_CORE)
 #define SPAPR_CPU_CORE_GET_CLASS(obj) \
-     OBJECT_GET_CLASS(sPAPRCPUCoreClass, (obj), TYPE_SPAPR_CPU_CORE)
+     OBJECT_GET_CLASS(SpaprCpuCoreClass, (obj), TYPE_SPAPR_CPU_CORE)
 
 #define SPAPR_CPU_CORE_TYPE_NAME(model) model "-" TYPE_SPAPR_CPU_CORE
 
-typedef struct sPAPRCPUCore {
+typedef struct SpaprCpuCore {
     /*< private >*/
     CPUCore parent_obj;
 
     /*< public >*/
     PowerPCCPU **threads;
     int node_id;
-    bool pre_3_0_migration; /* older machine don't know about sPAPRCPUState */
-} sPAPRCPUCore;
+    bool pre_3_0_migration; /* older machine don't know about SpaprCpuState */
+} SpaprCpuCore;
 
-typedef struct sPAPRCPUCoreClass {
+typedef struct SpaprCpuCoreClass {
     DeviceClass parent_class;
     const char *cpu_type;
-} sPAPRCPUCoreClass;
+} SpaprCpuCoreClass;
 
 const char *spapr_get_cpu_core_type(const char *cpu_type);
 void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_ulong r3);
 
-typedef struct sPAPRCPUState {
+typedef struct SpaprCpuState {
     uint64_t vpa_addr;
     uint64_t slb_shadow_addr, slb_shadow_size;
     uint64_t dtl_addr, dtl_size;
     struct ICPState *icp;
     struct XiveTCTX *tctx;
-} sPAPRCPUState;
+} SpaprCpuState;
 
-static inline sPAPRCPUState *spapr_cpu_state(PowerPCCPU *cpu)
+static inline SpaprCpuState *spapr_cpu_state(PowerPCCPU *cpu)
 {
-    return (sPAPRCPUState *)cpu->machine_data;
+    return (SpaprCpuState *)cpu->machine_data;
 }
 
 #endif
diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h
index 46b0f6216d..fad0a887f9 100644
--- a/include/hw/ppc/spapr_drc.h
+++ b/include/hw/ppc/spapr_drc.h
@@ -22,65 +22,65 @@
 
 #define TYPE_SPAPR_DR_CONNECTOR "spapr-dr-connector"
 #define SPAPR_DR_CONNECTOR_GET_CLASS(obj) \
-        OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DR_CONNECTOR)
+        OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DR_CONNECTOR)
 #define SPAPR_DR_CONNECTOR_CLASS(klass) \
-        OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, \
+        OBJECT_CLASS_CHECK(SpaprDrcClass, klass, \
                            TYPE_SPAPR_DR_CONNECTOR)
-#define SPAPR_DR_CONNECTOR(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \
+#define SPAPR_DR_CONNECTOR(obj) OBJECT_CHECK(SpaprDrc, (obj), \
                                              TYPE_SPAPR_DR_CONNECTOR)
 
 #define TYPE_SPAPR_DRC_PHYSICAL "spapr-drc-physical"
 #define SPAPR_DRC_PHYSICAL_GET_CLASS(obj) \
-        OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_PHYSICAL)
+        OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_PHYSICAL)
 #define SPAPR_DRC_PHYSICAL_CLASS(klass) \
-        OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, \
+        OBJECT_CLASS_CHECK(SpaprDrcClass, klass, \
                            TYPE_SPAPR_DRC_PHYSICAL)
-#define SPAPR_DRC_PHYSICAL(obj) OBJECT_CHECK(sPAPRDRCPhysical, (obj), \
+#define SPAPR_DRC_PHYSICAL(obj) OBJECT_CHECK(SpaprDrcPhysical, (obj), \
                                              TYPE_SPAPR_DRC_PHYSICAL)
 
 #define TYPE_SPAPR_DRC_LOGICAL "spapr-drc-logical"
 #define SPAPR_DRC_LOGICAL_GET_CLASS(obj) \
-        OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_LOGICAL)
+        OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_LOGICAL)
 #define SPAPR_DRC_LOGICAL_CLASS(klass) \
-        OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, \
+        OBJECT_CLASS_CHECK(SpaprDrcClass, klass, \
                            TYPE_SPAPR_DRC_LOGICAL)
-#define SPAPR_DRC_LOGICAL(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \
+#define SPAPR_DRC_LOGICAL(obj) OBJECT_CHECK(SpaprDrc, (obj), \
                                              TYPE_SPAPR_DRC_LOGICAL)
 
 #define TYPE_SPAPR_DRC_CPU "spapr-drc-cpu"
 #define SPAPR_DRC_CPU_GET_CLASS(obj) \
-        OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_CPU)
+        OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_CPU)
 #define SPAPR_DRC_CPU_CLASS(klass) \
-        OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_CPU)
-#define SPAPR_DRC_CPU(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \
+        OBJECT_CLASS_CHECK(SpaprDrcClass, klass, TYPE_SPAPR_DRC_CPU)
+#define SPAPR_DRC_CPU(obj) OBJECT_CHECK(SpaprDrc, (obj), \
                                         TYPE_SPAPR_DRC_CPU)
 
 #define TYPE_SPAPR_DRC_PCI "spapr-drc-pci"
 #define SPAPR_DRC_PCI_GET_CLASS(obj) \
-        OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_PCI)
+        OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_PCI)
 #define SPAPR_DRC_PCI_CLASS(klass) \
-        OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_PCI)
-#define SPAPR_DRC_PCI(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \
+        OBJECT_CLASS_CHECK(SpaprDrcClass, klass, TYPE_SPAPR_DRC_PCI)
+#define SPAPR_DRC_PCI(obj) OBJECT_CHECK(SpaprDrc, (obj), \
                                         TYPE_SPAPR_DRC_PCI)
 
 #define TYPE_SPAPR_DRC_LMB "spapr-drc-lmb"
 #define SPAPR_DRC_LMB_GET_CLASS(obj) \
-        OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_LMB)
+        OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_LMB)
 #define SPAPR_DRC_LMB_CLASS(klass) \
-        OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_LMB)
-#define SPAPR_DRC_LMB(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \
+        OBJECT_CLASS_CHECK(SpaprDrcClass, klass, TYPE_SPAPR_DRC_LMB)
+#define SPAPR_DRC_LMB(obj) OBJECT_CHECK(SpaprDrc, (obj), \
                                         TYPE_SPAPR_DRC_LMB)
 
 #define TYPE_SPAPR_DRC_PHB "spapr-drc-phb"
 #define SPAPR_DRC_PHB_GET_CLASS(obj) \
-        OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_PHB)
+        OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_PHB)
 #define SPAPR_DRC_PHB_CLASS(klass) \
-        OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_PHB)
-#define SPAPR_DRC_PHB(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \
+        OBJECT_CLASS_CHECK(SpaprDrcClass, klass, TYPE_SPAPR_DRC_PHB)
+#define SPAPR_DRC_PHB(obj) OBJECT_CHECK(SpaprDrc, (obj), \
                                         TYPE_SPAPR_DRC_PHB)
 
 /*
- * Various hotplug types managed by sPAPRDRConnector
+ * Various hotplug types managed by SpaprDrc
  *
  * these are somewhat arbitrary, but to make things easier
  * when generating DRC indexes later we've aligned the bit
@@ -96,7 +96,7 @@ typedef enum {
     SPAPR_DR_CONNECTOR_TYPE_SHIFT_VIO = 3,
     SPAPR_DR_CONNECTOR_TYPE_SHIFT_PCI = 4,
     SPAPR_DR_CONNECTOR_TYPE_SHIFT_LMB = 8,
-} sPAPRDRConnectorTypeShift;
+} SpaprDrcTypeShift;
 
 typedef enum {
     SPAPR_DR_CONNECTOR_TYPE_ANY = ~0,
@@ -105,7 +105,7 @@ typedef enum {
     SPAPR_DR_CONNECTOR_TYPE_VIO = 1 << SPAPR_DR_CONNECTOR_TYPE_SHIFT_VIO,
     SPAPR_DR_CONNECTOR_TYPE_PCI = 1 << SPAPR_DR_CONNECTOR_TYPE_SHIFT_PCI,
     SPAPR_DR_CONNECTOR_TYPE_LMB = 1 << SPAPR_DR_CONNECTOR_TYPE_SHIFT_LMB,
-} sPAPRDRConnectorType;
+} SpaprDrcType;
 
 /*
  * set via set-indicator RTAS calls
@@ -117,7 +117,7 @@ typedef enum {
 typedef enum {
     SPAPR_DR_ISOLATION_STATE_ISOLATED   = 0,
     SPAPR_DR_ISOLATION_STATE_UNISOLATED = 1
-} sPAPRDRIsolationState;
+} SpaprDRIsolationState;
 
 /*
  * set via set-indicator RTAS calls
@@ -133,7 +133,7 @@ typedef enum {
     SPAPR_DR_ALLOCATION_STATE_USABLE    = 1,
     SPAPR_DR_ALLOCATION_STATE_EXCHANGE  = 2,
     SPAPR_DR_ALLOCATION_STATE_RECOVER   = 3
-} sPAPRDRAllocationState;
+} SpaprDRAllocationState;
 
 /*
  * DR-indicator (LED/visual indicator)
@@ -152,7 +152,7 @@ typedef enum {
     SPAPR_DR_INDICATOR_ACTIVE     = 1,
     SPAPR_DR_INDICATOR_IDENTIFY   = 2,
     SPAPR_DR_INDICATOR_ACTION     = 3,
-} sPAPRDRIndicatorState;
+} SpaprDRIndicatorState;
 
 /*
  * returned via get-sensor-state RTAS calls
@@ -170,7 +170,7 @@ typedef enum {
     SPAPR_DR_ENTITY_SENSE_UNUSABLE  = 2,
     SPAPR_DR_ENTITY_SENSE_EXCHANGE  = 3,
     SPAPR_DR_ENTITY_SENSE_RECOVER   = 4,
-} sPAPRDREntitySense;
+} SpaprDREntitySense;
 
 typedef enum {
     SPAPR_DR_CC_RESPONSE_NEXT_SIB         = 1, /* currently unused */
@@ -181,7 +181,7 @@ typedef enum {
     SPAPR_DR_CC_RESPONSE_ERROR            = -1,
     SPAPR_DR_CC_RESPONSE_CONTINUE         = -2,
     SPAPR_DR_CC_RESPONSE_NOT_CONFIGURABLE = -9003,
-} sPAPRDRCCResponse;
+} SpaprDRCCResponse;
 
 typedef enum {
     /*
@@ -199,9 +199,9 @@ typedef enum {
     SPAPR_DRC_STATE_PHYSICAL_POWERON    = 6,
     SPAPR_DRC_STATE_PHYSICAL_UNISOLATE  = 7,
     SPAPR_DRC_STATE_PHYSICAL_CONFIGURED = 8,
-} sPAPRDRCState;
+} SpaprDrcState;
 
-typedef struct sPAPRDRConnector {
+typedef struct SpaprDrc {
     /*< private >*/
     DeviceState parent;
 
@@ -220,60 +220,60 @@ typedef struct sPAPRDRConnector {
     bool unplug_requested;
     void *fdt;
     int fdt_start_offset;
-} sPAPRDRConnector;
+} SpaprDrc;
 
-struct sPAPRMachineState;
+struct SpaprMachineState;
 
-typedef struct sPAPRDRConnectorClass {
+typedef struct SpaprDrcClass {
     /*< private >*/
     DeviceClass parent;
-    sPAPRDRCState empty_state;
-    sPAPRDRCState ready_state;
+    SpaprDrcState empty_state;
+    SpaprDrcState ready_state;
 
     /*< public >*/
-    sPAPRDRConnectorTypeShift typeshift;
+    SpaprDrcTypeShift typeshift;
     const char *typename; /* used in device tree, PAPR 13.5.2.6 & C.6.1 */
     const char *drc_name_prefix; /* used other places in device tree */
 
-    sPAPRDREntitySense (*dr_entity_sense)(sPAPRDRConnector *drc);
-    uint32_t (*isolate)(sPAPRDRConnector *drc);
-    uint32_t (*unisolate)(sPAPRDRConnector *drc);
+    SpaprDREntitySense (*dr_entity_sense)(SpaprDrc *drc);
+    uint32_t (*isolate)(SpaprDrc *drc);
+    uint32_t (*unisolate)(SpaprDrc *drc);
     void (*release)(DeviceState *dev);
 
-    int (*dt_populate)(sPAPRDRConnector *drc, struct sPAPRMachineState *spapr,
+    int (*dt_populate)(SpaprDrc *drc, struct SpaprMachineState *spapr,
                        void *fdt, int *fdt_start_offset, Error **errp);
-} sPAPRDRConnectorClass;
+} SpaprDrcClass;
 
-typedef struct sPAPRDRCPhysical {
+typedef struct SpaprDrcPhysical {
     /*< private >*/
-    sPAPRDRConnector parent;
+    SpaprDrc parent;
 
     /* DR-indicator */
     uint32_t dr_indicator;
-} sPAPRDRCPhysical;
+} SpaprDrcPhysical;
 
 static inline bool spapr_drc_hotplugged(DeviceState *dev)
 {
     return dev->hotplugged && !runstate_check(RUN_STATE_INMIGRATE);
 }
 
-void spapr_drc_reset(sPAPRDRConnector *drc);
+void spapr_drc_reset(SpaprDrc *drc);
 
-uint32_t spapr_drc_index(sPAPRDRConnector *drc);
-sPAPRDRConnectorType spapr_drc_type(sPAPRDRConnector *drc);
+uint32_t spapr_drc_index(SpaprDrc *drc);
+SpaprDrcType spapr_drc_type(SpaprDrc *drc);
 
-sPAPRDRConnector *spapr_dr_connector_new(Object *owner, const char *type,
+SpaprDrc *spapr_dr_connector_new(Object *owner, const char *type,
                                          uint32_t id);
-sPAPRDRConnector *spapr_drc_by_index(uint32_t index);
-sPAPRDRConnector *spapr_drc_by_id(const char *type, uint32_t id);
+SpaprDrc *spapr_drc_by_index(uint32_t index);
+SpaprDrc *spapr_drc_by_id(const char *type, uint32_t id);
 int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner,
                           uint32_t drc_type_mask);
 
-void spapr_drc_attach(sPAPRDRConnector *drc, DeviceState *d, Error **errp);
-void spapr_drc_detach(sPAPRDRConnector *drc);
+void spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp);
+void spapr_drc_detach(SpaprDrc *drc);
 bool spapr_drc_needed(void *opaque);
 
-static inline bool spapr_drc_unplug_requested(sPAPRDRConnector *drc)
+static inline bool spapr_drc_unplug_requested(SpaprDrc *drc)
 {
     return drc->unplug_requested;
 }
diff --git a/include/hw/ppc/spapr_irq.h b/include/hw/ppc/spapr_irq.h
index ec1ee64fa6..b855f74e44 100644
--- a/include/hw/ppc/spapr_irq.h
+++ b/include/hw/ppc/spapr_irq.h
@@ -22,51 +22,51 @@
 #define SPAPR_IRQ_MSI        0x1300  /* Offset of the dynamic range covered
                                       * by the bitmap allocator */
 
-typedef struct sPAPRMachineState sPAPRMachineState;
+typedef struct SpaprMachineState SpaprMachineState;
 
-void spapr_irq_msi_init(sPAPRMachineState *spapr, uint32_t nr_msis);
-int spapr_irq_msi_alloc(sPAPRMachineState *spapr, uint32_t num, bool align,
+void spapr_irq_msi_init(SpaprMachineState *spapr, uint32_t nr_msis);
+int spapr_irq_msi_alloc(SpaprMachineState *spapr, uint32_t num, bool align,
                         Error **errp);
-void spapr_irq_msi_free(sPAPRMachineState *spapr, int irq, uint32_t num);
-void spapr_irq_msi_reset(sPAPRMachineState *spapr);
+void spapr_irq_msi_free(SpaprMachineState *spapr, int irq, uint32_t num);
+void spapr_irq_msi_reset(SpaprMachineState *spapr);
 
-typedef struct sPAPRIrq {
+typedef struct SpaprIrq {
     uint32_t    nr_irqs;
     uint32_t    nr_msis;
     uint8_t     ov5;
 
-    void (*init)(sPAPRMachineState *spapr, int nr_irqs, Error **errp);
-    int (*claim)(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp);
-    void (*free)(sPAPRMachineState *spapr, int irq, int num);
-    qemu_irq (*qirq)(sPAPRMachineState *spapr, int irq);
-    void (*print_info)(sPAPRMachineState *spapr, Monitor *mon);
-    void (*dt_populate)(sPAPRMachineState *spapr, uint32_t nr_servers,
+    void (*init)(SpaprMachineState *spapr, int nr_irqs, Error **errp);
+    int (*claim)(SpaprMachineState *spapr, int irq, bool lsi, Error **errp);
+    void (*free)(SpaprMachineState *spapr, int irq, int num);
+    qemu_irq (*qirq)(SpaprMachineState *spapr, int irq);
+    void (*print_info)(SpaprMachineState *spapr, Monitor *mon);
+    void (*dt_populate)(SpaprMachineState *spapr, uint32_t nr_servers,
                         void *fdt, uint32_t phandle);
-    void (*cpu_intc_create)(sPAPRMachineState *spapr, PowerPCCPU *cpu,
+    void (*cpu_intc_create)(SpaprMachineState *spapr, PowerPCCPU *cpu,
                             Error **errp);
-    int (*post_load)(sPAPRMachineState *spapr, int version_id);
-    void (*reset)(sPAPRMachineState *spapr, Error **errp);
+    int (*post_load)(SpaprMachineState *spapr, int version_id);
+    void (*reset)(SpaprMachineState *spapr, Error **errp);
     void (*set_irq)(void *opaque, int srcno, int val);
-    const char *(*get_nodename)(sPAPRMachineState *spapr);
-} sPAPRIrq;
+    const char *(*get_nodename)(SpaprMachineState *spapr);
+} SpaprIrq;
 
-extern sPAPRIrq spapr_irq_xics;
-extern sPAPRIrq spapr_irq_xics_legacy;
-extern sPAPRIrq spapr_irq_xive;
-extern sPAPRIrq spapr_irq_dual;
+extern SpaprIrq spapr_irq_xics;
+extern SpaprIrq spapr_irq_xics_legacy;
+extern SpaprIrq spapr_irq_xive;
+extern SpaprIrq spapr_irq_dual;
 
-void spapr_irq_init(sPAPRMachineState *spapr, Error **errp);
-int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp);
-void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num);
-qemu_irq spapr_qirq(sPAPRMachineState *spapr, int irq);
-int spapr_irq_post_load(sPAPRMachineState *spapr, int version_id);
-void spapr_irq_reset(sPAPRMachineState *spapr, Error **errp);
-int spapr_irq_get_phandle(sPAPRMachineState *spapr, void *fdt, Error **errp);
+void spapr_irq_init(SpaprMachineState *spapr, Error **errp);
+int spapr_irq_claim(SpaprMachineState *spapr, int irq, bool lsi, Error **errp);
+void spapr_irq_free(SpaprMachineState *spapr, int irq, int num);
+qemu_irq spapr_qirq(SpaprMachineState *spapr, int irq);
+int spapr_irq_post_load(SpaprMachineState *spapr, int version_id);
+void spapr_irq_reset(SpaprMachineState *spapr, Error **errp);
+int spapr_irq_get_phandle(SpaprMachineState *spapr, void *fdt, Error **errp);
 
 /*
  * XICS legacy routines
  */
-int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp);
+int spapr_irq_find(SpaprMachineState *spapr, int num, bool align, Error **errp);
 #define spapr_irq_findone(spapr, errp) spapr_irq_find(spapr, 1, false, errp)
 
 #endif
diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h
index 0f2d8d715d..188a9367e2 100644
--- a/include/hw/ppc/spapr_ovec.h
+++ b/include/hw/ppc/spapr_ovec.h
@@ -39,7 +39,7 @@
 #include "cpu.h"
 #include "migration/vmstate.h"
 
-typedef struct sPAPROptionVector sPAPROptionVector;
+typedef struct SpaprOptionVector SpaprOptionVector;
 
 #define OV_BIT(byte, bit) ((byte - 1) * BITS_PER_BYTE + bit)
 
@@ -61,21 +61,21 @@ typedef struct sPAPROptionVector sPAPROptionVector;
 #define OV5_MMU_RADIX_GTSE      OV_BIT(26, 1) /* Radix GTSE */
 
 /* interfaces */
-sPAPROptionVector *spapr_ovec_new(void);
-sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov_orig);
-void spapr_ovec_intersect(sPAPROptionVector *ov,
-                          sPAPROptionVector *ov1,
-                          sPAPROptionVector *ov2);
-bool spapr_ovec_diff(sPAPROptionVector *ov,
-                     sPAPROptionVector *ov_old,
-                     sPAPROptionVector *ov_new);
-void spapr_ovec_cleanup(sPAPROptionVector *ov);
-void spapr_ovec_set(sPAPROptionVector *ov, long bitnr);
-void spapr_ovec_clear(sPAPROptionVector *ov, long bitnr);
-bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr);
-sPAPROptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector);
+SpaprOptionVector *spapr_ovec_new(void);
+SpaprOptionVector *spapr_ovec_clone(SpaprOptionVector *ov_orig);
+void spapr_ovec_intersect(SpaprOptionVector *ov,
+                          SpaprOptionVector *ov1,
+                          SpaprOptionVector *ov2);
+bool spapr_ovec_diff(SpaprOptionVector *ov,
+                     SpaprOptionVector *ov_old,
+                     SpaprOptionVector *ov_new);
+void spapr_ovec_cleanup(SpaprOptionVector *ov);
+void spapr_ovec_set(SpaprOptionVector *ov, long bitnr);
+void spapr_ovec_clear(SpaprOptionVector *ov, long bitnr);
+bool spapr_ovec_test(SpaprOptionVector *ov, long bitnr);
+SpaprOptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int vector);
 int spapr_ovec_populate_dt(void *fdt, int fdt_offset,
-                           sPAPROptionVector *ov, const char *name);
+                           SpaprOptionVector *ov, const char *name);
 
 /* migration */
 extern const VMStateDescription vmstate_spapr_ovec;
diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h
index e8b006d18f..04609f214e 100644
--- a/include/hw/ppc/spapr_vio.h
+++ b/include/hw/ppc/spapr_vio.h
@@ -26,91 +26,91 @@
 
 #define TYPE_VIO_SPAPR_DEVICE "vio-spapr-device"
 #define VIO_SPAPR_DEVICE(obj) \
-     OBJECT_CHECK(VIOsPAPRDevice, (obj), TYPE_VIO_SPAPR_DEVICE)
+     OBJECT_CHECK(SpaprVioDevice, (obj), TYPE_VIO_SPAPR_DEVICE)
 #define VIO_SPAPR_DEVICE_CLASS(klass) \
-     OBJECT_CLASS_CHECK(VIOsPAPRDeviceClass, (klass), TYPE_VIO_SPAPR_DEVICE)
+     OBJECT_CLASS_CHECK(SpaprVioDeviceClass, (klass), TYPE_VIO_SPAPR_DEVICE)
 #define VIO_SPAPR_DEVICE_GET_CLASS(obj) \
-     OBJECT_GET_CLASS(VIOsPAPRDeviceClass, (obj), TYPE_VIO_SPAPR_DEVICE)
+     OBJECT_GET_CLASS(SpaprVioDeviceClass, (obj), TYPE_VIO_SPAPR_DEVICE)
 
 #define TYPE_SPAPR_VIO_BUS "spapr-vio-bus"
-#define SPAPR_VIO_BUS(obj) OBJECT_CHECK(VIOsPAPRBus, (obj), TYPE_SPAPR_VIO_BUS)
+#define SPAPR_VIO_BUS(obj) OBJECT_CHECK(SpaprVioBus, (obj), TYPE_SPAPR_VIO_BUS)
 
 #define TYPE_SPAPR_VIO_BRIDGE "spapr-vio-bridge"
 
-typedef struct VIOsPAPR_CRQ {
+typedef struct SpaprVioCrq {
     uint64_t qladdr;
     uint32_t qsize;
     uint32_t qnext;
-    int(*SendFunc)(struct VIOsPAPRDevice *vdev, uint8_t *crq);
-} VIOsPAPR_CRQ;
+    int(*SendFunc)(struct SpaprVioDevice *vdev, uint8_t *crq);
+} SpaprVioCrq;
 
-typedef struct VIOsPAPRDevice VIOsPAPRDevice;
-typedef struct VIOsPAPRBus VIOsPAPRBus;
+typedef struct SpaprVioDevice SpaprVioDevice;
+typedef struct SpaprVioBus SpaprVioBus;
 
-typedef struct VIOsPAPRDeviceClass {
+typedef struct SpaprVioDeviceClass {
     DeviceClass parent_class;
 
     const char *dt_name, *dt_type, *dt_compatible;
     target_ulong signal_mask;
     uint32_t rtce_window_size;
-    void (*realize)(VIOsPAPRDevice *dev, Error **errp);
-    void (*reset)(VIOsPAPRDevice *dev);
-    int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off);
-} VIOsPAPRDeviceClass;
+    void (*realize)(SpaprVioDevice *dev, Error **errp);
+    void (*reset)(SpaprVioDevice *dev);
+    int (*devnode)(SpaprVioDevice *dev, void *fdt, int node_off);
+} SpaprVioDeviceClass;
 
-struct VIOsPAPRDevice {
+struct SpaprVioDevice {
     DeviceState qdev;
     uint32_t reg;
     uint32_t irq;
     uint64_t signal_state;
-    VIOsPAPR_CRQ crq;
+    SpaprVioCrq crq;
     AddressSpace as;
     MemoryRegion mrroot;
     MemoryRegion mrbypass;
-    sPAPRTCETable *tcet;
+    SpaprTceTable *tcet;
 };
 
 #define DEFINE_SPAPR_PROPERTIES(type, field)           \
         DEFINE_PROP_UINT32("reg", type, field.reg, -1)
 
-struct VIOsPAPRBus {
+struct SpaprVioBus {
     BusState bus;
     uint32_t next_reg;
 };
 
-extern VIOsPAPRBus *spapr_vio_bus_init(void);
-extern VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg);
-void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt);
-extern gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus);
+extern SpaprVioBus *spapr_vio_bus_init(void);
+extern SpaprVioDevice *spapr_vio_find_by_reg(SpaprVioBus *bus, uint32_t reg);
+void spapr_dt_vdevice(SpaprVioBus *bus, void *fdt);
+extern gchar *spapr_vio_stdout_path(SpaprVioBus *bus);
 
-static inline qemu_irq spapr_vio_qirq(VIOsPAPRDevice *dev)
+static inline qemu_irq spapr_vio_qirq(SpaprVioDevice *dev)
 {
-    sPAPRMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
+    SpaprMachineState *spapr = SPAPR_MACHINE(qdev_get_machine());
 
     return spapr_qirq(spapr, dev->irq);
 }
 
-static inline bool spapr_vio_dma_valid(VIOsPAPRDevice *dev, uint64_t taddr,
+static inline bool spapr_vio_dma_valid(SpaprVioDevice *dev, uint64_t taddr,
                                        uint32_t size, DMADirection dir)
 {
     return dma_memory_valid(&dev->as, taddr, size, dir);
 }
 
-static inline int spapr_vio_dma_read(VIOsPAPRDevice *dev, uint64_t taddr,
+static inline int spapr_vio_dma_read(SpaprVioDevice *dev, uint64_t taddr,
                                      void *buf, uint32_t size)
 {
     return (dma_memory_read(&dev->as, taddr, buf, size) != 0) ?
         H_DEST_PARM : H_SUCCESS;
 }
 
-static inline int spapr_vio_dma_write(VIOsPAPRDevice *dev, uint64_t taddr,
+static inline int spapr_vio_dma_write(SpaprVioDevice *dev, uint64_t taddr,
                                       const void *buf, uint32_t size)
 {
     return (dma_memory_write(&dev->as, taddr, buf, size) != 0) ?
         H_DEST_PARM : H_SUCCESS;
 }
 
-static inline int spapr_vio_dma_set(VIOsPAPRDevice *dev, uint64_t taddr,
+static inline int spapr_vio_dma_set(SpaprVioDevice *dev, uint64_t taddr,
                                     uint8_t c, uint32_t size)
 {
     return (dma_memory_set(&dev->as, taddr, c, size) != 0) ?
@@ -123,21 +123,21 @@ static inline int spapr_vio_dma_set(VIOsPAPRDevice *dev, uint64_t taddr,
 #define vio_stq(_dev, _addr, _val) (stq_be_dma(&(_dev)->as, (_addr), (_val)))
 #define vio_ldq(_dev, _addr) (ldq_be_dma(&(_dev)->as, (_addr)))
 
-int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq);
+int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq);
 
-VIOsPAPRDevice *vty_lookup(sPAPRMachineState *spapr, target_ulong reg);
-void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len);
-void spapr_vty_create(VIOsPAPRBus *bus, Chardev *chardev);
-void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd);
-void spapr_vscsi_create(VIOsPAPRBus *bus);
+SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg);
+void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len);
+void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev);
+void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd);
+void spapr_vscsi_create(SpaprVioBus *bus);
 
-VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus);
+SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus);
 
 extern const VMStateDescription vmstate_spapr_vio;
 
 #define VMSTATE_SPAPR_VIO(_f, _s) \
-    VMSTATE_STRUCT(_f, _s, 0, vmstate_spapr_vio, VIOsPAPRDevice)
+    VMSTATE_STRUCT(_f, _s, 0, vmstate_spapr_vio, SpaprVioDevice)
 
-void spapr_vio_set_bypass(VIOsPAPRDevice *dev, bool bypass);
+void spapr_vio_set_bypass(SpaprVioDevice *dev, bool bypass);
 
 #endif /* HW_SPAPR_VIO_H */
diff --git a/include/hw/ppc/spapr_xive.h b/include/hw/ppc/spapr_xive.h
index 2d31f24e3b..fc3e9652f9 100644
--- a/include/hw/ppc/spapr_xive.h
+++ b/include/hw/ppc/spapr_xive.h
@@ -13,9 +13,9 @@
 #include "hw/ppc/xive.h"
 
 #define TYPE_SPAPR_XIVE "spapr-xive"
-#define SPAPR_XIVE(obj) OBJECT_CHECK(sPAPRXive, (obj), TYPE_SPAPR_XIVE)
+#define SPAPR_XIVE(obj) OBJECT_CHECK(SpaprXive, (obj), TYPE_SPAPR_XIVE)
 
-typedef struct sPAPRXive {
+typedef struct SpaprXive {
     XiveRouter    parent;
 
     /* Internal interrupt source for IPIs and virtual devices */
@@ -38,16 +38,16 @@ typedef struct sPAPRXive {
     /* TIMA mapping address */
     hwaddr        tm_base;
     MemoryRegion  tm_mmio;
-} sPAPRXive;
+} SpaprXive;
 
-bool spapr_xive_irq_claim(sPAPRXive *xive, uint32_t lisn, bool lsi);
-bool spapr_xive_irq_free(sPAPRXive *xive, uint32_t lisn);
-void spapr_xive_pic_print_info(sPAPRXive *xive, Monitor *mon);
+bool spapr_xive_irq_claim(SpaprXive *xive, uint32_t lisn, bool lsi);
+bool spapr_xive_irq_free(SpaprXive *xive, uint32_t lisn);
+void spapr_xive_pic_print_info(SpaprXive *xive, Monitor *mon);
 
-void spapr_xive_hcall_init(sPAPRMachineState *spapr);
-void spapr_dt_xive(sPAPRMachineState *spapr, uint32_t nr_servers, void *fdt,
+void spapr_xive_hcall_init(SpaprMachineState *spapr);
+void spapr_dt_xive(SpaprMachineState *spapr, uint32_t nr_servers, void *fdt,
                    uint32_t phandle);
 void spapr_xive_set_tctx_os_cam(XiveTCTX *tctx);
-void spapr_xive_mmio_set_enabled(sPAPRXive *xive, bool enable);
+void spapr_xive_mmio_set_enabled(SpaprXive *xive, bool enable);
 
 #endif /* PPC_SPAPR_XIVE_H */
diff --git a/include/hw/ppc/xics_spapr.h b/include/hw/ppc/xics_spapr.h
index b8d924baf4..15a8dcff66 100644
--- a/include/hw/ppc/xics_spapr.h
+++ b/include/hw/ppc/xics_spapr.h
@@ -31,9 +31,9 @@
 
 #define XICS_NODENAME "interrupt-controller"
 
-void spapr_dt_xics(sPAPRMachineState *spapr, uint32_t nr_servers, void *fdt,
+void spapr_dt_xics(SpaprMachineState *spapr, uint32_t nr_servers, void *fdt,
                    uint32_t phandle);
-int xics_kvm_init(sPAPRMachineState *spapr, Error **errp);
-void xics_spapr_init(sPAPRMachineState *spapr);
+int xics_kvm_init(SpaprMachineState *spapr, Error **errp);
+void xics_spapr_init(SpaprMachineState *spapr);
 
 #endif /* XICS_SPAPR_H */
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index d0bfb076df..fc268661bc 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -756,7 +756,7 @@ static int kvm_get_fp(CPUState *cs)
 static int kvm_get_vpa(CPUState *cs)
 {
     PowerPCCPU *cpu = POWERPC_CPU(cs);
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
     struct kvm_one_reg reg;
     int ret;
 
@@ -796,7 +796,7 @@ static int kvm_get_vpa(CPUState *cs)
 static int kvm_put_vpa(CPUState *cs)
 {
     PowerPCCPU *cpu = POWERPC_CPU(cs);
-    sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu);
+    SpaprCpuState *spapr_cpu = spapr_cpu_state(cpu);
     struct kvm_one_reg reg;
     int ret;
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (59 preceding siblings ...)
  2019-03-10  8:27 ` [Qemu-devel] [PULL 60/60] spapr: Use CamelCase properly David Gibson
@ 2019-03-10  9:23 ` no-reply
  2019-03-10 16:06 ` Peter Maydell
  61 siblings, 0 replies; 74+ messages in thread
From: no-reply @ 2019-03-10  9:23 UTC (permalink / raw)
  To: david; +Cc: fam, peter.maydell, lvivier, qemu-ppc, groug, qemu-devel

Patchew URL: https://patchew.org/QEMU/20190310082703.1245-1-david@gibson.dropbear.id.au/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Type: series
Message-id: 20190310082703.1245-1-david@gibson.dropbear.id.au
Subject: [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310

=== TEST SCRIPT BEGIN ===
#!/bin/bash
git rev-parse base > /dev/null || exit 0
git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram
./scripts/checkpatch.pl --mailback base..
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 * [new tag]               patchew/20190310082703.1245-1-david@gibson.dropbear.id.au -> patchew/20190310082703.1245-1-david@gibson.dropbear.id.au
Switched to a new branch 'test'
a13e9857de spapr: Use CamelCase properly
9b2d3e81df target/ppc: Optimize x[sv]xsigdp using deposit_i64()
1a63e5d488 target/ppc: Optimize xviexpdp() using deposit_i64()
82f058a774 target/ppc: add HV support for POWER9
c85ade25f0 ppc/pnv: add a "ibm, opal/power-mgt" device tree node on POWER9
e39b190d65 ppc/pnv: add more dummy XSCOM addresses
2aaa98b799 ppc/pnv: activate XSCOM tests for POWER9
40a779400e ppc/pnv: POWER9 XSCOM quad support
bf6b37e0e3 ppc/pnv: extend XSCOM core support for POWER9
a16eb6280a ppc/pnv: add a OCC model for POWER9
177a01f268 ppc/pnv: add a OCC model class
0032552915 ppc/pnv: add SerIRQ routing registers
cad3544b00 ppc/pnv: add a LPC Controller model for POWER9
c8a3537791 ppc/pnv: add a 'dt_isa_nodename' to the chip
8a24b7e984 ppc/pnv: add a LPC Controller class model
b565618566 ppc/pnv: lpc: fix OPB address ranges
b3753bf4d5 ppc/pnv: add a PSI bridge model for POWER9
0f805a7337 ppc/pnv: add a PSI bridge class model
dc90b53163 mac_newworld: use node name instead of alias name for hd device in FWPathProvider
b40751980c mac_oldworld: use node name instead of alias name for hd device in FWPathProvider
09a2890670 target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l, h}() and set_cpu_vsr{l, h}()
6502f1d34c target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order
c8ccee4ae4 target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64()
009069ca82 target/ppc: introduce avr_full_offset() function
42276547b8 target/ppc: move Vsr* macros from internal.h to cpu.h
9b303bf2fe target/ppc: introduce single vsrl_offset() function
7d115a7cca target/ppc: introduce single fpr_offset() function
bc857d3423 spapr_iommu: Do not replay mappings from just created DMA window
318207457b ppc/pnv: psi: add a reset handler
d8c41355f7 ppc/pnv: psi: add a PSIHB_REG macro
0afa36e08f ppc/pnv: fix logging primitives using Ox
71115811ab ppc/xive: activate HV support
6a4dfae59e ppc/pnv: introduce a new pic_print_info() operation to the chip model
d775142ddd ppc/pnv: introduce a new dt_populate() operation to the chip model
087e79ef3a ppc/pnv: add a XIVE interrupt controller model for POWER9
560306e92f ppc/pnv: change the CPU machine_data presenter type to Object *
61f1c7c909 ppc/pnv: export the xive_router_notify() routine
7de67358c5 ppc/xive: export the TIMA memory accessors
bb2f939bf2 ppc: externalize ppc_get_vcpu_by_pir()
371cc21427 ppc/xive: hardwire the Physical CAM line of the thread context
2bd3f311b6 PPC: E500: Add FSL I2C controller and integrate RTC with it
cd8d1d103b target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling
331fb825f9 spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit)
4d0a5b8bac target/ppc/spapr: Clear partition table entry when allocating hash table
459399789c PPC: E500: Update u-boot to v2019.01
d95c3a89e7 target/ppc: Refactor kvm_handle_debug
4e0adda559 target/ppc: Move handling of hardware breakpoints to a separate function
f914b4a55d target/ppc: Move exception vector offset computation into a function
dec20748cf target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type
2a2020fd52 target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg
abe6251060 target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST
efcc41a1f0 target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS
d27181434a target/ppc/spapr: Enable the large decrementer for pseries-4.0
e3509a4217 target/ppc: Implement large decrementer support for KVM
85592739a6 target/ppc: Implement large decrementer support for TCG
ed7935af70 target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER
9bcb00db74 Revert "spapr: support memory unplug for qtest"
16684c3584 spapr: Simulate CAS for qtest
31faed9bf2 vfio/spapr: Rename local systempagesize variable
29eef1ef4b vfio/spapr: Fix indirect levels calculation

=== OUTPUT BEGIN ===
1/60 Checking commit 29eef1ef4b33 (vfio/spapr: Fix indirect levels calculation)
2/60 Checking commit 31faed9bf208 (vfio/spapr: Rename local systempagesize variable)
3/60 Checking commit 16684c358405 (spapr: Simulate CAS for qtest)
4/60 Checking commit 9bcb00db7471 (Revert "spapr: support memory unplug for qtest")
5/60 Checking commit ed7935af70ab (target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER)
WARNING: line over 80 characters
#47: FILE: hw/ppc/spapr_caps.c:397:
+        error_setg(errp, "No large decrementer support, try cap-large-decr=off");

total: 0 errors, 1 warnings, 67 lines checked

Patch 5/60 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
6/60 Checking commit 85592739a601 (target/ppc: Implement large decrementer support for TCG)
ERROR: space prohibited between function name and open parenthesis '('
#65: FILE: hw/ppc/ppc.c:765:
+target_ulong cpu_ppc_load_decr (CPUPPCState *env)

ERROR: braces {} are necessary for all arms of this statement
#81: FILE: hw/ppc/ppc.c:780:
+    if (env->spr[SPR_LPCR] & LPCR_LD)
[...]

ERROR: space prohibited between function name and open parenthesis '('
#87: FILE: hw/ppc/ppc.c:785:
+target_ulong cpu_ppc_load_hdecr (CPUPPCState *env)

ERROR: braces {} are necessary for all arms of this statement
#101: FILE: hw/ppc/ppc.c:798:
+    if (pcc->lrg_decr_bits > 32)
[...]

ERROR: braces {} are necessary for all arms of this statement
#124: FILE: hw/ppc/ppc.c:865:
+    if (negative)
[...]

ERROR: space prohibited between function name and open parenthesis '('
#169: FILE: hw/ppc/ppc.c:921:
+void cpu_ppc_store_decr (CPUPPCState *env, target_ulong value)

ERROR: braces {} are necessary for all arms of this statement
#174: FILE: hw/ppc/ppc.c:926:
+    if (env->spr[SPR_LPCR] & LPCR_LD)
[...]

ERROR: space prohibited between function name and open parenthesis '('
#202: FILE: hw/ppc/ppc.c:951:
+void cpu_ppc_store_hdecr (CPUPPCState *env, target_ulong value)

ERROR: braces {} are necessary for all arms of this statement
#254: FILE: hw/ppc/spapr_caps.c:398:
+    if (!val)
[...]

ERROR: braces {} are necessary for all arms of this statement
#276: FILE: hw/ppc/spapr_caps.c:420:
+    if (val)
[...]
+    else
[...]

ERROR: space prohibited between function name and open parenthesis '('
#316: FILE: target/ppc/cpu.h:1324:
+target_ulong cpu_ppc_load_decr (CPUPPCState *env);

ERROR: space prohibited between function name and open parenthesis '('
#317: FILE: target/ppc/cpu.h:1325:
+void cpu_ppc_store_decr (CPUPPCState *env, target_ulong value);

ERROR: space prohibited between function name and open parenthesis '('
#318: FILE: target/ppc/cpu.h:1326:
+target_ulong cpu_ppc_load_hdecr (CPUPPCState *env);

ERROR: space prohibited between function name and open parenthesis '('
#319: FILE: target/ppc/cpu.h:1327:
+void cpu_ppc_store_hdecr (CPUPPCState *env, target_ulong value);

total: 14 errors, 0 warnings, 299 lines checked

Patch 6/60 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

7/60 Checking commit e3509a42179c (target/ppc: Implement large decrementer support for KVM)
WARNING: line over 80 characters
#46: FILE: hw/ppc/spapr_caps.c:413:
+            error_setg(errp, "No large decrementer support, try cap-large-decr=off");

ERROR: braces {} are necessary for all arms of this statement
#60: FILE: hw/ppc/spapr_caps.c:430:
+        if (kvmppc_enable_cap_large_decr(cpu, val))
[...]

WARNING: line over 80 characters
#61: FILE: hw/ppc/spapr_caps.c:431:
+            error_setg(errp, "No large decrementer support, try cap-large-decr=off");

ERROR: braces {} are necessary for all arms of this statement
#103: FILE: target/ppc/kvm.c:1937:
+    if (nr_bits > 0)
[...]

ERROR: braces {} are necessary for all arms of this statement
#128: FILE: target/ppc/kvm.c:2470:
+        if (enable)
[...]
+        else
[...]

ERROR: braces {} are necessary for all arms of this statement
#135: FILE: target/ppc/kvm.c:2477:
+        if (!!(lpcr & LPCR_LD) != !!enable)
[...]

total: 4 errors, 2 warnings, 129 lines checked

Patch 7/60 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

8/60 Checking commit d27181434a16 (target/ppc/spapr: Enable the large decrementer for pseries-4.0)
9/60 Checking commit efcc41a1f035 (target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS)
10/60 Checking commit abe6251060f1 (target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST)
WARNING: line over 80 characters
#105: FILE: hw/ppc/spapr_hcall.c:1696:
+    uint8_t count_cache_flush_assist = spapr_get_cap(spapr, SPAPR_CAP_CCF_ASSIST);

ERROR: braces {} are necessary for all arms of this statement
#113: FILE: hw/ppc/spapr_hcall.c:1737:
+        if (count_cache_flush_assist)
[...]

ERROR: braces {} are necessary for all arms of this statement
#160: FILE: target/ppc/kvm.c:2412:
+    if (c.character & c.character_mask & H_CPU_CHAR_BCCTR_FLUSH_ASSIST)
[...]

WARNING: line over 80 characters
#172: FILE: target/ppc/kvm.c:2439:
+    cap_ppc_count_cache_flush_assist = parse_cap_ppc_count_cache_flush_assist(c);

total: 2 errors, 2 warnings, 146 lines checked

Patch 10/60 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

11/60 Checking commit 2a2020fd5275 (target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg)
ERROR: braces {} are necessary for all arms of this statement
#98: FILE: hw/ppc/spapr_caps.c:315:
+    if (local_err != NULL)
[...]

total: 1 errors, 0 warnings, 75 lines checked

Patch 11/60 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

12/60 Checking commit dec20748cfa8 (target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type)
13/60 Checking commit f914b4a55d6e (target/ppc: Move exception vector offset computation into a function)
14/60 Checking commit 4e0adda559b7 (target/ppc: Move handling of hardware breakpoints to a separate function)
15/60 Checking commit d95c3a89e706 (target/ppc: Refactor kvm_handle_debug)
16/60 Checking commit 459399789c9e (PPC: E500: Update u-boot to v2019.01)
17/60 Checking commit 4d0a5b8bacd4 (target/ppc/spapr: Clear partition table entry when allocating hash table)
18/60 Checking commit 331fb825f9cb (spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit))
19/60 Checking commit cd8d1d103b55 (target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling)
20/60 Checking commit 2bd3f311b63d (PPC: E500: Add FSL I2C controller and integrate RTC with it)
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#64: 
new file mode 100644

total: 0 errors, 1 warnings, 469 lines checked

Patch 20/60 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
21/60 Checking commit 371cc2142706 (ppc/xive: hardwire the Physical CAM line of the thread context)
22/60 Checking commit bb2f939bf2dc (ppc: externalize ppc_get_vcpu_by_pir())
23/60 Checking commit 7de67358c5b2 (ppc/xive: export the TIMA memory accessors)
24/60 Checking commit 61f1c7c9093c (ppc/pnv: export the xive_router_notify() routine)
25/60 Checking commit 560306e92fdd (ppc/pnv: change the CPU machine_data presenter type to Object *)
26/60 Checking commit 087e79ef3a01 (ppc/pnv: add a XIVE interrupt controller model for POWER9)
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#62: 
new file mode 100644

total: 0 errors, 1 warnings, 2215 lines checked

Patch 26/60 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
27/60 Checking commit d775142ddd2f (ppc/pnv: introduce a new dt_populate() operation to the chip model)
28/60 Checking commit 6a4dfae59e4e (ppc/pnv: introduce a new pic_print_info() operation to the chip model)
29/60 Checking commit 71115811ab4b (ppc/xive: activate HV support)
30/60 Checking commit 0afa36e08fc0 (ppc/pnv: fix logging primitives using Ox)
31/60 Checking commit d8c41355f7d6 (ppc/pnv: psi: add a PSIHB_REG macro)
32/60 Checking commit 318207457bf4 (ppc/pnv: psi: add a reset handler)
33/60 Checking commit bc857d342374 (spapr_iommu: Do not replay mappings from just created DMA window)
34/60 Checking commit 7d115a7cca15 (target/ppc: introduce single fpr_offset() function)
35/60 Checking commit 9b303bf2fee1 (target/ppc: introduce single vsrl_offset() function)
36/60 Checking commit 42276547b8da (target/ppc: move Vsr* macros from internal.h to cpu.h)
37/60 Checking commit 009069ca82e9 (target/ppc: introduce avr_full_offset() function)
38/60 Checking commit c8ccee4ae4af (target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64())
39/60 Checking commit 6502f1d34c0d (target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order)
40/60 Checking commit 09a28906704f (target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l, h}() and set_cpu_vsr{l, h}())
41/60 Checking commit b40751980c2a (mac_oldworld: use node name instead of alias name for hd device in FWPathProvider)
42/60 Checking commit dc90b5316341 (mac_newworld: use node name instead of alias name for hd device in FWPathProvider)
43/60 Checking commit 0f805a733782 (ppc/pnv: add a PSI bridge class model)
44/60 Checking commit b3753bf4d584 (ppc/pnv: add a PSI bridge model for POWER9)
45/60 Checking commit b56561856691 (ppc/pnv: lpc: fix OPB address ranges)
46/60 Checking commit 8a24b7e984cc (ppc/pnv: add a LPC Controller class model)
47/60 Checking commit c8a35377919a (ppc/pnv: add a 'dt_isa_nodename' to the chip)
48/60 Checking commit cad3544b002f (ppc/pnv: add a LPC Controller model for POWER9)
49/60 Checking commit 003255291514 (ppc/pnv: add SerIRQ routing registers)
50/60 Checking commit 177a01f268e2 (ppc/pnv: add a OCC model class)
51/60 Checking commit a16eb6280ab9 (ppc/pnv: add a OCC model for POWER9)
52/60 Checking commit bf6b37e0e3ac (ppc/pnv: extend XSCOM core support for POWER9)
53/60 Checking commit 40a779400ee9 (ppc/pnv: POWER9 XSCOM quad support)
54/60 Checking commit 2aaa98b799e6 (ppc/pnv: activate XSCOM tests for POWER9)
55/60 Checking commit e39b190d6527 (ppc/pnv: add more dummy XSCOM addresses)
56/60 Checking commit c85ade25f000 (ppc/pnv: add a "ibm, opal/power-mgt" device tree node on POWER9)
57/60 Checking commit 82f058a7749c (target/ppc: add HV support for POWER9)
58/60 Checking commit 1a63e5d48857 (target/ppc: Optimize xviexpdp() using deposit_i64())
59/60 Checking commit 9b2d3e81dfc8 (target/ppc: Optimize x[sv]xsigdp using deposit_i64())
60/60 Checking commit a13e9857de40 (spapr: Use CamelCase properly)
WARNING: Block comments use a leading /* on a separate line
#1577: FILE: hw/ppc/spapr.c:1945:
+    /* Prior to the introduction of SpaprOptionVector, we had two option

total: 0 errors, 1 warnings, 6909 lines checked

Patch 60/60 has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.
=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/20190310082703.1245-1-david@gibson.dropbear.id.au/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310
  2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
                   ` (60 preceding siblings ...)
  2019-03-10  9:23 ` [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 no-reply
@ 2019-03-10 16:06 ` Peter Maydell
  2019-03-11 10:40   ` Alex Bennée
  2019-03-12  0:44   ` David Gibson
  61 siblings, 2 replies; 74+ messages in thread
From: Peter Maydell @ 2019-03-10 16:06 UTC (permalink / raw)
  To: David Gibson; +Cc: Greg Kurz, qemu-ppc, QEMU Developers, Laurent Vivier

On Sun, 10 Mar 2019 at 08:27, David Gibson <david@gibson.dropbear.id.au> wrote:
>
> The following changes since commit f5b4c31030f45293bb4517445722768434829d91:
>
>   Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2019-03-09 17:35:48 +0000)
>
> are available in the Git repository at:
>
>   git://github.com/dgibson/qemu.git tags/ppc-for-4.0-20190310
>
> for you to fetch changes up to 08d020471fcd41cb020fc9987ed1945eefcc8805:
>
>   spapr: Use CamelCase properly (2019-03-10 14:35:44 +1100)
>
> ----------------------------------------------------------------
> ppc patch queue for 2019-03-10
>
> Here's a final pull request before the 4.0 soft freeze.  Changes
> include:
>   * A Great Renaming to use camel case properly in spapr code
>   * Optimization of some vector instructions
>   * Support for POWER9 cpus in the powernv machine
>   * Fixes a regression from the last pull request in handling VSX
>     instructions with mixed operands from the FPR and VMX parts of the
>     register array
>   * Optimization hack to avoid scanning all the (empty) entries on a
>     new IOMMU window
>   * Add FSL I2C controller model for E500
>   * Support for KVM acceleration of the H_PAGE_INIT hypercall on spapr
>   * Update u-boot image for E500
>   * Enable Specre/Meltdown mitigations by default on the new machine type
>   * Enable large decrementer support for POWER9
>
> Plus a number of assorted bugfixes and cleanups.
>

Hi. This pullreq generates a pile of new 'warning' messages
during 'make check':

MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))}
QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64
QTEST_QEMU_IMG=qemu-img tests/
boot-serial-test -m=quick -k --tap < /dev/null |
./scripts/tap-driver.pl --test-name="boot-serial-test"
PASS 1 boot-serial-test /ppc64/boot-serial/ppce500
PASS 2 boot-serial-test /ppc64/boot-serial/40p
PASS 3 boot-serial-test /ppc64/boot-serial/mac99
qemu-system-ppc64: warning: TCG doesn't support requested feature,
cap-cfpc=workaround
qemu-system-ppc64: warning: TCG doesn't support requested feature,
cap-sbbc=workaround
qemu-system-ppc64: warning: TCG doesn't support requested feature,
cap-ibs=workaround
PASS 4 boot-serial-test /ppc64/boot-serial/pseries
PASS 5 boot-serial-test /ppc64/boot-serial/powernv
PASS 6 boot-serial-test /ppc64/boot-serial/sam460ex

and similarly during the boot-pxe-test.

Could you silence these, please?

thanks
-- PMM

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310
  2019-03-10 16:06 ` Peter Maydell
@ 2019-03-11 10:40   ` Alex Bennée
  2019-03-12  0:26     ` David Gibson
  2019-03-12  0:44   ` David Gibson
  1 sibling, 1 reply; 74+ messages in thread
From: Alex Bennée @ 2019-03-11 10:40 UTC (permalink / raw)
  To: qemu-devel; +Cc: David Gibson, Laurent Vivier, qemu-ppc, Greg Kurz


Peter Maydell <peter.maydell@linaro.org> writes:

> On Sun, 10 Mar 2019 at 08:27, David Gibson <david@gibson.dropbear.id.au> wrote:
>>
>> The following changes since commit f5b4c31030f45293bb4517445722768434829d91:
>>
>>   Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2019-03-09 17:35:48 +0000)
>>
>> are available in the Git repository at:
>>
>>   git://github.com/dgibson/qemu.git tags/ppc-for-4.0-20190310
>>
>> for you to fetch changes up to 08d020471fcd41cb020fc9987ed1945eefcc8805:
>>
>>   spapr: Use CamelCase properly (2019-03-10 14:35:44 +1100)
>>
>> ----------------------------------------------------------------
>> ppc patch queue for 2019-03-10
>>
>> Here's a final pull request before the 4.0 soft freeze.  Changes
>> include:
>>   * A Great Renaming to use camel case properly in spapr code
>>   * Optimization of some vector instructions
>>   * Support for POWER9 cpus in the powernv machine
>>   * Fixes a regression from the last pull request in handling VSX
>>     instructions with mixed operands from the FPR and VMX parts of the
>>     register array
>>   * Optimization hack to avoid scanning all the (empty) entries on a
>>     new IOMMU window
>>   * Add FSL I2C controller model for E500
>>   * Support for KVM acceleration of the H_PAGE_INIT hypercall on spapr
>>   * Update u-boot image for E500
>>   * Enable Specre/Meltdown mitigations by default on the new machine type
>>   * Enable large decrementer support for POWER9
>>
>> Plus a number of assorted bugfixes and cleanups.
>>
>
> Hi. This pullreq generates a pile of new 'warning' messages
> during 'make check':
>
> MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))}
> QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64
> QTEST_QEMU_IMG=qemu-img tests/
> boot-serial-test -m=quick -k --tap < /dev/null |
> ./scripts/tap-driver.pl --test-name="boot-serial-test"
> PASS 1 boot-serial-test /ppc64/boot-serial/ppce500
> PASS 2 boot-serial-test /ppc64/boot-serial/40p
> PASS 3 boot-serial-test /ppc64/boot-serial/mac99
> qemu-system-ppc64: warning: TCG doesn't support requested feature,
> cap-cfpc=workaround
> qemu-system-ppc64: warning: TCG doesn't support requested feature,
> cap-sbbc=workaround
> qemu-system-ppc64: warning: TCG doesn't support requested feature,
> cap-ibs=workaround
> PASS 4 boot-serial-test /ppc64/boot-serial/pseries
> PASS 5 boot-serial-test /ppc64/boot-serial/powernv
> PASS 6 boot-serial-test /ppc64/boot-serial/sam460ex
>
> and similarly during the boot-pxe-test.
>
> Could you silence these, please?

FWIW this PR contains fixes that will finally get the gitlab CI green so
I look forward to v2 getting merged ;-)

--
Alex Bennée

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 04/60] Revert "spapr: support memory unplug for qtest"
  2019-03-10  8:26 ` [Qemu-devel] [PULL 04/60] Revert "spapr: support memory unplug for qtest" David Gibson
@ 2019-03-11 10:52   ` Greg Kurz
  2019-03-12  1:08     ` David Gibson
  0 siblings, 1 reply; 74+ messages in thread
From: Greg Kurz @ 2019-03-11 10:52 UTC (permalink / raw)
  To: David Gibson
  Cc: peter.maydell, qemu-ppc, qemu-devel, lvivier, Thomas Huth, Michael Roth

On Sun, 10 Mar 2019 19:26:07 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> From: Greg Kurz <groug@kaod.org>
> 
> Commit b8165118f52c broke CPU hotplug tests for old machine types:
> 
> $ QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64 ./tests/cpu-plug-test -m=slow
> /ppc64/cpu-plug/pseries-3.1/device-add/2x3x1&maxcpus=6: OK
> /ppc64/cpu-plug/pseries-2.12-sxxm/device-add/2x3x1&maxcpus=6: OK
> /ppc64/cpu-plug/pseries-3.0/device-add/2x3x1&maxcpus=6: OK
> /ppc64/cpu-plug/pseries-2.10/device-add/2x3x1&maxcpus=6: OK
> /ppc64/cpu-plug/pseries-2.11/device-add/2x3x1&maxcpus=6: OK
> /ppc64/cpu-plug/pseries-2.12/device-add/2x3x1&maxcpus=6: OK
> /ppc64/cpu-plug/pseries-2.9/device-add/2x3x1&maxcpus=6: OK
> /ppc64/cpu-plug/pseries-2.7/device-add/2x3x1&maxcpus=6: **
> ERROR:/home/thuth/devel/qemu/hw/ppc/spapr_events.c:313:rtas_event_log_to_source: assertion failed: (source->enabled)
> Broken pipe
> /home/thuth/devel/qemu/tests/libqtest.c:143: kill_qemu() detected QEMU death from signal 6 (Aborted) (core dumped)
> Aborted (core dumped)
> 
> The approach of faking the availability of OV5_HP_EVT causes the
> code to assume the hotplug event source is enabled, which is wrong
> for older machines.
> 
> This reverts commit b8165118f52ce5ee88565d3cec83d30374efdc96.
> 
> A subsequent patch will address the problem of CAS under qtest from
> a different angle.
> 

Since the patches got re-ordered, this sentence is wrong. In case
you re-send this pull request, maybe you can update the changelog
accordingly ?

> Reported-by: Thomas Huth <thuth@redhat.com>
> Signed-off-by: Greg Kurz <groug@kaod.org>
> Message-Id: <155146875097.147873.1732264036668112686.stgit@bahia.lan>
> Tested-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>  hw/ppc/spapr_ovec.c | 6 ------
>  1 file changed, 6 deletions(-)
> 
> diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
> index 12510b236a..318bf33de4 100644
> --- a/hw/ppc/spapr_ovec.c
> +++ b/hw/ppc/spapr_ovec.c
> @@ -16,7 +16,6 @@
>  #include "qemu/bitmap.h"
>  #include "exec/address-spaces.h"
>  #include "qemu/error-report.h"
> -#include "sysemu/qtest.h"
>  #include "trace.h"
>  #include <libfdt.h>
>  
> @@ -132,11 +131,6 @@ bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr)
>      g_assert(ov);
>      g_assert(bitnr < OV_MAXBITS);
>  
> -    /* support memory unplug for qtest */
> -    if (qtest_enabled() && bitnr == OV5_HP_EVT) {
> -        return true;
> -    }
> -
>      return test_bit(bitnr, ov->bitmap) ? true : false;
>  }
>  

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310
  2019-03-11 10:40   ` Alex Bennée
@ 2019-03-12  0:26     ` David Gibson
  0 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-12  0:26 UTC (permalink / raw)
  To: Alex Bennée; +Cc: qemu-devel, Laurent Vivier, qemu-ppc, Greg Kurz

[-- Attachment #1: Type: text/plain, Size: 3310 bytes --]

On Mon, Mar 11, 2019 at 10:40:54AM +0000, Alex Bennée wrote:
> 
> Peter Maydell <peter.maydell@linaro.org> writes:
> 
> > On Sun, 10 Mar 2019 at 08:27, David Gibson <david@gibson.dropbear.id.au> wrote:
> >>
> >> The following changes since commit f5b4c31030f45293bb4517445722768434829d91:
> >>
> >>   Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2019-03-09 17:35:48 +0000)
> >>
> >> are available in the Git repository at:
> >>
> >>   git://github.com/dgibson/qemu.git tags/ppc-for-4.0-20190310
> >>
> >> for you to fetch changes up to 08d020471fcd41cb020fc9987ed1945eefcc8805:
> >>
> >>   spapr: Use CamelCase properly (2019-03-10 14:35:44 +1100)
> >>
> >> ----------------------------------------------------------------
> >> ppc patch queue for 2019-03-10
> >>
> >> Here's a final pull request before the 4.0 soft freeze.  Changes
> >> include:
> >>   * A Great Renaming to use camel case properly in spapr code
> >>   * Optimization of some vector instructions
> >>   * Support for POWER9 cpus in the powernv machine
> >>   * Fixes a regression from the last pull request in handling VSX
> >>     instructions with mixed operands from the FPR and VMX parts of the
> >>     register array
> >>   * Optimization hack to avoid scanning all the (empty) entries on a
> >>     new IOMMU window
> >>   * Add FSL I2C controller model for E500
> >>   * Support for KVM acceleration of the H_PAGE_INIT hypercall on spapr
> >>   * Update u-boot image for E500
> >>   * Enable Specre/Meltdown mitigations by default on the new machine type
> >>   * Enable large decrementer support for POWER9
> >>
> >> Plus a number of assorted bugfixes and cleanups.
> >>
> >
> > Hi. This pullreq generates a pile of new 'warning' messages
> > during 'make check':
> >
> > MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))}
> > QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64
> > QTEST_QEMU_IMG=qemu-img tests/
> > boot-serial-test -m=quick -k --tap < /dev/null |
> > ./scripts/tap-driver.pl --test-name="boot-serial-test"
> > PASS 1 boot-serial-test /ppc64/boot-serial/ppce500
> > PASS 2 boot-serial-test /ppc64/boot-serial/40p
> > PASS 3 boot-serial-test /ppc64/boot-serial/mac99
> > qemu-system-ppc64: warning: TCG doesn't support requested feature,
> > cap-cfpc=workaround
> > qemu-system-ppc64: warning: TCG doesn't support requested feature,
> > cap-sbbc=workaround
> > qemu-system-ppc64: warning: TCG doesn't support requested feature,
> > cap-ibs=workaround
> > PASS 4 boot-serial-test /ppc64/boot-serial/pseries
> > PASS 5 boot-serial-test /ppc64/boot-serial/powernv
> > PASS 6 boot-serial-test /ppc64/boot-serial/sam460ex
> >
> > and similarly during the boot-pxe-test.
> >
> > Could you silence these, please?
> 
> FWIW this PR contains fixes that will finally get the gitlab CI green so
> I look forward to v2 getting merged ;-)

Huh.  I knew about the travis CI and the shippable CI, but not the
gitlab one.  How do I see that?  It was surprisingly non-obvious from
the gitlab qemu project page.

-- 
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 #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310
  2019-03-10 16:06 ` Peter Maydell
  2019-03-11 10:40   ` Alex Bennée
@ 2019-03-12  0:44   ` David Gibson
  1 sibling, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-12  0:44 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Greg Kurz, qemu-ppc, QEMU Developers, Laurent Vivier

[-- Attachment #1: Type: text/plain, Size: 3137 bytes --]

On Sun, Mar 10, 2019 at 04:06:38PM +0000, Peter Maydell wrote:
> On Sun, 10 Mar 2019 at 08:27, David Gibson <david@gibson.dropbear.id.au> wrote:
> >
> > The following changes since commit f5b4c31030f45293bb4517445722768434829d91:
> >
> >   Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging (2019-03-09 17:35:48 +0000)
> >
> > are available in the Git repository at:
> >
> >   git://github.com/dgibson/qemu.git tags/ppc-for-4.0-20190310
> >
> > for you to fetch changes up to 08d020471fcd41cb020fc9987ed1945eefcc8805:
> >
> >   spapr: Use CamelCase properly (2019-03-10 14:35:44 +1100)
> >
> > ----------------------------------------------------------------
> > ppc patch queue for 2019-03-10
> >
> > Here's a final pull request before the 4.0 soft freeze.  Changes
> > include:
> >   * A Great Renaming to use camel case properly in spapr code
> >   * Optimization of some vector instructions
> >   * Support for POWER9 cpus in the powernv machine
> >   * Fixes a regression from the last pull request in handling VSX
> >     instructions with mixed operands from the FPR and VMX parts of the
> >     register array
> >   * Optimization hack to avoid scanning all the (empty) entries on a
> >     new IOMMU window
> >   * Add FSL I2C controller model for E500
> >   * Support for KVM acceleration of the H_PAGE_INIT hypercall on spapr
> >   * Update u-boot image for E500
> >   * Enable Specre/Meltdown mitigations by default on the new machine type
> >   * Enable large decrementer support for POWER9
> >
> > Plus a number of assorted bugfixes and cleanups.
> >
> 
> Hi. This pullreq generates a pile of new 'warning' messages
> during 'make check':
> 
> MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(( ${RANDOM:-0} % 255 + 1))}
> QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64
> QTEST_QEMU_IMG=qemu-img tests/
> boot-serial-test -m=quick -k --tap < /dev/null |
> ./scripts/tap-driver.pl --test-name="boot-serial-test"
> PASS 1 boot-serial-test /ppc64/boot-serial/ppce500
> PASS 2 boot-serial-test /ppc64/boot-serial/40p
> PASS 3 boot-serial-test /ppc64/boot-serial/mac99
> qemu-system-ppc64: warning: TCG doesn't support requested feature,
> cap-cfpc=workaround
> qemu-system-ppc64: warning: TCG doesn't support requested feature,
> cap-sbbc=workaround
> qemu-system-ppc64: warning: TCG doesn't support requested feature,
> cap-ibs=workaround
> PASS 4 boot-serial-test /ppc64/boot-serial/pseries
> PASS 5 boot-serial-test /ppc64/boot-serial/powernv
> PASS 6 boot-serial-test /ppc64/boot-serial/sam460ex
> 
> and similarly during the boot-pxe-test.
> 
> Could you silence these, please?

Ok, done.  As a rule these warnings are there intentionally for TCG -
we want to enable Spectre/Meltdown mitigations by default, but no-one
really knows if and how to implement them for TCG.

But I can and have suppressed the warnings for the qtest case.

-- 
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 #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 04/60] Revert "spapr: support memory unplug for qtest"
  2019-03-11 10:52   ` Greg Kurz
@ 2019-03-12  1:08     ` David Gibson
  0 siblings, 0 replies; 74+ messages in thread
From: David Gibson @ 2019-03-12  1:08 UTC (permalink / raw)
  To: Greg Kurz
  Cc: peter.maydell, qemu-ppc, qemu-devel, lvivier, Thomas Huth, Michael Roth

[-- Attachment #1: Type: text/plain, Size: 3101 bytes --]

On Mon, Mar 11, 2019 at 11:52:28AM +0100, Greg Kurz wrote:
> On Sun, 10 Mar 2019 19:26:07 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > From: Greg Kurz <groug@kaod.org>
> > 
> > Commit b8165118f52c broke CPU hotplug tests for old machine types:
> > 
> > $ QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64 ./tests/cpu-plug-test -m=slow
> > /ppc64/cpu-plug/pseries-3.1/device-add/2x3x1&maxcpus=6: OK
> > /ppc64/cpu-plug/pseries-2.12-sxxm/device-add/2x3x1&maxcpus=6: OK
> > /ppc64/cpu-plug/pseries-3.0/device-add/2x3x1&maxcpus=6: OK
> > /ppc64/cpu-plug/pseries-2.10/device-add/2x3x1&maxcpus=6: OK
> > /ppc64/cpu-plug/pseries-2.11/device-add/2x3x1&maxcpus=6: OK
> > /ppc64/cpu-plug/pseries-2.12/device-add/2x3x1&maxcpus=6: OK
> > /ppc64/cpu-plug/pseries-2.9/device-add/2x3x1&maxcpus=6: OK
> > /ppc64/cpu-plug/pseries-2.7/device-add/2x3x1&maxcpus=6: **
> > ERROR:/home/thuth/devel/qemu/hw/ppc/spapr_events.c:313:rtas_event_log_to_source: assertion failed: (source->enabled)
> > Broken pipe
> > /home/thuth/devel/qemu/tests/libqtest.c:143: kill_qemu() detected QEMU death from signal 6 (Aborted) (core dumped)
> > Aborted (core dumped)
> > 
> > The approach of faking the availability of OV5_HP_EVT causes the
> > code to assume the hotplug event source is enabled, which is wrong
> > for older machines.
> > 
> > This reverts commit b8165118f52ce5ee88565d3cec83d30374efdc96.
> > 
> > A subsequent patch will address the problem of CAS under qtest from
> > a different angle.
> > 
> 
> Since the patches got re-ordered, this sentence is wrong. In case
> you re-send this pull request, maybe you can update the changelog
> accordingly ?

Done.

> 
> > Reported-by: Thomas Huth <thuth@redhat.com>
> > Signed-off-by: Greg Kurz <groug@kaod.org>
> > Message-Id: <155146875097.147873.1732264036668112686.stgit@bahia.lan>
> > Tested-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> > Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > ---
> >  hw/ppc/spapr_ovec.c | 6 ------
> >  1 file changed, 6 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c
> > index 12510b236a..318bf33de4 100644
> > --- a/hw/ppc/spapr_ovec.c
> > +++ b/hw/ppc/spapr_ovec.c
> > @@ -16,7 +16,6 @@
> >  #include "qemu/bitmap.h"
> >  #include "exec/address-spaces.h"
> >  #include "qemu/error-report.h"
> > -#include "sysemu/qtest.h"
> >  #include "trace.h"
> >  #include <libfdt.h>
> >  
> > @@ -132,11 +131,6 @@ bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr)
> >      g_assert(ov);
> >      g_assert(bitnr < OV_MAXBITS);
> >  
> > -    /* support memory unplug for qtest */
> > -    if (qtest_enabled() && bitnr == OV5_HP_EVT) {
> > -        return true;
> > -    }
> > -
> >      return test_bit(bitnr, ov->bitmap) ? true : false;
> >  }
> >  
> 

-- 
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 #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
       [not found]           ` <154364d7-fe5b-4f40-b976-b85ff9060ee0@kaod.org>
@ 2019-06-28 13:20             ` Philippe Mathieu-Daudé
  2019-07-01  5:04               ` David Gibson
  0 siblings, 1 reply; 74+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-06-28 13:20 UTC (permalink / raw)
  To: Cédric Le Goater, Cleber Rosa, lvivier
  Cc: peter maydell, David Gibson, qemu-ppc, qemu-devel, groug

Hi,

On 3/12/19 8:58 PM, Cédric Le Goater wrote:
> On 3/12/19 8:30 PM, Cleber Rosa wrote:
>>> From: "Cleber Rosa" <crosa@redhat.com>
>>> Sent: Tuesday, March 12, 2019 3:14:09 PM
>>> Subject: Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
>>>
>>> On Tue, Mar 12, 2019 at 07:34:04PM +0100, Cédric Le Goater wrote:
>>>> On 3/12/19 4:01 PM, Cleber Rosa wrote:
>>>>> On Sun, Mar 10, 2019 at 07:27:00PM +1100, David Gibson wrote:
>>>>>> From: Cédric Le Goater <clg@kaod.org>
>>>>>>
>>>>>> We now have enough support to boot a PowerNV machine with a POWER9
>>>>>> processor. Allow HV mode on POWER9.
>>>>>>
>>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>>>>> Message-Id: <20190307223548.20516-16-clg@kaod.org>
>>>>>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
>>>>>> ---
>>>>>>  target/ppc/translate_init.inc.c | 3 ++-
>>>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/target/ppc/translate_init.inc.c
>>>>>> b/target/ppc/translate_init.inc.c
>>>>>> index af70a3b78c..0bd555eb19 100644
>>>>>> --- a/target/ppc/translate_init.inc.c
>>>>>> +++ b/target/ppc/translate_init.inc.c
>>>>>> @@ -8895,7 +8895,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
>>>>>> *data)
>>>>>>                         PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
>>>>>>                         PPC_MEM_SYNC | PPC_MEM_EIEIO |
>>>>>>                         PPC_MEM_TLBSYNC |
>>>>>> -                       PPC_64B | PPC_64BX | PPC_ALTIVEC |
>>>>>> +                       PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
>>>>>>                         PPC_SEGMENT_64B | PPC_SLBI |
>>>>>>                         PPC_POPCNTB | PPC_POPCNTWD |
>>>>>>                         PPC_CILDST;
>>>>>> @@ -8907,6 +8907,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
>>>>>> *data)
>>>>>>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
>>>>>>                          PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
>>>>>>      pcc->msr_mask = (1ull << MSR_SF) |
>>>>>> +                    (1ull << MSR_SHV) |
>>>>>>                      (1ull << MSR_TM) |
>>>>>>                      (1ull << MSR_VR) |
>>>>>>                      (1ull << MSR_VSX) |
>>>>>> --
>>>>>> 2.20.1
>>>>>>
>>>>>>
>>>>>
>>>>> This change prevents a Fedora 29 kernel[1] from booting... is this
>>>>> intended or a known limitation of the Fedora 29 kernel?
>>>>
>>>> The default CPU is still power8_v2.0. This is curious.
>>>>
>>>
>>> Are you sure?  I'm getting:
>>>
>>>  $ git rev-parse HEAD
>>>  cfc3fef6b4e493bf1a7ee16790ad584e20dfbbd1
>>>  $ ./ppc64-softmmu/qemu-system-ppc64 -qmp unix:/tmp/qmp-sock,server
>>>  $ ./scripts/qmp/qom-get -s /tmp/qmp-sock /machine/unattached/device[0].type
>>>  power9_v2.0-spapr-cpu-core
> 
> That's a pseries machine, not a powernv machine. pseries should use P9
> processor by default but the patch above should not impact f29 on pseries. 
> If it does, then we have a bug. 
>  
>> Looks like the overall default is "power9_v2.0", and then on pseries-3.1 and
>> lower, it's "power8_v2.0", as per 34a6b015a98.
> 
> I was looking at pnv_machine_class_init() which sets the default CPU :
> 
>     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");

I found this thread while trying auto-bisection for LP#1834613:
https://bugs.launchpad.net/bugs/1834613

When trying the options suggested by Laurent here:
https://lists.gnu.org/archive/html/qemu-devel/2019-06/msg06209.html

this one hangs:

$ qemu-system-ppc64 \
 -kernel vmlinuz-vanilla \
 -nographic -append "console=hvc0" \
 -M cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken

but this one works:

$ qemu-system-ppc64 \
 -kernel vmlinuz-vanilla \
 -nographic -append "console=hvc0" \
 -M pseries-3.1

> 
> C.
> 
>>
>> - Cleber.
>>
>>> Thanks,
>>> - Cleber.
>>>
>>>>> FIY, by using a "power8" CPU the Fedora 29 kernel boots successfully.
>>>>> For a reproducer, please refer to [2].
>>>>
>>>>
>>>> Thanks,
>>>>
>>>> C.
>>>>
>>>>
>>>>> Thanks,
>>>>> - Cleber.
>>>>>
>>>>> [1] -
>>>>> https://download.fedoraproject.org/pub/fedora-secondary/releases/29/Everything/ppc64le/os/ppc/ppc64/vmlinuz
>>>>>
>>>>> [2] -
>>>>> https://github.com/clebergnu/qemu/blob/sent/target_arch_v4/tests/acceptance/boot_linux_console.py#L138
>>>>>
>>>>
>>>


^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
  2019-06-28 13:20             ` Philippe Mathieu-Daudé
@ 2019-07-01  5:04               ` David Gibson
  2019-07-01  9:45                 ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 74+ messages in thread
From: David Gibson @ 2019-07-01  5:04 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: lvivier, peter maydell, qemu-devel, groug, qemu-ppc,
	Cédric Le Goater, Cleber Rosa

[-- Attachment #1: Type: text/plain, Size: 4333 bytes --]

On Fri, Jun 28, 2019 at 03:20:32PM +0200, Philippe Mathieu-Daudé wrote:
> Hi,
> 
> On 3/12/19 8:58 PM, Cédric Le Goater wrote:
> > On 3/12/19 8:30 PM, Cleber Rosa wrote:
> >>> From: "Cleber Rosa" <crosa@redhat.com>
> >>> Sent: Tuesday, March 12, 2019 3:14:09 PM
> >>> Subject: Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
> >>>
> >>> On Tue, Mar 12, 2019 at 07:34:04PM +0100, Cédric Le Goater wrote:
> >>>> On 3/12/19 4:01 PM, Cleber Rosa wrote:
> >>>>> On Sun, Mar 10, 2019 at 07:27:00PM +1100, David Gibson wrote:
> >>>>>> From: Cédric Le Goater <clg@kaod.org>
> >>>>>>
> >>>>>> We now have enough support to boot a PowerNV machine with a POWER9
> >>>>>> processor. Allow HV mode on POWER9.
> >>>>>>
> >>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >>>>>> Message-Id: <20190307223548.20516-16-clg@kaod.org>
> >>>>>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> >>>>>> ---
> >>>>>>  target/ppc/translate_init.inc.c | 3 ++-
> >>>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>>>
> >>>>>> diff --git a/target/ppc/translate_init.inc.c
> >>>>>> b/target/ppc/translate_init.inc.c
> >>>>>> index af70a3b78c..0bd555eb19 100644
> >>>>>> --- a/target/ppc/translate_init.inc.c
> >>>>>> +++ b/target/ppc/translate_init.inc.c
> >>>>>> @@ -8895,7 +8895,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
> >>>>>> *data)
> >>>>>>                         PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
> >>>>>>                         PPC_MEM_SYNC | PPC_MEM_EIEIO |
> >>>>>>                         PPC_MEM_TLBSYNC |
> >>>>>> -                       PPC_64B | PPC_64BX | PPC_ALTIVEC |
> >>>>>> +                       PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
> >>>>>>                         PPC_SEGMENT_64B | PPC_SLBI |
> >>>>>>                         PPC_POPCNTB | PPC_POPCNTWD |
> >>>>>>                         PPC_CILDST;
> >>>>>> @@ -8907,6 +8907,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
> >>>>>> *data)
> >>>>>>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
> >>>>>>                          PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
> >>>>>>      pcc->msr_mask = (1ull << MSR_SF) |
> >>>>>> +                    (1ull << MSR_SHV) |
> >>>>>>                      (1ull << MSR_TM) |
> >>>>>>                      (1ull << MSR_VR) |
> >>>>>>                      (1ull << MSR_VSX) |
> >>>>>>
> >>>>>>
> >>>>>
> >>>>> This change prevents a Fedora 29 kernel[1] from booting... is this
> >>>>> intended or a known limitation of the Fedora 29 kernel?
> >>>>
> >>>> The default CPU is still power8_v2.0. This is curious.
> >>>>
> >>>
> >>> Are you sure?  I'm getting:
> >>>
> >>>  $ git rev-parse HEAD
> >>>  cfc3fef6b4e493bf1a7ee16790ad584e20dfbbd1
> >>>  $ ./ppc64-softmmu/qemu-system-ppc64 -qmp unix:/tmp/qmp-sock,server
> >>>  $ ./scripts/qmp/qom-get -s /tmp/qmp-sock /machine/unattached/device[0].type
> >>>  power9_v2.0-spapr-cpu-core
> > 
> > That's a pseries machine, not a powernv machine. pseries should use P9
> > processor by default but the patch above should not impact f29 on pseries. 
> > If it does, then we have a bug. 
> >  
> >> Looks like the overall default is "power9_v2.0", and then on pseries-3.1 and
> >> lower, it's "power8_v2.0", as per 34a6b015a98.
> > 
> > I was looking at pnv_machine_class_init() which sets the default CPU :
> > 
> >     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
> 
> I found this thread while trying auto-bisection for LP#1834613:
> https://bugs.launchpad.net/bugs/1834613
> 
> When trying the options suggested by Laurent here:
> https://lists.gnu.org/archive/html/qemu-devel/2019-06/msg06209.html
> 
> this one hangs:
> 
> $ qemu-system-ppc64 \
>  -kernel vmlinuz-vanilla \
>  -nographic -append "console=hvc0" \
>  -M cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken
> 
> but this one works:
> 
> $ qemu-system-ppc64 \
>  -kernel vmlinuz-vanilla \
>  -nographic -append "console=hvc0" \
>  -M pseries-3.1

Sorry, I missed most of this thread while on holidays.  What's the
actual bug here?

-- 
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 #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
  2019-07-01  5:04               ` David Gibson
@ 2019-07-01  9:45                 ` Philippe Mathieu-Daudé
  2019-07-02  0:14                   ` David Gibson
  0 siblings, 1 reply; 74+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-07-01  9:45 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, peter maydell, qemu-devel, groug, qemu-ppc,
	Cédric Le Goater, Cleber Rosa

On 7/1/19 7:04 AM, David Gibson wrote:
> On Fri, Jun 28, 2019 at 03:20:32PM +0200, Philippe Mathieu-Daudé wrote:
>> Hi,
>>
>> On 3/12/19 8:58 PM, Cédric Le Goater wrote:
>>> On 3/12/19 8:30 PM, Cleber Rosa wrote:
>>>>> From: "Cleber Rosa" <crosa@redhat.com>
>>>>> Sent: Tuesday, March 12, 2019 3:14:09 PM
>>>>> Subject: Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
>>>>>
>>>>> On Tue, Mar 12, 2019 at 07:34:04PM +0100, Cédric Le Goater wrote:
>>>>>> On 3/12/19 4:01 PM, Cleber Rosa wrote:
>>>>>>> On Sun, Mar 10, 2019 at 07:27:00PM +1100, David Gibson wrote:
>>>>>>>> From: Cédric Le Goater <clg@kaod.org>
>>>>>>>>
>>>>>>>> We now have enough support to boot a PowerNV machine with a POWER9
>>>>>>>> processor. Allow HV mode on POWER9.
>>>>>>>>
>>>>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>>>>>>> Message-Id: <20190307223548.20516-16-clg@kaod.org>
>>>>>>>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
>>>>>>>> ---
>>>>>>>>  target/ppc/translate_init.inc.c | 3 ++-
>>>>>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>>>
>>>>>>>> diff --git a/target/ppc/translate_init.inc.c
>>>>>>>> b/target/ppc/translate_init.inc.c
>>>>>>>> index af70a3b78c..0bd555eb19 100644
>>>>>>>> --- a/target/ppc/translate_init.inc.c
>>>>>>>> +++ b/target/ppc/translate_init.inc.c
>>>>>>>> @@ -8895,7 +8895,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
>>>>>>>> *data)
>>>>>>>>                         PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
>>>>>>>>                         PPC_MEM_SYNC | PPC_MEM_EIEIO |
>>>>>>>>                         PPC_MEM_TLBSYNC |
>>>>>>>> -                       PPC_64B | PPC_64BX | PPC_ALTIVEC |
>>>>>>>> +                       PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
>>>>>>>>                         PPC_SEGMENT_64B | PPC_SLBI |
>>>>>>>>                         PPC_POPCNTB | PPC_POPCNTWD |
>>>>>>>>                         PPC_CILDST;
>>>>>>>> @@ -8907,6 +8907,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
>>>>>>>> *data)
>>>>>>>>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
>>>>>>>>                          PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
>>>>>>>>      pcc->msr_mask = (1ull << MSR_SF) |
>>>>>>>> +                    (1ull << MSR_SHV) |
>>>>>>>>                      (1ull << MSR_TM) |
>>>>>>>>                      (1ull << MSR_VR) |
>>>>>>>>                      (1ull << MSR_VSX) |
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> This change prevents a Fedora 29 kernel[1] from booting... is this
>>>>>>> intended or a known limitation of the Fedora 29 kernel?
>>>>>>
>>>>>> The default CPU is still power8_v2.0. This is curious.
>>>>>>
>>>>>
>>>>> Are you sure?  I'm getting:
>>>>>
>>>>>  $ git rev-parse HEAD
>>>>>  cfc3fef6b4e493bf1a7ee16790ad584e20dfbbd1
>>>>>  $ ./ppc64-softmmu/qemu-system-ppc64 -qmp unix:/tmp/qmp-sock,server
>>>>>  $ ./scripts/qmp/qom-get -s /tmp/qmp-sock /machine/unattached/device[0].type
>>>>>  power9_v2.0-spapr-cpu-core
>>>
>>> That's a pseries machine, not a powernv machine. pseries should use P9
>>> processor by default but the patch above should not impact f29 on pseries. 
>>> If it does, then we have a bug. 
>>>  
>>>> Looks like the overall default is "power9_v2.0", and then on pseries-3.1 and
>>>> lower, it's "power8_v2.0", as per 34a6b015a98.
>>>
>>> I was looking at pnv_machine_class_init() which sets the default CPU :
>>>
>>>     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
>>
>> I found this thread while trying auto-bisection for LP#1834613:
>> https://bugs.launchpad.net/bugs/1834613
>>
>> When trying the options suggested by Laurent here:
>> https://lists.gnu.org/archive/html/qemu-devel/2019-06/msg06209.html
>>
>> this one hangs:
>>
>> $ qemu-system-ppc64 \
>>  -kernel vmlinuz-vanilla \
>>  -nographic -append "console=hvc0" \
>>  -M cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken
>>
>> but this one works:
>>
>> $ qemu-system-ppc64 \
>>  -kernel vmlinuz-vanilla \
>>  -nographic -append "console=hvc0" \
>>  -M pseries-3.1
> 
> Sorry, I missed most of this thread while on holidays.  What's the
> actual bug here?

I don't think there is a bug, this seems the result of adding a new feature.
The commit message is not obvious that old kernels won't work on the
default machine type, and we have to add the extra '-M pseries-3.1'
command line option to run such images.


^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
  2019-07-01  9:45                 ` Philippe Mathieu-Daudé
@ 2019-07-02  0:14                   ` David Gibson
  2019-07-02  6:13                     ` Cédric Le Goater
  0 siblings, 1 reply; 74+ messages in thread
From: David Gibson @ 2019-07-02  0:14 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: lvivier, peter maydell, qemu-devel, groug, qemu-ppc,
	Cédric Le Goater, Cleber Rosa

[-- Attachment #1: Type: text/plain, Size: 5090 bytes --]

On Mon, Jul 01, 2019 at 11:45:23AM +0200, Philippe Mathieu-Daudé wrote:
> On 7/1/19 7:04 AM, David Gibson wrote:
> > On Fri, Jun 28, 2019 at 03:20:32PM +0200, Philippe Mathieu-Daudé wrote:
> >> Hi,
> >>
> >> On 3/12/19 8:58 PM, Cédric Le Goater wrote:
> >>> On 3/12/19 8:30 PM, Cleber Rosa wrote:
> >>>>> From: "Cleber Rosa" <crosa@redhat.com>
> >>>>> Sent: Tuesday, March 12, 2019 3:14:09 PM
> >>>>> Subject: Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
> >>>>>
> >>>>> On Tue, Mar 12, 2019 at 07:34:04PM +0100, Cédric Le Goater wrote:
> >>>>>> On 3/12/19 4:01 PM, Cleber Rosa wrote:
> >>>>>>> On Sun, Mar 10, 2019 at 07:27:00PM +1100, David Gibson wrote:
> >>>>>>>> From: Cédric Le Goater <clg@kaod.org>
> >>>>>>>>
> >>>>>>>> We now have enough support to boot a PowerNV machine with a POWER9
> >>>>>>>> processor. Allow HV mode on POWER9.
> >>>>>>>>
> >>>>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >>>>>>>> Message-Id: <20190307223548.20516-16-clg@kaod.org>
> >>>>>>>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> >>>>>>>> ---
> >>>>>>>>  target/ppc/translate_init.inc.c | 3 ++-
> >>>>>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
> >>>>>>>>
> >>>>>>>> diff --git a/target/ppc/translate_init.inc.c
> >>>>>>>> b/target/ppc/translate_init.inc.c
> >>>>>>>> index af70a3b78c..0bd555eb19 100644
> >>>>>>>> --- a/target/ppc/translate_init.inc.c
> >>>>>>>> +++ b/target/ppc/translate_init.inc.c
> >>>>>>>> @@ -8895,7 +8895,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
> >>>>>>>> *data)
> >>>>>>>>                         PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
> >>>>>>>>                         PPC_MEM_SYNC | PPC_MEM_EIEIO |
> >>>>>>>>                         PPC_MEM_TLBSYNC |
> >>>>>>>> -                       PPC_64B | PPC_64BX | PPC_ALTIVEC |
> >>>>>>>> +                       PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
> >>>>>>>>                         PPC_SEGMENT_64B | PPC_SLBI |
> >>>>>>>>                         PPC_POPCNTB | PPC_POPCNTWD |
> >>>>>>>>                         PPC_CILDST;
> >>>>>>>> @@ -8907,6 +8907,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
> >>>>>>>> *data)
> >>>>>>>>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
> >>>>>>>>                          PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
> >>>>>>>>      pcc->msr_mask = (1ull << MSR_SF) |
> >>>>>>>> +                    (1ull << MSR_SHV) |
> >>>>>>>>                      (1ull << MSR_TM) |
> >>>>>>>>                      (1ull << MSR_VR) |
> >>>>>>>>                      (1ull << MSR_VSX) |
> >>>>>>>>
> >>>>>>>>
> >>>>>>>
> >>>>>>> This change prevents a Fedora 29 kernel[1] from booting... is this
> >>>>>>> intended or a known limitation of the Fedora 29 kernel?
> >>>>>>
> >>>>>> The default CPU is still power8_v2.0. This is curious.
> >>>>>>
> >>>>>
> >>>>> Are you sure?  I'm getting:
> >>>>>
> >>>>>  $ git rev-parse HEAD
> >>>>>  cfc3fef6b4e493bf1a7ee16790ad584e20dfbbd1
> >>>>>  $ ./ppc64-softmmu/qemu-system-ppc64 -qmp unix:/tmp/qmp-sock,server
> >>>>>  $ ./scripts/qmp/qom-get -s /tmp/qmp-sock /machine/unattached/device[0].type
> >>>>>  power9_v2.0-spapr-cpu-core
> >>>
> >>> That's a pseries machine, not a powernv machine. pseries should use P9
> >>> processor by default but the patch above should not impact f29 on pseries. 
> >>> If it does, then we have a bug. 
> >>>  
> >>>> Looks like the overall default is "power9_v2.0", and then on pseries-3.1 and
> >>>> lower, it's "power8_v2.0", as per 34a6b015a98.
> >>>
> >>> I was looking at pnv_machine_class_init() which sets the default CPU :
> >>>
> >>>     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
> >>
> >> I found this thread while trying auto-bisection for LP#1834613:
> >> https://bugs.launchpad.net/bugs/1834613
> >>
> >> When trying the options suggested by Laurent here:
> >> https://lists.gnu.org/archive/html/qemu-devel/2019-06/msg06209.html
> >>
> >> this one hangs:
> >>
> >> $ qemu-system-ppc64 \
> >>  -kernel vmlinuz-vanilla \
> >>  -nographic -append "console=hvc0" \
> >>  -M cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken
> >>
> >> but this one works:
> >>
> >> $ qemu-system-ppc64 \
> >>  -kernel vmlinuz-vanilla \
> >>  -nographic -append "console=hvc0" \
> >>  -M pseries-3.1
> > 
> > Sorry, I missed most of this thread while on holidays.  What's the
> > actual bug here?
> 
> I don't think there is a bug, this seems the result of adding a new feature.
> The commit message is not obvious that old kernels won't work on the
> default machine type, and we have to add the extra '-M pseries-3.1'
> command line option to run such images.

Hm, except apparently turning off the Spectre options doesn't change
that, so I wonder what change in the newer machine type is causing the
breakage.

-- 
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 #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
  2019-07-02  0:14                   ` David Gibson
@ 2019-07-02  6:13                     ` Cédric Le Goater
  2019-07-02  9:22                       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 74+ messages in thread
From: Cédric Le Goater @ 2019-07-02  6:13 UTC (permalink / raw)
  To: David Gibson, Philippe Mathieu-Daudé
  Cc: lvivier, peter maydell, groug, qemu-devel, qemu-ppc, Cleber Rosa

On 02/07/2019 02:14, David Gibson wrote:
> On Mon, Jul 01, 2019 at 11:45:23AM +0200, Philippe Mathieu-Daudé wrote:
>> On 7/1/19 7:04 AM, David Gibson wrote:
>>> On Fri, Jun 28, 2019 at 03:20:32PM +0200, Philippe Mathieu-Daudé wrote:
>>>> Hi,
>>>>
>>>> On 3/12/19 8:58 PM, Cédric Le Goater wrote:
>>>>> On 3/12/19 8:30 PM, Cleber Rosa wrote:
>>>>>>> From: "Cleber Rosa" <crosa@redhat.com>
>>>>>>> Sent: Tuesday, March 12, 2019 3:14:09 PM
>>>>>>> Subject: Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
>>>>>>>
>>>>>>> On Tue, Mar 12, 2019 at 07:34:04PM +0100, Cédric Le Goater wrote:
>>>>>>>> On 3/12/19 4:01 PM, Cleber Rosa wrote:
>>>>>>>>> On Sun, Mar 10, 2019 at 07:27:00PM +1100, David Gibson wrote:
>>>>>>>>>> From: Cédric Le Goater <clg@kaod.org>
>>>>>>>>>>
>>>>>>>>>> We now have enough support to boot a PowerNV machine with a POWER9
>>>>>>>>>> processor. Allow HV mode on POWER9.
>>>>>>>>>>
>>>>>>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>>>>>>>>> Message-Id: <20190307223548.20516-16-clg@kaod.org>
>>>>>>>>>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
>>>>>>>>>> ---
>>>>>>>>>>  target/ppc/translate_init.inc.c | 3 ++-
>>>>>>>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>>>>>
>>>>>>>>>> diff --git a/target/ppc/translate_init.inc.c
>>>>>>>>>> b/target/ppc/translate_init.inc.c
>>>>>>>>>> index af70a3b78c..0bd555eb19 100644
>>>>>>>>>> --- a/target/ppc/translate_init.inc.c
>>>>>>>>>> +++ b/target/ppc/translate_init.inc.c
>>>>>>>>>> @@ -8895,7 +8895,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
>>>>>>>>>> *data)
>>>>>>>>>>                         PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
>>>>>>>>>>                         PPC_MEM_SYNC | PPC_MEM_EIEIO |
>>>>>>>>>>                         PPC_MEM_TLBSYNC |
>>>>>>>>>> -                       PPC_64B | PPC_64BX | PPC_ALTIVEC |
>>>>>>>>>> +                       PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
>>>>>>>>>>                         PPC_SEGMENT_64B | PPC_SLBI |
>>>>>>>>>>                         PPC_POPCNTB | PPC_POPCNTWD |
>>>>>>>>>>                         PPC_CILDST;
>>>>>>>>>> @@ -8907,6 +8907,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
>>>>>>>>>> *data)
>>>>>>>>>>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
>>>>>>>>>>                          PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
>>>>>>>>>>      pcc->msr_mask = (1ull << MSR_SF) |
>>>>>>>>>> +                    (1ull << MSR_SHV) |
>>>>>>>>>>                      (1ull << MSR_TM) |
>>>>>>>>>>                      (1ull << MSR_VR) |
>>>>>>>>>>                      (1ull << MSR_VSX) |
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> This change prevents a Fedora 29 kernel[1] from booting... is this
>>>>>>>>> intended or a known limitation of the Fedora 29 kernel?
>>>>>>>>
>>>>>>>> The default CPU is still power8_v2.0. This is curious.
>>>>>>>>
>>>>>>>
>>>>>>> Are you sure?  I'm getting:
>>>>>>>
>>>>>>>  $ git rev-parse HEAD
>>>>>>>  cfc3fef6b4e493bf1a7ee16790ad584e20dfbbd1
>>>>>>>  $ ./ppc64-softmmu/qemu-system-ppc64 -qmp unix:/tmp/qmp-sock,server
>>>>>>>  $ ./scripts/qmp/qom-get -s /tmp/qmp-sock /machine/unattached/device[0].type
>>>>>>>  power9_v2.0-spapr-cpu-core
>>>>>
>>>>> That's a pseries machine, not a powernv machine. pseries should use P9
>>>>> processor by default but the patch above should not impact f29 on pseries. 
>>>>> If it does, then we have a bug. 
>>>>>  
>>>>>> Looks like the overall default is "power9_v2.0", and then on pseries-3.1 and
>>>>>> lower, it's "power8_v2.0", as per 34a6b015a98.
>>>>>
>>>>> I was looking at pnv_machine_class_init() which sets the default CPU :
>>>>>
>>>>>     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
>>>>
>>>> I found this thread while trying auto-bisection for LP#1834613:
>>>> https://bugs.launchpad.net/bugs/1834613
>>>>
>>>> When trying the options suggested by Laurent here:
>>>> https://lists.gnu.org/archive/html/qemu-devel/2019-06/msg06209.html
>>>>
>>>> this one hangs:
>>>>
>>>> $ qemu-system-ppc64 \
>>>>  -kernel vmlinuz-vanilla \
>>>>  -nographic -append "console=hvc0" \
>>>>  -M cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken
>>>>
>>>> but this one works:
>>>>
>>>> $ qemu-system-ppc64 \
>>>>  -kernel vmlinuz-vanilla \
>>>>  -nographic -append "console=hvc0" \
>>>>  -M pseries-3.1
>>>
>>> Sorry, I missed most of this thread while on holidays.  What's the
>>> actual bug here?
>>
>> I don't think there is a bug, this seems the result of adding a new feature.
>> The commit message is not obvious that old kernels won't work on the
>> default machine type, and we have to add the extra '-M pseries-3.1'
>> command line option to run such images.
> 
> Hm, except apparently turning off the Spectre options doesn't change
> that, so I wonder what change in the newer machine type is causing the
> breakage.
> 

I don't see such an issue on David's ppc-for-4.1 branch.

C.


^ permalink raw reply	[flat|nested] 74+ messages in thread

* Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
  2019-07-02  6:13                     ` Cédric Le Goater
@ 2019-07-02  9:22                       ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 74+ messages in thread
From: Philippe Mathieu-Daudé @ 2019-07-02  9:22 UTC (permalink / raw)
  To: Cédric Le Goater, David Gibson, lvivier
  Cc: peter maydell, groug, qemu-ppc, qemu-devel, Cleber Rosa

On 7/2/19 8:13 AM, Cédric Le Goater wrote:
> On 02/07/2019 02:14, David Gibson wrote:
>> On Mon, Jul 01, 2019 at 11:45:23AM +0200, Philippe Mathieu-Daudé wrote:
>>> On 7/1/19 7:04 AM, David Gibson wrote:
>>>> On Fri, Jun 28, 2019 at 03:20:32PM +0200, Philippe Mathieu-Daudé wrote:
>>>>> Hi,
>>>>>
>>>>> On 3/12/19 8:58 PM, Cédric Le Goater wrote:
>>>>>> On 3/12/19 8:30 PM, Cleber Rosa wrote:
>>>>>>>> From: "Cleber Rosa" <crosa@redhat.com>
>>>>>>>> Sent: Tuesday, March 12, 2019 3:14:09 PM
>>>>>>>> Subject: Re: [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9
>>>>>>>>
>>>>>>>> On Tue, Mar 12, 2019 at 07:34:04PM +0100, Cédric Le Goater wrote:
>>>>>>>>> On 3/12/19 4:01 PM, Cleber Rosa wrote:
>>>>>>>>>> On Sun, Mar 10, 2019 at 07:27:00PM +1100, David Gibson wrote:
>>>>>>>>>>> From: Cédric Le Goater <clg@kaod.org>
>>>>>>>>>>>
>>>>>>>>>>> We now have enough support to boot a PowerNV machine with a POWER9
>>>>>>>>>>> processor. Allow HV mode on POWER9.
>>>>>>>>>>>
>>>>>>>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>>>>>>>>>> Message-Id: <20190307223548.20516-16-clg@kaod.org>
>>>>>>>>>>> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
>>>>>>>>>>> ---
>>>>>>>>>>>  target/ppc/translate_init.inc.c | 3 ++-
>>>>>>>>>>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>>>>>>>>>>
>>>>>>>>>>> diff --git a/target/ppc/translate_init.inc.c
>>>>>>>>>>> b/target/ppc/translate_init.inc.c
>>>>>>>>>>> index af70a3b78c..0bd555eb19 100644
>>>>>>>>>>> --- a/target/ppc/translate_init.inc.c
>>>>>>>>>>> +++ b/target/ppc/translate_init.inc.c
>>>>>>>>>>> @@ -8895,7 +8895,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
>>>>>>>>>>> *data)
>>>>>>>>>>>                         PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
>>>>>>>>>>>                         PPC_MEM_SYNC | PPC_MEM_EIEIO |
>>>>>>>>>>>                         PPC_MEM_TLBSYNC |
>>>>>>>>>>> -                       PPC_64B | PPC_64BX | PPC_ALTIVEC |
>>>>>>>>>>> +                       PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
>>>>>>>>>>>                         PPC_SEGMENT_64B | PPC_SLBI |
>>>>>>>>>>>                         PPC_POPCNTB | PPC_POPCNTWD |
>>>>>>>>>>>                         PPC_CILDST;
>>>>>>>>>>> @@ -8907,6 +8907,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void
>>>>>>>>>>> *data)
>>>>>>>>>>>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
>>>>>>>>>>>                          PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
>>>>>>>>>>>      pcc->msr_mask = (1ull << MSR_SF) |
>>>>>>>>>>> +                    (1ull << MSR_SHV) |
>>>>>>>>>>>                      (1ull << MSR_TM) |
>>>>>>>>>>>                      (1ull << MSR_VR) |
>>>>>>>>>>>                      (1ull << MSR_VSX) |
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> This change prevents a Fedora 29 kernel[1] from booting... is this
>>>>>>>>>> intended or a known limitation of the Fedora 29 kernel?
>>>>>>>>>
>>>>>>>>> The default CPU is still power8_v2.0. This is curious.
>>>>>>>>>
>>>>>>>>
>>>>>>>> Are you sure?  I'm getting:
>>>>>>>>
>>>>>>>>  $ git rev-parse HEAD
>>>>>>>>  cfc3fef6b4e493bf1a7ee16790ad584e20dfbbd1
>>>>>>>>  $ ./ppc64-softmmu/qemu-system-ppc64 -qmp unix:/tmp/qmp-sock,server
>>>>>>>>  $ ./scripts/qmp/qom-get -s /tmp/qmp-sock /machine/unattached/device[0].type
>>>>>>>>  power9_v2.0-spapr-cpu-core
>>>>>>
>>>>>> That's a pseries machine, not a powernv machine. pseries should use P9
>>>>>> processor by default but the patch above should not impact f29 on pseries. 
>>>>>> If it does, then we have a bug. 
>>>>>>  
>>>>>>> Looks like the overall default is "power9_v2.0", and then on pseries-3.1 and
>>>>>>> lower, it's "power8_v2.0", as per 34a6b015a98.
>>>>>>
>>>>>> I was looking at pnv_machine_class_init() which sets the default CPU :
>>>>>>
>>>>>>     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0");
>>>>>
>>>>> I found this thread while trying auto-bisection for LP#1834613:
>>>>> https://bugs.launchpad.net/bugs/1834613
>>>>>
>>>>> When trying the options suggested by Laurent here:
>>>>> https://lists.gnu.org/archive/html/qemu-devel/2019-06/msg06209.html
>>>>>
>>>>> this one hangs:
>>>>>
>>>>> $ qemu-system-ppc64 \
>>>>>  -kernel vmlinuz-vanilla \
>>>>>  -nographic -append "console=hvc0" \
>>>>>  -M cap-cfpc=broken,cap-sbbc=broken,cap-ibs=broken
>>>>>
>>>>> but this one works:
>>>>>
>>>>> $ qemu-system-ppc64 \
>>>>>  -kernel vmlinuz-vanilla \
>>>>>  -nographic -append "console=hvc0" \
>>>>>  -M pseries-3.1
>>>>
>>>> Sorry, I missed most of this thread while on holidays.  What's the
>>>> actual bug here?
>>>
>>> I don't think there is a bug, this seems the result of adding a new feature.
>>> The commit message is not obvious that old kernels won't work on the
>>> default machine type, and we have to add the extra '-M pseries-3.1'
>>> command line option to run such images.
>>
>> Hm, except apparently turning off the Spectre options doesn't change
>> that, so I wonder what change in the newer machine type is causing the
>> breakage.

Can this be an effect of the u-boot update?

> 
> I don't see such an issue on David's ppc-for-4.1 branch.
> 
> C.
> 


^ permalink raw reply	[flat|nested] 74+ messages in thread

end of thread, other threads:[~2019-07-02  9:25 UTC | newest]

Thread overview: 74+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-10  8:26 [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 01/60] vfio/spapr: Fix indirect levels calculation David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 02/60] vfio/spapr: Rename local systempagesize variable David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 03/60] spapr: Simulate CAS for qtest David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 04/60] Revert "spapr: support memory unplug for qtest" David Gibson
2019-03-11 10:52   ` Greg Kurz
2019-03-12  1:08     ` David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 05/60] target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 06/60] target/ppc: Implement large decrementer support for TCG David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 07/60] target/ppc: Implement large decrementer support for KVM David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 08/60] target/ppc/spapr: Enable the large decrementer for pseries-4.0 David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 09/60] target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 10/60] target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 11/60] target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 12/60] target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 13/60] target/ppc: Move exception vector offset computation into a function David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 14/60] target/ppc: Move handling of hardware breakpoints to a separate function David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 15/60] target/ppc: Refactor kvm_handle_debug David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 16/60] PPC: E500: Update u-boot to v2019.01 David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 17/60] target/ppc/spapr: Clear partition table entry when allocating hash table David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 18/60] spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit) David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 19/60] target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 20/60] PPC: E500: Add FSL I2C controller and integrate RTC with it David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 21/60] ppc/xive: hardwire the Physical CAM line of the thread context David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 22/60] ppc: externalize ppc_get_vcpu_by_pir() David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 23/60] ppc/xive: export the TIMA memory accessors David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 24/60] ppc/pnv: export the xive_router_notify() routine David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 25/60] ppc/pnv: change the CPU machine_data presenter type to Object * David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 26/60] ppc/pnv: add a XIVE interrupt controller model for POWER9 David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 27/60] ppc/pnv: introduce a new dt_populate() operation to the chip model David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 28/60] ppc/pnv: introduce a new pic_print_info() " David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 29/60] ppc/xive: activate HV support David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 30/60] ppc/pnv: fix logging primitives using Ox David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 31/60] ppc/pnv: psi: add a PSIHB_REG macro David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 32/60] ppc/pnv: psi: add a reset handler David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 33/60] spapr_iommu: Do not replay mappings from just created DMA window David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 34/60] target/ppc: introduce single fpr_offset() function David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 35/60] target/ppc: introduce single vsrl_offset() function David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 36/60] target/ppc: move Vsr* macros from internal.h to cpu.h David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 37/60] target/ppc: introduce avr_full_offset() function David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 38/60] target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64() David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 39/60] target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 40/60] target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l, h}() and set_cpu_vsr{l, h}() David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 41/60] mac_oldworld: use node name instead of alias name for hd device in FWPathProvider David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 42/60] mac_newworld: " David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 43/60] ppc/pnv: add a PSI bridge class model David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 44/60] ppc/pnv: add a PSI bridge model for POWER9 David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 45/60] ppc/pnv: lpc: fix OPB address ranges David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 46/60] ppc/pnv: add a LPC Controller class model David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 47/60] ppc/pnv: add a 'dt_isa_nodename' to the chip David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 48/60] ppc/pnv: add a LPC Controller model for POWER9 David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 49/60] ppc/pnv: add SerIRQ routing registers David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 50/60] ppc/pnv: add a OCC model class David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 51/60] ppc/pnv: add a OCC model for POWER9 David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 52/60] ppc/pnv: extend XSCOM core support " David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 53/60] ppc/pnv: POWER9 XSCOM quad support David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 54/60] ppc/pnv: activate XSCOM tests for POWER9 David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 55/60] ppc/pnv: add more dummy XSCOM addresses David Gibson
2019-03-10  8:26 ` [Qemu-devel] [PULL 56/60] ppc/pnv: add a "ibm, opal/power-mgt" device tree node on POWER9 David Gibson
2019-03-10  8:27 ` [Qemu-devel] [PULL 57/60] target/ppc: add HV support for POWER9 David Gibson
     [not found]   ` <20190312150115.6zuaid43gr7hklt5@unused>
     [not found]     ` <58de43c6-31d5-a0a3-b443-54a33f11d75a@kaod.org>
     [not found]       ` <20190312191409.vxnpscrephtk6otv@dhcp-17-165.bos.redhat.com>
     [not found]         ` <1746025955.7399905.1552419034356.JavaMail.zimbra@redhat.com>
     [not found]           ` <154364d7-fe5b-4f40-b976-b85ff9060ee0@kaod.org>
2019-06-28 13:20             ` Philippe Mathieu-Daudé
2019-07-01  5:04               ` David Gibson
2019-07-01  9:45                 ` Philippe Mathieu-Daudé
2019-07-02  0:14                   ` David Gibson
2019-07-02  6:13                     ` Cédric Le Goater
2019-07-02  9:22                       ` Philippe Mathieu-Daudé
2019-03-10  8:27 ` [Qemu-devel] [PULL 58/60] target/ppc: Optimize xviexpdp() using deposit_i64() David Gibson
2019-03-10  8:27 ` [Qemu-devel] [PULL 59/60] target/ppc: Optimize x[sv]xsigdp " David Gibson
2019-03-10  8:27 ` [Qemu-devel] [PULL 60/60] spapr: Use CamelCase properly David Gibson
2019-03-10  9:23 ` [Qemu-devel] [PULL 00/60] ppc-for-4.0 queue 20190310 no-reply
2019-03-10 16:06 ` Peter Maydell
2019-03-11 10:40   ` Alex Bennée
2019-03-12  0:26     ` David Gibson
2019-03-12  0:44   ` David Gibson

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.