From patchwork Tue Mar 12 08:52:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849033 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EA36113B5 for ; Tue, 12 Mar 2019 10:20:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D6FEF293C8 for ; Tue, 12 Mar 2019 10:20:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C6524294FC; Tue, 12 Mar 2019 10:20:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 31D29293C8 for ; Tue, 12 Mar 2019 10:20:03 +0000 (UTC) Received: from localhost ([127.0.0.1]:48969 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eVu-0008GT-R7 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:20:02 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52411) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUI-0007ay-Ug for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dF7-0003nr-1D for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:58:38 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37812) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dF6-0003n9-Pn; Tue, 12 Mar 2019 04:58:36 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 85E273092643; Tue, 12 Mar 2019 08:53:24 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2B07B60162; Tue, 12 Mar 2019 08:53:21 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:15 +1100 Message-Id: <20190312085316.8054-2-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Tue, 12 Mar 2019 08:53:24 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 01/62] vfio/spapr: Fix indirect levels calculation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Alexey Kardashevskiy The current code assumes that we can address more bits on a PCI bus for DMA than we really can but there is no way knowing the actual limit. This makes a better guess for the number of levels and if the kernel fails to allocate that, this increases the level numbers till succeeded or reached the 64bit limit. This adds levels to the trace point. This may cause the kernel to warn about failed allocation: [65122.837458] Failed to allocate a TCE memory, level shift=28 which might happen if MAX_ORDER is not large enough as it can vary: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/powerpc/Kconfig?h=v5.0-rc2#n727 Signed-off-by: Alexey Kardashevskiy Message-Id: <20190227085149.38596-3-aik@ozlabs.ru> Signed-off-by: David Gibson --- hw/vfio/spapr.c | 43 +++++++++++++++++++++++++++++++++---------- hw/vfio/trace-events | 2 +- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c index becf71a3fc..88437a79e6 100644 --- a/hw/vfio/spapr.c +++ b/hw/vfio/spapr.c @@ -143,10 +143,10 @@ int vfio_spapr_create_window(VFIOContainer *container, MemoryRegionSection *section, hwaddr *pgsize) { - int ret; + int ret = 0; IOMMUMemoryRegion *iommu_mr = IOMMU_MEMORY_REGION(section->mr); uint64_t pagesize = memory_region_iommu_get_min_page_size(iommu_mr); - unsigned entries, pages; + unsigned entries, bits_total, bits_per_level, max_levels; struct vfio_iommu_spapr_tce_create create = { .argsz = sizeof(create) }; long systempagesize = qemu_getrampagesize(); @@ -176,16 +176,38 @@ int vfio_spapr_create_window(VFIOContainer *container, create.window_size = int128_get64(section->size); create.page_shift = ctz64(pagesize); /* - * SPAPR host supports multilevel TCE tables, there is some - * heuristic to decide how many levels we want for our table: - * 0..64 = 1; 65..4096 = 2; 4097..262144 = 3; 262145.. = 4 + * SPAPR host supports multilevel TCE tables. We try to guess optimal + * levels number and if this fails (for example due to the host memory + * fragmentation), we increase levels. The DMA address structure is: + * rrrrrrrr rxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx iiiiiiii + * where: + * r = reserved (bits >= 55 are reserved in the existing hardware) + * i = IOMMU page offset (64K in this example) + * x = bits to index a TCE which can be split to equal chunks to index + * within the level. + * The aim is to split "x" to smaller possible number of levels. */ entries = create.window_size >> create.page_shift; - pages = MAX((entries * sizeof(uint64_t)) / getpagesize(), 1); - pages = MAX(pow2ceil(pages), 1); /* Round up */ - create.levels = ctz64(pages) / 6 + 1; - - ret = ioctl(container->fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create); + /* bits_total is number of "x" needed */ + bits_total = ctz64(entries * sizeof(uint64_t)); + /* + * bits_per_level is a safe guess of how much we can allocate per level: + * 8 is the current minimum for CONFIG_FORCE_MAX_ZONEORDER and MAX_ORDER + * is usually bigger than that. + * Below we look at getpagesize() as TCEs are allocated from system pages. + */ + bits_per_level = ctz64(getpagesize()) + 8; + create.levels = bits_total / bits_per_level; + if (bits_total % bits_per_level) { + ++create.levels; + } + max_levels = (64 - create.page_shift) / ctz64(getpagesize()); + for ( ; create.levels <= max_levels; ++create.levels) { + ret = ioctl(container->fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create); + if (!ret) { + break; + } + } if (ret) { error_report("Failed to create a window, ret = %d (%m)", ret); return -errno; @@ -200,6 +222,7 @@ int vfio_spapr_create_window(VFIOContainer *container, return -EINVAL; } trace_vfio_spapr_create_window(create.page_shift, + create.levels, create.window_size, create.start_addr); *pgsize = pagesize; diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events index ed2f333ad7..cf1e886818 100644 --- a/hw/vfio/trace-events +++ b/hw/vfio/trace-events @@ -129,6 +129,6 @@ vfio_prereg_listener_region_add_skip(uint64_t start, uint64_t end) "0x%"PRIx64" vfio_prereg_listener_region_del_skip(uint64_t start, uint64_t end) "0x%"PRIx64" - 0x%"PRIx64 vfio_prereg_register(uint64_t va, uint64_t size, int ret) "va=0x%"PRIx64" size=0x%"PRIx64" ret=%d" vfio_prereg_unregister(uint64_t va, uint64_t size, int ret) "va=0x%"PRIx64" size=0x%"PRIx64" ret=%d" -vfio_spapr_create_window(int ps, uint64_t ws, uint64_t off) "pageshift=0x%x winsize=0x%"PRIx64" offset=0x%"PRIx64 +vfio_spapr_create_window(int ps, unsigned int levels, uint64_t ws, uint64_t off) "pageshift=0x%x levels=%u winsize=0x%"PRIx64" offset=0x%"PRIx64 vfio_spapr_remove_window(uint64_t off) "offset=0x%"PRIx64 vfio_spapr_group_attach(int groupfd, int tablefd) "Attached groupfd %d to liobn fd %d" From patchwork Tue Mar 12 08:52:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849035 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8292E13B5 for ; Tue, 12 Mar 2019 10:21:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 739552959F for ; Tue, 12 Mar 2019 10:21:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 71DDC295BD; Tue, 12 Mar 2019 10:21:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 19DF22959F for ; Tue, 12 Mar 2019 10:21:17 +0000 (UTC) Received: from localhost ([127.0.0.1]:49012 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eX3-0000vC-UM for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:21:14 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52365) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dU4-0007RC-QI for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dGx-0005lM-VX for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:00:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59062) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dGx-0005ky-QF; Tue, 12 Mar 2019 05:00:31 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 54ABB356E4; Tue, 12 Mar 2019 08:53:29 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1C3B56013E; Tue, 12 Mar 2019 08:53:24 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:16 +1100 Message-Id: <20190312085316.8054-3-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 12 Mar 2019 08:53:29 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 02/62] vfio/spapr: Rename local systempagesize variable X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Alexey Kardashevskiy The "systempagesize" name suggests that it is the host system page size while it is the smallest page size of memory backing the guest RAM so let's rename it to stop confusion. This should cause no behavioral change. Signed-off-by: Alexey Kardashevskiy Message-Id: <20190227085149.38596-4-aik@ozlabs.ru> Signed-off-by: David Gibson --- hw/vfio/spapr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/vfio/spapr.c b/hw/vfio/spapr.c index 88437a79e6..57fe758e54 100644 --- a/hw/vfio/spapr.c +++ b/hw/vfio/spapr.c @@ -148,14 +148,14 @@ int vfio_spapr_create_window(VFIOContainer *container, uint64_t pagesize = memory_region_iommu_get_min_page_size(iommu_mr); unsigned entries, bits_total, bits_per_level, max_levels; struct vfio_iommu_spapr_tce_create create = { .argsz = sizeof(create) }; - long systempagesize = qemu_getrampagesize(); + long rampagesize = qemu_getrampagesize(); /* * The host might not support the guest supported IOMMU page size, * so we will use smaller physical IOMMU pages to back them. */ - if (pagesize > systempagesize) { - pagesize = systempagesize; + if (pagesize > rampagesize) { + pagesize = rampagesize; } pagesize = 1ULL << (63 - clz64(container->pgsizes & (pagesize | (pagesize - 1)))); From patchwork Tue Mar 12 08:52:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848983 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AD89613B5 for ; Tue, 12 Mar 2019 09:59:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9B47B285E8 for ; Tue, 12 Mar 2019 09:59:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8DEF2286B6; Tue, 12 Mar 2019 09:59:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 30E1E285E8 for ; Tue, 12 Mar 2019 09:59:05 +0000 (UTC) Received: from localhost ([127.0.0.1]:48618 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eBc-0006tI-Fd for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:59:04 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUE-0008KY-Kc for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dG1-0004SJ-A9 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:59:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35350) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dG1-0004R5-40; Tue, 12 Mar 2019 04:59:33 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3BD1830832D1; Tue, 12 Mar 2019 08:53:32 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id D9DEE6013E; Tue, 12 Mar 2019 08:53:29 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:17 +1100 Message-Id: <20190312085316.8054-4-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Tue, 12 Mar 2019 08:53:32 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 03/62] spapr: Simulate CAS for qtest X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Greg Kurz The RTAS event hotplug code for machine types 2.8 and newer depends on the CAS negotiated ov5 in order to work properly. However, there's no CAS when running under qtest. There has been a tentative to trick the code by faking the OV5_HP_EVT bit, but it turned out to break other assumptions in the code and the change got reverted. Go for a more general approach and simulate a CAS when running under qtest. For simplicity, this pseudo CAS simple simulates the case where the guest supports the same features as the machine. It is done at reset time, just before we reset the DRCs, which could potentially exercise the unplug code. This allows to test unplug on spapr with both older and newer machine types. Suggested-by: Michael Roth Signed-off-by: Greg Kurz Message-Id: <155146875704.147873.10563808578795890265.stgit@bahia.lan> Tested-by: Michael Roth Reviewed-by: Michael Roth Signed-off-by: David Gibson --- hw/ppc/spapr.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 9e01226e18..f7d527464c 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -29,6 +29,7 @@ #include "qapi/visitor.h" #include "sysemu/sysemu.h" #include "sysemu/numa.h" +#include "sysemu/qtest.h" #include "hw/hw.h" #include "qemu/log.h" #include "hw/fw-path-provider.h" @@ -1711,6 +1712,16 @@ static void spapr_machine_reset(void) */ spapr_irq_reset(spapr, &error_fatal); + /* + * There is no CAS under qtest. Simulate one to please the code that + * depends on spapr->ov5_cas. This is especially needed to test device + * unplug, so we do that before resetting the DRCs. + */ + if (qtest_enabled()) { + spapr_ovec_cleanup(spapr->ov5_cas); + spapr->ov5_cas = spapr_ovec_clone(spapr->ov5); + } + /* DRC reset may cause a device to be unplugged. This will cause troubles * if this device is used by another device (eg, a running vhost backend * will crash QEMU if the DIMM holding the vring goes away). To avoid such From patchwork Tue Mar 12 08:52:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849047 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C85B41669 for ; Tue, 12 Mar 2019 10:30:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B8D5028ADA for ; Tue, 12 Mar 2019 10:30:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B703B295E8; Tue, 12 Mar 2019 10:30:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 629C5295DE for ; Tue, 12 Mar 2019 10:30:35 +0000 (UTC) Received: from localhost ([127.0.0.1]:49185 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eg6-0007he-6F for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:30:34 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52415) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUE-0007bj-Cy for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:16 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dG7-0004bQ-1k for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:59:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46104) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dG6-0004aI-Ry; Tue, 12 Mar 2019 04:59:38 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2BF9130917EE; Tue, 12 Mar 2019 08:53:35 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id C5BF160161; Tue, 12 Mar 2019 08:53:32 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:18 +1100 Message-Id: <20190312085316.8054-5-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Tue, 12 Mar 2019 08:53:35 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 04/62] Revert "spapr: support memory unplug for qtest" X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Greg Kurz Commit b8165118f52c broke CPU hotplug tests for old machine types: $ QTEST_QEMU_BINARY=ppc64-softmmu/qemu-system-ppc64 ./tests/cpu-plug-test -m=slow /ppc64/cpu-plug/pseries-3.1/device-add/2x3x1&maxcpus=6: OK /ppc64/cpu-plug/pseries-2.12-sxxm/device-add/2x3x1&maxcpus=6: OK /ppc64/cpu-plug/pseries-3.0/device-add/2x3x1&maxcpus=6: OK /ppc64/cpu-plug/pseries-2.10/device-add/2x3x1&maxcpus=6: OK /ppc64/cpu-plug/pseries-2.11/device-add/2x3x1&maxcpus=6: OK /ppc64/cpu-plug/pseries-2.12/device-add/2x3x1&maxcpus=6: OK /ppc64/cpu-plug/pseries-2.9/device-add/2x3x1&maxcpus=6: OK /ppc64/cpu-plug/pseries-2.7/device-add/2x3x1&maxcpus=6: ** ERROR:/home/thuth/devel/qemu/hw/ppc/spapr_events.c:313:rtas_event_log_to_source: assertion failed: (source->enabled) Broken pipe /home/thuth/devel/qemu/tests/libqtest.c:143: kill_qemu() detected QEMU death from signal 6 (Aborted) (core dumped) Aborted (core dumped) The approach of faking the availability of OV5_HP_EVT causes the code to assume the hotplug event source is enabled, which is wrong for older machines. We've now fixed CAS under qtest with a different approach. Therefore, this reverts commit b8165118f52ce5ee88565d3cec83d30374efdc96. A subsequent patch will address the problem of CAS under qtest from a different angle. Reported-by: Thomas Huth Signed-off-by: Greg Kurz Message-Id: <155146875097.147873.1732264036668112686.stgit@bahia.lan> Tested-by: Michael Roth Reviewed-by: Michael Roth Signed-off-by: David Gibson --- hw/ppc/spapr_ovec.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c index 12510b236a..318bf33de4 100644 --- a/hw/ppc/spapr_ovec.c +++ b/hw/ppc/spapr_ovec.c @@ -16,7 +16,6 @@ #include "qemu/bitmap.h" #include "exec/address-spaces.h" #include "qemu/error-report.h" -#include "sysemu/qtest.h" #include "trace.h" #include @@ -132,11 +131,6 @@ bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr) g_assert(ov); g_assert(bitnr < OV_MAXBITS); - /* support memory unplug for qtest */ - if (qtest_enabled() && bitnr == OV5_HP_EVT) { - return true; - } - return test_bit(bitnr, ov->bitmap) ? true : false; } From patchwork Tue Mar 12 08:52:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848949 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0DCA01823 for ; Tue, 12 Mar 2019 09:50:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F1367293CD for ; Tue, 12 Mar 2019 09:50:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E249A2924D; Tue, 12 Mar 2019 09:50:20 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7A27B2924D for ; Tue, 12 Mar 2019 09:50:20 +0000 (UTC) Received: from localhost ([127.0.0.1]:48494 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3e39-0008BQ-Jw for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:50:19 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52735) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTu-00085z-NR for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dJ9-0007QD-Vy for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:02:50 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38304) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dJ6-0007NX-4T; Tue, 12 Mar 2019 05:02:46 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0F3A281DEC; Tue, 12 Mar 2019 08:53:38 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id AF4A96013E; Tue, 12 Mar 2019 08:53:35 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:19 +1100 Message-Id: <20190312085316.8054-6-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 12 Mar 2019 08:53:38 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 05/62] target/ppc/spapr: Add SPAPR_CAP_LARGE_DECREMENTER X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh Add spapr_cap SPAPR_CAP_LARGE_DECREMENTER to be used to control the availability of the large decrementer for a guest. Signed-off-by: Suraj Jitindar Singh Message-Id: <20190301024317.22137-1-sjitindarsingh@gmail.com> [dwg: Trivial style fix] Signed-off-by: David Gibson --- hw/ppc/spapr.c | 2 ++ hw/ppc/spapr_caps.c | 18 ++++++++++++++++++ include/hw/ppc/spapr.h | 5 ++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index f7d527464c..e07e5370d3 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2088,6 +2088,7 @@ static const VMStateDescription vmstate_spapr = { &vmstate_spapr_irq_map, &vmstate_spapr_cap_nested_kvm_hv, &vmstate_spapr_dtb, + &vmstate_spapr_cap_large_decr, NULL } }; @@ -4302,6 +4303,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */ smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF; + smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF; spapr_caps_add_properties(smc, &error_abort); smc->irq = &spapr_irq_xics; smc->dr_phb_enabled = true; diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 64f98ae68d..c28239ca01 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -390,6 +390,14 @@ static void cap_nested_kvm_hv_apply(sPAPRMachineState *spapr, } } +static void cap_large_decr_apply(sPAPRMachineState *spapr, + uint8_t val, Error **errp) +{ + if (val) + error_setg(errp, + "No large decrementer support, try cap-large-decr=off"); +} + sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { [SPAPR_CAP_HTM] = { .name = "htm", @@ -468,6 +476,15 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { .type = "bool", .apply = cap_nested_kvm_hv_apply, }, + [SPAPR_CAP_LARGE_DECREMENTER] = { + .name = "large-decr", + .description = "Allow Large Decrementer", + .index = SPAPR_CAP_LARGE_DECREMENTER, + .get = spapr_cap_get_bool, + .set = spapr_cap_set_bool, + .type = "bool", + .apply = cap_large_decr_apply, + }, }; static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, @@ -596,6 +613,7 @@ SPAPR_CAP_MIG_STATE(cfpc, SPAPR_CAP_CFPC); SPAPR_CAP_MIG_STATE(sbbc, SPAPR_CAP_SBBC); SPAPR_CAP_MIG_STATE(ibs, SPAPR_CAP_IBS); SPAPR_CAP_MIG_STATE(nested_kvm_hv, SPAPR_CAP_NESTED_KVM_HV); +SPAPR_CAP_MIG_STATE(large_decr, SPAPR_CAP_LARGE_DECREMENTER); void spapr_caps_init(sPAPRMachineState *spapr) { diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 59073a7579..8efc5e0779 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -74,8 +74,10 @@ typedef enum { #define SPAPR_CAP_HPT_MAXPAGESIZE 0x06 /* Nested KVM-HV */ #define SPAPR_CAP_NESTED_KVM_HV 0x07 +/* Large Decrementer */ +#define SPAPR_CAP_LARGE_DECREMENTER 0x08 /* Num Caps */ -#define SPAPR_CAP_NUM (SPAPR_CAP_NESTED_KVM_HV + 1) +#define SPAPR_CAP_NUM (SPAPR_CAP_LARGE_DECREMENTER + 1) /* * Capability Values @@ -828,6 +830,7 @@ extern const VMStateDescription vmstate_spapr_cap_cfpc; extern const VMStateDescription vmstate_spapr_cap_sbbc; extern const VMStateDescription vmstate_spapr_cap_ibs; extern const VMStateDescription vmstate_spapr_cap_nested_kvm_hv; +extern const VMStateDescription vmstate_spapr_cap_large_decr; static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap) { From patchwork Tue Mar 12 08:52:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849009 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0D0491669 for ; Tue, 12 Mar 2019 10:10:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CB1B82957E for ; Tue, 12 Mar 2019 10:10:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BF5E42958C; Tue, 12 Mar 2019 10:10:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B409B2957E for ; Tue, 12 Mar 2019 10:10:29 +0000 (UTC) Received: from localhost ([127.0.0.1]:48838 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eMf-0000TJ-0n for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:10:29 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53006) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTr-0008LO-1y for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dJw-0008Iu-E1 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:03:43 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39646) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dJw-0008G4-0V; Tue, 12 Mar 2019 05:03:36 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0E47A3092645; Tue, 12 Mar 2019 08:53:41 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 967806013E; Tue, 12 Mar 2019 08:53:38 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:20 +1100 Message-Id: <20190312085316.8054-7-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Tue, 12 Mar 2019 08:53:41 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 06/62] target/ppc: Implement large decrementer support for TCG X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh Prior to POWER9 the decrementer was a 32-bit register which decremented with each tick of the timebase. From POWER9 onwards the decrementer can be set to operate in a mode called large decrementer where it acts as a n-bit decrementing register which is visible as a 64-bit register, that is the value of the decrementer is sign extended to 64 bits (where n is implementation dependant). The mode in which the decrementer operates is controlled by the LPCR_LD bit in the logical paritition control register (LPCR). >From POWER9 onwards the HDEC (hypervisor decrementer) was enlarged to h-bits, also sign extended to 64 bits (where h is implementation dependant). Note this isn't configurable and is always enabled. On POWER9 the large decrementer and hdec are both 56 bits, as represented by the lrg_decr_bits cpu class property. Since they are the same size we only add one property for now, which could be extended in the case they ever differ in the future. We also add the lrg_decr_bits property for POWER5+/7/8 since it is used to determine the size of the hdec, which is only generated on the POWER5+ processor and later. On these processors it is 32 bits. Signed-off-by: Suraj Jitindar Singh Signed-off-by: Cédric Le Goater Message-Id: <20190301024317.22137-2-sjitindarsingh@gmail.com> [dwg: Small style fixes] Signed-off-by: David Gibson --- hw/ppc/ppc.c | 90 +++++++++++++++++++++++---------- hw/ppc/spapr.c | 8 +++ hw/ppc/spapr_caps.c | 32 +++++++++++- target/ppc/cpu-qom.h | 1 + target/ppc/cpu.h | 8 +-- target/ppc/mmu-hash64.c | 2 +- target/ppc/translate.c | 2 +- target/ppc/translate_init.inc.c | 4 ++ 8 files changed, 114 insertions(+), 33 deletions(-) diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index d1e3d4cd20..df23a7000c 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -744,11 +744,10 @@ bool ppc_decr_clear_on_delivery(CPUPPCState *env) return ((tb_env->flags & flags) == PPC_DECR_UNDERFLOW_TRIGGERED); } -static inline uint32_t _cpu_ppc_load_decr(CPUPPCState *env, uint64_t next) +static inline int64_t _cpu_ppc_load_decr(CPUPPCState *env, uint64_t next) { ppc_tb_t *tb_env = env->tb_env; - uint32_t decr; - int64_t diff; + int64_t decr, diff; diff = next - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); if (diff >= 0) { @@ -758,27 +757,49 @@ static inline uint32_t _cpu_ppc_load_decr(CPUPPCState *env, uint64_t next) } else { decr = -muldiv64(-diff, tb_env->decr_freq, NANOSECONDS_PER_SECOND); } - LOG_TB("%s: %08" PRIx32 "\n", __func__, decr); + LOG_TB("%s: %016" PRIx64 "\n", __func__, decr); return decr; } -uint32_t cpu_ppc_load_decr (CPUPPCState *env) +target_ulong cpu_ppc_load_decr(CPUPPCState *env) { ppc_tb_t *tb_env = env->tb_env; + uint64_t decr; if (kvm_enabled()) { return env->spr[SPR_DECR]; } - return _cpu_ppc_load_decr(env, tb_env->decr_next); + decr = _cpu_ppc_load_decr(env, tb_env->decr_next); + + /* + * If large decrementer is enabled then the decrementer is signed extened + * to 64 bits, otherwise it is a 32 bit value. + */ + if (env->spr[SPR_LPCR] & LPCR_LD) { + return decr; + } + return (uint32_t) decr; } -uint32_t cpu_ppc_load_hdecr (CPUPPCState *env) +target_ulong cpu_ppc_load_hdecr(CPUPPCState *env) { + PowerPCCPU *cpu = ppc_env_get_cpu(env); + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); ppc_tb_t *tb_env = env->tb_env; + uint64_t hdecr; + + hdecr = _cpu_ppc_load_decr(env, tb_env->hdecr_next); - return _cpu_ppc_load_decr(env, tb_env->hdecr_next); + /* + * If we have a large decrementer (POWER9 or later) then hdecr is sign + * extended to 64 bits, otherwise it is 32 bits. + */ + if (pcc->lrg_decr_bits > 32) { + return hdecr; + } + return (uint32_t) hdecr; } uint64_t cpu_ppc_load_purr (CPUPPCState *env) @@ -832,13 +853,22 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp, QEMUTimer *timer, void (*raise_excp)(void *), void (*lower_excp)(PowerPCCPU *), - uint32_t decr, uint32_t value) + target_ulong decr, target_ulong value, + int nr_bits) { CPUPPCState *env = &cpu->env; ppc_tb_t *tb_env = env->tb_env; uint64_t now, next; + bool negative; + + /* Truncate value to decr_width and sign extend for simplicity */ + value &= ((1ULL << nr_bits) - 1); + negative = !!(value & (1ULL << (nr_bits - 1))); + if (negative) { + value |= (0xFFFFFFFFULL << nr_bits); + } - LOG_TB("%s: %08" PRIx32 " => %08" PRIx32 "\n", __func__, + LOG_TB("%s: " TARGET_FMT_lx " => " TARGET_FMT_lx "\n", __func__, decr, value); if (kvm_enabled()) { @@ -860,15 +890,15 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp, * an edge interrupt, so raise it here too. */ if ((value < 3) || - ((tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL) && (value & 0x80000000)) || - ((tb_env->flags & PPC_DECR_UNDERFLOW_TRIGGERED) && (value & 0x80000000) - && !(decr & 0x80000000))) { + ((tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL) && negative) || + ((tb_env->flags & PPC_DECR_UNDERFLOW_TRIGGERED) && negative + && !(decr & (1ULL << (nr_bits - 1))))) { (*raise_excp)(cpu); return; } /* On MSB level based systems a 0 for the MSB stops interrupt delivery */ - if (!(value & 0x80000000) && (tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL)) { + if (!negative && (tb_env->flags & PPC_DECR_UNDERFLOW_LEVEL)) { (*lower_excp)(cpu); } @@ -881,21 +911,27 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uint64_t *nextp, timer_mod(timer, next); } -static inline void _cpu_ppc_store_decr(PowerPCCPU *cpu, uint32_t decr, - uint32_t value) +static inline void _cpu_ppc_store_decr(PowerPCCPU *cpu, target_ulong decr, + target_ulong value, int nr_bits) { ppc_tb_t *tb_env = cpu->env.tb_env; __cpu_ppc_store_decr(cpu, &tb_env->decr_next, tb_env->decr_timer, tb_env->decr_timer->cb, &cpu_ppc_decr_lower, decr, - value); + value, nr_bits); } -void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value) +void cpu_ppc_store_decr(CPUPPCState *env, target_ulong value) { PowerPCCPU *cpu = ppc_env_get_cpu(env); + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); + int nr_bits = 32; + + if (env->spr[SPR_LPCR] & LPCR_LD) { + nr_bits = pcc->lrg_decr_bits; + } - _cpu_ppc_store_decr(cpu, cpu_ppc_load_decr(env), value); + _cpu_ppc_store_decr(cpu, cpu_ppc_load_decr(env), value, nr_bits); } static void cpu_ppc_decr_cb(void *opaque) @@ -905,23 +941,25 @@ static void cpu_ppc_decr_cb(void *opaque) cpu_ppc_decr_excp(cpu); } -static inline void _cpu_ppc_store_hdecr(PowerPCCPU *cpu, uint32_t hdecr, - uint32_t value) +static inline void _cpu_ppc_store_hdecr(PowerPCCPU *cpu, target_ulong hdecr, + target_ulong value, int nr_bits) { ppc_tb_t *tb_env = cpu->env.tb_env; if (tb_env->hdecr_timer != NULL) { __cpu_ppc_store_decr(cpu, &tb_env->hdecr_next, tb_env->hdecr_timer, tb_env->hdecr_timer->cb, &cpu_ppc_hdecr_lower, - hdecr, value); + hdecr, value, nr_bits); } } -void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value) +void cpu_ppc_store_hdecr(CPUPPCState *env, target_ulong value) { PowerPCCPU *cpu = ppc_env_get_cpu(env); + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); - _cpu_ppc_store_hdecr(cpu, cpu_ppc_load_hdecr(env), value); + _cpu_ppc_store_hdecr(cpu, cpu_ppc_load_hdecr(env), value, + pcc->lrg_decr_bits); } static void cpu_ppc_hdecr_cb(void *opaque) @@ -951,8 +989,8 @@ static void cpu_ppc_set_tb_clk (void *opaque, uint32_t freq) * if a decrementer exception is pending when it enables msr_ee at startup, * it's not ready to handle it... */ - _cpu_ppc_store_decr(cpu, 0xFFFFFFFF, 0xFFFFFFFF); - _cpu_ppc_store_hdecr(cpu, 0xFFFFFFFF, 0xFFFFFFFF); + _cpu_ppc_store_decr(cpu, 0xFFFFFFFF, 0xFFFFFFFF, 32); + _cpu_ppc_store_hdecr(cpu, 0xFFFFFFFF, 0xFFFFFFFF, 32); cpu_ppc_store_purr(cpu, 0x0000000000000000ULL); } diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index e07e5370d3..6b54ad260a 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -558,6 +558,14 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset, pcc->radix_page_info->count * sizeof(radix_AP_encodings[0])))); } + + /* + * We set this property to let the guest know that it can use the large + * decrementer and its width in bits. + */ + if (spapr_get_cap(spapr, SPAPR_CAP_LARGE_DECREMENTER) != SPAPR_CAP_OFF) + _FDT((fdt_setprop_u32(fdt, offset, "ibm,dec-bits", + pcc->lrg_decr_bits))); } static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index c28239ca01..6d6dca30db 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -393,9 +393,38 @@ static void cap_nested_kvm_hv_apply(sPAPRMachineState *spapr, static void cap_large_decr_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { - if (val) + PowerPCCPU *cpu = POWERPC_CPU(first_cpu); + + if (!val) { + return; /* Disabled by default */ + } + + if (tcg_enabled()) { + if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_00, 0, + spapr->max_compat_pvr)) { + error_setg(errp, + "Large decrementer only supported on POWER9, try -cpu POWER9"); + return; + } + } else { error_setg(errp, "No large decrementer support, try cap-large-decr=off"); + } +} + +static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr, + PowerPCCPU *cpu, + uint8_t val, Error **errp) +{ + CPUPPCState *env = &cpu->env; + target_ulong lpcr = env->spr[SPR_LPCR]; + + if (val) { + lpcr |= LPCR_LD; + } else { + lpcr &= ~LPCR_LD; + } + ppc_store_lpcr(cpu, lpcr); } sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { @@ -484,6 +513,7 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { .set = spapr_cap_set_bool, .type = "bool", .apply = cap_large_decr_apply, + .cpu_apply = cap_large_decr_cpu_apply, }, }; diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h index ae51fe754e..be9b4c30c3 100644 --- a/target/ppc/cpu-qom.h +++ b/target/ppc/cpu-qom.h @@ -190,6 +190,7 @@ typedef struct PowerPCCPUClass { #endif const PPCHash64Options *hash64_opts; struct ppc_radix_page_info *radix_page_info; + uint32_t lrg_decr_bits; void (*init_proc)(CPUPPCState *env); int (*check_pow)(CPUPPCState *env); int (*handle_mmu_fault)(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx); diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 26604ddf98..21e418d6b1 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1321,10 +1321,10 @@ uint32_t cpu_ppc_load_atbu (CPUPPCState *env); void cpu_ppc_store_atbl (CPUPPCState *env, uint32_t value); void cpu_ppc_store_atbu (CPUPPCState *env, uint32_t value); bool ppc_decr_clear_on_delivery(CPUPPCState *env); -uint32_t cpu_ppc_load_decr (CPUPPCState *env); -void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value); -uint32_t cpu_ppc_load_hdecr (CPUPPCState *env); -void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value); +target_ulong cpu_ppc_load_decr(CPUPPCState *env); +void cpu_ppc_store_decr(CPUPPCState *env, target_ulong value); +target_ulong cpu_ppc_load_hdecr(CPUPPCState *env); +void cpu_ppc_store_hdecr(CPUPPCState *env, target_ulong value); uint64_t cpu_ppc_load_purr (CPUPPCState *env); uint32_t cpu_ppc601_load_rtcl (CPUPPCState *env); uint32_t cpu_ppc601_load_rtcu (CPUPPCState *env); diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index c431303eff..a2b1ec5040 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -1109,7 +1109,7 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val) case POWERPC_MMU_3_00: /* P9 */ lpcr = val & (LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD | (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL | - LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | + LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD | (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC | LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE); diff --git a/target/ppc/translate.c b/target/ppc/translate.c index 819221f246..b156be4d98 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -7417,7 +7417,7 @@ void ppc_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, #if !defined(NO_TIMER_DUMP) cpu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64 #if !defined(CONFIG_USER_ONLY) - " DECR %08" PRIu32 + " DECR " TARGET_FMT_lu #endif "\n", cpu_ppc_load_tbu(env), cpu_ppc_load_tbl(env) diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c index 58542c0fe0..af70a3b78c 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -8376,6 +8376,7 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data) #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault; pcc->hash64_opts = &ppc_hash64_opts_basic; + pcc->lrg_decr_bits = 32; #endif pcc->excp_model = POWERPC_EXCP_970; pcc->bus_model = PPC_FLAGS_INPUT_970; @@ -8550,6 +8551,7 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data) #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault; pcc->hash64_opts = &ppc_hash64_opts_POWER7; + pcc->lrg_decr_bits = 32; #endif pcc->excp_model = POWERPC_EXCP_POWER7; pcc->bus_model = PPC_FLAGS_INPUT_POWER7; @@ -8718,6 +8720,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data) #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault; pcc->hash64_opts = &ppc_hash64_opts_POWER7; + pcc->lrg_decr_bits = 32; #endif pcc->excp_model = POWERPC_EXCP_POWER8; pcc->bus_model = PPC_FLAGS_INPUT_POWER7; @@ -8926,6 +8929,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) /* segment page size remain the same */ pcc->hash64_opts = &ppc_hash64_opts_POWER7; pcc->radix_page_info = &POWER9_radix_page_info; + pcc->lrg_decr_bits = 56; #endif pcc->excp_model = POWERPC_EXCP_POWER9; pcc->bus_model = PPC_FLAGS_INPUT_POWER9; From patchwork Tue Mar 12 08:52:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848953 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9A4FD1850 for ; Tue, 12 Mar 2019 09:51:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 870BB29475 for ; Tue, 12 Mar 2019 09:51:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 78AE329552; Tue, 12 Mar 2019 09:51:16 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id DB14829475 for ; Tue, 12 Mar 2019 09:51:15 +0000 (UTC) Received: from localhost ([127.0.0.1]:48504 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3e43-0000Qz-24 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:51:15 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52529) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dU0-0007iw-U1 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dHj-0006Uh-21 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:01:20 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58248) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dHi-0006Ts-Oi; Tue, 12 Mar 2019 05:01:18 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EE562C065877; Tue, 12 Mar 2019 08:53:43 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 969096013E; Tue, 12 Mar 2019 08:53:41 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:21 +1100 Message-Id: <20190312085316.8054-8-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 12 Mar 2019 08:53:44 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 07/62] target/ppc: Implement large decrementer support for KVM X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh Implement support to allow KVM guests to take advantage of the large decrementer introduced on POWER9 cpus. To determine if the host can support the requested large decrementer size, we check it matches that specified in the ibm,dec-bits device-tree property. We also need to enable it in KVM by setting the LPCR_LD bit in the LPCR. Note that to do this we need to try and set the bit, then read it back to check the host allowed us to set it, if so we can use it but if we were unable to set it the host cannot support it and we must not use the large decrementer. Signed-off-by: Suraj Jitindar Singh Signed-off-by: Cédric Le Goater Message-Id: <20190301024317.22137-3-sjitindarsingh@gmail.com> [dwg: Small style fixes] Signed-off-by: David Gibson --- hw/ppc/spapr_caps.c | 22 +++++++++++++++++++--- target/ppc/kvm.c | 42 ++++++++++++++++++++++++++++++++++++++++++ target/ppc/kvm_ppc.h | 12 ++++++++++++ 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 6d6dca30db..942ac8ebbe 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -394,6 +394,7 @@ static void cap_large_decr_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { PowerPCCPU *cpu = POWERPC_CPU(first_cpu); + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); if (!val) { return; /* Disabled by default */ @@ -406,9 +407,17 @@ static void cap_large_decr_apply(sPAPRMachineState *spapr, "Large decrementer only supported on POWER9, try -cpu POWER9"); return; } - } else { - error_setg(errp, - "No large decrementer support, try cap-large-decr=off"); + } else if (kvm_enabled()) { + int kvm_nr_bits = kvmppc_get_cap_large_decr(); + + if (!kvm_nr_bits) { + error_setg(errp, + "No large decrementer support, try cap-large-decr=off"); + } else if (pcc->lrg_decr_bits != kvm_nr_bits) { + error_setg(errp, +"KVM large decrementer size (%d) differs to model (%d), try -cap-large-decr=off", + kvm_nr_bits, pcc->lrg_decr_bits); + } } } @@ -419,6 +428,13 @@ static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr, CPUPPCState *env = &cpu->env; target_ulong lpcr = env->spr[SPR_LPCR]; + if (kvm_enabled()) { + if (kvmppc_enable_cap_large_decr(cpu, val)) { + error_setg(errp, + "No large decrementer support, try cap-large-decr=off"); + } + } + if (val) { lpcr |= LPCR_LD; } else { diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index d01852fe31..f0f5bf9391 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -91,6 +91,7 @@ static int cap_ppc_safe_cache; static int cap_ppc_safe_bounds_check; static int cap_ppc_safe_indirect_branch; static int cap_ppc_nested_kvm_hv; +static int cap_large_decr; static uint32_t debug_inst_opcode; @@ -124,6 +125,7 @@ static bool kvmppc_is_pr(KVMState *ks) static int kvm_ppc_register_host_cpu_type(MachineState *ms); static void kvmppc_get_cpu_characteristics(KVMState *s); +static int kvmppc_get_dec_bits(void); int kvm_arch_init(MachineState *ms, KVMState *s) { @@ -151,6 +153,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s) cap_resize_hpt = kvm_vm_check_extension(s, KVM_CAP_SPAPR_RESIZE_HPT); kvmppc_get_cpu_characteristics(s); cap_ppc_nested_kvm_hv = kvm_vm_check_extension(s, KVM_CAP_PPC_NESTED_HV); + cap_large_decr = kvmppc_get_dec_bits(); /* * Note: setting it to false because there is not such capability * in KVM at this moment. @@ -1927,6 +1930,16 @@ uint64_t kvmppc_get_clockfreq(void) return kvmppc_read_int_cpu_dt("clock-frequency"); } +static int kvmppc_get_dec_bits(void) +{ + int nr_bits = kvmppc_read_int_cpu_dt("ibm,dec-bits"); + + if (nr_bits > 0) { + return nr_bits; + } + return 0; +} + static int kvmppc_get_pvinfo(CPUPPCState *env, struct kvm_ppc_pvinfo *pvinfo) { PowerPCCPU *cpu = ppc_env_get_cpu(env); @@ -2442,6 +2455,35 @@ bool kvmppc_has_cap_spapr_vfio(void) return cap_spapr_vfio; } +int kvmppc_get_cap_large_decr(void) +{ + return cap_large_decr; +} + +int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable) +{ + CPUState *cs = CPU(cpu); + uint64_t lpcr; + + kvm_get_one_reg(cs, KVM_REG_PPC_LPCR_64, &lpcr); + /* Do we need to modify the LPCR? */ + if (!!(lpcr & LPCR_LD) != !!enable) { + if (enable) { + lpcr |= LPCR_LD; + } else { + lpcr &= ~LPCR_LD; + } + kvm_set_one_reg(cs, KVM_REG_PPC_LPCR_64, &lpcr); + kvm_get_one_reg(cs, KVM_REG_PPC_LPCR_64, &lpcr); + + if (!!(lpcr & LPCR_LD) != !!enable) { + return -1; + } + } + + return 0; +} + PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void) { uint32_t host_pvr = mfpvr(); diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index bdfaa4e70a..a79835bd14 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -64,6 +64,8 @@ int kvmppc_get_cap_safe_bounds_check(void); int kvmppc_get_cap_safe_indirect_branch(void); bool kvmppc_has_cap_nested_kvm_hv(void); int kvmppc_set_cap_nested_kvm_hv(int enable); +int kvmppc_get_cap_large_decr(void); +int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable); int kvmppc_enable_hwrng(void); int kvmppc_put_books_sregs(PowerPCCPU *cpu); PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void); @@ -332,6 +334,16 @@ static inline int kvmppc_set_cap_nested_kvm_hv(int enable) return -1; } +static inline int kvmppc_get_cap_large_decr(void) +{ + return 0; +} + +static inline int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable) +{ + return -1; +} + static inline int kvmppc_enable_hwrng(void) { return -1; From patchwork Tue Mar 12 08:52:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848981 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E80971850 for ; Tue, 12 Mar 2019 09:57:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D71EA2859E for ; Tue, 12 Mar 2019 09:57:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CAC412955F; Tue, 12 Mar 2019 09:57:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 66FE62859E for ; Tue, 12 Mar 2019 09:57:52 +0000 (UTC) Received: from localhost ([127.0.0.1]:48605 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eAR-0005qK-MZ for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:57:51 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53006) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dU8-0008LO-LV for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dGY-0005RO-1m for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:00:06 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42354) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dGX-0005Qe-Si; Tue, 12 Mar 2019 05:00:05 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D80CBC04D29A; Tue, 12 Mar 2019 08:53:46 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7E0286013E; Tue, 12 Mar 2019 08:53:44 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:22 +1100 Message-Id: <20190312085316.8054-9-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 12 Mar 2019 08:53:46 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 08/62] target/ppc/spapr: Enable the large decrementer for pseries-4.0 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh Enable the large decrementer by default for the pseries-4.0 machine type. It is disabled again by default_caps_with_cpu() for pre-POWER9 cpus since they don't support the large decrementer. Signed-off-by: Suraj Jitindar Singh Message-Id: <20190301024317.22137-4-sjitindarsingh@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 3 ++- hw/ppc/spapr_caps.c | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 6b54ad260a..8e24d7dc50 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -4311,7 +4311,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */ smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF; - smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF; + smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON; spapr_caps_add_properties(smc, &error_abort); smc->irq = &spapr_irq_xics; smc->dr_phb_enabled = true; @@ -4387,6 +4387,7 @@ static void spapr_machine_3_1_class_options(MachineClass *mc) mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0"); smc->update_dt_enabled = false; smc->dr_phb_enabled = false; + smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF; } DEFINE_SPAPR_MACHINE(3_1, "3.1", false); diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 942ac8ebbe..faab472d06 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -541,6 +541,11 @@ static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, caps = smc->default_caps; + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_3_00, + 0, spapr->max_compat_pvr)) { + caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF; + } + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_2_07, 0, spapr->max_compat_pvr)) { caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF; From patchwork Tue Mar 12 08:52:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849011 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C3FC81669 for ; Tue, 12 Mar 2019 10:10:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B4CF729545 for ; Tue, 12 Mar 2019 10:10:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A8CD6295AC; Tue, 12 Mar 2019 10:10:57 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 0438E2957E for ; Tue, 12 Mar 2019 10:10:56 +0000 (UTC) Received: from localhost ([127.0.0.1]:48840 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eN6-0000rX-45 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:10:56 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52735) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUC-00085z-GZ for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dG7-0004be-4n for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:59:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46106) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dG6-0004aJ-Sa; Tue, 12 Mar 2019 04:59:39 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B2D5F3091799; Tue, 12 Mar 2019 08:53:49 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5825B6013E; Tue, 12 Mar 2019 08:53:47 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:23 +1100 Message-Id: <20190312085316.8054-10-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Tue, 12 Mar 2019 08:53:49 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 09/62] target/ppc/spapr: Add workaround option to SPAPR_CAP_IBS X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh The spapr_cap SPAPR_CAP_IBS is used to indicate the level of capability for mitigations for indirect branch speculation. Currently the available values are broken (default), fixed-ibs (fixed by serialising indirect branches) and fixed-ccd (fixed by diabling the count cache). Introduce a new value for this capability denoted workaround, meaning that software can work around the issue by flushing the count cache on context switch. This option is available if the hypervisor sets the H_CPU_BEHAV_FLUSH_COUNT_CACHE flag in the cpu behaviours returned from the KVM_PPC_GET_CPU_CHAR ioctl. Signed-off-by: Suraj Jitindar Singh Message-Id: <20190301031912.28809-1-sjitindarsingh@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr_caps.c | 21 ++++++++++----------- hw/ppc/spapr_hcall.c | 5 +++++ include/hw/ppc/spapr.h | 7 +++++++ target/ppc/kvm.c | 8 +++++++- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index faab472d06..ca35b5153d 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -276,11 +276,13 @@ static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t val, } sPAPRCapPossible cap_ibs_possible = { - .num = 4, + .num = 5, /* Note workaround only maintained for compatibility */ - .vals = {"broken", "workaround", "fixed-ibs", "fixed-ccd"}, - .help = "broken - no protection, fixed-ibs - indirect branch serialisation," - " fixed-ccd - cache count disabled", + .vals = {"broken", "workaround", "fixed-ibs", "fixed-ccd", "fixed-na"}, + .help = "broken - no protection, workaround - count cache flush" + ", fixed-ibs - indirect branch serialisation," + " fixed-ccd - cache count disabled," + " fixed-na - fixed in hardware (no longer applicable)", }; static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, @@ -288,15 +290,11 @@ static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, { uint8_t kvm_val = kvmppc_get_cap_safe_indirect_branch(); - if (val == SPAPR_CAP_WORKAROUND) { /* Can only be Broken or Fixed */ - error_setg(errp, -"Requested safe indirect branch capability level \"workaround\" not valid, try cap-ibs=%s", - cap_ibs_possible.vals[kvm_val]); - } else if (tcg_enabled() && val) { + if (tcg_enabled() && val) { /* TODO - for now only allow broken for TCG */ error_setg(errp, "Requested safe indirect branch capability level not supported by tcg, try a different value for cap-ibs"); - } else if (kvm_enabled() && val && (val != kvm_val)) { + } else if (kvm_enabled() && (val > kvm_val)) { error_setg(errp, "Requested safe indirect branch capability level not supported by kvm, try cap-ibs=%s", cap_ibs_possible.vals[kvm_val]); @@ -494,7 +492,8 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { [SPAPR_CAP_IBS] = { .name = "ibs", .description = - "Indirect Branch Speculation (broken, fixed-ibs, fixed-ccd)", + "Indirect Branch Speculation (broken, workaround, fixed-ibs," + "fixed-ccd, fixed-na)", .index = SPAPR_CAP_IBS, .get = spapr_cap_get_string, .set = spapr_cap_set_string, diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 476bad6271..4aa8036fc0 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1723,12 +1723,17 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu, } switch (safe_indirect_branch) { + case SPAPR_CAP_FIXED_NA: + break; case SPAPR_CAP_FIXED_CCD: characteristics |= H_CPU_CHAR_CACHE_COUNT_DIS; break; case SPAPR_CAP_FIXED_IBS: characteristics |= H_CPU_CHAR_BCCTRL_SERIALISED; break; + case SPAPR_CAP_WORKAROUND: + behaviour |= H_CPU_BEHAV_FLUSH_COUNT_CACHE; + break; default: /* broken */ assert(safe_indirect_branch == SPAPR_CAP_BROKEN); break; diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 8efc5e0779..a7f3b1bfdd 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -85,12 +85,17 @@ typedef enum { /* Bool Caps */ #define SPAPR_CAP_OFF 0x00 #define SPAPR_CAP_ON 0x01 + /* Custom Caps */ + +/* Generic */ #define SPAPR_CAP_BROKEN 0x00 #define SPAPR_CAP_WORKAROUND 0x01 #define SPAPR_CAP_FIXED 0x02 +/* SPAPR_CAP_IBS (cap-ibs) */ #define SPAPR_CAP_FIXED_IBS 0x02 #define SPAPR_CAP_FIXED_CCD 0x03 +#define SPAPR_CAP_FIXED_NA 0x10 /* Lets leave a bit of a gap... */ typedef struct sPAPRCapabilities sPAPRCapabilities; struct sPAPRCapabilities { @@ -339,9 +344,11 @@ struct sPAPRMachineState { #define H_CPU_CHAR_HON_BRANCH_HINTS PPC_BIT(5) #define H_CPU_CHAR_THR_RECONF_TRIG PPC_BIT(6) #define H_CPU_CHAR_CACHE_COUNT_DIS PPC_BIT(7) +#define H_CPU_CHAR_BCCTR_FLUSH_ASSIST PPC_BIT(9) #define H_CPU_BEHAV_FAVOUR_SECURITY PPC_BIT(0) #define H_CPU_BEHAV_L1D_FLUSH_PR PPC_BIT(1) #define H_CPU_BEHAV_BNDS_CHK_SPEC_BAR PPC_BIT(2) +#define H_CPU_BEHAV_FLUSH_COUNT_CACHE PPC_BIT(5) /* Each control block has to be on a 4K boundary */ #define H_CB_ALIGNMENT 4096 diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index f0f5bf9391..4d46314276 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -2392,7 +2392,13 @@ static int parse_cap_ppc_safe_bounds_check(struct kvm_ppc_cpu_char c) static int parse_cap_ppc_safe_indirect_branch(struct kvm_ppc_cpu_char c) { - if (c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) { + if ((~c.behaviour & c.behaviour_mask & H_CPU_BEHAV_FLUSH_COUNT_CACHE) && + (~c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) && + (~c.character & c.character_mask & H_CPU_CHAR_BCCTRL_SERIALISED)) { + return SPAPR_CAP_FIXED_NA; + } else if (c.behaviour & c.behaviour_mask & H_CPU_BEHAV_FLUSH_COUNT_CACHE) { + return SPAPR_CAP_WORKAROUND; + } else if (c.character & c.character_mask & H_CPU_CHAR_CACHE_COUNT_DIS) { return SPAPR_CAP_FIXED_CCD; } else if (c.character & c.character_mask & H_CPU_CHAR_BCCTRL_SERIALISED) { return SPAPR_CAP_FIXED_IBS; From patchwork Tue Mar 12 08:52:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848939 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4ABCF139A for ; Tue, 12 Mar 2019 09:44:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3A6C328390 for ; Tue, 12 Mar 2019 09:44:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2CC9D291DC; Tue, 12 Mar 2019 09:44:28 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7805528390 for ; Tue, 12 Mar 2019 09:44:27 +0000 (UTC) Received: from localhost ([127.0.0.1]:48387 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dxS-0003Jx-KF for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:44:26 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53335) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTw-00005V-2H for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dIS-0006tv-4P for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:02:10 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48458) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dIR-0006tI-RK; Tue, 12 Mar 2019 05:02:04 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 949B580F75; Tue, 12 Mar 2019 08:53:52 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4439A6013E; Tue, 12 Mar 2019 08:53:49 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:24 +1100 Message-Id: <20190312085316.8054-11-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 12 Mar 2019 08:53:52 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 10/62] target/ppc/spapr: Add SPAPR_CAP_CCF_ASSIST X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh Introduce a new spapr_cap SPAPR_CAP_CCF_ASSIST to be used to indicate the requirement for a hw-assisted version of the count cache flush workaround. The count cache flush workaround is a software workaround which can be used to flush the count cache on context switch. Some revisions of hardware may have a hardware accelerated flush, in which case the software flush can be shortened. This cap is used to set the availability of such hardware acceleration for the count cache flush routine. The availability of such hardware acceleration is indicated by the H_CPU_CHAR_BCCTR_FLUSH_ASSIST flag being set in the characteristics returned from the KVM_PPC_GET_CPU_CHAR ioctl. Signed-off-by: Suraj Jitindar Singh Message-Id: <20190301031912.28809-2-sjitindarsingh@gmail.com> [dwg: Small style fixes] Signed-off-by: David Gibson --- hw/ppc/spapr.c | 2 ++ hw/ppc/spapr_caps.c | 25 +++++++++++++++++++++++++ hw/ppc/spapr_hcall.c | 5 +++++ include/hw/ppc/spapr.h | 5 ++++- target/ppc/kvm.c | 16 ++++++++++++++++ target/ppc/kvm_ppc.h | 6 ++++++ 6 files changed, 58 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 8e24d7dc50..37fd7a1411 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2097,6 +2097,7 @@ static const VMStateDescription vmstate_spapr = { &vmstate_spapr_cap_nested_kvm_hv, &vmstate_spapr_dtb, &vmstate_spapr_cap_large_decr, + &vmstate_spapr_cap_ccf_assist, NULL } }; @@ -4312,6 +4313,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */ smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON; + smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF; spapr_caps_add_properties(smc, &error_abort); smc->irq = &spapr_irq_xics; smc->dr_phb_enabled = true; diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index ca35b5153d..c5d381f183 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -441,6 +441,21 @@ static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr, ppc_store_lpcr(cpu, lpcr); } +static void cap_ccf_assist_apply(sPAPRMachineState *spapr, uint8_t val, + Error **errp) +{ + uint8_t kvm_val = kvmppc_get_cap_count_cache_flush_assist(); + + if (tcg_enabled() && val) { + /* TODO - for now only allow broken for TCG */ + error_setg(errp, +"Requested count cache flush assist capability level not supported by tcg, try cap-ccf-assist=off"); + } else if (kvm_enabled() && (val > kvm_val)) { + error_setg(errp, +"Requested count cache flush assist capability level not supported by kvm, try cap-ccf-assist=off"); + } +} + sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { [SPAPR_CAP_HTM] = { .name = "htm", @@ -530,6 +545,15 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { .apply = cap_large_decr_apply, .cpu_apply = cap_large_decr_cpu_apply, }, + [SPAPR_CAP_CCF_ASSIST] = { + .name = "ccf-assist", + .description = "Count Cache Flush Assist via HW Instruction", + .index = SPAPR_CAP_CCF_ASSIST, + .get = spapr_cap_get_bool, + .set = spapr_cap_set_bool, + .type = "bool", + .apply = cap_ccf_assist_apply, + }, }; static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, @@ -664,6 +688,7 @@ SPAPR_CAP_MIG_STATE(sbbc, SPAPR_CAP_SBBC); SPAPR_CAP_MIG_STATE(ibs, SPAPR_CAP_IBS); SPAPR_CAP_MIG_STATE(nested_kvm_hv, SPAPR_CAP_NESTED_KVM_HV); SPAPR_CAP_MIG_STATE(large_decr, SPAPR_CAP_LARGE_DECREMENTER); +SPAPR_CAP_MIG_STATE(ccf_assist, SPAPR_CAP_CCF_ASSIST); void spapr_caps_init(sPAPRMachineState *spapr) { diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 4aa8036fc0..15bdd30a12 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1693,6 +1693,8 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu, uint8_t safe_cache = spapr_get_cap(spapr, SPAPR_CAP_CFPC); uint8_t safe_bounds_check = spapr_get_cap(spapr, SPAPR_CAP_SBBC); uint8_t safe_indirect_branch = spapr_get_cap(spapr, SPAPR_CAP_IBS); + uint8_t count_cache_flush_assist = spapr_get_cap(spapr, + SPAPR_CAP_CCF_ASSIST); switch (safe_cache) { case SPAPR_CAP_WORKAROUND: @@ -1733,6 +1735,9 @@ static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu, break; case SPAPR_CAP_WORKAROUND: behaviour |= H_CPU_BEHAV_FLUSH_COUNT_CACHE; + if (count_cache_flush_assist) { + characteristics |= H_CPU_CHAR_BCCTR_FLUSH_ASSIST; + } break; default: /* broken */ assert(safe_indirect_branch == SPAPR_CAP_BROKEN); diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index a7f3b1bfdd..ff1bd60615 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -76,8 +76,10 @@ typedef enum { #define SPAPR_CAP_NESTED_KVM_HV 0x07 /* Large Decrementer */ #define SPAPR_CAP_LARGE_DECREMENTER 0x08 +/* Count Cache Flush Assist HW Instruction */ +#define SPAPR_CAP_CCF_ASSIST 0x09 /* Num Caps */ -#define SPAPR_CAP_NUM (SPAPR_CAP_LARGE_DECREMENTER + 1) +#define SPAPR_CAP_NUM (SPAPR_CAP_CCF_ASSIST + 1) /* * Capability Values @@ -838,6 +840,7 @@ extern const VMStateDescription vmstate_spapr_cap_sbbc; extern const VMStateDescription vmstate_spapr_cap_ibs; extern const VMStateDescription vmstate_spapr_cap_nested_kvm_hv; extern const VMStateDescription vmstate_spapr_cap_large_decr; +extern const VMStateDescription vmstate_spapr_cap_ccf_assist; static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap) { diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 4d46314276..1da28039a8 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -90,6 +90,7 @@ static int cap_ppc_pvr_compat; static int cap_ppc_safe_cache; static int cap_ppc_safe_bounds_check; static int cap_ppc_safe_indirect_branch; +static int cap_ppc_count_cache_flush_assist; static int cap_ppc_nested_kvm_hv; static int cap_large_decr; @@ -2407,6 +2408,14 @@ static int parse_cap_ppc_safe_indirect_branch(struct kvm_ppc_cpu_char c) return 0; } +static int parse_cap_ppc_count_cache_flush_assist(struct kvm_ppc_cpu_char c) +{ + if (c.character & c.character_mask & H_CPU_CHAR_BCCTR_FLUSH_ASSIST) { + return 1; + } + return 0; +} + static void kvmppc_get_cpu_characteristics(KVMState *s) { struct kvm_ppc_cpu_char c; @@ -2429,6 +2438,8 @@ static void kvmppc_get_cpu_characteristics(KVMState *s) cap_ppc_safe_cache = parse_cap_ppc_safe_cache(c); cap_ppc_safe_bounds_check = parse_cap_ppc_safe_bounds_check(c); cap_ppc_safe_indirect_branch = parse_cap_ppc_safe_indirect_branch(c); + cap_ppc_count_cache_flush_assist = + parse_cap_ppc_count_cache_flush_assist(c); } int kvmppc_get_cap_safe_cache(void) @@ -2446,6 +2457,11 @@ int kvmppc_get_cap_safe_indirect_branch(void) return cap_ppc_safe_indirect_branch; } +int kvmppc_get_cap_count_cache_flush_assist(void) +{ + return cap_ppc_count_cache_flush_assist; +} + bool kvmppc_has_cap_nested_kvm_hv(void) { return !!cap_ppc_nested_kvm_hv; diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index a79835bd14..2937b36cae 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -62,6 +62,7 @@ bool kvmppc_has_cap_mmu_hash_v3(void); int kvmppc_get_cap_safe_cache(void); int kvmppc_get_cap_safe_bounds_check(void); int kvmppc_get_cap_safe_indirect_branch(void); +int kvmppc_get_cap_count_cache_flush_assist(void); bool kvmppc_has_cap_nested_kvm_hv(void); int kvmppc_set_cap_nested_kvm_hv(int enable); int kvmppc_get_cap_large_decr(void); @@ -324,6 +325,11 @@ static inline int kvmppc_get_cap_safe_indirect_branch(void) return 0; } +static inline int kvmppc_get_cap_count_cache_flush_assist(void) +{ + return 0; +} + static inline bool kvmppc_has_cap_nested_kvm_hv(void) { return false; From patchwork Tue Mar 12 08:52:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849029 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9ED741850 for ; Tue, 12 Mar 2019 10:16:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 83AC829505 for ; Tue, 12 Mar 2019 10:16:55 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 77C8829545; Tue, 12 Mar 2019 10:16:55 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 09CA629505 for ; Tue, 12 Mar 2019 10:16:55 +0000 (UTC) Received: from localhost ([127.0.0.1]:48943 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eSs-00061L-85 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:16:54 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUG-0008KY-GO for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dFe-00049C-Vq for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:59:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59354) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dFe-00047e-OD; Tue, 12 Mar 2019 04:59:10 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1C4FE821C6; Tue, 12 Mar 2019 08:53:56 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 253A56013E; Tue, 12 Mar 2019 08:53:52 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:25 +1100 Message-Id: <20190312085316.8054-12-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 12 Mar 2019 08:53:56 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 11/62] target/ppc/tcg: make spapr_caps apply cap-[cfpc/sbbc/ibs] non-fatal for tcg X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh The spapr_caps cap-cfpc, cap-sbbc and cap-ibs are used to control the availability of certain mitigations to the guest. These haven't been implemented under TCG, it is unlikely they ever will be, and it is unclear as to whether they even need to be. As such, make failure to apply these capabilities under TCG non-fatal. Instead we print a warning message to the user but still allow the guest to continue. Signed-off-by: Suraj Jitindar Singh Message-Id: <20190301044609.9626-2-sjitindarsingh@gmail.com> [dwg: Small style fix] Signed-off-by: David Gibson --- hw/ppc/spapr_caps.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index c5d381f183..3b1cfae6c7 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -31,6 +31,7 @@ #include "target/ppc/mmu-hash64.h" #include "cpu-models.h" #include "kvm_ppc.h" +#include "sysemu/qtest.h" #include "hw/ppc/spapr.h" @@ -239,17 +240,22 @@ sPAPRCapPossible cap_cfpc_possible = { static void cap_safe_cache_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { + Error *local_err = NULL; uint8_t kvm_val = kvmppc_get_cap_safe_cache(); if (tcg_enabled() && val) { - /* TODO - for now only allow broken for TCG */ - error_setg(errp, -"Requested safe cache capability level not supported by tcg, try a different value for cap-cfpc"); + /* TCG only supports broken, allow other values and print a warning */ + error_setg(&local_err, + "TCG doesn't support requested feature, cap-cfpc=%s", + cap_cfpc_possible.vals[val]); } else if (kvm_enabled() && (val > kvm_val)) { error_setg(errp, "Requested safe cache capability level not supported by kvm, try cap-cfpc=%s", cap_cfpc_possible.vals[kvm_val]); } + + if (local_err != NULL) + warn_report_err(local_err); } sPAPRCapPossible cap_sbbc_possible = { @@ -262,17 +268,22 @@ sPAPRCapPossible cap_sbbc_possible = { static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { + Error *local_err = NULL; uint8_t kvm_val = kvmppc_get_cap_safe_bounds_check(); if (tcg_enabled() && val) { - /* TODO - for now only allow broken for TCG */ - error_setg(errp, -"Requested safe bounds check capability level not supported by tcg, try a different value for cap-sbbc"); + /* TCG only supports broken, allow other values and print a warning */ + error_setg(&local_err, + "TCG doesn't support requested feature, cap-sbbc=%s", + cap_sbbc_possible.vals[val]); } else if (kvm_enabled() && (val > kvm_val)) { error_setg(errp, "Requested safe bounds check capability level not supported by kvm, try cap-sbbc=%s", cap_sbbc_possible.vals[kvm_val]); } + + if (local_err != NULL) + warn_report_err(local_err); } sPAPRCapPossible cap_ibs_possible = { @@ -288,17 +299,23 @@ sPAPRCapPossible cap_ibs_possible = { static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { + Error *local_err = NULL; uint8_t kvm_val = kvmppc_get_cap_safe_indirect_branch(); if (tcg_enabled() && val) { - /* TODO - for now only allow broken for TCG */ - error_setg(errp, -"Requested safe indirect branch capability level not supported by tcg, try a different value for cap-ibs"); + /* TCG only supports broken, allow other values and print a warning */ + error_setg(&local_err, + "TCG doesn't support requested feature, cap-ibs=%s", + cap_ibs_possible.vals[val]); } else if (kvm_enabled() && (val > kvm_val)) { error_setg(errp, "Requested safe indirect branch capability level not supported by kvm, try cap-ibs=%s", cap_ibs_possible.vals[kvm_val]); } + + if (local_err != NULL) { + warn_report_err(local_err); + } } #define VALUE_DESC_TRISTATE " (broken, workaround, fixed)" From patchwork Tue Mar 12 08:52:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848923 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 27A90139A for ; Tue, 12 Mar 2019 09:37:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 15C3E28CE8 for ; Tue, 12 Mar 2019 09:37:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0A52929516; Tue, 12 Mar 2019 09:37:46 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A4E3F28CE8 for ; Tue, 12 Mar 2019 09:37:45 +0000 (UTC) Received: from localhost ([127.0.0.1]:48234 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dqz-0005jc-1c for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:37:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52529) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dT3-0007iw-U0 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dJu-0008DF-2m for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:03:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43872) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dJt-00086J-Pw; Tue, 12 Mar 2019 05:03:33 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AA70F3DDB8; Tue, 12 Mar 2019 08:54:00 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id AC2B76015A; Tue, 12 Mar 2019 08:53:56 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:26 +1100 Message-Id: <20190312085316.8054-13-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 12 Mar 2019 08:54:00 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 12/62] target/ppc/spapr: Enable mitigations by default for pseries-4.0 machine type X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh There are currently 3 mitigations the availability of which is controlled by the spapr-caps mechanism, cap-cfpc, cap-sbbc, and cap-ibs. Enable these mitigations by default for the pseries-4.0 machine type. By now machine firmware should have been upgraded to allow these settings. Signed-off-by: Suraj Jitindar Singh Message-Id: <20190301044609.9626-3-sjitindarsingh@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 37fd7a1411..946bbcf9ee 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -4307,9 +4307,9 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_VSX] = SPAPR_CAP_ON; smc->default_caps.caps[SPAPR_CAP_DFP] = SPAPR_CAP_ON; - smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN; - smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN; - smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_WORKAROUND; + smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_WORKAROUND; + smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_WORKAROUND; smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */ smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON; @@ -4389,6 +4389,9 @@ static void spapr_machine_3_1_class_options(MachineClass *mc) mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power8_v2.0"); smc->update_dt_enabled = false; smc->dr_phb_enabled = false; + smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF; } From patchwork Tue Mar 12 08:52:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848995 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7821713B5 for ; Tue, 12 Mar 2019 10:03:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6882B2861E for ; Tue, 12 Mar 2019 10:03:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5C92D2952C; Tue, 12 Mar 2019 10:03:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 0B9002861E for ; Tue, 12 Mar 2019 10:03:31 +0000 (UTC) Received: from localhost ([127.0.0.1]:48701 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eFu-00020P-Bs for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:03:30 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52365) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTu-0007RC-8k for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dJF-0007V9-Mb for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:02:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49944) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dJD-0007PG-UN; Tue, 12 Mar 2019 05:02:52 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9828459445; Tue, 12 Mar 2019 08:54:03 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3D75E60152; Tue, 12 Mar 2019 08:54:00 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:27 +1100 Message-Id: <20190312085316.8054-14-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 12 Mar 2019 08:54:03 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 13/62] target/ppc: Move exception vector offset computation into a function X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Fabiano Rosas Signed-off-by: Fabiano Rosas Reviewed-by: Alexey Kardashevskiy Message-Id: <20190228225759.21328-2-farosas@linux.ibm.com> Signed-off-by: David Gibson --- target/ppc/excp_helper.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index 39bedbb11d..beafcf1ebd 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -107,6 +107,24 @@ static int powerpc_reset_wakeup(CPUState *cs, CPUPPCState *env, int excp, return POWERPC_EXCP_RESET; } +static uint64_t ppc_excp_vector_offset(CPUState *cs, int ail) +{ + uint64_t offset = 0; + + switch (ail) { + case AIL_0001_8000: + offset = 0x18000; + break; + case AIL_C000_0000_0000_4000: + offset = 0xc000000000004000ull; + break; + default: + cpu_abort(cs, "Invalid AIL combination %d\n", ail); + break; + } + + return offset; +} /* Note that this function should be greatly optimized * when called with a constant excp, from ppc_hw_interrupt @@ -708,17 +726,7 @@ static inline void powerpc_excp(PowerPCCPU *cpu, int excp_model, int excp) /* Handle AIL */ if (ail) { new_msr |= (1 << MSR_IR) | (1 << MSR_DR); - switch(ail) { - case AIL_0001_8000: - vector |= 0x18000; - break; - case AIL_C000_0000_0000_4000: - vector |= 0xc000000000004000ull; - break; - default: - cpu_abort(cs, "Invalid AIL combination %d\n", ail); - break; - } + vector |= ppc_excp_vector_offset(cs, ail); } #if defined(TARGET_PPC64) From patchwork Tue Mar 12 08:52:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849043 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5E87B13B5 for ; Tue, 12 Mar 2019 10:27:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4D7EA2945A for ; Tue, 12 Mar 2019 10:27:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 410AD294F9; Tue, 12 Mar 2019 10:27:31 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id CBA0B2945A for ; Tue, 12 Mar 2019 10:27:30 +0000 (UTC) Received: from localhost ([127.0.0.1]:49125 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3ed8-00065k-5f for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:27:30 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53335) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dU8-00005V-J7 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dGY-0005RV-5T for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:00:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42358) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dGX-0005Qi-U3; Tue, 12 Mar 2019 05:00:06 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8CA60C04BE0C; Tue, 12 Mar 2019 08:54:06 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2A5FE6013E; Tue, 12 Mar 2019 08:54:03 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:28 +1100 Message-Id: <20190312085316.8054-15-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 12 Mar 2019 08:54:06 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 14/62] target/ppc: Move handling of hardware breakpoints to a separate function X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Fabiano Rosas This is in preparation for a refactoring of the kvm_handle_debug function in the next patch. Signed-off-by: Fabiano Rosas Message-Id: <20190228225759.21328-4-farosas@linux.ibm.com> Signed-off-by: David Gibson --- target/ppc/kvm.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 1da28039a8..a54fb9f0a8 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -1597,35 +1597,44 @@ void kvm_arch_update_guest_debug(CPUState *cs, struct kvm_guest_debug *dbg) } } +static int kvm_handle_hw_breakpoint(CPUState *cs, + struct kvm_debug_exit_arch *arch_info) +{ + int handle = 0; + int n; + int flag = 0; + + if (nb_hw_breakpoint + nb_hw_watchpoint > 0) { + if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { + n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW); + if (n >= 0) { + handle = 1; + } + } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | + KVMPPC_DEBUG_WATCH_WRITE)) { + n = find_hw_watchpoint(arch_info->address, &flag); + if (n >= 0) { + handle = 1; + cs->watchpoint_hit = &hw_watchpoint; + hw_watchpoint.vaddr = hw_debug_points[n].addr; + hw_watchpoint.flags = flag; + } + } + } + return handle; +} + static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run) { CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; struct kvm_debug_exit_arch *arch_info = &run->debug.arch; int handle = 0; - int n; - int flag = 0; if (cs->singlestep_enabled) { handle = 1; } else if (arch_info->status) { - if (nb_hw_breakpoint + nb_hw_watchpoint > 0) { - if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { - n = find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW); - if (n >= 0) { - handle = 1; - } - } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | - KVMPPC_DEBUG_WATCH_WRITE)) { - n = find_hw_watchpoint(arch_info->address, &flag); - if (n >= 0) { - handle = 1; - cs->watchpoint_hit = &hw_watchpoint; - hw_watchpoint.vaddr = hw_debug_points[n].addr; - hw_watchpoint.flags = flag; - } - } - } + handle = kvm_handle_hw_breakpoint(cs, arch_info); } else if (kvm_find_sw_breakpoint(cs, arch_info->address)) { handle = 1; } else { From patchwork Tue Mar 12 08:52:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849023 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 314C91669 for ; Tue, 12 Mar 2019 10:14:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1FBEB28E8B for ; Tue, 12 Mar 2019 10:14:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1338828F23; Tue, 12 Mar 2019 10:14:07 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 9062128E8B for ; Tue, 12 Mar 2019 10:14:06 +0000 (UTC) Received: from localhost ([127.0.0.1]:48873 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eQ9-0003WS-SJ for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:14:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52411) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUG-0007ay-UI for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dFf-00049V-2C for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:59:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59358) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dFe-00047h-Ql; Tue, 12 Mar 2019 04:59:11 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 74A4E8552E; Tue, 12 Mar 2019 08:54:09 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 22D376013E; Tue, 12 Mar 2019 08:54:06 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:29 +1100 Message-Id: <20190312085316.8054-16-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 12 Mar 2019 08:54:09 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 15/62] target/ppc: Refactor kvm_handle_debug X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Fabiano Rosas There are four scenarios being handled in this function: - single stepping - hardware breakpoints - software breakpoints - fallback (no debug supported) A future patch will add code to handle specific single step and software breakpoints cases so let's split each scenario into its own function now to avoid hurting readability. Signed-off-by: Fabiano Rosas Reviewed-by: Alexey Kardashevskiy Message-Id: <20190228225759.21328-5-farosas@linux.ibm.com> Signed-off-by: David Gibson --- target/ppc/kvm.c | 86 ++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index a54fb9f0a8..4a79a75f63 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -1624,52 +1624,66 @@ static int kvm_handle_hw_breakpoint(CPUState *cs, return handle; } +static int kvm_handle_singlestep(void) +{ + return 1; +} + +static int kvm_handle_sw_breakpoint(void) +{ + return 1; +} + static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run) { CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; struct kvm_debug_exit_arch *arch_info = &run->debug.arch; - int handle = 0; if (cs->singlestep_enabled) { - handle = 1; - } else if (arch_info->status) { - handle = kvm_handle_hw_breakpoint(cs, arch_info); - } else if (kvm_find_sw_breakpoint(cs, arch_info->address)) { - handle = 1; - } else { - /* QEMU is not able to handle debug exception, so inject - * program exception to guest; - * Yes program exception NOT debug exception !! - * When QEMU is using debug resources then debug exception must - * be always set. To achieve this we set MSR_DE and also set - * MSRP_DEP so guest cannot change MSR_DE. - * When emulating debug resource for guest we want guest - * to control MSR_DE (enable/disable debug interrupt on need). - * Supporting both configurations are NOT possible. - * So the result is that we cannot share debug resources - * between QEMU and Guest on BOOKE architecture. - * In the current design QEMU gets the priority over guest, - * this means that if QEMU is using debug resources then guest - * cannot use them; - * For software breakpoint QEMU uses a privileged instruction; - * So there cannot be any reason that we are here for guest - * set debug exception, only possibility is guest executed a - * privileged / illegal instruction and that's why we are - * injecting a program interrupt. - */ + return kvm_handle_singlestep(); + } - cpu_synchronize_state(cs); - /* env->nip is PC, so increment this by 4 to use - * ppc_cpu_do_interrupt(), which set srr0 = env->nip - 4. - */ - env->nip += 4; - cs->exception_index = POWERPC_EXCP_PROGRAM; - env->error_code = POWERPC_EXCP_INVAL; - ppc_cpu_do_interrupt(cs); + if (arch_info->status) { + return kvm_handle_hw_breakpoint(cs, arch_info); } - return handle; + if (kvm_find_sw_breakpoint(cs, arch_info->address)) { + return kvm_handle_sw_breakpoint(); + } + + /* + * QEMU is not able to handle debug exception, so inject + * program exception to guest; + * Yes program exception NOT debug exception !! + * When QEMU is using debug resources then debug exception must + * be always set. To achieve this we set MSR_DE and also set + * MSRP_DEP so guest cannot change MSR_DE. + * When emulating debug resource for guest we want guest + * to control MSR_DE (enable/disable debug interrupt on need). + * Supporting both configurations are NOT possible. + * So the result is that we cannot share debug resources + * between QEMU and Guest on BOOKE architecture. + * In the current design QEMU gets the priority over guest, + * this means that if QEMU is using debug resources then guest + * cannot use them; + * For software breakpoint QEMU uses a privileged instruction; + * So there cannot be any reason that we are here for guest + * set debug exception, only possibility is guest executed a + * privileged / illegal instruction and that's why we are + * injecting a program interrupt. + */ + cpu_synchronize_state(cs); + /* + * env->nip is PC, so increment this by 4 to use + * ppc_cpu_do_interrupt(), which set srr0 = env->nip - 4. + */ + env->nip += 4; + cs->exception_index = POWERPC_EXCP_PROGRAM; + env->error_code = POWERPC_EXCP_INVAL; + ppc_cpu_do_interrupt(cs); + + return 0; } int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run) From patchwork Tue Mar 12 08:52:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849031 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3776017DF for ; Tue, 12 Mar 2019 10:18:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1485B293FF for ; Tue, 12 Mar 2019 10:18:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 03A802953A; Tue, 12 Mar 2019 10:18:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,FUZZY_SAVINGS, HTML_SINGLET_MANY,LOTS_OF_MONEY,MAILING_LIST_MULTI,NORMAL_HTTP_TO_IP autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7B613293FF for ; Tue, 12 Mar 2019 10:18:06 +0000 (UTC) Received: from localhost ([127.0.0.1]:48953 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eU1-0006qb-G7 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:18:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:55228) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dYr-0004kV-30 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:19:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dIS-0006uJ-JS for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:02:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48456) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dIR-0006tG-RG; Tue, 12 Mar 2019 05:02:04 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 34D2281127; Tue, 12 Mar 2019 08:54:19 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0A1336013E; Tue, 12 Mar 2019 08:54:09 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:30 +1100 Message-Id: <20190312085316.8054-17-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 12 Mar 2019 08:54:19 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 16/62] PPC: E500: Update u-boot to v2019.01 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Alexander Graf Quite a while has passed since we last updated U-Boot for e500. This patch bumps it to the last released version 2019.01 to make sure users don't feel like they're using out of date software. Signed-off-by: Alexander Graf Message-Id: <20190304103930.16319-1-agraf@csgraf.de> Signed-off-by: David Gibson --- pc-bios/u-boot.e500 | Bin 388672 -> 349148 bytes roms/u-boot | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pc-bios/u-boot.e500 b/pc-bios/u-boot.e500 index 25537f8fe35f1a3f559544d43274b4fb80b572e9..732660f348f6123d24144ee29ef38611428dc2d9 100644 GIT binary patch literal 349148 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�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

cULUbAe`rToX#%6E% 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%0A@F;Ey9=?i>|i3=me4EVi7lzi-l`SzeU=& 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 diff --git a/roms/u-boot b/roms/u-boot index d85ca029f2..d3689267f9 160000 --- a/roms/u-boot +++ b/roms/u-boot @@ -1 +1 @@ -Subproject commit d85ca029f257b53a96da6c2fb421e78a003a9943 +Subproject commit d3689267f92c5956e09cc7d1baa4700141662bff From patchwork Tue Mar 12 08:52:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848931 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9D04E139A for ; Tue, 12 Mar 2019 09:41:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8C28229529 for ; Tue, 12 Mar 2019 09:41:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 80A012952D; Tue, 12 Mar 2019 09:41:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1E38029529 for ; Tue, 12 Mar 2019 09:41:03 +0000 (UTC) Received: from localhost ([127.0.0.1]:48334 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3duA-0000HT-82 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:41:02 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52365) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTp-0007RC-S4 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dKE-00007D-1L for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:03:59 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49092) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dKD-00006d-Pt; Tue, 12 Mar 2019 05:03:53 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C5B863082E05; Tue, 12 Mar 2019 08:54:23 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id BF5116015B; Tue, 12 Mar 2019 08:54:20 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:31 +1100 Message-Id: <20190312085316.8054-18-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Tue, 12 Mar 2019 08:54:23 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 17/62] target/ppc/spapr: Clear partition table entry when allocating hash table X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh If we allocate a hash page table then we know that the guest won't be using process tables, so set the partition table entry maintained for the guest to zero. If this isn't done, then the guest radix bit will remain set in the entry. This means that when the guest calls H_REGISTER_PROCESS_TABLE there will be a mismatch between then flags and the value in spapr->patb_entry, and the call will fail. The guest will then panic: Failed to register process table (rc=-4) kernel BUG at arch/powerpc/platforms/pseries/lpar.c:959 The result being that it isn't possible to boot a hash guest on a P9 system. Also fix a bug in the flags parsing in h_register_process_table() which was introduced by the same patch, and simplify the handling to make it less likely that errors will be introduced in the future. The effect would have been setting the host radix bit LPCR_HR for a hash guest using process tables, which currently isn't supported and so couldn't have been triggered. Fixes: 00fd075e18 "target/ppc/spapr: Set LPCR:HR when using Radix mode" Signed-off-by: Suraj Jitindar Singh Message-Id: <20190305022102.17610-1-sjitindarsingh@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 1 + hw/ppc/spapr_hcall.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 946bbcf9ee..755056875c 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1632,6 +1632,7 @@ void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift, } } /* We're setting up a hash table, so that means we're not radix */ + spapr->patb_entry = 0; spapr_set_all_lpcrs(0, LPCR_HR | LPCR_UPRT); } diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 15bdd30a12..50af3c0a62 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1339,6 +1339,7 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu, target_ulong proc_tbl = args[1]; target_ulong page_size = args[2]; target_ulong table_size = args[3]; + target_ulong update_lpcr = 0; uint64_t cproc; if (flags & ~FLAGS_MASK) { /* Check no reserved bits are set */ @@ -1394,10 +1395,13 @@ static target_ulong h_register_process_table(PowerPCCPU *cpu, spapr->patb_entry = cproc; /* Save new process table */ /* Update the UPRT, HR and GTSE bits in the LPCR for all cpus */ - spapr_set_all_lpcrs(((flags & (FLAG_RADIX | FLAG_HASH_PROC_TBL)) ? - (LPCR_UPRT | LPCR_HR) : 0) | - ((flags & FLAG_GTSE) ? LPCR_GTSE : 0), - LPCR_UPRT | LPCR_HR | LPCR_GTSE); + if (flags & FLAG_RADIX) /* Radix must use process tables, also set HR */ + update_lpcr |= (LPCR_UPRT | LPCR_HR); + else if (flags & FLAG_HASH_PROC_TBL) /* Hash with process tables */ + update_lpcr |= LPCR_UPRT; + if (flags & FLAG_GTSE) /* Guest translation shootdown enable */ + update_lpcr |= FLAG_GTSE; + spapr_set_all_lpcrs(update_lpcr, LPCR_UPRT | LPCR_HR | LPCR_GTSE); if (kvm_enabled()) { return kvmppc_configure_v3_mmu(cpu, flags & FLAG_RADIX, From patchwork Tue Mar 12 08:52:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848977 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6D2F41850 for ; Tue, 12 Mar 2019 09:54:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5A5862859E for ; Tue, 12 Mar 2019 09:54:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4DED72955F; Tue, 12 Mar 2019 09:54:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id F067C2859E for ; Tue, 12 Mar 2019 09:54:42 +0000 (UTC) Received: from localhost ([127.0.0.1]:48534 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3e7O-00034B-7a for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:54:42 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52365) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dU2-0007RC-Ms for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dHc-0006KZ-T8 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:01:18 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52452) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dHc-0006KA-MC; Tue, 12 Mar 2019 05:01:12 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C89CC3082B3F; Tue, 12 Mar 2019 08:54:27 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5364E6013E; Tue, 12 Mar 2019 08:54:24 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:32 +1100 Message-Id: <20190312085316.8054-19-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Tue, 12 Mar 2019 08:54:27 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 18/62] spapr: Force SPAPR_MEMORY_BLOCK_SIZE to be a hwaddr (64-bit) X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: David Gibson SPAPR_MEMORY_BLOCK_SIZE is logically a difference in memory addresses, and hence of type hwaddr which is 64-bit. Previously it wasn't marked as such which means that it could be treated as 32-bit. That will work in some circumstances but if multiplied by another 32-bit value it could lead to a 32-bit overflow and an incorrect result. One specific instance of this in spapr_lmb_dt_populate() was spotted by Coverity (CID 1399145). Reported-by: Peter Maydell Signed-off-by: David Gibson --- include/hw/ppc/spapr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index ff1bd60615..1311ebe28e 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -792,7 +792,7 @@ int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset); #define TYPE_SPAPR_RNG "spapr-rng" -#define SPAPR_MEMORY_BLOCK_SIZE (1 << 28) /* 256MB */ +#define SPAPR_MEMORY_BLOCK_SIZE ((hwaddr)1 << 28) /* 256MB */ /* * This defines the maximum number of DIMM slots we can have for sPAPR From patchwork Tue Mar 12 08:52:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849027 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5DD2917DF for ; Tue, 12 Mar 2019 10:16:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4DE6529505 for ; Tue, 12 Mar 2019 10:16:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 41D2A29545; Tue, 12 Mar 2019 10:16:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id CF9B629505 for ; Tue, 12 Mar 2019 10:16:46 +0000 (UTC) Received: from localhost ([127.0.0.1]:48941 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eSj-0005ty-Te for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:16:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52436) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTu-0007dG-JX for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dJ9-0007Q0-Uq for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:02:51 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38302) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dJ6-0007NY-2e; Tue, 12 Mar 2019 05:02:45 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E7A3981DF5; Tue, 12 Mar 2019 08:54:31 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 556886013E; Tue, 12 Mar 2019 08:54:28 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:33 +1100 Message-Id: <20190312085316.8054-20-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 12 Mar 2019 08:54:32 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 19/62] target/ppc/spapr: Enable H_PAGE_INIT in-kernel handling X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Suraj Jitindar Singh The H_CALL H_PAGE_INIT can be used to zero or copy a page of guest memory. Enable the in-kernel H_PAGE_INIT handler. The in-kernel handler takes half the time to complete compared to handling the H_CALL in userspace. Signed-off-by: Suraj Jitindar Singh Message-Id: <20190306060608.19935-1-sjitindarsingh@gmail.com> Signed-off-by: David Gibson --- hw/ppc/spapr.c | 3 +++ target/ppc/kvm.c | 5 +++++ target/ppc/kvm_ppc.h | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 755056875c..e764e89806 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -2822,6 +2822,9 @@ static void spapr_machine_init(MachineState *machine) /* H_CLEAR_MOD/_REF are mandatory in PAPR, but off by default */ kvmppc_enable_clear_ref_mod_hcalls(); + + /* Enable H_PAGE_INIT */ + kvmppc_enable_h_page_init(); } /* allocate RAM */ diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 4a79a75f63..1c0a586ea8 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -2044,6 +2044,11 @@ void kvmppc_enable_clear_ref_mod_hcalls(void) kvmppc_enable_hcall(kvm_state, H_CLEAR_MOD); } +void kvmppc_enable_h_page_init(void) +{ + kvmppc_enable_hcall(kvm_state, H_PAGE_INIT); +} + void kvmppc_set_papr(PowerPCCPU *cpu) { CPUState *cs = CPU(cpu); diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index 2937b36cae..2c2ea30e87 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -23,6 +23,7 @@ int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level); void kvmppc_enable_logical_ci_hcalls(void); void kvmppc_enable_set_mode_hcall(void); void kvmppc_enable_clear_ref_mod_hcalls(void); +void kvmppc_enable_h_page_init(void); void kvmppc_set_papr(PowerPCCPU *cpu); int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr); void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy); @@ -138,6 +139,10 @@ static inline void kvmppc_enable_clear_ref_mod_hcalls(void) { } +static inline void kvmppc_enable_h_page_init(void) +{ +} + static inline void kvmppc_set_papr(PowerPCCPU *cpu) { } From patchwork Tue Mar 12 08:52:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848989 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D400F6C2 for ; Tue, 12 Mar 2019 10:00:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C44D129549 for ; Tue, 12 Mar 2019 10:00:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B8A322954A; Tue, 12 Mar 2019 10:00:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 8C05F2861E for ; Tue, 12 Mar 2019 10:00:04 +0000 (UTC) Received: from localhost ([127.0.0.1]:48629 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eCZ-0007jG-R5 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:00:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTq-0008KY-BY for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dKE-000076-0S for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:03:57 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49086) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dKD-00006b-OQ; Tue, 12 Mar 2019 05:03:53 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DF4673082E5F; Tue, 12 Mar 2019 08:54:34 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 79CA96013E; Tue, 12 Mar 2019 08:54:32 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:34 +1100 Message-Id: <20190312085316.8054-21-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Tue, 12 Mar 2019 08:54:34 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 20/62] PPC: E500: Add FSL I2C controller and integrate RTC with it X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Andrew Randrianasulu Original commit message: This patch adds an emulation model for i2c controller found on most of the FSL SoCs. It also integrates the RTC (ds1338) that sits on the i2c Bus with e500 machine model. Patch was originally written by Amit Singh Tomar see http://patchwork.ozlabs.org/patch/431475/ I only fixed it enough for application on top of current qemu master 20b084c4b1401b7f8fbc385649d48c67b6f43d44, and hopefully fixed checkpatch errors Tested by booting Linux kernel 4.20.12. Now e500 machine doesn't need network time protocol daemon because it will have working RTC (before all timestamps on files were from 2016) Signed-off-by: Amit Singh Tomar Signed-off-by: Andrew Randrianasulu Message-Id: <20190306102812.28972-1-randrianasulu@gmail.com> [dwg: Add Kconfig stanza to define the new symbol, update MAINTAINERS] Signed-off-by: David Gibson --- MAINTAINERS | 1 + default-configs/ppc-softmmu.mak | 2 + hw/i2c/Kconfig | 4 + hw/i2c/Makefile.objs | 1 + hw/i2c/mpc_i2c.c | 357 ++++++++++++++++++++++++++++++++ hw/ppc/e500.c | 54 +++++ 6 files changed, 419 insertions(+) create mode 100644 hw/i2c/mpc_i2c.c diff --git a/MAINTAINERS b/MAINTAINERS index cf09a4c127..d326756079 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -984,6 +984,7 @@ L: qemu-ppc@nongnu.org S: Odd Fixes F: hw/ppc/e500* F: hw/gpio/mpc8xxx.c +F: hw/i2c/mpc_i2c.c F: hw/net/fsl_etsec/ F: hw/pci-host/ppce500.c F: include/hw/ppc/ppc_e500.h diff --git a/default-configs/ppc-softmmu.mak b/default-configs/ppc-softmmu.mak index 6ea36d4090..bf86128a0c 100644 --- a/default-configs/ppc-softmmu.mak +++ b/default-configs/ppc-softmmu.mak @@ -1,6 +1,8 @@ # Default configuration for ppc-softmmu # For embedded PPCs: +CONFIG_MPC_I2C=y +CONFIG_DS1338=y CONFIG_E500=y CONFIG_PPC405=y CONFIG_PPC440=y diff --git a/hw/i2c/Kconfig b/hw/i2c/Kconfig index ef1caa6d89..820b24de5b 100644 --- a/hw/i2c/Kconfig +++ b/hw/i2c/Kconfig @@ -25,3 +25,7 @@ config BITBANG_I2C config IMX_I2C bool select I2C + +config MPC_I2C + bool + select I2C diff --git a/hw/i2c/Makefile.objs b/hw/i2c/Makefile.objs index 2a3c106551..5f76b6a990 100644 --- a/hw/i2c/Makefile.objs +++ b/hw/i2c/Makefile.objs @@ -9,5 +9,6 @@ common-obj-$(CONFIG_EXYNOS4) += exynos4210_i2c.o common-obj-$(CONFIG_IMX_I2C) += imx_i2c.o common-obj-$(CONFIG_ASPEED_SOC) += aspeed_i2c.o common-obj-$(CONFIG_NRF51_SOC) += microbit_i2c.o +common-obj-$(CONFIG_MPC_I2C) += mpc_i2c.o obj-$(CONFIG_OMAP) += omap_i2c.o obj-$(CONFIG_PPC4XX) += ppc4xx_i2c.o diff --git a/hw/i2c/mpc_i2c.c b/hw/i2c/mpc_i2c.c new file mode 100644 index 0000000000..693ca7ef6b --- /dev/null +++ b/hw/i2c/mpc_i2c.c @@ -0,0 +1,357 @@ +/* + * Copyright (C) 2014 Freescale Semiconductor, Inc. All rights reserved. + * + * Author: Amit Tomar, + * + * Description: + * This file is derived from IMX I2C controller, + * by Jean-Christophe DUBOIS . + * + * Thanks to Scott Wood and Alexander Graf for their kind help on this. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2 or later, + * as published by the Free Software Foundation. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include "qemu/osdep.h" +#include "hw/i2c/i2c.h" +#include "qemu/log.h" +#include "hw/sysbus.h" + +/* #define DEBUG_I2C */ + +#ifdef DEBUG_I2C +#define DPRINTF(fmt, ...) \ + do { fprintf(stderr, "mpc_i2c[%s]: " fmt, __func__, ## __VA_ARGS__); \ + } while (0) +#else +#define DPRINTF(fmt, ...) do {} while (0) +#endif + +#define TYPE_MPC_I2C "mpc-i2c" +#define MPC_I2C(obj) \ + OBJECT_CHECK(MPCI2CState, (obj), TYPE_MPC_I2C) + +#define MPC_I2C_ADR 0x00 +#define MPC_I2C_FDR 0x04 +#define MPC_I2C_CR 0x08 +#define MPC_I2C_SR 0x0c +#define MPC_I2C_DR 0x10 +#define MPC_I2C_DFSRR 0x14 + +#define CCR_MEN (1 << 7) +#define CCR_MIEN (1 << 6) +#define CCR_MSTA (1 << 5) +#define CCR_MTX (1 << 4) +#define CCR_TXAK (1 << 3) +#define CCR_RSTA (1 << 2) +#define CCR_BCST (1 << 0) + +#define CSR_MCF (1 << 7) +#define CSR_MAAS (1 << 6) +#define CSR_MBB (1 << 5) +#define CSR_MAL (1 << 4) +#define CSR_SRW (1 << 2) +#define CSR_MIF (1 << 1) +#define CSR_RXAK (1 << 0) + +#define CADR_MASK 0xFE +#define CFDR_MASK 0x3F +#define CCR_MASK 0xFC +#define CSR_MASK 0xED +#define CDR_MASK 0xFF + +#define CYCLE_RESET 0xFF + +typedef struct MPCI2CState { + SysBusDevice parent_obj; + + I2CBus *bus; + qemu_irq irq; + MemoryRegion iomem; + + uint8_t address; + uint8_t adr; + uint8_t fdr; + uint8_t cr; + uint8_t sr; + uint8_t dr; + uint8_t dfssr; +} MPCI2CState; + +static bool mpc_i2c_is_enabled(MPCI2CState *s) +{ + return s->cr & CCR_MEN; +} + +static bool mpc_i2c_is_master(MPCI2CState *s) +{ + return s->cr & CCR_MSTA; +} + +static bool mpc_i2c_direction_is_tx(MPCI2CState *s) +{ + return s->cr & CCR_MTX; +} + +static bool mpc_i2c_irq_pending(MPCI2CState *s) +{ + return s->sr & CSR_MIF; +} + +static bool mpc_i2c_irq_is_enabled(MPCI2CState *s) +{ + return s->cr & CCR_MIEN; +} + +static void mpc_i2c_reset(DeviceState *dev) +{ + MPCI2CState *i2c = MPC_I2C(dev); + + i2c->address = 0xFF; + i2c->adr = 0x00; + i2c->fdr = 0x00; + i2c->cr = 0x00; + i2c->sr = 0x81; + i2c->dr = 0x00; +} + +static void mpc_i2c_irq(MPCI2CState *s) +{ + bool irq_active = false; + + if (mpc_i2c_is_enabled(s) && mpc_i2c_irq_is_enabled(s) + && mpc_i2c_irq_pending(s)) { + irq_active = true; + } + + if (irq_active) { + qemu_irq_raise(s->irq); + } else { + qemu_irq_lower(s->irq); + } +} + +static void mpc_i2c_soft_reset(MPCI2CState *s) +{ + /* This is a soft reset. ADR is preserved during soft resets */ + uint8_t adr = s->adr; + mpc_i2c_reset(DEVICE(s)); + s->adr = adr; +} + +static void mpc_i2c_address_send(MPCI2CState *s) +{ + /* if returns non zero slave address is not right */ + if (i2c_start_transfer(s->bus, s->dr >> 1, s->dr & (0x01))) { + s->sr |= CSR_RXAK; + } else { + s->address = s->dr; + s->sr &= ~CSR_RXAK; + s->sr |= CSR_MCF; /* Set after Byte Transfer is completed */ + s->sr |= CSR_MIF; /* Set after Byte Transfer is completed */ + mpc_i2c_irq(s); + } +} + +static void mpc_i2c_data_send(MPCI2CState *s) +{ + if (i2c_send(s->bus, s->dr)) { + /* End of transfer */ + s->sr |= CSR_RXAK; + i2c_end_transfer(s->bus); + } else { + s->sr &= ~CSR_RXAK; + s->sr |= CSR_MCF; /* Set after Byte Transfer is completed */ + s->sr |= CSR_MIF; /* Set after Byte Transfer is completed */ + mpc_i2c_irq(s); + } +} + +static void mpc_i2c_data_recive(MPCI2CState *s) +{ + int ret; + /* get the next byte */ + ret = i2c_recv(s->bus); + if (ret >= 0) { + s->sr |= CSR_MCF; /* Set after Byte Transfer is completed */ + s->sr |= CSR_MIF; /* Set after Byte Transfer is completed */ + mpc_i2c_irq(s); + } else { + DPRINTF("read failed for device"); + ret = 0xff; + } + s->dr = ret; +} + +static uint64_t mpc_i2c_read(void *opaque, hwaddr addr, unsigned size) +{ + MPCI2CState *s = opaque; + uint8_t value; + + switch (addr) { + case MPC_I2C_ADR: + value = s->adr; + break; + case MPC_I2C_FDR: + value = s->fdr; + break; + case MPC_I2C_CR: + value = s->cr; + break; + case MPC_I2C_SR: + value = s->sr; + break; + case MPC_I2C_DR: + value = s->dr; + if (mpc_i2c_is_master(s)) { /* master mode */ + if (mpc_i2c_direction_is_tx(s)) { + DPRINTF("MTX is set not in recv mode\n"); + } else { + mpc_i2c_data_recive(s); + } + } + break; + default: + value = 0; + DPRINTF("ERROR: Bad read addr 0x%x\n", (unsigned int)addr); + break; + } + + DPRINTF("%s: addr " TARGET_FMT_plx " %02" PRIx32 "\n", __func__, + addr, value); + return (uint64_t)value; +} + +static void mpc_i2c_write(void *opaque, hwaddr addr, + uint64_t value, unsigned size) +{ + MPCI2CState *s = opaque; + + DPRINTF("%s: addr " TARGET_FMT_plx " val %08" PRIx64 "\n", __func__, + addr, value); + switch (addr) { + case MPC_I2C_ADR: + s->adr = value & CADR_MASK; + break; + case MPC_I2C_FDR: + s->fdr = value & CFDR_MASK; + break; + case MPC_I2C_CR: + if (mpc_i2c_is_enabled(s) && ((value & CCR_MEN) == 0)) { + mpc_i2c_soft_reset(s); + break; + } + /* normal write */ + s->cr = value & CCR_MASK; + if (mpc_i2c_is_master(s)) { /* master mode */ + /* set the bus to busy after master is set as per RM */ + s->sr |= CSR_MBB; + } else { + /* bus is not busy anymore */ + s->sr &= ~CSR_MBB; + /* Reset the address for fresh write/read cycle */ + if (s->address != CYCLE_RESET) { + i2c_end_transfer(s->bus); + s->address = CYCLE_RESET; + } + } + /* For restart end the onging transfer */ + if (s->cr & CCR_RSTA) { + if (s->address != CYCLE_RESET) { + s->address = CYCLE_RESET; + i2c_end_transfer(s->bus); + s->cr &= ~CCR_RSTA; + } + } + break; + case MPC_I2C_SR: + s->sr = value & CSR_MASK; + /* Lower the interrupt */ + if (!(s->sr & CSR_MIF) || !(s->sr & CSR_MAL)) { + mpc_i2c_irq(s); + } + break; + case MPC_I2C_DR: + /* if the device is not enabled, nothing to do */ + if (!mpc_i2c_is_enabled(s)) { + break; + } + s->dr = value & CDR_MASK; + if (mpc_i2c_is_master(s)) { /* master mode */ + if (s->address == CYCLE_RESET) { + mpc_i2c_address_send(s); + } else { + mpc_i2c_data_send(s); + } + } + break; + case MPC_I2C_DFSRR: + s->dfssr = value; + break; + default: + DPRINTF("ERROR: Bad write addr 0x%x\n", (unsigned int)addr); + break; + } +} + +static const MemoryRegionOps i2c_ops = { + .read = mpc_i2c_read, + .write = mpc_i2c_write, + .valid.max_access_size = 1, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static const VMStateDescription mpc_i2c_vmstate = { + .name = TYPE_MPC_I2C, + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_UINT8(address, MPCI2CState), + VMSTATE_UINT8(adr, MPCI2CState), + VMSTATE_UINT8(fdr, MPCI2CState), + VMSTATE_UINT8(cr, MPCI2CState), + VMSTATE_UINT8(sr, MPCI2CState), + VMSTATE_UINT8(dr, MPCI2CState), + VMSTATE_UINT8(dfssr, MPCI2CState), + VMSTATE_END_OF_LIST() + } +}; + +static void mpc_i2c_realize(DeviceState *dev, Error **errp) +{ + MPCI2CState *i2c = MPC_I2C(dev); + sysbus_init_irq(SYS_BUS_DEVICE(dev), &i2c->irq); + memory_region_init_io(&i2c->iomem, OBJECT(i2c), &i2c_ops, i2c, + "mpc-i2c", 0x14); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &i2c->iomem); + i2c->bus = i2c_init_bus(DEVICE(dev), "i2c"); +} + +static void mpc_i2c_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->vmsd = &mpc_i2c_vmstate ; + dc->reset = mpc_i2c_reset; + dc->realize = mpc_i2c_realize; + dc->desc = "MPC I2C Controller"; +} + +static const TypeInfo mpc_i2c_type_info = { + .name = TYPE_MPC_I2C, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(MPCI2CState), + .class_init = mpc_i2c_class_init, +}; + +static void mpc_i2c_register_types(void) +{ + type_register_static(&mpc_i2c_type_info); +} + +type_init(mpc_i2c_register_types) diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 7553f674c9..beb2efd694 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -42,6 +42,7 @@ #include "qemu/error-report.h" #include "hw/platform-bus.h" #include "hw/net/fsl_etsec/etsec.h" +#include "hw/i2c/i2c.h" #define EPAPR_MAGIC (0x45504150) #define BINARY_DEVICE_TREE_FILE "mpc8544ds.dtb" @@ -63,7 +64,10 @@ #define MPC8544_PCI_REGS_SIZE 0x1000ULL #define MPC8544_UTIL_OFFSET 0xe0000ULL #define MPC8XXX_GPIO_OFFSET 0x000FF000ULL +#define MPC8544_I2C_REGS_OFFSET 0x3000ULL #define MPC8XXX_GPIO_IRQ 47 +#define MPC8544_I2C_IRQ 43 +#define RTC_REGS_OFFSET 0x68 struct boot_info { @@ -161,6 +165,39 @@ static void create_dt_mpc8xxx_gpio(void *fdt, const char *soc, const char *mpic) g_free(poweroff); } +static void dt_rtc_create(void *fdt, const char *i2c, const char *alias) +{ + int offset = RTC_REGS_OFFSET; + + gchar *rtc = g_strdup_printf("%s/rtc@%"PRIx32, i2c, offset); + qemu_fdt_add_subnode(fdt, rtc); + qemu_fdt_setprop_string(fdt, rtc, "compatible", "pericom,pt7c4338"); + qemu_fdt_setprop_cells(fdt, rtc, "reg", offset); + qemu_fdt_setprop_string(fdt, "/aliases", alias, rtc); + + g_free(rtc); +} + +static void dt_i2c_create(void *fdt, const char *soc, const char *mpic, + const char *alias) +{ + hwaddr mmio0 = MPC8544_I2C_REGS_OFFSET; + int irq0 = MPC8544_I2C_IRQ; + + gchar *i2c = g_strdup_printf("%s/i2c@%"PRIx64, soc, mmio0); + qemu_fdt_add_subnode(fdt, i2c); + qemu_fdt_setprop_string(fdt, i2c, "device_type", "i2c"); + qemu_fdt_setprop_string(fdt, i2c, "compatible", "fsl-i2c"); + qemu_fdt_setprop_cells(fdt, i2c, "reg", mmio0, 0x14); + qemu_fdt_setprop_cells(fdt, i2c, "cell-index", 0); + qemu_fdt_setprop_cells(fdt, i2c, "interrupts", irq0, 0x2); + qemu_fdt_setprop_phandle(fdt, i2c, "interrupt-parent", mpic); + qemu_fdt_setprop_string(fdt, "/aliases", alias, i2c); + + g_free(i2c); +} + + typedef struct PlatformDevtreeData { void *fdt; const char *mpic; @@ -464,6 +501,12 @@ static int ppce500_load_device_tree(PPCE500MachineState *pms, soc, mpic, "serial0", 0, true); } + /* i2c */ + dt_i2c_create(fdt, soc, mpic, "i2c"); + + dt_rtc_create(fdt, "i2c", "rtc"); + + gutil = g_strdup_printf("%s/global-utilities@%llx", soc, MPC8544_UTIL_OFFSET); qemu_fdt_add_subnode(fdt, gutil); @@ -812,6 +855,7 @@ void ppce500_init(MachineState *machine) MemoryRegion *ccsr_addr_space; SysBusDevice *s; PPCE500CCSRState *ccsr; + I2CBus *i2c; irqs = g_new0(IrqLines, smp_cpus); for (i = 0; i < smp_cpus; i++) { @@ -887,6 +931,16 @@ void ppce500_init(MachineState *machine) 0, qdev_get_gpio_in(mpicdev, 42), 399193, serial_hd(1), DEVICE_BIG_ENDIAN); } + /* I2C */ + dev = qdev_create(NULL, "mpc-i2c"); + s = SYS_BUS_DEVICE(dev); + qdev_init_nofail(dev); + sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC8544_I2C_IRQ)); + memory_region_add_subregion(ccsr_addr_space, MPC8544_I2C_REGS_OFFSET, + sysbus_mmio_get_region(s, 0)); + i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c"); + i2c_create_slave(i2c, "ds1338", RTC_REGS_OFFSET); + /* General Utility device */ dev = qdev_create(NULL, "mpc8544-guts"); From patchwork Tue Mar 12 08:52:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848997 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 13F6F1669 for ; Tue, 12 Mar 2019 10:06:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F366A294F9 for ; Tue, 12 Mar 2019 10:06:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E72562952C; Tue, 12 Mar 2019 10:06:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 757BE294F9 for ; Tue, 12 Mar 2019 10:06:36 +0000 (UTC) Received: from localhost ([127.0.0.1]:48761 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eIt-0005Io-D8 for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:06:35 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52365) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTw-0007RC-JZ for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dIS-0006u0-4s for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:02:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:48460) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dIR-0006tH-RU; Tue, 12 Mar 2019 05:02:04 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2D7D781F31; Tue, 12 Mar 2019 08:54:39 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 76D2B6013E; Tue, 12 Mar 2019 08:54:35 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:35 +1100 Message-Id: <20190312085316.8054-22-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 12 Mar 2019 08:54:39 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 21/62] ppc/xive: hardwire the Physical CAM line of the thread context X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Cédric Le Goater By default on P9, the HW CAM line (23bits) is hardwired to : 0x000||0b1||4Bit chip number||7Bit Thread number. When the block group mode is enabled at the controller level (PowerNV), the CAM line is changed for CAM compares to : 4Bit chip number||0x001||7Bit Thread number This will require changes in xive_presenter_tctx_match() possibly. This is a lowlevel functionality of the HW controller and it is not strictly needed. Leave it for later. Signed-off-by: Cédric Le Goater Message-Id: <20190306085032.15744-2-clg@kaod.org> Signed-off-by: David Gibson --- hw/intc/xive.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/hw/intc/xive.c b/hw/intc/xive.c index daa7badc84..b21759c938 100644 --- a/hw/intc/xive.c +++ b/hw/intc/xive.c @@ -1112,6 +1112,30 @@ XiveTCTX *xive_router_get_tctx(XiveRouter *xrtr, CPUState *cs) return xrc->get_tctx(xrtr, cs); } +/* + * By default on P9, the HW CAM line (23bits) is hardwired to : + * + * 0x000||0b1||4Bit chip number||7Bit Thread number. + * + * When the block grouping is enabled, the CAM line is changed to : + * + * 4Bit chip number||0x001||7Bit Thread number. + */ +static uint32_t hw_cam_line(uint8_t chip_id, uint8_t tid) +{ + return 1 << 11 | (chip_id & 0xf) << 7 | (tid & 0x7f); +} + +static bool xive_presenter_tctx_match_hw(XiveTCTX *tctx, + uint8_t nvt_blk, uint32_t nvt_idx) +{ + CPUPPCState *env = &POWERPC_CPU(tctx->cs)->env; + uint32_t pir = env->spr_cb[SPR_PIR].default_value; + + return hw_cam_line((pir >> 8) & 0xf, pir & 0x7f) == + hw_cam_line(nvt_blk, nvt_idx); +} + /* * The thread context register words are in big-endian format. */ @@ -1120,6 +1144,7 @@ static int xive_presenter_tctx_match(XiveTCTX *tctx, uint8_t format, bool cam_ignore, uint32_t logic_serv) { uint32_t cam = xive_nvt_cam_line(nvt_blk, nvt_idx); + uint32_t qw3w2 = xive_tctx_word2(&tctx->regs[TM_QW3_HV_PHYS]); uint32_t qw2w2 = xive_tctx_word2(&tctx->regs[TM_QW2_HV_POOL]); uint32_t qw1w2 = xive_tctx_word2(&tctx->regs[TM_QW1_OS]); uint32_t qw0w2 = xive_tctx_word2(&tctx->regs[TM_QW0_USER]); @@ -1142,7 +1167,11 @@ static int xive_presenter_tctx_match(XiveTCTX *tctx, uint8_t format, /* F=0 & i=0: Specific NVT notification */ - /* TODO (PowerNV) : PHYS ring */ + /* PHYS ring */ + if ((be32_to_cpu(qw3w2) & TM_QW3W2_VT) && + xive_presenter_tctx_match_hw(tctx, nvt_blk, nvt_idx)) { + return TM_QW3_HV_PHYS; + } /* HV POOL ring */ if ((be32_to_cpu(qw2w2) & TM_QW2W2_VP) && From patchwork Tue Mar 12 08:52:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848935 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4D2CD139A for ; Tue, 12 Mar 2019 09:43:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3C1332952A for ; Tue, 12 Mar 2019 09:43:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3066D29539; Tue, 12 Mar 2019 09:43:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A536D2952A for ; Tue, 12 Mar 2019 09:43:50 +0000 (UTC) Received: from localhost ([127.0.0.1]:48376 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dwr-0002jx-VH for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:43:50 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52735) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTr-00085z-HR for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dJw-0008IO-8P for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:03:38 -0400 Received: from mx1.redhat.com ([209.132.183.28]:39630) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dJv-0008G2-WE; Tue, 12 Mar 2019 05:03:36 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0CD443092642; Tue, 12 Mar 2019 08:54:43 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id AB83E6015B; Tue, 12 Mar 2019 08:54:39 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:36 +1100 Message-Id: <20190312085316.8054-23-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Tue, 12 Mar 2019 08:54:43 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 22/62] ppc: externalize ppc_get_vcpu_by_pir() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Cédric Le Goater We will use it to get the CPU interrupt presenter in XIVE when the TIMA is accessed from the indirect page. Signed-off-by: Cédric Le Goater Message-Id: <20190306085032.15744-3-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 16 ---------------- hw/ppc/ppc.c | 16 ++++++++++++++++ include/hw/ppc/ppc.h | 1 + 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 3d5dfef220..9aa81c7f09 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -1082,22 +1082,6 @@ static void pnv_ics_resend(XICSFabric *xi) } } -static PowerPCCPU *ppc_get_vcpu_by_pir(int pir) -{ - CPUState *cs; - - CPU_FOREACH(cs) { - PowerPCCPU *cpu = POWERPC_CPU(cs); - CPUPPCState *env = &cpu->env; - - if (env->spr_cb[SPR_PIR].default_value == pir) { - return cpu; - } - } - - return NULL; -} - static ICPState *pnv_icp_get(XICSFabric *xi, int pir) { PowerPCCPU *cpu = ppc_get_vcpu_by_pir(pir); diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index df23a7000c..49d57469fb 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -1492,3 +1492,19 @@ void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val) break; } } + +PowerPCCPU *ppc_get_vcpu_by_pir(int pir) +{ + CPUState *cs; + + CPU_FOREACH(cs) { + PowerPCCPU *cpu = POWERPC_CPU(cs); + CPUPPCState *env = &cpu->env; + + if (env->spr_cb[SPR_PIR].default_value == pir) { + return cpu; + } + } + + return NULL; +} diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h index 746170f635..4bdcb8bacd 100644 --- a/include/hw/ppc/ppc.h +++ b/include/hw/ppc/ppc.h @@ -4,6 +4,7 @@ #include "target/ppc/cpu-qom.h" void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level); +PowerPCCPU *ppc_get_vcpu_by_pir(int pir); /* PowerPC hardware exceptions management helpers */ typedef void (*clk_setup_cb)(void *opaque, uint32_t freq); From patchwork Tue Mar 12 08:52:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848975 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 627661850 for ; Tue, 12 Mar 2019 09:54:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 46FF02859E for ; Tue, 12 Mar 2019 09:54:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3913129345; Tue, 12 Mar 2019 09:54:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C8EE92859E for ; Tue, 12 Mar 2019 09:54:29 +0000 (UTC) Received: from localhost ([127.0.0.1]:48532 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3e7B-0002v7-1a for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:54:29 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52436) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dU2-0007dG-Qs for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dHc-0006Kf-UE for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:01:14 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52450) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dHc-0006K9-MV; Tue, 12 Mar 2019 05:01:12 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EF7593082A51; Tue, 12 Mar 2019 08:54:48 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8DAA16013E; Tue, 12 Mar 2019 08:54:43 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:37 +1100 Message-Id: <20190312085316.8054-24-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Tue, 12 Mar 2019 08:54:49 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 23/62] ppc/xive: export the TIMA memory accessors X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Cédric Le Goater The PowerNV machine can perform indirect loads and stores on the TIMA on behalf of another CPU. Give the controller the possibility to call the TIMA memory accessors with a XiveTCTX of its choice. Signed-off-by: Cédric Le Goater Message-Id: <20190306085032.15744-4-clg@kaod.org> Signed-off-by: David Gibson --- hw/intc/xive.c | 23 ++++++++++++++++++----- include/hw/ppc/xive.h | 3 +++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/hw/intc/xive.c b/hw/intc/xive.c index b21759c938..3d7de864e9 100644 --- a/hw/intc/xive.c +++ b/hw/intc/xive.c @@ -317,10 +317,9 @@ static const XiveTmOp *xive_tm_find_op(hwaddr offset, unsigned size, bool write) /* * TIMA MMIO handlers */ -static void xive_tm_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) +void xive_tctx_tm_write(XiveTCTX *tctx, hwaddr offset, uint64_t value, + unsigned size) { - XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu); const XiveTmOp *xto; /* @@ -356,9 +355,8 @@ static void xive_tm_write(void *opaque, hwaddr offset, xive_tm_raw_write(tctx, offset, value, size); } -static uint64_t xive_tm_read(void *opaque, hwaddr offset, unsigned size) +uint64_t xive_tctx_tm_read(XiveTCTX *tctx, hwaddr offset, unsigned size) { - XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu); const XiveTmOp *xto; /* @@ -392,6 +390,21 @@ static uint64_t xive_tm_read(void *opaque, hwaddr offset, unsigned size) return xive_tm_raw_read(tctx, offset, size); } +static void xive_tm_write(void *opaque, hwaddr offset, + uint64_t value, unsigned size) +{ + XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu); + + xive_tctx_tm_write(tctx, offset, value, size); +} + +static uint64_t xive_tm_read(void *opaque, hwaddr offset, unsigned size) +{ + XiveTCTX *tctx = xive_router_get_tctx(XIVE_ROUTER(opaque), current_cpu); + + return xive_tctx_tm_read(tctx, offset, size); +} + const MemoryRegionOps xive_tm_ops = { .read = xive_tm_read, .write = xive_tm_write, diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h index 13a487527b..7dd80e0f46 100644 --- a/include/hw/ppc/xive.h +++ b/include/hw/ppc/xive.h @@ -410,6 +410,9 @@ void xive_end_queue_pic_print_info(XiveEND *end, uint32_t width, Monitor *mon); #define XIVE_TM_USER_PAGE 0x3 extern const MemoryRegionOps xive_tm_ops; +void xive_tctx_tm_write(XiveTCTX *tctx, hwaddr offset, uint64_t value, + unsigned size); +uint64_t xive_tctx_tm_read(XiveTCTX *tctx, hwaddr offset, unsigned size); void xive_tctx_pic_print_info(XiveTCTX *tctx, Monitor *mon); Object *xive_tctx_create(Object *cpu, XiveRouter *xrtr, Error **errp); From patchwork Tue Mar 12 08:52:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10849021 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D3CE51669 for ; Tue, 12 Mar 2019 10:13:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C35AE29505 for ; Tue, 12 Mar 2019 10:13:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B72CF2953A; Tue, 12 Mar 2019 10:13:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 663A729505 for ; Tue, 12 Mar 2019 10:13:18 +0000 (UTC) Received: from localhost ([127.0.0.1]:48867 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3ePN-0002sF-KF for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:13:17 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTs-0008IE-Bf for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dJu-0008D5-12 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:03:36 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43874) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dJt-00086L-Oi; Tue, 12 Mar 2019 05:03:33 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CB8C713A4D; Tue, 12 Mar 2019 08:54:51 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 81B8C6013E; Tue, 12 Mar 2019 08:54:49 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:38 +1100 Message-Id: <20190312085316.8054-25-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 12 Mar 2019 08:54:51 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 24/62] ppc/pnv: export the xive_router_notify() routine X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Cédric Le Goater The PowerNV machine with need to encode the block id in the source interrupt number before forwarding the source event notification to the Router. Signed-off-by: Cédric Le Goater Message-Id: <20190306085032.15744-5-clg@kaod.org> Signed-off-by: David Gibson --- hw/intc/xive.c | 2 +- include/hw/ppc/xive.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/intc/xive.c b/hw/intc/xive.c index 3d7de864e9..7d7992c0ce 100644 --- a/hw/intc/xive.c +++ b/hw/intc/xive.c @@ -1404,7 +1404,7 @@ static void xive_router_end_notify(XiveRouter *xrtr, uint8_t end_blk, /* TODO: Auto EOI. */ } -static void xive_router_notify(XiveNotifier *xn, uint32_t lisn) +void xive_router_notify(XiveNotifier *xn, uint32_t lisn) { XiveRouter *xrtr = XIVE_ROUTER(xn); uint8_t eas_blk = XIVE_SRCNO_BLOCK(lisn); diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h index 7dd80e0f46..c4f27742ca 100644 --- a/include/hw/ppc/xive.h +++ b/include/hw/ppc/xive.h @@ -364,6 +364,7 @@ int xive_router_get_nvt(XiveRouter *xrtr, uint8_t nvt_blk, uint32_t nvt_idx, int xive_router_write_nvt(XiveRouter *xrtr, uint8_t nvt_blk, uint32_t nvt_idx, XiveNVT *nvt, uint8_t word_number); XiveTCTX *xive_router_get_tctx(XiveRouter *xrtr, CPUState *cs); +void xive_router_notify(XiveNotifier *xn, uint32_t lisn); /* * XIVE END ESBs From patchwork Tue Mar 12 08:52:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848945 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BC5451515 for ; Tue, 12 Mar 2019 09:47:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AC9D729403 for ; Tue, 12 Mar 2019 09:47:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A0B1F2952A; Tue, 12 Mar 2019 09:47:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1B00F29403 for ; Tue, 12 Mar 2019 09:47:33 +0000 (UTC) Received: from localhost ([127.0.0.1]:48445 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3e0S-0005xL-DU for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 05:47:32 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52669) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dTy-00083H-5r for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:13:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dHi-0006Ua-VP for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:01:24 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58246) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dHi-0006Tr-Ow; Tue, 12 Mar 2019 05:01:18 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6121DC1047DF; Tue, 12 Mar 2019 08:54:55 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 869CA6013E; Tue, 12 Mar 2019 08:54:52 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:39 +1100 Message-Id: <20190312085316.8054-26-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 12 Mar 2019 08:54:55 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 25/62] ppc/pnv: change the CPU machine_data presenter type to Object * X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Cédric Le Goater The POWER9 PowerNV machine will use a XIVE interrupt presenter type. Signed-off-by: Cédric Le Goater Message-Id: <20190306085032.15744-6-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 6 +++--- hw/ppc/pnv_core.c | 2 +- include/hw/ppc/pnv_core.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 9aa81c7f09..b90d03711a 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -684,7 +684,7 @@ static void pnv_chip_power8_intc_create(PnvChip *chip, PowerPCCPU *cpu, return; } - pnv_cpu->icp = ICP(obj); + pnv_cpu->intc = obj; } /* @@ -1086,7 +1086,7 @@ static ICPState *pnv_icp_get(XICSFabric *xi, int pir) { PowerPCCPU *cpu = ppc_get_vcpu_by_pir(pir); - return cpu ? pnv_cpu_state(cpu)->icp : NULL; + return cpu ? ICP(pnv_cpu_state(cpu)->intc) : NULL; } static void pnv_pic_print_info(InterruptStatsProvider *obj, @@ -1099,7 +1099,7 @@ static void pnv_pic_print_info(InterruptStatsProvider *obj, CPU_FOREACH(cs) { PowerPCCPU *cpu = POWERPC_CPU(cs); - icp_pic_print_info(pnv_cpu_state(cpu)->icp, mon); + icp_pic_print_info(ICP(pnv_cpu_state(cpu)->intc), mon); } for (i = 0; i < pnv->num_chips; i++) { diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c index 7c806da720..38179cdc53 100644 --- a/hw/ppc/pnv_core.c +++ b/hw/ppc/pnv_core.c @@ -198,7 +198,7 @@ static void pnv_unrealize_vcpu(PowerPCCPU *cpu) PnvCPUState *pnv_cpu = pnv_cpu_state(cpu); qemu_unregister_reset(pnv_cpu_reset, cpu); - object_unparent(OBJECT(pnv_cpu_state(cpu)->icp)); + object_unparent(OBJECT(pnv_cpu_state(cpu)->intc)); cpu_remove_sync(CPU(cpu)); cpu->machine_data = NULL; g_free(pnv_cpu); diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h index 9961ea3a92..6874bb847a 100644 --- a/include/hw/ppc/pnv_core.h +++ b/include/hw/ppc/pnv_core.h @@ -48,7 +48,7 @@ typedef struct PnvCoreClass { #define PNV_CORE_TYPE_NAME(cpu_model) cpu_model PNV_CORE_TYPE_SUFFIX typedef struct PnvCPUState { - struct ICPState *icp; + Object *intc; } PnvCPUState; static inline PnvCPUState *pnv_cpu_state(PowerPCCPU *cpu) From patchwork Tue Mar 12 08:52:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: David Gibson X-Patchwork-Id: 10848991 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 05F3F6C2 for ; Tue, 12 Mar 2019 10:01:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E5B4E29546 for ; Tue, 12 Mar 2019 10:01:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E35BC295A9; Tue, 12 Mar 2019 10:01:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 28A6A295B2 for ; Tue, 12 Mar 2019 10:01:27 +0000 (UTC) Received: from localhost ([127.0.0.1]:48683 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eDv-0000Nn-2Q for patchwork-qemu-devel@patchwork.kernel.org; Tue, 12 Mar 2019 06:01:27 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52669) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dU7-00083H-Ta for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dGY-0005Rj-9i for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:00:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42356) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dGX-0005Qf-UG; Tue, 12 Mar 2019 05:00:06 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4B2EAC04BD35; Tue, 12 Mar 2019 08:55:00 +0000 (UTC) Received: from umbus.redhat.com (vpn2-54-33.bne.redhat.com [10.64.54.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 081586013E; Tue, 12 Mar 2019 08:54:55 +0000 (UTC) From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:52:40 +1100 Message-Id: <20190312085316.8054-27-dgibson@redhat.com> In-Reply-To: <20190312085316.8054-1-dgibson@redhat.com> References: <20190312085316.8054-1-dgibson@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 12 Mar 2019 08:55:00 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 26/62] ppc/pnv: add a XIVE interrupt controller model for POWER9 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lvivier@redhat.com, clg@kaod.org, qemu-ppc@nongnu.org, qemu-devel@nongnu.org, groug@kaod.org Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Cédric Le Goater This is a simple model of the POWER9 XIVE interrupt controller for the PowerNV machine which only addresses the needs of the skiboot firmware. The PowerNV model reuses the common XIVE framework developed for sPAPR as the fundamentals aspects are quite the same. The difference are outlined below. The controller initial BAR configuration is performed using the XSCOM bus from there, MMIO are used for further configuration. The MMIO regions exposed are : - Interrupt controller registers - ESB pages for IPIs and ENDs - Presenter MMIO (Not used) - Thread Interrupt Management Area MMIO, direct and indirect The virtualization controller MMIO region containing the IPI ESB pages and END ESB pages is sub-divided into "sets" which map portions of the VC region to the different ESB pages. These are modeled with custom address spaces and the XiveSource and XiveENDSource objects are sized to the maximum allowed by HW. The memory regions are resized at run-time using the configuration of EDT set translation table provided by the firmware. The XIVE virtualization structure tables (EAT, ENDT, NVTT) are now in the machine RAM and not in the hypervisor anymore. The firmware (skiboot) configures these tables using Virtual Structure Descriptor defining the characteristics of each table : SBE, EAS, END and NVT. These are later used to access the virtual interrupt entries. The internal cache of these tables in the interrupt controller is updated and invalidated using a set of registers. Still to address to complete the model but not fully required is the support for block grouping. Escalation support will be necessary for KVM guests. Signed-off-by: Cédric Le Goater Message-Id: <20190306085032.15744-7-clg@kaod.org> Signed-off-by: David Gibson --- hw/intc/Makefile.objs | 2 +- hw/intc/pnv_xive.c | 1753 ++++++++++++++++++++++++++++++++++++ hw/intc/pnv_xive_regs.h | 248 +++++ hw/ppc/pnv.c | 44 +- include/hw/ppc/pnv.h | 21 + include/hw/ppc/pnv_xive.h | 93 ++ include/hw/ppc/pnv_xscom.h | 3 + 7 files changed, 2162 insertions(+), 2 deletions(-) create mode 100644 hw/intc/pnv_xive.c create mode 100644 hw/intc/pnv_xive_regs.h create mode 100644 include/hw/ppc/pnv_xive.h diff --git a/hw/intc/Makefile.objs b/hw/intc/Makefile.objs index 301a8e972d..df712c3e6c 100644 --- a/hw/intc/Makefile.objs +++ b/hw/intc/Makefile.objs @@ -39,7 +39,7 @@ obj-$(CONFIG_XICS_SPAPR) += xics_spapr.o obj-$(CONFIG_XICS_KVM) += xics_kvm.o obj-$(CONFIG_XIVE) += xive.o obj-$(CONFIG_XIVE_SPAPR) += spapr_xive.o -obj-$(CONFIG_POWERNV) += xics_pnv.o +obj-$(CONFIG_POWERNV) += xics_pnv.o pnv_xive.o obj-$(CONFIG_ALLWINNER_A10_PIC) += allwinner-a10-pic.o obj-$(CONFIG_S390_FLIC) += s390_flic.o obj-$(CONFIG_S390_FLIC_KVM) += s390_flic_kvm.o diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c new file mode 100644 index 0000000000..bb0877cbdf --- /dev/null +++ b/hw/intc/pnv_xive.c @@ -0,0 +1,1753 @@ +/* + * QEMU PowerPC XIVE interrupt controller model + * + * Copyright (c) 2017-2019, IBM Corporation. + * + * This code is licensed under the GPL version 2 or later. See the + * COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qapi/error.h" +#include "target/ppc/cpu.h" +#include "sysemu/cpus.h" +#include "sysemu/dma.h" +#include "monitor/monitor.h" +#include "hw/ppc/fdt.h" +#include "hw/ppc/pnv.h" +#include "hw/ppc/pnv_core.h" +#include "hw/ppc/pnv_xscom.h" +#include "hw/ppc/pnv_xive.h" +#include "hw/ppc/xive_regs.h" +#include "hw/ppc/ppc.h" + +#include + +#include "pnv_xive_regs.h" + +#define XIVE_DEBUG + +/* + * Virtual structures table (VST) + */ +#define SBE_PER_BYTE 4 + +typedef struct XiveVstInfo { + const char *name; + uint32_t size; + uint32_t max_blocks; +} XiveVstInfo; + +static const XiveVstInfo vst_infos[] = { + [VST_TSEL_IVT] = { "EAT", sizeof(XiveEAS), 16 }, + [VST_TSEL_SBE] = { "SBE", 1, 16 }, + [VST_TSEL_EQDT] = { "ENDT", sizeof(XiveEND), 16 }, + [VST_TSEL_VPDT] = { "VPDT", sizeof(XiveNVT), 32 }, + + /* + * Interrupt fifo backing store table (not modeled) : + * + * 0 - IPI, + * 1 - HWD, + * 2 - First escalate, + * 3 - Second escalate, + * 4 - Redistribution, + * 5 - IPI cascaded queue ? + */ + [VST_TSEL_IRQ] = { "IRQ", 1, 6 }, +}; + +#define xive_error(xive, fmt, ...) \ + qemu_log_mask(LOG_GUEST_ERROR, "XIVE[%x] - " fmt "\n", \ + (xive)->chip->chip_id, ## __VA_ARGS__); + +/* + * QEMU version of the GETFIELD/SETFIELD macros + * + * TODO: It might be better to use the existing extract64() and + * deposit64() but this means that all the register definitions will + * change and become incompatible with the ones found in skiboot. + * + * Keep it as it is for now until we find a common ground. + */ +static inline uint64_t GETFIELD(uint64_t mask, uint64_t word) +{ + return (word & mask) >> ctz64(mask); +} + +static inline uint64_t SETFIELD(uint64_t mask, uint64_t word, + uint64_t value) +{ + return (word & ~mask) | ((value << ctz64(mask)) & mask); +} + +/* + * Remote access to controllers. HW uses MMIOs. For now, a simple scan + * of the chips is good enough. + * + * TODO: Block scope support + */ +static PnvXive *pnv_xive_get_ic(uint8_t blk) +{ + PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine()); + int i; + + for (i = 0; i < pnv->num_chips; i++) { + Pnv9Chip *chip9 = PNV9_CHIP(pnv->chips[i]); + PnvXive *xive = &chip9->xive; + + if (xive->chip->chip_id == blk) { + return xive; + } + } + return NULL; +} + +/* + * VST accessors for SBE, EAT, ENDT, NVT + * + * Indirect VST tables are arrays of VSDs pointing to a page (of same + * size). Each page is a direct VST table. + */ + +#define XIVE_VSD_SIZE 8 + +/* Indirect page size can be 4K, 64K, 2M, 16M. */ +static uint64_t pnv_xive_vst_page_size_allowed(uint32_t page_shift) +{ + return page_shift == 12 || page_shift == 16 || + page_shift == 21 || page_shift == 24; +} + +static uint64_t pnv_xive_vst_size(uint64_t vsd) +{ + uint64_t vst_tsize = 1ull << (GETFIELD(VSD_TSIZE, vsd) + 12); + + /* + * Read the first descriptor to get the page size of the indirect + * table. + */ + if (VSD_INDIRECT & vsd) { + uint32_t nr_pages = vst_tsize / XIVE_VSD_SIZE; + uint32_t page_shift; + + vsd = ldq_be_dma(&address_space_memory, vsd & VSD_ADDRESS_MASK); + page_shift = GETFIELD(VSD_TSIZE, vsd) + 12; + + if (!pnv_xive_vst_page_size_allowed(page_shift)) { + return 0; + } + + return nr_pages * (1ull << page_shift); + } + + return vst_tsize; +} + +static uint64_t pnv_xive_vst_addr_direct(PnvXive *xive, uint32_t type, + uint64_t vsd, uint32_t idx) +{ + const XiveVstInfo *info = &vst_infos[type]; + uint64_t vst_addr = vsd & VSD_ADDRESS_MASK; + + return vst_addr + idx * info->size; +} + +static uint64_t pnv_xive_vst_addr_indirect(PnvXive *xive, uint32_t type, + uint64_t vsd, uint32_t idx) +{ + const XiveVstInfo *info = &vst_infos[type]; + uint64_t vsd_addr; + uint32_t vsd_idx; + uint32_t page_shift; + uint32_t vst_per_page; + + /* Get the page size of the indirect table. */ + vsd_addr = vsd & VSD_ADDRESS_MASK; + vsd = ldq_be_dma(&address_space_memory, vsd_addr); + + if (!(vsd & VSD_ADDRESS_MASK)) { + xive_error(xive, "VST: invalid %s entry %x !?", info->name, 0); + return 0; + } + + page_shift = GETFIELD(VSD_TSIZE, vsd) + 12; + + if (!pnv_xive_vst_page_size_allowed(page_shift)) { + xive_error(xive, "VST: invalid %s page shift %d", info->name, + page_shift); + return 0; + } + + vst_per_page = (1ull << page_shift) / info->size; + vsd_idx = idx / vst_per_page; + + /* Load the VSD we are looking for, if not already done */ + if (vsd_idx) { + vsd_addr = vsd_addr + vsd_idx * XIVE_VSD_SIZE; + vsd = ldq_be_dma(&address_space_memory, vsd_addr); + + if (!(vsd & VSD_ADDRESS_MASK)) { + xive_error(xive, "VST: invalid %s entry %x !?", info->name, 0); + return 0; + } + + /* + * Check that the pages have a consistent size across the + * indirect table + */ + if (page_shift != GETFIELD(VSD_TSIZE, vsd) + 12) { + xive_error(xive, "VST: %s entry %x indirect page size differ !?", + info->name, idx); + return 0; + } + } + + return pnv_xive_vst_addr_direct(xive, type, vsd, (idx % vst_per_page)); +} + +static uint64_t pnv_xive_vst_addr(PnvXive *xive, uint32_t type, uint8_t blk, + uint32_t idx) +{ + const XiveVstInfo *info = &vst_infos[type]; + uint64_t vsd; + uint32_t idx_max; + + if (blk >= info->max_blocks) { + xive_error(xive, "VST: invalid block id %d for VST %s %d !?", + blk, info->name, idx); + return 0; + } + + vsd = xive->vsds[type][blk]; + + /* Remote VST access */ + if (GETFIELD(VSD_MODE, vsd) == VSD_MODE_FORWARD) { + xive = pnv_xive_get_ic(blk); + + return xive ? pnv_xive_vst_addr(xive, type, blk, idx) : 0; + } + + idx_max = pnv_xive_vst_size(vsd) / info->size - 1; + if (idx > idx_max) { +#ifdef XIVE_DEBUG + xive_error(xive, "VST: %s entry %x/%x out of range [ 0 .. %x ] !?", + info->name, blk, idx, idx_max); +#endif + return 0; + } + + if (VSD_INDIRECT & vsd) { + return pnv_xive_vst_addr_indirect(xive, type, vsd, idx); + } + + return pnv_xive_vst_addr_direct(xive, type, vsd, idx); +} + +static int pnv_xive_vst_read(PnvXive *xive, uint32_t type, uint8_t blk, + uint32_t idx, void *data) +{ + const XiveVstInfo *info = &vst_infos[type]; + uint64_t addr = pnv_xive_vst_addr(xive, type, blk, idx); + + if (!addr) { + return -1; + } + + cpu_physical_memory_read(addr, data, info->size); + return 0; +} + +#define XIVE_VST_WORD_ALL -1 + +static int pnv_xive_vst_write(PnvXive *xive, uint32_t type, uint8_t blk, + uint32_t idx, void *data, uint32_t word_number) +{ + const XiveVstInfo *info = &vst_infos[type]; + uint64_t addr = pnv_xive_vst_addr(xive, type, blk, idx); + + if (!addr) { + return -1; + } + + if (word_number == XIVE_VST_WORD_ALL) { + cpu_physical_memory_write(addr, data, info->size); + } else { + cpu_physical_memory_write(addr + word_number * 4, + data + word_number * 4, 4); + } + return 0; +} + +static int pnv_xive_get_end(XiveRouter *xrtr, uint8_t blk, uint32_t idx, + XiveEND *end) +{ + return pnv_xive_vst_read(PNV_XIVE(xrtr), VST_TSEL_EQDT, blk, idx, end); +} + +static int pnv_xive_write_end(XiveRouter *xrtr, uint8_t blk, uint32_t idx, + XiveEND *end, uint8_t word_number) +{ + return pnv_xive_vst_write(PNV_XIVE(xrtr), VST_TSEL_EQDT, blk, idx, end, + word_number); +} + +static int pnv_xive_end_update(PnvXive *xive, uint8_t blk, uint32_t idx) +{ + int i; + uint64_t eqc_watch[4]; + + for (i = 0; i < ARRAY_SIZE(eqc_watch); i++) { + eqc_watch[i] = cpu_to_be64(xive->regs[(VC_EQC_CWATCH_DAT0 >> 3) + i]); + } + + return pnv_xive_vst_write(xive, VST_TSEL_EQDT, blk, idx, eqc_watch, + XIVE_VST_WORD_ALL); +} + +static int pnv_xive_get_nvt(XiveRouter *xrtr, uint8_t blk, uint32_t idx, + XiveNVT *nvt) +{ + return pnv_xive_vst_read(PNV_XIVE(xrtr), VST_TSEL_VPDT, blk, idx, nvt); +} + +static int pnv_xive_write_nvt(XiveRouter *xrtr, uint8_t blk, uint32_t idx, + XiveNVT *nvt, uint8_t word_number) +{ + return pnv_xive_vst_write(PNV_XIVE(xrtr), VST_TSEL_VPDT, blk, idx, nvt, + word_number); +} + +static int pnv_xive_nvt_update(PnvXive *xive, uint8_t blk, uint32_t idx) +{ + int i; + uint64_t vpc_watch[8]; + + for (i = 0; i < ARRAY_SIZE(vpc_watch); i++) { + vpc_watch[i] = cpu_to_be64(xive->regs[(PC_VPC_CWATCH_DAT0 >> 3) + i]); + } + + return pnv_xive_vst_write(xive, VST_TSEL_VPDT, blk, idx, vpc_watch, + XIVE_VST_WORD_ALL); +} + +static int pnv_xive_get_eas(XiveRouter *xrtr, uint8_t blk, uint32_t idx, + XiveEAS *eas) +{ + PnvXive *xive = PNV_XIVE(xrtr); + + if (pnv_xive_get_ic(blk) != xive) { + xive_error(xive, "VST: EAS %x is remote !?", XIVE_SRCNO(blk, idx)); + return -1; + } + + return pnv_xive_vst_read(xive, VST_TSEL_IVT, blk, idx, eas); +} + +static int pnv_xive_eas_update(PnvXive *xive, uint8_t blk, uint32_t idx) +{ + /* All done. */ + return 0; +} + +static XiveTCTX *pnv_xive_get_tctx(XiveRouter *xrtr, CPUState *cs) +{ + PowerPCCPU *cpu = POWERPC_CPU(cs); + XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc); + PnvXive *xive = NULL; + CPUPPCState *env = &cpu->env; + int pir = env->spr_cb[SPR_PIR].default_value; + + /* + * Perform an extra check on the HW thread enablement. + * + * The TIMA is shared among the chips and to identify the chip + * from which the access is being done, we extract the chip id + * from the PIR. + */ + xive = pnv_xive_get_ic((pir >> 8) & 0xf); + if (!xive) { + return NULL; + } + + if (!(xive->regs[PC_THREAD_EN_REG0 >> 3] & PPC_BIT(pir & 0x3f))) { + xive_error(PNV_XIVE(xrtr), "IC: CPU %x is not enabled", pir); + } + + return tctx; +} + +/* + * The internal sources (IPIs) of the interrupt controller have no + * knowledge of the XIVE chip on which they reside. Encode the block + * id in the source interrupt number before forwarding the source + * event notification to the Router. This is required on a multichip + * system. + */ +static void pnv_xive_notify(XiveNotifier *xn, uint32_t srcno) +{ + PnvXive *xive = PNV_XIVE(xn); + uint8_t blk = xive->chip->chip_id; + + xive_router_notify(xn, XIVE_SRCNO(blk, srcno)); +} + +/* + * XIVE helpers + */ + +static uint64_t pnv_xive_vc_size(PnvXive *xive) +{ + return (~xive->regs[CQ_VC_BARM >> 3] + 1) & CQ_VC_BARM_MASK; +} + +static uint64_t pnv_xive_edt_shift(PnvXive *xive) +{ + return ctz64(pnv_xive_vc_size(xive) / XIVE_TABLE_EDT_MAX); +} + +static uint64_t pnv_xive_pc_size(PnvXive *xive) +{ + return (~xive->regs[CQ_PC_BARM >> 3] + 1) & CQ_PC_BARM_MASK; +} + +static uint32_t pnv_xive_nr_ipis(PnvXive *xive) +{ + uint8_t blk = xive->chip->chip_id; + + return pnv_xive_vst_size(xive->vsds[VST_TSEL_SBE][blk]) * SBE_PER_BYTE; +} + +static uint32_t pnv_xive_nr_ends(PnvXive *xive) +{ + uint8_t blk = xive->chip->chip_id; + + return pnv_xive_vst_size(xive->vsds[VST_TSEL_EQDT][blk]) + / vst_infos[VST_TSEL_EQDT].size; +} + +/* + * EDT Table + * + * The Virtualization Controller MMIO region containing the IPI ESB + * pages and END ESB pages is sub-divided into "sets" which map + * portions of the VC region to the different ESB pages. It is + * configured at runtime through the EDT "Domain Table" to let the + * firmware decide how to split the VC address space between IPI ESB + * pages and END ESB pages. + */ + +/* + * Computes the overall size of the IPI or the END ESB pages + */ +static uint64_t pnv_xive_edt_size(PnvXive *xive, uint64_t type) +{ + uint64_t edt_size = 1ull << pnv_xive_edt_shift(xive); + uint64_t size = 0; + int i; + + for (i = 0; i < XIVE_TABLE_EDT_MAX; i++) { + uint64_t edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]); + + if (edt_type == type) { + size += edt_size; + } + } + + return size; +} + +/* + * Maps an offset of the VC region in the IPI or END region using the + * layout defined by the EDT "Domaine Table" + */ +static uint64_t pnv_xive_edt_offset(PnvXive *xive, uint64_t vc_offset, + uint64_t type) +{ + int i; + uint64_t edt_size = 1ull << pnv_xive_edt_shift(xive); + uint64_t edt_offset = vc_offset; + + for (i = 0; i < XIVE_TABLE_EDT_MAX && (i * edt_size) < vc_offset; i++) { + uint64_t edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]); + + if (edt_type != type) { + edt_offset -= edt_size; + } + } + + return edt_offset; +} + +static void pnv_xive_edt_resize(PnvXive *xive) +{ + uint64_t ipi_edt_size = pnv_xive_edt_size(xive, CQ_TDR_EDT_IPI); + uint64_t end_edt_size = pnv_xive_edt_size(xive, CQ_TDR_EDT_EQ); + + memory_region_set_size(&xive->ipi_edt_mmio, ipi_edt_size); + memory_region_add_subregion(&xive->ipi_mmio, 0, &xive->ipi_edt_mmio); + + memory_region_set_size(&xive->end_edt_mmio, end_edt_size); + memory_region_add_subregion(&xive->end_mmio, 0, &xive->end_edt_mmio); +} + +/* + * XIVE Table configuration. Only EDT is supported. + */ +static int pnv_xive_table_set_data(PnvXive *xive, uint64_t val) +{ + uint64_t tsel = xive->regs[CQ_TAR >> 3] & CQ_TAR_TSEL; + uint8_t tsel_index = GETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3]); + uint64_t *xive_table; + uint8_t max_index; + + switch (tsel) { + case CQ_TAR_TSEL_BLK: + max_index = ARRAY_SIZE(xive->blk); + xive_table = xive->blk; + break; + case CQ_TAR_TSEL_MIG: + max_index = ARRAY_SIZE(xive->mig); + xive_table = xive->mig; + break; + case CQ_TAR_TSEL_EDT: + max_index = ARRAY_SIZE(xive->edt); + xive_table = xive->edt; + break; + case CQ_TAR_TSEL_VDT: + max_index = ARRAY_SIZE(xive->vdt); + xive_table = xive->vdt; + break; + default: + xive_error(xive, "IC: invalid table %d", (int) tsel); + return -1; + } + + if (tsel_index >= max_index) { + xive_error(xive, "IC: invalid index %d", (int) tsel_index); + return -1; + } + + xive_table[tsel_index] = val; + + if (xive->regs[CQ_TAR >> 3] & CQ_TAR_TBL_AUTOINC) { + xive->regs[CQ_TAR >> 3] = + SETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3], ++tsel_index); + } + + /* + * EDT configuration is complete. Resize the MMIO windows exposing + * the IPI and the END ESBs in the VC region. + */ + if (tsel == CQ_TAR_TSEL_EDT && tsel_index == ARRAY_SIZE(xive->edt)) { + pnv_xive_edt_resize(xive); + } + + return 0; +} + +/* + * Virtual Structure Tables (VST) configuration + */ +static void pnv_xive_vst_set_exclusive(PnvXive *xive, uint8_t type, + uint8_t blk, uint64_t vsd) +{ + XiveENDSource *end_xsrc = &xive->end_source; + XiveSource *xsrc = &xive->ipi_source; + const XiveVstInfo *info = &vst_infos[type]; + uint32_t page_shift = GETFIELD(VSD_TSIZE, vsd) + 12; + uint64_t vst_addr = vsd & VSD_ADDRESS_MASK; + + /* Basic checks */ + + if (VSD_INDIRECT & vsd) { + if (!(xive->regs[VC_GLOBAL_CONFIG >> 3] & VC_GCONF_INDIRECT)) { + xive_error(xive, "VST: %s indirect tables are not enabled", + info->name); + return; + } + + if (!pnv_xive_vst_page_size_allowed(page_shift)) { + xive_error(xive, "VST: invalid %s page shift %d", info->name, + page_shift); + return; + } + } + + if (!QEMU_IS_ALIGNED(vst_addr, 1ull << page_shift)) { + xive_error(xive, "VST: %s table address 0x%"PRIx64" is not aligned with" + " page shift %d", info->name, vst_addr, page_shift); + return; + } + + /* Record the table configuration (in SRAM on HW) */ + xive->vsds[type][blk] = vsd; + + /* Now tune the models with the configuration provided by the FW */ + + switch (type) { + case VST_TSEL_IVT: /* Nothing to be done */ + break; + + case VST_TSEL_EQDT: + /* + * Backing store pages for the END. Compute the number of ENDs + * provisioned by FW and resize the END ESB window accordingly. + */ + memory_region_set_size(&end_xsrc->esb_mmio, pnv_xive_nr_ends(xive) * + (1ull << (end_xsrc->esb_shift + 1))); + memory_region_add_subregion(&xive->end_edt_mmio, 0, + &end_xsrc->esb_mmio); + break; + + case VST_TSEL_SBE: + /* + * Backing store pages for the source PQ bits. The model does + * not use these PQ bits backed in RAM because the XiveSource + * model has its own. Compute the number of IRQs provisioned + * by FW and resize the IPI ESB window accordingly. + */ + memory_region_set_size(&xsrc->esb_mmio, pnv_xive_nr_ipis(xive) * + (1ull << xsrc->esb_shift)); + memory_region_add_subregion(&xive->ipi_edt_mmio, 0, &xsrc->esb_mmio); + break; + + case VST_TSEL_VPDT: /* Not modeled */ + case VST_TSEL_IRQ: /* Not modeled */ + /* + * These tables contains the backing store pages for the + * interrupt fifos of the VC sub-engine in case of overflow. + */ + break; + + default: + g_assert_not_reached(); + } +} + +/* + * Both PC and VC sub-engines are configured as each use the Virtual + * Structure Tables : SBE, EAS, END and NVT. + */ +static void pnv_xive_vst_set_data(PnvXive *xive, uint64_t vsd, bool pc_engine) +{ + uint8_t mode = GETFIELD(VSD_MODE, vsd); + uint8_t type = GETFIELD(VST_TABLE_SELECT, + xive->regs[VC_VSD_TABLE_ADDR >> 3]); + uint8_t blk = GETFIELD(VST_TABLE_BLOCK, + xive->regs[VC_VSD_TABLE_ADDR >> 3]); + uint64_t vst_addr = vsd & VSD_ADDRESS_MASK; + + if (type > VST_TSEL_IRQ) { + xive_error(xive, "VST: invalid table type %d", type); + return; + } + + if (blk >= vst_infos[type].max_blocks) { + xive_error(xive, "VST: invalid block id %d for" + " %s table", blk, vst_infos[type].name); + return; + } + + /* + * Only take the VC sub-engine configuration into account because + * the XiveRouter model combines both VC and PC sub-engines + */ + if (pc_engine) { + return; + } + + if (!vst_addr) { + xive_error(xive, "VST: invalid %s table address", vst_infos[type].name); + return; + } + + switch (mode) { + case VSD_MODE_FORWARD: + xive->vsds[type][blk] = vsd; + break; + + case VSD_MODE_EXCLUSIVE: + pnv_xive_vst_set_exclusive(xive, type, blk, vsd); + break; + + default: + xive_error(xive, "VST: unsupported table mode %d", mode); + return; + } +} + +/* + * Interrupt controller MMIO region. The layout is compatible between + * 4K and 64K pages : + * + * Page 0 sub-engine BARs + * 0x000 - 0x3FF IC registers + * 0x400 - 0x7FF PC registers + * 0x800 - 0xFFF VC registers + * + * Page 1 Notify page (writes only) + * 0x000 - 0x7FF HW interrupt triggers (PSI, PHB) + * 0x800 - 0xFFF forwards and syncs + * + * Page 2 LSI Trigger page (writes only) (not modeled) + * Page 3 LSI SB EOI page (reads only) (not modeled) + * + * Page 4-7 indirect TIMA + */ + +/* + * IC - registers MMIO + */ +static void pnv_xive_ic_reg_write(void *opaque, hwaddr offset, + uint64_t val, unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + MemoryRegion *sysmem = get_system_memory(); + uint32_t reg = offset >> 3; + bool is_chip0 = xive->chip->chip_id == 0; + + switch (offset) { + + /* + * XIVE CQ (PowerBus bridge) settings + */ + case CQ_MSGSND: /* msgsnd for doorbells */ + case CQ_FIRMASK_OR: /* FIR error reporting */ + break; + case CQ_PBI_CTL: + if (val & CQ_PBI_PC_64K) { + xive->pc_shift = 16; + } + if (val & CQ_PBI_VC_64K) { + xive->vc_shift = 16; + } + break; + case CQ_CFG_PB_GEN: /* PowerBus General Configuration */ + /* + * TODO: CQ_INT_ADDR_OPT for 1-block-per-chip mode + */ + break; + + /* + * XIVE Virtualization Controller settings + */ + case VC_GLOBAL_CONFIG: + break; + + /* + * XIVE Presenter Controller settings + */ + case PC_GLOBAL_CONFIG: + /* + * PC_GCONF_CHIPID_OVR + * Overrides Int command Chip ID with the Chip ID field (DEBUG) + */ + break; + case PC_TCTXT_CFG: + /* + * TODO: block group support + * + * PC_TCTXT_CFG_BLKGRP_EN + * PC_TCTXT_CFG_HARD_CHIPID_BLK : + * Moves the chipid into block field for hardwired CAM compares. + * Block offset value is adjusted to 0b0..01 & ThrdId + * + * Will require changes in xive_presenter_tctx_match(). I am + * not sure how to handle that yet. + */ + + /* Overrides hardwired chip ID with the chip ID field */ + if (val & PC_TCTXT_CHIPID_OVERRIDE) { + xive->tctx_chipid = GETFIELD(PC_TCTXT_CHIPID, val); + } + break; + case PC_TCTXT_TRACK: + /* + * PC_TCTXT_TRACK_EN: + * enable block tracking and exchange of block ownership + * information between Interrupt controllers + */ + break; + + /* + * Misc settings + */ + case VC_SBC_CONFIG: /* Store EOI configuration */ + /* + * Configure store EOI if required by firwmare (skiboot has removed + * support recently though) + */ + if (val & (VC_SBC_CONF_CPLX_CIST | VC_SBC_CONF_CIST_BOTH)) { + object_property_set_int(OBJECT(&xive->ipi_source), + XIVE_SRC_STORE_EOI, "flags", &error_fatal); + } + break; + + case VC_EQC_CONFIG: /* TODO: silent escalation */ + case VC_AIB_TX_ORDER_TAG2: /* relax ordering */ + break; + + /* + * XIVE BAR settings (XSCOM only) + */ + case CQ_RST_CTL: + /* bit4: resets all BAR registers */ + break; + + case CQ_IC_BAR: /* IC BAR. 8 pages */ + xive->ic_shift = val & CQ_IC_BAR_64K ? 16 : 12; + if (!(val & CQ_IC_BAR_VALID)) { + xive->ic_base = 0; + if (xive->regs[reg] & CQ_IC_BAR_VALID) { + memory_region_del_subregion(&xive->ic_mmio, + &xive->ic_reg_mmio); + memory_region_del_subregion(&xive->ic_mmio, + &xive->ic_notify_mmio); + memory_region_del_subregion(&xive->ic_mmio, + &xive->ic_lsi_mmio); + memory_region_del_subregion(&xive->ic_mmio, + &xive->tm_indirect_mmio); + + memory_region_del_subregion(sysmem, &xive->ic_mmio); + } + } else { + xive->ic_base = val & ~(CQ_IC_BAR_VALID | CQ_IC_BAR_64K); + if (!(xive->regs[reg] & CQ_IC_BAR_VALID)) { + memory_region_add_subregion(sysmem, xive->ic_base, + &xive->ic_mmio); + + memory_region_add_subregion(&xive->ic_mmio, 0, + &xive->ic_reg_mmio); + memory_region_add_subregion(&xive->ic_mmio, + 1ul << xive->ic_shift, + &xive->ic_notify_mmio); + memory_region_add_subregion(&xive->ic_mmio, + 2ul << xive->ic_shift, + &xive->ic_lsi_mmio); + memory_region_add_subregion(&xive->ic_mmio, + 4ull << xive->ic_shift, + &xive->tm_indirect_mmio); + } + } + break; + + case CQ_TM1_BAR: /* TM BAR. 4 pages. Map only once */ + case CQ_TM2_BAR: /* second TM BAR. for hotplug. Not modeled */ + xive->tm_shift = val & CQ_TM_BAR_64K ? 16 : 12; + if (!(val & CQ_TM_BAR_VALID)) { + xive->tm_base = 0; + if (xive->regs[reg] & CQ_TM_BAR_VALID && is_chip0) { + memory_region_del_subregion(sysmem, &xive->tm_mmio); + } + } else { + xive->tm_base = val & ~(CQ_TM_BAR_VALID | CQ_TM_BAR_64K); + if (!(xive->regs[reg] & CQ_TM_BAR_VALID) && is_chip0) { + memory_region_add_subregion(sysmem, xive->tm_base, + &xive->tm_mmio); + } + } + break; + + case CQ_PC_BARM: + xive->regs[reg] = val; + memory_region_set_size(&xive->pc_mmio, pnv_xive_pc_size(xive)); + break; + case CQ_PC_BAR: /* From 32M to 512G */ + if (!(val & CQ_PC_BAR_VALID)) { + xive->pc_base = 0; + if (xive->regs[reg] & CQ_PC_BAR_VALID) { + memory_region_del_subregion(sysmem, &xive->pc_mmio); + } + } else { + xive->pc_base = val & ~(CQ_PC_BAR_VALID); + if (!(xive->regs[reg] & CQ_PC_BAR_VALID)) { + memory_region_add_subregion(sysmem, xive->pc_base, + &xive->pc_mmio); + } + } + break; + + case CQ_VC_BARM: + xive->regs[reg] = val; + memory_region_set_size(&xive->vc_mmio, pnv_xive_vc_size(xive)); + break; + case CQ_VC_BAR: /* From 64M to 4TB */ + if (!(val & CQ_VC_BAR_VALID)) { + xive->vc_base = 0; + if (xive->regs[reg] & CQ_VC_BAR_VALID) { + memory_region_del_subregion(sysmem, &xive->vc_mmio); + } + } else { + xive->vc_base = val & ~(CQ_VC_BAR_VALID); + if (!(xive->regs[reg] & CQ_VC_BAR_VALID)) { + memory_region_add_subregion(sysmem, xive->vc_base, + &xive->vc_mmio); + } + } + break; + + /* + * XIVE Table settings. + */ + case CQ_TAR: /* Table Address */ + break; + case CQ_TDR: /* Table Data */ + pnv_xive_table_set_data(xive, val); + break; + + /* + * XIVE VC & PC Virtual Structure Table settings + */ + case VC_VSD_TABLE_ADDR: + case PC_VSD_TABLE_ADDR: /* Virtual table selector */ + break; + case VC_VSD_TABLE_DATA: /* Virtual table setting */ + case PC_VSD_TABLE_DATA: + pnv_xive_vst_set_data(xive, val, offset == PC_VSD_TABLE_DATA); + break; + + /* + * Interrupt fifo overflow in memory backing store (Not modeled) + */ + case VC_IRQ_CONFIG_IPI: + case VC_IRQ_CONFIG_HW: + case VC_IRQ_CONFIG_CASCADE1: + case VC_IRQ_CONFIG_CASCADE2: + case VC_IRQ_CONFIG_REDIST: + case VC_IRQ_CONFIG_IPI_CASC: + break; + + /* + * XIVE hardware thread enablement + */ + case PC_THREAD_EN_REG0: /* Physical Thread Enable */ + case PC_THREAD_EN_REG1: /* Physical Thread Enable (fused core) */ + break; + + case PC_THREAD_EN_REG0_SET: + xive->regs[PC_THREAD_EN_REG0 >> 3] |= val; + break; + case PC_THREAD_EN_REG1_SET: + xive->regs[PC_THREAD_EN_REG1 >> 3] |= val; + break; + case PC_THREAD_EN_REG0_CLR: + xive->regs[PC_THREAD_EN_REG0 >> 3] &= ~val; + break; + case PC_THREAD_EN_REG1_CLR: + xive->regs[PC_THREAD_EN_REG1 >> 3] &= ~val; + break; + + /* + * Indirect TIMA access set up. Defines the PIR of the HW thread + * to use. + */ + case PC_TCTXT_INDIR0 ... PC_TCTXT_INDIR3: + break; + + /* + * XIVE PC & VC cache updates for EAS, NVT and END + */ + case VC_IVC_SCRUB_MASK: + break; + case VC_IVC_SCRUB_TRIG: + pnv_xive_eas_update(xive, GETFIELD(PC_SCRUB_BLOCK_ID, val), + GETFIELD(VC_SCRUB_OFFSET, val)); + break; + + case VC_EQC_SCRUB_MASK: + case VC_EQC_CWATCH_SPEC: + case VC_EQC_CWATCH_DAT0 ... VC_EQC_CWATCH_DAT3: + break; + case VC_EQC_SCRUB_TRIG: + pnv_xive_end_update(xive, GETFIELD(VC_SCRUB_BLOCK_ID, val), + GETFIELD(VC_SCRUB_OFFSET, val)); + break; + + case PC_VPC_SCRUB_MASK: + case PC_VPC_CWATCH_SPEC: + case PC_VPC_CWATCH_DAT0 ... PC_VPC_CWATCH_DAT7: + break; + case PC_VPC_SCRUB_TRIG: + pnv_xive_nvt_update(xive, GETFIELD(PC_SCRUB_BLOCK_ID, val), + GETFIELD(PC_SCRUB_OFFSET, val)); + break; + + + /* + * XIVE PC & VC cache invalidation + */ + case PC_AT_KILL: + break; + case VC_AT_MACRO_KILL: + break; + case PC_AT_KILL_MASK: + case VC_AT_MACRO_KILL_MASK: + break; + + default: + xive_error(xive, "IC: invalid write to reg=0x%"HWADDR_PRIx, offset); + return; + } + + xive->regs[reg] = val; +} + +static uint64_t pnv_xive_ic_reg_read(void *opaque, hwaddr offset, unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + uint64_t val = 0; + uint32_t reg = offset >> 3; + + switch (offset) { + case CQ_CFG_PB_GEN: + case CQ_IC_BAR: + case CQ_TM1_BAR: + case CQ_TM2_BAR: + case CQ_PC_BAR: + case CQ_PC_BARM: + case CQ_VC_BAR: + case CQ_VC_BARM: + case CQ_TAR: + case CQ_TDR: + case CQ_PBI_CTL: + + case PC_TCTXT_CFG: + case PC_TCTXT_TRACK: + case PC_TCTXT_INDIR0: + case PC_TCTXT_INDIR1: + case PC_TCTXT_INDIR2: + case PC_TCTXT_INDIR3: + case PC_GLOBAL_CONFIG: + + case PC_VPC_SCRUB_MASK: + case PC_VPC_CWATCH_SPEC: + case PC_VPC_CWATCH_DAT0: + case PC_VPC_CWATCH_DAT1: + case PC_VPC_CWATCH_DAT2: + case PC_VPC_CWATCH_DAT3: + case PC_VPC_CWATCH_DAT4: + case PC_VPC_CWATCH_DAT5: + case PC_VPC_CWATCH_DAT6: + case PC_VPC_CWATCH_DAT7: + + case VC_GLOBAL_CONFIG: + case VC_AIB_TX_ORDER_TAG2: + + case VC_IRQ_CONFIG_IPI: + case VC_IRQ_CONFIG_HW: + case VC_IRQ_CONFIG_CASCADE1: + case VC_IRQ_CONFIG_CASCADE2: + case VC_IRQ_CONFIG_REDIST: + case VC_IRQ_CONFIG_IPI_CASC: + + case VC_EQC_SCRUB_MASK: + case VC_EQC_CWATCH_DAT0: + case VC_EQC_CWATCH_DAT1: + case VC_EQC_CWATCH_DAT2: + case VC_EQC_CWATCH_DAT3: + + case VC_EQC_CWATCH_SPEC: + case VC_IVC_SCRUB_MASK: + case VC_SBC_CONFIG: + case VC_AT_MACRO_KILL_MASK: + case VC_VSD_TABLE_ADDR: + case PC_VSD_TABLE_ADDR: + case VC_VSD_TABLE_DATA: + case PC_VSD_TABLE_DATA: + case PC_THREAD_EN_REG0: + case PC_THREAD_EN_REG1: + val = xive->regs[reg]; + break; + + /* + * XIVE hardware thread enablement + */ + case PC_THREAD_EN_REG0_SET: + case PC_THREAD_EN_REG0_CLR: + val = xive->regs[PC_THREAD_EN_REG0 >> 3]; + break; + case PC_THREAD_EN_REG1_SET: + case PC_THREAD_EN_REG1_CLR: + val = xive->regs[PC_THREAD_EN_REG1 >> 3]; + break; + + case CQ_MSGSND: /* Identifies which cores have msgsnd enabled. */ + val = 0xffffff0000000000; + break; + + /* + * XIVE PC & VC cache updates for EAS, NVT and END + */ + case PC_VPC_SCRUB_TRIG: + case VC_IVC_SCRUB_TRIG: + case VC_EQC_SCRUB_TRIG: + xive->regs[reg] &= ~VC_SCRUB_VALID; + val = xive->regs[reg]; + break; + + /* + * XIVE PC & VC cache invalidation + */ + case PC_AT_KILL: + xive->regs[reg] &= ~PC_AT_KILL_VALID; + val = xive->regs[reg]; + break; + case VC_AT_MACRO_KILL: + xive->regs[reg] &= ~VC_KILL_VALID; + val = xive->regs[reg]; + break; + + /* + * XIVE synchronisation + */ + case VC_EQC_CONFIG: + val = VC_EQC_SYNC_MASK; + break; + + default: + xive_error(xive, "IC: invalid read reg=0x%"HWADDR_PRIx, offset); + } + + return val; +} + +static const MemoryRegionOps pnv_xive_ic_reg_ops = { + .read = pnv_xive_ic_reg_read, + .write = pnv_xive_ic_reg_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 8, + .max_access_size = 8, + }, + .impl = { + .min_access_size = 8, + .max_access_size = 8, + }, +}; + +/* + * IC - Notify MMIO port page (write only) + */ +#define PNV_XIVE_FORWARD_IPI 0x800 /* Forward IPI */ +#define PNV_XIVE_FORWARD_HW 0x880 /* Forward HW */ +#define PNV_XIVE_FORWARD_OS_ESC 0x900 /* Forward OS escalation */ +#define PNV_XIVE_FORWARD_HW_ESC 0x980 /* Forward Hyp escalation */ +#define PNV_XIVE_FORWARD_REDIS 0xa00 /* Forward Redistribution */ +#define PNV_XIVE_RESERVED5 0xa80 /* Cache line 5 PowerBUS operation */ +#define PNV_XIVE_RESERVED6 0xb00 /* Cache line 6 PowerBUS operation */ +#define PNV_XIVE_RESERVED7 0xb80 /* Cache line 7 PowerBUS operation */ + +/* VC synchronisation */ +#define PNV_XIVE_SYNC_IPI 0xc00 /* Sync IPI */ +#define PNV_XIVE_SYNC_HW 0xc80 /* Sync HW */ +#define PNV_XIVE_SYNC_OS_ESC 0xd00 /* Sync OS escalation */ +#define PNV_XIVE_SYNC_HW_ESC 0xd80 /* Sync Hyp escalation */ +#define PNV_XIVE_SYNC_REDIS 0xe00 /* Sync Redistribution */ + +/* PC synchronisation */ +#define PNV_XIVE_SYNC_PULL 0xe80 /* Sync pull context */ +#define PNV_XIVE_SYNC_PUSH 0xf00 /* Sync push context */ +#define PNV_XIVE_SYNC_VPC 0xf80 /* Sync remove VPC store */ + +static void pnv_xive_ic_hw_trigger(PnvXive *xive, hwaddr addr, uint64_t val) +{ + /* + * Forward the source event notification directly to the Router. + * The source interrupt number should already be correctly encoded + * with the chip block id by the sending device (PHB, PSI). + */ + xive_router_notify(XIVE_NOTIFIER(xive), val); +} + +static void pnv_xive_ic_notify_write(void *opaque, hwaddr addr, uint64_t val, + unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + + /* VC: HW triggers */ + switch (addr) { + case 0x000 ... 0x7FF: + pnv_xive_ic_hw_trigger(opaque, addr, val); + break; + + /* VC: Forwarded IRQs */ + case PNV_XIVE_FORWARD_IPI: + case PNV_XIVE_FORWARD_HW: + case PNV_XIVE_FORWARD_OS_ESC: + case PNV_XIVE_FORWARD_HW_ESC: + case PNV_XIVE_FORWARD_REDIS: + /* TODO: forwarded IRQs. Should be like HW triggers */ + xive_error(xive, "IC: forwarded at @0x%"HWADDR_PRIx" IRQ 0x%"PRIx64, + addr, val); + break; + + /* VC syncs */ + case PNV_XIVE_SYNC_IPI: + case PNV_XIVE_SYNC_HW: + case PNV_XIVE_SYNC_OS_ESC: + case PNV_XIVE_SYNC_HW_ESC: + case PNV_XIVE_SYNC_REDIS: + break; + + /* PC syncs */ + case PNV_XIVE_SYNC_PULL: + case PNV_XIVE_SYNC_PUSH: + case PNV_XIVE_SYNC_VPC: + break; + + default: + xive_error(xive, "IC: invalid notify write @%"HWADDR_PRIx, addr); + } +} + +static uint64_t pnv_xive_ic_notify_read(void *opaque, hwaddr addr, + unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + + /* loads are invalid */ + xive_error(xive, "IC: invalid notify read @%"HWADDR_PRIx, addr); + return -1; +} + +static const MemoryRegionOps pnv_xive_ic_notify_ops = { + .read = pnv_xive_ic_notify_read, + .write = pnv_xive_ic_notify_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 8, + .max_access_size = 8, + }, + .impl = { + .min_access_size = 8, + .max_access_size = 8, + }, +}; + +/* + * IC - LSI MMIO handlers (not modeled) + */ + +static void pnv_xive_ic_lsi_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + + xive_error(xive, "IC: LSI invalid write @%"HWADDR_PRIx, addr); +} + +static uint64_t pnv_xive_ic_lsi_read(void *opaque, hwaddr addr, unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + + xive_error(xive, "IC: LSI invalid read @%"HWADDR_PRIx, addr); + return -1; +} + +static const MemoryRegionOps pnv_xive_ic_lsi_ops = { + .read = pnv_xive_ic_lsi_read, + .write = pnv_xive_ic_lsi_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 8, + .max_access_size = 8, + }, + .impl = { + .min_access_size = 8, + .max_access_size = 8, + }, +}; + +/* + * IC - Indirect TIMA MMIO handlers + */ + +/* + * When the TIMA is accessed from the indirect page, the thread id + * (PIR) has to be configured in the IC registers before. This is used + * for resets and for debug purpose also. + */ +static XiveTCTX *pnv_xive_get_indirect_tctx(PnvXive *xive) +{ + uint64_t tctxt_indir = xive->regs[PC_TCTXT_INDIR0 >> 3]; + PowerPCCPU *cpu = NULL; + int pir; + + if (!(tctxt_indir & PC_TCTXT_INDIR_VALID)) { + xive_error(xive, "IC: no indirect TIMA access in progress"); + return NULL; + } + + pir = GETFIELD(PC_TCTXT_INDIR_THRDID, tctxt_indir) & 0xff; + cpu = ppc_get_vcpu_by_pir(pir); + if (!cpu) { + xive_error(xive, "IC: invalid PIR %x for indirect access", pir); + return NULL; + } + + /* Check that HW thread is XIVE enabled */ + if (!(xive->regs[PC_THREAD_EN_REG0 >> 3] & PPC_BIT(pir & 0x3f))) { + xive_error(xive, "IC: CPU %x is not enabled", pir); + } + + return XIVE_TCTX(pnv_cpu_state(cpu)->intc); +} + +static void xive_tm_indirect_write(void *opaque, hwaddr offset, + uint64_t value, unsigned size) +{ + XiveTCTX *tctx = pnv_xive_get_indirect_tctx(PNV_XIVE(opaque)); + + xive_tctx_tm_write(tctx, offset, value, size); +} + +static uint64_t xive_tm_indirect_read(void *opaque, hwaddr offset, + unsigned size) +{ + XiveTCTX *tctx = pnv_xive_get_indirect_tctx(PNV_XIVE(opaque)); + + return xive_tctx_tm_read(tctx, offset, size); +} + +static const MemoryRegionOps xive_tm_indirect_ops = { + .read = xive_tm_indirect_read, + .write = xive_tm_indirect_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 1, + .max_access_size = 8, + }, + .impl = { + .min_access_size = 1, + .max_access_size = 8, + }, +}; + +/* + * Interrupt controller XSCOM region. + */ +static uint64_t pnv_xive_xscom_read(void *opaque, hwaddr addr, unsigned size) +{ + switch (addr >> 3) { + case X_VC_EQC_CONFIG: + /* FIXME (skiboot): This is the only XSCOM load. Bizarre. */ + return VC_EQC_SYNC_MASK; + default: + return pnv_xive_ic_reg_read(opaque, addr, size); + } +} + +static void pnv_xive_xscom_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + pnv_xive_ic_reg_write(opaque, addr, val, size); +} + +static const MemoryRegionOps pnv_xive_xscom_ops = { + .read = pnv_xive_xscom_read, + .write = pnv_xive_xscom_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 8, + .max_access_size = 8, + }, + .impl = { + .min_access_size = 8, + .max_access_size = 8, + } +}; + +/* + * Virtualization Controller MMIO region containing the IPI and END ESB pages + */ +static uint64_t pnv_xive_vc_read(void *opaque, hwaddr offset, + unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + uint64_t edt_index = offset >> pnv_xive_edt_shift(xive); + uint64_t edt_type = 0; + uint64_t edt_offset; + MemTxResult result; + AddressSpace *edt_as = NULL; + uint64_t ret = -1; + + if (edt_index < XIVE_TABLE_EDT_MAX) { + edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]); + } + + switch (edt_type) { + case CQ_TDR_EDT_IPI: + edt_as = &xive->ipi_as; + break; + case CQ_TDR_EDT_EQ: + edt_as = &xive->end_as; + break; + default: + xive_error(xive, "VC: invalid EDT type for read @%"HWADDR_PRIx, offset); + return -1; + } + + /* Remap the offset for the targeted address space */ + edt_offset = pnv_xive_edt_offset(xive, offset, edt_type); + + ret = address_space_ldq(edt_as, edt_offset, MEMTXATTRS_UNSPECIFIED, + &result); + + if (result != MEMTX_OK) { + xive_error(xive, "VC: %s read failed at @0x%"HWADDR_PRIx " -> @0x%" + HWADDR_PRIx, edt_type == CQ_TDR_EDT_IPI ? "IPI" : "END", + offset, edt_offset); + return -1; + } + + return ret; +} + +static void pnv_xive_vc_write(void *opaque, hwaddr offset, + uint64_t val, unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + uint64_t edt_index = offset >> pnv_xive_edt_shift(xive); + uint64_t edt_type = 0; + uint64_t edt_offset; + MemTxResult result; + AddressSpace *edt_as = NULL; + + if (edt_index < XIVE_TABLE_EDT_MAX) { + edt_type = GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]); + } + + switch (edt_type) { + case CQ_TDR_EDT_IPI: + edt_as = &xive->ipi_as; + break; + case CQ_TDR_EDT_EQ: + edt_as = &xive->end_as; + break; + default: + xive_error(xive, "VC: invalid EDT type for write @%"HWADDR_PRIx, + offset); + return; + } + + /* Remap the offset for the targeted address space */ + edt_offset = pnv_xive_edt_offset(xive, offset, edt_type); + + address_space_stq(edt_as, edt_offset, val, MEMTXATTRS_UNSPECIFIED, &result); + if (result != MEMTX_OK) { + xive_error(xive, "VC: write failed at @0x%"HWADDR_PRIx, edt_offset); + } +} + +static const MemoryRegionOps pnv_xive_vc_ops = { + .read = pnv_xive_vc_read, + .write = pnv_xive_vc_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 8, + .max_access_size = 8, + }, + .impl = { + .min_access_size = 8, + .max_access_size = 8, + }, +}; + +/* + * Presenter Controller MMIO region. The Virtualization Controller + * updates the IPB in the NVT table when required. Not modeled. + */ +static uint64_t pnv_xive_pc_read(void *opaque, hwaddr addr, + unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + + xive_error(xive, "PC: invalid read @%"HWADDR_PRIx, addr); + return -1; +} + +static void pnv_xive_pc_write(void *opaque, hwaddr addr, + uint64_t value, unsigned size) +{ + PnvXive *xive = PNV_XIVE(opaque); + + xive_error(xive, "PC: invalid write to VC @%"HWADDR_PRIx, addr); +} + +static const MemoryRegionOps pnv_xive_pc_ops = { + .read = pnv_xive_pc_read, + .write = pnv_xive_pc_write, + .endianness = DEVICE_BIG_ENDIAN, + .valid = { + .min_access_size = 8, + .max_access_size = 8, + }, + .impl = { + .min_access_size = 8, + .max_access_size = 8, + }, +}; + +void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon) +{ + XiveRouter *xrtr = XIVE_ROUTER(xive); + uint8_t blk = xive->chip->chip_id; + uint32_t srcno0 = XIVE_SRCNO(blk, 0); + uint32_t nr_ipis = pnv_xive_nr_ipis(xive); + uint32_t nr_ends = pnv_xive_nr_ends(xive); + XiveEAS eas; + XiveEND end; + int i; + + monitor_printf(mon, "XIVE[%x] Source %08x .. %08x\n", blk, srcno0, + srcno0 + nr_ipis - 1); + xive_source_pic_print_info(&xive->ipi_source, srcno0, mon); + + monitor_printf(mon, "XIVE[%x] EAT %08x .. %08x\n", blk, srcno0, + srcno0 + nr_ipis - 1); + for (i = 0; i < nr_ipis; i++) { + if (xive_router_get_eas(xrtr, blk, i, &eas)) { + break; + } + if (!xive_eas_is_masked(&eas)) { + xive_eas_pic_print_info(&eas, i, mon); + } + } + + monitor_printf(mon, "XIVE[%x] ENDT %08x .. %08x\n", blk, 0, nr_ends - 1); + for (i = 0; i < nr_ends; i++) { + if (xive_router_get_end(xrtr, blk, i, &end)) { + break; + } + xive_end_pic_print_info(&end, i, mon); + } +} + +static void pnv_xive_reset(void *dev) +{ + PnvXive *xive = PNV_XIVE(dev); + XiveSource *xsrc = &xive->ipi_source; + XiveENDSource *end_xsrc = &xive->end_source; + + /* + * Use the PnvChip id to identify the XIVE interrupt controller. + * It can be overriden by configuration at runtime. + */ + xive->tctx_chipid = xive->chip->chip_id; + + /* Default page size (Should be changed at runtime to 64k) */ + xive->ic_shift = xive->vc_shift = xive->pc_shift = 12; + + /* Clear subregions */ + if (memory_region_is_mapped(&xsrc->esb_mmio)) { + memory_region_del_subregion(&xive->ipi_edt_mmio, &xsrc->esb_mmio); + } + + if (memory_region_is_mapped(&xive->ipi_edt_mmio)) { + memory_region_del_subregion(&xive->ipi_mmio, &xive->ipi_edt_mmio); + } + + if (memory_region_is_mapped(&end_xsrc->esb_mmio)) { + memory_region_del_subregion(&xive->end_edt_mmio, &end_xsrc->esb_mmio); + } + + if (memory_region_is_mapped(&xive->end_edt_mmio)) { + memory_region_del_subregion(&xive->end_mmio, &xive->end_edt_mmio); + } +} + +static void pnv_xive_init(Object *obj) +{ + PnvXive *xive = PNV_XIVE(obj); + + object_initialize_child(obj, "ipi_source", &xive->ipi_source, + sizeof(xive->ipi_source), TYPE_XIVE_SOURCE, + &error_abort, NULL); + object_initialize_child(obj, "end_source", &xive->end_source, + sizeof(xive->end_source), TYPE_XIVE_END_SOURCE, + &error_abort, NULL); +} + +/* + * Maximum number of IRQs and ENDs supported by HW + */ +#define PNV_XIVE_NR_IRQS (PNV9_XIVE_VC_SIZE / (1ull << XIVE_ESB_64K_2PAGE)) +#define PNV_XIVE_NR_ENDS (PNV9_XIVE_VC_SIZE / (1ull << XIVE_ESB_64K_2PAGE)) + +static void pnv_xive_realize(DeviceState *dev, Error **errp) +{ + PnvXive *xive = PNV_XIVE(dev); + XiveSource *xsrc = &xive->ipi_source; + XiveENDSource *end_xsrc = &xive->end_source; + Error *local_err = NULL; + Object *obj; + + obj = object_property_get_link(OBJECT(dev), "chip", &local_err); + if (!obj) { + error_propagate(errp, local_err); + error_prepend(errp, "required link 'chip' not found: "); + return; + } + + /* The PnvChip id identifies the XIVE interrupt controller. */ + xive->chip = PNV_CHIP(obj); + + /* + * The XiveSource and XiveENDSource objects are realized with the + * maximum allowed HW configuration. The ESB MMIO regions will be + * resized dynamically when the controller is configured by the FW + * to limit accesses to resources not provisioned. + */ + object_property_set_int(OBJECT(xsrc), PNV_XIVE_NR_IRQS, "nr-irqs", + &error_fatal); + object_property_add_const_link(OBJECT(xsrc), "xive", OBJECT(xive), + &error_fatal); + object_property_set_bool(OBJECT(xsrc), true, "realized", &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + object_property_set_int(OBJECT(end_xsrc), PNV_XIVE_NR_ENDS, "nr-ends", + &error_fatal); + object_property_add_const_link(OBJECT(end_xsrc), "xive", OBJECT(xive), + &error_fatal); + object_property_set_bool(OBJECT(end_xsrc), true, "realized", &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* Default page size. Generally changed at runtime to 64k */ + xive->ic_shift = xive->vc_shift = xive->pc_shift = 12; + + /* XSCOM region, used for initial configuration of the BARs */ + memory_region_init_io(&xive->xscom_regs, OBJECT(dev), &pnv_xive_xscom_ops, + xive, "xscom-xive", PNV9_XSCOM_XIVE_SIZE << 3); + + /* Interrupt controller MMIO regions */ + memory_region_init(&xive->ic_mmio, OBJECT(dev), "xive-ic", + PNV9_XIVE_IC_SIZE); + + memory_region_init_io(&xive->ic_reg_mmio, OBJECT(dev), &pnv_xive_ic_reg_ops, + xive, "xive-ic-reg", 1 << xive->ic_shift); + memory_region_init_io(&xive->ic_notify_mmio, OBJECT(dev), + &pnv_xive_ic_notify_ops, + xive, "xive-ic-notify", 1 << xive->ic_shift); + + /* The Pervasive LSI trigger and EOI pages (not modeled) */ + memory_region_init_io(&xive->ic_lsi_mmio, OBJECT(dev), &pnv_xive_ic_lsi_ops, + xive, "xive-ic-lsi", 2 << xive->ic_shift); + + /* Thread Interrupt Management Area (Indirect) */ + memory_region_init_io(&xive->tm_indirect_mmio, OBJECT(dev), + &xive_tm_indirect_ops, + xive, "xive-tima-indirect", PNV9_XIVE_TM_SIZE); + /* + * Overall Virtualization Controller MMIO region containing the + * IPI ESB pages and END ESB pages. The layout is defined by the + * EDT "Domain table" and the accesses are dispatched using + * address spaces for each. + */ + memory_region_init_io(&xive->vc_mmio, OBJECT(xive), &pnv_xive_vc_ops, xive, + "xive-vc", PNV9_XIVE_VC_SIZE); + + memory_region_init(&xive->ipi_mmio, OBJECT(xive), "xive-vc-ipi", + PNV9_XIVE_VC_SIZE); + address_space_init(&xive->ipi_as, &xive->ipi_mmio, "xive-vc-ipi"); + memory_region_init(&xive->end_mmio, OBJECT(xive), "xive-vc-end", + PNV9_XIVE_VC_SIZE); + address_space_init(&xive->end_as, &xive->end_mmio, "xive-vc-end"); + + /* + * The MMIO windows exposing the IPI ESBs and the END ESBs in the + * VC region. Their size is configured by the FW in the EDT table. + */ + memory_region_init(&xive->ipi_edt_mmio, OBJECT(xive), "xive-vc-ipi-edt", 0); + memory_region_init(&xive->end_edt_mmio, OBJECT(xive), "xive-vc-end-edt", 0); + + /* Presenter Controller MMIO region (not modeled) */ + memory_region_init_io(&xive->pc_mmio, OBJECT(xive), &pnv_xive_pc_ops, xive, + "xive-pc", PNV9_XIVE_PC_SIZE); + + /* Thread Interrupt Management Area (Direct) */ + memory_region_init_io(&xive->tm_mmio, OBJECT(xive), &xive_tm_ops, + xive, "xive-tima", PNV9_XIVE_TM_SIZE); + + qemu_register_reset(pnv_xive_reset, dev); +} + +static int pnv_xive_dt_xscom(PnvXScomInterface *dev, void *fdt, + int xscom_offset) +{ + const char compat[] = "ibm,power9-xive-x"; + char *name; + int offset; + uint32_t lpc_pcba = PNV9_XSCOM_XIVE_BASE; + uint32_t reg[] = { + cpu_to_be32(lpc_pcba), + cpu_to_be32(PNV9_XSCOM_XIVE_SIZE) + }; + + name = g_strdup_printf("xive@%x", lpc_pcba); + offset = fdt_add_subnode(fdt, xscom_offset, name); + _FDT(offset); + g_free(name); + + _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg)))); + _FDT((fdt_setprop(fdt, offset, "compatible", compat, + sizeof(compat)))); + return 0; +} + +static Property pnv_xive_properties[] = { + DEFINE_PROP_UINT64("ic-bar", PnvXive, ic_base, 0), + DEFINE_PROP_UINT64("vc-bar", PnvXive, vc_base, 0), + DEFINE_PROP_UINT64("pc-bar", PnvXive, pc_base, 0), + DEFINE_PROP_UINT64("tm-bar", PnvXive, tm_base, 0), + DEFINE_PROP_END_OF_LIST(), +}; + +static void pnv_xive_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PnvXScomInterfaceClass *xdc = PNV_XSCOM_INTERFACE_CLASS(klass); + XiveRouterClass *xrc = XIVE_ROUTER_CLASS(klass); + XiveNotifierClass *xnc = XIVE_NOTIFIER_CLASS(klass); + + xdc->dt_xscom = pnv_xive_dt_xscom; + + dc->desc = "PowerNV XIVE Interrupt Controller"; + dc->realize = pnv_xive_realize; + dc->props = pnv_xive_properties; + + xrc->get_eas = pnv_xive_get_eas; + xrc->get_end = pnv_xive_get_end; + xrc->write_end = pnv_xive_write_end; + xrc->get_nvt = pnv_xive_get_nvt; + xrc->write_nvt = pnv_xive_write_nvt; + xrc->get_tctx = pnv_xive_get_tctx; + + xnc->notify = pnv_xive_notify; +}; + +static const TypeInfo pnv_xive_info = { + .name = TYPE_PNV_XIVE, + .parent = TYPE_XIVE_ROUTER, + .instance_init = pnv_xive_init, + .instance_size = sizeof(PnvXive), + .class_init = pnv_xive_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_PNV_XSCOM_INTERFACE }, + { } + } +}; + +static void pnv_xive_register_types(void) +{ + type_register_static(&pnv_xive_info); +} + +type_init(pnv_xive_register_types) diff --git a/hw/intc/pnv_xive_regs.h b/hw/intc/pnv_xive_regs.h new file mode 100644 index 0000000000..c78f030c02 --- /dev/null +++ b/hw/intc/pnv_xive_regs.h @@ -0,0 +1,248 @@ +/* + * QEMU PowerPC XIVE interrupt controller model + * + * Copyright (c) 2017-2018, IBM Corporation. + * + * This code is licensed under the GPL version 2 or later. See the + * COPYING file in the top-level directory. + */ + +#ifndef PPC_PNV_XIVE_REGS_H +#define PPC_PNV_XIVE_REGS_H + +/* IC register offsets 0x0 - 0x400 */ +#define CQ_SWI_CMD_HIST 0x020 +#define CQ_SWI_CMD_POLL 0x028 +#define CQ_SWI_CMD_BCAST 0x030 +#define CQ_SWI_CMD_ASSIGN 0x038 +#define CQ_SWI_CMD_BLK_UPD 0x040 +#define CQ_SWI_RSP 0x048 +#define CQ_CFG_PB_GEN 0x050 +#define CQ_INT_ADDR_OPT PPC_BITMASK(14, 15) +#define CQ_MSGSND 0x058 +#define CQ_CNPM_SEL 0x078 +#define CQ_IC_BAR 0x080 +#define CQ_IC_BAR_VALID PPC_BIT(0) +#define CQ_IC_BAR_64K PPC_BIT(1) +#define CQ_TM1_BAR 0x90 +#define CQ_TM2_BAR 0x0a0 +#define CQ_TM_BAR_VALID PPC_BIT(0) +#define CQ_TM_BAR_64K PPC_BIT(1) +#define CQ_PC_BAR 0x0b0 +#define CQ_PC_BAR_VALID PPC_BIT(0) +#define CQ_PC_BARM 0x0b8 +#define CQ_PC_BARM_MASK PPC_BITMASK(26, 38) +#define CQ_VC_BAR 0x0c0 +#define CQ_VC_BAR_VALID PPC_BIT(0) +#define CQ_VC_BARM 0x0c8 +#define CQ_VC_BARM_MASK PPC_BITMASK(21, 37) +#define CQ_TAR 0x0f0 +#define CQ_TAR_TBL_AUTOINC PPC_BIT(0) +#define CQ_TAR_TSEL PPC_BITMASK(12, 15) +#define CQ_TAR_TSEL_BLK PPC_BIT(12) +#define CQ_TAR_TSEL_MIG PPC_BIT(13) +#define CQ_TAR_TSEL_VDT PPC_BIT(14) +#define CQ_TAR_TSEL_EDT PPC_BIT(15) +#define CQ_TAR_TSEL_INDEX PPC_BITMASK(26, 31) +#define CQ_TDR 0x0f8 +#define CQ_TDR_VDT_VALID PPC_BIT(0) +#define CQ_TDR_VDT_BLK PPC_BITMASK(11, 15) +#define CQ_TDR_VDT_INDEX PPC_BITMASK(28, 31) +#define CQ_TDR_EDT_TYPE PPC_BITMASK(0, 1) +#define CQ_TDR_EDT_INVALID 0 +#define CQ_TDR_EDT_IPI 1 +#define CQ_TDR_EDT_EQ 2 +#define CQ_TDR_EDT_BLK PPC_BITMASK(12, 15) +#define CQ_TDR_EDT_INDEX PPC_BITMASK(26, 31) +#define CQ_PBI_CTL 0x100 +#define CQ_PBI_PC_64K PPC_BIT(5) +#define CQ_PBI_VC_64K PPC_BIT(6) +#define CQ_PBI_LNX_TRIG PPC_BIT(7) +#define CQ_PBI_FORCE_TM_LOCAL PPC_BIT(22) +#define CQ_PBO_CTL 0x108 +#define CQ_AIB_CTL 0x110 +#define CQ_RST_CTL 0x118 +#define CQ_FIRMASK 0x198 +#define CQ_FIRMASK_AND 0x1a0 +#define CQ_FIRMASK_OR 0x1a8 + +/* PC LBS1 register offsets 0x400 - 0x800 */ +#define PC_TCTXT_CFG 0x400 +#define PC_TCTXT_CFG_BLKGRP_EN PPC_BIT(0) +#define PC_TCTXT_CFG_TARGET_EN PPC_BIT(1) +#define PC_TCTXT_CFG_LGS_EN PPC_BIT(2) +#define PC_TCTXT_CFG_STORE_ACK PPC_BIT(3) +#define PC_TCTXT_CFG_HARD_CHIPID_BLK PPC_BIT(8) +#define PC_TCTXT_CHIPID_OVERRIDE PPC_BIT(9) +#define PC_TCTXT_CHIPID PPC_BITMASK(12, 15) +#define PC_TCTXT_INIT_AGE PPC_BITMASK(30, 31) +#define PC_TCTXT_TRACK 0x408 +#define PC_TCTXT_TRACK_EN PPC_BIT(0) +#define PC_TCTXT_INDIR0 0x420 +#define PC_TCTXT_INDIR_VALID PPC_BIT(0) +#define PC_TCTXT_INDIR_THRDID PPC_BITMASK(9, 15) +#define PC_TCTXT_INDIR1 0x428 +#define PC_TCTXT_INDIR2 0x430 +#define PC_TCTXT_INDIR3 0x438 +#define PC_THREAD_EN_REG0 0x440 +#define PC_THREAD_EN_REG0_SET 0x448 +#define PC_THREAD_EN_REG0_CLR 0x450 +#define PC_THREAD_EN_REG1 0x460 +#define PC_THREAD_EN_REG1_SET 0x468 +#define PC_THREAD_EN_REG1_CLR 0x470 +#define PC_GLOBAL_CONFIG 0x480 +#define PC_GCONF_INDIRECT PPC_BIT(32) +#define PC_GCONF_CHIPID_OVR PPC_BIT(40) +#define PC_GCONF_CHIPID PPC_BITMASK(44, 47) +#define PC_VSD_TABLE_ADDR 0x488 +#define PC_VSD_TABLE_DATA 0x490 +#define PC_AT_KILL 0x4b0 +#define PC_AT_KILL_VALID PPC_BIT(0) +#define PC_AT_KILL_BLOCK_ID PPC_BITMASK(27, 31) +#define PC_AT_KILL_OFFSET PPC_BITMASK(48, 60) +#define PC_AT_KILL_MASK 0x4b8 + +/* PC LBS2 register offsets */ +#define PC_VPC_CACHE_ENABLE 0x708 +#define PC_VPC_CACHE_EN_MASK PPC_BITMASK(0, 31) +#define PC_VPC_SCRUB_TRIG 0x710 +#define PC_VPC_SCRUB_MASK 0x718 +#define PC_SCRUB_VALID PPC_BIT(0) +#define PC_SCRUB_WANT_DISABLE PPC_BIT(1) +#define PC_SCRUB_WANT_INVAL PPC_BIT(2) +#define PC_SCRUB_BLOCK_ID PPC_BITMASK(27, 31) +#define PC_SCRUB_OFFSET PPC_BITMASK(45, 63) +#define PC_VPC_CWATCH_SPEC 0x738 +#define PC_VPC_CWATCH_CONFLICT PPC_BIT(0) +#define PC_VPC_CWATCH_FULL PPC_BIT(8) +#define PC_VPC_CWATCH_BLOCKID PPC_BITMASK(27, 31) +#define PC_VPC_CWATCH_OFFSET PPC_BITMASK(45, 63) +#define PC_VPC_CWATCH_DAT0 0x740 +#define PC_VPC_CWATCH_DAT1 0x748 +#define PC_VPC_CWATCH_DAT2 0x750 +#define PC_VPC_CWATCH_DAT3 0x758 +#define PC_VPC_CWATCH_DAT4 0x760 +#define PC_VPC_CWATCH_DAT5 0x768 +#define PC_VPC_CWATCH_DAT6 0x770 +#define PC_VPC_CWATCH_DAT7 0x778 + +/* VC0 register offsets 0x800 - 0xFFF */ +#define VC_GLOBAL_CONFIG 0x800 +#define VC_GCONF_INDIRECT PPC_BIT(32) +#define VC_VSD_TABLE_ADDR 0x808 +#define VC_VSD_TABLE_DATA 0x810 +#define VC_IVE_ISB_BLOCK_MODE 0x818 +#define VC_EQD_BLOCK_MODE 0x820 +#define VC_VPS_BLOCK_MODE 0x828 +#define VC_IRQ_CONFIG_IPI 0x840 +#define VC_IRQ_CONFIG_MEMB_EN PPC_BIT(45) +#define VC_IRQ_CONFIG_MEMB_SZ PPC_BITMASK(46, 51) +#define VC_IRQ_CONFIG_HW 0x848 +#define VC_IRQ_CONFIG_CASCADE1 0x850 +#define VC_IRQ_CONFIG_CASCADE2 0x858 +#define VC_IRQ_CONFIG_REDIST 0x860 +#define VC_IRQ_CONFIG_IPI_CASC 0x868 +#define VC_AIB_TX_ORDER_TAG2_REL_TF PPC_BIT(20) +#define VC_AIB_TX_ORDER_TAG2 0x890 +#define VC_AT_MACRO_KILL 0x8b0 +#define VC_AT_MACRO_KILL_MASK 0x8b8 +#define VC_KILL_VALID PPC_BIT(0) +#define VC_KILL_TYPE PPC_BITMASK(14, 15) +#define VC_KILL_IRQ 0 +#define VC_KILL_IVC 1 +#define VC_KILL_SBC 2 +#define VC_KILL_EQD 3 +#define VC_KILL_BLOCK_ID PPC_BITMASK(27, 31) +#define VC_KILL_OFFSET PPC_BITMASK(48, 60) +#define VC_EQC_CACHE_ENABLE 0x908 +#define VC_EQC_CACHE_EN_MASK PPC_BITMASK(0, 15) +#define VC_EQC_SCRUB_TRIG 0x910 +#define VC_EQC_SCRUB_MASK 0x918 +#define VC_EQC_CONFIG 0x920 +#define X_VC_EQC_CONFIG 0x214 /* XSCOM register */ +#define VC_EQC_CONF_SYNC_IPI PPC_BIT(32) +#define VC_EQC_CONF_SYNC_HW PPC_BIT(33) +#define VC_EQC_CONF_SYNC_ESC1 PPC_BIT(34) +#define VC_EQC_CONF_SYNC_ESC2 PPC_BIT(35) +#define VC_EQC_CONF_SYNC_REDI PPC_BIT(36) +#define VC_EQC_CONF_EQP_INTERLEAVE PPC_BIT(38) +#define VC_EQC_CONF_ENABLE_END_s_BIT PPC_BIT(39) +#define VC_EQC_CONF_ENABLE_END_u_BIT PPC_BIT(40) +#define VC_EQC_CONF_ENABLE_END_c_BIT PPC_BIT(41) +#define VC_EQC_CONF_ENABLE_MORE_QSZ PPC_BIT(42) +#define VC_EQC_CONF_SKIP_ESCALATE PPC_BIT(43) +#define VC_EQC_CWATCH_SPEC 0x928 +#define VC_EQC_CWATCH_CONFLICT PPC_BIT(0) +#define VC_EQC_CWATCH_FULL PPC_BIT(8) +#define VC_EQC_CWATCH_BLOCKID PPC_BITMASK(28, 31) +#define VC_EQC_CWATCH_OFFSET PPC_BITMASK(40, 63) +#define VC_EQC_CWATCH_DAT0 0x930 +#define VC_EQC_CWATCH_DAT1 0x938 +#define VC_EQC_CWATCH_DAT2 0x940 +#define VC_EQC_CWATCH_DAT3 0x948 +#define VC_IVC_SCRUB_TRIG 0x990 +#define VC_IVC_SCRUB_MASK 0x998 +#define VC_SBC_SCRUB_TRIG 0xa10 +#define VC_SBC_SCRUB_MASK 0xa18 +#define VC_SCRUB_VALID PPC_BIT(0) +#define VC_SCRUB_WANT_DISABLE PPC_BIT(1) +#define VC_SCRUB_WANT_INVAL PPC_BIT(2) /* EQC and SBC only */ +#define VC_SCRUB_BLOCK_ID PPC_BITMASK(28, 31) +#define VC_SCRUB_OFFSET PPC_BITMASK(40, 63) +#define VC_IVC_CACHE_ENABLE 0x988 +#define VC_IVC_CACHE_EN_MASK PPC_BITMASK(0, 15) +#define VC_SBC_CACHE_ENABLE 0xa08 +#define VC_SBC_CACHE_EN_MASK PPC_BITMASK(0, 15) +#define VC_IVC_CACHE_SCRUB_TRIG 0x990 +#define VC_IVC_CACHE_SCRUB_MASK 0x998 +#define VC_SBC_CACHE_ENABLE 0xa08 +#define VC_SBC_CACHE_SCRUB_TRIG 0xa10 +#define VC_SBC_CACHE_SCRUB_MASK 0xa18 +#define VC_SBC_CONFIG 0xa20 +#define VC_SBC_CONF_CPLX_CIST PPC_BIT(44) +#define VC_SBC_CONF_CIST_BOTH PPC_BIT(45) +#define VC_SBC_CONF_NO_UPD_PRF PPC_BIT(59) + +/* VC1 register offsets */ + +/* VSD Table address register definitions (shared) */ +#define VST_ADDR_AUTOINC PPC_BIT(0) +#define VST_TABLE_SELECT PPC_BITMASK(13, 15) +#define VST_TSEL_IVT 0 +#define VST_TSEL_SBE 1 +#define VST_TSEL_EQDT 2 +#define VST_TSEL_VPDT 3 +#define VST_TSEL_IRQ 4 /* VC only */ +#define VST_TABLE_BLOCK PPC_BITMASK(27, 31) + +/* Number of queue overflow pages */ +#define VC_QUEUE_OVF_COUNT 6 + +/* + * Bits in a VSD entry. + * + * Note: the address is naturally aligned, we don't use a PPC_BITMASK, + * but just a mask to apply to the address before OR'ing it in. + * + * Note: VSD_FIRMWARE is a SW bit ! It hijacks an unused bit in the + * VSD and is only meant to be used in indirect mode ! + */ +#define VSD_MODE PPC_BITMASK(0, 1) +#define VSD_MODE_SHARED 1 +#define VSD_MODE_EXCLUSIVE 2 +#define VSD_MODE_FORWARD 3 +#define VSD_ADDRESS_MASK 0x0ffffffffffff000ull +#define VSD_MIGRATION_REG PPC_BITMASK(52, 55) +#define VSD_INDIRECT PPC_BIT(56) +#define VSD_TSIZE PPC_BITMASK(59, 63) +#define VSD_FIRMWARE PPC_BIT(2) /* Read warning above */ + +#define VC_EQC_SYNC_MASK \ + (VC_EQC_CONF_SYNC_IPI | \ + VC_EQC_CONF_SYNC_HW | \ + VC_EQC_CONF_SYNC_ESC1 | \ + VC_EQC_CONF_SYNC_ESC2 | \ + VC_EQC_CONF_SYNC_REDI) + + +#endif /* PPC_PNV_XIVE_REGS_H */ diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index b90d03711a..a7ec76dbd6 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -705,7 +705,23 @@ static uint32_t pnv_chip_core_pir_p9(PnvChip *chip, uint32_t core_id) static void pnv_chip_power9_intc_create(PnvChip *chip, PowerPCCPU *cpu, Error **errp) { - return; + Pnv9Chip *chip9 = PNV9_CHIP(chip); + Error *local_err = NULL; + Object *obj; + PnvCPUState *pnv_cpu = pnv_cpu_state(cpu); + + /* + * The core creates its interrupt presenter but the XIVE interrupt + * controller object is initialized afterwards. Hopefully, it's + * only used at runtime. + */ + obj = xive_tctx_create(OBJECT(cpu), XIVE_ROUTER(&chip9->xive), errp); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + pnv_cpu->intc = obj; } /* Allowed core identifiers on a POWER8 Processor Chip : @@ -887,11 +903,19 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) static void pnv_chip_power9_instance_init(Object *obj) { + Pnv9Chip *chip9 = PNV9_CHIP(obj); + + object_initialize_child(obj, "xive", &chip9->xive, sizeof(chip9->xive), + TYPE_PNV_XIVE, &error_abort, NULL); + object_property_add_const_link(OBJECT(&chip9->xive), "chip", obj, + &error_abort); } static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) { PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev); + Pnv9Chip *chip9 = PNV9_CHIP(dev); + PnvChip *chip = PNV_CHIP(dev); Error *local_err = NULL; pcc->parent_realize(dev, &local_err); @@ -899,6 +923,24 @@ static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) error_propagate(errp, local_err); return; } + + /* XIVE interrupt controller (POWER9) */ + object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_IC_BASE(chip), + "ic-bar", &error_fatal); + object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_VC_BASE(chip), + "vc-bar", &error_fatal); + object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_PC_BASE(chip), + "pc-bar", &error_fatal); + object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_TM_BASE(chip), + "tm-bar", &error_fatal); + object_property_set_bool(OBJECT(&chip9->xive), true, "realized", + &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + pnv_xscom_add_subregion(chip, PNV9_XSCOM_XIVE_BASE, + &chip9->xive.xscom_regs); } static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 6b65397b7e..ebbb3d0e9a 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -25,6 +25,7 @@ #include "hw/ppc/pnv_lpc.h" #include "hw/ppc/pnv_psi.h" #include "hw/ppc/pnv_occ.h" +#include "hw/ppc/pnv_xive.h" #define TYPE_PNV_CHIP "pnv-chip" #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP) @@ -82,6 +83,7 @@ typedef struct Pnv9Chip { PnvChip parent_obj; /*< public >*/ + PnvXive xive; } Pnv9Chip; typedef struct PnvChipClass { @@ -215,4 +217,23 @@ void pnv_bmc_powerdown(IPMIBmc *bmc); (0x0003ffe000000000ull + (uint64_t)PNV_CHIP_INDEX(chip) * \ PNV_PSIHB_FSP_SIZE) +/* + * POWER9 MMIO base addresses + */ +#define PNV9_CHIP_BASE(chip, base) \ + ((base) + ((uint64_t) (chip)->chip_id << 42)) + +#define PNV9_XIVE_VC_SIZE 0x0000008000000000ull +#define PNV9_XIVE_VC_BASE(chip) PNV9_CHIP_BASE(chip, 0x0006010000000000ull) + +#define PNV9_XIVE_PC_SIZE 0x0000001000000000ull +#define PNV9_XIVE_PC_BASE(chip) PNV9_CHIP_BASE(chip, 0x0006018000000000ull) + +#define PNV9_XIVE_IC_SIZE 0x0000000000080000ull +#define PNV9_XIVE_IC_BASE(chip) PNV9_CHIP_BASE(chip, 0x0006030203100000ull) + +#define PNV9_XIVE_TM_SIZE 0x0000000000040000ull +#define PNV9_XIVE_TM_BASE(chip) PNV9_CHIP_BASE(chip, 0x0006030203180000ull) + + #endif /* _PPC_PNV_H */ diff --git a/include/hw/ppc/pnv_xive.h b/include/hw/ppc/pnv_xive.h new file mode 100644 index 0000000000..4fdaa9247d --- /dev/null +++ b/include/hw/ppc/pnv_xive.h @@ -0,0 +1,93 @@ +/* + * QEMU PowerPC XIVE interrupt controller model + * + * Copyright (c) 2017-2019, IBM Corporation. + * + * This code is licensed under the GPL version 2 or later. See the + * COPYING file in the top-level directory. + */ + +#ifndef PPC_PNV_XIVE_H +#define PPC_PNV_XIVE_H + +#include "hw/ppc/xive.h" + +struct PnvChip; + +#define TYPE_PNV_XIVE "pnv-xive" +#define PNV_XIVE(obj) OBJECT_CHECK(PnvXive, (obj), TYPE_PNV_XIVE) + +#define XIVE_BLOCK_MAX 16 + +#define XIVE_TABLE_BLK_MAX 16 /* Block Scope Table (0-15) */ +#define XIVE_TABLE_MIG_MAX 16 /* Migration Register Table (1-15) */ +#define XIVE_TABLE_VDT_MAX 16 /* VDT Domain Table (0-15) */ +#define XIVE_TABLE_EDT_MAX 64 /* EDT Domain Table (0-63) */ + +typedef struct PnvXive { + XiveRouter parent_obj; + + /* Owning chip */ + struct PnvChip *chip; + + /* XSCOM addresses giving access to the controller registers */ + MemoryRegion xscom_regs; + + /* Main MMIO regions that can be configured by FW */ + MemoryRegion ic_mmio; + MemoryRegion ic_reg_mmio; + MemoryRegion ic_notify_mmio; + MemoryRegion ic_lsi_mmio; + MemoryRegion tm_indirect_mmio; + MemoryRegion vc_mmio; + MemoryRegion pc_mmio; + MemoryRegion tm_mmio; + + /* + * IPI and END address spaces modeling the EDT segmentation in the + * VC region + */ + AddressSpace ipi_as; + MemoryRegion ipi_mmio; + MemoryRegion ipi_edt_mmio; + + AddressSpace end_as; + MemoryRegion end_mmio; + MemoryRegion end_edt_mmio; + + /* Shortcut values for the Main MMIO regions */ + hwaddr ic_base; + uint32_t ic_shift; + hwaddr vc_base; + uint32_t vc_shift; + hwaddr pc_base; + uint32_t pc_shift; + hwaddr tm_base; + uint32_t tm_shift; + + /* Our XIVE source objects for IPIs and ENDs */ + XiveSource ipi_source; + XiveENDSource end_source; + + /* Interrupt controller registers */ + uint64_t regs[0x300]; + + /* Can be configured by FW */ + uint32_t tctx_chipid; + + /* + * Virtual Structure Descriptor tables : EAT, SBE, ENDT, NVTT, IRQ + * These are in a SRAM protected by ECC. + */ + uint64_t vsds[5][XIVE_BLOCK_MAX]; + + /* Translation tables */ + uint64_t blk[XIVE_TABLE_BLK_MAX]; + uint64_t mig[XIVE_TABLE_MIG_MAX]; + uint64_t vdt[XIVE_TABLE_VDT_MAX]; + uint64_t edt[XIVE_TABLE_EDT_MAX]; +} PnvXive; + +void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon); + +#endif /* PPC_PNV_XIVE_H */ diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h index 255b26a5aa..6623ec54a7 100644 --- a/include/hw/ppc/pnv_xscom.h +++ b/include/hw/ppc/pnv_xscom.h @@ -73,6 +73,9 @@ typedef struct PnvXScomInterfaceClass { #define PNV_XSCOM_OCC_BASE 0x0066000 #define PNV_XSCOM_OCC_SIZE 0x6000 +#define PNV9_XSCOM_XIVE_BASE 0x5013000 +#define PNV9_XSCOM_XIVE_SIZE 0x300 + extern void pnv_xscom_realize(PnvChip *chip, Error **errp); extern int pnv_dt_xscom(PnvChip *chip, void *fdt, int offset);