* [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
* 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 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
* [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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�OuHk*2B&<Ukfz@z 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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
[parent not found: <20190312150115.6zuaid43gr7hklt5@unused>]
[parent not found: <58de43c6-31d5-a0a3-b443-54a33f11d75a@kaod.org>]
[parent not found: <20190312191409.vxnpscrephtk6otv@dhcp-17-165.bos.redhat.com>]
[parent not found: <1746025955.7399905.1552419034356.JavaMail.zimbra@redhat.com>]
[parent not found: <154364d7-fe5b-4f40-b976-b85ff9060ee0@kaod.org>]
* 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
* [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 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
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.