All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space
@ 2016-10-22  9:46 Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 01/17] ppc: add skiboot firmware for the pnv platform Cédric Le Goater
                   ` (17 more replies)
  0 siblings, 18 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

Hello,

Here is the latest version of the ppc/pnv platform patchset. PowerNV
(as Non-Virtualized) is the "baremetal" platform using the OPAL
firmware. It runs Linux on IBM and Open Power systems and it can be
used as an hypervisor OS, to run KVM guests, or simply as a host OS.
The goal here is to add support for the baremetal platform and
possibly later also for the KVM PR guests but not for HV guests.

In v5, all the comments from v4 should have been addressed. Most of
the differences are cleanups suggested by David but there a couple of
important changes :

 - an addition of a new firmware to qemu : skiboot 5.3.7.
 - a rework of the native Interrupt Presentation Controller model
   which now uses memory subregions instead of a hash table.   
 - a removal of the Power9 LPC Controller. This is still in the plans
   but the models need a little more work.


The initial patches provide a minimal platform with some RAM to load
the ROMs : firmware, kernel and initrd. The device tree is built with
what is available at reset time. Then, comes the PnvChip object acting
as a container for other devices required to run a system. The cores
are added to each chip with some restrictions on the number and the
ids. Next is the XSCOM model, the sideband bus which gives controls to
all the units in the POWER8 chip, the LPC controller for the console,
the native interrupt controller and the PSI HB model to handle the
external interrupt.


The next step should be IPMI support which adds a BT device on the ISA
bus and some device tree extensions to read sensors and FRUs. This is
relatively straight forward and most of the IPMI code has been
discussed already on the list. Then should come a PHB3 model to
include some PCI devices. This is big and it needs a few helpers in
the PCI core.

If you feel adventurous, you can grab kernel and rootfs images :

  https://openpower.xyz/job/openpower-op-build/distro=ubuntu,target=palmetto/lastSuccessfulBuild/artifact/images/zImage.epapr
  https://openpower.xyz/job/openpower-op-build/distro=ubuntu,target=palmetto/lastSuccessfulBuild/artifact/images/rootfs.cpio.xz

and give it a try. The full patchset is available here :

   https://github.com/legoater/qemu/commits/powernv-ipmi-2.8

This is a wip branch, which I stabilize when the qemu version, on
which it is based, is released.

Thanks,

C. 

Benjamin Herrenschmidt (5):
  ppc/pnv: add skeleton PowerNV platform
  ppc/pnv: add a LPC controller
  ppc/pnv: Add cut down PSI bridge model and hookup external interrupt
  ppc/pnv: Add OCC model stub with interrupt support
  ppc/pnv: Add Naples chip support for LPC interrupts

Cédric Le Goater (12):
  ppc: add skiboot firmware for the pnv platform
  ppc/pnv: add a PnvChip object
  ppc/pnv: add a core mask to PnvChip
  ppc/pnv: add a PIR handler to PnvChip
  ppc/pnv: add a PnvCore object
  ppc/pnv: add XSCOM infrastructure
  ppc/pnv: add XSCOM handlers to PnvCore
  ppc/pnv: add a ISA bus
  ppc/xics: Add "native" XICS subclass
  ppc/pnv: add a XICS native to each PowerNV chip
  ppc/xics: add a xics_get_cpu_index_by_pir helper
  ppc/xics: introduce a helper to insert a new ics

 .gitmodules                       |   3 +
 MAINTAINERS                       |   1 +
 Makefile                          |   2 +-
 default-configs/ppc64-softmmu.mak |   4 +-
 hw/intc/Makefile.objs             |   1 +
 hw/intc/xics.c                    |   6 +
 hw/intc/xics_native.c             | 323 ++++++++++++++
 hw/ppc/Makefile.objs              |   2 +
 hw/ppc/pnv.c                      | 888 ++++++++++++++++++++++++++++++++++++++
 hw/ppc/pnv_core.c                 | 248 +++++++++++
 hw/ppc/pnv_lpc.c                  | 514 ++++++++++++++++++++++
 hw/ppc/pnv_occ.c                  | 135 ++++++
 hw/ppc/pnv_psi.c                  | 615 ++++++++++++++++++++++++++
 hw/ppc/pnv_xscom.c                | 277 ++++++++++++
 include/hw/ppc/pnv.h              | 159 +++++++
 include/hw/ppc/pnv_core.h         |  50 +++
 include/hw/ppc/pnv_lpc.h          |  76 ++++
 include/hw/ppc/pnv_occ.h          |  38 ++
 include/hw/ppc/pnv_psi.h          |  64 +++
 include/hw/ppc/pnv_xscom.h        |  84 ++++
 include/hw/ppc/xics.h             |  26 ++
 pc-bios/README                    |   5 +
 pc-bios/skiboot.lid               | Bin 0 -> 983893 bytes
 roms/Makefile                     |   8 +-
 roms/skiboot                      |   1 +
 25 files changed, 3527 insertions(+), 3 deletions(-)
 create mode 100644 hw/intc/xics_native.c
 create mode 100644 hw/ppc/pnv.c
 create mode 100644 hw/ppc/pnv_core.c
 create mode 100644 hw/ppc/pnv_lpc.c
 create mode 100644 hw/ppc/pnv_occ.c
 create mode 100644 hw/ppc/pnv_psi.c
 create mode 100644 hw/ppc/pnv_xscom.c
 create mode 100644 include/hw/ppc/pnv.h
 create mode 100644 include/hw/ppc/pnv_core.h
 create mode 100644 include/hw/ppc/pnv_lpc.h
 create mode 100644 include/hw/ppc/pnv_occ.h
 create mode 100644 include/hw/ppc/pnv_psi.h
 create mode 100644 include/hw/ppc/pnv_xscom.h
 create mode 100644 pc-bios/skiboot.lid
 create mode 160000 roms/skiboot

-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 01/17] ppc: add skiboot firmware for the pnv platform
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 02/17] ppc/pnv: add skeleton PowerNV platform Cédric Le Goater
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

This is the initial image of skiboot 5.3.7 (commit 762d0082) for
the PowerPC PowerNV (Non-Virtualized) platform. Built from
submodule.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 .gitmodules         |   3 +++
 MAINTAINERS         |   1 +
 Makefile            |   2 +-
 pc-bios/README      |   5 +++++
 pc-bios/skiboot.lid | Bin 0 -> 983893 bytes
 roms/Makefile       |   8 +++++++-
 roms/skiboot        |   1 +
 7 files changed, 18 insertions(+), 2 deletions(-)
 create mode 100644 pc-bios/skiboot.lid
 create mode 160000 roms/skiboot

diff --git a/.gitmodules b/.gitmodules
index 9da9ede26161..ca323b4d872c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -31,3 +31,6 @@
 [submodule "roms/u-boot"]
 	path = roms/u-boot
 	url = git://git.qemu-project.org/u-boot.git
+[submodule "roms/skiboot"]
+	path = roms/skiboot
+	url = git://git.qemu.org/skiboot.git
diff --git a/MAINTAINERS b/MAINTAINERS
index b01fec0a7b95..280ee1fcd263 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -656,6 +656,7 @@ F: include/hw/*/xics*
 F: pc-bios/spapr-rtas/*
 F: pc-bios/spapr-rtas.bin
 F: pc-bios/slof.bin
+F: pc-bios/skiboot.lid
 F: docs/specs/ppc-spapr-hcalls.txt
 F: docs/specs/ppc-spapr-hotplug.txt
 F: tests/spapr*
diff --git a/Makefile b/Makefile
index 3bcb0565b60a..11f5154c8122 100644
--- a/Makefile
+++ b/Makefile
@@ -421,7 +421,7 @@ qemu-icon.bmp qemu_logo_no_text.svg \
 bamboo.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
 multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin \
 s390-ccw.img \
-spapr-rtas.bin slof.bin \
+spapr-rtas.bin slof.bin skiboot.lid \
 palcode-clipper \
 u-boot.e500
 else
diff --git a/pc-bios/README b/pc-bios/README
index 779192eb7cea..47a913f9c7cc 100644
--- a/pc-bios/README
+++ b/pc-bios/README
@@ -42,3 +42,8 @@
   it was compiled using the qemu-ppce500 target.
   A git mirror is available at: git://git.qemu-project.org/u-boot.git
   The hash used to compile the current version is: 2072e72
+
+- Skiboot (https://github.com/open-power/skiboot/) is an OPAL
+  (OpenPower Abstraction Layer) firmware for OpenPOWER systems. It can
+  run an hypervisor OS or simply a host OS on the "baremetal"
+  platform, also known as the PowerNV (Non-Virtualized) platform.
diff --git a/pc-bios/skiboot.lid b/pc-bios/skiboot.lid
new file mode 100644
index 0000000000000000000000000000000000000000..0e59a8280d26342bc769f04e49dfccbed48ead1b
GIT binary patch
literal 983893
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

literal 0
HcmV?d00001

diff --git a/roms/Makefile b/roms/Makefile
index 88b3709d4dc2..b5e5a69e9100 100644
--- a/roms/Makefile
+++ b/roms/Makefile
@@ -63,6 +63,7 @@ default:
 	@echo "  efirom         -- update nic roms (bios+efi, this needs"
 	@echo "                    the EfiRom utility from edk2 / tianocore)"
 	@echo "  slof           -- update slof.bin"
+	@echo "  skiboot        -- update skiboot.lid"
 	@echo "  u-boot.e500    -- update u-boot.e500"
 
 bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
@@ -103,7 +104,7 @@ build-lgplvgabios:
 	$(MAKE) -C vgabios $(vgabios_targets)
 
 
-.PHONY: sgabios
+.PHONY: sgabios skiboot
 sgabios:
 	$(MAKE) -C sgabios
 	cp sgabios/sgabios.bin ../pc-bios
@@ -146,6 +147,10 @@ u-boot.e500:
 	$(powerpc_cross_prefix)strip u-boot/build.e500/u-boot -o \
 		../pc-bios/u-boot.e500
 
+skiboot:
+	$(MAKE) -C skiboot CROSS=$(powerpc64_cross_prefix)
+	cp skiboot/skiboot.lid ../pc-bios/skiboot.lid
+
 clean:
 	rm -rf seabios/.config seabios/out seabios/builds
 	$(MAKE) -C vgabios clean
@@ -155,3 +160,4 @@ clean:
 	$(MAKE) -C ipxe/src veryclean
 	$(MAKE) -C SLOF clean
 	rm -rf u-boot/build.e500
+	$(MAKE) -C skiboot clean
diff --git a/roms/skiboot b/roms/skiboot
new file mode 160000
index 000000000000..762d0082f18e
--- /dev/null
+++ b/roms/skiboot
@@ -0,0 +1 @@
+Subproject commit 762d0082f18e4fb921a2d44a1051b02d8b0f6381
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 02/17] ppc/pnv: add skeleton PowerNV platform
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 01/17] ppc: add skiboot firmware for the pnv platform Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 03/17] ppc/pnv: add a PnvChip object Cédric Le Goater
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

The goal is to emulate a PowerNV system at the level of the skiboot
firmware, which loads the OS and provides some runtime services. Power
Systems have a lower firmware (HostBoot) that does low level system
initialization, like DRAM training. This is beyond the scope of what
qemu will address in a PowerNV guest.

No devices yet, not even an interrupt controller. Just to get started,
some RAM to load the skiboot firmware, the kernel and initrd. The
device tree is fully created in the machine reset op.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[clg: - updated for qemu-2.7
      - replaced fprintf by error_report
      - used a common definition of _FDT macro
      - removed VMStateDescription as migration is not yet supported
      - added IBM Copyright statements
      - reworked kernel_filename handling
      - merged PnvSystem and sPowerNVMachineState
      - removed PHANDLE_XICP
      - added ppc_create_page_sizes_prop helper
      - removed nmi support
      - removed kvm support
      - updated powernv machine to version 2.8
      - removed chips and cpus, They will be provided in another patches
      - added a machine reset routine to initialize the device tree (also)
      - french has a squelette and english a skeleton.
      - improved commit log.
      - reworked prototypes parameters
      - added a check on the ram size (thanks to Michael Ellerman)
      - fixed chip-id cell
      - changed MAX_CPUS to 2048
      - simplified memory node creation to one node only
      - removed machine version
      - rewrote the device tree creation with the fdt "rw" routines
      - s/sPowerNVMachineState/PnvMachineState/
      - etc.]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---

 Changes since v4:

 - modified ppc_powernv_init() to use a 'MachineState *' and replaced
   the use of the global 'ram_size' by 'machine->ram_size'. The result
   is cleaner.
 
 Changes since v3:

 - fixed printf format for hwaddr
 - used fdt_pack() before writing the tree in memory 
 - removed the requirement on having a kernel loaded as running with
   just a firmware is fine. We will need to discuss the inclusion of
   the file skiboot.lid under qemu.
 
 Changes since v2:

 - some more copyright header cleanups
 - remove fdt_addr field from PnvMachineState

 Changes since v1:

 - changed MAX_CPUS to 2048
 - simplified memory node creation to one node only
 - removed machine version 
 - rewrote the device tree creation with the fdt "rw" routines
 - s/sPowerNVMachineState/PnvMachineState/
 - block_default_type is back to IF_IDE because of the AHCI device

 default-configs/ppc64-softmmu.mak |   1 +
 hw/ppc/Makefile.objs              |   2 +
 hw/ppc/pnv.c                      | 226 ++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h              |  38 +++++++
 4 files changed, 267 insertions(+)
 create mode 100644 hw/ppc/pnv.c
 create mode 100644 include/hw/ppc/pnv.h

diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
index db5a4d6f5eea..67a9bcaa67fa 100644
--- a/default-configs/ppc64-softmmu.mak
+++ b/default-configs/ppc64-softmmu.mak
@@ -39,6 +39,7 @@ CONFIG_I8259=y
 CONFIG_XILINX=y
 CONFIG_XILINX_ETHLITE=y
 CONFIG_PSERIES=y
+CONFIG_POWERNV=y
 CONFIG_PREP=y
 CONFIG_MAC=y
 CONFIG_E500=y
diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs
index 99a0d4e581bf..8105db7d5600 100644
--- a/hw/ppc/Makefile.objs
+++ b/hw/ppc/Makefile.objs
@@ -5,6 +5,8 @@ obj-$(CONFIG_PSERIES) += spapr.o spapr_vio.o spapr_events.o
 obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o
 obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o
 obj-$(CONFIG_PSERIES) += spapr_cpu_core.o
+# IBM PowerNV
+obj-$(CONFIG_POWERNV) += pnv.o
 ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy)
 obj-y += spapr_pci_vfio.o
 endif
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
new file mode 100644
index 000000000000..8d9850989b0b
--- /dev/null
+++ b/hw/ppc/pnv.c
@@ -0,0 +1,226 @@
+/*
+ * QEMU PowerPC PowerNV machine model
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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 "qapi/error.h"
+#include "sysemu/sysemu.h"
+#include "sysemu/numa.h"
+#include "hw/hw.h"
+#include "target-ppc/cpu.h"
+#include "qemu/log.h"
+#include "hw/ppc/fdt.h"
+#include "hw/ppc/ppc.h"
+#include "hw/ppc/pnv.h"
+#include "hw/loader.h"
+#include "exec/address-spaces.h"
+#include "qemu/cutils.h"
+
+#include <libfdt.h>
+
+#define FDT_MAX_SIZE            0x00100000
+
+#define FW_FILE_NAME            "skiboot.lid"
+#define FW_LOAD_ADDR            0x0
+#define FW_MAX_SIZE             0x00400000
+
+#define KERNEL_LOAD_ADDR        0x20000000
+#define INITRD_LOAD_ADDR        0x40000000
+
+/*
+ * On Power Systems E880 (POWER8), the max cpus (threads) should be :
+ *     4 * 4 sockets * 12 cores * 8 threads = 1536
+ * Let's make it 2^11
+ */
+#define MAX_CPUS                2048
+
+/*
+ * Memory nodes are created by hostboot, one for each range of memory
+ * that has a different "affinity". In practice, it means one range
+ * per chip.
+ */
+static void powernv_populate_memory_node(void *fdt, int chip_id, hwaddr start,
+                                         hwaddr size)
+{
+    char *mem_name;
+    uint64_t mem_reg_property[2];
+    int off;
+
+    mem_reg_property[0] = cpu_to_be64(start);
+    mem_reg_property[1] = cpu_to_be64(size);
+
+    mem_name = g_strdup_printf("memory@%"HWADDR_PRIx, start);
+    off = fdt_add_subnode(fdt, 0, mem_name);
+    g_free(mem_name);
+
+    _FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
+    _FDT((fdt_setprop(fdt, off, "reg", mem_reg_property,
+                       sizeof(mem_reg_property))));
+    _FDT((fdt_setprop_cell(fdt, off, "ibm,chip-id", chip_id)));
+}
+
+static void *powernv_create_fdt(MachineState *machine)
+{
+    const char plat_compat[] = "qemu,powernv\0ibm,powernv";
+    PnvMachineState *pnv = POWERNV_MACHINE(machine);
+    void *fdt;
+    char *buf;
+    int off;
+
+    fdt = g_malloc0(FDT_MAX_SIZE);
+    _FDT((fdt_create_empty_tree(fdt, FDT_MAX_SIZE)));
+
+    /* Root node */
+    _FDT((fdt_setprop_cell(fdt, 0, "#address-cells", 0x2)));
+    _FDT((fdt_setprop_cell(fdt, 0, "#size-cells", 0x2)));
+    _FDT((fdt_setprop_string(fdt, 0, "model",
+                             "IBM PowerNV (emulated by qemu)")));
+    _FDT((fdt_setprop(fdt, 0, "compatible", plat_compat,
+                      sizeof(plat_compat))));
+
+    buf =  qemu_uuid_unparse_strdup(&qemu_uuid);
+    _FDT((fdt_setprop_string(fdt, 0, "vm,uuid", buf)));
+    if (qemu_uuid_set) {
+        _FDT((fdt_property_string(fdt, "system-id", buf)));
+    }
+    g_free(buf);
+
+    off = fdt_add_subnode(fdt, 0, "chosen");
+    if (machine->kernel_cmdline) {
+        _FDT((fdt_setprop_string(fdt, off, "bootargs",
+                                 machine->kernel_cmdline)));
+    }
+
+    if (pnv->initrd_size) {
+        uint32_t start_prop = cpu_to_be32(pnv->initrd_base);
+        uint32_t end_prop = cpu_to_be32(pnv->initrd_base + pnv->initrd_size);
+
+        _FDT((fdt_setprop(fdt, off, "linux,initrd-start",
+                               &start_prop, sizeof(start_prop))));
+        _FDT((fdt_setprop(fdt, off, "linux,initrd-end",
+                               &end_prop, sizeof(end_prop))));
+    }
+
+    /* TODO: put all the memory in one node on chip 0 until we find a
+     * way to specify different ranges for each chip
+     */
+    powernv_populate_memory_node(fdt, 0, 0, machine->ram_size);
+
+    return fdt;
+}
+
+static void ppc_powernv_reset(void)
+{
+    MachineState *machine = MACHINE(qdev_get_machine());
+    void *fdt;
+
+    qemu_devices_reset();
+
+    fdt = powernv_create_fdt(machine);
+
+    /* Pack resulting tree */
+    _FDT((fdt_pack(fdt)));
+
+    cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt));
+}
+
+static void ppc_powernv_init(MachineState *machine)
+{
+    PnvMachineState *pnv = POWERNV_MACHINE(machine);
+    MemoryRegion *ram;
+    char *fw_filename;
+    long fw_size;
+
+    /* allocate RAM */
+    if (machine->ram_size < (1 * G_BYTE)) {
+        error_report("Warning: skiboot may not work with < 1GB of RAM");
+    }
+
+    ram = g_new(MemoryRegion, 1);
+    memory_region_allocate_system_memory(ram, NULL, "ppc_powernv.ram",
+                                         machine->ram_size);
+    memory_region_add_subregion(get_system_memory(), 0, ram);
+
+    /* load skiboot firmware  */
+    if (bios_name == NULL) {
+        bios_name = FW_FILE_NAME;
+    }
+
+    fw_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
+
+    fw_size = load_image_targphys(fw_filename, FW_LOAD_ADDR, FW_MAX_SIZE);
+    if (fw_size < 0) {
+        hw_error("qemu: could not load OPAL '%s'\n", fw_filename);
+        exit(1);
+    }
+    g_free(fw_filename);
+
+    /* load kernel */
+    if (machine->kernel_filename) {
+        long kernel_size;
+
+        kernel_size = load_image_targphys(machine->kernel_filename,
+                                          KERNEL_LOAD_ADDR, 0x2000000);
+        if (kernel_size < 0) {
+            hw_error("qemu: could not load kernel'%s'\n",
+                     machine->kernel_filename);
+            exit(1);
+        }
+    }
+
+    /* load initrd */
+    if (machine->initrd_filename) {
+        pnv->initrd_base = INITRD_LOAD_ADDR;
+        pnv->initrd_size = load_image_targphys(machine->initrd_filename,
+                                  pnv->initrd_base, 0x10000000); /* 128MB max */
+        if (pnv->initrd_size < 0) {
+            error_report("qemu: could not load initial ram disk '%s'",
+                         machine->initrd_filename);
+            exit(1);
+        }
+    }
+}
+
+static void powernv_machine_class_init(ObjectClass *oc, void *data)
+{
+    MachineClass *mc = MACHINE_CLASS(oc);
+
+    mc->desc = "IBM PowerNV (Non-Virtualized)";
+    mc->init = ppc_powernv_init;
+    mc->reset = ppc_powernv_reset;
+    mc->max_cpus = MAX_CPUS;
+    mc->block_default_type = IF_IDE; /* Pnv provides a AHCI device for
+                                      * storage */
+    mc->no_parallel = 1;
+    mc->default_boot_order = NULL;
+    mc->default_ram_size = 1 * G_BYTE;
+}
+
+static const TypeInfo powernv_machine_info = {
+    .name          = TYPE_POWERNV_MACHINE,
+    .parent        = TYPE_MACHINE,
+    .instance_size = sizeof(PnvMachineState),
+    .class_init    = powernv_machine_class_init,
+};
+
+static void powernv_machine_register_types(void)
+{
+    type_register_static(&powernv_machine_info);
+}
+
+type_init(powernv_machine_register_types)
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
new file mode 100644
index 000000000000..474fe9c697ef
--- /dev/null
+++ b/include/hw/ppc/pnv.h
@@ -0,0 +1,38 @@
+/*
+ * QEMU PowerPC PowerNV various definitions
+ *
+ * Copyright (c) 2014-2016 BenH, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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/>.
+ */
+#ifndef _PPC_PNV_H
+#define _PPC_PNV_H
+
+#include "hw/boards.h"
+
+#define TYPE_POWERNV_MACHINE       MACHINE_TYPE_NAME("powernv")
+#define POWERNV_MACHINE(obj) \
+    OBJECT_CHECK(PnvMachineState, (obj), TYPE_POWERNV_MACHINE)
+
+typedef struct PnvMachineState {
+    /*< private >*/
+    MachineState parent_obj;
+
+    uint32_t     initrd_base;
+    long         initrd_size;
+} PnvMachineState;
+
+#define PNV_FDT_ADDR          0x01000000
+
+#endif /* _PPC_PNV_H */
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 03/17] ppc/pnv: add a PnvChip object
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 01/17] ppc: add skiboot firmware for the pnv platform Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 02/17] ppc/pnv: add skeleton PowerNV platform Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 04/17] ppc/pnv: add a core mask to PnvChip Cédric Le Goater
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

This is is an abstraction of a POWER8 chip which is a set of cores
plus other 'units', like the pervasive unit, the interrupt controller,
the memory controller, the on-chip microcontroller, etc. The whole can
be seen as a socket. It depends on a cpu model and its characteristics:
max cores and specific inits are defined in a PnvChipClass.

We start with an near empty PnvChip with only a few cpu constants
which we will grow in the subsequent patches with the controllers
required to run the system.

The Chip CFAM (Common FRU Access Module) ID gives the model of the
chip and its version number. It is generally the first thing firmwares
fetch, available at XSCOM PCB address 0xf000f, to start initialization.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---

 Changes since v4:

 - changed 'num-chip' to be a class property of the powernv
   machine. Modified the accessors to more generic ones using Visitor.   
 - introduced two new properties 'ram-start' and 'ram-size' to hold
   the definitions of the RAM per chip. This change was motivated by
   the use of machine->ram_disk in the previous patch but it also
   prepares ground for the support of multiple chips.

 Changes since v3:

 - removed PnvChipPower* types
 - removed realize ops of PnvChip
 - replaced scanf by qemu_strtoul

 Changes since v2:

 - forced a POWER8 cpu model if none is specified and check that a
   PnvChip type exist for it
 - did some renaming to be consistent with the cpu model names
 - added POWER9 chip
 - removed empty realize op
 - renamed atribute chip_f000f in chip_cfam_id
 - used error_fatal instead of error_abort when setting the chip
   properties
 - introduced a powernv_populate_chip() routine

 Changes since v1:
 
 - introduced a PnvChipClass depending on the cpu model. It also
   provides some chip constants used by devices, like the cpu model hw
   id (f000f), a enum type (not sure this is useful yet), a custom
   realize ops for customization.
 - the num-chips property can be configured on the command line.
 
 hw/ppc/pnv.c         | 213 +++++++++++++++++++++++++++++++++++++++++++++++++--
 include/hw/ppc/pnv.h |  63 +++++++++++++++
 2 files changed, 271 insertions(+), 5 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 8d9850989b0b..aeafd7e894d2 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -30,6 +30,7 @@
 #include "hw/loader.h"
 #include "exec/address-spaces.h"
 #include "qemu/cutils.h"
+#include "qapi/visitor.h"
 
 #include <libfdt.h>
 
@@ -74,6 +75,14 @@ static void powernv_populate_memory_node(void *fdt, int chip_id, hwaddr start,
     _FDT((fdt_setprop_cell(fdt, off, "ibm,chip-id", chip_id)));
 }
 
+static void powernv_populate_chip(PnvChip *chip, void *fdt)
+{
+    if (chip->ram_size) {
+        powernv_populate_memory_node(fdt, chip->chip_id, chip->ram_start,
+                                     chip->ram_size);
+    }
+}
+
 static void *powernv_create_fdt(MachineState *machine)
 {
     const char plat_compat[] = "qemu,powernv\0ibm,powernv";
@@ -81,6 +90,7 @@ static void *powernv_create_fdt(MachineState *machine)
     void *fdt;
     char *buf;
     int off;
+    int i;
 
     fdt = g_malloc0(FDT_MAX_SIZE);
     _FDT((fdt_create_empty_tree(fdt, FDT_MAX_SIZE)));
@@ -116,11 +126,10 @@ static void *powernv_create_fdt(MachineState *machine)
                                &end_prop, sizeof(end_prop))));
     }
 
-    /* TODO: put all the memory in one node on chip 0 until we find a
-     * way to specify different ranges for each chip
-     */
-    powernv_populate_memory_node(fdt, 0, 0, machine->ram_size);
-
+    /* Populate device tree for each chip */
+    for (i = 0; i < pnv->num_chips; i++) {
+        powernv_populate_chip(pnv->chips[i], fdt);
+    }
     return fdt;
 }
 
@@ -145,6 +154,8 @@ static void ppc_powernv_init(MachineState *machine)
     MemoryRegion *ram;
     char *fw_filename;
     long fw_size;
+    int i;
+    char *chip_typename;
 
     /* allocate RAM */
     if (machine->ram_size < (1 * G_BYTE)) {
@@ -194,6 +205,190 @@ static void ppc_powernv_init(MachineState *machine)
             exit(1);
         }
     }
+
+    /* We need some cpu model to instantiate the PnvChip class */
+    if (machine->cpu_model == NULL) {
+        machine->cpu_model = "POWER8";
+    }
+
+    /* Create the processor chips */
+    chip_typename = g_strdup_printf(TYPE_PNV_CHIP "-%s", machine->cpu_model);
+    if (!object_class_by_name(chip_typename)) {
+        error_report("qemu: invalid CPU model '%s' for %s machine",
+                     machine->cpu_model, MACHINE_GET_CLASS(machine)->name);
+        exit(1);
+    }
+
+    pnv->chips = g_new0(PnvChip *, pnv->num_chips);
+    for (i = 0; i < pnv->num_chips; i++) {
+        char chip_name[32];
+        Object *chip = object_new(chip_typename);
+
+        pnv->chips[i] = PNV_CHIP(chip);
+
+        /* TODO: put all the memory in one node on chip 0 until we find a
+         * way to specify different ranges for each chip
+         */
+        if (i == 0) {
+            object_property_set_int(chip, machine->ram_size, "ram-size",
+                                    &error_fatal);
+        }
+
+        snprintf(chip_name, sizeof(chip_name), "chip[%d]", PNV_CHIP_HWID(i));
+        object_property_add_child(OBJECT(pnv), chip_name, chip, &error_fatal);
+        object_property_set_int(chip, PNV_CHIP_HWID(i), "chip-id",
+                                &error_fatal);
+        object_property_set_bool(chip, true, "realized", &error_fatal);
+    }
+    g_free(chip_typename);
+}
+
+static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvChipClass *k = PNV_CHIP_CLASS(klass);
+
+    k->cpu_model = "POWER8E";
+    k->chip_type = PNV_CHIP_POWER8E;
+    k->chip_cfam_id = 0x221ef04980000000ull;  /* P8 Murano DD2.1 */
+    dc->desc = "PowerNV Chip POWER8E";
+}
+
+static const TypeInfo pnv_chip_power8e_info = {
+    .name          = TYPE_PNV_CHIP_POWER8E,
+    .parent        = TYPE_PNV_CHIP,
+    .instance_size = sizeof(PnvChip),
+    .class_init    = pnv_chip_power8e_class_init,
+};
+
+static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvChipClass *k = PNV_CHIP_CLASS(klass);
+
+    k->cpu_model = "POWER8";
+    k->chip_type = PNV_CHIP_POWER8;
+    k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */
+    dc->desc = "PowerNV Chip POWER8";
+}
+
+static const TypeInfo pnv_chip_power8_info = {
+    .name          = TYPE_PNV_CHIP_POWER8,
+    .parent        = TYPE_PNV_CHIP,
+    .instance_size = sizeof(PnvChip),
+    .class_init    = pnv_chip_power8_class_init,
+};
+
+static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvChipClass *k = PNV_CHIP_CLASS(klass);
+
+    k->cpu_model = "POWER8NVL";
+    k->chip_type = PNV_CHIP_POWER8NVL;
+    k->chip_cfam_id = 0x120d304980000000ull;  /* P8 Naples DD1.0 */
+    dc->desc = "PowerNV Chip POWER8NVL";
+}
+
+static const TypeInfo pnv_chip_power8nvl_info = {
+    .name          = TYPE_PNV_CHIP_POWER8NVL,
+    .parent        = TYPE_PNV_CHIP,
+    .instance_size = sizeof(PnvChip),
+    .class_init    = pnv_chip_power8nvl_class_init,
+};
+
+static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvChipClass *k = PNV_CHIP_CLASS(klass);
+
+    k->cpu_model = "POWER9";
+    k->chip_type = PNV_CHIP_POWER9;
+    k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */
+    dc->desc = "PowerNV Chip POWER9";
+}
+
+static const TypeInfo pnv_chip_power9_info = {
+    .name          = TYPE_PNV_CHIP_POWER9,
+    .parent        = TYPE_PNV_CHIP,
+    .instance_size = sizeof(PnvChip),
+    .class_init    = pnv_chip_power9_class_init,
+};
+
+static void pnv_chip_realize(DeviceState *dev, Error **errp)
+{
+    /* left purposely empty */
+}
+
+static Property pnv_chip_properties[] = {
+    DEFINE_PROP_UINT32("chip-id", PnvChip, chip_id, 0),
+    DEFINE_PROP_UINT64("ram-start", PnvChip, ram_start, 0),
+    DEFINE_PROP_UINT64("ram-size", PnvChip, ram_size, 0),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void pnv_chip_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->realize = pnv_chip_realize;
+    dc->props = pnv_chip_properties;
+    dc->desc = "PowerNV Chip";
+}
+
+static const TypeInfo pnv_chip_info = {
+    .name          = TYPE_PNV_CHIP,
+    .parent        = TYPE_SYS_BUS_DEVICE,
+    .class_init    = pnv_chip_class_init,
+    .class_size    = sizeof(PnvChipClass),
+    .abstract      = true,
+};
+
+static void pnv_get_num_chips(Object *obj, Visitor *v, const char *name,
+                              void *opaque, Error **errp)
+{
+    visit_type_uint32(v, name, &POWERNV_MACHINE(obj)->num_chips, errp);
+}
+
+static void pnv_set_num_chips(Object *obj, Visitor *v, const char *name,
+                              void *opaque, Error **errp)
+{
+    PnvMachineState *pnv = POWERNV_MACHINE(obj);
+    uint32_t num_chips;
+    Error *local_err = NULL;
+
+    visit_type_uint32(v, name, &num_chips, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    /*
+     * TODO: should we decide on how many chips we can create based
+     * on #cores and Venice vs. Murano vs. Naples chip type etc...,
+     */
+    if (!is_power_of_2(num_chips) || num_chips > 4) {
+        error_setg(errp, "invalid number of chips: '%d'", num_chips);
+        return;
+    }
+
+    pnv->num_chips = num_chips;
+}
+
+static void powernv_machine_initfn(Object *obj)
+{
+    PnvMachineState *pnv = POWERNV_MACHINE(obj);
+    pnv->num_chips = 1;
+}
+
+static void powernv_machine_class_props_init(ObjectClass *oc)
+{
+    object_class_property_add(oc, "num-chips", "uint32_t",
+                              pnv_get_num_chips, pnv_set_num_chips,
+                              NULL, NULL, NULL);
+    object_class_property_set_description(oc, "num-chips",
+                              "Specifies the number of processor chips",
+                              NULL);
 }
 
 static void powernv_machine_class_init(ObjectClass *oc, void *data)
@@ -209,18 +404,26 @@ static void powernv_machine_class_init(ObjectClass *oc, void *data)
     mc->no_parallel = 1;
     mc->default_boot_order = NULL;
     mc->default_ram_size = 1 * G_BYTE;
+
+    powernv_machine_class_props_init(oc);
 }
 
 static const TypeInfo powernv_machine_info = {
     .name          = TYPE_POWERNV_MACHINE,
     .parent        = TYPE_MACHINE,
     .instance_size = sizeof(PnvMachineState),
+    .instance_init = powernv_machine_initfn,
     .class_init    = powernv_machine_class_init,
 };
 
 static void powernv_machine_register_types(void)
 {
     type_register_static(&powernv_machine_info);
+    type_register_static(&pnv_chip_info);
+    type_register_static(&pnv_chip_power8e_info);
+    type_register_static(&pnv_chip_power8_info);
+    type_register_static(&pnv_chip_power8nvl_info);
+    type_register_static(&pnv_chip_power9_info);
 }
 
 type_init(powernv_machine_register_types)
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 474fe9c697ef..7189961e1f42 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -20,6 +20,66 @@
 #define _PPC_PNV_H
 
 #include "hw/boards.h"
+#include "hw/sysbus.h"
+
+#define TYPE_PNV_CHIP "powernv-chip"
+#define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
+#define PNV_CHIP_CLASS(klass) \
+     OBJECT_CLASS_CHECK(PnvChipClass, (klass), TYPE_PNV_CHIP)
+#define PNV_CHIP_GET_CLASS(obj) \
+     OBJECT_GET_CLASS(PnvChipClass, (obj), TYPE_PNV_CHIP)
+
+typedef enum PnvChipType {
+    PNV_CHIP_POWER8E,     /* AKA Murano (default) */
+    PNV_CHIP_POWER8,      /* AKA Venice */
+    PNV_CHIP_POWER8NVL,   /* AKA Naples */
+    PNV_CHIP_POWER9,      /* AKA Nimbus */
+} PnvChipType;
+
+typedef struct PnvChip {
+    /*< private >*/
+    SysBusDevice parent_obj;
+
+    /*< public >*/
+    uint32_t     chip_id;
+    uint64_t     ram_start;
+    uint64_t     ram_size;
+} PnvChip;
+
+typedef struct PnvChipClass {
+    /*< private >*/
+    SysBusDeviceClass parent_class;
+
+    /*< public >*/
+    const char *cpu_model;
+    PnvChipType  chip_type;
+    uint64_t     chip_cfam_id;
+} PnvChipClass;
+
+#define TYPE_PNV_CHIP_POWER8E TYPE_PNV_CHIP "-POWER8E"
+#define PNV_CHIP_POWER8E(obj) \
+    OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP_POWER8E)
+
+#define TYPE_PNV_CHIP_POWER8 TYPE_PNV_CHIP "-POWER8"
+#define PNV_CHIP_POWER8(obj) \
+    OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP_POWER8)
+
+#define TYPE_PNV_CHIP_POWER8NVL TYPE_PNV_CHIP "-POWER8NVL"
+#define PNV_CHIP_POWER8NVL(obj) \
+    OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP_POWER8NVL)
+
+#define TYPE_PNV_CHIP_POWER9 TYPE_PNV_CHIP "-POWER9"
+#define PNV_CHIP_POWER9(obj) \
+    OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP_POWER9)
+
+/*
+ * This generates a HW chip id depending on an index:
+ *
+ *    0x0, 0x1, 0x10, 0x11
+ *
+ * 4 chips should be the maximum
+ */
+#define PNV_CHIP_HWID(i) ((((i) & 0x3e) << 3) | ((i) & 0x1))
 
 #define TYPE_POWERNV_MACHINE       MACHINE_TYPE_NAME("powernv")
 #define POWERNV_MACHINE(obj) \
@@ -31,6 +91,9 @@ typedef struct PnvMachineState {
 
     uint32_t     initrd_base;
     long         initrd_size;
+
+    uint32_t     num_chips;
+    PnvChip      **chips;
 } PnvMachineState;
 
 #define PNV_FDT_ADDR          0x01000000
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 04/17] ppc/pnv: add a core mask to PnvChip
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (2 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 03/17] ppc/pnv: add a PnvChip object Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 05/17] ppc/pnv: add a PIR handler " Cédric Le Goater
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

This will be used to build real HW ids for the cores and enforce some
limits on the available cores per chip.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---

 Changes since v4 :

 - removed setting of 'cores-mask' property. -global can be used to
   alter the default setting.

 Changes since v3 :

 - reworked pnv_chip_core_sanitize() to return errors and to check the
   maximum of cores against the instance cores_mask
  
 Changes since v2 :

 - added POWER9 support
 - removed cores_max 
 - introduces a pnv_chip_core_sanitize() helper to check the core
   ids_mask and the maximum number of cores

 hw/ppc/pnv.c         | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 include/hw/ppc/pnv.h |  4 +++
 2 files changed, 76 insertions(+), 1 deletion(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index aeafd7e894d2..1705699ef8a0 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -238,11 +238,38 @@ static void ppc_powernv_init(MachineState *machine)
         object_property_add_child(OBJECT(pnv), chip_name, chip, &error_fatal);
         object_property_set_int(chip, PNV_CHIP_HWID(i), "chip-id",
                                 &error_fatal);
+        object_property_set_int(chip, smp_cores, "nr-cores", &error_fatal);
         object_property_set_bool(chip, true, "realized", &error_fatal);
     }
     g_free(chip_typename);
 }
 
+/* Allowed core identifiers on a POWER8 Processor Chip :
+ *
+ * <EX0 reserved>
+ *  EX1  - Venice only
+ *  EX2  - Venice only
+ *  EX3  - Venice only
+ *  EX4
+ *  EX5
+ *  EX6
+ * <EX7,8 reserved> <reserved>
+ *  EX9  - Venice only
+ *  EX10 - Venice only
+ *  EX11 - Venice only
+ *  EX12
+ *  EX13
+ *  EX14
+ * <EX15 reserved>
+ */
+#define POWER8E_CORE_MASK  (0x7070ull)
+#define POWER8_CORE_MASK   (0x7e7eull)
+
+/*
+ * POWER9 has 24 cores, ids starting at 0x20
+ */
+#define POWER9_CORE_MASK   (0xffffff00000000ull)
+
 static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -251,6 +278,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
     k->cpu_model = "POWER8E";
     k->chip_type = PNV_CHIP_POWER8E;
     k->chip_cfam_id = 0x221ef04980000000ull;  /* P8 Murano DD2.1 */
+    k->cores_mask = POWER8E_CORE_MASK;
     dc->desc = "PowerNV Chip POWER8E";
 }
 
@@ -269,6 +297,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
     k->cpu_model = "POWER8";
     k->chip_type = PNV_CHIP_POWER8;
     k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */
+    k->cores_mask = POWER8_CORE_MASK;
     dc->desc = "PowerNV Chip POWER8";
 }
 
@@ -287,6 +316,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
     k->cpu_model = "POWER8NVL";
     k->chip_type = PNV_CHIP_POWER8NVL;
     k->chip_cfam_id = 0x120d304980000000ull;  /* P8 Naples DD1.0 */
+    k->cores_mask = POWER8_CORE_MASK;
     dc->desc = "PowerNV Chip POWER8NVL";
 }
 
@@ -305,6 +335,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
     k->cpu_model = "POWER9";
     k->chip_type = PNV_CHIP_POWER9;
     k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */
+    k->cores_mask = POWER9_CORE_MASK;
     dc->desc = "PowerNV Chip POWER9";
 }
 
@@ -315,15 +346,55 @@ static const TypeInfo pnv_chip_power9_info = {
     .class_init    = pnv_chip_power9_class_init,
 };
 
+static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp)
+{
+    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    int cores_max;
+
+    /*
+     * No custom mask for this chip, let's use the default one from *
+     * the chip class
+     */
+    if (!chip->cores_mask) {
+        chip->cores_mask = pcc->cores_mask;
+    }
+
+    /* filter alien core ids ! some are reserved */
+    if ((chip->cores_mask & pcc->cores_mask) != chip->cores_mask) {
+        error_setg(errp, "warning: invalid core mask for chip Ox%"PRIx64" !",
+                   chip->cores_mask);
+        return;
+    }
+    chip->cores_mask &= pcc->cores_mask;
+
+    /* now that we have a sane layout, let check the number of cores */
+    cores_max = hweight_long(chip->cores_mask);
+    if (chip->nr_cores > cores_max) {
+        error_setg(errp, "warning: too many cores for chip ! Limit is %d",
+                   cores_max);
+        return;
+    }
+}
+
 static void pnv_chip_realize(DeviceState *dev, Error **errp)
 {
-    /* left purposely empty */
+    PnvChip *chip = PNV_CHIP(dev);
+    Error *error = NULL;
+
+    /* Early checks on the core settings */
+    pnv_chip_core_sanitize(chip, &error);
+    if (error) {
+        error_propagate(errp, error);
+        return;
+    }
 }
 
 static Property pnv_chip_properties[] = {
     DEFINE_PROP_UINT32("chip-id", PnvChip, chip_id, 0),
     DEFINE_PROP_UINT64("ram-start", PnvChip, ram_start, 0),
     DEFINE_PROP_UINT64("ram-size", PnvChip, ram_size, 0),
+    DEFINE_PROP_UINT32("nr-cores", PnvChip, nr_cores, 1),
+    DEFINE_PROP_UINT64("cores-mask", PnvChip, cores_mask, 0x0),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 7189961e1f42..e084a8c30359 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -44,6 +44,9 @@ typedef struct PnvChip {
     uint32_t     chip_id;
     uint64_t     ram_start;
     uint64_t     ram_size;
+
+    uint32_t     nr_cores;
+    uint64_t     cores_mask;
 } PnvChip;
 
 typedef struct PnvChipClass {
@@ -54,6 +57,7 @@ typedef struct PnvChipClass {
     const char *cpu_model;
     PnvChipType  chip_type;
     uint64_t     chip_cfam_id;
+    uint64_t     cores_mask;
 } PnvChipClass;
 
 #define TYPE_PNV_CHIP_POWER8E TYPE_PNV_CHIP "-POWER8E"
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 05/17] ppc/pnv: add a PIR handler to PnvChip
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (3 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 04/17] ppc/pnv: add a core mask to PnvChip Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 06/17] ppc/pnv: add a PnvCore object Cédric Le Goater
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

The Processor Identification Register (PIR) is a register that holds a
processor identifier which is used for bus transactions (XSCOM) and
for processor differentiation in multiprocessor systems. It also used
in the interrupt vector entries (IVE) to identify the thread serving
the interrupts.

P9 and P8 have some differences in the CPU PIR encoding.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---

 Changes since v3 :

 - added a couple more comments on the bits definition
  
 hw/ppc/pnv.c         | 30 ++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h |  2 ++
 2 files changed, 32 insertions(+)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 1705699ef8a0..825d28ca75b1 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -244,6 +244,32 @@ static void ppc_powernv_init(MachineState *machine)
     g_free(chip_typename);
 }
 
+/*
+ *    0:21  Reserved - Read as zeros
+ *   22:24  Chip ID
+ *   25:28  Core number
+ *   29:31  Thread ID
+ */
+static uint32_t pnv_chip_core_pir_p8(PnvChip *chip, uint32_t core_id)
+{
+    return (chip->chip_id << 7) | (core_id << 3);
+}
+
+/*
+ *    0:48  Reserved - Read as zeroes
+ *   49:52  Node ID
+ *   53:55  Chip ID
+ *   56     Reserved - Read as zero
+ *   57:61  Core number
+ *   62:63  Thread ID
+ *
+ * We only care about the lower bits. uint32_t is fine for the moment.
+ */
+static uint32_t pnv_chip_core_pir_p9(PnvChip *chip, uint32_t core_id)
+{
+    return (chip->chip_id << 8) | (core_id << 2);
+}
+
 /* Allowed core identifiers on a POWER8 Processor Chip :
  *
  * <EX0 reserved>
@@ -279,6 +305,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
     k->chip_type = PNV_CHIP_POWER8E;
     k->chip_cfam_id = 0x221ef04980000000ull;  /* P8 Murano DD2.1 */
     k->cores_mask = POWER8E_CORE_MASK;
+    k->core_pir = pnv_chip_core_pir_p8;
     dc->desc = "PowerNV Chip POWER8E";
 }
 
@@ -298,6 +325,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
     k->chip_type = PNV_CHIP_POWER8;
     k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */
     k->cores_mask = POWER8_CORE_MASK;
+    k->core_pir = pnv_chip_core_pir_p8;
     dc->desc = "PowerNV Chip POWER8";
 }
 
@@ -317,6 +345,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
     k->chip_type = PNV_CHIP_POWER8NVL;
     k->chip_cfam_id = 0x120d304980000000ull;  /* P8 Naples DD1.0 */
     k->cores_mask = POWER8_CORE_MASK;
+    k->core_pir = pnv_chip_core_pir_p8;
     dc->desc = "PowerNV Chip POWER8NVL";
 }
 
@@ -336,6 +365,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
     k->chip_type = PNV_CHIP_POWER9;
     k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */
     k->cores_mask = POWER9_CORE_MASK;
+    k->core_pir = pnv_chip_core_pir_p9;
     dc->desc = "PowerNV Chip POWER9";
 }
 
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index e084a8c30359..b7987f8208b8 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -58,6 +58,8 @@ typedef struct PnvChipClass {
     PnvChipType  chip_type;
     uint64_t     chip_cfam_id;
     uint64_t     cores_mask;
+
+    uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id);
 } PnvChipClass;
 
 #define TYPE_PNV_CHIP_POWER8E TYPE_PNV_CHIP "-POWER8E"
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 06/17] ppc/pnv: add a PnvCore object
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (4 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 05/17] ppc/pnv: add a PIR handler " Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 07/17] ppc/pnv: add XSCOM infrastructure Cédric Le Goater
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

This is largy inspired by sPAPRCPUCore with some simplification, no
hotplug for instance. A set of PnvCore objects is added to the PnvChip
and the device tree is populated looping on these cores.

Real HW cpu ids are now generated depending on the chip cpu model, the
chip id and a core mask. The id is propagated to the CPU object, using
properties, to set the SPR_PIR (Processor Identification Register)

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---

 I did not introduce a single table to construct both the chip types
 and the corresponding core types yet. Keeping the idea for later as
 there might be other types to construct with P9 support.

 Changes since v4:

 - initialized SPR_PIR from init routine
 - removed SPR_HIOR setting. This is a 970 register.
 - removed extra reset

 Changes since v3:

 - removed the usage of cpu_index
 - removed the setting of the msr_mask
 
 Changes since v2:

 - added P9 support
 - used error_fatal instead of error_abort when setting the chip
   properties
 - replaced num_cores by nr_cores
 - removed gservers properties that were unused on powernv. 
 - used a 'void *' instead of a 'PnvCore *' to hold core Objects of
   potentially different size.
 - qom: linked the core Objects to the chip 
 - moved device tree creation under powernv_populate_chip()
 - added a 'pir' property' for ease of use

 Changes since v1:

 - changed name to PnvCore
 - changed PnvChip core array type to a 'PnvCore *cores'
 - introduced real cpu hw ids using a core mask from the chip
 - reworked powernv_create_core_node() which populates the device tree
 - added missing "ibm,pa-features" property 
 - smp_cpus representing threads, used smp_cores instead to create the
   cores in the chip.
 - removed the use of ppc_get_vcpu_dt_id() 
 - added "POWER8E" and "POWER8NVL" cpu models to exercice the
   PnvChipClass

 hw/ppc/Makefile.objs      |   2 +-
 hw/ppc/pnv.c              | 189 +++++++++++++++++++++++++++++++++++++++++++++-
 hw/ppc/pnv_core.c         | 182 ++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h      |   2 +
 include/hw/ppc/pnv_core.h |  48 ++++++++++++
 5 files changed, 421 insertions(+), 2 deletions(-)
 create mode 100644 hw/ppc/pnv_core.c
 create mode 100644 include/hw/ppc/pnv_core.h

diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs
index 8105db7d5600..f8c7d1db9ade 100644
--- a/hw/ppc/Makefile.objs
+++ b/hw/ppc/Makefile.objs
@@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o
 obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o
 obj-$(CONFIG_PSERIES) += spapr_cpu_core.o
 # IBM PowerNV
-obj-$(CONFIG_POWERNV) += pnv.o
+obj-$(CONFIG_POWERNV) += pnv.o pnv_core.o
 ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy)
 obj-y += spapr_pci_vfio.o
 endif
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 825d28ca75b1..3413107697d3 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -27,6 +27,7 @@
 #include "hw/ppc/fdt.h"
 #include "hw/ppc/ppc.h"
 #include "hw/ppc/pnv.h"
+#include "hw/ppc/pnv_core.h"
 #include "hw/loader.h"
 #include "exec/address-spaces.h"
 #include "qemu/cutils.h"
@@ -75,12 +76,160 @@ static void powernv_populate_memory_node(void *fdt, int chip_id, hwaddr start,
     _FDT((fdt_setprop_cell(fdt, off, "ibm,chip-id", chip_id)));
 }
 
+static int get_cpus_node(void *fdt)
+{
+    int cpus_offset = fdt_path_offset(fdt, "/cpus");
+
+    if (cpus_offset < 0) {
+        cpus_offset = fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"),
+                                      "cpus");
+        if (cpus_offset) {
+            _FDT((fdt_setprop_cell(fdt, cpus_offset, "#address-cells", 0x1)));
+            _FDT((fdt_setprop_cell(fdt, cpus_offset, "#size-cells", 0x0)));
+        }
+    }
+    _FDT(cpus_offset);
+    return cpus_offset;
+}
+
+/*
+ * The PowerNV cores (and threads) need to use real HW ids and not an
+ * incremental index like it has been done on other platforms. This HW
+ * id is stored in the CPU PIR, it is used to create cpu nodes in the
+ * device tree, used in XSCOM to address cores and in interrupt
+ * servers.
+ */
+static void powernv_create_core_node(PnvChip *chip, PnvCore *pc, void *fdt)
+{
+    CPUState *cs = CPU(DEVICE(pc->threads));
+    DeviceClass *dc = DEVICE_GET_CLASS(cs);
+    PowerPCCPU *cpu = POWERPC_CPU(cs);
+    int smt_threads = ppc_get_compat_smt_threads(cpu);
+    CPUPPCState *env = &cpu->env;
+    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
+    uint32_t servers_prop[smt_threads];
+    int i;
+    uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40),
+                       0xffffffff, 0xffffffff};
+    uint32_t tbfreq = PNV_TIMEBASE_FREQ;
+    uint32_t cpufreq = 1000000000;
+    uint32_t page_sizes_prop[64];
+    size_t page_sizes_prop_size;
+    const uint8_t pa_features[] = { 24, 0,
+                                    0xf6, 0x3f, 0xc7, 0xc0, 0x80, 0xf0,
+                                    0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                    0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
+                                    0x80, 0x00, 0x80, 0x00, 0x80, 0x00 };
+    int offset;
+    char *nodename;
+    int cpus_offset = get_cpus_node(fdt);
+
+    nodename = g_strdup_printf("%s@%x", dc->fw_name, pc->pir);
+    offset = fdt_add_subnode(fdt, cpus_offset, nodename);
+    _FDT(offset);
+    g_free(nodename);
+
+    _FDT((fdt_setprop_cell(fdt, offset, "ibm,chip-id", chip->chip_id)));
+
+    _FDT((fdt_setprop_cell(fdt, offset, "reg", pc->pir)));
+    _FDT((fdt_setprop_cell(fdt, offset, "ibm,pir", pc->pir)));
+    _FDT((fdt_setprop_string(fdt, offset, "device_type", "cpu")));
+
+    _FDT((fdt_setprop_cell(fdt, offset, "cpu-version", env->spr[SPR_PVR])));
+    _FDT((fdt_setprop_cell(fdt, offset, "d-cache-block-size",
+                            env->dcache_line_size)));
+    _FDT((fdt_setprop_cell(fdt, offset, "d-cache-line-size",
+                            env->dcache_line_size)));
+    _FDT((fdt_setprop_cell(fdt, offset, "i-cache-block-size",
+                            env->icache_line_size)));
+    _FDT((fdt_setprop_cell(fdt, offset, "i-cache-line-size",
+                            env->icache_line_size)));
+
+    if (pcc->l1_dcache_size) {
+        _FDT((fdt_setprop_cell(fdt, offset, "d-cache-size",
+                               pcc->l1_dcache_size)));
+    } else {
+        error_report("Warning: Unknown L1 dcache size for cpu");
+    }
+    if (pcc->l1_icache_size) {
+        _FDT((fdt_setprop_cell(fdt, offset, "i-cache-size",
+                               pcc->l1_icache_size)));
+    } else {
+        error_report("Warning: Unknown L1 icache size for cpu");
+    }
+
+    _FDT((fdt_setprop_cell(fdt, offset, "timebase-frequency", tbfreq)));
+    _FDT((fdt_setprop_cell(fdt, offset, "clock-frequency", cpufreq)));
+    _FDT((fdt_setprop_cell(fdt, offset, "ibm,slb-size", env->slb_nr)));
+    _FDT((fdt_setprop_string(fdt, offset, "status", "okay")));
+    _FDT((fdt_setprop(fdt, offset, "64-bit", NULL, 0)));
+
+    if (env->spr_cb[SPR_PURR].oea_read) {
+        _FDT((fdt_setprop(fdt, offset, "ibm,purr", NULL, 0)));
+    }
+
+    if (env->mmu_model & POWERPC_MMU_1TSEG) {
+        _FDT((fdt_setprop(fdt, offset, "ibm,processor-segment-sizes",
+                           segs, sizeof(segs))));
+    }
+
+    /* Advertise VMX/VSX (vector extensions) if available
+     *   0 / no property == no vector extensions
+     *   1               == VMX / Altivec available
+     *   2               == VSX available */
+    if (env->insns_flags & PPC_ALTIVEC) {
+        uint32_t vmx = (env->insns_flags2 & PPC2_VSX) ? 2 : 1;
+
+        _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", vmx)));
+    }
+
+    /* Advertise DFP (Decimal Floating Point) if available
+     *   0 / no property == no DFP
+     *   1               == DFP available */
+    if (env->insns_flags2 & PPC2_DFP) {
+        _FDT((fdt_setprop_cell(fdt, offset, "ibm,dfp", 1)));
+    }
+
+    page_sizes_prop_size = ppc_create_page_sizes_prop(env, page_sizes_prop,
+                                                  sizeof(page_sizes_prop));
+    if (page_sizes_prop_size) {
+        _FDT((fdt_setprop(fdt, offset, "ibm,segment-page-sizes",
+                           page_sizes_prop, page_sizes_prop_size)));
+    }
+
+    _FDT((fdt_setprop(fdt, offset, "ibm,pa-features",
+                       pa_features, sizeof(pa_features))));
+
+    if (cpu->cpu_version) {
+        _FDT((fdt_setprop_cell(fdt, offset, "cpu-version", cpu->cpu_version)));
+    }
+
+    /* Build interrupt servers properties */
+    for (i = 0; i < smt_threads; i++) {
+        servers_prop[i] = cpu_to_be32(pc->pir + i);
+    }
+    _FDT((fdt_setprop(fdt, offset, "ibm,ppc-interrupt-server#s",
+                       servers_prop, sizeof(servers_prop))));
+}
+
 static void powernv_populate_chip(PnvChip *chip, void *fdt)
 {
+    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    char *typename = pnv_core_typename(pcc->cpu_model);
+    size_t typesize = object_type_get_instance_size(typename);
+    int i;
+
+    for (i = 0; i < chip->nr_cores; i++) {
+        PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
+
+        powernv_create_core_node(chip, pnv_core, fdt);
+    }
+
     if (chip->ram_size) {
         powernv_populate_memory_node(fdt, chip->chip_id, chip->ram_start,
                                      chip->ram_size);
     }
+    g_free(typename);
 }
 
 static void *powernv_create_fdt(MachineState *machine)
@@ -410,13 +559,51 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
 {
     PnvChip *chip = PNV_CHIP(dev);
     Error *error = NULL;
+    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+    char *typename = pnv_core_typename(pcc->cpu_model);
+    size_t typesize = object_type_get_instance_size(typename);
+    int i, core_hwid;
+
+    if (!object_class_by_name(typename)) {
+        error_setg(errp, "Unable to find PowerNV CPU Core '%s'", typename);
+        return;
+    }
 
-    /* Early checks on the core settings */
+    /* Cores */
     pnv_chip_core_sanitize(chip, &error);
     if (error) {
         error_propagate(errp, error);
         return;
     }
+
+    chip->cores = g_malloc0(typesize * chip->nr_cores);
+
+    for (i = 0, core_hwid = 0; (core_hwid < sizeof(chip->cores_mask) * 8)
+             && (i < chip->nr_cores); core_hwid++) {
+        char core_name[32];
+        void *pnv_core = chip->cores + i * typesize;
+
+        if (!(chip->cores_mask & (1ull << core_hwid))) {
+            continue;
+        }
+
+        object_initialize(pnv_core, typesize, typename);
+        snprintf(core_name, sizeof(core_name), "core[%d]", core_hwid);
+        object_property_add_child(OBJECT(chip), core_name, OBJECT(pnv_core),
+                                  &error_fatal);
+        object_property_set_int(OBJECT(pnv_core), smp_threads, "nr-threads",
+                                &error_fatal);
+        object_property_set_int(OBJECT(pnv_core), core_hwid,
+                                CPU_CORE_PROP_CORE_ID, &error_fatal);
+        object_property_set_int(OBJECT(pnv_core),
+                                pcc->core_pir(chip, core_hwid),
+                                "pir", &error_fatal);
+        object_property_set_bool(OBJECT(pnv_core), true, "realized",
+                                 &error_fatal);
+        object_unref(OBJECT(pnv_core));
+        i++;
+    }
+    g_free(typename);
 }
 
 static Property pnv_chip_properties[] = {
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
new file mode 100644
index 000000000000..04713caa3b24
--- /dev/null
+++ b/hw/ppc/pnv_core.c
@@ -0,0 +1,182 @@
+/*
+ * QEMU PowerPC PowerNV CPU Core model
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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 "sysemu/sysemu.h"
+#include "qapi/error.h"
+#include "target-ppc/cpu.h"
+#include "hw/ppc/ppc.h"
+#include "hw/ppc/pnv.h"
+#include "hw/ppc/pnv_core.h"
+
+static void powernv_cpu_reset(void *opaque)
+{
+    PowerPCCPU *cpu = opaque;
+    CPUState *cs = CPU(cpu);
+    CPUPPCState *env = &cpu->env;
+
+    cpu_reset(cs);
+
+    /*
+     * the skiboot firmware elects a primary thread to initialize the
+     * system and it can be any.
+     */
+    env->gpr[3] = PNV_FDT_ADDR;
+    env->nip = 0x10;
+    env->msr |= MSR_HVB; /* Hypervisor mode */
+}
+
+static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
+{
+    CPUPPCState *env = &cpu->env;
+    int core_pir;
+    int thread_index = 0; /* TODO: TCG supports only one thread */
+    ppc_spr_t *pir = &env->spr_cb[SPR_PIR];
+
+    core_pir = object_property_get_int(OBJECT(cpu), "core-pir", &error_abort);
+
+    /*
+     * The PIR of a thread is the core PIR + the thread index. We will
+     * need to find a way to get the thread index when TCG supports
+     * more than 1. We could use the object name ?
+     */
+    pir->default_value = core_pir + thread_index;
+
+    /* Set time-base frequency to 512 MHz */
+    cpu_ppc_tb_init(env, PNV_TIMEBASE_FREQ);
+
+    qemu_register_reset(powernv_cpu_reset, cpu);
+}
+
+static void pnv_core_realize_child(Object *child, Error **errp)
+{
+    Error *local_err = NULL;
+    CPUState *cs = CPU(child);
+    PowerPCCPU *cpu = POWERPC_CPU(cs);
+
+    object_property_set_bool(child, true, "realized", &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+
+    powernv_cpu_init(cpu, &local_err);
+    if (local_err) {
+        error_propagate(errp, local_err);
+        return;
+    }
+}
+
+static void pnv_core_realize(DeviceState *dev, Error **errp)
+{
+    PnvCore *pc = PNV_CORE(OBJECT(dev));
+    CPUCore *cc = CPU_CORE(OBJECT(dev));
+    PnvCoreClass *pcc = PNV_CORE_GET_CLASS(OBJECT(dev));
+    const char *typename = object_class_get_name(pcc->cpu_oc);
+    size_t size = object_type_get_instance_size(typename);
+    Error *local_err = NULL;
+    void *obj;
+    int i, j;
+    char name[32];
+
+    pc->threads = g_malloc0(size * cc->nr_threads);
+    for (i = 0; i < cc->nr_threads; i++) {
+        obj = pc->threads + i * size;
+
+        object_initialize(obj, size, typename);
+
+        snprintf(name, sizeof(name), "thread[%d]", i);
+        object_property_add_child(OBJECT(pc), name, obj, &local_err);
+        object_property_add_alias(obj, "core-pir", OBJECT(pc),
+                                  "pir", &local_err);
+        if (local_err) {
+            goto err;
+        }
+        object_unref(obj);
+    }
+
+    for (j = 0; j < cc->nr_threads; j++) {
+        obj = pc->threads + j * size;
+
+        pnv_core_realize_child(obj, &local_err);
+        if (local_err) {
+            goto err;
+        }
+    }
+    return;
+
+err:
+    while (--i >= 0) {
+        obj = pc->threads + i * size;
+        object_unparent(obj);
+    }
+    g_free(pc->threads);
+    error_propagate(errp, local_err);
+}
+
+static Property pnv_core_properties[] = {
+    DEFINE_PROP_UINT32("pir", PnvCore, pir, 0),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void pnv_core_class_init(ObjectClass *oc, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(oc);
+    PnvCoreClass *pcc = PNV_CORE_CLASS(oc);
+
+    dc->realize = pnv_core_realize;
+    dc->props = pnv_core_properties;
+    pcc->cpu_oc = cpu_class_by_name(TYPE_POWERPC_CPU, data);
+}
+
+static const TypeInfo pnv_core_info = {
+    .name           = TYPE_PNV_CORE,
+    .parent         = TYPE_CPU_CORE,
+    .instance_size  = sizeof(PnvCore),
+    .class_size     = sizeof(PnvCoreClass),
+    .abstract       = true,
+};
+
+static const char *pnv_core_models[] = {
+    "POWER8E", "POWER8", "POWER8NVL", "POWER9"
+};
+
+static void pnv_core_register_types(void)
+{
+    int i ;
+
+    type_register_static(&pnv_core_info);
+    for (i = 0; i < ARRAY_SIZE(pnv_core_models); ++i) {
+        TypeInfo ti = {
+            .parent = TYPE_PNV_CORE,
+            .instance_size = sizeof(PnvCore),
+            .class_init = pnv_core_class_init,
+            .class_data = (void *) pnv_core_models[i],
+        };
+        ti.name = pnv_core_typename(pnv_core_models[i]);
+        type_register(&ti);
+        g_free((void *)ti.name);
+    }
+}
+
+type_init(pnv_core_register_types)
+
+char *pnv_core_typename(const char *model)
+{
+    return g_strdup_printf(TYPE_PNV_CORE "-%s", model);
+}
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index b7987f8208b8..cec869ce6b59 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -47,6 +47,7 @@ typedef struct PnvChip {
 
     uint32_t     nr_cores;
     uint64_t     cores_mask;
+    void         *cores;
 } PnvChip;
 
 typedef struct PnvChipClass {
@@ -103,5 +104,6 @@ typedef struct PnvMachineState {
 } PnvMachineState;
 
 #define PNV_FDT_ADDR          0x01000000
+#define PNV_TIMEBASE_FREQ     512000000ULL
 
 #endif /* _PPC_PNV_H */
diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h
new file mode 100644
index 000000000000..a151e281c017
--- /dev/null
+++ b/include/hw/ppc/pnv_core.h
@@ -0,0 +1,48 @@
+/*
+ * QEMU PowerPC PowerNV CPU Core model
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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/>.
+ */
+#ifndef _PPC_PNV_CORE_H
+#define _PPC_PNV_CORE_H
+
+#include "hw/cpu/core.h"
+
+#define TYPE_PNV_CORE "powernv-cpu-core"
+#define PNV_CORE(obj) \
+    OBJECT_CHECK(PnvCore, (obj), TYPE_PNV_CORE)
+#define PNV_CORE_CLASS(klass) \
+     OBJECT_CLASS_CHECK(PnvCoreClass, (klass), TYPE_PNV_CORE)
+#define PNV_CORE_GET_CLASS(obj) \
+     OBJECT_GET_CLASS(PnvCoreClass, (obj), TYPE_PNV_CORE)
+
+typedef struct PnvCore {
+    /*< private >*/
+    CPUCore parent_obj;
+
+    /*< public >*/
+    void *threads;
+    uint32_t pir;
+} PnvCore;
+
+typedef struct PnvCoreClass {
+    DeviceClass parent_class;
+    ObjectClass *cpu_oc;
+} PnvCoreClass;
+
+extern char *pnv_core_typename(const char *model);
+
+#endif /* _PPC_PNV_CORE_H */
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 07/17] ppc/pnv: add XSCOM infrastructure
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (5 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 06/17] ppc/pnv: add a PnvCore object Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-25  1:13   ` David Gibson
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 08/17] ppc/pnv: add XSCOM handlers to PnvCore Cédric Le Goater
                   ` (10 subsequent siblings)
  17 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

On a real POWER8 system, the Pervasive Interconnect Bus (PIB) serves
as a backbone to connect different units of the system. The host
firmware connects to the PIB through a bridge unit, the
Alter-Display-Unit (ADU), which gives him access to all the chiplets
on the PCB network (Pervasive Connect Bus), the PIB acting as the root
of this network.

XSCOM (serial communication) is the interface to the sideband bus
provided by the POWER8 pervasive unit to read and write to chiplets
resources. This is needed by the host firmware, OPAL and to a lesser
extent, Linux. This is among others how the PCI Host bridges get
configured at boot or how the LPC bus is accessed.

To represent the ADU of a real system, we introduce a specific
AddressSpace to dispatch XSCOM accesses to the targeted chiplets. The
translation of an XSCOM address into a PCB register address is
slightly different between the P9 and the P8. This is handled before
the dispatch using a 8byte alignment for all.

To customize the device tree, a QOM InterfaceClass, PnvXScomInterface,
is provided with a populate() handler. The chip populates the device
tree by simply looping on its children. Therefore, each model needing
custom nodes should not forget to declare itself as a child at
instantiation time.

Based on previous work done by :
      Benjamin Herrenschmidt <benh@kernel.crashing.org>

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---

 Changes since v4:

 - added helpers to initialize and map the chiplet XSCOM regions
   in the XSCOM address space. This is to hide the '<< 3' shift.

 Changes since v3:

 - reworked the model to dispatch addresses to the memory regions
   using pcb_addr << 3, which is a no-op for the P9. The benefit is
   that all the address translation work can be done before dispatch
   and the conversion handlers in the chip and in the xscom interface
   are gone.
   
 - removed the proxy PnnXscom object and extended the PnvChip object
   with an address space for XSCOM and its associated memory region.
   
 - changed the read/write handlers in the address space to use
   address_space_stq() and address_space_ldq()
   
 - introduced 'fake' default read/write handlers to handle 'core'
   registers. We can add a real device model when more work needs to
   be done under these.
   
 - fixed an issue with the monitor doing read/write in the XSCOM
   address space. When under the monitor, we don't have a cpu to
   update the HMER SPR. That might need more work in the long term.
   
 - introduced a xscom base field to hold the xscom base address as
   it is different on P9

 - renamed the devnode() handler to populate()

 Changes since v2:

 - QOMified the model.
 
 - all mappings in main memory space are now gathered in
   pnv_chip_realize() as done on other architectures.
   
 - removed XScomBus. The parenthood is established through the QOM
   model
   
 - replaced the XScomDevice with an InterfaceClass : PnvXScomInterface. 
 - introduced an XSCOM address space to dispatch accesses to the
   chiplets

 hw/ppc/Makefile.objs       |   2 +-
 hw/ppc/pnv.c               |  25 ++++
 hw/ppc/pnv_xscom.c         | 277 +++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h       |  15 +++
 include/hw/ppc/pnv_xscom.h |  56 +++++++++
 5 files changed, 374 insertions(+), 1 deletion(-)
 create mode 100644 hw/ppc/pnv_xscom.c
 create mode 100644 include/hw/ppc/pnv_xscom.h

diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs
index f8c7d1db9ade..08c213c40684 100644
--- a/hw/ppc/Makefile.objs
+++ b/hw/ppc/Makefile.objs
@@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o
 obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o
 obj-$(CONFIG_PSERIES) += spapr_cpu_core.o
 # IBM PowerNV
-obj-$(CONFIG_POWERNV) += pnv.o pnv_core.o
+obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o
 ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy)
 obj-y += spapr_pci_vfio.o
 endif
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 3413107697d3..96ba36cc272d 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -33,6 +33,8 @@
 #include "qemu/cutils.h"
 #include "qapi/visitor.h"
 
+#include "hw/ppc/pnv_xscom.h"
+
 #include <libfdt.h>
 
 #define FDT_MAX_SIZE            0x00100000
@@ -219,6 +221,8 @@ static void powernv_populate_chip(PnvChip *chip, void *fdt)
     size_t typesize = object_type_get_instance_size(typename);
     int i;
 
+    pnv_xscom_populate(chip, fdt, 0);
+
     for (i = 0; i < chip->nr_cores; i++) {
         PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
 
@@ -455,6 +459,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
     k->chip_cfam_id = 0x221ef04980000000ull;  /* P8 Murano DD2.1 */
     k->cores_mask = POWER8E_CORE_MASK;
     k->core_pir = pnv_chip_core_pir_p8;
+    k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8E";
 }
 
@@ -475,6 +480,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
     k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */
     k->cores_mask = POWER8_CORE_MASK;
     k->core_pir = pnv_chip_core_pir_p8;
+    k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8";
 }
 
@@ -495,6 +501,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
     k->chip_cfam_id = 0x120d304980000000ull;  /* P8 Naples DD1.0 */
     k->cores_mask = POWER8_CORE_MASK;
     k->core_pir = pnv_chip_core_pir_p8;
+    k->xscom_base = 0x003fc0000000000ull;
     dc->desc = "PowerNV Chip POWER8NVL";
 }
 
@@ -515,6 +522,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
     k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */
     k->cores_mask = POWER9_CORE_MASK;
     k->core_pir = pnv_chip_core_pir_p9;
+    k->xscom_base = 0x00603fc00000000ull;
     dc->desc = "PowerNV Chip POWER9";
 }
 
@@ -555,6 +563,14 @@ static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp)
     }
 }
 
+static void pnv_chip_init(Object *obj)
+{
+    PnvChip *chip = PNV_CHIP(obj);
+    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+
+    chip->xscom_base = pcc->xscom_base;
+}
+
 static void pnv_chip_realize(DeviceState *dev, Error **errp)
 {
     PnvChip *chip = PNV_CHIP(dev);
@@ -569,6 +585,14 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
         return;
     }
 
+    /* XSCOM bridge */
+    pnv_xscom_realize(chip, &error);
+    if (error) {
+        error_propagate(errp, error);
+        return;
+    }
+    sysbus_mmio_map(SYS_BUS_DEVICE(chip), 0, PNV_XSCOM_BASE(chip));
+
     /* Cores */
     pnv_chip_core_sanitize(chip, &error);
     if (error) {
@@ -628,6 +652,7 @@ static const TypeInfo pnv_chip_info = {
     .name          = TYPE_PNV_CHIP,
     .parent        = TYPE_SYS_BUS_DEVICE,
     .class_init    = pnv_chip_class_init,
+    .instance_init = pnv_chip_init,
     .class_size    = sizeof(PnvChipClass),
     .abstract      = true,
 };
diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
new file mode 100644
index 000000000000..fcc71d335fc3
--- /dev/null
+++ b/hw/ppc/pnv_xscom.c
@@ -0,0 +1,277 @@
+/*
+ * QEMU PowerPC PowerNV XSCOM bus
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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 "qapi/error.h"
+#include "hw/hw.h"
+#include "qemu/log.h"
+#include "sysemu/kvm.h"
+#include "target-ppc/cpu.h"
+#include "hw/sysbus.h"
+
+#include "hw/ppc/fdt.h"
+#include "hw/ppc/pnv_xscom.h"
+#include "hw/ppc/pnv.h"
+
+#include <libfdt.h>
+
+static void xscom_complete(uint64_t hmer_bits)
+{
+    CPUState *cs = current_cpu;
+
+    /*
+     * TODO: When the read/write comes from the monitor, we do not
+     * have a cpu.
+     */
+    if (cs) {
+        PowerPCCPU *cpu = POWERPC_CPU(cs);
+        CPUPPCState *env = &cpu->env;
+
+        /*
+         * TODO: Need a CPU helper to set HMER, also handle generation
+         * of HMIs
+         */
+        cpu_synchronize_state(cs);
+        env->spr[SPR_HMER] |= hmer_bits;
+    }
+}
+
+static uint32_t pnv_xscom_pcba(PnvChip *chip, uint64_t addr)
+{
+    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+
+    addr &= (PNV_XSCOM_SIZE - 1);
+    if (pcc->chip_type == PNV_CHIP_POWER9) {
+        return addr >> 3;
+    } else {
+        return ((addr >> 4) & ~0xfull) | ((addr >> 3) & 0xf);
+    }
+}
+
+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 0x1010c00:     /* PIBAM FIR */
+    case 0x1010c03:     /* PIBAM FIR MASK */
+    case 0x2020007:     /* ADU stuff */
+    case 0x2020009:     /* ADU stuff */
+    case 0x202000f:     /* ADU stuff */
+        return 0;
+    case 0x2013f00:     /* PBA stuff */
+    case 0x2013f01:     /* PBA stuff */
+    case 0x2013f02:     /* PBA stuff */
+    case 0x2013f03:     /* PBA stuff */
+    case 0x2013f04:     /* PBA stuff */
+    case 0x2013f05:     /* PBA stuff */
+    case 0x2013f06:     /* PBA stuff */
+    case 0x2013f07:     /* PBA stuff */
+        return 0;
+    case 0x2013028:     /* CAPP stuff */
+    case 0x201302a:     /* CAPP stuff */
+    case 0x2013801:     /* CAPP stuff */
+    case 0x2013802:     /* CAPP stuff */
+        return 0;
+    default:
+        return -1;
+    }
+}
+
+static bool xscom_write_default(PnvChip *chip, uint32_t pcba, uint64_t val)
+{
+    /* We ignore writes to these */
+    switch (pcba) {
+    case 0xf000f:       /* chip id is RO */
+    case 0x1010c00:     /* PIBAM FIR */
+    case 0x1010c01:     /* PIBAM FIR */
+    case 0x1010c02:     /* PIBAM FIR */
+    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 */
+        return true;
+    default:
+        return false;
+    }
+}
+
+static uint64_t xscom_read(void *opaque, hwaddr addr, unsigned width)
+{
+    PnvChip *chip = opaque;
+    uint32_t pcba = pnv_xscom_pcba(chip, addr);
+    uint64_t val = 0;
+    MemTxResult result;
+
+    /* Handle some SCOMs here before dispatch */
+    val = xscom_read_default(chip, pcba);
+    if (val != -1) {
+        goto complete;
+    }
+
+    val = address_space_ldq(&chip->xscom_as, pcba << 3, MEMTXATTRS_UNSPECIFIED,
+                            &result);
+    if (result != MEMTX_OK) {
+        qemu_log_mask(LOG_GUEST_ERROR, "XSCOM read failed at @0x%"
+                      HWADDR_PRIx " pcba=0x%08x\n", addr, pcba);
+        xscom_complete(HMER_XSCOM_FAIL | HMER_XSCOM_DONE);
+        return 0;
+    }
+
+complete:
+    xscom_complete(HMER_XSCOM_DONE);
+    return val;
+}
+
+static void xscom_write(void *opaque, hwaddr addr, uint64_t val,
+                        unsigned width)
+{
+    PnvChip *chip = opaque;
+    uint32_t pcba = pnv_xscom_pcba(chip, addr);
+    MemTxResult result;
+
+    /* Handle some SCOMs here before dispatch */
+    if (xscom_write_default(chip, pcba, val)) {
+        goto complete;
+    }
+
+    address_space_stq(&chip->xscom_as, pcba << 3, val, MEMTXATTRS_UNSPECIFIED,
+                      &result);
+    if (result != MEMTX_OK) {
+        qemu_log_mask(LOG_GUEST_ERROR, "XSCOM write failed at @0x%"
+                      HWADDR_PRIx " pcba=0x%08x data=0x%" PRIx64 "\n",
+                      addr, pcba, val);
+        xscom_complete(HMER_XSCOM_FAIL | HMER_XSCOM_DONE);
+        return;
+    }
+
+complete:
+    xscom_complete(HMER_XSCOM_DONE);
+}
+
+const MemoryRegionOps pnv_xscom_ops = {
+    .read = xscom_read,
+    .write = 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,
+};
+
+void pnv_xscom_realize(PnvChip *chip, Error **errp)
+{
+    SysBusDevice *sbd = SYS_BUS_DEVICE(chip);
+    char *name;
+
+    name = g_strdup_printf("xscom-%x", chip->chip_id);
+    memory_region_init_io(&chip->xscom_mmio, OBJECT(chip), &pnv_xscom_ops,
+                          chip, name, PNV_XSCOM_SIZE);
+    sysbus_init_mmio(sbd, &chip->xscom_mmio);
+
+    memory_region_init(&chip->xscom, OBJECT(chip), name, PNV_XSCOM_SIZE);
+    address_space_init(&chip->xscom_as, &chip->xscom, name);
+    g_free(name);
+}
+
+static const TypeInfo pnv_xscom_interface_info = {
+    .name = TYPE_PNV_XSCOM_INTERFACE,
+    .parent = TYPE_INTERFACE,
+    .class_size = sizeof(PnvXScomInterfaceClass),
+};
+
+static void pnv_xscom_register_types(void)
+{
+    type_register_static(&pnv_xscom_interface_info);
+}
+
+type_init(pnv_xscom_register_types)
+
+typedef struct ForeachPopulateArgs {
+    void *fdt;
+    int xscom_offset;
+} ForeachPopulateArgs;
+
+static int xscom_populate_child(Object *child, void *opaque)
+{
+    if (object_dynamic_cast(child, TYPE_PNV_XSCOM_INTERFACE)) {
+        ForeachPopulateArgs *args = opaque;
+        PnvXScomInterface *xd = PNV_XSCOM_INTERFACE(child);
+        PnvXScomInterfaceClass *xc = PNV_XSCOM_INTERFACE_GET_CLASS(xd);
+
+        if (xc->populate) {
+            _FDT((xc->populate(xd, args->fdt, args->xscom_offset)));
+        }
+    }
+    return 0;
+}
+
+static const char compat_p8[] = "ibm,power8-xscom\0ibm,xscom";
+static const char compat_p9[] = "ibm,power9-xscom\0ibm,xscom";
+
+int pnv_xscom_populate(PnvChip *chip, void *fdt, int root_offset)
+{
+    uint64_t reg[] = { cpu_to_be64(PNV_XSCOM_BASE(chip)),
+                       cpu_to_be64(PNV_XSCOM_SIZE) };
+    int xscom_offset;
+    ForeachPopulateArgs args;
+    char *name;
+    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+
+    name = g_strdup_printf("xscom@%" PRIx64, be64_to_cpu(reg[0]));
+    xscom_offset = fdt_add_subnode(fdt, root_offset, name);
+    _FDT(xscom_offset);
+    g_free(name);
+    _FDT((fdt_setprop_cell(fdt, xscom_offset, "ibm,chip-id", chip->chip_id)));
+    _FDT((fdt_setprop_cell(fdt, xscom_offset, "#address-cells", 1)));
+    _FDT((fdt_setprop_cell(fdt, xscom_offset, "#size-cells", 1)));
+    _FDT((fdt_setprop(fdt, xscom_offset, "reg", reg, sizeof(reg))));
+
+    if (pcc->chip_type == PNV_CHIP_POWER9) {
+        _FDT((fdt_setprop(fdt, xscom_offset, "compatible", compat_p9,
+                          sizeof(compat_p9))));
+    } else {
+        _FDT((fdt_setprop(fdt, xscom_offset, "compatible", compat_p8,
+                          sizeof(compat_p8))));
+    }
+
+    _FDT((fdt_setprop(fdt, xscom_offset, "scom-controller", NULL, 0)));
+
+    args.fdt = fdt;
+    args.xscom_offset = xscom_offset;
+
+    object_child_foreach(OBJECT(chip), xscom_populate_child, &args);
+    return 0;
+}
+
+void pnv_xscom_add_subregion(PnvChip *chip, hwaddr offset, MemoryRegion *mr)
+{
+    memory_region_add_subregion(&chip->xscom, offset << 3, mr);
+}
+
+void pnv_xscom_region_init(MemoryRegion *mr,
+                           struct Object *owner,
+                           const MemoryRegionOps *ops,
+                           void *opaque,
+                           const char *name,
+                           uint64_t size)
+{
+    memory_region_init_io(mr, owner, ops, opaque, name, size << 3);
+}
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index cec869ce6b59..7db922e285c0 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -21,6 +21,7 @@
 
 #include "hw/boards.h"
 #include "hw/sysbus.h"
+#include "hw/ppc/pnv_xscom.h"
 
 #define TYPE_PNV_CHIP "powernv-chip"
 #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
@@ -48,6 +49,11 @@ typedef struct PnvChip {
     uint32_t     nr_cores;
     uint64_t     cores_mask;
     void         *cores;
+
+    hwaddr       xscom_base;
+    MemoryRegion xscom_mmio;
+    MemoryRegion xscom;
+    AddressSpace xscom_as;
 } PnvChip;
 
 typedef struct PnvChipClass {
@@ -60,6 +66,8 @@ typedef struct PnvChipClass {
     uint64_t     chip_cfam_id;
     uint64_t     cores_mask;
 
+    hwaddr       xscom_base;
+
     uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id);
 } PnvChipClass;
 
@@ -106,4 +114,11 @@ typedef struct PnvMachineState {
 #define PNV_FDT_ADDR          0x01000000
 #define PNV_TIMEBASE_FREQ     512000000ULL
 
+/*
+ * POWER8 MMIO base addresses
+ */
+#define PNV_XSCOM_SIZE        0x800000000ull
+#define PNV_XSCOM_BASE(chip)                                            \
+    (chip->xscom_base + ((uint64_t)(chip)->chip_id) * PNV_XSCOM_SIZE)
+
 #endif /* _PPC_PNV_H */
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
new file mode 100644
index 000000000000..ee25ec455e3f
--- /dev/null
+++ b/include/hw/ppc/pnv_xscom.h
@@ -0,0 +1,56 @@
+/*
+ * QEMU PowerPC PowerNV XSCOM bus definitions
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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/>.
+ */
+#ifndef _PPC_PNV_XSCOM_H
+#define _PPC_PNV_XSCOM_H
+
+#include "qom/object.h"
+
+typedef struct PnvChip PnvChip;
+
+typedef struct PnvXScomInterface {
+    Object parent;
+} PnvXScomInterface;
+
+#define TYPE_PNV_XSCOM_INTERFACE "pnv-xscom-interface"
+#define PNV_XSCOM_INTERFACE(obj) \
+     OBJECT_CHECK(PnvXScomInterface, (obj), TYPE_PNV_XSCOM_INTERFACE)
+#define PNV_XSCOM_INTERFACE_CLASS(klass)                \
+    OBJECT_CLASS_CHECK(PnvXScomInterfaceClass, (klass), \
+                       TYPE_PNV_XSCOM_INTERFACE)
+#define PNV_XSCOM_INTERFACE_GET_CLASS(obj) \
+     OBJECT_GET_CLASS(PnvXScomInterfaceClass, (obj), TYPE_PNV_XSCOM_INTERFACE)
+
+typedef struct PnvXScomInterfaceClass {
+    InterfaceClass parent;
+    int (*populate)(PnvXScomInterface *dev, void *fdt, int offset);
+} PnvXScomInterfaceClass;
+
+extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
+extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
+
+extern void pnv_xscom_add_subregion(PnvChip *chip, hwaddr offset,
+                                    MemoryRegion *mr);
+extern void pnv_xscom_region_init(MemoryRegion *mr,
+                                  struct Object *owner,
+                                  const MemoryRegionOps *ops,
+                                  void *opaque,
+                                  const char *name,
+                                  uint64_t size);
+
+#endif /* _PPC_PNV_XSCOM_H */
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 08/17] ppc/pnv: add XSCOM handlers to PnvCore
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (6 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 07/17] ppc/pnv: add XSCOM infrastructure Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-25  1:14   ` David Gibson
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 09/17] ppc/pnv: add a LPC controller Cédric Le Goater
                   ` (9 subsequent siblings)
  17 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

Now that we are using real HW ids for the cores in PowerNV chips, we
can route the XSCOM accesses to them. We just need to attach a
specific XSCOM memory region to each core in the appropriate window
for the core number.

To start with, let's install the DTS (Digital Thermal Sensor) handlers
which should return 38°C for each core.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---

 Changes since v4:

 - used the helpers for the XSCOM region 

 Changes since v3:

 - moved to new XSCOM model
 - kept the write op on the XSCOM memory region for later use

 Changes since v2:

 - added a XSCOM memory region to handle access to the EX core
   registers   
 - extended the PnvCore object with a XSCOM_INTERFACE so that we can
   use pnv_xscom_pcba() and pnv_xscom_addr() to handle XSCOM address
   translation.

 hw/ppc/pnv.c               |  4 ++++
 hw/ppc/pnv_core.c          | 50 ++++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv_core.h  |  2 ++
 include/hw/ppc/pnv_xscom.h | 19 ++++++++++++++++++
 4 files changed, 75 insertions(+)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 96ba36cc272d..df55a89cb951 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -625,6 +625,10 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
         object_property_set_bool(OBJECT(pnv_core), true, "realized",
                                  &error_fatal);
         object_unref(OBJECT(pnv_core));
+
+        /* Each core has an XSCOM MMIO region */
+        pnv_xscom_add_subregion(chip, PNV_XSCOM_EX_CORE_BASE(core_hwid),
+                                &PNV_CORE(pnv_core)->xscom_regs);
         i++;
     }
     g_free(typename);
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 04713caa3b24..2acda9637db5 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -19,6 +19,7 @@
 #include "qemu/osdep.h"
 #include "sysemu/sysemu.h"
 #include "qapi/error.h"
+#include "qemu/log.h"
 #include "target-ppc/cpu.h"
 #include "hw/ppc/ppc.h"
 #include "hw/ppc/pnv.h"
@@ -63,6 +64,51 @@ static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
     qemu_register_reset(powernv_cpu_reset, cpu);
 }
 
+/*
+ * These values are read by the PowerNV HW monitors under Linux
+ */
+#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)
+{
+    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;
+    default:
+        qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx,
+                  addr);
+    }
+
+    return val;
+}
+
+static void pnv_core_xscom_write(void *opaque, hwaddr addr, uint64_t val,
+                                 unsigned int width)
+{
+    qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx,
+                  addr);
+}
+
+static const MemoryRegionOps pnv_core_xscom_ops = {
+    .read = pnv_core_xscom_read,
+    .write = pnv_core_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_core_realize_child(Object *child, Error **errp)
 {
     Error *local_err = NULL;
@@ -118,6 +164,10 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
             goto err;
         }
     }
+
+    snprintf(name, sizeof(name), "xscom-core.%d", cc->core_id);
+    pnv_xscom_region_init(&pc->xscom_regs, OBJECT(dev), &pnv_core_xscom_ops,
+                          pc, name, PNV_XSCOM_EX_CORE_SIZE);
     return;
 
 err:
diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h
index a151e281c017..2955a41c901f 100644
--- a/include/hw/ppc/pnv_core.h
+++ b/include/hw/ppc/pnv_core.h
@@ -36,6 +36,8 @@ typedef struct PnvCore {
     /*< public >*/
     void *threads;
     uint32_t pir;
+
+    MemoryRegion xscom_regs;
 } PnvCore;
 
 typedef struct PnvCoreClass {
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index ee25ec455e3f..5da6e92e698c 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -41,6 +41,25 @@ typedef struct PnvXScomInterfaceClass {
     int (*populate)(PnvXScomInterface *dev, void *fdt, int offset);
 } PnvXScomInterfaceClass;
 
+/*
+ * Layout of the XSCOM PCB addresses of EX core 1
+ *
+ *   GPIO        0x1100xxxx
+ *   SCOM        0x1101xxxx
+ *   OHA         0x1102xxxx
+ *   CLOCK CTL   0x1103xxxx
+ *   FIR         0x1104xxxx
+ *   THERM       0x1105xxxx
+ *   <reserved>  0x1106xxxx
+ *               ..
+ *               0x110Exxxx
+ *   PCB SLAVE   0x110Fxxxx
+ */
+
+#define PNV_XSCOM_EX_BASE         0x10000000
+#define PNV_XSCOM_EX_CORE_BASE(i) (PNV_XSCOM_EX_BASE | (((uint64_t)i) << 24))
+#define PNV_XSCOM_EX_CORE_SIZE    0x100000
+
 extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
 extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
 
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 09/17] ppc/pnv: add a LPC controller
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (7 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 08/17] ppc/pnv: add XSCOM handlers to PnvCore Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 10/17] ppc/pnv: add a ISA bus Cédric Le Goater
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

The LPC (Low Pin Count) interface on a POWER8 is made accessible to
the system through the ADU (XSCOM interface). This interface is part
of set of units connected together via a local OPB (On-Chip Peripheral
Bus) which act as a bridge between the ADU and the off chip LPC
endpoints, like external flash modules.

The most important units of this OPB are :
 - OPB Master: contains the ADU slave logic, a set of internal
   registers and the logic to control the OPB.
 - LPCHC (LPC HOST Controller): which implements a OPB Slave, a set of
   internal registers and the LPC HOST Controller to control the LPC
   interface.

Four address spaces are provided to the ADU :
 - LPC Bus Firmware Memory
 - LPC Bus Memory
 - LPC Bus I/O (ISA bus)
 - and the registers for the OPB Master and the LPC Host Controller

On POWER8, an intermediate hop is necessary to reach the OPB, through
a unit called the ECCB. OPB commands are simply mangled in ECCB write
commands.

On POWER9, the OPB master address space can be accessed via MMIO. The
logic is same but the code will be simpler as the XSCOM and ECCB hops
are not necessary anymore.

This version of the LPC controller model doesn't yet implement support
for the SerIRQ deserializer present in the Naples version of the chip
though some preliminary work is there.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[clg: - updated for qemu-2.7
      - ported on latest PowerNV patchset
      - changed the XSCOM interface to fit new model
      - QOMified the model
      - moved the ISA hunks in another patch
      - removed printf logging
      - added a couple of UNIMP logging
      - rewrote commit log ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---

 Todo:

 - rework the address_space read/write ops as they should be shared
   with the P9 support.

 Changes since v4:

 - used the helpers for the XSCOM region 

 Changes since v3:

 - rewrote commit log
 - fixed appendprop
 
 hw/ppc/Makefile.objs       |   2 +-
 hw/ppc/pnv.c               |   8 +
 hw/ppc/pnv_lpc.c           | 471 +++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h       |   3 +
 include/hw/ppc/pnv_lpc.h   |  67 +++++++
 include/hw/ppc/pnv_xscom.h |   3 +
 6 files changed, 553 insertions(+), 1 deletion(-)
 create mode 100644 hw/ppc/pnv_lpc.c
 create mode 100644 include/hw/ppc/pnv_lpc.h

diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs
index 08c213c40684..ebc72af0a7c6 100644
--- a/hw/ppc/Makefile.objs
+++ b/hw/ppc/Makefile.objs
@@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o
 obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o
 obj-$(CONFIG_PSERIES) += spapr_cpu_core.o
 # IBM PowerNV
-obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o
+obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o
 ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy)
 obj-y += spapr_pci_vfio.o
 endif
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index df55a89cb951..aa712fd6f5d2 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -569,6 +569,9 @@ static void pnv_chip_init(Object *obj)
     PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
 
     chip->xscom_base = pcc->xscom_base;
+
+    object_initialize(&chip->lpc, sizeof(chip->lpc), TYPE_PNV_LPC);
+    object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), NULL);
 }
 
 static void pnv_chip_realize(DeviceState *dev, Error **errp)
@@ -632,6 +635,11 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
         i++;
     }
     g_free(typename);
+
+    /* Create LPC controller */
+    object_property_set_bool(OBJECT(&chip->lpc), true, "realized",
+                             &error_fatal);
+    pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip->lpc.xscom_regs);
 }
 
 static Property pnv_chip_properties[] = {
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
new file mode 100644
index 000000000000..00dbd8b07b38
--- /dev/null
+++ b/hw/ppc/pnv_lpc.c
@@ -0,0 +1,471 @@
+/*
+ * QEMU PowerPC PowerNV LPC controller
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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 "sysemu/sysemu.h"
+#include "target-ppc/cpu.h"
+#include "qapi/error.h"
+#include "qemu/log.h"
+
+#include "hw/ppc/pnv_lpc.h"
+#include "hw/ppc/pnv.h"
+#include "hw/ppc/fdt.h"
+
+#include <libfdt.h>
+
+enum {
+    ECCB_CTL    = 0,
+    ECCB_RESET  = 1,
+    ECCB_STAT   = 2,
+    ECCB_DATA   = 3,
+};
+
+/* OPB Master LS registers */
+#define OPB_MASTER_LS_IRQ_STAT  0x50
+#define   OPB_MASTER_IRQ_LPC            0x00000800
+#define OPB_MASTER_LS_IRQ_MASK  0x54
+#define OPB_MASTER_LS_IRQ_POL   0x58
+#define OPB_MASTER_LS_IRQ_INPUT 0x5c
+
+/* LPC HC registers */
+#define LPC_HC_FW_SEG_IDSEL     0x24
+#define LPC_HC_FW_RD_ACC_SIZE   0x28
+#define   LPC_HC_FW_RD_1B               0x00000000
+#define   LPC_HC_FW_RD_2B               0x01000000
+#define   LPC_HC_FW_RD_4B               0x02000000
+#define   LPC_HC_FW_RD_16B              0x04000000
+#define   LPC_HC_FW_RD_128B             0x07000000
+#define LPC_HC_IRQSER_CTRL      0x30
+#define   LPC_HC_IRQSER_EN              0x80000000
+#define   LPC_HC_IRQSER_QMODE           0x40000000
+#define   LPC_HC_IRQSER_START_MASK      0x03000000
+#define   LPC_HC_IRQSER_START_4CLK      0x00000000
+#define   LPC_HC_IRQSER_START_6CLK      0x01000000
+#define   LPC_HC_IRQSER_START_8CLK      0x02000000
+#define LPC_HC_IRQMASK          0x34    /* same bit defs as LPC_HC_IRQSTAT */
+#define LPC_HC_IRQSTAT          0x38
+#define   LPC_HC_IRQ_SERIRQ0            0x80000000 /* all bits down to ... */
+#define   LPC_HC_IRQ_SERIRQ16           0x00008000 /* IRQ16=IOCHK#, IRQ2=SMI# */
+#define   LPC_HC_IRQ_SERIRQ_ALL         0xffff8000
+#define   LPC_HC_IRQ_LRESET             0x00000400
+#define   LPC_HC_IRQ_SYNC_ABNORM_ERR    0x00000080
+#define   LPC_HC_IRQ_SYNC_NORESP_ERR    0x00000040
+#define   LPC_HC_IRQ_SYNC_NORM_ERR      0x00000020
+#define   LPC_HC_IRQ_SYNC_TIMEOUT_ERR   0x00000010
+#define   LPC_HC_IRQ_SYNC_TARG_TAR_ERR  0x00000008
+#define   LPC_HC_IRQ_SYNC_BM_TAR_ERR    0x00000004
+#define   LPC_HC_IRQ_SYNC_BM0_REQ       0x00000002
+#define   LPC_HC_IRQ_SYNC_BM1_REQ       0x00000001
+#define LPC_HC_ERROR_ADDRESS    0x40
+
+#define LPC_OPB_SIZE            0x100000000ull
+
+#define ISA_IO_SIZE             0x00010000
+#define ISA_MEM_SIZE            0x10000000
+#define LPC_IO_OPB_ADDR         0xd0010000
+#define LPC_IO_OPB_SIZE         0x00010000
+#define LPC_MEM_OPB_ADDR        0xe0010000
+#define LPC_MEM_OPB_SIZE        0x10000000
+#define LPC_FW_OPB_ADDR         0xf0000000
+#define LPC_FW_OPB_SIZE         0x10000000
+
+#define LPC_OPB_REGS_OPB_ADDR   0xc0010000
+#define LPC_OPB_REGS_OPB_SIZE   0x00002000
+#define LPC_HC_REGS_OPB_ADDR    0xc0012000
+#define LPC_HC_REGS_OPB_SIZE    0x00001000
+
+
+/*
+ * TODO: the "primary" cell should only be added on chip 0. This is
+ * how skiboot chooses the default LPC controller on multichip
+ * systems.
+ *
+ * It would be easly done if we can change the populate() interface to
+ * replace the PnvXScomInterface parameter by a PnvChip one
+ */
+static int pnv_lpc_populate(PnvXScomInterface *dev, void *fdt, int xscom_offset)
+{
+    const char compat[] = "ibm,power8-lpc\0ibm,lpc";
+    char *name;
+    int offset;
+    uint32_t lpc_pcba = PNV_XSCOM_LPC_BASE;
+    uint32_t reg[] = {
+        cpu_to_be32(lpc_pcba),
+        cpu_to_be32(PNV_XSCOM_LPC_SIZE)
+    };
+
+    name = g_strdup_printf("isa@%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_cell(fdt, offset, "#address-cells", 2)));
+    _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1)));
+    _FDT((fdt_setprop(fdt, offset, "primary", NULL, 0)));
+    _FDT((fdt_setprop(fdt, offset, "compatible", compat, sizeof(compat))));
+    return 0;
+}
+
+/*
+ * These read/write handlers of the OPB address space should be common
+ * with the P9 LPC Controller which uses direct MMIOs.
+ *
+ * TODO: rework to use address_space_stq() and address_space_ldq()
+ * instead.
+ */
+static bool opb_read(PnvLpcController *lpc, uint32_t addr, uint8_t *data,
+                     int sz)
+{
+    bool success;
+
+    /* XXX Handle access size limits and FW read caching here */
+    success = !address_space_rw(&lpc->opb_as, addr, MEMTXATTRS_UNSPECIFIED,
+                                data, sz, false);
+
+    return success;
+}
+
+static bool opb_write(PnvLpcController *lpc, uint32_t addr, uint8_t *data,
+                      int sz)
+{
+    bool success;
+
+    /* XXX Handle access size limits here */
+    success = !address_space_rw(&lpc->opb_as, addr, MEMTXATTRS_UNSPECIFIED,
+                                data, sz, true);
+
+    return success;
+}
+
+#define ECCB_CTL_READ           (1ull << (63 - 15))
+#define ECCB_CTL_SZ_LSH         (63 - 7)
+#define ECCB_CTL_SZ_MASK        (0xfull << ECCB_CTL_SZ_LSH)
+#define ECCB_CTL_ADDR_MASK      0xffffffffu;
+
+#define ECCB_STAT_OP_DONE       (1ull << (63 - 52))
+#define ECCB_STAT_OP_ERR        (1ull << (63 - 52))
+#define ECCB_STAT_RD_DATA_LSH   (63 - 37)
+#define ECCB_STAT_RD_DATA_MASK  (0xffffffff << ECCB_STAT_RD_DATA_LSH)
+
+static void pnv_lpc_do_eccb(PnvLpcController *lpc, uint64_t cmd)
+{
+    /* XXX Check for magic bits at the top, addr size etc... */
+    unsigned int sz = (cmd & ECCB_CTL_SZ_MASK) >> ECCB_CTL_SZ_LSH;
+    uint32_t opb_addr = cmd & ECCB_CTL_ADDR_MASK;
+    uint8_t data[4];
+    bool success;
+
+    if (cmd & ECCB_CTL_READ) {
+        success = opb_read(lpc, opb_addr, data, sz);
+        if (success) {
+            lpc->eccb_stat_reg = ECCB_STAT_OP_DONE |
+                    (((uint64_t)data[0]) << 24 |
+                     ((uint64_t)data[1]) << 16 |
+                     ((uint64_t)data[2]) <<  8 |
+                     ((uint64_t)data[3])) << ECCB_STAT_RD_DATA_LSH;
+        } else {
+            lpc->eccb_stat_reg = ECCB_STAT_OP_DONE |
+                    (0xffffffffull << ECCB_STAT_RD_DATA_LSH);
+        }
+    } else {
+        data[0] = lpc->eccb_data_reg >> 24;
+        data[1] = lpc->eccb_data_reg >> 16;
+        data[2] = lpc->eccb_data_reg >>  8;
+        data[3] = lpc->eccb_data_reg;
+
+        success = opb_write(lpc, opb_addr, data, sz);
+        lpc->eccb_stat_reg = ECCB_STAT_OP_DONE;
+    }
+    /* XXX Which error bit (if any) to signal OPB error ? */
+}
+
+static uint64_t pnv_lpc_xscom_read(void *opaque, hwaddr addr, unsigned size)
+{
+    PnvLpcController *lpc = PNV_LPC(opaque);
+    uint32_t offset = addr >> 3;
+    uint64_t val = 0;
+
+    switch (offset & 3) {
+    case ECCB_CTL:
+    case ECCB_RESET:
+        val = 0;
+        break;
+    case ECCB_STAT:
+        val = lpc->eccb_stat_reg;
+        lpc->eccb_stat_reg = 0;
+        break;
+    case ECCB_DATA:
+        val = ((uint64_t)lpc->eccb_data_reg) << 32;
+        break;
+    }
+    return val;
+}
+
+static void pnv_lpc_xscom_write(void *opaque, hwaddr addr,
+                                uint64_t val, unsigned size)
+{
+    PnvLpcController *lpc = PNV_LPC(opaque);
+    uint32_t offset = addr >> 3;
+
+    switch (offset & 3) {
+    case ECCB_CTL:
+        pnv_lpc_do_eccb(lpc, val);
+        break;
+    case ECCB_RESET:
+        /*  XXXX  */
+        break;
+    case ECCB_STAT:
+        break;
+    case ECCB_DATA:
+        lpc->eccb_data_reg = val >> 32;
+        break;
+    }
+}
+
+static const MemoryRegionOps pnv_lpc_xscom_ops = {
+    .read = pnv_lpc_xscom_read,
+    .write = pnv_lpc_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 uint64_t lpc_hc_read(void *opaque, hwaddr addr, unsigned size)
+{
+    PnvLpcController *lpc = opaque;
+    uint64_t val = 0xfffffffffffffffful;
+
+    switch (addr) {
+    case LPC_HC_FW_SEG_IDSEL:
+        val =  lpc->lpc_hc_fw_seg_idsel;
+        break;
+    case LPC_HC_FW_RD_ACC_SIZE:
+        val =  lpc->lpc_hc_fw_rd_acc_size;
+        break;
+    case LPC_HC_IRQSER_CTRL:
+        val =  lpc->lpc_hc_irqser_ctrl;
+        break;
+    case LPC_HC_IRQMASK:
+        val =  lpc->lpc_hc_irqmask;
+        break;
+    case LPC_HC_IRQSTAT:
+        val =  lpc->lpc_hc_irqstat;
+        break;
+    case LPC_HC_ERROR_ADDRESS:
+        val =  lpc->lpc_hc_error_addr;
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: Ox%"
+                      HWADDR_PRIx "\n", addr);
+    }
+    return val;
+}
+
+static void lpc_hc_write(void *opaque, hwaddr addr, uint64_t val,
+                         unsigned size)
+{
+    PnvLpcController *lpc = opaque;
+
+    /* XXX Filter out reserved bits */
+
+    switch (addr) {
+    case LPC_HC_FW_SEG_IDSEL:
+        /* XXX Actually figure out how that works as this impact
+         * memory regions/aliases
+         */
+        lpc->lpc_hc_fw_seg_idsel = val;
+        break;
+    case LPC_HC_FW_RD_ACC_SIZE:
+        lpc->lpc_hc_fw_rd_acc_size = val;
+        break;
+    case LPC_HC_IRQSER_CTRL:
+        lpc->lpc_hc_irqser_ctrl = val;
+        break;
+    case LPC_HC_IRQMASK:
+        lpc->lpc_hc_irqmask = val;
+        break;
+    case LPC_HC_IRQSTAT:
+        lpc->lpc_hc_irqstat &= ~val;
+        break;
+    case LPC_HC_ERROR_ADDRESS:
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: Ox%"
+                      HWADDR_PRIx "\n", addr);
+    }
+}
+
+static const MemoryRegionOps lpc_hc_ops = {
+    .read = lpc_hc_read,
+    .write = lpc_hc_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 4,
+        .max_access_size = 4,
+    },
+    .impl = {
+        .min_access_size = 4,
+        .max_access_size = 4,
+    },
+};
+
+static uint64_t opb_master_read(void *opaque, hwaddr addr, unsigned size)
+{
+    PnvLpcController *lpc = opaque;
+    uint64_t val = 0xfffffffffffffffful;
+
+    switch (addr) {
+    case OPB_MASTER_LS_IRQ_STAT:
+        val = lpc->opb_irq_stat;
+        break;
+    case OPB_MASTER_LS_IRQ_MASK:
+        val = lpc->opb_irq_mask;
+        break;
+    case OPB_MASTER_LS_IRQ_POL:
+        val = lpc->opb_irq_pol;
+        break;
+    case OPB_MASTER_LS_IRQ_INPUT:
+        val = lpc->opb_irq_input;
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "OPB MASTER Unimplemented register: Ox%"
+                      HWADDR_PRIx "\n", addr);
+    }
+
+    return val;
+}
+
+static void opb_master_write(void *opaque, hwaddr addr,
+                             uint64_t val, unsigned size)
+{
+    PnvLpcController *lpc = opaque;
+
+    switch (addr) {
+    case OPB_MASTER_LS_IRQ_STAT:
+        lpc->opb_irq_stat &= ~val;
+        break;
+    case OPB_MASTER_LS_IRQ_MASK:
+        /* XXX Filter out reserved bits */
+        lpc->opb_irq_mask = val;
+        break;
+    case OPB_MASTER_LS_IRQ_POL:
+        /* XXX Filter out reserved bits */
+        lpc->opb_irq_pol = val;
+        break;
+    case OPB_MASTER_LS_IRQ_INPUT:
+        /* Read only */
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "OPB MASTER Unimplemented register: Ox%"
+                      HWADDR_PRIx "\n", addr);
+    }
+}
+
+static const MemoryRegionOps opb_master_ops = {
+    .read = opb_master_read,
+    .write = opb_master_write,
+    .endianness = DEVICE_BIG_ENDIAN,
+    .valid = {
+        .min_access_size = 4,
+        .max_access_size = 4,
+    },
+    .impl = {
+        .min_access_size = 4,
+        .max_access_size = 4,
+    },
+};
+
+static void pnv_lpc_realize(DeviceState *dev, Error **errp)
+{
+    PnvLpcController *lpc = PNV_LPC(dev);
+
+    /* Reg inits */
+    lpc->lpc_hc_fw_rd_acc_size = LPC_HC_FW_RD_4B;
+
+    /* Create address space and backing MR for the OPB bus */
+    memory_region_init(&lpc->opb_mr, OBJECT(dev), "lpc-opb", 0x100000000ull);
+    address_space_init(&lpc->opb_as, &lpc->opb_mr, "lpc-opb");
+
+    /* Create ISA IO and Mem space regions which are the root of
+     * the ISA bus (ie, ISA address spaces). We don't create a
+     * separate one for FW which we alias to memory.
+     */
+    memory_region_init(&lpc->isa_io, OBJECT(dev), "isa-io", ISA_IO_SIZE);
+    memory_region_init(&lpc->isa_mem, OBJECT(dev), "isa-mem", ISA_MEM_SIZE);
+
+    /* Create windows from the OPB space to the ISA space */
+    memory_region_init_alias(&lpc->opb_isa_io, OBJECT(dev), "lpc-isa-io",
+                             &lpc->isa_io, 0, LPC_IO_OPB_SIZE);
+    memory_region_add_subregion(&lpc->opb_mr, LPC_IO_OPB_ADDR,
+                                &lpc->opb_isa_io);
+    memory_region_init_alias(&lpc->opb_isa_mem, OBJECT(dev), "lpc-isa-mem",
+                             &lpc->isa_mem, 0, LPC_MEM_OPB_SIZE);
+    memory_region_add_subregion(&lpc->opb_mr, LPC_MEM_OPB_ADDR,
+                                &lpc->opb_isa_mem);
+    memory_region_init_alias(&lpc->opb_isa_fw, OBJECT(dev), "lpc-isa-fw",
+                             &lpc->isa_mem, 0, LPC_FW_OPB_SIZE);
+    memory_region_add_subregion(&lpc->opb_mr, LPC_FW_OPB_ADDR,
+                                &lpc->opb_isa_fw);
+
+    /* Create MMIO regions for LPC HC and OPB registers */
+    memory_region_init_io(&lpc->opb_master_regs, OBJECT(dev), &opb_master_ops,
+                          lpc, "lpc-opb-master", LPC_OPB_REGS_OPB_SIZE);
+    memory_region_add_subregion(&lpc->opb_mr, LPC_OPB_REGS_OPB_ADDR,
+                                &lpc->opb_master_regs);
+    memory_region_init_io(&lpc->lpc_hc_regs, OBJECT(dev), &lpc_hc_ops, lpc,
+                          "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);
+}
+
+static void pnv_lpc_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
+
+    xdc->populate = pnv_lpc_populate;
+
+    dc->realize = pnv_lpc_realize;
+}
+
+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 },
+        { }
+    }
+};
+
+static void pnv_lpc_register_types(void)
+{
+    type_register_static(&pnv_lpc_info);
+}
+
+type_init(pnv_lpc_register_types)
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 7db922e285c0..ce16e47724ef 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -22,6 +22,7 @@
 #include "hw/boards.h"
 #include "hw/sysbus.h"
 #include "hw/ppc/pnv_xscom.h"
+#include "hw/ppc/pnv_lpc.h"
 
 #define TYPE_PNV_CHIP "powernv-chip"
 #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
@@ -54,6 +55,8 @@ typedef struct PnvChip {
     MemoryRegion xscom_mmio;
     MemoryRegion xscom;
     AddressSpace xscom_as;
+
+    PnvLpcController lpc;
 } PnvChip;
 
 typedef struct PnvChipClass {
diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h
new file mode 100644
index 000000000000..38e5506975aa
--- /dev/null
+++ b/include/hw/ppc/pnv_lpc.h
@@ -0,0 +1,67 @@
+/*
+ * QEMU PowerPC PowerNV LPC controller
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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/>.
+ */
+#ifndef _PPC_PNV_LPC_H
+#define _PPC_PNV_LPC_H
+
+#define TYPE_PNV_LPC "pnv-lpc"
+#define PNV_LPC(obj) \
+     OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV_LPC)
+
+typedef struct PnvLpcController {
+    DeviceState parent;
+
+    uint64_t eccb_stat_reg;
+    uint32_t eccb_data_reg;
+
+    /* OPB bus */
+    MemoryRegion opb_mr;
+    AddressSpace opb_as;
+
+    /* ISA IO and Memory space */
+    MemoryRegion isa_io;
+    MemoryRegion isa_mem;
+
+    /* Windows from OPB to ISA (aliases) */
+    MemoryRegion opb_isa_io;
+    MemoryRegion opb_isa_mem;
+    MemoryRegion opb_isa_fw;
+
+    /* Registers */
+    MemoryRegion lpc_hc_regs;
+    MemoryRegion opb_master_regs;
+
+    /* OPB Master LS registers */
+    uint32_t opb_irq_stat;
+    uint32_t opb_irq_mask;
+    uint32_t opb_irq_pol;
+    uint32_t opb_irq_input;
+
+    /* LPC HC registers */
+    uint32_t lpc_hc_fw_seg_idsel;
+    uint32_t lpc_hc_fw_rd_acc_size;
+    uint32_t lpc_hc_irqser_ctrl;
+    uint32_t lpc_hc_irqmask;
+    uint32_t lpc_hc_irqstat;
+    uint32_t lpc_hc_error_addr;
+
+    /* XSCOM registers */
+    MemoryRegion xscom_regs;
+} PnvLpcController;
+
+#endif /* _PPC_PNV_LPC_H */
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index 5da6e92e698c..c0a2fbb9f6f8 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -60,6 +60,9 @@ typedef struct PnvXScomInterfaceClass {
 #define PNV_XSCOM_EX_CORE_BASE(i) (PNV_XSCOM_EX_BASE | (((uint64_t)i) << 24))
 #define PNV_XSCOM_EX_CORE_SIZE    0x100000
 
+#define PNV_XSCOM_LPC_BASE        0xb0020
+#define PNV_XSCOM_LPC_SIZE        0x4
+
 extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
 extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
 
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 10/17] ppc/pnv: add a ISA bus
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (8 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 09/17] ppc/pnv: add a LPC controller Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass Cédric Le Goater
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

As Qemu only supports a single instance of the ISA bus, we use the LPC
controller of chip 0 to create one and plug in a couple of useful
devices, like an UART and RTC. An IPMI BT device, which is also an ISA
device, can be defined on the command line to connect an external BMC.
That is for later.

The PowerNV machine now has a console. Skiboot should load a kernel
and jump into it but execution will stop quite early because we lack a
model for the native XICS controller for the moment :

    [    0.000000] NR_IRQS:512 nr_irqs:512 16
    [    0.000000] XICS: Cannot find a Presentation Controller !
    [    0.000000] ------------[ cut here ]------------
    [    0.000000] WARNING: at arch/powerpc/platforms/powernv/setup.c:81
    ...
    [    0.000000] NIP [c00000000079d65c] pnv_init_IRQ+0x30/0x44

You can still do a few things under xmon.

Based on previous work from :
      Benjamin Herrenschmidt <benh@kernel.crashing.org>

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---

 Changes since v4:

 - changed the (empty) irq handlers to use a PnvChip as argument

 hw/ppc/pnv.c         | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h |  2 ++
 2 files changed, 67 insertions(+)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index aa712fd6f5d2..c6dc7ca895b6 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -35,6 +35,10 @@
 
 #include "hw/ppc/pnv_xscom.h"
 
+#include "hw/isa/isa.h"
+#include "hw/char/serial.h"
+#include "hw/timer/mc146818rtc.h"
+
 #include <libfdt.h>
 
 #define FDT_MAX_SIZE            0x00100000
@@ -301,6 +305,58 @@ static void ppc_powernv_reset(void)
     cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt));
 }
 
+/* If we don't use the built-in LPC interrupt deserializer, we need
+ * to provide a set of qirqs for the ISA bus or things will go bad.
+ *
+ * Most machines using pre-Naples chips (without said deserializer)
+ * have a CPLD that will collect the SerIRQ and shoot them as a
+ * single level interrupt to the P8 chip. So let's setup a hook
+ * for doing just that.
+ *
+ * Note: The actual interrupt input isn't emulated yet, this will
+ * come with the PSI bridge model.
+ */
+static void pnv_lpc_isa_irq_handler_cpld(void *opaque, int n, int level)
+{
+    /* We don't yet emulate the PSI bridge which provides the external
+     * interrupt, so just drop interrupts on the floor
+     */
+}
+
+static void pnv_lpc_isa_irq_handler(void *opaque, int n, int level)
+{
+     /* XXX TODO */
+}
+
+static ISABus *pnv_isa_create(PnvChip *chip)
+{
+    PnvLpcController *lpc = &chip->lpc;
+    ISABus *isa_bus;
+    qemu_irq *irqs;
+    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
+
+    /* let isa_bus_new() create its own bridge on SysBus otherwise
+     * devices speficied on the command line won't find the bus and
+     * will fail to create.
+     */
+    isa_bus = isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io,
+                          &error_fatal);
+
+    /* Not all variants have a working serial irq decoder. If not,
+     * handling of LPC interrupts becomes a platform issue (some
+     * platforms have a CPLD to do it).
+     */
+    if (pcc->chip_type == PNV_CHIP_POWER8NVL) {
+        irqs = qemu_allocate_irqs(pnv_lpc_isa_irq_handler, chip, ISA_NUM_IRQS);
+    } else {
+        irqs = qemu_allocate_irqs(pnv_lpc_isa_irq_handler_cpld, chip,
+                                  ISA_NUM_IRQS);
+    }
+
+    isa_bus_irqs(isa_bus, irqs);
+    return isa_bus;
+}
+
 static void ppc_powernv_init(MachineState *machine)
 {
     PnvMachineState *pnv = POWERNV_MACHINE(machine);
@@ -395,6 +451,15 @@ static void ppc_powernv_init(MachineState *machine)
         object_property_set_bool(chip, true, "realized", &error_fatal);
     }
     g_free(chip_typename);
+
+    /* Instantiate ISA bus on chip 0 */
+    pnv->isa_bus = pnv_isa_create(pnv->chips[0]);
+
+    /* Create serial port */
+    serial_hds_isa_init(pnv->isa_bus, MAX_SERIAL_PORTS);
+
+    /* Create an RTC ISA device too */
+    rtc_init(pnv->isa_bus, 2000, NULL);
 }
 
 /*
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index ce16e47724ef..02ac1c5f428e 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -112,6 +112,8 @@ typedef struct PnvMachineState {
 
     uint32_t     num_chips;
     PnvChip      **chips;
+
+    ISABus       *isa_bus;
 } PnvMachineState;
 
 #define PNV_FDT_ADDR          0x01000000
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (9 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 10/17] ppc/pnv: add a ISA bus Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-25  5:08   ` David Gibson
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 12/17] ppc/pnv: add a XICS native to each PowerNV chip Cédric Le Goater
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

This provides access to the MMIO based Interrupt Presentation
Controllers (ICP) as found on a POWER8 system.

A new XICSNative class is introduced to hold the MMIO region of the
ICPs. Each thread of the system has a subregion, indexed by its PIR
number, holding a XIVE (External Interrupt Vector Entry). This
provides a mean to make the link with the ICPState of the CPU.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---

 Changes since v4:

 - replaced the pir_table by memory subregions using an ICP. 
 - removed the find_icp() and cpu_setup() handlers which became
   useless with the memory regions.
 - removed the superfluous inits done in xics_native_initfn. This is
   covered in the parent class init.
 - took ownership of the patch.

 default-configs/ppc64-softmmu.mak |   3 +-
 hw/intc/Makefile.objs             |   1 +
 hw/intc/xics_native.c             | 304 ++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h              |  19 +++
 include/hw/ppc/xics.h             |  24 +++
 5 files changed, 350 insertions(+), 1 deletion(-)
 create mode 100644 hw/intc/xics_native.c

diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
index 67a9bcaa67fa..a22c93a48686 100644
--- a/default-configs/ppc64-softmmu.mak
+++ b/default-configs/ppc64-softmmu.mak
@@ -48,8 +48,9 @@ CONFIG_PLATFORM_BUS=y
 CONFIG_ETSEC=y
 CONFIG_LIBDECNUMBER=y
 # For pSeries
-CONFIG_XICS=$(CONFIG_PSERIES)
+CONFIG_XICS=$(or $(CONFIG_PSERIES),$(CONFIG_POWERNV))
 CONFIG_XICS_SPAPR=$(CONFIG_PSERIES)
+CONFIG_XICS_NATIVE=$(CONFIG_POWERNV)
 CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM))
 # For PReP
 CONFIG_MC146818RTC=y
diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
index 2f44a2da26e9..e44a29d75b32 100644
--- a/hw/intc/Makefile.objs
+++ b/hw/intc/Makefile.objs
@@ -34,6 +34,7 @@ obj-$(CONFIG_RASPI) += bcm2835_ic.o bcm2836_control.o
 obj-$(CONFIG_SH4) += sh_intc.o
 obj-$(CONFIG_XICS) += xics.o
 obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
+obj-$(CONFIG_XICS_NATIVE) += xics_native.o
 obj-$(CONFIG_XICS_KVM) += xics_kvm.o
 obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
 obj-$(CONFIG_S390_FLIC) += s390_flic.o
diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
new file mode 100644
index 000000000000..bbdd786aeb50
--- /dev/null
+++ b/hw/intc/xics_native.c
@@ -0,0 +1,304 @@
+/*
+ * QEMU PowerPC PowerNV machine model
+ *
+ * Native version of ICS/ICP
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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 "qapi/error.h"
+#include "qemu-common.h"
+#include "cpu.h"
+#include "hw/hw.h"
+#include "qemu/log.h"
+#include "qapi/error.h"
+
+#include "hw/ppc/fdt.h"
+#include "hw/ppc/xics.h"
+#include "hw/ppc/pnv.h"
+
+#include <libfdt.h>
+
+static void xics_native_reset(void *opaque)
+{
+    device_reset(DEVICE(opaque));
+}
+
+static void xics_native_initfn(Object *obj)
+{
+    qemu_register_reset(xics_native_reset, obj);
+}
+
+static uint64_t xics_native_read(void *opaque, hwaddr addr, unsigned width)
+{
+    ICPState *icp = opaque;
+    bool byte0 = (width == 1 && (addr & 0x3) == 0);
+    uint64_t val = 0xffffffff;
+
+    switch (addr & 0xffc) {
+    case 0: /* poll */
+        val = icp_ipoll(icp, NULL);
+        if (byte0) {
+            val >>= 24;
+        } else if (width != 4) {
+            goto bad_access;
+        }
+        break;
+    case 4: /* xirr */
+        if (byte0) {
+            val = icp_ipoll(icp, NULL) >> 24;
+        } else if (width == 4) {
+            val = icp_accept(icp);
+        } else {
+            goto bad_access;
+        }
+        break;
+    case 12:
+        if (byte0) {
+            val = icp->mfrr;
+        } else {
+            goto bad_access;
+        }
+        break;
+    case 16:
+        if (width == 4) {
+            val = icp->links[0];
+        } else {
+            goto bad_access;
+        }
+        break;
+    case 20:
+        if (width == 4) {
+            val = icp->links[1];
+        } else {
+            goto bad_access;
+        }
+        break;
+    case 24:
+        if (width == 4) {
+            val = icp->links[2];
+        } else {
+            goto bad_access;
+        }
+        break;
+    default:
+bad_access:
+        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
+                      HWADDR_PRIx"/%d\n", addr, width);
+    }
+
+    return val;
+}
+
+static void xics_native_write(void *opaque, hwaddr addr, uint64_t val,
+                              unsigned width)
+{
+    ICPState *icp = opaque;
+    bool byte0 = (width == 1 && (addr & 0x3) == 0);
+
+    switch (addr & 0xffc) {
+    case 4: /* xirr */
+        if (byte0) {
+            icp_set_cppr(icp, val);
+        } else if (width == 4) {
+            icp_eoi(icp, val);
+        } else {
+            goto bad_access;
+        }
+        break;
+    case 12:
+        if (byte0) {
+            icp_set_mfrr(icp, val);
+        } else {
+            goto bad_access;
+        }
+        break;
+    case 16:
+        if (width == 4) {
+            icp->links[0] = val;
+        } else {
+            goto bad_access;
+        }
+        break;
+    case 20:
+        if (width == 4) {
+            icp->links[1] = val;
+        } else {
+            goto bad_access;
+        }
+        break;
+    case 24:
+        if (width == 4) {
+            icp->links[2] = val;
+        } else {
+            goto bad_access;
+        }
+        break;
+    default:
+bad_access:
+        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
+                      HWADDR_PRIx"/%d\n", addr, width);
+    }
+}
+
+static const MemoryRegionOps xics_native_ops = {
+    .read = xics_native_read,
+    .write = xics_native_write,
+    .valid.min_access_size = 1,
+    .valid.max_access_size = 4,
+    .impl.min_access_size = 1,
+    .impl.max_access_size = 4,
+    .endianness = DEVICE_BIG_ENDIAN,
+};
+
+static uint64_t xics_native_default_read(void *opaque, hwaddr addr,
+                                         unsigned width)
+{
+    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
+                  HWADDR_PRIx"/%d\n", addr, width);
+    return 0xffffffffffffffffull;
+}
+
+static void xics_native_default_write(void *opaque, hwaddr addr, uint64_t val,
+                                      unsigned width)
+{
+    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
+                  HWADDR_PRIx"/%d\n", addr, width);
+}
+
+static const MemoryRegionOps xics_native_default_ops = {
+    .read = xics_native_default_read,
+    .write = xics_native_default_write,
+    .valid.min_access_size = 1,
+    .valid.max_access_size = 4,
+    .impl.min_access_size = 1,
+    .impl.max_access_size = 4,
+    .endianness = DEVICE_BIG_ENDIAN,
+};
+
+static void xics_native_set_nr_servers(XICSState *xics, uint32_t nr_servers,
+                                       Error **errp)
+{
+    xics_set_nr_servers(xics, nr_servers, TYPE_ICP, errp);
+}
+
+static void xics_native_realize(DeviceState *dev, Error **errp)
+{
+    XICSState *xics = XICS_COMMON(dev);
+    XICSNative *xicsn = XICS_NATIVE(dev);
+    Error *error = NULL;
+    int i;
+
+    if (!xics->nr_servers) {
+        error_setg(errp, "Number of servers needs to be greater than 0");
+        return;
+    }
+
+    for (i = 0; i < xics->nr_servers; i++) {
+        object_property_set_bool(OBJECT(&xics->ss[i]), true, "realized",
+                                 &error);
+        if (error) {
+            error_propagate(errp, error);
+            return;
+        }
+    }
+
+    /*
+     * Initialize the container region for the ICPs and the subregion
+     * for each cpu. The mmapping will be done at the board level
+     * depending on the pir of the core.
+     *
+     * TODO: build a name with the chip id
+     */
+    memory_region_init_io(&xicsn->icp_mmio, OBJECT(dev),
+                          &xics_native_default_ops, xicsn, "icp-0",
+                          PNV_XICS_SIZE);
+    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &xicsn->icp_mmio);
+
+    xicsn->icp_mmios = g_new0(MemoryRegion, xics->nr_servers);
+    for (i = 0; i < xics->nr_servers; i++) {
+        ICPState *icp = &xics->ss[i];
+        memory_region_init_io(&xicsn->icp_mmios[i], OBJECT(dev),
+                              &xics_native_ops, icp, "icp-0", 0x1000);
+    }
+}
+
+static void xics_native_class_init(ObjectClass *oc, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(oc);
+    XICSStateClass *xsc = XICS_NATIVE_CLASS(oc);
+
+    dc->realize = xics_native_realize;
+    xsc->set_nr_servers = xics_native_set_nr_servers;
+}
+
+static const TypeInfo xics_native_info = {
+    .name          = TYPE_XICS_NATIVE,
+    .parent        = TYPE_XICS_COMMON,
+    .instance_size = sizeof(XICSNative),
+    .class_size = sizeof(XICSStateClass),
+    .class_init    = xics_native_class_init,
+    .instance_init = xics_native_initfn,
+};
+
+static void xics_native_register_types(void)
+{
+    type_register_static(&xics_native_info);
+}
+
+type_init(xics_native_register_types)
+
+void xics_native_populate_icp(PnvChip *chip, void *fdt, int offset,
+                              uint32_t pir, uint32_t count)
+{
+    uint64_t addr;
+    char *name;
+    const char compat[] = "IBM,power8-icp\0IBM,ppc-xicp";
+    uint32_t irange[2], i, rsize;
+    uint64_t *reg;
+
+    /*
+     * TODO: add multichip ICP BAR
+     */
+    addr = PNV_XICS_BASE | (pir << 12);
+
+    irange[0] = cpu_to_be32(pir);
+    irange[1] = cpu_to_be32(count);
+
+    rsize = sizeof(uint64_t) * 2 * count;
+    reg = g_malloc(rsize);
+    for (i = 0; i < count; i++) {
+        reg[i * 2] = cpu_to_be64(addr | ((pir + i) * 0x1000));
+        reg[i * 2 + 1] = cpu_to_be64(0x1000);
+    }
+
+    name = g_strdup_printf("interrupt-controller@%"PRIX64, addr);
+    offset = fdt_add_subnode(fdt, offset, name);
+    _FDT(offset);
+    g_free(name);
+
+    _FDT((fdt_setprop(fdt, offset, "compatible", compat, sizeof(compat))));
+    _FDT((fdt_setprop(fdt, offset, "reg", reg, rsize)));
+    _FDT((fdt_setprop_string(fdt, offset, "device_type",
+                              "PowerPC-External-Interrupt-Presentation")));
+    _FDT((fdt_setprop(fdt, offset, "interrupt-controller", NULL, 0)));
+    _FDT((fdt_setprop(fdt, offset, "ibm,interrupt-server-ranges",
+                       irange, sizeof(irange))));
+    _FDT((fdt_setprop_cell(fdt, offset, "#interrupt-cells", 1)));
+    _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 0)));
+    g_free(reg);
+}
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 02ac1c5f428e..c08ed1c72b17 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -126,4 +126,23 @@ typedef struct PnvMachineState {
 #define PNV_XSCOM_BASE(chip)                                            \
     (chip->xscom_base + ((uint64_t)(chip)->chip_id) * PNV_XSCOM_SIZE)
 
+/*
+ * XSCOM 0x20109CA defines the ICP BAR:
+ *
+ * 0:29   : bits 14 to 43 of address to define 1 MB region.
+ * 30     : 1 to enable ICP to receive loads/stores against its BAR region
+ * 31:63  : Constant 0
+ *
+ * Usually defined as :
+ *
+ *      0xffffe00200000000 -> 0x0003ffff80000000
+ *      0xffffe00600000000 -> 0x0003ffff80100000
+ *      0xffffe02200000000 -> 0x0003ffff80800000
+ *      0xffffe02600000000 -> 0x0003ffff80900000
+ *
+ * TODO: make a macro using the chip hw id
+ */
+#define PNV_XICS_BASE         0x0003ffff80000000ull
+#define PNV_XICS_SIZE         0x0000000000100000ull
+
 #endif /* _PPC_PNV_H */
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index 6e5a113332c6..911cdd5e549f 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -119,8 +119,27 @@ struct ICPState {
     bool cap_irq_xics_enabled;
 
     XICSState *xics;
+
+    /*
+     * for XICSNative (not used by Linux).
+     */
+    uint32_t links[3];
 };
 
+#define TYPE_XICS_NATIVE "xics-native"
+#define XICS_NATIVE(obj) OBJECT_CHECK(XICSNative, (obj), TYPE_XICS_NATIVE)
+#define XICS_NATIVE_CLASS(klass) \
+     OBJECT_CLASS_CHECK(XICSStateClass, (klass), TYPE_XICS_NATIVE)
+#define XICS_NATIVE_GET_CLASS(obj) \
+     OBJECT_CLASS_CHECK(XICSStateClass, (obj), TYPE_XICS_NATIVE)
+
+typedef struct XICSNative {
+    XICSState parent_obj;
+
+    MemoryRegion icp_mmio;
+    MemoryRegion *icp_mmios;
+} XICSNative;
+
 #define TYPE_ICS_BASE "ics-base"
 #define ICS_BASE(obj) OBJECT_CHECK(ICSState, (obj), TYPE_ICS_BASE)
 
@@ -209,4 +228,9 @@ void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
 
 ICSState *xics_find_source(XICSState *icp, int irq);
 
+typedef struct PnvChip PnvChip;
+
+void xics_native_populate_icp(PnvChip *chip, void *fdt, int offset,
+                              uint32_t base, uint32_t count);
+
 #endif /* XICS_H */
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 12/17] ppc/pnv: add a XICS native to each PowerNV chip
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (10 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-24 15:42   ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper Cédric Le Goater
                   ` (5 subsequent siblings)
  17 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

It also links the XICS object to each core as it is needed to do the
CPU setup and the ICP MMIO windows are memory mapped for each thread.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---

 Changes since v4:

 - changed the calculation of the number of ICPs to use smp_threads
 - added the mapping of the ICP subregions per thread

 hw/ppc/pnv.c         | 27 +++++++++++++++++++++++++++
 hw/ppc/pnv_core.c    | 24 ++++++++++++++++++++----
 include/hw/ppc/pnv.h |  2 ++
 3 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index c6dc7ca895b6..16d7baf0da71 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -33,6 +33,7 @@
 #include "qemu/cutils.h"
 #include "qapi/visitor.h"
 
+#include "hw/ppc/xics.h"
 #include "hw/ppc/pnv_xscom.h"
 
 #include "hw/isa/isa.h"
@@ -231,6 +232,9 @@ static void powernv_populate_chip(PnvChip *chip, void *fdt)
         PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
 
         powernv_create_core_node(chip, pnv_core, fdt);
+
+        /* Interrupt presentation controllers (ICP). One per thread. */
+        xics_native_populate_icp(chip, fdt, 0, pnv_core->pir, smp_threads);
     }
 
     if (chip->ram_size) {
@@ -637,6 +641,9 @@ static void pnv_chip_init(Object *obj)
 
     object_initialize(&chip->lpc, sizeof(chip->lpc), TYPE_PNV_LPC);
     object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), NULL);
+
+    object_initialize(&chip->xics, sizeof(chip->xics), TYPE_XICS_NATIVE);
+    object_property_add_child(obj, "xics", OBJECT(&chip->xics), NULL);
 }
 
 static void pnv_chip_realize(DeviceState *dev, Error **errp)
@@ -668,12 +675,23 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
         return;
     }
 
+    /*
+     * Interrupt Controller. To be created before the cores because
+     * each thread will fetch its ICP in the XICS
+     */
+    object_property_set_int(OBJECT(&chip->xics), chip->nr_cores * smp_threads,
+                            "nr_servers",  &error_fatal);
+    object_property_set_bool(OBJECT(&chip->xics), true, "realized",
+                             &error_fatal);
+    sysbus_mmio_map(SYS_BUS_DEVICE(&chip->xics), 0, PNV_XICS_BASE);
+
     chip->cores = g_malloc0(typesize * chip->nr_cores);
 
     for (i = 0, core_hwid = 0; (core_hwid < sizeof(chip->cores_mask) * 8)
              && (i < chip->nr_cores); core_hwid++) {
         char core_name[32];
         void *pnv_core = chip->cores + i * typesize;
+        int j;
 
         if (!(chip->cores_mask & (1ull << core_hwid))) {
             continue;
@@ -690,6 +708,8 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
         object_property_set_int(OBJECT(pnv_core),
                                 pcc->core_pir(chip, core_hwid),
                                 "pir", &error_fatal);
+        object_property_add_const_link(OBJECT(pnv_core), "xics",
+                                       OBJECT(&chip->xics), &error_fatal);
         object_property_set_bool(OBJECT(pnv_core), true, "realized",
                                  &error_fatal);
         object_unref(OBJECT(pnv_core));
@@ -697,6 +717,13 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
         /* Each core has an XSCOM MMIO region */
         pnv_xscom_add_subregion(chip, PNV_XSCOM_EX_CORE_BASE(core_hwid),
                                 &PNV_CORE(pnv_core)->xscom_regs);
+
+        /* Each thread as region for its ICP */
+        for (j = 0; j < smp_threads; j++) {
+            memory_region_add_subregion(&chip->xics.icp_mmio,
+                                        pcc->core_pir(chip, core_hwid) << 12,
+                                        &chip->xics.icp_mmios[i]);
+        }
         i++;
     }
     g_free(typename);
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
index 2acda9637db5..e15c76163759 100644
--- a/hw/ppc/pnv_core.c
+++ b/hw/ppc/pnv_core.c
@@ -24,6 +24,7 @@
 #include "hw/ppc/ppc.h"
 #include "hw/ppc/pnv.h"
 #include "hw/ppc/pnv_core.h"
+#include "hw/ppc/xics.h"
 
 static void powernv_cpu_reset(void *opaque)
 {
@@ -42,7 +43,7 @@ static void powernv_cpu_reset(void *opaque)
     env->msr |= MSR_HVB; /* Hypervisor mode */
 }
 
-static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
+static void powernv_cpu_init(PowerPCCPU *cpu, XICSState *xics, Error **errp)
 {
     CPUPPCState *env = &cpu->env;
     int core_pir;
@@ -62,6 +63,11 @@ static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
     cpu_ppc_tb_init(env, PNV_TIMEBASE_FREQ);
 
     qemu_register_reset(powernv_cpu_reset, cpu);
+
+    /*
+     * xics_cpu_setup() assigns the CPU to the ICP in XICS
+     */
+    xics_cpu_setup(xics, cpu);
 }
 
 /*
@@ -109,7 +115,7 @@ static const MemoryRegionOps pnv_core_xscom_ops = {
     .endianness = DEVICE_BIG_ENDIAN,
 };
 
-static void pnv_core_realize_child(Object *child, Error **errp)
+static void pnv_core_realize_child(Object *child, XICSState *xics, Error **errp)
 {
     Error *local_err = NULL;
     CPUState *cs = CPU(child);
@@ -121,7 +127,7 @@ static void pnv_core_realize_child(Object *child, Error **errp)
         return;
     }
 
-    powernv_cpu_init(cpu, &local_err);
+    powernv_cpu_init(cpu, xics, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         return;
@@ -139,6 +145,7 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
     void *obj;
     int i, j;
     char name[32];
+    XICSState *xics;
 
     pc->threads = g_malloc0(size * cc->nr_threads);
     for (i = 0; i < cc->nr_threads; i++) {
@@ -156,10 +163,19 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
         object_unref(obj);
     }
 
+    /* get XICS object from chip */
+    obj = object_property_get_link(OBJECT(dev), "xics", &local_err);
+    if (!obj) {
+        error_setg(errp, "%s: required link 'xics' not found: %s",
+                   __func__, error_get_pretty(local_err));
+        return;
+    }
+    xics = XICS_COMMON(obj);
+
     for (j = 0; j < cc->nr_threads; j++) {
         obj = pc->threads + j * size;
 
-        pnv_core_realize_child(obj, &local_err);
+        pnv_core_realize_child(obj, xics, &local_err);
         if (local_err) {
             goto err;
         }
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index c08ed1c72b17..e11618b05f1d 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -23,6 +23,7 @@
 #include "hw/sysbus.h"
 #include "hw/ppc/pnv_xscom.h"
 #include "hw/ppc/pnv_lpc.h"
+#include "hw/ppc/xics.h"
 
 #define TYPE_PNV_CHIP "powernv-chip"
 #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
@@ -57,6 +58,7 @@ typedef struct PnvChip {
     AddressSpace xscom_as;
 
     PnvLpcController lpc;
+    XICSNative   xics;
 } PnvChip;
 
 typedef struct PnvChipClass {
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (11 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 12/17] ppc/pnv: add a XICS native to each PowerNV chip Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-25  5:36   ` David Gibson
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 14/17] ppc/xics: introduce a helper to insert a new ics Cédric Le Goater
                   ` (4 subsequent siblings)
  17 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

We will need this helper to translate the server number of the XIVE
(which is a PIR) into an ICPState index number (which is a cpu index).

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 hw/intc/xics_native.c | 19 +++++++++++++++++++
 include/hw/ppc/xics.h |  1 +
 2 files changed, 20 insertions(+)

diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
index bbdd786aeb50..6318862f53fc 100644
--- a/hw/intc/xics_native.c
+++ b/hw/intc/xics_native.c
@@ -33,6 +33,25 @@
 
 #include <libfdt.h>
 
+int xics_get_cpu_index_by_pir(XICSState *xics, int pir)
+{
+    int i;
+
+    for (i = 0; i < xics->nr_servers; i++) {
+        ICPState *icp = &xics->ss[i];
+        if (icp->cs) {
+            PowerPCCPU *cpu = POWERPC_CPU(icp->cs);
+            CPUPPCState *env = &cpu->env;
+
+            if (env->spr_cb[SPR_PIR].default_value == pir) {
+                return i;
+            }
+        }
+    }
+
+    return -1;
+}
+
 static void xics_native_reset(void *opaque)
 {
     device_reset(DEVICE(opaque));
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index 911cdd5e549f..beb232e616c5 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -214,6 +214,7 @@ void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers,
 
 /* Internal XICS interfaces */
 int xics_get_cpu_index_by_dt_id(int cpu_dt_id);
+int xics_get_cpu_index_by_pir(XICSState *xics, int pir);
 
 void icp_set_cppr(ICPState *icp, uint8_t cppr);
 void icp_set_mfrr(ICPState *icp, uint8_t mfrr);
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 14/17] ppc/xics: introduce a helper to insert a new ics
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (12 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-25  5:12   ` David Gibson
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt Cédric Le Goater
                   ` (3 subsequent siblings)
  17 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

Interrupt Control Sources (ICS) are now maintained under a list.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 hw/intc/xics.c        | 6 ++++++
 include/hw/ppc/xics.h | 1 +
 2 files changed, 7 insertions(+)

diff --git a/hw/intc/xics.c b/hw/intc/xics.c
index 095c16a30082..f24787e95013 100644
--- a/hw/intc/xics.c
+++ b/hw/intc/xics.c
@@ -151,6 +151,12 @@ static void xics_common_reset(DeviceState *d)
     }
 }
 
+void xics_insert_ics(XICSState *xics, ICSState *ics)
+{
+    ics->xics = xics;
+    QLIST_INSERT_HEAD(&xics->ics, ics, list);
+}
+
 static void xics_prop_get_nr_irqs(Object *obj, Visitor *v, const char *name,
                                   void *opaque, Error **errp)
 {
diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
index beb232e616c5..f31eef8c9f6c 100644
--- a/include/hw/ppc/xics.h
+++ b/include/hw/ppc/xics.h
@@ -228,6 +228,7 @@ void ics_simple_write_xive(ICSState *ics, int nr, int server,
 void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
 
 ICSState *xics_find_source(XICSState *icp, int irq);
+void xics_insert_ics(XICSState *xics, ICSState *ics);
 
 typedef struct PnvChip PnvChip;
 
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (13 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 14/17] ppc/xics: introduce a helper to insert a new ics Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-25  5:30   ` David Gibson
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 16/17] ppc/pnv: Add OCC model stub with interrupt support Cédric Le Goater
                   ` (2 subsequent siblings)
  17 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

The PSI (Processor Service Interface) is one of the engines of the
"Bridge" unit which connects the different interfaces to the Power
Processor.

This adds just enough of the PSI bridge to handle various on-chip and
the one external interrupt. The rest of PSI has to do with the link to
the IBM FSP service processor which we don't plan to emulate (not used
on OpenPower machines).

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[clg: - updated for qemu-2.7
      - changed the XSCOM interface to fit new model
      - QOMified the model
      - reworked set_xive ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---

 When skiboot initializes PSIHB, it fills the xives with server=0,
 prio=0xff, which is fine, but for some reason the last two xive
 settings reach the qemu MMIO region with a bogus value :
 
	pnv_psi_mmio_write: MMIO write 0x30 val 0x000000ff00000000
	pnv_psi_mmio_write: MMIO write 0x60 val 0x000000ff20000000
	pnv_psi_mmio_write: MMIO write 0x68 val 0x000000ff40000000
	pnv_psi_mmio_write: MMIO write 0x70 val 0x000000ff60000000
	pnv_psi_mmio_write: MMIO write 0x78 val 0xffffffff80000000
	pnv_psi_mmio_write: MMIO write 0x80 val 0xffffffffa0000000

 It looks like a badly initialized temp variable in the call
 stack. The memory regions look fine, maybe in stdcix ? For the
 moment, I have added a logging error to catch non zero values as the
 guest should not do that in any case.


 Changes since v4:

 - used the helpers for the XSCOM region
 - introduced pnv->cpld_irqstate to remove a static 
 - reworked pnv_psi_set_xivr() to use xics_get_cpu_index_by_pir().
   This is similar to rtas_set_xive but skiboot does a first
   initialization with empty servers so we need to check for that
   case.

 hw/ppc/Makefile.objs       |   2 +-
 hw/ppc/pnv.c               |  31 ++-
 hw/ppc/pnv_psi.c           | 615 +++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h       |   7 +
 include/hw/ppc/pnv_psi.h   |  64 +++++
 include/hw/ppc/pnv_xscom.h |   3 +
 6 files changed, 715 insertions(+), 7 deletions(-)
 create mode 100644 hw/ppc/pnv_psi.c
 create mode 100644 include/hw/ppc/pnv_psi.h

diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs
index ebc72af0a7c6..4feb15b360c8 100644
--- a/hw/ppc/Makefile.objs
+++ b/hw/ppc/Makefile.objs
@@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o
 obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o
 obj-$(CONFIG_PSERIES) += spapr_cpu_core.o
 # IBM PowerNV
-obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o
+obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o pnv_psi.o
 ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy)
 obj-y += spapr_pci_vfio.o
 endif
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 16d7baf0da71..ec1a17699023 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -316,15 +316,22 @@ static void ppc_powernv_reset(void)
  * have a CPLD that will collect the SerIRQ and shoot them as a
  * single level interrupt to the P8 chip. So let's setup a hook
  * for doing just that.
- *
- * Note: The actual interrupt input isn't emulated yet, this will
- * come with the PSI bridge model.
  */
 static void pnv_lpc_isa_irq_handler_cpld(void *opaque, int n, int level)
 {
-    /* We don't yet emulate the PSI bridge which provides the external
-     * interrupt, so just drop interrupts on the floor
-     */
+    PnvMachineState *pnv = POWERNV_MACHINE(qdev_get_machine());
+    uint32_t old_state = pnv->cpld_irqstate;
+    PnvChip *chip = opaque;
+
+    if (level) {
+        pnv->cpld_irqstate |= 1u << n;
+    } else {
+        pnv->cpld_irqstate &= ~(1u << n);
+    }
+    if (pnv->cpld_irqstate != old_state) {
+        pnv_psi_irq_set(&chip->psi, PSIHB_IRQ_EXTERNAL,
+                        pnv->cpld_irqstate != 0);
+    }
 }
 
 static void pnv_lpc_isa_irq_handler(void *opaque, int n, int level)
@@ -644,6 +651,9 @@ static void pnv_chip_init(Object *obj)
 
     object_initialize(&chip->xics, sizeof(chip->xics), TYPE_XICS_NATIVE);
     object_property_add_child(obj, "xics", OBJECT(&chip->xics), NULL);
+
+    object_initialize(&chip->psi, sizeof(chip->psi), TYPE_PNV_PSI);
+    object_property_add_child(obj, "psi", OBJECT(&chip->psi), NULL);
 }
 
 static void pnv_chip_realize(DeviceState *dev, Error **errp)
@@ -728,6 +738,15 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
     }
     g_free(typename);
 
+
+    /* Processor Service Interface (PSI) Host Bridge */
+    object_property_set_bool(OBJECT(&chip->psi), true, "realized",
+                             &error_fatal);
+    pnv_xscom_add_subregion(chip, PNV_XSCOM_PSI_BASE, &chip->psi.xscom_regs);
+
+    /* link in the PSI ICS */
+    xics_insert_ics(XICS_COMMON(&chip->xics), &chip->psi.ics);
+
     /* Create LPC controller */
     object_property_set_bool(OBJECT(&chip->lpc), true, "realized",
                              &error_fatal);
diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
new file mode 100644
index 000000000000..8e21a0f1084e
--- /dev/null
+++ b/hw/ppc/pnv_psi.c
@@ -0,0 +1,615 @@
+/*
+ * QEMU PowerNV PowerPC PSI interface
+ *
+ * Copyright (c) 2016, IBM Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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/hw.h"
+#include "target-ppc/cpu.h"
+#include "qemu/log.h"
+#include "qapi/error.h"
+
+#include "exec/address-spaces.h"
+
+#include "hw/ppc/fdt.h"
+#include "hw/ppc/pnv.h"
+#include "hw/ppc/pnv_psi.h"
+
+#include <libfdt.h>
+
+#define PSIHB_XSCOM_FIR_RW      0x00
+#define PSIHB_XSCOM_FIR_AND     0x01
+#define PSIHB_XSCOM_FIR_OR      0x02
+#define PSIHB_XSCOM_FIRMASK_RW  0x03
+#define PSIHB_XSCOM_FIRMASK_AND 0x04
+#define PSIHB_XSCOM_FIRMASK_OR  0x05
+#define PSIHB_XSCOM_FIRACT0     0x06
+#define PSIHB_XSCOM_FIRACT1     0x07
+#define PSIHB_XSCOM_BAR         0x0a
+#define   PSIHB_BAR_EN                  0x0000000000000001ull
+#define PSIHB_XSCOM_FSPBAR      0x0b
+#define PSIHB_XSCOM_CR          0x0e
+#define   PSIHB_CR_FSP_CMD_ENABLE       0x8000000000000000ull
+#define   PSIHB_CR_FSP_MMIO_ENABLE      0x4000000000000000ull
+#define   PSIHB_CR_FSP_IRQ_ENABLE       0x1000000000000000ull
+#define   PSIHB_CR_FSP_ERR_RSP_ENABLE   0x0800000000000000ull
+#define   PSIHB_CR_PSI_LINK_ENABLE      0x0400000000000000ull
+#define   PSIHB_CR_FSP_RESET            0x0200000000000000ull
+#define   PSIHB_CR_PSIHB_RESET          0x0100000000000000ull
+#define   PSIHB_CR_PSI_IRQ              0x0000800000000000ull
+#define   PSIHB_CR_FSP_IRQ              0x0000400000000000ull
+#define   PSIHB_CR_FSP_LINK_ACTIVE      0x0000200000000000ull
+          /* and more ... */
+#define PSIHB_XSCOM_SEMR        0x0f
+#define PSIHB_XSCOM_XIVR_PSI    0x10
+#define   PSIHB_XIVR_SERVER_SH  40
+#define   PSIHB_XIVR_SERVER_MSK (0xffffull << PSIHB_XIVR_SERVER_SH)
+#define   PSIHB_XIVR_PRIO_SH    32
+#define   PSIHB_XIVR_PRIO_MSK   (0xffull << PSIHB_XIVR_PRIO_SH)
+#define   PSIHB_XIVR_SRC_SH             29
+#define   PSIHB_XIVR_SRC_MSK    (0x7ull << PSIHB_XIVR_SRC_SH)
+#define   PSIHB_XIVR_PENDING    0x01000000ull
+#define PSIHB_XSCOM_SCR         0x12
+#define PSIHB_XSCOM_CCR         0x13
+#define PSIHB_XSCOM_DMA_UPADD   0x14
+#define PSIHB_XSCOM_IRQ_STAT    0x15
+#define  PSIHB_IRQ_STAT_OCC             0x0000001000000000ull
+#define  PSIHB_IRQ_STAT_FSI             0x0000000800000000ull
+#define  PSIHB_IRQ_STAT_LPCI2C          0x0000000400000000ull
+#define  PSIHB_IRQ_STAT_LOCERR          0x0000000200000000ull
+#define  PSIHB_IRQ_STAT_EXT             0x0000000100000000ull
+#define PSIHB_XSCOM_XIVR_OCC    0x16
+#define PSIHB_XSCOM_XIVR_FSI    0x17
+#define PSIHB_XSCOM_XIVR_LPCI2C 0x18
+#define PSIHB_XSCOM_XIVR_LOCERR 0x19
+#define PSIHB_XSCOM_XIVR_EXT    0x1a
+#define PSIHB_XSCOM_IRSN        0x1b
+#define   PSIHB_IRSN_COMP_SH            45
+#define   PSIHB_IRSN_COMP_MSK           (0x7ffffull << PSIHB_IRSN_COMP_SH)
+#define   PSIHB_IRSN_IRQ_MUX            0x0000000800000000ull
+#define   PSIHB_IRSN_IRQ_RESET          0x0000000400000000ull
+#define   PSIHB_IRSN_DOWNSTREAM_EN      0x0000000200000000ull
+#define   PSIHB_IRSN_UPSTREAM_EN        0x0000000100000000ull
+#define   PSIHB_IRSN_COMPMASK_SH        13
+#define   PSIHB_IRSN_COMPMASK_MSK       (0x7ffffull << PSIHB_IRSN_COMPMASK_SH)
+
+#define PSIHB_MMIO_BAR          0x00
+#define PSIHB_MMIO_FSPBAR       0x08
+#define PSIHB_MMIO_CR           0x20
+#define PSIHB_MMIO_SEMR         0x28
+#define PSIHB_MMIO_XIVR_PSI     0x30
+#define PSIHB_MMIO_SCR          0x40
+#define PSIHB_MMIO_CCR          0x48
+#define PSIHB_MMIO_DMA_UPADD    0x50
+#define PSIHB_MMIO_IRQ_STAT     0x58
+#define PSIHB_MMIO_XIVR_OCC     0x60
+#define PSIHB_MMIO_XIVR_FSI     0x68
+#define PSIHB_MMIO_XIVR_LPCI2C  0x70
+#define PSIHB_MMIO_XIVR_LOCERR  0x78
+#define PSIHB_MMIO_XIVR_EXT     0x80
+#define PSIHB_MMIO_IRSN         0x88
+#define PSIHB_MMIO_MAX          0x100
+
+static const uint32_t psi_mmio_to_xscom[PSIHB_MMIO_MAX / 8] = {
+        [PSIHB_MMIO_BAR / 8]         = PSIHB_XSCOM_BAR,
+        [PSIHB_MMIO_FSPBAR / 8]      = PSIHB_XSCOM_FSPBAR,
+        [PSIHB_MMIO_CR / 8]          = PSIHB_XSCOM_CR,
+        [PSIHB_MMIO_SCR / 8]         = PSIHB_XSCOM_SCR,
+        [PSIHB_MMIO_CCR / 8]         = PSIHB_XSCOM_CCR,
+        [PSIHB_MMIO_SEMR / 8]        = PSIHB_XSCOM_SEMR,
+        [PSIHB_MMIO_XIVR_PSI / 8]    = PSIHB_XSCOM_XIVR_PSI,
+        [PSIHB_MMIO_XIVR_OCC / 8]    = PSIHB_XSCOM_XIVR_OCC,
+        [PSIHB_MMIO_XIVR_FSI / 8]    = PSIHB_XSCOM_XIVR_FSI,
+        [PSIHB_MMIO_XIVR_LPCI2C / 8] = PSIHB_XSCOM_XIVR_LPCI2C,
+        [PSIHB_MMIO_XIVR_LOCERR / 8] = PSIHB_XSCOM_XIVR_LOCERR,
+        [PSIHB_MMIO_XIVR_EXT / 8]    = PSIHB_XSCOM_XIVR_EXT,
+        [PSIHB_MMIO_IRQ_STAT / 8]    = PSIHB_XSCOM_IRQ_STAT,
+        [PSIHB_MMIO_DMA_UPADD / 8]   = PSIHB_XSCOM_DMA_UPADD,
+        [PSIHB_MMIO_IRSN / 8]        = PSIHB_XSCOM_IRSN,
+};
+
+static void pnv_psi_set_bar(PnvPsiController *psi, uint64_t bar)
+{
+    MemoryRegion *sysmem = get_system_memory();
+    uint64_t old = psi->regs[PSIHB_XSCOM_BAR];
+
+    psi->regs[PSIHB_XSCOM_BAR] = bar & 0x0003fffffff00001;
+
+    /* Update MR, always remove it first */
+    if (old & PSIHB_BAR_EN) {
+        memory_region_del_subregion(sysmem, &psi->regs_mr);
+    }
+    /* Then add it back if needed */
+    if (bar & PSIHB_BAR_EN) {
+        uint64_t addr = bar & 0x0003fffffff00000;
+        memory_region_add_subregion(sysmem, addr, &psi->regs_mr);
+    }
+}
+
+static void pnv_psi_update_fsp_mr(PnvPsiController *psi)
+{
+    /* XXX Update FSP MR if/when we support FSP BAR */
+}
+
+static void pnv_psi_set_cr(PnvPsiController *psi, uint64_t cr)
+{
+    uint64_t old = psi->regs[PSIHB_XSCOM_CR];
+
+    psi->regs[PSIHB_XSCOM_CR] = cr & 0x0003ffff00000000;
+
+    /* Check some bit changes */
+    if ((old ^ psi->regs[PSIHB_XSCOM_CR]) & PSIHB_CR_FSP_MMIO_ENABLE) {
+        pnv_psi_update_fsp_mr(psi);
+    }
+}
+
+static void pnv_psi_set_irsn(PnvPsiController *psi, uint64_t val)
+{
+    uint32_t offset;
+    ICSState *ics = &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).
+     * We ignore IRQ_MUX, its meaning isn't clear and we don't use
+     * it and finally we ignore reset (XXX fix that ?)
+     */
+    psi->regs[PSIHB_XSCOM_IRSN] = val & (PSIHB_IRSN_COMP_MSK |
+                                         PSIHB_IRSN_IRQ_MUX |
+                                         PSIHB_IRSN_DOWNSTREAM_EN |
+                                         PSIHB_IRSN_DOWNSTREAM_EN |
+                                         PSIHB_IRSN_DOWNSTREAM_EN);
+
+    /* We ignore the compare mask as well, our ICS emulation is too
+     * simplistic to make any use if it, and we extract the offset
+     * from the compare value
+     */
+    offset = (val & PSIHB_IRSN_COMP_MSK) >> PSIHB_IRSN_COMP_SH;
+    ics->offset = offset;
+}
+
+static bool pnv_psi_irq_bits(PnvPsiController *psi, PnvPsiIrq irq,
+                             uint32_t *out_xivr_reg,
+                             uint32_t *out_stat_reg,
+                             uint64_t *out_stat_bit)
+{
+    switch (irq) {
+    case PSIHB_IRQ_PSI:
+        *out_xivr_reg = PSIHB_XSCOM_XIVR_PSI;
+        *out_stat_reg = PSIHB_XSCOM_CR;
+        *out_stat_bit = PSIHB_CR_PSI_IRQ;
+        break;
+    case PSIHB_IRQ_FSP:
+        *out_xivr_reg = PSIHB_XSCOM_XIVR_PSI;
+        *out_stat_reg = PSIHB_XSCOM_CR;
+        *out_stat_bit = PSIHB_CR_FSP_IRQ;
+        break;
+    case PSIHB_IRQ_OCC:
+        *out_xivr_reg = PSIHB_XSCOM_XIVR_OCC;
+        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
+        *out_stat_bit = PSIHB_IRQ_STAT_OCC;
+        break;
+    case PSIHB_IRQ_FSI:
+        *out_xivr_reg = PSIHB_XSCOM_XIVR_FSI;
+        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
+        *out_stat_bit = PSIHB_IRQ_STAT_FSI;
+        break;
+    case PSIHB_IRQ_LPC_I2C:
+        *out_xivr_reg = PSIHB_XSCOM_XIVR_LPCI2C;
+        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
+        *out_stat_bit = PSIHB_IRQ_STAT_LPCI2C;
+        break;
+    case PSIHB_IRQ_LOCAL_ERR:
+        *out_xivr_reg = PSIHB_XSCOM_XIVR_LOCERR;
+        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
+        *out_stat_bit = PSIHB_IRQ_STAT_LOCERR;
+        break;
+    case PSIHB_IRQ_EXTERNAL:
+        *out_xivr_reg = PSIHB_XSCOM_XIVR_EXT;
+        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
+        *out_stat_bit = PSIHB_IRQ_STAT_EXT;
+        break;
+    default:
+        return false;
+    }
+    return true;
+}
+
+void pnv_psi_irq_set(PnvPsiController *psi, PnvPsiIrq irq, bool state)
+{
+    ICSState *ics = &psi->ics;
+    uint32_t xivr_reg;
+    uint32_t stat_reg;
+    uint64_t stat_bit;
+    uint32_t src;
+    bool masked;
+
+    if (!pnv_psi_irq_bits(psi, irq, &xivr_reg, &stat_reg, &stat_bit)) {
+        qemu_log_mask(LOG_GUEST_ERROR, "PSI: Unsupported irq %d\n", irq);
+        return;
+    }
+
+    src = (psi->regs[xivr_reg] & PSIHB_XIVR_SRC_MSK) >> PSIHB_XIVR_SRC_SH;
+    masked = (psi->regs[xivr_reg] & PSIHB_XIVR_PRIO_MSK) == PSIHB_XIVR_PRIO_MSK;
+    if (state) {
+        psi->regs[stat_reg] |= stat_bit;
+        /* XXX optimization: check mask here. That means re-evaluating
+         * when unmasking, thus TODO
+         */
+        qemu_irq_raise(ics->qirqs[src]);
+    } else {
+        psi->regs[stat_reg] &= ~stat_bit;
+
+        /* FSP and PSI are muxed so don't lower if either still set */
+        if (stat_reg != PSIHB_XSCOM_CR ||
+            !(psi->regs[stat_reg] & (PSIHB_CR_PSI_IRQ | PSIHB_CR_FSP_IRQ))) {
+            qemu_irq_lower(ics->qirqs[src]);
+        } else {
+            state = true;
+        }
+    }
+
+    /* XXX Note about the emulation of the pending bit: This isn't
+     * entirely correct. The pending bit should be cleared when the
+     * EOI has been received. However, we don't have callbacks on
+     * EOI (especially not under KVM) so no way to emulate that
+     * properly, so instead we just set that bit as the logical
+     * "output" of the XIVR (ie pending & !masked)
+     * XXX TODO: Also update it on set_xivr
+     */
+    if (state && !masked) {
+        psi->regs[xivr_reg] |= PSIHB_XIVR_PENDING;
+    } else {
+        psi->regs[xivr_reg] &= ~PSIHB_XIVR_PENDING;
+    }
+}
+
+static void pnv_psi_set_xivr(PnvPsiController *psi, uint32_t reg, uint64_t val)
+{
+    ICSState *ics = &psi->ics;
+    uint16_t server;
+    uint8_t prio;
+    uint8_t src;
+    int icp_index;
+
+    psi->regs[reg] = (psi->regs[reg] & PSIHB_XIVR_PENDING) |
+            (val & (PSIHB_XIVR_SERVER_MSK |
+                    PSIHB_XIVR_PRIO_MSK |
+                    PSIHB_XIVR_SRC_MSK));
+    val = psi->regs[reg];
+    server = (val & PSIHB_XIVR_SERVER_MSK) >> PSIHB_XIVR_SERVER_SH;
+    prio = (val & PSIHB_XIVR_PRIO_MSK) >> PSIHB_XIVR_PRIO_SH;
+    src = (val & PSIHB_XIVR_SRC_MSK) >> PSIHB_XIVR_SRC_SH;
+    if (src > PSIHB_IRQ_EXTERNAL) {
+        /* XXX Generate error ? */
+        return;
+    }
+
+    /*
+     * Linux fills the irq xivr with the hw processor id plus the
+     * link bits. shift back to get something valid.
+     */
+    server >>= 2;
+
+    /*
+     * When skiboot initializes PSIHB, it fills the xives with
+     * server=0, prio=0xff, but we don't have a CPU with a pir=0. So
+     * skip that case.
+     */
+    if (prio != 0xff) {
+        icp_index = xics_get_cpu_index_by_pir(ics->xics, server);
+        assert(icp_index != -1);
+    } else {
+        if (server) {
+            qemu_log_mask(LOG_GUEST_ERROR, "PSI: bogus server %d for IRQ %d\n",
+                          server, src);
+        }
+        icp_index = server;
+    }
+
+    /* Now because of source remapping, weird things can happen
+     * if you change the source number dynamically, our simple ICS
+     * doesn't deal with remapping. So we just poke a different
+     * ICS entry based on what source number was written. This will
+     * do for now but a more accurate implementation would instead
+     * use a fixed server/prio and a remapper of the generated irq.
+     */
+    ics_simple_write_xive(ics, src, icp_index, prio, prio);
+}
+
+static bool pnv_psi_reg_read(PnvPsiController *psi, uint32_t offset,
+                             uint64_t *out_val, bool mmio)
+{
+    switch (offset) {
+    case PSIHB_XSCOM_FIR_RW:
+    case PSIHB_XSCOM_FIRACT0:
+    case PSIHB_XSCOM_FIRACT1:
+    case PSIHB_XSCOM_BAR:
+    case PSIHB_XSCOM_FSPBAR:
+    case PSIHB_XSCOM_CR:
+    case PSIHB_XSCOM_XIVR_PSI:
+    case PSIHB_XSCOM_XIVR_OCC:
+    case PSIHB_XSCOM_XIVR_FSI:
+    case PSIHB_XSCOM_XIVR_LPCI2C:
+    case PSIHB_XSCOM_XIVR_LOCERR:
+    case PSIHB_XSCOM_XIVR_EXT:
+    case PSIHB_XSCOM_IRQ_STAT:
+    case PSIHB_XSCOM_SEMR:
+    case PSIHB_XSCOM_DMA_UPADD:
+    case PSIHB_XSCOM_IRSN:
+        *out_val = psi->regs[offset];
+        return true;
+    }
+    return false;
+}
+
+static bool pnv_psi_reg_write(PnvPsiController *psi, uint32_t offset,
+                              uint64_t val, bool mmio)
+{
+    switch (offset) {
+    case PSIHB_XSCOM_FIR_RW:
+    case PSIHB_XSCOM_FIRACT0:
+    case PSIHB_XSCOM_FIRACT1:
+    case PSIHB_XSCOM_SEMR:
+    case PSIHB_XSCOM_DMA_UPADD:
+        psi->regs[offset] = val;
+        return true;
+    case PSIHB_XSCOM_FIR_OR:
+        psi->regs[PSIHB_XSCOM_FIR_RW] |= val;
+        return true;
+    case PSIHB_XSCOM_FIR_AND:
+        psi->regs[PSIHB_XSCOM_FIR_RW] &= val;
+        return true;
+    case PSIHB_XSCOM_BAR:
+        /* Only XSCOM can write this one */
+        if (!mmio) {
+            pnv_psi_set_bar(psi, val);
+        }
+        return true;
+    case PSIHB_XSCOM_FSPBAR:
+        psi->regs[PSIHB_XSCOM_BAR] = val & 0x0003ffff00000000;
+        pnv_psi_update_fsp_mr(psi);
+        return true;
+    case PSIHB_XSCOM_CR:
+        pnv_psi_set_cr(psi, val);
+        return true;
+    case PSIHB_XSCOM_SCR:
+        pnv_psi_set_cr(psi, psi->regs[PSIHB_XSCOM_CR] | val);
+        return true;
+    case PSIHB_XSCOM_CCR:
+        pnv_psi_set_cr(psi, psi->regs[PSIHB_XSCOM_CR] & ~val);
+        return true;
+    case PSIHB_XSCOM_XIVR_PSI:
+    case PSIHB_XSCOM_XIVR_OCC:
+    case PSIHB_XSCOM_XIVR_FSI:
+    case PSIHB_XSCOM_XIVR_LPCI2C:
+    case PSIHB_XSCOM_XIVR_LOCERR:
+    case PSIHB_XSCOM_XIVR_EXT:
+        pnv_psi_set_xivr(psi, offset, val);
+        return true;
+    case PSIHB_XSCOM_IRQ_STAT:
+        /* Read only, should we generate an error ? */
+        return true;
+    case PSIHB_XSCOM_IRSN:
+        pnv_psi_set_irsn(psi, val);
+        return true;
+    }
+    return false;
+}
+
+static uint64_t pnv_psi_mmio_read(void *opaque, hwaddr addr, unsigned size)
+{
+    PnvPsiController *psi = opaque;
+    uint32_t xscom_off;
+    uint64_t val;
+
+    if (size != 8) {
+        goto fail;
+    }
+
+    addr &= (PNV_PSIHB_BAR_SIZE - 1);
+
+    if (addr >= PSIHB_MMIO_MAX) {
+        goto fail;
+    }
+    xscom_off = psi_mmio_to_xscom[addr / 8];
+    if (xscom_off == 0) {
+        goto fail;
+    }
+    if (pnv_psi_reg_read(psi, xscom_off, &val, true)) {
+        return val;
+    }
+ fail:
+    return 0xffffffffffffffffull;
+}
+
+static void pnv_psi_mmio_write(void *opaque, hwaddr addr,
+                              uint64_t val, unsigned size)
+{
+    PnvPsiController *psi = opaque;
+    uint32_t xscom_off;
+
+    if (size != 8) {
+        return;
+    }
+
+    addr &= (PNV_PSIHB_BAR_SIZE - 1);
+
+    if (addr >= PSIHB_MMIO_MAX) {
+        return;
+    }
+    xscom_off = psi_mmio_to_xscom[addr / 8];
+    if (xscom_off == 0) {
+        return;
+    }
+    pnv_psi_reg_write(psi, xscom_off, val, true);
+}
+
+static const MemoryRegionOps psi_mmio_ops = {
+    .read = pnv_psi_mmio_read,
+    .write = pnv_psi_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_xscom_read(void *opaque, hwaddr addr, unsigned size)
+{
+    PnvPsiController *psi = PNV_PSI(opaque);
+    uint32_t offset = addr >> 3;
+    uint64_t val = 0;
+
+    pnv_psi_reg_read(psi, offset, &val, false);
+
+    return val;
+}
+
+static void pnv_psi_xscom_write(void *opaque, hwaddr addr,
+                                uint64_t val, unsigned size)
+{
+    PnvPsiController *psi = PNV_PSI(opaque);
+    uint32_t offset = addr >> 3;
+
+    pnv_psi_reg_write(psi, offset, val, false);
+}
+
+static const MemoryRegionOps pnv_psi_xscom_ops = {
+    .read = pnv_psi_xscom_read,
+    .write = pnv_psi_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_psi_init(Object *obj)
+{
+    PnvPsiController *psi = PNV_PSI(obj);
+
+    object_initialize(&psi->ics, sizeof(psi->ics), TYPE_ICS_SIMPLE);
+    object_property_add_child(obj, "ics-psi", OBJECT(&psi->ics), NULL);
+}
+
+static void pnv_psi_realize(DeviceState *dev, Error **errp)
+{
+    PnvPsiController *psi = PNV_PSI(dev);
+    ICSState *ics = &psi->ics;
+    Error *error = NULL;
+    unsigned int i;
+
+    /* Initialize MMIO region */
+    memory_region_init_io(&psi->regs_mr, OBJECT(dev), &psi_mmio_ops, psi,
+                          "psihb", PNV_PSIHB_BAR_SIZE);
+
+    /* Default BAR. Use object properties ? */
+    pnv_psi_set_bar(psi, PNV_PSIHB_BAR | PSIHB_BAR_EN);
+
+    /* Default sources in XIVR */
+    psi->regs[PSIHB_XSCOM_XIVR_PSI] = PSIHB_XIVR_PRIO_MSK |
+            (0ull << PSIHB_XIVR_SRC_SH);
+    psi->regs[PSIHB_XSCOM_XIVR_OCC] = PSIHB_XIVR_PRIO_MSK |
+            (1ull << PSIHB_XIVR_SRC_SH);
+    psi->regs[PSIHB_XSCOM_XIVR_FSI] = PSIHB_XIVR_PRIO_MSK |
+            (2ull << PSIHB_XIVR_SRC_SH);
+    psi->regs[PSIHB_XSCOM_XIVR_LPCI2C] = PSIHB_XIVR_PRIO_MSK |
+            (3ull << PSIHB_XIVR_SRC_SH);
+    psi->regs[PSIHB_XSCOM_XIVR_LOCERR] = PSIHB_XIVR_PRIO_MSK |
+            (4ull << PSIHB_XIVR_SRC_SH);
+    psi->regs[PSIHB_XSCOM_XIVR_EXT] = PSIHB_XIVR_PRIO_MSK |
+            (5ull << PSIHB_XIVR_SRC_SH);
+
+    /*
+     * PSI interrupt control source
+     * FIXME: nr_irqs should a property
+     */
+    ics->nr_irqs = PSI_NUM_INTERRUPTS;
+    object_property_set_bool(OBJECT(ics), true, "realized", &error);
+    if (error) {
+        error_propagate(errp, error);
+        return;
+    }
+
+    for (i = 0; i < ics->nr_irqs; i++) {
+        ics_set_irq_type(ics, i, true);
+    }
+
+    /* XScom region for PSI registers */
+    pnv_xscom_region_init(&psi->xscom_regs, OBJECT(dev), &pnv_psi_xscom_ops,
+                psi, "xscom-psi", PNV_XSCOM_PSI_SIZE);
+}
+
+static int pnv_psi_populate(PnvXScomInterface *dev, void *fdt, int xscom_offset)
+{
+    const char compat[] = "ibm,power8-psihb-x\0ibm,psihb-x";
+    char *name;
+    int offset;
+    uint32_t lpc_pcba = PNV_XSCOM_PSI_BASE;
+    uint32_t reg[] = {
+        cpu_to_be32(lpc_pcba),
+        cpu_to_be32(PNV_XSCOM_PSI_SIZE)
+    };
+
+    name = g_strdup_printf("psihb@%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_cell(fdt, offset, "#address-cells", 2)));
+    _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1)));
+    _FDT((fdt_setprop(fdt, offset, "compatible", compat,
+                      sizeof(compat))));
+    return 0;
+}
+
+
+static void pnv_psi_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
+
+    xdc->populate = pnv_psi_populate;
+
+    dc->realize = pnv_psi_realize;
+}
+
+static const TypeInfo pnv_psi_info = {
+    .name          = TYPE_PNV_PSI,
+    .parent        = TYPE_DEVICE,
+    .instance_size = sizeof(PnvPsiController),
+    .instance_init = pnv_psi_init,
+    .class_init    = pnv_psi_class_init,
+    .interfaces    = (InterfaceInfo[]) {
+        { TYPE_PNV_XSCOM_INTERFACE },
+        { }
+    }
+};
+
+static void pnv_psi_register_types(void)
+{
+    type_register_static(&pnv_psi_info);
+}
+
+type_init(pnv_psi_register_types)
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index e11618b05f1d..6fcbedf56d79 100644
--- a/include/hw/ppc/pnv.h
+++ b/include/hw/ppc/pnv.h
@@ -24,6 +24,7 @@
 #include "hw/ppc/pnv_xscom.h"
 #include "hw/ppc/pnv_lpc.h"
 #include "hw/ppc/xics.h"
+#include "hw/ppc/pnv_psi.h"
 
 #define TYPE_PNV_CHIP "powernv-chip"
 #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
@@ -59,6 +60,7 @@ typedef struct PnvChip {
 
     PnvLpcController lpc;
     XICSNative   xics;
+    PnvPsiController psi;
 } PnvChip;
 
 typedef struct PnvChipClass {
@@ -116,6 +118,7 @@ typedef struct PnvMachineState {
     PnvChip      **chips;
 
     ISABus       *isa_bus;
+    uint32_t     cpld_irqstate;
 } PnvMachineState;
 
 #define PNV_FDT_ADDR          0x01000000
@@ -147,4 +150,8 @@ typedef struct PnvMachineState {
 #define PNV_XICS_BASE         0x0003ffff80000000ull
 #define PNV_XICS_SIZE         0x0000000000100000ull
 
+#define PNV_PSIHB_BAR         0x0003fffe80000000ull
+#define PNV_PSIHB_BAR_SIZE    0x0000000000100000ull
+
+
 #endif /* _PPC_PNV_H */
diff --git a/include/hw/ppc/pnv_psi.h b/include/hw/ppc/pnv_psi.h
new file mode 100644
index 000000000000..30bb9bc71839
--- /dev/null
+++ b/include/hw/ppc/pnv_psi.h
@@ -0,0 +1,64 @@
+/*
+ * QEMU PowerPC PowerNV PSI controller
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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/>.
+ */
+#ifndef _PPC_PNV_PSI_H
+#define _PPC_PNV_PSI_H
+
+#include "hw/ppc/pnv_xscom.h"
+#include "hw/ppc/pnv_psi.h"
+
+#define TYPE_PNV_PSI "pnv-psi"
+#define PNV_PSI(obj) \
+     OBJECT_CHECK(PnvPsiController, (obj), TYPE_PNV_PSI)
+
+#define PSIHB_XSCOM_MAX         0x20
+
+typedef struct XICSState XICSState;
+
+typedef struct PnvPsiController {
+    DeviceState parent;
+
+    MemoryRegion regs_mr;
+
+    /* FSP region not supported */
+    /* MemoryRegion fsp_mr; */
+
+    /* Interrupt generation */
+    ICSState ics;
+
+    /* Registers */
+    uint64_t regs[PSIHB_XSCOM_MAX];
+
+    MemoryRegion xscom_regs;
+} PnvPsiController;
+
+typedef enum PnvPsiIrq {
+    PSIHB_IRQ_PSI, /* internal use only */
+    PSIHB_IRQ_FSP, /* internal use only */
+    PSIHB_IRQ_OCC,
+    PSIHB_IRQ_FSI,
+    PSIHB_IRQ_LPC_I2C,
+    PSIHB_IRQ_LOCAL_ERR,
+    PSIHB_IRQ_EXTERNAL,
+} PnvPsiIrq;
+
+#define PSI_NUM_INTERRUPTS 6
+
+extern void pnv_psi_irq_set(PnvPsiController *psi, PnvPsiIrq irq, bool state);
+
+#endif /* _PPC_PNV_PSI_H */
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index c0a2fbb9f6f8..ea7ac88bf311 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -63,6 +63,9 @@ typedef struct PnvXScomInterfaceClass {
 #define PNV_XSCOM_LPC_BASE        0xb0020
 #define PNV_XSCOM_LPC_SIZE        0x4
 
+#define PNV_XSCOM_PSI_BASE        0x2010900
+#define PNV_XSCOM_PSI_SIZE        0x20
+
 extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
 extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
 
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 16/17] ppc/pnv: Add OCC model stub with interrupt support
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (14 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 17/17] ppc/pnv: Add Naples chip support for LPC interrupts Cédric Le Goater
  2016-10-24  5:33 ` [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space David Gibson
  17 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

The OCC is an on-chip microcontroller based on a ppc405 core used
for various power management tasks. It comes with a pile of additional
hardware sitting on the PIB (aka XSCOM bus). At this point we don't
emulate it (nor plan to do so). However there is one facility which
is provided by the surrounding hardware that we do need, which is the
interrupt generation facility. OPAL uses it to send itself interrupts
under some circumstances and there are other uses around the corner.

So this implement just enough to support this.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[clg: - updated for qemu-2.7
      - changed the XSCOM interface to fit new model
      - QOMified the model ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
---

 Changes since v4:

 - used the helpers for the XSCOM region 

 hw/ppc/Makefile.objs       |   2 +-
 hw/ppc/pnv.c               |  10 ++++
 hw/ppc/pnv_occ.c           | 135 +++++++++++++++++++++++++++++++++++++++++++++
 include/hw/ppc/pnv.h       |   2 +
 include/hw/ppc/pnv_occ.h   |  38 +++++++++++++
 include/hw/ppc/pnv_xscom.h |   3 +
 6 files changed, 189 insertions(+), 1 deletion(-)
 create mode 100644 hw/ppc/pnv_occ.c
 create mode 100644 include/hw/ppc/pnv_occ.h

diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs
index 4feb15b360c8..35b11cf887d5 100644
--- a/hw/ppc/Makefile.objs
+++ b/hw/ppc/Makefile.objs
@@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o
 obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o
 obj-$(CONFIG_PSERIES) += spapr_cpu_core.o
 # IBM PowerNV
-obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o pnv_psi.o
+obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o pnv_psi.o pnv_occ.o
 ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy)
 obj-y += spapr_pci_vfio.o
 endif
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index ec1a17699023..ddbf7510424c 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -654,6 +654,11 @@ static void pnv_chip_init(Object *obj)
 
     object_initialize(&chip->psi, sizeof(chip->psi), TYPE_PNV_PSI);
     object_property_add_child(obj, "psi", OBJECT(&chip->psi), NULL);
+
+    object_initialize(&chip->occ, sizeof(chip->occ), TYPE_PNV_OCC);
+    object_property_add_child(obj, "occ", OBJECT(&chip->occ), NULL);
+    object_property_add_const_link(OBJECT(&chip->occ), "psi",
+                                   OBJECT(&chip->psi), &error_abort);
 }
 
 static void pnv_chip_realize(DeviceState *dev, Error **errp)
@@ -751,6 +756,11 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
     object_property_set_bool(OBJECT(&chip->lpc), true, "realized",
                              &error_fatal);
     pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip->lpc.xscom_regs);
+
+    /* Create the simplified OCC model */
+    object_property_set_bool(OBJECT(&chip->occ), true, "realized",
+                             &error_fatal);
+    pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip->occ.xscom_regs);
 }
 
 static Property pnv_chip_properties[] = {
diff --git a/hw/ppc/pnv_occ.c b/hw/ppc/pnv_occ.c
new file mode 100644
index 000000000000..ae6efc08940f
--- /dev/null
+++ b/hw/ppc/pnv_occ.c
@@ -0,0 +1,135 @@
+/*
+ * QEMU PowerNV Emulation of a few OCC related registers
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "qemu/osdep.h"
+#include "hw/hw.h"
+#include "sysemu/sysemu.h"
+#include "target-ppc/cpu.h"
+#include "qapi/error.h"
+#include "qemu/log.h"
+
+#include "hw/ppc/pnv.h"
+#include "hw/ppc/pnv_occ.h"
+
+#define OCB_OCI_OCCMISC         0x4020
+#define OCB_OCI_OCCMISC_AND     0x4021
+#define OCB_OCI_OCCMISC_OR      0x4022
+
+static void pnv_occ_set_misc(PnvOCC *occ, uint64_t val)
+{
+    bool irq_state;
+
+    val &= 0xffff000000000000ull;
+
+    occ->occmisc = val;
+    irq_state = !!(val >> 63);
+    pnv_psi_irq_set(occ->psi, PSIHB_IRQ_OCC, irq_state);
+}
+
+static uint64_t pnv_occ_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 OCB_OCI_OCCMISC:
+        val = occ->occmisc;
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
+                      HWADDR_PRIx "\n", addr);
+    }
+    return val;
+}
+
+static void pnv_occ_xscom_write(void *opaque, hwaddr addr,
+                                uint64_t val, unsigned size)
+{
+    PnvOCC *occ = PNV_OCC(opaque);
+    uint32_t offset = addr >> 3;
+
+    switch (offset) {
+    case OCB_OCI_OCCMISC_AND:
+        pnv_occ_set_misc(occ, occ->occmisc & val);
+        break;
+    case OCB_OCI_OCCMISC_OR:
+        pnv_occ_set_misc(occ, occ->occmisc | val);
+        break;
+    case OCB_OCI_OCCMISC:
+        pnv_occ_set_misc(occ, val);
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%"
+                      HWADDR_PRIx "\n", addr);
+    }
+}
+
+static const MemoryRegionOps pnv_occ_xscom_ops = {
+    .read = pnv_occ_xscom_read,
+    .write = pnv_occ_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_realize(DeviceState *dev, Error **errp)
+{
+    PnvOCC *occ = PNV_OCC(dev);
+    Object *obj;
+    Error *error = NULL;
+
+    occ->occmisc = 0;
+
+    /* 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;
+    }
+    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);
+}
+
+static void pnv_occ_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->realize = pnv_occ_realize;
+}
+
+static const TypeInfo pnv_occ_type_info = {
+    .name          = TYPE_PNV_OCC,
+    .parent        = TYPE_DEVICE,
+    .instance_size = sizeof(PnvOCC),
+    .class_init    = pnv_occ_class_init,
+};
+
+static void pnv_occ_register_types(void)
+{
+    type_register_static(&pnv_occ_type_info);
+}
+
+type_init(pnv_occ_register_types)
diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
index 6fcbedf56d79..7507e55290ad 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/xics.h"
 #include "hw/ppc/pnv_psi.h"
+#include "hw/ppc/pnv_occ.h"
 
 #define TYPE_PNV_CHIP "powernv-chip"
 #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
@@ -61,6 +62,7 @@ typedef struct PnvChip {
     PnvLpcController lpc;
     XICSNative   xics;
     PnvPsiController psi;
+    PnvOCC           occ;
 } PnvChip;
 
 typedef struct PnvChipClass {
diff --git a/include/hw/ppc/pnv_occ.h b/include/hw/ppc/pnv_occ.h
new file mode 100644
index 000000000000..54e760df7c4f
--- /dev/null
+++ b/include/hw/ppc/pnv_occ.h
@@ -0,0 +1,38 @@
+/*
+ * QEMU PowerNV Emulation of a few OCC related registers
+ *
+ * Copyright (c) 2016, IBM Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * 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/>.
+ */
+#ifndef _PPC_PNV_OCC_H
+#define _PPC_PNV_OCC_H
+
+#define TYPE_PNV_OCC "pnv-occ"
+#define PNV_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV_OCC)
+
+typedef struct PnvPsiController PnvPsiController;
+
+typedef struct PnvOCC {
+    DeviceState xd;
+
+    /* OCC Misc interrupt */
+    uint64_t occmisc;
+
+    PnvPsiController *psi;
+
+    MemoryRegion xscom_regs;
+} PnvOCC;
+
+#endif /* _PPC_PNV_OCC_H */
diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
index ea7ac88bf311..a0aa621255a8 100644
--- a/include/hw/ppc/pnv_xscom.h
+++ b/include/hw/ppc/pnv_xscom.h
@@ -66,6 +66,9 @@ typedef struct PnvXScomInterfaceClass {
 #define PNV_XSCOM_PSI_BASE        0x2010900
 #define PNV_XSCOM_PSI_SIZE        0x20
 
+#define PNV_XSCOM_OCC_BASE        0x0066000
+#define PNV_XSCOM_OCC_SIZE        0x6000
+
 extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
 extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
 
-- 
2.7.4

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

* [Qemu-devel] [PATCH v5 17/17] ppc/pnv: Add Naples chip support for LPC interrupts
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (15 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 16/17] ppc/pnv: Add OCC model stub with interrupt support Cédric Le Goater
@ 2016-10-22  9:46 ` Cédric Le Goater
  2016-10-25  5:35   ` David Gibson
  2016-10-24  5:33 ` [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space David Gibson
  17 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-22  9:46 UTC (permalink / raw)
  To: qemu-ppc
  Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf,
	Cedric Le Goater

From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

It adds the Naples chip which supports proper LPC interrupts via the
LPC controller rather than via an external CPLD.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[clg: - updated for qemu-2.7
      - ported on latest PowerNV patchset (v3) ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---

 Changes since v4:

 - remove test on ISA_NUM_IRQS 

 hw/ppc/pnv.c             | 15 ++++++++++++++-
 hw/ppc/pnv_lpc.c         | 47 +++++++++++++++++++++++++++++++++++++++++++++--
 include/hw/ppc/pnv_lpc.h |  9 +++++++++
 3 files changed, 68 insertions(+), 3 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index ddbf7510424c..4ef80b5b4110 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -336,7 +336,14 @@ static void pnv_lpc_isa_irq_handler_cpld(void *opaque, int n, int level)
 
 static void pnv_lpc_isa_irq_handler(void *opaque, int n, int level)
 {
-     /* XXX TODO */
+    PnvChip *chip = opaque;
+    PnvLpcController *lpc = &chip->lpc;
+
+    /* The Naples HW latches the 1 levels, clearing is done by SW */
+    if (level) {
+        lpc->lpc_hc_irqstat |= LPC_HC_IRQ_SERIRQ0 >> n;
+        pnv_lpc_eval_irqs(lpc);
+    }
 }
 
 static ISABus *pnv_isa_create(PnvChip *chip)
@@ -659,6 +666,12 @@ static void pnv_chip_init(Object *obj)
     object_property_add_child(obj, "occ", OBJECT(&chip->occ), NULL);
     object_property_add_const_link(OBJECT(&chip->occ), "psi",
                                    OBJECT(&chip->psi), &error_abort);
+
+    /*
+     * The LPC controller needs PSI to generate interrupts
+     */
+    object_property_add_const_link(OBJECT(&chip->lpc), "psi",
+                                   OBJECT(&chip->psi), &error_abort);
 }
 
 static void pnv_chip_realize(DeviceState *dev, Error **errp)
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index 00dbd8b07b38..91e966565694 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -249,6 +249,34 @@ static const MemoryRegionOps pnv_lpc_xscom_ops = {
     .endianness = DEVICE_BIG_ENDIAN,
 };
 
+void pnv_lpc_eval_irqs(PnvLpcController *lpc)
+{
+    bool lpc_to_opb_irq = false;
+
+    /* Update LPC controller to OPB line */
+    if (lpc->lpc_hc_irqser_ctrl & LPC_HC_IRQSER_EN) {
+        uint32_t irqs;
+
+        irqs = lpc->lpc_hc_irqstat & lpc->lpc_hc_irqmask;
+        lpc_to_opb_irq = (irqs != 0);
+    }
+
+    /* We don't honor the polarity register, it's pointless and unused
+     * anyway
+     */
+    if (lpc_to_opb_irq) {
+        lpc->opb_irq_input |= OPB_MASTER_IRQ_LPC;
+    } else {
+        lpc->opb_irq_input &= ~OPB_MASTER_IRQ_LPC;
+    }
+
+    /* Update OPB internal latch */
+    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);
+}
+
 static uint64_t lpc_hc_read(void *opaque, hwaddr addr, unsigned size)
 {
     PnvLpcController *lpc = opaque;
@@ -299,12 +327,15 @@ static void lpc_hc_write(void *opaque, hwaddr addr, uint64_t val,
         break;
     case LPC_HC_IRQSER_CTRL:
         lpc->lpc_hc_irqser_ctrl = val;
+        pnv_lpc_eval_irqs(lpc);
         break;
     case LPC_HC_IRQMASK:
         lpc->lpc_hc_irqmask = val;
+        pnv_lpc_eval_irqs(lpc);
         break;
     case LPC_HC_IRQSTAT:
         lpc->lpc_hc_irqstat &= ~val;
+        pnv_lpc_eval_irqs(lpc);
         break;
     case LPC_HC_ERROR_ADDRESS:
         break;
@@ -362,14 +393,15 @@ static void opb_master_write(void *opaque, hwaddr addr,
     switch (addr) {
     case OPB_MASTER_LS_IRQ_STAT:
         lpc->opb_irq_stat &= ~val;
+        pnv_lpc_eval_irqs(lpc);
         break;
     case OPB_MASTER_LS_IRQ_MASK:
-        /* XXX Filter out reserved bits */
         lpc->opb_irq_mask = val;
+        pnv_lpc_eval_irqs(lpc);
         break;
     case OPB_MASTER_LS_IRQ_POL:
-        /* XXX Filter out reserved bits */
         lpc->opb_irq_pol = val;
+        pnv_lpc_eval_irqs(lpc);
         break;
     case OPB_MASTER_LS_IRQ_INPUT:
         /* Read only */
@@ -397,6 +429,8 @@ static const MemoryRegionOps opb_master_ops = {
 static void pnv_lpc_realize(DeviceState *dev, Error **errp)
 {
     PnvLpcController *lpc = PNV_LPC(dev);
+    Object *obj;
+    Error *error = NULL;
 
     /* Reg inits */
     lpc->lpc_hc_fw_rd_acc_size = LPC_HC_FW_RD_4B;
@@ -440,6 +474,15 @@ static void pnv_lpc_realize(DeviceState *dev, Error **errp)
     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)
diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h
index 38e5506975aa..3ed7dafc799d 100644
--- a/include/hw/ppc/pnv_lpc.h
+++ b/include/hw/ppc/pnv_lpc.h
@@ -23,6 +23,8 @@
 #define PNV_LPC(obj) \
      OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV_LPC)
 
+typedef struct PnvPsiController PnvPsiController;
+
 typedef struct PnvLpcController {
     DeviceState parent;
 
@@ -62,6 +64,13 @@ typedef struct PnvLpcController {
 
     /* XSCOM registers */
     MemoryRegion xscom_regs;
+
+    /* PSI to generate interrupts */
+    PnvPsiController *psi;
 } PnvLpcController;
 
+#define   LPC_HC_IRQ_SERIRQ0            0x80000000 /* all bits down to ... */
+
+void pnv_lpc_eval_irqs(PnvLpcController *lpc);
+
 #endif /* _PPC_PNV_LPC_H */
-- 
2.7.4

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

* Re: [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space
  2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
                   ` (16 preceding siblings ...)
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 17/17] ppc/pnv: Add Naples chip support for LPC interrupts Cédric Le Goater
@ 2016-10-24  5:33 ` David Gibson
  2016-10-25  1:38   ` David Gibson
  17 siblings, 1 reply; 43+ messages in thread
From: David Gibson @ 2016-10-24  5:33 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Sat, Oct 22, 2016 at 11:46:33AM +0200, Cédric Le Goater wrote:
> Hello,
> 
> Here is the latest version of the ppc/pnv platform patchset. PowerNV
> (as Non-Virtualized) is the "baremetal" platform using the OPAL
> firmware. It runs Linux on IBM and Open Power systems and it can be
> used as an hypervisor OS, to run KVM guests, or simply as a host OS.
> The goal here is to add support for the baremetal platform and
> possibly later also for the KVM PR guests but not for HV guests.
> 
> In v5, all the comments from v4 should have been addressed. Most of
> the differences are cleanups suggested by David but there a couple of
> important changes :
> 
>  - an addition of a new firmware to qemu : skiboot 5.3.7.
>  - a rework of the native Interrupt Presentation Controller model
>    which now uses memory subregions instead of a hash table.   
>  - a removal of the Power9 LPC Controller. This is still in the plans
>    but the models need a little more work.
> 
> 
> The initial patches provide a minimal platform with some RAM to load
> the ROMs : firmware, kernel and initrd. The device tree is built with
> what is available at reset time. Then, comes the PnvChip object acting
> as a container for other devices required to run a system. The cores
> are added to each chip with some restrictions on the number and the
> ids. Next is the XSCOM model, the sideband bus which gives controls to
> all the units in the POWER8 chip, the LPC controller for the console,
> the native interrupt controller and the PSI HB model to handle the
> external interrupt.
> 
> 
> The next step should be IPMI support which adds a BT device on the ISA
> bus and some device tree extensions to read sensors and FRUs. This is
> relatively straight forward and most of the IPMI code has been
> discussed already on the list. Then should come a PHB3 model to
> include some PCI devices. This is big and it needs a few helpers in
> the PCI core.

I've merged 1-6 into ppc-for-2.8.  The rest I'm still reviewing.

> 
> If you feel adventurous, you can grab kernel and rootfs images :
> 
>   https://openpower.xyz/job/openpower-op-build/distro=ubuntu,target=palmetto/lastSuccessfulBuild/artifact/images/zImage.epapr
>   https://openpower.xyz/job/openpower-op-build/distro=ubuntu,target=palmetto/lastSuccessfulBuild/artifact/images/rootfs.cpio.xz
> 
> and give it a try. The full patchset is available here :
> 
>    https://github.com/legoater/qemu/commits/powernv-ipmi-2.8
> 
> This is a wip branch, which I stabilize when the qemu version, on
> which it is based, is released.
> 
> Thanks,
> 
> C. 
> 
> Benjamin Herrenschmidt (5):
>   ppc/pnv: add skeleton PowerNV platform
>   ppc/pnv: add a LPC controller
>   ppc/pnv: Add cut down PSI bridge model and hookup external interrupt
>   ppc/pnv: Add OCC model stub with interrupt support
>   ppc/pnv: Add Naples chip support for LPC interrupts
> 
> Cédric Le Goater (12):
>   ppc: add skiboot firmware for the pnv platform
>   ppc/pnv: add a PnvChip object
>   ppc/pnv: add a core mask to PnvChip
>   ppc/pnv: add a PIR handler to PnvChip
>   ppc/pnv: add a PnvCore object
>   ppc/pnv: add XSCOM infrastructure
>   ppc/pnv: add XSCOM handlers to PnvCore
>   ppc/pnv: add a ISA bus
>   ppc/xics: Add "native" XICS subclass
>   ppc/pnv: add a XICS native to each PowerNV chip
>   ppc/xics: add a xics_get_cpu_index_by_pir helper
>   ppc/xics: introduce a helper to insert a new ics
> 
>  .gitmodules                       |   3 +
>  MAINTAINERS                       |   1 +
>  Makefile                          |   2 +-
>  default-configs/ppc64-softmmu.mak |   4 +-
>  hw/intc/Makefile.objs             |   1 +
>  hw/intc/xics.c                    |   6 +
>  hw/intc/xics_native.c             | 323 ++++++++++++++
>  hw/ppc/Makefile.objs              |   2 +
>  hw/ppc/pnv.c                      | 888 ++++++++++++++++++++++++++++++++++++++
>  hw/ppc/pnv_core.c                 | 248 +++++++++++
>  hw/ppc/pnv_lpc.c                  | 514 ++++++++++++++++++++++
>  hw/ppc/pnv_occ.c                  | 135 ++++++
>  hw/ppc/pnv_psi.c                  | 615 ++++++++++++++++++++++++++
>  hw/ppc/pnv_xscom.c                | 277 ++++++++++++
>  include/hw/ppc/pnv.h              | 159 +++++++
>  include/hw/ppc/pnv_core.h         |  50 +++
>  include/hw/ppc/pnv_lpc.h          |  76 ++++
>  include/hw/ppc/pnv_occ.h          |  38 ++
>  include/hw/ppc/pnv_psi.h          |  64 +++
>  include/hw/ppc/pnv_xscom.h        |  84 ++++
>  include/hw/ppc/xics.h             |  26 ++
>  pc-bios/README                    |   5 +
>  pc-bios/skiboot.lid               | Bin 0 -> 983893 bytes
>  roms/Makefile                     |   8 +-
>  roms/skiboot                      |   1 +
>  25 files changed, 3527 insertions(+), 3 deletions(-)
>  create mode 100644 hw/intc/xics_native.c
>  create mode 100644 hw/ppc/pnv.c
>  create mode 100644 hw/ppc/pnv_core.c
>  create mode 100644 hw/ppc/pnv_lpc.c
>  create mode 100644 hw/ppc/pnv_occ.c
>  create mode 100644 hw/ppc/pnv_psi.c
>  create mode 100644 hw/ppc/pnv_xscom.c
>  create mode 100644 include/hw/ppc/pnv.h
>  create mode 100644 include/hw/ppc/pnv_core.h
>  create mode 100644 include/hw/ppc/pnv_lpc.h
>  create mode 100644 include/hw/ppc/pnv_occ.h
>  create mode 100644 include/hw/ppc/pnv_psi.h
>  create mode 100644 include/hw/ppc/pnv_xscom.h
>  create mode 100644 pc-bios/skiboot.lid
>  create mode 160000 roms/skiboot
> 

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 12/17] ppc/pnv: add a XICS native to each PowerNV chip
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 12/17] ppc/pnv: add a XICS native to each PowerNV chip Cédric Le Goater
@ 2016-10-24 15:42   ` Cédric Le Goater
  2016-10-25  5:11     ` David Gibson
  0 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-24 15:42 UTC (permalink / raw)
  To: qemu-ppc; +Cc: David Gibson, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

On 10/22/2016 11:46 AM, Cédric Le Goater wrote:
> It also links the XICS object to each core as it is needed to do the
> CPU setup and the ICP MMIO windows are memory mapped for each thread.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
> 
>  Changes since v4:
> 
>  - changed the calculation of the number of ICPs to use smp_threads
>  - added the mapping of the ICP subregions per thread
> 
>  hw/ppc/pnv.c         | 27 +++++++++++++++++++++++++++
>  hw/ppc/pnv_core.c    | 24 ++++++++++++++++++++----
>  include/hw/ppc/pnv.h |  2 ++
>  3 files changed, 49 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index c6dc7ca895b6..16d7baf0da71 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -33,6 +33,7 @@
>  #include "qemu/cutils.h"
>  #include "qapi/visitor.h"
>  
> +#include "hw/ppc/xics.h"
>  #include "hw/ppc/pnv_xscom.h"
>  
>  #include "hw/isa/isa.h"
> @@ -231,6 +232,9 @@ static void powernv_populate_chip(PnvChip *chip, void *fdt)
>          PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
>  
>          powernv_create_core_node(chip, pnv_core, fdt);
> +
> +        /* Interrupt presentation controllers (ICP). One per thread. */
> +        xics_native_populate_icp(chip, fdt, 0, pnv_core->pir, smp_threads);
>      }
>  
>      if (chip->ram_size) {
> @@ -637,6 +641,9 @@ static void pnv_chip_init(Object *obj)
>  
>      object_initialize(&chip->lpc, sizeof(chip->lpc), TYPE_PNV_LPC);
>      object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), NULL);
> +
> +    object_initialize(&chip->xics, sizeof(chip->xics), TYPE_XICS_NATIVE);
> +    object_property_add_child(obj, "xics", OBJECT(&chip->xics), NULL);
>  }
>  
>  static void pnv_chip_realize(DeviceState *dev, Error **errp)
> @@ -668,12 +675,23 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
>          return;
>      }
>  
> +    /*
> +     * Interrupt Controller. To be created before the cores because
> +     * each thread will fetch its ICP in the XICS
> +     */
> +    object_property_set_int(OBJECT(&chip->xics), chip->nr_cores * smp_threads,
> +                            "nr_servers",  &error_fatal);
> +    object_property_set_bool(OBJECT(&chip->xics), true, "realized",
> +                             &error_fatal);
> +    sysbus_mmio_map(SYS_BUS_DEVICE(&chip->xics), 0, PNV_XICS_BASE);
> +
>      chip->cores = g_malloc0(typesize * chip->nr_cores);
>  
>      for (i = 0, core_hwid = 0; (core_hwid < sizeof(chip->cores_mask) * 8)
>               && (i < chip->nr_cores); core_hwid++) {
>          char core_name[32];
>          void *pnv_core = chip->cores + i * typesize;
> +        int j;
>  
>          if (!(chip->cores_mask & (1ull << core_hwid))) {
>              continue;
> @@ -690,6 +708,8 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
>          object_property_set_int(OBJECT(pnv_core),
>                                  pcc->core_pir(chip, core_hwid),
>                                  "pir", &error_fatal);
> +        object_property_add_const_link(OBJECT(pnv_core), "xics",
> +                                       OBJECT(&chip->xics), &error_fatal);
>          object_property_set_bool(OBJECT(pnv_core), true, "realized",
>                                   &error_fatal);
>          object_unref(OBJECT(pnv_core));
> @@ -697,6 +717,13 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
>          /* Each core has an XSCOM MMIO region */
>          pnv_xscom_add_subregion(chip, PNV_XSCOM_EX_CORE_BASE(core_hwid),
>                                  &PNV_CORE(pnv_core)->xscom_regs);
> +
> +        /* Each thread as region for its ICP */
> +        for (j = 0; j < smp_threads; j++) {
> +            memory_region_add_subregion(&chip->xics.icp_mmio,
> +                                        pcc->core_pir(chip, core_hwid) << 12,

Pffut ... This should be :

                                          (pcc->core_pir(chip, core_hwid) + j) << 12,

but as smp_threads=1, it has no consequences for the moment. Tell me 
how you would prefer me to fix this.

Thanks,

C.


> +                                        &chip->xics.icp_mmios[i]);
> +        }
>          i++;
>      }
>      g_free(typename);
> diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
> index 2acda9637db5..e15c76163759 100644
> --- a/hw/ppc/pnv_core.c
> +++ b/hw/ppc/pnv_core.c
> @@ -24,6 +24,7 @@
>  #include "hw/ppc/ppc.h"
>  #include "hw/ppc/pnv.h"
>  #include "hw/ppc/pnv_core.h"
> +#include "hw/ppc/xics.h"
>  
>  static void powernv_cpu_reset(void *opaque)
>  {
> @@ -42,7 +43,7 @@ static void powernv_cpu_reset(void *opaque)
>      env->msr |= MSR_HVB; /* Hypervisor mode */
>  }
>  
> -static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
> +static void powernv_cpu_init(PowerPCCPU *cpu, XICSState *xics, Error **errp)
>  {
>      CPUPPCState *env = &cpu->env;
>      int core_pir;
> @@ -62,6 +63,11 @@ static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
>      cpu_ppc_tb_init(env, PNV_TIMEBASE_FREQ);
>  
>      qemu_register_reset(powernv_cpu_reset, cpu);
> +
> +    /*
> +     * xics_cpu_setup() assigns the CPU to the ICP in XICS
> +     */
> +    xics_cpu_setup(xics, cpu);
>  }
>  
>  /*
> @@ -109,7 +115,7 @@ static const MemoryRegionOps pnv_core_xscom_ops = {
>      .endianness = DEVICE_BIG_ENDIAN,
>  };
>  
> -static void pnv_core_realize_child(Object *child, Error **errp)
> +static void pnv_core_realize_child(Object *child, XICSState *xics, Error **errp)
>  {
>      Error *local_err = NULL;
>      CPUState *cs = CPU(child);
> @@ -121,7 +127,7 @@ static void pnv_core_realize_child(Object *child, Error **errp)
>          return;
>      }
>  
> -    powernv_cpu_init(cpu, &local_err);
> +    powernv_cpu_init(cpu, xics, &local_err);
>      if (local_err) {
>          error_propagate(errp, local_err);
>          return;
> @@ -139,6 +145,7 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
>      void *obj;
>      int i, j;
>      char name[32];
> +    XICSState *xics;
>  
>      pc->threads = g_malloc0(size * cc->nr_threads);
>      for (i = 0; i < cc->nr_threads; i++) {
> @@ -156,10 +163,19 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
>          object_unref(obj);
>      }
>  
> +    /* get XICS object from chip */
> +    obj = object_property_get_link(OBJECT(dev), "xics", &local_err);
> +    if (!obj) {
> +        error_setg(errp, "%s: required link 'xics' not found: %s",
> +                   __func__, error_get_pretty(local_err));
> +        return;
> +    }
> +    xics = XICS_COMMON(obj);
> +
>      for (j = 0; j < cc->nr_threads; j++) {
>          obj = pc->threads + j * size;
>  
> -        pnv_core_realize_child(obj, &local_err);
> +        pnv_core_realize_child(obj, xics, &local_err);
>          if (local_err) {
>              goto err;
>          }
> diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
> index c08ed1c72b17..e11618b05f1d 100644
> --- a/include/hw/ppc/pnv.h
> +++ b/include/hw/ppc/pnv.h
> @@ -23,6 +23,7 @@
>  #include "hw/sysbus.h"
>  #include "hw/ppc/pnv_xscom.h"
>  #include "hw/ppc/pnv_lpc.h"
> +#include "hw/ppc/xics.h"
>  
>  #define TYPE_PNV_CHIP "powernv-chip"
>  #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
> @@ -57,6 +58,7 @@ typedef struct PnvChip {
>      AddressSpace xscom_as;
>  
>      PnvLpcController lpc;
> +    XICSNative   xics;
>  } PnvChip;
>  
>  typedef struct PnvChipClass {
> 

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

* Re: [Qemu-devel] [PATCH v5 07/17] ppc/pnv: add XSCOM infrastructure
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 07/17] ppc/pnv: add XSCOM infrastructure Cédric Le Goater
@ 2016-10-25  1:13   ` David Gibson
  2016-10-25  6:24     ` Cédric Le Goater
  0 siblings, 1 reply; 43+ messages in thread
From: David Gibson @ 2016-10-25  1:13 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Sat, Oct 22, 2016 at 11:46:40AM +0200, Cédric Le Goater wrote:
> On a real POWER8 system, the Pervasive Interconnect Bus (PIB) serves
> as a backbone to connect different units of the system. The host
> firmware connects to the PIB through a bridge unit, the
> Alter-Display-Unit (ADU), which gives him access to all the chiplets
> on the PCB network (Pervasive Connect Bus), the PIB acting as the root
> of this network.
> 
> XSCOM (serial communication) is the interface to the sideband bus
> provided by the POWER8 pervasive unit to read and write to chiplets
> resources. This is needed by the host firmware, OPAL and to a lesser
> extent, Linux. This is among others how the PCI Host bridges get
> configured at boot or how the LPC bus is accessed.
> 
> To represent the ADU of a real system, we introduce a specific
> AddressSpace to dispatch XSCOM accesses to the targeted chiplets. The
> translation of an XSCOM address into a PCB register address is
> slightly different between the P9 and the P8. This is handled before
> the dispatch using a 8byte alignment for all.
> 
> To customize the device tree, a QOM InterfaceClass, PnvXScomInterface,
> is provided with a populate() handler. The chip populates the device
> tree by simply looping on its children. Therefore, each model needing
> custom nodes should not forget to declare itself as a child at
> instantiation time.
> 
> Based on previous work done by :
>       Benjamin Herrenschmidt <benh@kernel.crashing.org>
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

Looks like xscom_complete() is still using current_cpu, which I've
mentioned before.  Apart from that;

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> 
>  Changes since v4:
> 
>  - added helpers to initialize and map the chiplet XSCOM regions
>    in the XSCOM address space. This is to hide the '<< 3' shift.
> 
>  Changes since v3:
> 
>  - reworked the model to dispatch addresses to the memory regions
>    using pcb_addr << 3, which is a no-op for the P9. The benefit is
>    that all the address translation work can be done before dispatch
>    and the conversion handlers in the chip and in the xscom interface
>    are gone.
>    
>  - removed the proxy PnnXscom object and extended the PnvChip object
>    with an address space for XSCOM and its associated memory region.
>    
>  - changed the read/write handlers in the address space to use
>    address_space_stq() and address_space_ldq()
>    
>  - introduced 'fake' default read/write handlers to handle 'core'
>    registers. We can add a real device model when more work needs to
>    be done under these.
>    
>  - fixed an issue with the monitor doing read/write in the XSCOM
>    address space. When under the monitor, we don't have a cpu to
>    update the HMER SPR. That might need more work in the long term.
>    
>  - introduced a xscom base field to hold the xscom base address as
>    it is different on P9
> 
>  - renamed the devnode() handler to populate()
> 
>  Changes since v2:
> 
>  - QOMified the model.
>  
>  - all mappings in main memory space are now gathered in
>    pnv_chip_realize() as done on other architectures.
>    
>  - removed XScomBus. The parenthood is established through the QOM
>    model
>    
>  - replaced the XScomDevice with an InterfaceClass : PnvXScomInterface. 
>  - introduced an XSCOM address space to dispatch accesses to the
>    chiplets
> 
>  hw/ppc/Makefile.objs       |   2 +-
>  hw/ppc/pnv.c               |  25 ++++
>  hw/ppc/pnv_xscom.c         | 277 +++++++++++++++++++++++++++++++++++++++++++++
>  include/hw/ppc/pnv.h       |  15 +++
>  include/hw/ppc/pnv_xscom.h |  56 +++++++++
>  5 files changed, 374 insertions(+), 1 deletion(-)
>  create mode 100644 hw/ppc/pnv_xscom.c
>  create mode 100644 include/hw/ppc/pnv_xscom.h
> 
> diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs
> index f8c7d1db9ade..08c213c40684 100644
> --- a/hw/ppc/Makefile.objs
> +++ b/hw/ppc/Makefile.objs
> @@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o
>  obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o
>  obj-$(CONFIG_PSERIES) += spapr_cpu_core.o
>  # IBM PowerNV
> -obj-$(CONFIG_POWERNV) += pnv.o pnv_core.o
> +obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o
>  ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy)
>  obj-y += spapr_pci_vfio.o
>  endif
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 3413107697d3..96ba36cc272d 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -33,6 +33,8 @@
>  #include "qemu/cutils.h"
>  #include "qapi/visitor.h"
>  
> +#include "hw/ppc/pnv_xscom.h"
> +
>  #include <libfdt.h>
>  
>  #define FDT_MAX_SIZE            0x00100000
> @@ -219,6 +221,8 @@ static void powernv_populate_chip(PnvChip *chip, void *fdt)
>      size_t typesize = object_type_get_instance_size(typename);
>      int i;
>  
> +    pnv_xscom_populate(chip, fdt, 0);
> +
>      for (i = 0; i < chip->nr_cores; i++) {
>          PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
>  
> @@ -455,6 +459,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data)
>      k->chip_cfam_id = 0x221ef04980000000ull;  /* P8 Murano DD2.1 */
>      k->cores_mask = POWER8E_CORE_MASK;
>      k->core_pir = pnv_chip_core_pir_p8;
> +    k->xscom_base = 0x003fc0000000000ull;
>      dc->desc = "PowerNV Chip POWER8E";
>  }
>  
> @@ -475,6 +480,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data)
>      k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */
>      k->cores_mask = POWER8_CORE_MASK;
>      k->core_pir = pnv_chip_core_pir_p8;
> +    k->xscom_base = 0x003fc0000000000ull;
>      dc->desc = "PowerNV Chip POWER8";
>  }
>  
> @@ -495,6 +501,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data)
>      k->chip_cfam_id = 0x120d304980000000ull;  /* P8 Naples DD1.0 */
>      k->cores_mask = POWER8_CORE_MASK;
>      k->core_pir = pnv_chip_core_pir_p8;
> +    k->xscom_base = 0x003fc0000000000ull;
>      dc->desc = "PowerNV Chip POWER8NVL";
>  }
>  
> @@ -515,6 +522,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data)
>      k->chip_cfam_id = 0x100d104980000000ull; /* P9 Nimbus DD1.0 */
>      k->cores_mask = POWER9_CORE_MASK;
>      k->core_pir = pnv_chip_core_pir_p9;
> +    k->xscom_base = 0x00603fc00000000ull;
>      dc->desc = "PowerNV Chip POWER9";
>  }
>  
> @@ -555,6 +563,14 @@ static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp)
>      }
>  }
>  
> +static void pnv_chip_init(Object *obj)
> +{
> +    PnvChip *chip = PNV_CHIP(obj);
> +    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
> +
> +    chip->xscom_base = pcc->xscom_base;
> +}
> +
>  static void pnv_chip_realize(DeviceState *dev, Error **errp)
>  {
>      PnvChip *chip = PNV_CHIP(dev);
> @@ -569,6 +585,14 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
>          return;
>      }
>  
> +    /* XSCOM bridge */
> +    pnv_xscom_realize(chip, &error);
> +    if (error) {
> +        error_propagate(errp, error);
> +        return;
> +    }
> +    sysbus_mmio_map(SYS_BUS_DEVICE(chip), 0, PNV_XSCOM_BASE(chip));
> +
>      /* Cores */
>      pnv_chip_core_sanitize(chip, &error);
>      if (error) {
> @@ -628,6 +652,7 @@ static const TypeInfo pnv_chip_info = {
>      .name          = TYPE_PNV_CHIP,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .class_init    = pnv_chip_class_init,
> +    .instance_init = pnv_chip_init,
>      .class_size    = sizeof(PnvChipClass),
>      .abstract      = true,
>  };
> diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
> new file mode 100644
> index 000000000000..fcc71d335fc3
> --- /dev/null
> +++ b/hw/ppc/pnv_xscom.c
> @@ -0,0 +1,277 @@
> +/*
> + * QEMU PowerPC PowerNV XSCOM bus
> + *
> + * Copyright (c) 2016, IBM Corporation.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * 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 "qapi/error.h"
> +#include "hw/hw.h"
> +#include "qemu/log.h"
> +#include "sysemu/kvm.h"
> +#include "target-ppc/cpu.h"
> +#include "hw/sysbus.h"
> +
> +#include "hw/ppc/fdt.h"
> +#include "hw/ppc/pnv_xscom.h"
> +#include "hw/ppc/pnv.h"
> +
> +#include <libfdt.h>
> +
> +static void xscom_complete(uint64_t hmer_bits)
> +{
> +    CPUState *cs = current_cpu;

I still think this should take a cpu parameter, moving the current_cpu
invocation to the callers.

> +
> +    /*
> +     * TODO: When the read/write comes from the monitor, we do not
> +     * have a cpu.
> +     */
> +    if (cs) {
> +        PowerPCCPU *cpu = POWERPC_CPU(cs);
> +        CPUPPCState *env = &cpu->env;
> +
> +        /*
> +         * TODO: Need a CPU helper to set HMER, also handle generation
> +         * of HMIs
> +         */
> +        cpu_synchronize_state(cs);
> +        env->spr[SPR_HMER] |= hmer_bits;
> +    }
> +}
> +
> +static uint32_t pnv_xscom_pcba(PnvChip *chip, uint64_t addr)
> +{
> +    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
> +
> +    addr &= (PNV_XSCOM_SIZE - 1);
> +    if (pcc->chip_type == PNV_CHIP_POWER9) {
> +        return addr >> 3;
> +    } else {
> +        return ((addr >> 4) & ~0xfull) | ((addr >> 3) & 0xf);
> +    }
> +}
> +
> +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 0x1010c00:     /* PIBAM FIR */
> +    case 0x1010c03:     /* PIBAM FIR MASK */
> +    case 0x2020007:     /* ADU stuff */
> +    case 0x2020009:     /* ADU stuff */
> +    case 0x202000f:     /* ADU stuff */
> +        return 0;
> +    case 0x2013f00:     /* PBA stuff */
> +    case 0x2013f01:     /* PBA stuff */
> +    case 0x2013f02:     /* PBA stuff */
> +    case 0x2013f03:     /* PBA stuff */
> +    case 0x2013f04:     /* PBA stuff */
> +    case 0x2013f05:     /* PBA stuff */
> +    case 0x2013f06:     /* PBA stuff */
> +    case 0x2013f07:     /* PBA stuff */
> +        return 0;
> +    case 0x2013028:     /* CAPP stuff */
> +    case 0x201302a:     /* CAPP stuff */
> +    case 0x2013801:     /* CAPP stuff */
> +    case 0x2013802:     /* CAPP stuff */
> +        return 0;
> +    default:
> +        return -1;
> +    }
> +}
> +
> +static bool xscom_write_default(PnvChip *chip, uint32_t pcba, uint64_t val)
> +{
> +    /* We ignore writes to these */
> +    switch (pcba) {
> +    case 0xf000f:       /* chip id is RO */
> +    case 0x1010c00:     /* PIBAM FIR */
> +    case 0x1010c01:     /* PIBAM FIR */
> +    case 0x1010c02:     /* PIBAM FIR */
> +    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 */
> +        return true;
> +    default:
> +        return false;
> +    }
> +}
> +
> +static uint64_t xscom_read(void *opaque, hwaddr addr, unsigned width)
> +{
> +    PnvChip *chip = opaque;
> +    uint32_t pcba = pnv_xscom_pcba(chip, addr);
> +    uint64_t val = 0;
> +    MemTxResult result;
> +
> +    /* Handle some SCOMs here before dispatch */
> +    val = xscom_read_default(chip, pcba);
> +    if (val != -1) {
> +        goto complete;
> +    }
> +
> +    val = address_space_ldq(&chip->xscom_as, pcba << 3, MEMTXATTRS_UNSPECIFIED,
> +                            &result);
> +    if (result != MEMTX_OK) {
> +        qemu_log_mask(LOG_GUEST_ERROR, "XSCOM read failed at @0x%"
> +                      HWADDR_PRIx " pcba=0x%08x\n", addr, pcba);
> +        xscom_complete(HMER_XSCOM_FAIL | HMER_XSCOM_DONE);
> +        return 0;
> +    }
> +
> +complete:
> +    xscom_complete(HMER_XSCOM_DONE);
> +    return val;
> +}
> +
> +static void xscom_write(void *opaque, hwaddr addr, uint64_t val,
> +                        unsigned width)
> +{
> +    PnvChip *chip = opaque;
> +    uint32_t pcba = pnv_xscom_pcba(chip, addr);
> +    MemTxResult result;
> +
> +    /* Handle some SCOMs here before dispatch */
> +    if (xscom_write_default(chip, pcba, val)) {
> +        goto complete;
> +    }
> +
> +    address_space_stq(&chip->xscom_as, pcba << 3, val, MEMTXATTRS_UNSPECIFIED,
> +                      &result);
> +    if (result != MEMTX_OK) {
> +        qemu_log_mask(LOG_GUEST_ERROR, "XSCOM write failed at @0x%"
> +                      HWADDR_PRIx " pcba=0x%08x data=0x%" PRIx64 "\n",
> +                      addr, pcba, val);
> +        xscom_complete(HMER_XSCOM_FAIL | HMER_XSCOM_DONE);
> +        return;
> +    }
> +
> +complete:
> +    xscom_complete(HMER_XSCOM_DONE);
> +}
> +
> +const MemoryRegionOps pnv_xscom_ops = {
> +    .read = xscom_read,
> +    .write = 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,
> +};
> +
> +void pnv_xscom_realize(PnvChip *chip, Error **errp)
> +{
> +    SysBusDevice *sbd = SYS_BUS_DEVICE(chip);
> +    char *name;
> +
> +    name = g_strdup_printf("xscom-%x", chip->chip_id);
> +    memory_region_init_io(&chip->xscom_mmio, OBJECT(chip), &pnv_xscom_ops,
> +                          chip, name, PNV_XSCOM_SIZE);
> +    sysbus_init_mmio(sbd, &chip->xscom_mmio);
> +
> +    memory_region_init(&chip->xscom, OBJECT(chip), name, PNV_XSCOM_SIZE);
> +    address_space_init(&chip->xscom_as, &chip->xscom, name);
> +    g_free(name);
> +}
> +
> +static const TypeInfo pnv_xscom_interface_info = {
> +    .name = TYPE_PNV_XSCOM_INTERFACE,
> +    .parent = TYPE_INTERFACE,
> +    .class_size = sizeof(PnvXScomInterfaceClass),
> +};
> +
> +static void pnv_xscom_register_types(void)
> +{
> +    type_register_static(&pnv_xscom_interface_info);
> +}
> +
> +type_init(pnv_xscom_register_types)
> +
> +typedef struct ForeachPopulateArgs {
> +    void *fdt;
> +    int xscom_offset;
> +} ForeachPopulateArgs;
> +
> +static int xscom_populate_child(Object *child, void *opaque)
> +{
> +    if (object_dynamic_cast(child, TYPE_PNV_XSCOM_INTERFACE)) {
> +        ForeachPopulateArgs *args = opaque;
> +        PnvXScomInterface *xd = PNV_XSCOM_INTERFACE(child);
> +        PnvXScomInterfaceClass *xc = PNV_XSCOM_INTERFACE_GET_CLASS(xd);
> +
> +        if (xc->populate) {
> +            _FDT((xc->populate(xd, args->fdt, args->xscom_offset)));
> +        }
> +    }
> +    return 0;
> +}
> +
> +static const char compat_p8[] = "ibm,power8-xscom\0ibm,xscom";
> +static const char compat_p9[] = "ibm,power9-xscom\0ibm,xscom";
> +
> +int pnv_xscom_populate(PnvChip *chip, void *fdt, int root_offset)
> +{
> +    uint64_t reg[] = { cpu_to_be64(PNV_XSCOM_BASE(chip)),
> +                       cpu_to_be64(PNV_XSCOM_SIZE) };
> +    int xscom_offset;
> +    ForeachPopulateArgs args;
> +    char *name;
> +    PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
> +
> +    name = g_strdup_printf("xscom@%" PRIx64, be64_to_cpu(reg[0]));
> +    xscom_offset = fdt_add_subnode(fdt, root_offset, name);
> +    _FDT(xscom_offset);
> +    g_free(name);
> +    _FDT((fdt_setprop_cell(fdt, xscom_offset, "ibm,chip-id", chip->chip_id)));
> +    _FDT((fdt_setprop_cell(fdt, xscom_offset, "#address-cells", 1)));
> +    _FDT((fdt_setprop_cell(fdt, xscom_offset, "#size-cells", 1)));
> +    _FDT((fdt_setprop(fdt, xscom_offset, "reg", reg, sizeof(reg))));
> +
> +    if (pcc->chip_type == PNV_CHIP_POWER9) {
> +        _FDT((fdt_setprop(fdt, xscom_offset, "compatible", compat_p9,
> +                          sizeof(compat_p9))));
> +    } else {
> +        _FDT((fdt_setprop(fdt, xscom_offset, "compatible", compat_p8,
> +                          sizeof(compat_p8))));
> +    }
> +
> +    _FDT((fdt_setprop(fdt, xscom_offset, "scom-controller", NULL, 0)));
> +
> +    args.fdt = fdt;
> +    args.xscom_offset = xscom_offset;
> +
> +    object_child_foreach(OBJECT(chip), xscom_populate_child, &args);
> +    return 0;
> +}
> +
> +void pnv_xscom_add_subregion(PnvChip *chip, hwaddr offset, MemoryRegion *mr)
> +{
> +    memory_region_add_subregion(&chip->xscom, offset << 3, mr);
> +}
> +
> +void pnv_xscom_region_init(MemoryRegion *mr,
> +                           struct Object *owner,
> +                           const MemoryRegionOps *ops,
> +                           void *opaque,
> +                           const char *name,
> +                           uint64_t size)
> +{
> +    memory_region_init_io(mr, owner, ops, opaque, name, size << 3);
> +}
> diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
> index cec869ce6b59..7db922e285c0 100644
> --- a/include/hw/ppc/pnv.h
> +++ b/include/hw/ppc/pnv.h
> @@ -21,6 +21,7 @@
>  
>  #include "hw/boards.h"
>  #include "hw/sysbus.h"
> +#include "hw/ppc/pnv_xscom.h"
>  
>  #define TYPE_PNV_CHIP "powernv-chip"
>  #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
> @@ -48,6 +49,11 @@ typedef struct PnvChip {
>      uint32_t     nr_cores;
>      uint64_t     cores_mask;
>      void         *cores;
> +
> +    hwaddr       xscom_base;
> +    MemoryRegion xscom_mmio;
> +    MemoryRegion xscom;
> +    AddressSpace xscom_as;
>  } PnvChip;
>  
>  typedef struct PnvChipClass {
> @@ -60,6 +66,8 @@ typedef struct PnvChipClass {
>      uint64_t     chip_cfam_id;
>      uint64_t     cores_mask;
>  
> +    hwaddr       xscom_base;
> +
>      uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id);
>  } PnvChipClass;
>  
> @@ -106,4 +114,11 @@ typedef struct PnvMachineState {
>  #define PNV_FDT_ADDR          0x01000000
>  #define PNV_TIMEBASE_FREQ     512000000ULL
>  
> +/*
> + * POWER8 MMIO base addresses
> + */
> +#define PNV_XSCOM_SIZE        0x800000000ull
> +#define PNV_XSCOM_BASE(chip)                                            \
> +    (chip->xscom_base + ((uint64_t)(chip)->chip_id) * PNV_XSCOM_SIZE)
> +
>  #endif /* _PPC_PNV_H */
> diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
> new file mode 100644
> index 000000000000..ee25ec455e3f
> --- /dev/null
> +++ b/include/hw/ppc/pnv_xscom.h
> @@ -0,0 +1,56 @@
> +/*
> + * QEMU PowerPC PowerNV XSCOM bus definitions
> + *
> + * Copyright (c) 2016, IBM Corporation.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * 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/>.
> + */
> +#ifndef _PPC_PNV_XSCOM_H
> +#define _PPC_PNV_XSCOM_H
> +
> +#include "qom/object.h"
> +
> +typedef struct PnvChip PnvChip;
> +
> +typedef struct PnvXScomInterface {
> +    Object parent;
> +} PnvXScomInterface;
> +
> +#define TYPE_PNV_XSCOM_INTERFACE "pnv-xscom-interface"
> +#define PNV_XSCOM_INTERFACE(obj) \
> +     OBJECT_CHECK(PnvXScomInterface, (obj), TYPE_PNV_XSCOM_INTERFACE)
> +#define PNV_XSCOM_INTERFACE_CLASS(klass)                \
> +    OBJECT_CLASS_CHECK(PnvXScomInterfaceClass, (klass), \
> +                       TYPE_PNV_XSCOM_INTERFACE)
> +#define PNV_XSCOM_INTERFACE_GET_CLASS(obj) \
> +     OBJECT_GET_CLASS(PnvXScomInterfaceClass, (obj), TYPE_PNV_XSCOM_INTERFACE)
> +
> +typedef struct PnvXScomInterfaceClass {
> +    InterfaceClass parent;
> +    int (*populate)(PnvXScomInterface *dev, void *fdt, int offset);
> +} PnvXScomInterfaceClass;
> +
> +extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
> +extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
> +
> +extern void pnv_xscom_add_subregion(PnvChip *chip, hwaddr offset,
> +                                    MemoryRegion *mr);
> +extern void pnv_xscom_region_init(MemoryRegion *mr,
> +                                  struct Object *owner,
> +                                  const MemoryRegionOps *ops,
> +                                  void *opaque,
> +                                  const char *name,
> +                                  uint64_t size);
> +
> +#endif /* _PPC_PNV_XSCOM_H */

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 08/17] ppc/pnv: add XSCOM handlers to PnvCore
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 08/17] ppc/pnv: add XSCOM handlers to PnvCore Cédric Le Goater
@ 2016-10-25  1:14   ` David Gibson
  0 siblings, 0 replies; 43+ messages in thread
From: David Gibson @ 2016-10-25  1:14 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Sat, Oct 22, 2016 at 11:46:41AM +0200, Cédric Le Goater wrote:
> Now that we are using real HW ids for the cores in PowerNV chips, we
> can route the XSCOM accesses to them. We just need to attach a
> specific XSCOM memory region to each core in the appropriate window
> for the core number.
> 
> To start with, let's install the DTS (Digital Thermal Sensor) handlers
> which should return 38°C for each core.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> 
>  Changes since v4:
> 
>  - used the helpers for the XSCOM region 
> 
>  Changes since v3:
> 
>  - moved to new XSCOM model
>  - kept the write op on the XSCOM memory region for later use
> 
>  Changes since v2:
> 
>  - added a XSCOM memory region to handle access to the EX core
>    registers   
>  - extended the PnvCore object with a XSCOM_INTERFACE so that we can
>    use pnv_xscom_pcba() and pnv_xscom_addr() to handle XSCOM address
>    translation.
> 
>  hw/ppc/pnv.c               |  4 ++++
>  hw/ppc/pnv_core.c          | 50 ++++++++++++++++++++++++++++++++++++++++++++++
>  include/hw/ppc/pnv_core.h  |  2 ++
>  include/hw/ppc/pnv_xscom.h | 19 ++++++++++++++++++
>  4 files changed, 75 insertions(+)
> 
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 96ba36cc272d..df55a89cb951 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -625,6 +625,10 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
>          object_property_set_bool(OBJECT(pnv_core), true, "realized",
>                                   &error_fatal);
>          object_unref(OBJECT(pnv_core));
> +
> +        /* Each core has an XSCOM MMIO region */
> +        pnv_xscom_add_subregion(chip, PNV_XSCOM_EX_CORE_BASE(core_hwid),
> +                                &PNV_CORE(pnv_core)->xscom_regs);
>          i++;
>      }
>      g_free(typename);
> diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
> index 04713caa3b24..2acda9637db5 100644
> --- a/hw/ppc/pnv_core.c
> +++ b/hw/ppc/pnv_core.c
> @@ -19,6 +19,7 @@
>  #include "qemu/osdep.h"
>  #include "sysemu/sysemu.h"
>  #include "qapi/error.h"
> +#include "qemu/log.h"
>  #include "target-ppc/cpu.h"
>  #include "hw/ppc/ppc.h"
>  #include "hw/ppc/pnv.h"
> @@ -63,6 +64,51 @@ static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
>      qemu_register_reset(powernv_cpu_reset, cpu);
>  }
>  
> +/*
> + * These values are read by the PowerNV HW monitors under Linux
> + */
> +#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)
> +{
> +    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;
> +    default:
> +        qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx,
> +                  addr);
> +    }
> +
> +    return val;
> +}
> +
> +static void pnv_core_xscom_write(void *opaque, hwaddr addr, uint64_t val,
> +                                 unsigned int width)
> +{
> +    qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx,
> +                  addr);
> +}
> +
> +static const MemoryRegionOps pnv_core_xscom_ops = {
> +    .read = pnv_core_xscom_read,
> +    .write = pnv_core_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_core_realize_child(Object *child, Error **errp)
>  {
>      Error *local_err = NULL;
> @@ -118,6 +164,10 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
>              goto err;
>          }
>      }
> +
> +    snprintf(name, sizeof(name), "xscom-core.%d", cc->core_id);
> +    pnv_xscom_region_init(&pc->xscom_regs, OBJECT(dev), &pnv_core_xscom_ops,
> +                          pc, name, PNV_XSCOM_EX_CORE_SIZE);
>      return;
>  
>  err:
> diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h
> index a151e281c017..2955a41c901f 100644
> --- a/include/hw/ppc/pnv_core.h
> +++ b/include/hw/ppc/pnv_core.h
> @@ -36,6 +36,8 @@ typedef struct PnvCore {
>      /*< public >*/
>      void *threads;
>      uint32_t pir;
> +
> +    MemoryRegion xscom_regs;
>  } PnvCore;
>  
>  typedef struct PnvCoreClass {
> diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
> index ee25ec455e3f..5da6e92e698c 100644
> --- a/include/hw/ppc/pnv_xscom.h
> +++ b/include/hw/ppc/pnv_xscom.h
> @@ -41,6 +41,25 @@ typedef struct PnvXScomInterfaceClass {
>      int (*populate)(PnvXScomInterface *dev, void *fdt, int offset);
>  } PnvXScomInterfaceClass;
>  
> +/*
> + * Layout of the XSCOM PCB addresses of EX core 1
> + *
> + *   GPIO        0x1100xxxx
> + *   SCOM        0x1101xxxx
> + *   OHA         0x1102xxxx
> + *   CLOCK CTL   0x1103xxxx
> + *   FIR         0x1104xxxx
> + *   THERM       0x1105xxxx
> + *   <reserved>  0x1106xxxx
> + *               ..
> + *               0x110Exxxx
> + *   PCB SLAVE   0x110Fxxxx
> + */
> +
> +#define PNV_XSCOM_EX_BASE         0x10000000
> +#define PNV_XSCOM_EX_CORE_BASE(i) (PNV_XSCOM_EX_BASE | (((uint64_t)i) << 24))
> +#define PNV_XSCOM_EX_CORE_SIZE    0x100000
> +
>  extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
>  extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
>  

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space
  2016-10-24  5:33 ` [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space David Gibson
@ 2016-10-25  1:38   ` David Gibson
  0 siblings, 0 replies; 43+ messages in thread
From: David Gibson @ 2016-10-25  1:38 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Mon, Oct 24, 2016 at 04:33:33PM +1100, David Gibson wrote:
> On Sat, Oct 22, 2016 at 11:46:33AM +0200, Cédric Le Goater wrote:
> > Hello,
> > 
> > Here is the latest version of the ppc/pnv platform patchset. PowerNV
> > (as Non-Virtualized) is the "baremetal" platform using the OPAL
> > firmware. It runs Linux on IBM and Open Power systems and it can be
> > used as an hypervisor OS, to run KVM guests, or simply as a host OS.
> > The goal here is to add support for the baremetal platform and
> > possibly later also for the KVM PR guests but not for HV guests.
> > 
> > In v5, all the comments from v4 should have been addressed. Most of
> > the differences are cleanups suggested by David but there a couple of
> > important changes :
> > 
> >  - an addition of a new firmware to qemu : skiboot 5.3.7.
> >  - a rework of the native Interrupt Presentation Controller model
> >    which now uses memory subregions instead of a hash table.   
> >  - a removal of the Power9 LPC Controller. This is still in the plans
> >    but the models need a little more work.
> > 
> > 
> > The initial patches provide a minimal platform with some RAM to load
> > the ROMs : firmware, kernel and initrd. The device tree is built with
> > what is available at reset time. Then, comes the PnvChip object acting
> > as a container for other devices required to run a system. The cores
> > are added to each chip with some restrictions on the number and the
> > ids. Next is the XSCOM model, the sideband bus which gives controls to
> > all the units in the POWER8 chip, the LPC controller for the console,
> > the native interrupt controller and the PSI HB model to handle the
> > external interrupt.
> > 
> > 
> > The next step should be IPMI support which adds a BT device on the ISA
> > bus and some device tree extensions to read sensors and FRUs. This is
> > relatively straight forward and most of the IPMI code has been
> > discussed already on the list. Then should come a PHB3 model to
> > include some PCI devices. This is big and it needs a few helpers in
> > the PCI core.
> 
> I've merged 1-6 into ppc-for-2.8.  The rest I'm still reviewing.

I've now merged 7-10 into ppc-for-2.8, making the change I requested
to xscom_complete() along the way.  Still looking at the rest.

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass Cédric Le Goater
@ 2016-10-25  5:08   ` David Gibson
  2016-10-26  7:13     ` Cédric Le Goater
  0 siblings, 1 reply; 43+ messages in thread
From: David Gibson @ 2016-10-25  5:08 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Sat, Oct 22, 2016 at 11:46:44AM +0200, Cédric Le Goater wrote:
> This provides access to the MMIO based Interrupt Presentation
> Controllers (ICP) as found on a POWER8 system.
> 
> A new XICSNative class is introduced to hold the MMIO region of the
> ICPs. Each thread of the system has a subregion, indexed by its PIR
> number, holding a XIVE (External Interrupt Vector Entry). This
> provides a mean to make the link with the ICPState of the CPU.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
> 
>  Changes since v4:
> 
>  - replaced the pir_table by memory subregions using an ICP. 
>  - removed the find_icp() and cpu_setup() handlers which became
>    useless with the memory regions.
>  - removed the superfluous inits done in xics_native_initfn. This is
>    covered in the parent class init.
>  - took ownership of the patch.
> 
>  default-configs/ppc64-softmmu.mak |   3 +-
>  hw/intc/Makefile.objs             |   1 +
>  hw/intc/xics_native.c             | 304 ++++++++++++++++++++++++++++++++++++++
>  include/hw/ppc/pnv.h              |  19 +++
>  include/hw/ppc/xics.h             |  24 +++
>  5 files changed, 350 insertions(+), 1 deletion(-)
>  create mode 100644 hw/intc/xics_native.c
> 
> diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
> index 67a9bcaa67fa..a22c93a48686 100644
> --- a/default-configs/ppc64-softmmu.mak
> +++ b/default-configs/ppc64-softmmu.mak
> @@ -48,8 +48,9 @@ CONFIG_PLATFORM_BUS=y
>  CONFIG_ETSEC=y
>  CONFIG_LIBDECNUMBER=y
>  # For pSeries
> -CONFIG_XICS=$(CONFIG_PSERIES)
> +CONFIG_XICS=$(or $(CONFIG_PSERIES),$(CONFIG_POWERNV))
>  CONFIG_XICS_SPAPR=$(CONFIG_PSERIES)
> +CONFIG_XICS_NATIVE=$(CONFIG_POWERNV)
>  CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM))
>  # For PReP
>  CONFIG_MC146818RTC=y
> diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
> index 2f44a2da26e9..e44a29d75b32 100644
> --- a/hw/intc/Makefile.objs
> +++ b/hw/intc/Makefile.objs
> @@ -34,6 +34,7 @@ obj-$(CONFIG_RASPI) += bcm2835_ic.o bcm2836_control.o
>  obj-$(CONFIG_SH4) += sh_intc.o
>  obj-$(CONFIG_XICS) += xics.o
>  obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
> +obj-$(CONFIG_XICS_NATIVE) += xics_native.o
>  obj-$(CONFIG_XICS_KVM) += xics_kvm.o
>  obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
>  obj-$(CONFIG_S390_FLIC) += s390_flic.o
> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
> new file mode 100644
> index 000000000000..bbdd786aeb50
> --- /dev/null
> +++ b/hw/intc/xics_native.c
> @@ -0,0 +1,304 @@
> +/*
> + * QEMU PowerPC PowerNV machine model
> + *
> + * Native version of ICS/ICP
> + *
> + * Copyright (c) 2016, IBM Corporation.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * 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 "qapi/error.h"
> +#include "qemu-common.h"
> +#include "cpu.h"
> +#include "hw/hw.h"
> +#include "qemu/log.h"
> +#include "qapi/error.h"
> +
> +#include "hw/ppc/fdt.h"
> +#include "hw/ppc/xics.h"
> +#include "hw/ppc/pnv.h"
> +
> +#include <libfdt.h>
> +
> +static void xics_native_reset(void *opaque)
> +{
> +    device_reset(DEVICE(opaque));
> +}
> +
> +static void xics_native_initfn(Object *obj)
> +{
> +    qemu_register_reset(xics_native_reset, obj);
> +}

I think we need to investigate why the xics native is not showing up
on the SysBus.  As a "raw" MMIO device, it really should.  If it was,
device_reset should be called without these shenannigans.

> +
> +static uint64_t xics_native_read(void *opaque, hwaddr addr, unsigned width)
> +{
> +    ICPState *icp = opaque;
> +    bool byte0 = (width == 1 && (addr & 0x3) == 0);
> +    uint64_t val = 0xffffffff;
> +
> +    switch (addr & 0xffc) {
> +    case 0: /* poll */
> +        val = icp_ipoll(icp, NULL);
> +        if (byte0) {
> +            val >>= 24;
> +        } else if (width != 4) {
> +            goto bad_access;
> +        }
> +        break;
> +    case 4: /* xirr */
> +        if (byte0) {
> +            val = icp_ipoll(icp, NULL) >> 24;
> +        } else if (width == 4) {
> +            val = icp_accept(icp);
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    case 12:
> +        if (byte0) {
> +            val = icp->mfrr;
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    case 16:
> +        if (width == 4) {
> +            val = icp->links[0];
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    case 20:
> +        if (width == 4) {
> +            val = icp->links[1];
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    case 24:
> +        if (width == 4) {
> +            val = icp->links[2];
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    default:
> +bad_access:
> +        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
> +                      HWADDR_PRIx"/%d\n", addr, width);
> +    }
> +
> +    return val;
> +}
> +
> +static void xics_native_write(void *opaque, hwaddr addr, uint64_t val,
> +                              unsigned width)
> +{
> +    ICPState *icp = opaque;
> +    bool byte0 = (width == 1 && (addr & 0x3) == 0);
> +
> +    switch (addr & 0xffc) {
> +    case 4: /* xirr */
> +        if (byte0) {
> +            icp_set_cppr(icp, val);
> +        } else if (width == 4) {
> +            icp_eoi(icp, val);
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    case 12:
> +        if (byte0) {
> +            icp_set_mfrr(icp, val);
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    case 16:
> +        if (width == 4) {
> +            icp->links[0] = val;
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    case 20:
> +        if (width == 4) {
> +            icp->links[1] = val;
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    case 24:
> +        if (width == 4) {
> +            icp->links[2] = val;
> +        } else {
> +            goto bad_access;
> +        }
> +        break;
> +    default:
> +bad_access:
> +        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
> +                      HWADDR_PRIx"/%d\n", addr, width);
> +    }
> +}
> +
> +static const MemoryRegionOps xics_native_ops = {
> +    .read = xics_native_read,
> +    .write = xics_native_write,
> +    .valid.min_access_size = 1,
> +    .valid.max_access_size = 4,
> +    .impl.min_access_size = 1,
> +    .impl.max_access_size = 4,
> +    .endianness = DEVICE_BIG_ENDIAN,
> +};
> +
> +static uint64_t xics_native_default_read(void *opaque, hwaddr addr,
> +                                         unsigned width)
> +{
> +    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
> +                  HWADDR_PRIx"/%d\n", addr, width);
> +    return 0xffffffffffffffffull;
> +}
> +
> +static void xics_native_default_write(void *opaque, hwaddr addr, uint64_t val,
> +                                      unsigned width)
> +{
> +    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
> +                  HWADDR_PRIx"/%d\n", addr, width);
> +}
> +
> +static const MemoryRegionOps xics_native_default_ops = {
> +    .read = xics_native_default_read,
> +    .write = xics_native_default_write,
> +    .valid.min_access_size = 1,
> +    .valid.max_access_size = 4,
> +    .impl.min_access_size = 1,
> +    .impl.max_access_size = 4,
> +    .endianness = DEVICE_BIG_ENDIAN,
> +};
> +
> +static void xics_native_set_nr_servers(XICSState *xics, uint32_t nr_servers,
> +                                       Error **errp)
> +{
> +    xics_set_nr_servers(xics, nr_servers, TYPE_ICP, errp);
> +}
> +
> +static void xics_native_realize(DeviceState *dev, Error **errp)
> +{
> +    XICSState *xics = XICS_COMMON(dev);
> +    XICSNative *xicsn = XICS_NATIVE(dev);
> +    Error *error = NULL;
> +    int i;
> +
> +    if (!xics->nr_servers) {
> +        error_setg(errp, "Number of servers needs to be greater than 0");
> +        return;
> +    }
> +
> +    for (i = 0; i < xics->nr_servers; i++) {
> +        object_property_set_bool(OBJECT(&xics->ss[i]), true, "realized",
> +                                 &error);
> +        if (error) {
> +            error_propagate(errp, error);
> +            return;
> +        }
> +    }
> +
> +    /*
> +     * Initialize the container region for the ICPs and the subregion
> +     * for each cpu. The mmapping will be done at the board level
> +     * depending on the pir of the core.
> +     *
> +     * TODO: build a name with the chip id
> +     */
> +    memory_region_init_io(&xicsn->icp_mmio, OBJECT(dev),
> +                          &xics_native_default_ops, xicsn, "icp-0",
> +                          PNV_XICS_SIZE);

I don't think you should need these native ops.  I believe you can
construct a memory region as a "pure" container, then just put the
populated regions inside it.

> +    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &xicsn->icp_mmio);
> +
> +    xicsn->icp_mmios = g_new0(MemoryRegion, xics->nr_servers);
> +    for (i = 0; i < xics->nr_servers; i++) {
> +        ICPState *icp = &xics->ss[i];
> +        memory_region_init_io(&xicsn->icp_mmios[i], OBJECT(dev),
> +                              &xics_native_ops, icp, "icp-0", 0x1000);
> +    }
> +}
> +
> +static void xics_native_class_init(ObjectClass *oc, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(oc);
> +    XICSStateClass *xsc = XICS_NATIVE_CLASS(oc);
> +
> +    dc->realize = xics_native_realize;
> +    xsc->set_nr_servers = xics_native_set_nr_servers;
> +}
> +
> +static const TypeInfo xics_native_info = {
> +    .name          = TYPE_XICS_NATIVE,
> +    .parent        = TYPE_XICS_COMMON,
> +    .instance_size = sizeof(XICSNative),
> +    .class_size = sizeof(XICSStateClass),
> +    .class_init    = xics_native_class_init,
> +    .instance_init = xics_native_initfn,
> +};
> +
> +static void xics_native_register_types(void)
> +{
> +    type_register_static(&xics_native_info);
> +}
> +
> +type_init(xics_native_register_types)
> +
> +void xics_native_populate_icp(PnvChip *chip, void *fdt, int offset,
> +                              uint32_t pir, uint32_t count)
> +{
> +    uint64_t addr;
> +    char *name;
> +    const char compat[] = "IBM,power8-icp\0IBM,ppc-xicp";
> +    uint32_t irange[2], i, rsize;
> +    uint64_t *reg;
> +
> +    /*
> +     * TODO: add multichip ICP BAR
> +     */
> +    addr = PNV_XICS_BASE | (pir << 12);
> +
> +    irange[0] = cpu_to_be32(pir);
> +    irange[1] = cpu_to_be32(count);
> +
> +    rsize = sizeof(uint64_t) * 2 * count;
> +    reg = g_malloc(rsize);
> +    for (i = 0; i < count; i++) {
> +        reg[i * 2] = cpu_to_be64(addr | ((pir + i) * 0x1000));
> +        reg[i * 2 + 1] = cpu_to_be64(0x1000);
> +    }
> +
> +    name = g_strdup_printf("interrupt-controller@%"PRIX64, addr);
> +    offset = fdt_add_subnode(fdt, offset, name);
> +    _FDT(offset);
> +    g_free(name);
> +
> +    _FDT((fdt_setprop(fdt, offset, "compatible", compat, sizeof(compat))));
> +    _FDT((fdt_setprop(fdt, offset, "reg", reg, rsize)));
> +    _FDT((fdt_setprop_string(fdt, offset, "device_type",
> +                              "PowerPC-External-Interrupt-Presentation")));
> +    _FDT((fdt_setprop(fdt, offset, "interrupt-controller", NULL, 0)));
> +    _FDT((fdt_setprop(fdt, offset, "ibm,interrupt-server-ranges",
> +                       irange, sizeof(irange))));
> +    _FDT((fdt_setprop_cell(fdt, offset, "#interrupt-cells", 1)));
> +    _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 0)));
> +    g_free(reg);
> +}
> diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
> index 02ac1c5f428e..c08ed1c72b17 100644
> --- a/include/hw/ppc/pnv.h
> +++ b/include/hw/ppc/pnv.h
> @@ -126,4 +126,23 @@ typedef struct PnvMachineState {
>  #define PNV_XSCOM_BASE(chip)                                            \
>      (chip->xscom_base + ((uint64_t)(chip)->chip_id) * PNV_XSCOM_SIZE)
>  
> +/*
> + * XSCOM 0x20109CA defines the ICP BAR:
> + *
> + * 0:29   : bits 14 to 43 of address to define 1 MB region.
> + * 30     : 1 to enable ICP to receive loads/stores against its BAR region
> + * 31:63  : Constant 0
> + *
> + * Usually defined as :
> + *
> + *      0xffffe00200000000 -> 0x0003ffff80000000
> + *      0xffffe00600000000 -> 0x0003ffff80100000
> + *      0xffffe02200000000 -> 0x0003ffff80800000
> + *      0xffffe02600000000 -> 0x0003ffff80900000
> + *
> + * TODO: make a macro using the chip hw id
> + */
> +#define PNV_XICS_BASE         0x0003ffff80000000ull
> +#define PNV_XICS_SIZE         0x0000000000100000ull
> +
>  #endif /* _PPC_PNV_H */
> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
> index 6e5a113332c6..911cdd5e549f 100644
> --- a/include/hw/ppc/xics.h
> +++ b/include/hw/ppc/xics.h
> @@ -119,8 +119,27 @@ struct ICPState {
>      bool cap_irq_xics_enabled;
>  
>      XICSState *xics;
> +
> +    /*
> +     * for XICSNative (not used by Linux).
> +     */
> +    uint32_t links[3];
>  };
>  
> +#define TYPE_XICS_NATIVE "xics-native"
> +#define XICS_NATIVE(obj) OBJECT_CHECK(XICSNative, (obj), TYPE_XICS_NATIVE)
> +#define XICS_NATIVE_CLASS(klass) \
> +     OBJECT_CLASS_CHECK(XICSStateClass, (klass), TYPE_XICS_NATIVE)
> +#define XICS_NATIVE_GET_CLASS(obj) \
> +     OBJECT_CLASS_CHECK(XICSStateClass, (obj), TYPE_XICS_NATIVE)
> +
> +typedef struct XICSNative {
> +    XICSState parent_obj;
> +
> +    MemoryRegion icp_mmio;
> +    MemoryRegion *icp_mmios;
> +} XICSNative;
> +
>  #define TYPE_ICS_BASE "ics-base"
>  #define ICS_BASE(obj) OBJECT_CHECK(ICSState, (obj), TYPE_ICS_BASE)
>  
> @@ -209,4 +228,9 @@ void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
>  
>  ICSState *xics_find_source(XICSState *icp, int irq);
>  
> +typedef struct PnvChip PnvChip;
> +
> +void xics_native_populate_icp(PnvChip *chip, void *fdt, int offset,
> +                              uint32_t base, uint32_t count);
> +
>  #endif /* XICS_H */

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 12/17] ppc/pnv: add a XICS native to each PowerNV chip
  2016-10-24 15:42   ` Cédric Le Goater
@ 2016-10-25  5:11     ` David Gibson
  0 siblings, 0 replies; 43+ messages in thread
From: David Gibson @ 2016-10-25  5:11 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Mon, Oct 24, 2016 at 05:42:52PM +0200, Cédric Le Goater wrote:
> On 10/22/2016 11:46 AM, Cédric Le Goater wrote:
> > It also links the XICS object to each core as it is needed to do the
> > CPU setup and the ICP MMIO windows are memory mapped for each thread.
> > 
> > Signed-off-by: Cédric Le Goater <clg@kaod.org>
> > ---
> > 
> >  Changes since v4:
> > 
> >  - changed the calculation of the number of ICPs to use smp_threads
> >  - added the mapping of the ICP subregions per thread
> > 
> >  hw/ppc/pnv.c         | 27 +++++++++++++++++++++++++++
> >  hw/ppc/pnv_core.c    | 24 ++++++++++++++++++++----
> >  include/hw/ppc/pnv.h |  2 ++
> >  3 files changed, 49 insertions(+), 4 deletions(-)
> > 
> > diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> > index c6dc7ca895b6..16d7baf0da71 100644
> > --- a/hw/ppc/pnv.c
> > +++ b/hw/ppc/pnv.c
> > @@ -33,6 +33,7 @@
> >  #include "qemu/cutils.h"
> >  #include "qapi/visitor.h"
> >  
> > +#include "hw/ppc/xics.h"
> >  #include "hw/ppc/pnv_xscom.h"
> >  
> >  #include "hw/isa/isa.h"
> > @@ -231,6 +232,9 @@ static void powernv_populate_chip(PnvChip *chip, void *fdt)
> >          PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize);
> >  
> >          powernv_create_core_node(chip, pnv_core, fdt);
> > +
> > +        /* Interrupt presentation controllers (ICP). One per thread. */
> > +        xics_native_populate_icp(chip, fdt, 0, pnv_core->pir, smp_threads);
> >      }
> >  
> >      if (chip->ram_size) {
> > @@ -637,6 +641,9 @@ static void pnv_chip_init(Object *obj)
> >  
> >      object_initialize(&chip->lpc, sizeof(chip->lpc), TYPE_PNV_LPC);
> >      object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), NULL);
> > +
> > +    object_initialize(&chip->xics, sizeof(chip->xics), TYPE_XICS_NATIVE);
> > +    object_property_add_child(obj, "xics", OBJECT(&chip->xics), NULL);
> >  }
> >  
> >  static void pnv_chip_realize(DeviceState *dev, Error **errp)
> > @@ -668,12 +675,23 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
> >          return;
> >      }
> >  
> > +    /*
> > +     * Interrupt Controller. To be created before the cores because
> > +     * each thread will fetch its ICP in the XICS
> > +     */
> > +    object_property_set_int(OBJECT(&chip->xics), chip->nr_cores * smp_threads,
> > +                            "nr_servers",  &error_fatal);
> > +    object_property_set_bool(OBJECT(&chip->xics), true, "realized",
> > +                             &error_fatal);
> > +    sysbus_mmio_map(SYS_BUS_DEVICE(&chip->xics), 0, PNV_XICS_BASE);
> > +
> >      chip->cores = g_malloc0(typesize * chip->nr_cores);
> >  
> >      for (i = 0, core_hwid = 0; (core_hwid < sizeof(chip->cores_mask) * 8)
> >               && (i < chip->nr_cores); core_hwid++) {
> >          char core_name[32];
> >          void *pnv_core = chip->cores + i * typesize;
> > +        int j;
> >  
> >          if (!(chip->cores_mask & (1ull << core_hwid))) {
> >              continue;
> > @@ -690,6 +708,8 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
> >          object_property_set_int(OBJECT(pnv_core),
> >                                  pcc->core_pir(chip, core_hwid),
> >                                  "pir", &error_fatal);
> > +        object_property_add_const_link(OBJECT(pnv_core), "xics",
> > +                                       OBJECT(&chip->xics), &error_fatal);
> >          object_property_set_bool(OBJECT(pnv_core), true, "realized",
> >                                   &error_fatal);
> >          object_unref(OBJECT(pnv_core));
> > @@ -697,6 +717,13 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
> >          /* Each core has an XSCOM MMIO region */
> >          pnv_xscom_add_subregion(chip, PNV_XSCOM_EX_CORE_BASE(core_hwid),
> >                                  &PNV_CORE(pnv_core)->xscom_regs);
> > +
> > +        /* Each thread as region for its ICP */
> > +        for (j = 0; j < smp_threads; j++) {
> > +            memory_region_add_subregion(&chip->xics.icp_mmio,
> > +                                        pcc->core_pir(chip, core_hwid) << 12,
> 
> Pffut ... This should be :
> 
>                                           (pcc->core_pir(chip, core_hwid) + j) << 12,
> 
> but as smp_threads=1, it has no consequences for the moment. Tell me 
> how you would prefer me to fix this.

I think I have enough comments on the previous patch that a respin of
patches 11+ will make sense, so just fix it then.

> 
> Thanks,
> 
> C.
> 
> 
> > +                                        &chip->xics.icp_mmios[i]);
> > +        }
> >          i++;
> >      }
> >      g_free(typename);
> > diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
> > index 2acda9637db5..e15c76163759 100644
> > --- a/hw/ppc/pnv_core.c
> > +++ b/hw/ppc/pnv_core.c
> > @@ -24,6 +24,7 @@
> >  #include "hw/ppc/ppc.h"
> >  #include "hw/ppc/pnv.h"
> >  #include "hw/ppc/pnv_core.h"
> > +#include "hw/ppc/xics.h"
> >  
> >  static void powernv_cpu_reset(void *opaque)
> >  {
> > @@ -42,7 +43,7 @@ static void powernv_cpu_reset(void *opaque)
> >      env->msr |= MSR_HVB; /* Hypervisor mode */
> >  }
> >  
> > -static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
> > +static void powernv_cpu_init(PowerPCCPU *cpu, XICSState *xics, Error **errp)
> >  {
> >      CPUPPCState *env = &cpu->env;
> >      int core_pir;
> > @@ -62,6 +63,11 @@ static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
> >      cpu_ppc_tb_init(env, PNV_TIMEBASE_FREQ);
> >  
> >      qemu_register_reset(powernv_cpu_reset, cpu);
> > +
> > +    /*
> > +     * xics_cpu_setup() assigns the CPU to the ICP in XICS
> > +     */
> > +    xics_cpu_setup(xics, cpu);
> >  }
> >  
> >  /*
> > @@ -109,7 +115,7 @@ static const MemoryRegionOps pnv_core_xscom_ops = {
> >      .endianness = DEVICE_BIG_ENDIAN,
> >  };
> >  
> > -static void pnv_core_realize_child(Object *child, Error **errp)
> > +static void pnv_core_realize_child(Object *child, XICSState *xics, Error **errp)
> >  {
> >      Error *local_err = NULL;
> >      CPUState *cs = CPU(child);
> > @@ -121,7 +127,7 @@ static void pnv_core_realize_child(Object *child, Error **errp)
> >          return;
> >      }
> >  
> > -    powernv_cpu_init(cpu, &local_err);
> > +    powernv_cpu_init(cpu, xics, &local_err);
> >      if (local_err) {
> >          error_propagate(errp, local_err);
> >          return;
> > @@ -139,6 +145,7 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
> >      void *obj;
> >      int i, j;
> >      char name[32];
> > +    XICSState *xics;
> >  
> >      pc->threads = g_malloc0(size * cc->nr_threads);
> >      for (i = 0; i < cc->nr_threads; i++) {
> > @@ -156,10 +163,19 @@ static void pnv_core_realize(DeviceState *dev, Error **errp)
> >          object_unref(obj);
> >      }
> >  
> > +    /* get XICS object from chip */
> > +    obj = object_property_get_link(OBJECT(dev), "xics", &local_err);
> > +    if (!obj) {
> > +        error_setg(errp, "%s: required link 'xics' not found: %s",
> > +                   __func__, error_get_pretty(local_err));
> > +        return;
> > +    }
> > +    xics = XICS_COMMON(obj);
> > +
> >      for (j = 0; j < cc->nr_threads; j++) {
> >          obj = pc->threads + j * size;
> >  
> > -        pnv_core_realize_child(obj, &local_err);
> > +        pnv_core_realize_child(obj, xics, &local_err);
> >          if (local_err) {
> >              goto err;
> >          }
> > diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
> > index c08ed1c72b17..e11618b05f1d 100644
> > --- a/include/hw/ppc/pnv.h
> > +++ b/include/hw/ppc/pnv.h
> > @@ -23,6 +23,7 @@
> >  #include "hw/sysbus.h"
> >  #include "hw/ppc/pnv_xscom.h"
> >  #include "hw/ppc/pnv_lpc.h"
> > +#include "hw/ppc/xics.h"
> >  
> >  #define TYPE_PNV_CHIP "powernv-chip"
> >  #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
> > @@ -57,6 +58,7 @@ typedef struct PnvChip {
> >      AddressSpace xscom_as;
> >  
> >      PnvLpcController lpc;
> > +    XICSNative   xics;
> >  } PnvChip;
> >  
> >  typedef struct PnvChipClass {
> > 
> 

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 14/17] ppc/xics: introduce a helper to insert a new ics
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 14/17] ppc/xics: introduce a helper to insert a new ics Cédric Le Goater
@ 2016-10-25  5:12   ` David Gibson
  0 siblings, 0 replies; 43+ messages in thread
From: David Gibson @ 2016-10-25  5:12 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Sat, Oct 22, 2016 at 11:46:47AM +0200, Cédric Le Goater wrote:
> Interrupt Control Sources (ICS) are now maintained under a list.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
>  hw/intc/xics.c        | 6 ++++++
>  include/hw/ppc/xics.h | 1 +
>  2 files changed, 7 insertions(+)
> 
> diff --git a/hw/intc/xics.c b/hw/intc/xics.c
> index 095c16a30082..f24787e95013 100644
> --- a/hw/intc/xics.c
> +++ b/hw/intc/xics.c
> @@ -151,6 +151,12 @@ static void xics_common_reset(DeviceState *d)
>      }
>  }
>  
> +void xics_insert_ics(XICSState *xics, ICSState *ics)
> +{
> +    ics->xics = xics;
> +    QLIST_INSERT_HEAD(&xics->ics, ics, list);
> +}
> +
>  static void xics_prop_get_nr_irqs(Object *obj, Visitor *v, const char *name,
>                                    void *opaque, Error **errp)
>  {
> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
> index beb232e616c5..f31eef8c9f6c 100644
> --- a/include/hw/ppc/xics.h
> +++ b/include/hw/ppc/xics.h
> @@ -228,6 +228,7 @@ void ics_simple_write_xive(ICSState *ics, int nr, int server,
>  void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
>  
>  ICSState *xics_find_source(XICSState *icp, int irq);
> +void xics_insert_ics(XICSState *xics, ICSState *ics);
>  
>  typedef struct PnvChip PnvChip;
>  

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt Cédric Le Goater
@ 2016-10-25  5:30   ` David Gibson
  2016-10-25  7:58     ` Cédric Le Goater
  2016-10-25 11:00     ` Cédric Le Goater
  0 siblings, 2 replies; 43+ messages in thread
From: David Gibson @ 2016-10-25  5:30 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Sat, Oct 22, 2016 at 11:46:48AM +0200, Cédric Le Goater wrote:
> From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> 
> The PSI (Processor Service Interface) is one of the engines of the
> "Bridge" unit which connects the different interfaces to the Power
> Processor.
> 
> This adds just enough of the PSI bridge to handle various on-chip and
> the one external interrupt. The rest of PSI has to do with the link to
> the IBM FSP service processor which we don't plan to emulate (not used
> on OpenPower machines).
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> [clg: - updated for qemu-2.7
>       - changed the XSCOM interface to fit new model
>       - QOMified the model
>       - reworked set_xive ]
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
> 
>  When skiboot initializes PSIHB, it fills the xives with server=0,
>  prio=0xff, which is fine, but for some reason the last two xive
>  settings reach the qemu MMIO region with a bogus value :
>  
> 	pnv_psi_mmio_write: MMIO write 0x30 val 0x000000ff00000000
> 	pnv_psi_mmio_write: MMIO write 0x60 val 0x000000ff20000000
> 	pnv_psi_mmio_write: MMIO write 0x68 val 0x000000ff40000000
> 	pnv_psi_mmio_write: MMIO write 0x70 val 0x000000ff60000000
> 	pnv_psi_mmio_write: MMIO write 0x78 val 0xffffffff80000000
> 	pnv_psi_mmio_write: MMIO write 0x80 val 0xffffffffa0000000
> 
>  It looks like a badly initialized temp variable in the call
>  stack. The memory regions look fine, maybe in stdcix ? For the
>  moment, I have added a logging error to catch non zero values as the
>  guest should not do that in any case.

Just to clarify, I think you're saying that you believe this to be a
skiboot (guest side) bug rather than a qemu bug.  Is that right?

> 
> 
>  Changes since v4:
> 
>  - used the helpers for the XSCOM region
>  - introduced pnv->cpld_irqstate to remove a static 
>  - reworked pnv_psi_set_xivr() to use xics_get_cpu_index_by_pir().
>    This is similar to rtas_set_xive but skiboot does a first
>    initialization with empty servers so we need to check for that
>    case.
> 
>  hw/ppc/Makefile.objs       |   2 +-
>  hw/ppc/pnv.c               |  31 ++-
>  hw/ppc/pnv_psi.c           | 615 +++++++++++++++++++++++++++++++++++++++++++++
>  include/hw/ppc/pnv.h       |   7 +
>  include/hw/ppc/pnv_psi.h   |  64 +++++
>  include/hw/ppc/pnv_xscom.h |   3 +
>  6 files changed, 715 insertions(+), 7 deletions(-)
>  create mode 100644 hw/ppc/pnv_psi.c
>  create mode 100644 include/hw/ppc/pnv_psi.h
> 
> diff --git a/hw/ppc/Makefile.objs b/hw/ppc/Makefile.objs
> index ebc72af0a7c6..4feb15b360c8 100644
> --- a/hw/ppc/Makefile.objs
> +++ b/hw/ppc/Makefile.objs
> @@ -6,7 +6,7 @@ obj-$(CONFIG_PSERIES) += spapr_hcall.o spapr_iommu.o spapr_rtas.o
>  obj-$(CONFIG_PSERIES) += spapr_pci.o spapr_rtc.o spapr_drc.o spapr_rng.o
>  obj-$(CONFIG_PSERIES) += spapr_cpu_core.o
>  # IBM PowerNV
> -obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o
> +obj-$(CONFIG_POWERNV) += pnv.o pnv_xscom.o pnv_core.o pnv_lpc.o pnv_psi.o
>  ifeq ($(CONFIG_PCI)$(CONFIG_PSERIES)$(CONFIG_LINUX), yyy)
>  obj-y += spapr_pci_vfio.o
>  endif
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index 16d7baf0da71..ec1a17699023 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -316,15 +316,22 @@ static void ppc_powernv_reset(void)
>   * have a CPLD that will collect the SerIRQ and shoot them as a
>   * single level interrupt to the P8 chip. So let's setup a hook
>   * for doing just that.
> - *
> - * Note: The actual interrupt input isn't emulated yet, this will
> - * come with the PSI bridge model.
>   */
>  static void pnv_lpc_isa_irq_handler_cpld(void *opaque, int n, int level)
>  {
> -    /* We don't yet emulate the PSI bridge which provides the external
> -     * interrupt, so just drop interrupts on the floor
> -     */
> +    PnvMachineState *pnv = POWERNV_MACHINE(qdev_get_machine());
> +    uint32_t old_state = pnv->cpld_irqstate;
> +    PnvChip *chip = opaque;
> +
> +    if (level) {
> +        pnv->cpld_irqstate |= 1u << n;
> +    } else {
> +        pnv->cpld_irqstate &= ~(1u << n);
> +    }
> +    if (pnv->cpld_irqstate != old_state) {
> +        pnv_psi_irq_set(&chip->psi, PSIHB_IRQ_EXTERNAL,
> +                        pnv->cpld_irqstate != 0);
> +    }
>  }
>  
>  static void pnv_lpc_isa_irq_handler(void *opaque, int n, int level)
> @@ -644,6 +651,9 @@ static void pnv_chip_init(Object *obj)
>  
>      object_initialize(&chip->xics, sizeof(chip->xics), TYPE_XICS_NATIVE);
>      object_property_add_child(obj, "xics", OBJECT(&chip->xics), NULL);
> +
> +    object_initialize(&chip->psi, sizeof(chip->psi), TYPE_PNV_PSI);
> +    object_property_add_child(obj, "psi", OBJECT(&chip->psi), NULL);
>  }
>  
>  static void pnv_chip_realize(DeviceState *dev, Error **errp)
> @@ -728,6 +738,15 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp)
>      }
>      g_free(typename);
>  
> +
> +    /* Processor Service Interface (PSI) Host Bridge */
> +    object_property_set_bool(OBJECT(&chip->psi), true, "realized",
> +                             &error_fatal);
> +    pnv_xscom_add_subregion(chip, PNV_XSCOM_PSI_BASE, &chip->psi.xscom_regs);
> +
> +    /* link in the PSI ICS */
> +    xics_insert_ics(XICS_COMMON(&chip->xics), &chip->psi.ics);
> +
>      /* Create LPC controller */
>      object_property_set_bool(OBJECT(&chip->lpc), true, "realized",
>                               &error_fatal);
> diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c
> new file mode 100644
> index 000000000000..8e21a0f1084e
> --- /dev/null
> +++ b/hw/ppc/pnv_psi.c
> @@ -0,0 +1,615 @@
> +/*
> + * QEMU PowerNV PowerPC PSI interface
> + *
> + * Copyright (c) 2016, IBM Corporation
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * 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/hw.h"
> +#include "target-ppc/cpu.h"
> +#include "qemu/log.h"
> +#include "qapi/error.h"
> +
> +#include "exec/address-spaces.h"
> +
> +#include "hw/ppc/fdt.h"
> +#include "hw/ppc/pnv.h"
> +#include "hw/ppc/pnv_psi.h"
> +
> +#include <libfdt.h>
> +
> +#define PSIHB_XSCOM_FIR_RW      0x00
> +#define PSIHB_XSCOM_FIR_AND     0x01
> +#define PSIHB_XSCOM_FIR_OR      0x02
> +#define PSIHB_XSCOM_FIRMASK_RW  0x03
> +#define PSIHB_XSCOM_FIRMASK_AND 0x04
> +#define PSIHB_XSCOM_FIRMASK_OR  0x05
> +#define PSIHB_XSCOM_FIRACT0     0x06
> +#define PSIHB_XSCOM_FIRACT1     0x07
> +#define PSIHB_XSCOM_BAR         0x0a
> +#define   PSIHB_BAR_EN                  0x0000000000000001ull
> +#define PSIHB_XSCOM_FSPBAR      0x0b
> +#define PSIHB_XSCOM_CR          0x0e
> +#define   PSIHB_CR_FSP_CMD_ENABLE       0x8000000000000000ull
> +#define   PSIHB_CR_FSP_MMIO_ENABLE      0x4000000000000000ull
> +#define   PSIHB_CR_FSP_IRQ_ENABLE       0x1000000000000000ull
> +#define   PSIHB_CR_FSP_ERR_RSP_ENABLE   0x0800000000000000ull
> +#define   PSIHB_CR_PSI_LINK_ENABLE      0x0400000000000000ull
> +#define   PSIHB_CR_FSP_RESET            0x0200000000000000ull
> +#define   PSIHB_CR_PSIHB_RESET          0x0100000000000000ull
> +#define   PSIHB_CR_PSI_IRQ              0x0000800000000000ull
> +#define   PSIHB_CR_FSP_IRQ              0x0000400000000000ull
> +#define   PSIHB_CR_FSP_LINK_ACTIVE      0x0000200000000000ull
> +          /* and more ... */
> +#define PSIHB_XSCOM_SEMR        0x0f
> +#define PSIHB_XSCOM_XIVR_PSI    0x10
> +#define   PSIHB_XIVR_SERVER_SH  40
> +#define   PSIHB_XIVR_SERVER_MSK (0xffffull << PSIHB_XIVR_SERVER_SH)
> +#define   PSIHB_XIVR_PRIO_SH    32
> +#define   PSIHB_XIVR_PRIO_MSK   (0xffull << PSIHB_XIVR_PRIO_SH)
> +#define   PSIHB_XIVR_SRC_SH             29
> +#define   PSIHB_XIVR_SRC_MSK    (0x7ull << PSIHB_XIVR_SRC_SH)
> +#define   PSIHB_XIVR_PENDING    0x01000000ull
> +#define PSIHB_XSCOM_SCR         0x12
> +#define PSIHB_XSCOM_CCR         0x13
> +#define PSIHB_XSCOM_DMA_UPADD   0x14
> +#define PSIHB_XSCOM_IRQ_STAT    0x15
> +#define  PSIHB_IRQ_STAT_OCC             0x0000001000000000ull
> +#define  PSIHB_IRQ_STAT_FSI             0x0000000800000000ull
> +#define  PSIHB_IRQ_STAT_LPCI2C          0x0000000400000000ull
> +#define  PSIHB_IRQ_STAT_LOCERR          0x0000000200000000ull
> +#define  PSIHB_IRQ_STAT_EXT             0x0000000100000000ull
> +#define PSIHB_XSCOM_XIVR_OCC    0x16
> +#define PSIHB_XSCOM_XIVR_FSI    0x17
> +#define PSIHB_XSCOM_XIVR_LPCI2C 0x18
> +#define PSIHB_XSCOM_XIVR_LOCERR 0x19
> +#define PSIHB_XSCOM_XIVR_EXT    0x1a
> +#define PSIHB_XSCOM_IRSN        0x1b
> +#define   PSIHB_IRSN_COMP_SH            45
> +#define   PSIHB_IRSN_COMP_MSK           (0x7ffffull << PSIHB_IRSN_COMP_SH)
> +#define   PSIHB_IRSN_IRQ_MUX            0x0000000800000000ull
> +#define   PSIHB_IRSN_IRQ_RESET          0x0000000400000000ull
> +#define   PSIHB_IRSN_DOWNSTREAM_EN      0x0000000200000000ull
> +#define   PSIHB_IRSN_UPSTREAM_EN        0x0000000100000000ull
> +#define   PSIHB_IRSN_COMPMASK_SH        13
> +#define   PSIHB_IRSN_COMPMASK_MSK       (0x7ffffull << PSIHB_IRSN_COMPMASK_SH)
> +
> +#define PSIHB_MMIO_BAR          0x00
> +#define PSIHB_MMIO_FSPBAR       0x08
> +#define PSIHB_MMIO_CR           0x20
> +#define PSIHB_MMIO_SEMR         0x28
> +#define PSIHB_MMIO_XIVR_PSI     0x30
> +#define PSIHB_MMIO_SCR          0x40
> +#define PSIHB_MMIO_CCR          0x48
> +#define PSIHB_MMIO_DMA_UPADD    0x50
> +#define PSIHB_MMIO_IRQ_STAT     0x58
> +#define PSIHB_MMIO_XIVR_OCC     0x60
> +#define PSIHB_MMIO_XIVR_FSI     0x68
> +#define PSIHB_MMIO_XIVR_LPCI2C  0x70
> +#define PSIHB_MMIO_XIVR_LOCERR  0x78
> +#define PSIHB_MMIO_XIVR_EXT     0x80
> +#define PSIHB_MMIO_IRSN         0x88
> +#define PSIHB_MMIO_MAX          0x100
> +
> +static const uint32_t psi_mmio_to_xscom[PSIHB_MMIO_MAX / 8] = {

AFAICT, this table lookup works out as:
	xscom_addr = (mmio_addr / 8) + 0xa

Which makes an actual table seem like overkill.


And in fact, since you have a /8 here, and the *8 in the xscom address
space encoding, I suspect you could just alias the same IO region into
both SCOM and MMIO address spaces to avoid having two dispatchers.

> +        [PSIHB_MMIO_BAR / 8]         = PSIHB_XSCOM_BAR,
> +        [PSIHB_MMIO_FSPBAR / 8]      = PSIHB_XSCOM_FSPBAR,
> +        [PSIHB_MMIO_CR / 8]          = PSIHB_XSCOM_CR,
> +        [PSIHB_MMIO_SCR / 8]         = PSIHB_XSCOM_SCR,
> +        [PSIHB_MMIO_CCR / 8]         = PSIHB_XSCOM_CCR,
> +        [PSIHB_MMIO_SEMR / 8]        = PSIHB_XSCOM_SEMR,
> +        [PSIHB_MMIO_XIVR_PSI / 8]    = PSIHB_XSCOM_XIVR_PSI,
> +        [PSIHB_MMIO_XIVR_OCC / 8]    = PSIHB_XSCOM_XIVR_OCC,
> +        [PSIHB_MMIO_XIVR_FSI / 8]    = PSIHB_XSCOM_XIVR_FSI,
> +        [PSIHB_MMIO_XIVR_LPCI2C / 8] = PSIHB_XSCOM_XIVR_LPCI2C,
> +        [PSIHB_MMIO_XIVR_LOCERR / 8] = PSIHB_XSCOM_XIVR_LOCERR,
> +        [PSIHB_MMIO_XIVR_EXT / 8]    = PSIHB_XSCOM_XIVR_EXT,
> +        [PSIHB_MMIO_IRQ_STAT / 8]    = PSIHB_XSCOM_IRQ_STAT,
> +        [PSIHB_MMIO_DMA_UPADD / 8]   = PSIHB_XSCOM_DMA_UPADD,
> +        [PSIHB_MMIO_IRSN / 8]        = PSIHB_XSCOM_IRSN,
> +};
> +
> +static void pnv_psi_set_bar(PnvPsiController *psi, uint64_t bar)
> +{
> +    MemoryRegion *sysmem = get_system_memory();
> +    uint64_t old = psi->regs[PSIHB_XSCOM_BAR];
> +
> +    psi->regs[PSIHB_XSCOM_BAR] = bar & 0x0003fffffff00001;
> +
> +    /* Update MR, always remove it first */
> +    if (old & PSIHB_BAR_EN) {
> +        memory_region_del_subregion(sysmem, &psi->regs_mr);
> +    }
> +    /* Then add it back if needed */
> +    if (bar & PSIHB_BAR_EN) {
> +        uint64_t addr = bar & 0x0003fffffff00000;
> +        memory_region_add_subregion(sysmem, addr, &psi->regs_mr);
> +    }
> +}
> +
> +static void pnv_psi_update_fsp_mr(PnvPsiController *psi)
> +{
> +    /* XXX Update FSP MR if/when we support FSP BAR */
> +}
> +
> +static void pnv_psi_set_cr(PnvPsiController *psi, uint64_t cr)
> +{
> +    uint64_t old = psi->regs[PSIHB_XSCOM_CR];
> +
> +    psi->regs[PSIHB_XSCOM_CR] = cr & 0x0003ffff00000000;
> +
> +    /* Check some bit changes */
> +    if ((old ^ psi->regs[PSIHB_XSCOM_CR]) & PSIHB_CR_FSP_MMIO_ENABLE) {
> +        pnv_psi_update_fsp_mr(psi);
> +    }
> +}
> +
> +static void pnv_psi_set_irsn(PnvPsiController *psi, uint64_t val)
> +{
> +    uint32_t offset;
> +    ICSState *ics = &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).
> +     * We ignore IRQ_MUX, its meaning isn't clear and we don't use
> +     * it and finally we ignore reset (XXX fix that ?)
> +     */
> +    psi->regs[PSIHB_XSCOM_IRSN] = val & (PSIHB_IRSN_COMP_MSK |
> +                                         PSIHB_IRSN_IRQ_MUX |
> +                                         PSIHB_IRSN_DOWNSTREAM_EN |
> +                                         PSIHB_IRSN_DOWNSTREAM_EN |
> +                                         PSIHB_IRSN_DOWNSTREAM_EN);
> +
> +    /* We ignore the compare mask as well, our ICS emulation is too
> +     * simplistic to make any use if it, and we extract the offset
> +     * from the compare value
> +     */
> +    offset = (val & PSIHB_IRSN_COMP_MSK) >> PSIHB_IRSN_COMP_SH;
> +    ics->offset = offset;
> +}
> +
> +static bool pnv_psi_irq_bits(PnvPsiController *psi, PnvPsiIrq irq,
> +                             uint32_t *out_xivr_reg,
> +                             uint32_t *out_stat_reg,
> +                             uint64_t *out_stat_bit)
> +{
> +    switch (irq) {
> +    case PSIHB_IRQ_PSI:
> +        *out_xivr_reg = PSIHB_XSCOM_XIVR_PSI;
> +        *out_stat_reg = PSIHB_XSCOM_CR;
> +        *out_stat_bit = PSIHB_CR_PSI_IRQ;
> +        break;
> +    case PSIHB_IRQ_FSP:
> +        *out_xivr_reg = PSIHB_XSCOM_XIVR_PSI;
> +        *out_stat_reg = PSIHB_XSCOM_CR;
> +        *out_stat_bit = PSIHB_CR_FSP_IRQ;
> +        break;
> +    case PSIHB_IRQ_OCC:
> +        *out_xivr_reg = PSIHB_XSCOM_XIVR_OCC;
> +        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
> +        *out_stat_bit = PSIHB_IRQ_STAT_OCC;
> +        break;
> +    case PSIHB_IRQ_FSI:
> +        *out_xivr_reg = PSIHB_XSCOM_XIVR_FSI;
> +        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
> +        *out_stat_bit = PSIHB_IRQ_STAT_FSI;
> +        break;
> +    case PSIHB_IRQ_LPC_I2C:
> +        *out_xivr_reg = PSIHB_XSCOM_XIVR_LPCI2C;
> +        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
> +        *out_stat_bit = PSIHB_IRQ_STAT_LPCI2C;
> +        break;
> +    case PSIHB_IRQ_LOCAL_ERR:
> +        *out_xivr_reg = PSIHB_XSCOM_XIVR_LOCERR;
> +        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
> +        *out_stat_bit = PSIHB_IRQ_STAT_LOCERR;
> +        break;
> +    case PSIHB_IRQ_EXTERNAL:
> +        *out_xivr_reg = PSIHB_XSCOM_XIVR_EXT;
> +        *out_stat_reg = PSIHB_XSCOM_IRQ_STAT;
> +        *out_stat_bit = PSIHB_IRQ_STAT_EXT;
> +        break;
> +    default:
> +        return false;
> +    }
> +    return true;
> +}
> +
> +void pnv_psi_irq_set(PnvPsiController *psi, PnvPsiIrq irq, bool state)
> +{
> +    ICSState *ics = &psi->ics;
> +    uint32_t xivr_reg;
> +    uint32_t stat_reg;
> +    uint64_t stat_bit;
> +    uint32_t src;
> +    bool masked;
> +
> +    if (!pnv_psi_irq_bits(psi, irq, &xivr_reg, &stat_reg, &stat_bit)) {
> +        qemu_log_mask(LOG_GUEST_ERROR, "PSI: Unsupported irq %d\n", irq);
> +        return;
> +    }
> +
> +    src = (psi->regs[xivr_reg] & PSIHB_XIVR_SRC_MSK) >> PSIHB_XIVR_SRC_SH;
> +    masked = (psi->regs[xivr_reg] & PSIHB_XIVR_PRIO_MSK) == PSIHB_XIVR_PRIO_MSK;
> +    if (state) {
> +        psi->regs[stat_reg] |= stat_bit;
> +        /* XXX optimization: check mask here. That means re-evaluating
> +         * when unmasking, thus TODO
> +         */
> +        qemu_irq_raise(ics->qirqs[src]);
> +    } else {
> +        psi->regs[stat_reg] &= ~stat_bit;
> +
> +        /* FSP and PSI are muxed so don't lower if either still set */
> +        if (stat_reg != PSIHB_XSCOM_CR ||
> +            !(psi->regs[stat_reg] & (PSIHB_CR_PSI_IRQ | PSIHB_CR_FSP_IRQ))) {
> +            qemu_irq_lower(ics->qirqs[src]);
> +        } else {
> +            state = true;
> +        }
> +    }
> +
> +    /* XXX Note about the emulation of the pending bit: This isn't
> +     * entirely correct. The pending bit should be cleared when the
> +     * EOI has been received. However, we don't have callbacks on
> +     * EOI (especially not under KVM) so no way to emulate that
> +     * properly, so instead we just set that bit as the logical
> +     * "output" of the XIVR (ie pending & !masked)
> +     * XXX TODO: Also update it on set_xivr
> +     */
> +    if (state && !masked) {
> +        psi->regs[xivr_reg] |= PSIHB_XIVR_PENDING;
> +    } else {
> +        psi->regs[xivr_reg] &= ~PSIHB_XIVR_PENDING;
> +    }
> +}
> +
> +static void pnv_psi_set_xivr(PnvPsiController *psi, uint32_t reg, uint64_t val)
> +{
> +    ICSState *ics = &psi->ics;
> +    uint16_t server;
> +    uint8_t prio;
> +    uint8_t src;
> +    int icp_index;
> +
> +    psi->regs[reg] = (psi->regs[reg] & PSIHB_XIVR_PENDING) |
> +            (val & (PSIHB_XIVR_SERVER_MSK |
> +                    PSIHB_XIVR_PRIO_MSK |
> +                    PSIHB_XIVR_SRC_MSK));
> +    val = psi->regs[reg];
> +    server = (val & PSIHB_XIVR_SERVER_MSK) >> PSIHB_XIVR_SERVER_SH;
> +    prio = (val & PSIHB_XIVR_PRIO_MSK) >> PSIHB_XIVR_PRIO_SH;
> +    src = (val & PSIHB_XIVR_SRC_MSK) >> PSIHB_XIVR_SRC_SH;
> +    if (src > PSIHB_IRQ_EXTERNAL) {
> +        /* XXX Generate error ? */
> +        return;
> +    }
> +
> +    /*
> +     * Linux fills the irq xivr with the hw processor id plus the
> +     * link bits. shift back to get something valid.
> +     */
> +    server >>= 2;
> +
> +    /*
> +     * When skiboot initializes PSIHB, it fills the xives with
> +     * server=0, prio=0xff, but we don't have a CPU with a pir=0. So
> +     * skip that case.
> +     */
> +    if (prio != 0xff) {
> +        icp_index = xics_get_cpu_index_by_pir(ics->xics, server);
> +        assert(icp_index != -1);
> +    } else {
> +        if (server) {
> +            qemu_log_mask(LOG_GUEST_ERROR, "PSI: bogus server %d for IRQ %d\n",
> +                          server, src);
> +        }
> +        icp_index = server;
> +    }
> +
> +    /* Now because of source remapping, weird things can happen
> +     * if you change the source number dynamically, our simple ICS
> +     * doesn't deal with remapping. So we just poke a different
> +     * ICS entry based on what source number was written. This will
> +     * do for now but a more accurate implementation would instead
> +     * use a fixed server/prio and a remapper of the generated irq.
> +     */
> +    ics_simple_write_xive(ics, src, icp_index, prio, prio);
> +}
> +
> +static bool pnv_psi_reg_read(PnvPsiController *psi, uint32_t offset,
> +                             uint64_t *out_val, bool mmio)
> +{
> +    switch (offset) {
> +    case PSIHB_XSCOM_FIR_RW:
> +    case PSIHB_XSCOM_FIRACT0:
> +    case PSIHB_XSCOM_FIRACT1:
> +    case PSIHB_XSCOM_BAR:
> +    case PSIHB_XSCOM_FSPBAR:
> +    case PSIHB_XSCOM_CR:
> +    case PSIHB_XSCOM_XIVR_PSI:
> +    case PSIHB_XSCOM_XIVR_OCC:
> +    case PSIHB_XSCOM_XIVR_FSI:
> +    case PSIHB_XSCOM_XIVR_LPCI2C:
> +    case PSIHB_XSCOM_XIVR_LOCERR:
> +    case PSIHB_XSCOM_XIVR_EXT:
> +    case PSIHB_XSCOM_IRQ_STAT:
> +    case PSIHB_XSCOM_SEMR:
> +    case PSIHB_XSCOM_DMA_UPADD:
> +    case PSIHB_XSCOM_IRSN:
> +        *out_val = psi->regs[offset];
> +        return true;
> +    }
> +    return false;
> +}
> +
> +static bool pnv_psi_reg_write(PnvPsiController *psi, uint32_t offset,
> +                              uint64_t val, bool mmio)
> +{
> +    switch (offset) {
> +    case PSIHB_XSCOM_FIR_RW:
> +    case PSIHB_XSCOM_FIRACT0:
> +    case PSIHB_XSCOM_FIRACT1:
> +    case PSIHB_XSCOM_SEMR:
> +    case PSIHB_XSCOM_DMA_UPADD:
> +        psi->regs[offset] = val;
> +        return true;
> +    case PSIHB_XSCOM_FIR_OR:
> +        psi->regs[PSIHB_XSCOM_FIR_RW] |= val;
> +        return true;
> +    case PSIHB_XSCOM_FIR_AND:
> +        psi->regs[PSIHB_XSCOM_FIR_RW] &= val;
> +        return true;
> +    case PSIHB_XSCOM_BAR:
> +        /* Only XSCOM can write this one */
> +        if (!mmio) {
> +            pnv_psi_set_bar(psi, val);
> +        }
> +        return true;
> +    case PSIHB_XSCOM_FSPBAR:
> +        psi->regs[PSIHB_XSCOM_BAR] = val & 0x0003ffff00000000;
> +        pnv_psi_update_fsp_mr(psi);
> +        return true;
> +    case PSIHB_XSCOM_CR:
> +        pnv_psi_set_cr(psi, val);
> +        return true;
> +    case PSIHB_XSCOM_SCR:
> +        pnv_psi_set_cr(psi, psi->regs[PSIHB_XSCOM_CR] | val);
> +        return true;
> +    case PSIHB_XSCOM_CCR:
> +        pnv_psi_set_cr(psi, psi->regs[PSIHB_XSCOM_CR] & ~val);
> +        return true;
> +    case PSIHB_XSCOM_XIVR_PSI:
> +    case PSIHB_XSCOM_XIVR_OCC:
> +    case PSIHB_XSCOM_XIVR_FSI:
> +    case PSIHB_XSCOM_XIVR_LPCI2C:
> +    case PSIHB_XSCOM_XIVR_LOCERR:
> +    case PSIHB_XSCOM_XIVR_EXT:
> +        pnv_psi_set_xivr(psi, offset, val);
> +        return true;
> +    case PSIHB_XSCOM_IRQ_STAT:
> +        /* Read only, should we generate an error ? */
> +        return true;
> +    case PSIHB_XSCOM_IRSN:
> +        pnv_psi_set_irsn(psi, val);
> +        return true;
> +    }
> +    return false;
> +}
> +
> +static uint64_t pnv_psi_mmio_read(void *opaque, hwaddr addr, unsigned size)
> +{
> +    PnvPsiController *psi = opaque;
> +    uint32_t xscom_off;
> +    uint64_t val;
> +
> +    if (size != 8) {
> +        goto fail;
> +    }
> +
> +    addr &= (PNV_PSIHB_BAR_SIZE - 1);
> +
> +    if (addr >= PSIHB_MMIO_MAX) {
> +        goto fail;
> +    }
> +    xscom_off = psi_mmio_to_xscom[addr / 8];
> +    if (xscom_off == 0) {
> +        goto fail;
> +    }
> +    if (pnv_psi_reg_read(psi, xscom_off, &val, true)) {
> +        return val;
> +    }
> + fail:
> +    return 0xffffffffffffffffull;
> +}
> +
> +static void pnv_psi_mmio_write(void *opaque, hwaddr addr,
> +                              uint64_t val, unsigned size)
> +{
> +    PnvPsiController *psi = opaque;
> +    uint32_t xscom_off;
> +
> +    if (size != 8) {
> +        return;
> +    }
> +
> +    addr &= (PNV_PSIHB_BAR_SIZE - 1);
> +
> +    if (addr >= PSIHB_MMIO_MAX) {
> +        return;
> +    }
> +    xscom_off = psi_mmio_to_xscom[addr / 8];
> +    if (xscom_off == 0) {
> +        return;
> +    }
> +    pnv_psi_reg_write(psi, xscom_off, val, true);
> +}
> +
> +static const MemoryRegionOps psi_mmio_ops = {
> +    .read = pnv_psi_mmio_read,
> +    .write = pnv_psi_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_xscom_read(void *opaque, hwaddr addr, unsigned size)
> +{
> +    PnvPsiController *psi = PNV_PSI(opaque);
> +    uint32_t offset = addr >> 3;
> +    uint64_t val = 0;
> +
> +    pnv_psi_reg_read(psi, offset, &val, false);
> +
> +    return val;
> +}
> +
> +static void pnv_psi_xscom_write(void *opaque, hwaddr addr,
> +                                uint64_t val, unsigned size)
> +{
> +    PnvPsiController *psi = PNV_PSI(opaque);
> +    uint32_t offset = addr >> 3;
> +
> +    pnv_psi_reg_write(psi, offset, val, false);
> +}
> +
> +static const MemoryRegionOps pnv_psi_xscom_ops = {
> +    .read = pnv_psi_xscom_read,
> +    .write = pnv_psi_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_psi_init(Object *obj)
> +{
> +    PnvPsiController *psi = PNV_PSI(obj);
> +
> +    object_initialize(&psi->ics, sizeof(psi->ics), TYPE_ICS_SIMPLE);
> +    object_property_add_child(obj, "ics-psi", OBJECT(&psi->ics), NULL);
> +}
> +
> +static void pnv_psi_realize(DeviceState *dev, Error **errp)
> +{
> +    PnvPsiController *psi = PNV_PSI(dev);
> +    ICSState *ics = &psi->ics;
> +    Error *error = NULL;
> +    unsigned int i;
> +
> +    /* Initialize MMIO region */
> +    memory_region_init_io(&psi->regs_mr, OBJECT(dev), &psi_mmio_ops, psi,
> +                          "psihb", PNV_PSIHB_BAR_SIZE);
> +
> +    /* Default BAR. Use object properties ? */
> +    pnv_psi_set_bar(psi, PNV_PSIHB_BAR | PSIHB_BAR_EN);
> +
> +    /* Default sources in XIVR */
> +    psi->regs[PSIHB_XSCOM_XIVR_PSI] = PSIHB_XIVR_PRIO_MSK |
> +            (0ull << PSIHB_XIVR_SRC_SH);
> +    psi->regs[PSIHB_XSCOM_XIVR_OCC] = PSIHB_XIVR_PRIO_MSK |
> +            (1ull << PSIHB_XIVR_SRC_SH);
> +    psi->regs[PSIHB_XSCOM_XIVR_FSI] = PSIHB_XIVR_PRIO_MSK |
> +            (2ull << PSIHB_XIVR_SRC_SH);
> +    psi->regs[PSIHB_XSCOM_XIVR_LPCI2C] = PSIHB_XIVR_PRIO_MSK |
> +            (3ull << PSIHB_XIVR_SRC_SH);
> +    psi->regs[PSIHB_XSCOM_XIVR_LOCERR] = PSIHB_XIVR_PRIO_MSK |
> +            (4ull << PSIHB_XIVR_SRC_SH);
> +    psi->regs[PSIHB_XSCOM_XIVR_EXT] = PSIHB_XIVR_PRIO_MSK |
> +            (5ull << PSIHB_XIVR_SRC_SH);
> +
> +    /*
> +     * PSI interrupt control source
> +     * FIXME: nr_irqs should a property
> +     */
> +    ics->nr_irqs = PSI_NUM_INTERRUPTS;
> +    object_property_set_bool(OBJECT(ics), true, "realized", &error);
> +    if (error) {
> +        error_propagate(errp, error);
> +        return;
> +    }
> +
> +    for (i = 0; i < ics->nr_irqs; i++) {
> +        ics_set_irq_type(ics, i, true);
> +    }
> +
> +    /* XScom region for PSI registers */
> +    pnv_xscom_region_init(&psi->xscom_regs, OBJECT(dev), &pnv_psi_xscom_ops,
> +                psi, "xscom-psi", PNV_XSCOM_PSI_SIZE);
> +}
> +
> +static int pnv_psi_populate(PnvXScomInterface *dev, void *fdt, int xscom_offset)
> +{
> +    const char compat[] = "ibm,power8-psihb-x\0ibm,psihb-x";
> +    char *name;
> +    int offset;
> +    uint32_t lpc_pcba = PNV_XSCOM_PSI_BASE;
> +    uint32_t reg[] = {
> +        cpu_to_be32(lpc_pcba),
> +        cpu_to_be32(PNV_XSCOM_PSI_SIZE)
> +    };
> +
> +    name = g_strdup_printf("psihb@%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_cell(fdt, offset, "#address-cells", 2)));
> +    _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1)));
> +    _FDT((fdt_setprop(fdt, offset, "compatible", compat,
> +                      sizeof(compat))));
> +    return 0;
> +}
> +
> +
> +static void pnv_psi_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass);
> +
> +    xdc->populate = pnv_psi_populate;
> +
> +    dc->realize = pnv_psi_realize;
> +}
> +
> +static const TypeInfo pnv_psi_info = {
> +    .name          = TYPE_PNV_PSI,
> +    .parent        = TYPE_DEVICE,
> +    .instance_size = sizeof(PnvPsiController),
> +    .instance_init = pnv_psi_init,
> +    .class_init    = pnv_psi_class_init,
> +    .interfaces    = (InterfaceInfo[]) {
> +        { TYPE_PNV_XSCOM_INTERFACE },
> +        { }
> +    }
> +};
> +
> +static void pnv_psi_register_types(void)
> +{
> +    type_register_static(&pnv_psi_info);
> +}
> +
> +type_init(pnv_psi_register_types)
> diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
> index e11618b05f1d..6fcbedf56d79 100644
> --- a/include/hw/ppc/pnv.h
> +++ b/include/hw/ppc/pnv.h
> @@ -24,6 +24,7 @@
>  #include "hw/ppc/pnv_xscom.h"
>  #include "hw/ppc/pnv_lpc.h"
>  #include "hw/ppc/xics.h"
> +#include "hw/ppc/pnv_psi.h"
>  
>  #define TYPE_PNV_CHIP "powernv-chip"
>  #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP)
> @@ -59,6 +60,7 @@ typedef struct PnvChip {
>  
>      PnvLpcController lpc;
>      XICSNative   xics;
> +    PnvPsiController psi;
>  } PnvChip;
>  
>  typedef struct PnvChipClass {
> @@ -116,6 +118,7 @@ typedef struct PnvMachineState {
>      PnvChip      **chips;
>  
>      ISABus       *isa_bus;
> +    uint32_t     cpld_irqstate;
>  } PnvMachineState;
>  
>  #define PNV_FDT_ADDR          0x01000000
> @@ -147,4 +150,8 @@ typedef struct PnvMachineState {
>  #define PNV_XICS_BASE         0x0003ffff80000000ull
>  #define PNV_XICS_SIZE         0x0000000000100000ull
>  
> +#define PNV_PSIHB_BAR         0x0003fffe80000000ull
> +#define PNV_PSIHB_BAR_SIZE    0x0000000000100000ull
> +
> +
>  #endif /* _PPC_PNV_H */
> diff --git a/include/hw/ppc/pnv_psi.h b/include/hw/ppc/pnv_psi.h
> new file mode 100644
> index 000000000000..30bb9bc71839
> --- /dev/null
> +++ b/include/hw/ppc/pnv_psi.h
> @@ -0,0 +1,64 @@
> +/*
> + * QEMU PowerPC PowerNV PSI controller
> + *
> + * Copyright (c) 2016, IBM Corporation.
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * 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/>.
> + */
> +#ifndef _PPC_PNV_PSI_H
> +#define _PPC_PNV_PSI_H
> +
> +#include "hw/ppc/pnv_xscom.h"
> +#include "hw/ppc/pnv_psi.h"
> +
> +#define TYPE_PNV_PSI "pnv-psi"
> +#define PNV_PSI(obj) \
> +     OBJECT_CHECK(PnvPsiController, (obj), TYPE_PNV_PSI)
> +
> +#define PSIHB_XSCOM_MAX         0x20
> +
> +typedef struct XICSState XICSState;
> +
> +typedef struct PnvPsiController {
> +    DeviceState parent;
> +
> +    MemoryRegion regs_mr;
> +
> +    /* FSP region not supported */
> +    /* MemoryRegion fsp_mr; */
> +
> +    /* Interrupt generation */
> +    ICSState ics;
> +
> +    /* Registers */
> +    uint64_t regs[PSIHB_XSCOM_MAX];
> +
> +    MemoryRegion xscom_regs;
> +} PnvPsiController;
> +
> +typedef enum PnvPsiIrq {
> +    PSIHB_IRQ_PSI, /* internal use only */
> +    PSIHB_IRQ_FSP, /* internal use only */
> +    PSIHB_IRQ_OCC,
> +    PSIHB_IRQ_FSI,
> +    PSIHB_IRQ_LPC_I2C,
> +    PSIHB_IRQ_LOCAL_ERR,
> +    PSIHB_IRQ_EXTERNAL,
> +} PnvPsiIrq;
> +
> +#define PSI_NUM_INTERRUPTS 6
> +
> +extern void pnv_psi_irq_set(PnvPsiController *psi, PnvPsiIrq irq, bool state);
> +
> +#endif /* _PPC_PNV_PSI_H */
> diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h
> index c0a2fbb9f6f8..ea7ac88bf311 100644
> --- a/include/hw/ppc/pnv_xscom.h
> +++ b/include/hw/ppc/pnv_xscom.h
> @@ -63,6 +63,9 @@ typedef struct PnvXScomInterfaceClass {
>  #define PNV_XSCOM_LPC_BASE        0xb0020
>  #define PNV_XSCOM_LPC_SIZE        0x4
>  
> +#define PNV_XSCOM_PSI_BASE        0x2010900
> +#define PNV_XSCOM_PSI_SIZE        0x20
> +
>  extern void pnv_xscom_realize(PnvChip *chip, Error **errp);
>  extern int pnv_xscom_populate(PnvChip *chip, void *fdt, int offset);
>  

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 17/17] ppc/pnv: Add Naples chip support for LPC interrupts
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 17/17] ppc/pnv: Add Naples chip support for LPC interrupts Cédric Le Goater
@ 2016-10-25  5:35   ` David Gibson
  0 siblings, 0 replies; 43+ messages in thread
From: David Gibson @ 2016-10-25  5:35 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Sat, Oct 22, 2016 at 11:46:50AM +0200, Cédric Le Goater wrote:
> From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> 
> It adds the Naples chip which supports proper LPC interrupts via the
> LPC controller rather than via an external CPLD.
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> [clg: - updated for qemu-2.7
>       - ported on latest PowerNV patchset (v3) ]
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
> 
>  Changes since v4:
> 
>  - remove test on ISA_NUM_IRQS 
> 
>  hw/ppc/pnv.c             | 15 ++++++++++++++-
>  hw/ppc/pnv_lpc.c         | 47 +++++++++++++++++++++++++++++++++++++++++++++--
>  include/hw/ppc/pnv_lpc.h |  9 +++++++++
>  3 files changed, 68 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index ddbf7510424c..4ef80b5b4110 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -336,7 +336,14 @@ static void pnv_lpc_isa_irq_handler_cpld(void *opaque, int n, int level)
>  
>  static void pnv_lpc_isa_irq_handler(void *opaque, int n, int level)
>  {
> -     /* XXX TODO */
> +    PnvChip *chip = opaque;
> +    PnvLpcController *lpc = &chip->lpc;
> +
> +    /* The Naples HW latches the 1 levels, clearing is done by SW */
> +    if (level) {
> +        lpc->lpc_hc_irqstat |= LPC_HC_IRQ_SERIRQ0 >> n;
> +        pnv_lpc_eval_irqs(lpc);
> +    }
>  }
>  
>  static ISABus *pnv_isa_create(PnvChip *chip)
> @@ -659,6 +666,12 @@ static void pnv_chip_init(Object *obj)
>      object_property_add_child(obj, "occ", OBJECT(&chip->occ), NULL);
>      object_property_add_const_link(OBJECT(&chip->occ), "psi",
>                                     OBJECT(&chip->psi), &error_abort);
> +
> +    /*
> +     * The LPC controller needs PSI to generate interrupts
> +     */
> +    object_property_add_const_link(OBJECT(&chip->lpc), "psi",
> +                                   OBJECT(&chip->psi), &error_abort);
>  }
>  
>  static void pnv_chip_realize(DeviceState *dev, Error **errp)
> diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
> index 00dbd8b07b38..91e966565694 100644
> --- a/hw/ppc/pnv_lpc.c
> +++ b/hw/ppc/pnv_lpc.c
> @@ -249,6 +249,34 @@ static const MemoryRegionOps pnv_lpc_xscom_ops = {
>      .endianness = DEVICE_BIG_ENDIAN,
>  };
>  
> +void pnv_lpc_eval_irqs(PnvLpcController *lpc)
> +{
> +    bool lpc_to_opb_irq = false;
> +
> +    /* Update LPC controller to OPB line */
> +    if (lpc->lpc_hc_irqser_ctrl & LPC_HC_IRQSER_EN) {
> +        uint32_t irqs;
> +
> +        irqs = lpc->lpc_hc_irqstat & lpc->lpc_hc_irqmask;
> +        lpc_to_opb_irq = (irqs != 0);
> +    }
> +
> +    /* We don't honor the polarity register, it's pointless and unused
> +     * anyway
> +     */
> +    if (lpc_to_opb_irq) {
> +        lpc->opb_irq_input |= OPB_MASTER_IRQ_LPC;
> +    } else {
> +        lpc->opb_irq_input &= ~OPB_MASTER_IRQ_LPC;
> +    }
> +
> +    /* Update OPB internal latch */
> +    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);
> +}
> +
>  static uint64_t lpc_hc_read(void *opaque, hwaddr addr, unsigned size)
>  {
>      PnvLpcController *lpc = opaque;
> @@ -299,12 +327,15 @@ static void lpc_hc_write(void *opaque, hwaddr addr, uint64_t val,
>          break;
>      case LPC_HC_IRQSER_CTRL:
>          lpc->lpc_hc_irqser_ctrl = val;
> +        pnv_lpc_eval_irqs(lpc);
>          break;
>      case LPC_HC_IRQMASK:
>          lpc->lpc_hc_irqmask = val;
> +        pnv_lpc_eval_irqs(lpc);
>          break;
>      case LPC_HC_IRQSTAT:
>          lpc->lpc_hc_irqstat &= ~val;
> +        pnv_lpc_eval_irqs(lpc);
>          break;
>      case LPC_HC_ERROR_ADDRESS:
>          break;
> @@ -362,14 +393,15 @@ static void opb_master_write(void *opaque, hwaddr addr,
>      switch (addr) {
>      case OPB_MASTER_LS_IRQ_STAT:
>          lpc->opb_irq_stat &= ~val;
> +        pnv_lpc_eval_irqs(lpc);
>          break;
>      case OPB_MASTER_LS_IRQ_MASK:
> -        /* XXX Filter out reserved bits */
>          lpc->opb_irq_mask = val;
> +        pnv_lpc_eval_irqs(lpc);
>          break;
>      case OPB_MASTER_LS_IRQ_POL:
> -        /* XXX Filter out reserved bits */
>          lpc->opb_irq_pol = val;
> +        pnv_lpc_eval_irqs(lpc);
>          break;
>      case OPB_MASTER_LS_IRQ_INPUT:
>          /* Read only */
> @@ -397,6 +429,8 @@ static const MemoryRegionOps opb_master_ops = {
>  static void pnv_lpc_realize(DeviceState *dev, Error **errp)
>  {
>      PnvLpcController *lpc = PNV_LPC(dev);
> +    Object *obj;
> +    Error *error = NULL;
>  
>      /* Reg inits */
>      lpc->lpc_hc_fw_rd_acc_size = LPC_HC_FW_RD_4B;
> @@ -440,6 +474,15 @@ static void pnv_lpc_realize(DeviceState *dev, Error **errp)
>      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)
> diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h
> index 38e5506975aa..3ed7dafc799d 100644
> --- a/include/hw/ppc/pnv_lpc.h
> +++ b/include/hw/ppc/pnv_lpc.h
> @@ -23,6 +23,8 @@
>  #define PNV_LPC(obj) \
>       OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV_LPC)
>  
> +typedef struct PnvPsiController PnvPsiController;
> +
>  typedef struct PnvLpcController {
>      DeviceState parent;
>  
> @@ -62,6 +64,13 @@ typedef struct PnvLpcController {
>  
>      /* XSCOM registers */
>      MemoryRegion xscom_regs;
> +
> +    /* PSI to generate interrupts */
> +    PnvPsiController *psi;
>  } PnvLpcController;
>  
> +#define   LPC_HC_IRQ_SERIRQ0            0x80000000 /* all bits down to ... */
> +
> +void pnv_lpc_eval_irqs(PnvLpcController *lpc);
> +
>  #endif /* _PPC_PNV_LPC_H */

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper
  2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper Cédric Le Goater
@ 2016-10-25  5:36   ` David Gibson
  2016-10-25 10:58     ` Cédric Le Goater
  0 siblings, 1 reply; 43+ messages in thread
From: David Gibson @ 2016-10-25  5:36 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Sat, Oct 22, 2016 at 11:46:46AM +0200, Cédric Le Goater wrote:
> We will need this helper to translate the server number of the XIVE
> (which is a PIR) into an ICPState index number (which is a cpu index).
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

Looks correct as far as it goes, but I wonder if this would be more
generally useful as a machine level function that searches the cpu
objects by PIR, returning a pointer.  From that to the cpu_index is
then trivial.

> ---
>  hw/intc/xics_native.c | 19 +++++++++++++++++++
>  include/hw/ppc/xics.h |  1 +
>  2 files changed, 20 insertions(+)
> 
> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
> index bbdd786aeb50..6318862f53fc 100644
> --- a/hw/intc/xics_native.c
> +++ b/hw/intc/xics_native.c
> @@ -33,6 +33,25 @@
>  
>  #include <libfdt.h>
>  
> +int xics_get_cpu_index_by_pir(XICSState *xics, int pir)
> +{
> +    int i;
> +
> +    for (i = 0; i < xics->nr_servers; i++) {
> +        ICPState *icp = &xics->ss[i];
> +        if (icp->cs) {
> +            PowerPCCPU *cpu = POWERPC_CPU(icp->cs);
> +            CPUPPCState *env = &cpu->env;
> +
> +            if (env->spr_cb[SPR_PIR].default_value == pir) {
> +                return i;
> +            }
> +        }
> +    }
> +
> +    return -1;
> +}
> +
>  static void xics_native_reset(void *opaque)
>  {
>      device_reset(DEVICE(opaque));
> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
> index 911cdd5e549f..beb232e616c5 100644
> --- a/include/hw/ppc/xics.h
> +++ b/include/hw/ppc/xics.h
> @@ -214,6 +214,7 @@ void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers,
>  
>  /* Internal XICS interfaces */
>  int xics_get_cpu_index_by_dt_id(int cpu_dt_id);
> +int xics_get_cpu_index_by_pir(XICSState *xics, int pir);
>  
>  void icp_set_cppr(ICPState *icp, uint8_t cppr);
>  void icp_set_mfrr(ICPState *icp, uint8_t mfrr);

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 07/17] ppc/pnv: add XSCOM infrastructure
  2016-10-25  1:13   ` David Gibson
@ 2016-10-25  6:24     ` Cédric Le Goater
  0 siblings, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-25  6:24 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

On 10/25/2016 03:13 AM, David Gibson wrote:
> On Sat, Oct 22, 2016 at 11:46:40AM +0200, Cédric Le Goater wrote:
>> On a real POWER8 system, the Pervasive Interconnect Bus (PIB) serves
>> as a backbone to connect different units of the system. The host
>> firmware connects to the PIB through a bridge unit, the
>> Alter-Display-Unit (ADU), which gives him access to all the chiplets
>> on the PCB network (Pervasive Connect Bus), the PIB acting as the root
>> of this network.
>>
>> XSCOM (serial communication) is the interface to the sideband bus
>> provided by the POWER8 pervasive unit to read and write to chiplets
>> resources. This is needed by the host firmware, OPAL and to a lesser
>> extent, Linux. This is among others how the PCI Host bridges get
>> configured at boot or how the LPC bus is accessed.
>>
>> To represent the ADU of a real system, we introduce a specific
>> AddressSpace to dispatch XSCOM accesses to the targeted chiplets. The
>> translation of an XSCOM address into a PCB register address is
>> slightly different between the P9 and the P8. This is handled before
>> the dispatch using a 8byte alignment for all.
>>
>> To customize the device tree, a QOM InterfaceClass, PnvXScomInterface,
>> is provided with a populate() handler. The chip populates the device
>> tree by simply looping on its children. Therefore, each model needing
>> custom nodes should not forget to declare itself as a child at
>> instantiation time.
>>
>> Based on previous work done by :
>>       Benjamin Herrenschmidt <benh@kernel.crashing.org>
>>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> 
> Looks like xscom_complete() is still using current_cpu, which I've
> mentioned before.  Apart from that;

gasp. I forgot :/ Thanks for doing it.


C. 

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

* Re: [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt
  2016-10-25  5:30   ` David Gibson
@ 2016-10-25  7:58     ` Cédric Le Goater
  2016-10-26  0:05       ` David Gibson
  2016-10-25 11:00     ` Cédric Le Goater
  1 sibling, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-25  7:58 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

On 10/25/2016 07:30 AM, David Gibson wrote:
> On Sat, Oct 22, 2016 at 11:46:48AM +0200, Cédric Le Goater wrote:
>> From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>>
>> The PSI (Processor Service Interface) is one of the engines of the
>> "Bridge" unit which connects the different interfaces to the Power
>> Processor.
>>
>> This adds just enough of the PSI bridge to handle various on-chip and
>> the one external interrupt. The rest of PSI has to do with the link to
>> the IBM FSP service processor which we don't plan to emulate (not used
>> on OpenPower machines).
>>
>> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
>> [clg: - updated for qemu-2.7
>>       - changed the XSCOM interface to fit new model
>>       - QOMified the model
>>       - reworked set_xive ]
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>> ---
>>
>>  When skiboot initializes PSIHB, it fills the xives with server=0,
>>  prio=0xff, which is fine, but for some reason the last two xive
>>  settings reach the qemu MMIO region with a bogus value :
>>  
>> 	pnv_psi_mmio_write: MMIO write 0x30 val 0x000000ff00000000
>> 	pnv_psi_mmio_write: MMIO write 0x60 val 0x000000ff20000000
>> 	pnv_psi_mmio_write: MMIO write 0x68 val 0x000000ff40000000
>> 	pnv_psi_mmio_write: MMIO write 0x70 val 0x000000ff60000000
>> 	pnv_psi_mmio_write: MMIO write 0x78 val 0xffffffff80000000
>> 	pnv_psi_mmio_write: MMIO write 0x80 val 0xffffffffa0000000
>>
>>  It looks like a badly initialized temp variable in the call
>>  stack. The memory regions look fine, maybe in stdcix ? For the
>>  moment, I have added a logging error to catch non zero values as the
>>  guest should not do that in any case.
> 
> Just to clarify, I think you're saying that you believe this to be a
> skiboot (guest side) bug rather than a qemu bug.  Is that right?

Yes. I just found why. The P8_IRQ_PSI_* values in skiboot need to
be unsigned because they are shifted left of 29 bits :

	...
	#define P8_IRQ_PSI_LOCAL_ERR		4
	#define P8_IRQ_PSI_EXTERNAL		5	/* Used for UART */
	...
	out_be64(psi->regs + PSIHB_XIVR_LOCAL_ERR,
		 (0xffull << 32) | (P8_IRQ_PSI_LOCAL_ERR << 29));
	out_be64(psi->regs + PSIHB_XIVR_HOST_ERR,
		 (0xffull << 32) | (P8_IRQ_PSI_EXTERNAL << 29));


I will send a skiboot patch but we need to keep the code as it is. 

Thanks

C. 


 

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

* Re: [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper
  2016-10-25  5:36   ` David Gibson
@ 2016-10-25 10:58     ` Cédric Le Goater
  2016-10-27  3:12       ` David Gibson
  0 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-25 10:58 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

On 10/25/2016 07:36 AM, David Gibson wrote:
> On Sat, Oct 22, 2016 at 11:46:46AM +0200, Cédric Le Goater wrote:
>> We will need this helper to translate the server number of the XIVE
>> (which is a PIR) into an ICPState index number (which is a cpu index).
>>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> 
> Looks correct as far as it goes, but I wonder if this would be more
> generally useful as a machine level function that searches the cpu
> objects by PIR, returning a pointer.  From that to the cpu_index is
> then trivial.

Well I guess so. The XICSState argument reduces the scope in case of 
multichip but as this routine is used to initialize the xive registers, 
it does not need to be fast.

So you rather have, something like:

	PowerPCCPU *ppc_get_vcpu_by_pir(int pir);

similar to  :

	PowerPCCPU *ppc_get_vcpu_by_dt_id(int cpu_dt_id);


Thanks,

C. 

>> ---
>>  hw/intc/xics_native.c | 19 +++++++++++++++++++
>>  include/hw/ppc/xics.h |  1 +
>>  2 files changed, 20 insertions(+)
>>
>> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
>> index bbdd786aeb50..6318862f53fc 100644
>> --- a/hw/intc/xics_native.c
>> +++ b/hw/intc/xics_native.c
>> @@ -33,6 +33,25 @@
>>  
>>  #include <libfdt.h>
>>  
>> +int xics_get_cpu_index_by_pir(XICSState *xics, int pir)
>> +{
>> +    int i;
>> +
>> +    for (i = 0; i < xics->nr_servers; i++) {
>> +        ICPState *icp = &xics->ss[i];
>> +        if (icp->cs) {
>> +            PowerPCCPU *cpu = POWERPC_CPU(icp->cs);
>> +            CPUPPCState *env = &cpu->env;
>> +
>> +            if (env->spr_cb[SPR_PIR].default_value == pir) {
>> +                return i;
>> +            }
>> +        }
>> +    }
>> +
>> +    return -1;
>> +}
>> +
>>  static void xics_native_reset(void *opaque)
>>  {
>>      device_reset(DEVICE(opaque));
>> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
>> index 911cdd5e549f..beb232e616c5 100644
>> --- a/include/hw/ppc/xics.h
>> +++ b/include/hw/ppc/xics.h
>> @@ -214,6 +214,7 @@ void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers,
>>  
>>  /* Internal XICS interfaces */
>>  int xics_get_cpu_index_by_dt_id(int cpu_dt_id);
>> +int xics_get_cpu_index_by_pir(XICSState *xics, int pir);
>>  
>>  void icp_set_cppr(ICPState *icp, uint8_t cppr);
>>  void icp_set_mfrr(ICPState *icp, uint8_t mfrr);
> 

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

* Re: [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt
  2016-10-25  5:30   ` David Gibson
  2016-10-25  7:58     ` Cédric Le Goater
@ 2016-10-25 11:00     ` Cédric Le Goater
  1 sibling, 0 replies; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-25 11:00 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf


>> +#define PSIHB_MMIO_BAR          0x00
>> +#define PSIHB_MMIO_FSPBAR       0x08
>> +#define PSIHB_MMIO_CR           0x20
>> +#define PSIHB_MMIO_SEMR         0x28
>> +#define PSIHB_MMIO_XIVR_PSI     0x30
>> +#define PSIHB_MMIO_SCR          0x40
>> +#define PSIHB_MMIO_CCR          0x48
>> +#define PSIHB_MMIO_DMA_UPADD    0x50
>> +#define PSIHB_MMIO_IRQ_STAT     0x58
>> +#define PSIHB_MMIO_XIVR_OCC     0x60
>> +#define PSIHB_MMIO_XIVR_FSI     0x68
>> +#define PSIHB_MMIO_XIVR_LPCI2C  0x70
>> +#define PSIHB_MMIO_XIVR_LOCERR  0x78
>> +#define PSIHB_MMIO_XIVR_EXT     0x80
>> +#define PSIHB_MMIO_IRSN         0x88
>> +#define PSIHB_MMIO_MAX          0x100
>> +
>> +static const uint32_t psi_mmio_to_xscom[PSIHB_MMIO_MAX / 8] = {
> 
> AFAICT, this table lookup works out as:
> 	xscom_addr = (mmio_addr / 8) + 0xa
> 
> Which makes an actual table seem like overkill.
> 
> 
> And in fact, since you have a /8 here, and the *8 in the xscom address
> space encoding, I suspect you could just alias the same IO region into
> both SCOM and MMIO address spaces to avoid having two dispatchers.

yes. I think this is possible. I will work on it.

Thanks,

C.

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

* Re: [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt
  2016-10-25  7:58     ` Cédric Le Goater
@ 2016-10-26  0:05       ` David Gibson
  0 siblings, 0 replies; 43+ messages in thread
From: David Gibson @ 2016-10-26  0:05 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Tue, Oct 25, 2016 at 09:58:10AM +0200, Cédric Le Goater wrote:
> On 10/25/2016 07:30 AM, David Gibson wrote:
> > On Sat, Oct 22, 2016 at 11:46:48AM +0200, Cédric Le Goater wrote:
> >> From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> >>
> >> The PSI (Processor Service Interface) is one of the engines of the
> >> "Bridge" unit which connects the different interfaces to the Power
> >> Processor.
> >>
> >> This adds just enough of the PSI bridge to handle various on-chip and
> >> the one external interrupt. The rest of PSI has to do with the link to
> >> the IBM FSP service processor which we don't plan to emulate (not used
> >> on OpenPower machines).
> >>
> >> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> >> [clg: - updated for qemu-2.7
> >>       - changed the XSCOM interface to fit new model
> >>       - QOMified the model
> >>       - reworked set_xive ]
> >> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >> ---
> >>
> >>  When skiboot initializes PSIHB, it fills the xives with server=0,
> >>  prio=0xff, which is fine, but for some reason the last two xive
> >>  settings reach the qemu MMIO region with a bogus value :
> >>  
> >> 	pnv_psi_mmio_write: MMIO write 0x30 val 0x000000ff00000000
> >> 	pnv_psi_mmio_write: MMIO write 0x60 val 0x000000ff20000000
> >> 	pnv_psi_mmio_write: MMIO write 0x68 val 0x000000ff40000000
> >> 	pnv_psi_mmio_write: MMIO write 0x70 val 0x000000ff60000000
> >> 	pnv_psi_mmio_write: MMIO write 0x78 val 0xffffffff80000000
> >> 	pnv_psi_mmio_write: MMIO write 0x80 val 0xffffffffa0000000
> >>
> >>  It looks like a badly initialized temp variable in the call
> >>  stack. The memory regions look fine, maybe in stdcix ? For the
> >>  moment, I have added a logging error to catch non zero values as the
> >>  guest should not do that in any case.
> > 
> > Just to clarify, I think you're saying that you believe this to be a
> > skiboot (guest side) bug rather than a qemu bug.  Is that right?
> 
> Yes. I just found why. The P8_IRQ_PSI_* values in skiboot need to
> be unsigned because they are shifted left of 29 bits :
> 
> 	...
> 	#define P8_IRQ_PSI_LOCAL_ERR		4
> 	#define P8_IRQ_PSI_EXTERNAL		5	/* Used for UART */
> 	...
> 	out_be64(psi->regs + PSIHB_XIVR_LOCAL_ERR,
> 		 (0xffull << 32) | (P8_IRQ_PSI_LOCAL_ERR << 29));
> 	out_be64(psi->regs + PSIHB_XIVR_HOST_ERR,
> 		 (0xffull << 32) | (P8_IRQ_PSI_EXTERNAL << 29));
> 
> 
> I will send a skiboot patch but we need to keep the code as it is. 

Sure.  Seems like the hardware ignores those high bits, so we probably
should too.

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass
  2016-10-25  5:08   ` David Gibson
@ 2016-10-26  7:13     ` Cédric Le Goater
  2016-10-27  3:09       ` David Gibson
  0 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-26  7:13 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

On 10/25/2016 07:08 AM, David Gibson wrote:
> On Sat, Oct 22, 2016 at 11:46:44AM +0200, Cédric Le Goater wrote:
>> This provides access to the MMIO based Interrupt Presentation
>> Controllers (ICP) as found on a POWER8 system.
>>
>> A new XICSNative class is introduced to hold the MMIO region of the
>> ICPs. Each thread of the system has a subregion, indexed by its PIR
>> number, holding a XIVE (External Interrupt Vector Entry). This
>> provides a mean to make the link with the ICPState of the CPU.
>>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>> ---
>>
>>  Changes since v4:
>>
>>  - replaced the pir_table by memory subregions using an ICP. 
>>  - removed the find_icp() and cpu_setup() handlers which became
>>    useless with the memory regions.
>>  - removed the superfluous inits done in xics_native_initfn. This is
>>    covered in the parent class init.
>>  - took ownership of the patch.
>>
>>  default-configs/ppc64-softmmu.mak |   3 +-
>>  hw/intc/Makefile.objs             |   1 +
>>  hw/intc/xics_native.c             | 304 ++++++++++++++++++++++++++++++++++++++
>>  include/hw/ppc/pnv.h              |  19 +++
>>  include/hw/ppc/xics.h             |  24 +++
>>  5 files changed, 350 insertions(+), 1 deletion(-)
>>  create mode 100644 hw/intc/xics_native.c
>>
>> diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
>> index 67a9bcaa67fa..a22c93a48686 100644
>> --- a/default-configs/ppc64-softmmu.mak
>> +++ b/default-configs/ppc64-softmmu.mak
>> @@ -48,8 +48,9 @@ CONFIG_PLATFORM_BUS=y
>>  CONFIG_ETSEC=y
>>  CONFIG_LIBDECNUMBER=y
>>  # For pSeries
>> -CONFIG_XICS=$(CONFIG_PSERIES)
>> +CONFIG_XICS=$(or $(CONFIG_PSERIES),$(CONFIG_POWERNV))
>>  CONFIG_XICS_SPAPR=$(CONFIG_PSERIES)
>> +CONFIG_XICS_NATIVE=$(CONFIG_POWERNV)
>>  CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM))
>>  # For PReP
>>  CONFIG_MC146818RTC=y
>> diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
>> index 2f44a2da26e9..e44a29d75b32 100644
>> --- a/hw/intc/Makefile.objs
>> +++ b/hw/intc/Makefile.objs
>> @@ -34,6 +34,7 @@ obj-$(CONFIG_RASPI) += bcm2835_ic.o bcm2836_control.o
>>  obj-$(CONFIG_SH4) += sh_intc.o
>>  obj-$(CONFIG_XICS) += xics.o
>>  obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
>> +obj-$(CONFIG_XICS_NATIVE) += xics_native.o
>>  obj-$(CONFIG_XICS_KVM) += xics_kvm.o
>>  obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
>>  obj-$(CONFIG_S390_FLIC) += s390_flic.o
>> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
>> new file mode 100644
>> index 000000000000..bbdd786aeb50
>> --- /dev/null
>> +++ b/hw/intc/xics_native.c
>> @@ -0,0 +1,304 @@
>> +/*
>> + * QEMU PowerPC PowerNV machine model
>> + *
>> + * Native version of ICS/ICP
>> + *
>> + * Copyright (c) 2016, IBM Corporation.
>> + *
>> + * This library is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public
>> + * License as published by the Free Software Foundation; either
>> + * version 2 of the License, or (at your option) any later version.
>> + *
>> + * This library is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> + * Lesser General Public License for more details.
>> + *
>> + * 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 "qapi/error.h"
>> +#include "qemu-common.h"
>> +#include "cpu.h"
>> +#include "hw/hw.h"
>> +#include "qemu/log.h"
>> +#include "qapi/error.h"
>> +
>> +#include "hw/ppc/fdt.h"
>> +#include "hw/ppc/xics.h"
>> +#include "hw/ppc/pnv.h"
>> +
>> +#include <libfdt.h>
>> +
>> +static void xics_native_reset(void *opaque)
>> +{
>> +    device_reset(DEVICE(opaque));
>> +}
>> +
>> +static void xics_native_initfn(Object *obj)
>> +{
>> +    qemu_register_reset(xics_native_reset, obj);
>> +}
> 
> I think we need to investigate why the xics native is not showing up
> on the SysBus.  As a "raw" MMIO device, it really should. 

Well, it has sysbus mmio region, but it is not created with qdev_create(...) 
so it is not under sysbus and the reset does not get called. That is my
understanding of the problem.

May be we shouldn't be using a sysbus mmio region ?  

> If it was, device_reset should be called without these shenannigans.

yes.


>> +
>> +static uint64_t xics_native_read(void *opaque, hwaddr addr, unsigned width)
>> +{
>> +    ICPState *icp = opaque;
>> +    bool byte0 = (width == 1 && (addr & 0x3) == 0);
>> +    uint64_t val = 0xffffffff;
>> +
>> +    switch (addr & 0xffc) {
>> +    case 0: /* poll */
>> +        val = icp_ipoll(icp, NULL);
>> +        if (byte0) {
>> +            val >>= 24;
>> +        } else if (width != 4) {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 4: /* xirr */
>> +        if (byte0) {
>> +            val = icp_ipoll(icp, NULL) >> 24;
>> +        } else if (width == 4) {
>> +            val = icp_accept(icp);
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 12:
>> +        if (byte0) {
>> +            val = icp->mfrr;
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 16:
>> +        if (width == 4) {
>> +            val = icp->links[0];
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 20:
>> +        if (width == 4) {
>> +            val = icp->links[1];
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 24:
>> +        if (width == 4) {
>> +            val = icp->links[2];
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    default:
>> +bad_access:
>> +        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
>> +                      HWADDR_PRIx"/%d\n", addr, width);
>> +    }
>> +
>> +    return val;
>> +}
>> +
>> +static void xics_native_write(void *opaque, hwaddr addr, uint64_t val,
>> +                              unsigned width)
>> +{
>> +    ICPState *icp = opaque;
>> +    bool byte0 = (width == 1 && (addr & 0x3) == 0);
>> +
>> +    switch (addr & 0xffc) {
>> +    case 4: /* xirr */
>> +        if (byte0) {
>> +            icp_set_cppr(icp, val);
>> +        } else if (width == 4) {
>> +            icp_eoi(icp, val);
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 12:
>> +        if (byte0) {
>> +            icp_set_mfrr(icp, val);
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 16:
>> +        if (width == 4) {
>> +            icp->links[0] = val;
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 20:
>> +        if (width == 4) {
>> +            icp->links[1] = val;
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    case 24:
>> +        if (width == 4) {
>> +            icp->links[2] = val;
>> +        } else {
>> +            goto bad_access;
>> +        }
>> +        break;
>> +    default:
>> +bad_access:
>> +        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
>> +                      HWADDR_PRIx"/%d\n", addr, width);
>> +    }
>> +}
>> +
>> +static const MemoryRegionOps xics_native_ops = {
>> +    .read = xics_native_read,
>> +    .write = xics_native_write,
>> +    .valid.min_access_size = 1,
>> +    .valid.max_access_size = 4,
>> +    .impl.min_access_size = 1,
>> +    .impl.max_access_size = 4,
>> +    .endianness = DEVICE_BIG_ENDIAN,
>> +};
>> +
>> +static uint64_t xics_native_default_read(void *opaque, hwaddr addr,
>> +                                         unsigned width)
>> +{
>> +    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
>> +                  HWADDR_PRIx"/%d\n", addr, width);
>> +    return 0xffffffffffffffffull;
>> +}
>> +
>> +static void xics_native_default_write(void *opaque, hwaddr addr, uint64_t val,
>> +                                      unsigned width)
>> +{
>> +    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
>> +                  HWADDR_PRIx"/%d\n", addr, width);
>> +}
>> +
>> +static const MemoryRegionOps xics_native_default_ops = {
>> +    .read = xics_native_default_read,
>> +    .write = xics_native_default_write,
>> +    .valid.min_access_size = 1,
>> +    .valid.max_access_size = 4,
>> +    .impl.min_access_size = 1,
>> +    .impl.max_access_size = 4,
>> +    .endianness = DEVICE_BIG_ENDIAN,
>> +};
>> +
>> +static void xics_native_set_nr_servers(XICSState *xics, uint32_t nr_servers,
>> +                                       Error **errp)
>> +{
>> +    xics_set_nr_servers(xics, nr_servers, TYPE_ICP, errp);
>> +}
>> +
>> +static void xics_native_realize(DeviceState *dev, Error **errp)
>> +{
>> +    XICSState *xics = XICS_COMMON(dev);
>> +    XICSNative *xicsn = XICS_NATIVE(dev);
>> +    Error *error = NULL;
>> +    int i;
>> +
>> +    if (!xics->nr_servers) {
>> +        error_setg(errp, "Number of servers needs to be greater than 0");
>> +        return;
>> +    }
>> +
>> +    for (i = 0; i < xics->nr_servers; i++) {
>> +        object_property_set_bool(OBJECT(&xics->ss[i]), true, "realized",
>> +                                 &error);
>> +        if (error) {
>> +            error_propagate(errp, error);
>> +            return;
>> +        }
>> +    }
>> +
>> +    /*
>> +     * Initialize the container region for the ICPs and the subregion
>> +     * for each cpu. The mmapping will be done at the board level
>> +     * depending on the pir of the core.
>> +     *
>> +     * TODO: build a name with the chip id
>> +     */
>> +    memory_region_init_io(&xicsn->icp_mmio, OBJECT(dev),
>> +                          &xics_native_default_ops, xicsn, "icp-0",
>> +                          PNV_XICS_SIZE);
> 
> I don't think you should need these native ops.  I believe you can
> construct a memory region as a "pure" container, then just put the
> populated regions inside it.

It is a way to track bogus read/writes the guest shouldn't be doing
but it is not that important. I can remove it.

Thanks

C.
 
>> +    sysbus_init_mmio(SYS_BUS_DEVICE(dev), &xicsn->icp_mmio);
>> +
>> +    xicsn->icp_mmios = g_new0(MemoryRegion, xics->nr_servers);
>> +    for (i = 0; i < xics->nr_servers; i++) {
>> +        ICPState *icp = &xics->ss[i];
>> +        memory_region_init_io(&xicsn->icp_mmios[i], OBJECT(dev),
>> +                              &xics_native_ops, icp, "icp-0", 0x1000);
>> +    }
>> +}
>> +
>> +static void xics_native_class_init(ObjectClass *oc, void *data)
>> +{
>> +    DeviceClass *dc = DEVICE_CLASS(oc);
>> +    XICSStateClass *xsc = XICS_NATIVE_CLASS(oc);
>> +
>> +    dc->realize = xics_native_realize;
>> +    xsc->set_nr_servers = xics_native_set_nr_servers;
>> +}
>> +
>> +static const TypeInfo xics_native_info = {
>> +    .name          = TYPE_XICS_NATIVE,
>> +    .parent        = TYPE_XICS_COMMON,
>> +    .instance_size = sizeof(XICSNative),
>> +    .class_size = sizeof(XICSStateClass),
>> +    .class_init    = xics_native_class_init,
>> +    .instance_init = xics_native_initfn,
>> +};
>> +
>> +static void xics_native_register_types(void)
>> +{
>> +    type_register_static(&xics_native_info);
>> +}
>> +
>> +type_init(xics_native_register_types)
>> +
>> +void xics_native_populate_icp(PnvChip *chip, void *fdt, int offset,
>> +                              uint32_t pir, uint32_t count)
>> +{
>> +    uint64_t addr;
>> +    char *name;
>> +    const char compat[] = "IBM,power8-icp\0IBM,ppc-xicp";
>> +    uint32_t irange[2], i, rsize;
>> +    uint64_t *reg;
>> +
>> +    /*
>> +     * TODO: add multichip ICP BAR
>> +     */
>> +    addr = PNV_XICS_BASE | (pir << 12);
>> +
>> +    irange[0] = cpu_to_be32(pir);
>> +    irange[1] = cpu_to_be32(count);
>> +
>> +    rsize = sizeof(uint64_t) * 2 * count;
>> +    reg = g_malloc(rsize);
>> +    for (i = 0; i < count; i++) {
>> +        reg[i * 2] = cpu_to_be64(addr | ((pir + i) * 0x1000));
>> +        reg[i * 2 + 1] = cpu_to_be64(0x1000);
>> +    }
>> +
>> +    name = g_strdup_printf("interrupt-controller@%"PRIX64, addr);
>> +    offset = fdt_add_subnode(fdt, offset, name);
>> +    _FDT(offset);
>> +    g_free(name);
>> +
>> +    _FDT((fdt_setprop(fdt, offset, "compatible", compat, sizeof(compat))));
>> +    _FDT((fdt_setprop(fdt, offset, "reg", reg, rsize)));
>> +    _FDT((fdt_setprop_string(fdt, offset, "device_type",
>> +                              "PowerPC-External-Interrupt-Presentation")));
>> +    _FDT((fdt_setprop(fdt, offset, "interrupt-controller", NULL, 0)));
>> +    _FDT((fdt_setprop(fdt, offset, "ibm,interrupt-server-ranges",
>> +                       irange, sizeof(irange))));
>> +    _FDT((fdt_setprop_cell(fdt, offset, "#interrupt-cells", 1)));
>> +    _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 0)));
>> +    g_free(reg);
>> +}
>> diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h
>> index 02ac1c5f428e..c08ed1c72b17 100644
>> --- a/include/hw/ppc/pnv.h
>> +++ b/include/hw/ppc/pnv.h
>> @@ -126,4 +126,23 @@ typedef struct PnvMachineState {
>>  #define PNV_XSCOM_BASE(chip)                                            \
>>      (chip->xscom_base + ((uint64_t)(chip)->chip_id) * PNV_XSCOM_SIZE)
>>  
>> +/*
>> + * XSCOM 0x20109CA defines the ICP BAR:
>> + *
>> + * 0:29   : bits 14 to 43 of address to define 1 MB region.
>> + * 30     : 1 to enable ICP to receive loads/stores against its BAR region
>> + * 31:63  : Constant 0
>> + *
>> + * Usually defined as :
>> + *
>> + *      0xffffe00200000000 -> 0x0003ffff80000000
>> + *      0xffffe00600000000 -> 0x0003ffff80100000
>> + *      0xffffe02200000000 -> 0x0003ffff80800000
>> + *      0xffffe02600000000 -> 0x0003ffff80900000
>> + *
>> + * TODO: make a macro using the chip hw id
>> + */
>> +#define PNV_XICS_BASE         0x0003ffff80000000ull
>> +#define PNV_XICS_SIZE         0x0000000000100000ull
>> +
>>  #endif /* _PPC_PNV_H */
>> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
>> index 6e5a113332c6..911cdd5e549f 100644
>> --- a/include/hw/ppc/xics.h
>> +++ b/include/hw/ppc/xics.h
>> @@ -119,8 +119,27 @@ struct ICPState {
>>      bool cap_irq_xics_enabled;
>>  
>>      XICSState *xics;
>> +
>> +    /*
>> +     * for XICSNative (not used by Linux).
>> +     */
>> +    uint32_t links[3];
>>  };
>>  
>> +#define TYPE_XICS_NATIVE "xics-native"
>> +#define XICS_NATIVE(obj) OBJECT_CHECK(XICSNative, (obj), TYPE_XICS_NATIVE)
>> +#define XICS_NATIVE_CLASS(klass) \
>> +     OBJECT_CLASS_CHECK(XICSStateClass, (klass), TYPE_XICS_NATIVE)
>> +#define XICS_NATIVE_GET_CLASS(obj) \
>> +     OBJECT_CLASS_CHECK(XICSStateClass, (obj), TYPE_XICS_NATIVE)
>> +
>> +typedef struct XICSNative {
>> +    XICSState parent_obj;
>> +
>> +    MemoryRegion icp_mmio;
>> +    MemoryRegion *icp_mmios;
>> +} XICSNative;
>> +
>>  #define TYPE_ICS_BASE "ics-base"
>>  #define ICS_BASE(obj) OBJECT_CHECK(ICSState, (obj), TYPE_ICS_BASE)
>>  
>> @@ -209,4 +228,9 @@ void ics_set_irq_type(ICSState *ics, int srcno, bool lsi);
>>  
>>  ICSState *xics_find_source(XICSState *icp, int irq);
>>  
>> +typedef struct PnvChip PnvChip;
>> +
>> +void xics_native_populate_icp(PnvChip *chip, void *fdt, int offset,
>> +                              uint32_t base, uint32_t count);
>> +
>>  #endif /* XICS_H */
> 

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

* Re: [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass
  2016-10-26  7:13     ` Cédric Le Goater
@ 2016-10-27  3:09       ` David Gibson
  2016-10-27 17:43         ` Cédric Le Goater
  0 siblings, 1 reply; 43+ messages in thread
From: David Gibson @ 2016-10-27  3:09 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Wed, Oct 26, 2016 at 09:13:18AM +0200, Cédric Le Goater wrote:
> On 10/25/2016 07:08 AM, David Gibson wrote:
> > On Sat, Oct 22, 2016 at 11:46:44AM +0200, Cédric Le Goater wrote:
> >> This provides access to the MMIO based Interrupt Presentation
> >> Controllers (ICP) as found on a POWER8 system.
> >>
> >> A new XICSNative class is introduced to hold the MMIO region of the
> >> ICPs. Each thread of the system has a subregion, indexed by its PIR
> >> number, holding a XIVE (External Interrupt Vector Entry). This
> >> provides a mean to make the link with the ICPState of the CPU.
> >>
> >> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >> ---
> >>
> >>  Changes since v4:
> >>
> >>  - replaced the pir_table by memory subregions using an ICP. 
> >>  - removed the find_icp() and cpu_setup() handlers which became
> >>    useless with the memory regions.
> >>  - removed the superfluous inits done in xics_native_initfn. This is
> >>    covered in the parent class init.
> >>  - took ownership of the patch.
> >>
> >>  default-configs/ppc64-softmmu.mak |   3 +-
> >>  hw/intc/Makefile.objs             |   1 +
> >>  hw/intc/xics_native.c             | 304 ++++++++++++++++++++++++++++++++++++++
> >>  include/hw/ppc/pnv.h              |  19 +++
> >>  include/hw/ppc/xics.h             |  24 +++
> >>  5 files changed, 350 insertions(+), 1 deletion(-)
> >>  create mode 100644 hw/intc/xics_native.c
> >>
> >> diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
> >> index 67a9bcaa67fa..a22c93a48686 100644
> >> --- a/default-configs/ppc64-softmmu.mak
> >> +++ b/default-configs/ppc64-softmmu.mak
> >> @@ -48,8 +48,9 @@ CONFIG_PLATFORM_BUS=y
> >>  CONFIG_ETSEC=y
> >>  CONFIG_LIBDECNUMBER=y
> >>  # For pSeries
> >> -CONFIG_XICS=$(CONFIG_PSERIES)
> >> +CONFIG_XICS=$(or $(CONFIG_PSERIES),$(CONFIG_POWERNV))
> >>  CONFIG_XICS_SPAPR=$(CONFIG_PSERIES)
> >> +CONFIG_XICS_NATIVE=$(CONFIG_POWERNV)
> >>  CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM))
> >>  # For PReP
> >>  CONFIG_MC146818RTC=y
> >> diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
> >> index 2f44a2da26e9..e44a29d75b32 100644
> >> --- a/hw/intc/Makefile.objs
> >> +++ b/hw/intc/Makefile.objs
> >> @@ -34,6 +34,7 @@ obj-$(CONFIG_RASPI) += bcm2835_ic.o bcm2836_control.o
> >>  obj-$(CONFIG_SH4) += sh_intc.o
> >>  obj-$(CONFIG_XICS) += xics.o
> >>  obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
> >> +obj-$(CONFIG_XICS_NATIVE) += xics_native.o
> >>  obj-$(CONFIG_XICS_KVM) += xics_kvm.o
> >>  obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
> >>  obj-$(CONFIG_S390_FLIC) += s390_flic.o
> >> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
> >> new file mode 100644
> >> index 000000000000..bbdd786aeb50
> >> --- /dev/null
> >> +++ b/hw/intc/xics_native.c
> >> @@ -0,0 +1,304 @@
> >> +/*
> >> + * QEMU PowerPC PowerNV machine model
> >> + *
> >> + * Native version of ICS/ICP
> >> + *
> >> + * Copyright (c) 2016, IBM Corporation.
> >> + *
> >> + * This library is free software; you can redistribute it and/or
> >> + * modify it under the terms of the GNU Lesser General Public
> >> + * License as published by the Free Software Foundation; either
> >> + * version 2 of the License, or (at your option) any later version.
> >> + *
> >> + * This library is distributed in the hope that it will be useful,
> >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> >> + * Lesser General Public License for more details.
> >> + *
> >> + * 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 "qapi/error.h"
> >> +#include "qemu-common.h"
> >> +#include "cpu.h"
> >> +#include "hw/hw.h"
> >> +#include "qemu/log.h"
> >> +#include "qapi/error.h"
> >> +
> >> +#include "hw/ppc/fdt.h"
> >> +#include "hw/ppc/xics.h"
> >> +#include "hw/ppc/pnv.h"
> >> +
> >> +#include <libfdt.h>
> >> +
> >> +static void xics_native_reset(void *opaque)
> >> +{
> >> +    device_reset(DEVICE(opaque));
> >> +}
> >> +
> >> +static void xics_native_initfn(Object *obj)
> >> +{
> >> +    qemu_register_reset(xics_native_reset, obj);
> >> +}
> > 
> > I think we need to investigate why the xics native is not showing up
> > on the SysBus.  As a "raw" MMIO device, it really should. 
> 
> Well, it has sysbus mmio region, but it is not created with qdev_create(...) 
> so it is not under sysbus and the reset does not get called. That is my
> understanding of the problem.
> 
> May be we shouldn't be using a sysbus mmio region ?  

Yeah, maybe not.  We don't really fit the sysbus model well.

I do kind of wonder if the xics object should be an mmio device at
all, or if just the individual ICPs should be.  But that might make
for more trouble.

> > If it was, device_reset should be called without these shenannigans.
> 
> yes.
> 
> 
> >> +
> >> +static uint64_t xics_native_read(void *opaque, hwaddr addr, unsigned width)
> >> +{
> >> +    ICPState *icp = opaque;
> >> +    bool byte0 = (width == 1 && (addr & 0x3) == 0);
> >> +    uint64_t val = 0xffffffff;
> >> +
> >> +    switch (addr & 0xffc) {
> >> +    case 0: /* poll */
> >> +        val = icp_ipoll(icp, NULL);
> >> +        if (byte0) {
> >> +            val >>= 24;
> >> +        } else if (width != 4) {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 4: /* xirr */
> >> +        if (byte0) {
> >> +            val = icp_ipoll(icp, NULL) >> 24;
> >> +        } else if (width == 4) {
> >> +            val = icp_accept(icp);
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 12:
> >> +        if (byte0) {
> >> +            val = icp->mfrr;
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 16:
> >> +        if (width == 4) {
> >> +            val = icp->links[0];
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 20:
> >> +        if (width == 4) {
> >> +            val = icp->links[1];
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 24:
> >> +        if (width == 4) {
> >> +            val = icp->links[2];
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    default:
> >> +bad_access:
> >> +        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
> >> +                      HWADDR_PRIx"/%d\n", addr, width);
> >> +    }
> >> +
> >> +    return val;
> >> +}
> >> +
> >> +static void xics_native_write(void *opaque, hwaddr addr, uint64_t val,
> >> +                              unsigned width)
> >> +{
> >> +    ICPState *icp = opaque;
> >> +    bool byte0 = (width == 1 && (addr & 0x3) == 0);
> >> +
> >> +    switch (addr & 0xffc) {
> >> +    case 4: /* xirr */
> >> +        if (byte0) {
> >> +            icp_set_cppr(icp, val);
> >> +        } else if (width == 4) {
> >> +            icp_eoi(icp, val);
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 12:
> >> +        if (byte0) {
> >> +            icp_set_mfrr(icp, val);
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 16:
> >> +        if (width == 4) {
> >> +            icp->links[0] = val;
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 20:
> >> +        if (width == 4) {
> >> +            icp->links[1] = val;
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    case 24:
> >> +        if (width == 4) {
> >> +            icp->links[2] = val;
> >> +        } else {
> >> +            goto bad_access;
> >> +        }
> >> +        break;
> >> +    default:
> >> +bad_access:
> >> +        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
> >> +                      HWADDR_PRIx"/%d\n", addr, width);
> >> +    }
> >> +}
> >> +
> >> +static const MemoryRegionOps xics_native_ops = {
> >> +    .read = xics_native_read,
> >> +    .write = xics_native_write,
> >> +    .valid.min_access_size = 1,
> >> +    .valid.max_access_size = 4,
> >> +    .impl.min_access_size = 1,
> >> +    .impl.max_access_size = 4,
> >> +    .endianness = DEVICE_BIG_ENDIAN,
> >> +};
> >> +
> >> +static uint64_t xics_native_default_read(void *opaque, hwaddr addr,
> >> +                                         unsigned width)
> >> +{
> >> +    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
> >> +                  HWADDR_PRIx"/%d\n", addr, width);
> >> +    return 0xffffffffffffffffull;
> >> +}
> >> +
> >> +static void xics_native_default_write(void *opaque, hwaddr addr, uint64_t val,
> >> +                                      unsigned width)
> >> +{
> >> +    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
> >> +                  HWADDR_PRIx"/%d\n", addr, width);
> >> +}
> >> +
> >> +static const MemoryRegionOps xics_native_default_ops = {
> >> +    .read = xics_native_default_read,
> >> +    .write = xics_native_default_write,
> >> +    .valid.min_access_size = 1,
> >> +    .valid.max_access_size = 4,
> >> +    .impl.min_access_size = 1,
> >> +    .impl.max_access_size = 4,
> >> +    .endianness = DEVICE_BIG_ENDIAN,
> >> +};
> >> +
> >> +static void xics_native_set_nr_servers(XICSState *xics, uint32_t nr_servers,
> >> +                                       Error **errp)
> >> +{
> >> +    xics_set_nr_servers(xics, nr_servers, TYPE_ICP, errp);
> >> +}
> >> +
> >> +static void xics_native_realize(DeviceState *dev, Error **errp)
> >> +{
> >> +    XICSState *xics = XICS_COMMON(dev);
> >> +    XICSNative *xicsn = XICS_NATIVE(dev);
> >> +    Error *error = NULL;
> >> +    int i;
> >> +
> >> +    if (!xics->nr_servers) {
> >> +        error_setg(errp, "Number of servers needs to be greater than 0");
> >> +        return;
> >> +    }
> >> +
> >> +    for (i = 0; i < xics->nr_servers; i++) {
> >> +        object_property_set_bool(OBJECT(&xics->ss[i]), true, "realized",
> >> +                                 &error);
> >> +        if (error) {
> >> +            error_propagate(errp, error);
> >> +            return;
> >> +        }
> >> +    }
> >> +
> >> +    /*
> >> +     * Initialize the container region for the ICPs and the subregion
> >> +     * for each cpu. The mmapping will be done at the board level
> >> +     * depending on the pir of the core.
> >> +     *
> >> +     * TODO: build a name with the chip id
> >> +     */
> >> +    memory_region_init_io(&xicsn->icp_mmio, OBJECT(dev),
> >> +                          &xics_native_default_ops, xicsn, "icp-0",
> >> +                          PNV_XICS_SIZE);
> > 
> > I don't think you should need these native ops.  I believe you can
> > construct a memory region as a "pure" container, then just put the
> > populated regions inside it.
> 
> It is a way to track bogus read/writes the guest shouldn't be doing
> but it is not that important. I can remove it.

Right.  I don't recall exactly what will happen if you don't populate
this at all, but I think you should eventually arrive at the global
fallback handler which should give you a similar effect.

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper
  2016-10-25 10:58     ` Cédric Le Goater
@ 2016-10-27  3:12       ` David Gibson
  2016-10-27 18:05         ` Cédric Le Goater
  0 siblings, 1 reply; 43+ messages in thread
From: David Gibson @ 2016-10-27  3:12 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Tue, Oct 25, 2016 at 12:58:11PM +0200, Cédric Le Goater wrote:
> On 10/25/2016 07:36 AM, David Gibson wrote:
> > On Sat, Oct 22, 2016 at 11:46:46AM +0200, Cédric Le Goater wrote:
> >> We will need this helper to translate the server number of the XIVE
> >> (which is a PIR) into an ICPState index number (which is a cpu index).
> >>
> >> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> > 
> > Looks correct as far as it goes, but I wonder if this would be more
> > generally useful as a machine level function that searches the cpu
> > objects by PIR, returning a pointer.  From that to the cpu_index is
> > then trivial.
> 
> Well I guess so. The XICSState argument reduces the scope in case of 
> multichip but as this routine is used to initialize the xive registers, 
> it does not need to be fast.

Ahh.. I was thinking of the top-level xics object as global, rather
than per-chip.

Except.. does having it per-chip work anyway?  The server numbers are
globally unique, aren't they?  What happens if you put a server number
from one chip as the target for an ICE on another chip?

The xics object is a bit weird, in that it doesn't represent a real
device in a sense, but is rather something to co-ordinate global
addressing between ICS and ICP units.  Well, I suppose in that sense
it represent the interrupt propagation fabric.

> So you rather have, something like:
> 
> 	PowerPCCPU *ppc_get_vcpu_by_pir(int pir);
> 
> similar to  :
> 
> 	PowerPCCPU *ppc_get_vcpu_by_dt_id(int cpu_dt_id);
> 
> 
> Thanks,
> 
> C. 
> 
> >> ---
> >>  hw/intc/xics_native.c | 19 +++++++++++++++++++
> >>  include/hw/ppc/xics.h |  1 +
> >>  2 files changed, 20 insertions(+)
> >>
> >> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
> >> index bbdd786aeb50..6318862f53fc 100644
> >> --- a/hw/intc/xics_native.c
> >> +++ b/hw/intc/xics_native.c
> >> @@ -33,6 +33,25 @@
> >>  
> >>  #include <libfdt.h>
> >>  
> >> +int xics_get_cpu_index_by_pir(XICSState *xics, int pir)
> >> +{
> >> +    int i;
> >> +
> >> +    for (i = 0; i < xics->nr_servers; i++) {
> >> +        ICPState *icp = &xics->ss[i];
> >> +        if (icp->cs) {
> >> +            PowerPCCPU *cpu = POWERPC_CPU(icp->cs);
> >> +            CPUPPCState *env = &cpu->env;
> >> +
> >> +            if (env->spr_cb[SPR_PIR].default_value == pir) {
> >> +                return i;
> >> +            }
> >> +        }
> >> +    }
> >> +
> >> +    return -1;
> >> +}
> >> +
> >>  static void xics_native_reset(void *opaque)
> >>  {
> >>      device_reset(DEVICE(opaque));
> >> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
> >> index 911cdd5e549f..beb232e616c5 100644
> >> --- a/include/hw/ppc/xics.h
> >> +++ b/include/hw/ppc/xics.h
> >> @@ -214,6 +214,7 @@ void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers,
> >>  
> >>  /* Internal XICS interfaces */
> >>  int xics_get_cpu_index_by_dt_id(int cpu_dt_id);
> >> +int xics_get_cpu_index_by_pir(XICSState *xics, int pir);
> >>  
> >>  void icp_set_cppr(ICPState *icp, uint8_t cppr);
> >>  void icp_set_mfrr(ICPState *icp, uint8_t mfrr);
> > 
> 

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass
  2016-10-27  3:09       ` David Gibson
@ 2016-10-27 17:43         ` Cédric Le Goater
  2016-10-28  1:00           ` David Gibson
  0 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-27 17:43 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

On 10/27/2016 05:09 AM, David Gibson wrote:
> On Wed, Oct 26, 2016 at 09:13:18AM +0200, Cédric Le Goater wrote:
>> On 10/25/2016 07:08 AM, David Gibson wrote:
>>> On Sat, Oct 22, 2016 at 11:46:44AM +0200, Cédric Le Goater wrote:
>>>> This provides access to the MMIO based Interrupt Presentation
>>>> Controllers (ICP) as found on a POWER8 system.
>>>>
>>>> A new XICSNative class is introduced to hold the MMIO region of the
>>>> ICPs. Each thread of the system has a subregion, indexed by its PIR
>>>> number, holding a XIVE (External Interrupt Vector Entry). This
>>>> provides a mean to make the link with the ICPState of the CPU.
>>>>
>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>>> ---
>>>>
>>>>  Changes since v4:
>>>>
>>>>  - replaced the pir_able by memory subregions using an ICP. 
>>>>  - removed the find_icp() and cpu_setup() handlers which became
>>>>    useless with the memory regions.
>>>>  - removed the superfluous inits done in xics_native_initfn. This is
>>>>    covered in the parent class init.
>>>>  - took ownership of the patch.
>>>>
>>>>  default-configs/ppc64-softmmu.mak |   3 +-
>>>>  hw/intc/Makefile.objs             |   1 +
>>>>  hw/intc/xics_native.c             | 304 ++++++++++++++++++++++++++++++++++++++
>>>>  include/hw/ppc/pnv.h              |  19 +++
>>>>  include/hw/ppc/xics.h             |  24 +++
>>>>  5 files changed, 350 insertions(+), 1 deletion(-)
>>>>  create mode 100644 hw/intc/xics_native.c
>>>>
>>>> diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
>>>> index 67a9bcaa67fa..a22c93a48686 100644
>>>> --- a/default-configs/ppc64-softmmu.mak
>>>> +++ b/default-configs/ppc64-softmmu.mak
>>>> @@ -48,8 +48,9 @@ CONFIG_PLATFORM_BUS=y
>>>>  CONFIG_ETSEC=y
>>>>  CONFIG_LIBDECNUMBER=y
>>>>  # For pSeries
>>>> -CONFIG_XICS=$(CONFIG_PSERIES)
>>>> +CONFIG_XICS=$(or $(CONFIG_PSERIES),$(CONFIG_POWERNV))
>>>>  CONFIG_XICS_SPAPR=$(CONFIG_PSERIES)
>>>> +CONFIG_XICS_NATIVE=$(CONFIG_POWERNV)
>>>>  CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM))
>>>>  # For PReP
>>>>  CONFIG_MC146818RTC=y
>>>> diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
>>>> index 2f44a2da26e9..e44a29d75b32 100644
>>>> --- a/hw/intc/Makefile.objs
>>>> +++ b/hw/intc/Makefile.objs
>>>> @@ -34,6 +34,7 @@ obj-$(CONFIG_RASPI) += bcm2835_ic.o bcm2836_control.o
>>>>  obj-$(CONFIG_SH4) += sh_intc.o
>>>>  obj-$(CONFIG_XICS) += xics.o
>>>>  obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
>>>> +obj-$(CONFIG_XICS_NATIVE) += xics_native.o
>>>>  obj-$(CONFIG_XICS_KVM) += xics_kvm.o
>>>>  obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
>>>>  obj-$(CONFIG_S390_FLIC) += s390_flic.o
>>>> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
>>>> new file mode 100644
>>>> index 000000000000..bbdd786aeb50
>>>> --- /dev/null
>>>> +++ b/hw/intc/xics_native.c
>>>> @@ -0,0 +1,304 @@
>>>> +/*
>>>> + * QEMU PowerPC PowerNV machine model
>>>> + *
>>>> + * Native version of ICS/ICP
>>>> + *
>>>> + * Copyright (c) 2016, IBM Corporation.
>>>> + *
>>>> + * This library is free software; you can redistribute it and/or
>>>> + * modify it under the terms of the GNU Lesser General Public
>>>> + * License as published by the Free Software Foundation; either
>>>> + * version 2 of the License, or (at your option) any later version.
>>>> + *
>>>> + * This library is distributed in the hope that it will be useful,
>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>>>> + * Lesser General Public License for more details.
>>>> + *
>>>> + * 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 "qapi/error.h"
>>>> +#include "qemu-common.h"
>>>> +#include "cpu.h"
>>>> +#include "hw/hw.h"
>>>> +#include "qemu/log.h"
>>>> +#include "qapi/error.h"
>>>> +
>>>> +#include "hw/ppc/fdt.h"
>>>> +#include "hw/ppc/xics.h"
>>>> +#include "hw/ppc/pnv.h"
>>>> +
>>>> +#include <libfdt.h>
>>>> +
>>>> +static void xics_native_reset(void *opaque)
>>>> +{
>>>> +    device_reset(DEVICE(opaque));
>>>> +}
>>>> +
>>>> +static void xics_native_initfn(Object *obj)
>>>> +{
>>>> +    qemu_register_reset(xics_native_reset, obj);
>>>> +}
>>>
>>> I think we need to investigate why the xics native is not showing up
>>> on the SysBus.  As a "raw" MMIO device, it really should. 
>>
>> Well, it has sysbus mmio region, but it is not created with qdev_create(...) 
>> so it is not under sysbus and the reset does not get called. That is my
>> understanding of the problem.
>>
>> May be we shouldn't be using a sysbus mmio region ?  
> 
> Yeah, maybe not.  We don't really fit the sysbus model well.
> 
> I do kind of wonder if the xics object should be an mmio device at
> all, or if just the individual ICPs should be.  But that might make
> for more trouble.

A cleanup brings another :) It is true that xics native does not
have any controls. It is just a container to hold the array of ICPs 
and so each of these could well be a child object of PnvCore. Well,
of a PnvThread but we don't have that today. 

I am going to move the container region to PnvChip to start with and 
if I can the ICP regions to PnvCore. When we realize the PnvCore, we 
have the xics, but I need to find a way to grab the ICPState from it. 
I might need to use the cpu_index for that or could I change 
xics_cpu_setup() to return an 'ICPState *' ? 

I would prefer the ICP to be a PnvCore/Thread child object but that
is too early I think.

So if that comes well together, we will get rid of XICSNative and we 
will use a XICSState for its ICP array. 

>>> If it was, device_reset should be called without these shenannigans.
>>
>> yes.
>>
>>
>>>> +
>>>> +static uint64_t xics_native_read(void *opaque, hwaddr addr, unsigned width)
>>>> +{
>>>> +    ICPState *icp = opaque;
>>>> +    bool byte0 = (width == 1 && (addr & 0x3) == 0);
>>>> +    uint64_t val = 0xffffffff;
>>>> +
>>>> +    switch (addr & 0xffc) {
>>>> +    case 0: /* poll */
>>>> +        val = icp_ipoll(icp, NULL);
>>>> +        if (byte0) {
>>>> +            val >>= 24;
>>>> +        } else if (width != 4) {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 4: /* xirr */
>>>> +        if (byte0) {
>>>> +            val = icp_ipoll(icp, NULL) >> 24;
>>>> +        } else if (width == 4) {
>>>> +            val = icp_accept(icp);
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 12:
>>>> +        if (byte0) {
>>>> +            val = icp->mfrr;
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 16:
>>>> +        if (width == 4) {
>>>> +            val = icp->links[0];
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 20:
>>>> +        if (width == 4) {
>>>> +            val = icp->links[1];
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 24:
>>>> +        if (width == 4) {
>>>> +            val = icp->links[2];
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    default:
>>>> +bad_access:
>>>> +        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
>>>> +                      HWADDR_PRIx"/%d\n", addr, width);
>>>> +    }
>>>> +
>>>> +    return val;
>>>> +}
>>>> +
>>>> +static void xics_native_write(void *opaque, hwaddr addr, uint64_t val,
>>>> +                              unsigned width)
>>>> +{
>>>> +    ICPState *icp = opaque;
>>>> +    bool byte0 = (width == 1 && (addr & 0x3) == 0);
>>>> +
>>>> +    switch (addr & 0xffc) {
>>>> +    case 4: /* xirr */
>>>> +        if (byte0) {
>>>> +            icp_set_cppr(icp, val);
>>>> +        } else if (width == 4) {
>>>> +            icp_eoi(icp, val);
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 12:
>>>> +        if (byte0) {
>>>> +            icp_set_mfrr(icp, val);
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 16:
>>>> +        if (width == 4) {
>>>> +            icp->links[0] = val;
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 20:
>>>> +        if (width == 4) {
>>>> +            icp->links[1] = val;
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    case 24:
>>>> +        if (width == 4) {
>>>> +            icp->links[2] = val;
>>>> +        } else {
>>>> +            goto bad_access;
>>>> +        }
>>>> +        break;
>>>> +    default:
>>>> +bad_access:
>>>> +        qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
>>>> +                      HWADDR_PRIx"/%d\n", addr, width);
>>>> +    }
>>>> +}
>>>> +
>>>> +static const MemoryRegionOps xics_native_ops = {
>>>> +    .read = xics_native_read,
>>>> +    .write = xics_native_write,
>>>> +    .valid.min_access_size = 1,
>>>> +    .valid.max_access_size = 4,
>>>> +    .impl.min_access_size = 1,
>>>> +    .impl.max_access_size = 4,
>>>> +    .endianness = DEVICE_BIG_ENDIAN,
>>>> +};
>>>> +
>>>> +static uint64_t xics_native_default_read(void *opaque, hwaddr addr,
>>>> +                                         unsigned width)
>>>> +{
>>>> +    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
>>>> +                  HWADDR_PRIx"/%d\n", addr, width);
>>>> +    return 0xffffffffffffffffull;
>>>> +}
>>>> +
>>>> +static void xics_native_default_write(void *opaque, hwaddr addr, uint64_t val,
>>>> +                                      unsigned width)
>>>> +{
>>>> +    qemu_log_mask(LOG_GUEST_ERROR, "XICS: Bad ICP access 0x%"
>>>> +                  HWADDR_PRIx"/%d\n", addr, width);
>>>> +}
>>>> +
>>>> +static const MemoryRegionOps xics_native_default_ops = {
>>>> +    .read = xics_native_default_read,
>>>> +    .write = xics_native_default_write,
>>>> +    .valid.min_access_size = 1,
>>>> +    .valid.max_access_size = 4,
>>>> +    .impl.min_access_size = 1,
>>>> +    .impl.max_access_size = 4,
>>>> +    .endianness = DEVICE_BIG_ENDIAN,
>>>> +};
>>>> +
>>>> +static void xics_native_set_nr_servers(XICSState *xics, uint32_t nr_servers,
>>>> +                                       Error **errp)
>>>> +{
>>>> +    xics_set_nr_servers(xics, nr_servers, TYPE_ICP, errp);
>>>> +}
>>>> +
>>>> +static void xics_native_realize(DeviceState *dev, Error **errp)
>>>> +{
>>>> +    XICSState *xics = XICS_COMMON(dev);
>>>> +    XICSNative *xicsn = XICS_NATIVE(dev);
>>>> +    Error *error = NULL;
>>>> +    int i;
>>>> +
>>>> +    if (!xics->nr_servers) {
>>>> +        error_setg(errp, "Number of servers needs to be greater than 0");
>>>> +        return;
>>>> +    }
>>>> +
>>>> +    for (i = 0; i < xics->nr_servers; i++) {
>>>> +        object_property_set_bool(OBJECT(&xics->ss[i]), true, "realized",
>>>> +                                 &error);
>>>> +        if (error) {
>>>> +            error_propagate(errp, error);
>>>> +            return;
>>>> +        }
>>>> +    }
>>>> +
>>>> +    /*
>>>> +     * Initialize the container region for the ICPs and the subregion
>>>> +     * for each cpu. The mmapping will be done at the board level
>>>> +     * depending on the pir of the core.
>>>> +     *
>>>> +     * TODO: build a name with the chip id
>>>> +     */
>>>> +    memory_region_init_io(&xicsn->icp_mmio, OBJECT(dev),
>>>> +                          &xics_native_default_ops, xicsn, "icp-0",
>>>> +                          PNV_XICS_SIZE);
>>>
>>> I don't think you should need these native ops.  I believe you can
>>> construct a memory region as a "pure" container, then just put the
>>> populated regions inside it.
>>
>> It is a way to track bogus read/writes the guest shouldn't be doing
>> but it is not that important. I can remove it.
> 
> Right.  I don't recall exactly what will happen if you don't populate
> this at all, but I think you should eventually arrive at the global
> fallback handler which should give you a similar effect.
> 

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

* Re: [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper
  2016-10-27  3:12       ` David Gibson
@ 2016-10-27 18:05         ` Cédric Le Goater
  2016-10-28  1:03           ` David Gibson
  0 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-10-27 18:05 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

On 10/27/2016 05:12 AM, David Gibson wrote:
> On Tue, Oct 25, 2016 at 12:58:11PM +0200, Cédric Le Goater wrote:
>> On 10/25/2016 07:36 AM, David Gibson wrote:
>>> On Sat, Oct 22, 2016 at 11:46:46AM +0200, Cédric Le Goater wrote:
>>>> We will need this helper to translate the server number of the XIVE
>>>> (which is a PIR) into an ICPState index number (which is a cpu index).
>>>>
>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>>
>>> Looks correct as far as it goes, but I wonder if this would be more
>>> generally useful as a machine level function that searches the cpu
>>> objects by PIR, returning a pointer.  From that to the cpu_index is
>>> then trivial.
>>
>> Well I guess so. The XICSState argument reduces the scope in case of 
>> multichip but as this routine is used to initialize the xive registers, 
>> it does not need to be fast.
> 
> Ahh.. I was thinking of the top-level xics object as global, rather
> than per-chip.

well, the ICP MMIO region address is linked to the chip but that is all
for the moment.
 
> Except.. does having it per-chip work anyway? The server numbers are 
> globally unique, aren't they?  

yes.
 
> What happens if you put a server number from one chip as the target 
> for an ICE on another chip?

we have the chip number, so we could route ? I haven't gone that far
in the modeling though. It might be overly complex to do for the purpose.

> The xics object is a bit weird, in that it doesn't represent a real
> device in a sense, but is rather something to co-ordinate global
> addressing between ICS and ICP units.  Well, I suppose in that sense
> it represent the interrupt propagation fabric.

yes. See my other email. I think we can get rid of it and simply use
a XICSState which links together the ICPs and the ICS of the system. 
but, let's keep it at the chip level for the moment, it is correct, 
and see if we need to move it upwards when we work on multichip. 

Thanks,

C.
 
>> So you rather have, something like:
>>
>> 	PowerPCCPU *ppc_get_vcpu_by_pir(int pir);
>>
>> similar to  :
>>
>> 	PowerPCCPU *ppc_get_vcpu_by_dt_id(int cpu_dt_id);
>>
>>
>> Thanks,
>>
>> C. 
>>
>>>> ---
>>>>  hw/intc/xics_native.c | 19 +++++++++++++++++++
>>>>  include/hw/ppc/xics.h |  1 +
>>>>  2 files changed, 20 insertions(+)
>>>>
>>>> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
>>>> index bbdd786aeb50..6318862f53fc 100644
>>>> --- a/hw/intc/xics_native.c
>>>> +++ b/hw/intc/xics_native.c
>>>> @@ -33,6 +33,25 @@
>>>>  
>>>>  #include <libfdt.h>
>>>>  
>>>> +int xics_get_cpu_index_by_pir(XICSState *xics, int pir)
>>>> +{
>>>> +    int i;
>>>> +
>>>> +    for (i = 0; i < xics->nr_servers; i++) {
>>>> +        ICPState *icp = &xics->ss[i];
>>>> +        if (icp->cs) {
>>>> +            PowerPCCPU *cpu = POWERPC_CPU(icp->cs);
>>>> +            CPUPPCState *env = &cpu->env;
>>>> +
>>>> +            if (env->spr_cb[SPR_PIR].default_value == pir) {
>>>> +                return i;
>>>> +            }
>>>> +        }
>>>> +    }
>>>> +
>>>> +    return -1;
>>>> +}
>>>> +
>>>>  static void xics_native_reset(void *opaque)
>>>>  {
>>>>      device_reset(DEVICE(opaque));
>>>> diff --git a/include/hw/ppc/xics.h b/include/hw/ppc/xics.h
>>>> index 911cdd5e549f..beb232e616c5 100644
>>>> --- a/include/hw/ppc/xics.h
>>>> +++ b/include/hw/ppc/xics.h
>>>> @@ -214,6 +214,7 @@ void xics_set_nr_servers(XICSState *xics, uint32_t nr_servers,
>>>>  
>>>>  /* Internal XICS interfaces */
>>>>  int xics_get_cpu_index_by_dt_id(int cpu_dt_id);
>>>> +int xics_get_cpu_index_by_pir(XICSState *xics, int pir);
>>>>  
>>>>  void icp_set_cppr(ICPState *icp, uint8_t cppr);
>>>>  void icp_set_mfrr(ICPState *icp, uint8_t mfrr);
>>>
>>
> 

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

* Re: [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass
  2016-10-27 17:43         ` Cédric Le Goater
@ 2016-10-28  1:00           ` David Gibson
  2016-11-02 10:48             ` Cédric Le Goater
  0 siblings, 1 reply; 43+ messages in thread
From: David Gibson @ 2016-10-28  1:00 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Thu, Oct 27, 2016 at 07:43:10PM +0200, Cédric Le Goater wrote:
> On 10/27/2016 05:09 AM, David Gibson wrote:
> > On Wed, Oct 26, 2016 at 09:13:18AM +0200, Cédric Le Goater wrote:
> >> On 10/25/2016 07:08 AM, David Gibson wrote:
> >>> On Sat, Oct 22, 2016 at 11:46:44AM +0200, Cédric Le Goater wrote:
> >>>> This provides access to the MMIO based Interrupt Presentation
> >>>> Controllers (ICP) as found on a POWER8 system.
> >>>>
> >>>> A new XICSNative class is introduced to hold the MMIO region of the
> >>>> ICPs. Each thread of the system has a subregion, indexed by its PIR
> >>>> number, holding a XIVE (External Interrupt Vector Entry). This
> >>>> provides a mean to make the link with the ICPState of the CPU.
> >>>>
> >>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >>>> ---
> >>>>
> >>>>  Changes since v4:
> >>>>
> >>>>  - replaced the pir_able by memory subregions using an ICP. 
> >>>>  - removed the find_icp() and cpu_setup() handlers which became
> >>>>    useless with the memory regions.
> >>>>  - removed the superfluous inits done in xics_native_initfn. This is
> >>>>    covered in the parent class init.
> >>>>  - took ownership of the patch.
> >>>>
> >>>>  default-configs/ppc64-softmmu.mak |   3 +-
> >>>>  hw/intc/Makefile.objs             |   1 +
> >>>>  hw/intc/xics_native.c             | 304 ++++++++++++++++++++++++++++++++++++++
> >>>>  include/hw/ppc/pnv.h              |  19 +++
> >>>>  include/hw/ppc/xics.h             |  24 +++
> >>>>  5 files changed, 350 insertions(+), 1 deletion(-)
> >>>>  create mode 100644 hw/intc/xics_native.c
> >>>>
> >>>> diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
> >>>> index 67a9bcaa67fa..a22c93a48686 100644
> >>>> --- a/default-configs/ppc64-softmmu.mak
> >>>> +++ b/default-configs/ppc64-softmmu.mak
> >>>> @@ -48,8 +48,9 @@ CONFIG_PLATFORM_BUS=y
> >>>>  CONFIG_ETSEC=y
> >>>>  CONFIG_LIBDECNUMBER=y
> >>>>  # For pSeries
> >>>> -CONFIG_XICS=$(CONFIG_PSERIES)
> >>>> +CONFIG_XICS=$(or $(CONFIG_PSERIES),$(CONFIG_POWERNV))
> >>>>  CONFIG_XICS_SPAPR=$(CONFIG_PSERIES)
> >>>> +CONFIG_XICS_NATIVE=$(CONFIG_POWERNV)
> >>>>  CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM))
> >>>>  # For PReP
> >>>>  CONFIG_MC146818RTC=y
> >>>> diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
> >>>> index 2f44a2da26e9..e44a29d75b32 100644
> >>>> --- a/hw/intc/Makefile.objs
> >>>> +++ b/hw/intc/Makefile.objs
> >>>> @@ -34,6 +34,7 @@ obj-$(CONFIG_RASPI) += bcm2835_ic.o bcm2836_control.o
> >>>>  obj-$(CONFIG_SH4) += sh_intc.o
> >>>>  obj-$(CONFIG_XICS) += xics.o
> >>>>  obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
> >>>> +obj-$(CONFIG_XICS_NATIVE) += xics_native.o
> >>>>  obj-$(CONFIG_XICS_KVM) += xics_kvm.o
> >>>>  obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
> >>>>  obj-$(CONFIG_S390_FLIC) += s390_flic.o
> >>>> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
> >>>> new file mode 100644
> >>>> index 000000000000..bbdd786aeb50
> >>>> --- /dev/null
> >>>> +++ b/hw/intc/xics_native.c
> >>>> @@ -0,0 +1,304 @@
> >>>> +/*
> >>>> + * QEMU PowerPC PowerNV machine model
> >>>> + *
> >>>> + * Native version of ICS/ICP
> >>>> + *
> >>>> + * Copyright (c) 2016, IBM Corporation.
> >>>> + *
> >>>> + * This library is free software; you can redistribute it and/or
> >>>> + * modify it under the terms of the GNU Lesser General Public
> >>>> + * License as published by the Free Software Foundation; either
> >>>> + * version 2 of the License, or (at your option) any later version.
> >>>> + *
> >>>> + * This library is distributed in the hope that it will be useful,
> >>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> >>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> >>>> + * Lesser General Public License for more details.
> >>>> + *
> >>>> + * 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 "qapi/error.h"
> >>>> +#include "qemu-common.h"
> >>>> +#include "cpu.h"
> >>>> +#include "hw/hw.h"
> >>>> +#include "qemu/log.h"
> >>>> +#include "qapi/error.h"
> >>>> +
> >>>> +#include "hw/ppc/fdt.h"
> >>>> +#include "hw/ppc/xics.h"
> >>>> +#include "hw/ppc/pnv.h"
> >>>> +
> >>>> +#include <libfdt.h>
> >>>> +
> >>>> +static void xics_native_reset(void *opaque)
> >>>> +{
> >>>> +    device_reset(DEVICE(opaque));
> >>>> +}
> >>>> +
> >>>> +static void xics_native_initfn(Object *obj)
> >>>> +{
> >>>> +    qemu_register_reset(xics_native_reset, obj);
> >>>> +}
> >>>
> >>> I think we need to investigate why the xics native is not showing up
> >>> on the SysBus.  As a "raw" MMIO device, it really should. 
> >>
> >> Well, it has sysbus mmio region, but it is not created with qdev_create(...) 
> >> so it is not under sysbus and the reset does not get called. That is my
> >> understanding of the problem.
> >>
> >> May be we shouldn't be using a sysbus mmio region ?  
> > 
> > Yeah, maybe not.  We don't really fit the sysbus model well.
> > 
> > I do kind of wonder if the xics object should be an mmio device at
> > all, or if just the individual ICPs should be.  But that might make
> > for more trouble.
> 
> A cleanup brings another :) It is true that xics native does not
> have any controls. It is just a container to hold the array of ICPs 
> and so each of these could well be a child object of PnvCore. Well,
> of a PnvThread but we don't have that today. 

Ok.

> I am going to move the container region to PnvChip to start with and 
> if I can the ICP regions to PnvCore. When we realize the PnvCore, we 
> have the xics, but I need to find a way to grab the ICPState from it. 
> I might need to use the cpu_index for that or could I change 
> xics_cpu_setup() to return an 'ICPState *' ? 
> 
> I would prefer the ICP to be a PnvCore/Thread child object but that
> is too early I think.

Right, that makes sense.

> So if that comes well together, we will get rid of XICSNative and we 
> will use a XICSState for its ICP array.

So, I just had a thought about this that I think might work, though it
would require cleaning up the existing stuff in spapr before extending
for powernv:

Abolish the (overall) XICS as a fully realized object, and instead
make it a QOM interface, which is implemented by the machine.  ICPs
and ICSes remain real devices, which (as now) would have a link back
to the XICS interface object.

The XICS interface would provide server-number-to-ICP-pointer and
irq-number-to-ICS-pointer callbacks.  That puts the "fabric" logic -
how the IPCs and ICSes find each other back in the machine, which I
think is where it belongs.  Obviously we could still provide
xics_system_init() or similar helpers to make it easier for the
machines to implement the xics interface.

The overall XICS has no migrated state, which means that change
shouldn't fundamentally break things.  There might be issues with the
qom paths of ICS or ICP changing, we'd have to check that.


-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper
  2016-10-27 18:05         ` Cédric Le Goater
@ 2016-10-28  1:03           ` David Gibson
  0 siblings, 0 replies; 43+ messages in thread
From: David Gibson @ 2016-10-28  1:03 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Thu, Oct 27, 2016 at 08:05:02PM +0200, Cédric Le Goater wrote:
> On 10/27/2016 05:12 AM, David Gibson wrote:
> > On Tue, Oct 25, 2016 at 12:58:11PM +0200, Cédric Le Goater wrote:
> >> On 10/25/2016 07:36 AM, David Gibson wrote:
> >>> On Sat, Oct 22, 2016 at 11:46:46AM +0200, Cédric Le Goater wrote:
> >>>> We will need this helper to translate the server number of the XIVE
> >>>> (which is a PIR) into an ICPState index number (which is a cpu index).
> >>>>
> >>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >>>
> >>> Looks correct as far as it goes, but I wonder if this would be more
> >>> generally useful as a machine level function that searches the cpu
> >>> objects by PIR, returning a pointer.  From that to the cpu_index is
> >>> then trivial.
> >>
> >> Well I guess so. The XICSState argument reduces the scope in case of 
> >> multichip but as this routine is used to initialize the xive registers, 
> >> it does not need to be fast.
> > 
> > Ahh.. I was thinking of the top-level xics object as global, rather
> > than per-chip.
> 
> well, the ICP MMIO region address is linked to the chip but that is all
> for the moment.
>  
> > Except.. does having it per-chip work anyway? The server numbers are 
> > globally unique, aren't they?  
> 
> yes.
>  
> > What happens if you put a server number from one chip as the target 
> > for an ICE on another chip?
> 
> we have the chip number, so we could route ? I haven't gone that far
> in the modeling though. It might be overly complex to do for the purpose.

Right.. yeah, trying to route between XICS objects sounds like a
nightmare.  Really the whole notion of the XICS overall object is that
it represents the whole irq propagation fabric - so it knows about all
the ICPS and all the ICSes and handles the routing between them.

So making the XICS object per-chip I think is a mistake which will
just lead to pain down the track.  See my other mail for a new
suggestion on how to handle this.

> > The xics object is a bit weird, in that it doesn't represent a real
> > device in a sense, but is rather something to co-ordinate global
> > addressing between ICS and ICP units.  Well, I suppose in that sense
> > it represent the interrupt propagation fabric.
> 
> yes. See my other email. I think we can get rid of it and simply use
> a XICSState which links together the ICPs and the ICS of the system. 
> but, let's keep it at the chip level for the moment, it is correct, 
> and see if we need to move it upwards when we work on multichip.

No, I disagree.  I think moving the XICs up a layer will only create
pain later for little benefit now.

-- 
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: 819 bytes --]

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

* Re: [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass
  2016-10-28  1:00           ` David Gibson
@ 2016-11-02 10:48             ` Cédric Le Goater
  2016-11-08  1:44               ` David Gibson
  0 siblings, 1 reply; 43+ messages in thread
From: Cédric Le Goater @ 2016-11-02 10:48 UTC (permalink / raw)
  To: David Gibson; +Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

On 10/28/2016 03:00 AM, David Gibson wrote:
> On Thu, Oct 27, 2016 at 07:43:10PM +0200, Cédric Le Goater wrote:
>> On 10/27/2016 05:09 AM, David Gibson wrote:
>>> On Wed, Oct 26, 2016 at 09:13:18AM +0200, Cédric Le Goater wrote:
>>>> On 10/25/2016 07:08 AM, David Gibson wrote:
>>>>> On Sat, Oct 22, 2016 at 11:46:44AM +0200, Cédric Le Goater wrote:
>>>>>> This provides access to the MMIO based Interrupt Presentation
>>>>>> Controllers (ICP) as found on a POWER8 system.
>>>>>>
>>>>>> A new XICSNative class is introduced to hold the MMIO region of the
>>>>>> ICPs. Each thread of the system has a subregion, indexed by its PIR
>>>>>> number, holding a XIVE (External Interrupt Vector Entry). This
>>>>>> provides a mean to make the link with the ICPState of the CPU.
>>>>>>
>>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>>>>> ---
>>>>>>
>>>>>>  Changes since v4:
>>>>>>
>>>>>>  - replaced the pir_able by memory subregions using an ICP. 
>>>>>>  - removed the find_icp() and cpu_setup() handlers which became
>>>>>>    useless with the memory regions.
>>>>>>  - removed the superfluous inits done in xics_native_initfn. This is
>>>>>>    covered in the parent class init.
>>>>>>  - took ownership of the patch.
>>>>>>
>>>>>>  default-configs/ppc64-softmmu.mak |   3 +-
>>>>>>  hw/intc/Makefile.objs             |   1 +
>>>>>>  hw/intc/xics_native.c             | 304 ++++++++++++++++++++++++++++++++++++++
>>>>>>  include/hw/ppc/pnv.h              |  19 +++
>>>>>>  include/hw/ppc/xics.h             |  24 +++
>>>>>>  5 files changed, 350 insertions(+), 1 deletion(-)
>>>>>>  create mode 100644 hw/intc/xics_native.c
>>>>>>
>>>>>> diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
>>>>>> index 67a9bcaa67fa..a22c93a48686 100644
>>>>>> --- a/default-configs/ppc64-softmmu.mak
>>>>>> +++ b/default-configs/ppc64-softmmu.mak
>>>>>> @@ -48,8 +48,9 @@ CONFIG_PLATFORM_BUS=y
>>>>>>  CONFIG_ETSEC=y
>>>>>>  CONFIG_LIBDECNUMBER=y
>>>>>>  # For pSeries
>>>>>> -CONFIG_XICS=$(CONFIG_PSERIES)
>>>>>> +CONFIG_XICS=$(or $(CONFIG_PSERIES),$(CONFIG_POWERNV))
>>>>>>  CONFIG_XICS_SPAPR=$(CONFIG_PSERIES)
>>>>>> +CONFIG_XICS_NATIVE=$(CONFIG_POWERNV)
>>>>>>  CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM))
>>>>>>  # For PReP
>>>>>>  CONFIG_MC146818RTC=y
>>>>>> diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
>>>>>> index 2f44a2da26e9..e44a29d75b32 100644
>>>>>> --- a/hw/intc/Makefile.objs
>>>>>> +++ b/hw/intc/Makefile.objs
>>>>>> @@ -34,6 +34,7 @@ obj-$(CONFIG_RASPI) += bcm2835_ic.o bcm2836_control.o
>>>>>>  obj-$(CONFIG_SH4) += sh_intc.o
>>>>>>  obj-$(CONFIG_XICS) += xics.o
>>>>>>  obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
>>>>>> +obj-$(CONFIG_XICS_NATIVE) += xics_native.o
>>>>>>  obj-$(CONFIG_XICS_KVM) += xics_kvm.o
>>>>>>  obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
>>>>>>  obj-$(CONFIG_S390_FLIC) += s390_flic.o
>>>>>> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
>>>>>> new file mode 100644
>>>>>> index 000000000000..bbdd786aeb50
>>>>>> --- /dev/null
>>>>>> +++ b/hw/intc/xics_native.c
>>>>>> @@ -0,0 +1,304 @@
>>>>>> +/*
>>>>>> + * QEMU PowerPC PowerNV machine model
>>>>>> + *
>>>>>> + * Native version of ICS/ICP
>>>>>> + *
>>>>>> + * Copyright (c) 2016, IBM Corporation.
>>>>>> + *
>>>>>> + * This library is free software; you can redistribute it and/or
>>>>>> + * modify it under the terms of the GNU Lesser General Public
>>>>>> + * License as published by the Free Software Foundation; either
>>>>>> + * version 2 of the License, or (at your option) any later version.
>>>>>> + *
>>>>>> + * This library is distributed in the hope that it will be useful,
>>>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>>>>>> + * Lesser General Public License for more details.
>>>>>> + *
>>>>>> + * 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 "qapi/error.h"
>>>>>> +#include "qemu-common.h"
>>>>>> +#include "cpu.h"
>>>>>> +#include "hw/hw.h"
>>>>>> +#include "qemu/log.h"
>>>>>> +#include "qapi/error.h"
>>>>>> +
>>>>>> +#include "hw/ppc/fdt.h"
>>>>>> +#include "hw/ppc/xics.h"
>>>>>> +#include "hw/ppc/pnv.h"
>>>>>> +
>>>>>> +#include <libfdt.h>
>>>>>> +
>>>>>> +static void xics_native_reset(void *opaque)
>>>>>> +{
>>>>>> +    device_reset(DEVICE(opaque));
>>>>>> +}
>>>>>> +
>>>>>> +static void xics_native_initfn(Object *obj)
>>>>>> +{
>>>>>> +    qemu_register_reset(xics_native_reset, obj);
>>>>>> +}
>>>>>
>>>>> I think we need to investigate why the xics native is not showing up
>>>>> on the SysBus.  As a "raw" MMIO device, it really should. 
>>>>
>>>> Well, it has sysbus mmio region, but it is not created with qdev_create(...) 
>>>> so it is not under sysbus and the reset does not get called. That is my
>>>> understanding of the problem.
>>>>
>>>> May be we shouldn't be using a sysbus mmio region ?  
>>>
>>> Yeah, maybe not.  We don't really fit the sysbus model well.
>>>
>>> I do kind of wonder if the xics object should be an mmio device at
>>> all, or if just the individual ICPs should be.  But that might make
>>> for more trouble.
>>
>> A cleanup brings another :) It is true that xics native does not
>> have any controls. It is just a container to hold the array of ICPs 
>> and so each of these could well be a child object of PnvCore. Well,
>> of a PnvThread but we don't have that today. 
> 
> Ok.
> 
>> I am going to move the container region to PnvChip to start with and 
>> if I can the ICP regions to PnvCore. When we realize the PnvCore, we 
>> have the xics, but I need to find a way to grab the ICPState from it. 
>> I might need to use the cpu_index for that or could I change 
>> xics_cpu_setup() to return an 'ICPState *' ? 
>
>> I would prefer the ICP to be a PnvCore/Thread child object but that
>> is too early I think.
> 
> Right, that makes sense.
> 
>> So if that comes well together, we will get rid of XICSNative and we 
>> will use a XICSState for its ICP array.
> 
> So, I just had a thought about this that I think might work, though it
> would require cleaning up the existing stuff in spapr before extending
> for powernv:
> 
> Abolish the (overall) XICS as a fully realized object, and instead
> make it a QOM interface, which is implemented by the machine.  ICPs
> and ICSes remain real devices, which (as now) would have a link back
> to the XICS interface object.

OK. I will take a look at that for 2.9. 

Here is the current status for pnv. XICSNative is gone. The ICP container 
region is under the chip and the ICP-per-thread subregions under PnvCore.
The machine uses a XICS_COMMON object to hold the array of ICPs and the 
list of ICS. The result is much better but I had to modify a few things 
in xics to be able to instantiate a XICS_COMMON object : 

 * add a new ops to XICSStateClass : 

     void (*realize)(DeviceState *dev, Error **errp)

   to clean up xics_kvm_realize() and xics_spapr_realize() which are
   doing the same thing. That's a good cleanup going in the direction 
   you are talking about. So maybe I could send for 2.8

 * add a xics_common_set_nr_servers() routine to create the ICPs when 
   a XICS_COMMON object is instantiated. That is more a work around. 
   That business around the "nr_irqs" and "nr_servers" properties is 
   confusing, we should clean it up.

So if you think this is worth 2.8, I can send a couple of patches. Else
I can start by some xics cleanups and aim 2.9

> The XICS interface would provide server-number-to-ICP-pointer and
> irq-number-to-ICS-pointer callbacks.  That puts the "fabric" logic -
> how the IPCs and ICSes find each other back in the machine, which I
> think is where it belongs.  Obviously we could still provide
> xics_system_init() or similar helpers to make it easier for the
> machines to implement the xics interface.

Rough comments and questions :

* ICS :

  They don't belong to XICS but we do need to maintain a list as we 
  have a few loops on the ICSs. Should we maintain the list under the 
  machine ? 

* ICP :

  The server-number-to-ICP-pointer handler should cover most of the 
  needs. If we can use the Core object to hold the ICP, that would 
  be even better. It whould greatly simplify cpu_setup() which is 
  here just for KVM_CAP_IRQ_XICS and the list of cpus would provide
  the array.
 
  ICP reset would be handled at the Core level

  xics_common_pic_print_info() would be a machine handler.

  I am not sure what to do with ics_simple_post_load().

C. 


> The overall XICS has no migrated state, which means that change
> shouldn't fundamentally break things. There might be issues with the
> qom paths of ICS or ICP changing, we'd have to check that.
> 
> 

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

* Re: [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass
  2016-11-02 10:48             ` Cédric Le Goater
@ 2016-11-08  1:44               ` David Gibson
  0 siblings, 0 replies; 43+ messages in thread
From: David Gibson @ 2016-11-08  1:44 UTC (permalink / raw)
  To: Cédric Le Goater
  Cc: qemu-ppc, Benjamin Herrenschmidt, qemu-devel, Alexander Graf

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

On Wed, Nov 02, 2016 at 11:48:51AM +0100, Cédric Le Goater wrote:
> On 10/28/2016 03:00 AM, David Gibson wrote:
> > On Thu, Oct 27, 2016 at 07:43:10PM +0200, Cédric Le Goater wrote:
> >> On 10/27/2016 05:09 AM, David Gibson wrote:
> >>> On Wed, Oct 26, 2016 at 09:13:18AM +0200, Cédric Le Goater wrote:
> >>>> On 10/25/2016 07:08 AM, David Gibson wrote:
> >>>>> On Sat, Oct 22, 2016 at 11:46:44AM +0200, Cédric Le Goater wrote:
> >>>>>> This provides access to the MMIO based Interrupt Presentation
> >>>>>> Controllers (ICP) as found on a POWER8 system.
> >>>>>>
> >>>>>> A new XICSNative class is introduced to hold the MMIO region of the
> >>>>>> ICPs. Each thread of the system has a subregion, indexed by its PIR
> >>>>>> number, holding a XIVE (External Interrupt Vector Entry). This
> >>>>>> provides a mean to make the link with the ICPState of the CPU.
> >>>>>>
> >>>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >>>>>> ---
> >>>>>>
> >>>>>>  Changes since v4:
> >>>>>>
> >>>>>>  - replaced the pir_able by memory subregions using an ICP. 
> >>>>>>  - removed the find_icp() and cpu_setup() handlers which became
> >>>>>>    useless with the memory regions.
> >>>>>>  - removed the superfluous inits done in xics_native_initfn. This is
> >>>>>>    covered in the parent class init.
> >>>>>>  - took ownership of the patch.
> >>>>>>
> >>>>>>  default-configs/ppc64-softmmu.mak |   3 +-
> >>>>>>  hw/intc/Makefile.objs             |   1 +
> >>>>>>  hw/intc/xics_native.c             | 304 ++++++++++++++++++++++++++++++++++++++
> >>>>>>  include/hw/ppc/pnv.h              |  19 +++
> >>>>>>  include/hw/ppc/xics.h             |  24 +++
> >>>>>>  5 files changed, 350 insertions(+), 1 deletion(-)
> >>>>>>  create mode 100644 hw/intc/xics_native.c
> >>>>>>
> >>>>>> diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak
> >>>>>> index 67a9bcaa67fa..a22c93a48686 100644
> >>>>>> --- a/default-configs/ppc64-softmmu.mak
> >>>>>> +++ b/default-configs/ppc64-softmmu.mak
> >>>>>> @@ -48,8 +48,9 @@ CONFIG_PLATFORM_BUS=y
> >>>>>>  CONFIG_ETSEC=y
> >>>>>>  CONFIG_LIBDECNUMBER=y
> >>>>>>  # For pSeries
> >>>>>> -CONFIG_XICS=$(CONFIG_PSERIES)
> >>>>>> +CONFIG_XICS=$(or $(CONFIG_PSERIES),$(CONFIG_POWERNV))
> >>>>>>  CONFIG_XICS_SPAPR=$(CONFIG_PSERIES)
> >>>>>> +CONFIG_XICS_NATIVE=$(CONFIG_POWERNV)
> >>>>>>  CONFIG_XICS_KVM=$(and $(CONFIG_PSERIES),$(CONFIG_KVM))
> >>>>>>  # For PReP
> >>>>>>  CONFIG_MC146818RTC=y
> >>>>>> diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs
> >>>>>> index 2f44a2da26e9..e44a29d75b32 100644
> >>>>>> --- a/hw/intc/Makefile.objs
> >>>>>> +++ b/hw/intc/Makefile.objs
> >>>>>> @@ -34,6 +34,7 @@ obj-$(CONFIG_RASPI) += bcm2835_ic.o bcm2836_control.o
> >>>>>>  obj-$(CONFIG_SH4) += sh_intc.o
> >>>>>>  obj-$(CONFIG_XICS) += xics.o
> >>>>>>  obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o
> >>>>>> +obj-$(CONFIG_XICS_NATIVE) += xics_native.o
> >>>>>>  obj-$(CONFIG_XICS_KVM) += xics_kvm.o
> >>>>>>  obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o
> >>>>>>  obj-$(CONFIG_S390_FLIC) += s390_flic.o
> >>>>>> diff --git a/hw/intc/xics_native.c b/hw/intc/xics_native.c
> >>>>>> new file mode 100644
> >>>>>> index 000000000000..bbdd786aeb50
> >>>>>> --- /dev/null
> >>>>>> +++ b/hw/intc/xics_native.c
> >>>>>> @@ -0,0 +1,304 @@
> >>>>>> +/*
> >>>>>> + * QEMU PowerPC PowerNV machine model
> >>>>>> + *
> >>>>>> + * Native version of ICS/ICP
> >>>>>> + *
> >>>>>> + * Copyright (c) 2016, IBM Corporation.
> >>>>>> + *
> >>>>>> + * This library is free software; you can redistribute it and/or
> >>>>>> + * modify it under the terms of the GNU Lesser General Public
> >>>>>> + * License as published by the Free Software Foundation; either
> >>>>>> + * version 2 of the License, or (at your option) any later version.
> >>>>>> + *
> >>>>>> + * This library is distributed in the hope that it will be useful,
> >>>>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> >>>>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> >>>>>> + * Lesser General Public License for more details.
> >>>>>> + *
> >>>>>> + * 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 "qapi/error.h"
> >>>>>> +#include "qemu-common.h"
> >>>>>> +#include "cpu.h"
> >>>>>> +#include "hw/hw.h"
> >>>>>> +#include "qemu/log.h"
> >>>>>> +#include "qapi/error.h"
> >>>>>> +
> >>>>>> +#include "hw/ppc/fdt.h"
> >>>>>> +#include "hw/ppc/xics.h"
> >>>>>> +#include "hw/ppc/pnv.h"
> >>>>>> +
> >>>>>> +#include <libfdt.h>
> >>>>>> +
> >>>>>> +static void xics_native_reset(void *opaque)
> >>>>>> +{
> >>>>>> +    device_reset(DEVICE(opaque));
> >>>>>> +}
> >>>>>> +
> >>>>>> +static void xics_native_initfn(Object *obj)
> >>>>>> +{
> >>>>>> +    qemu_register_reset(xics_native_reset, obj);
> >>>>>> +}
> >>>>>
> >>>>> I think we need to investigate why the xics native is not showing up
> >>>>> on the SysBus.  As a "raw" MMIO device, it really should. 
> >>>>
> >>>> Well, it has sysbus mmio region, but it is not created with qdev_create(...) 
> >>>> so it is not under sysbus and the reset does not get called. That is my
> >>>> understanding of the problem.
> >>>>
> >>>> May be we shouldn't be using a sysbus mmio region ?  
> >>>
> >>> Yeah, maybe not.  We don't really fit the sysbus model well.
> >>>
> >>> I do kind of wonder if the xics object should be an mmio device at
> >>> all, or if just the individual ICPs should be.  But that might make
> >>> for more trouble.
> >>
> >> A cleanup brings another :) It is true that xics native does not
> >> have any controls. It is just a container to hold the array of ICPs 
> >> and so each of these could well be a child object of PnvCore. Well,
> >> of a PnvThread but we don't have that today. 
> > 
> > Ok.
> > 
> >> I am going to move the container region to PnvChip to start with and 
> >> if I can the ICP regions to PnvCore. When we realize the PnvCore, we 
> >> have the xics, but I need to find a way to grab the ICPState from it. 
> >> I might need to use the cpu_index for that or could I change 
> >> xics_cpu_setup() to return an 'ICPState *' ? 
> >
> >> I would prefer the ICP to be a PnvCore/Thread child object but that
> >> is too early I think.
> > 
> > Right, that makes sense.
> > 
> >> So if that comes well together, we will get rid of XICSNative and we 
> >> will use a XICSState for its ICP array.
> > 
> > So, I just had a thought about this that I think might work, though it
> > would require cleaning up the existing stuff in spapr before extending
> > for powernv:
> > 
> > Abolish the (overall) XICS as a fully realized object, and instead
> > make it a QOM interface, which is implemented by the machine.  ICPs
> > and ICSes remain real devices, which (as now) would have a link back
> > to the XICS interface object.
> 
> OK. I will take a look at that for 2.9. 
> 
> Here is the current status for pnv. XICSNative is gone. The ICP container 
> region is under the chip and the ICP-per-thread subregions under PnvCore.
> The machine uses a XICS_COMMON object to hold the array of ICPs and the 
> list of ICS. The result is much better but I had to modify a few things 
> in xics to be able to instantiate a XICS_COMMON object : 
> 
>  * add a new ops to XICSStateClass : 
> 
>      void (*realize)(DeviceState *dev, Error **errp)
> 
>    to clean up xics_kvm_realize() and xics_spapr_realize() which are
>    doing the same thing. That's a good cleanup going in the direction 
>    you are talking about. So maybe I could send for 2.8

Sounds likely.  Please send it and I'll give it a look and see if I
think it's suitable as a late addition to 2.8.

>  * add a xics_common_set_nr_servers() routine to create the ICPs when 
>    a XICS_COMMON object is instantiated. That is more a work around. 
>    That business around the "nr_irqs" and "nr_servers" properties is 
>    confusing, we should clean it up.

Yeah, it's a bit clunky.  The nr_irqs really only makes sense for the
spapr case where there's a single ICS.

> So if you think this is worth 2.8, I can send a couple of patches. Else
> I can start by some xics cleanups and aim 2.9

I think it's at least worth a look to see how invasive it is.

> > The XICS interface would provide server-number-to-ICP-pointer and
> > irq-number-to-ICS-pointer callbacks.  That puts the "fabric" logic -
> > how the IPCs and ICSes find each other back in the machine, which I
> > think is where it belongs.  Obviously we could still provide
> > xics_system_init() or similar helpers to make it easier for the
> > machines to implement the xics interface.
> 
> Rough comments and questions :
> 
> * ICS :
> 
>   They don't belong to XICS but we do need to maintain a list as we 
>   have a few loops on the ICSs. Should we maintain the list under the 
>   machine ?

So, the XICS interface type would need some method to traverse all the
ICSes.  It would be up to the XICS interface implementor (the machine
in this, and probably all, cases) to decide how it does that.  spapr
would just go to the single known ICS instance.  powernv could
maintain a list, or alternatively it could use its existing list of
chips to find all the possible ICS instances.

> * ICP :
> 
>   The server-number-to-ICP-pointer handler should cover most of the 
>   needs. If we can use the Core object to hold the ICP, that would 
>   be even better. It whould greatly simplify cpu_setup() which is 
>   here just for KVM_CAP_IRQ_XICS and the list of cpus would provide
>   the array.

Sure.  I don't think whether the ICP is in the core or the chip has
much bearing on the XICS interface, only what the machine would need
to do exactly to locate the right ICP instance.  The machine knows how
the PIRs are allocated, so it should be able to parse the server
number and work out both chip and core.

>   ICP reset would be handled at the Core level
> 
>   xics_common_pic_print_info() would be a machine handler.

Actually, I think you have a couple of options there.  IIRC the
interrupt stats provider interface works so that the monitor commands
will iterate through all objects supporting the interface.

So, you could make the machine respond and give a global view of the
XICS, presumably using a helper function from the XICS code.
Alternatively, you could make each ICS support the interface and
provide a view of just its piece of the interrupt state (I think it's
the ICSes not the ICPs that are relevant for this information, but I
could be wrong).

>   I am not sure what to do with ics_simple_post_load().

So, ics_simple_post_load() is actually already a bit broken.  It
relies on the fact that the ICP state is restored before the ICS
state, without really enforcing that.  There was a bug somewhat
related to this recently with interrupts being lost across migration
sometimes - the interrupt controller variables were restored, but we
didn't correctly recalculate the state of the output line to interrupt
the CPU.

This callback is essentially about restoring some cached state across
the whole XICS subsystem from the state within the individual ICS and
ICP devices - in particular the state of the (logical) output lines.
So really, this would belong better in the machine - obviously we'd
want a helper in the xics code that any machine implementing the XICS
interface could use.

> 
> C. 
> 
> 
> > The overall XICS has no migrated state, which means that change
> > shouldn't fundamentally break things. There might be issues with the
> > qom paths of ICS or ICP changing, we'd have to check that.
> > 
> > 
> 

-- 
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: 819 bytes --]

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

end of thread, other threads:[~2016-11-08  2:20 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-22  9:46 [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 01/17] ppc: add skiboot firmware for the pnv platform Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 02/17] ppc/pnv: add skeleton PowerNV platform Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 03/17] ppc/pnv: add a PnvChip object Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 04/17] ppc/pnv: add a core mask to PnvChip Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 05/17] ppc/pnv: add a PIR handler " Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 06/17] ppc/pnv: add a PnvCore object Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 07/17] ppc/pnv: add XSCOM infrastructure Cédric Le Goater
2016-10-25  1:13   ` David Gibson
2016-10-25  6:24     ` Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 08/17] ppc/pnv: add XSCOM handlers to PnvCore Cédric Le Goater
2016-10-25  1:14   ` David Gibson
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 09/17] ppc/pnv: add a LPC controller Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 10/17] ppc/pnv: add a ISA bus Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 11/17] ppc/xics: Add "native" XICS subclass Cédric Le Goater
2016-10-25  5:08   ` David Gibson
2016-10-26  7:13     ` Cédric Le Goater
2016-10-27  3:09       ` David Gibson
2016-10-27 17:43         ` Cédric Le Goater
2016-10-28  1:00           ` David Gibson
2016-11-02 10:48             ` Cédric Le Goater
2016-11-08  1:44               ` David Gibson
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 12/17] ppc/pnv: add a XICS native to each PowerNV chip Cédric Le Goater
2016-10-24 15:42   ` Cédric Le Goater
2016-10-25  5:11     ` David Gibson
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 13/17] ppc/xics: add a xics_get_cpu_index_by_pir helper Cédric Le Goater
2016-10-25  5:36   ` David Gibson
2016-10-25 10:58     ` Cédric Le Goater
2016-10-27  3:12       ` David Gibson
2016-10-27 18:05         ` Cédric Le Goater
2016-10-28  1:03           ` David Gibson
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 14/17] ppc/xics: introduce a helper to insert a new ics Cédric Le Goater
2016-10-25  5:12   ` David Gibson
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 15/17] ppc/pnv: Add cut down PSI bridge model and hookup external interrupt Cédric Le Goater
2016-10-25  5:30   ` David Gibson
2016-10-25  7:58     ` Cédric Le Goater
2016-10-26  0:05       ` David Gibson
2016-10-25 11:00     ` Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 16/17] ppc/pnv: Add OCC model stub with interrupt support Cédric Le Goater
2016-10-22  9:46 ` [Qemu-devel] [PATCH v5 17/17] ppc/pnv: Add Naples chip support for LPC interrupts Cédric Le Goater
2016-10-25  5:35   ` David Gibson
2016-10-24  5:33 ` [Qemu-devel] [PATCH v5 00/17] ppc/pnv: booting the kernel and reaching user space David Gibson
2016-10-25  1:38   ` 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.