From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381383090130.03790476857318; Tue, 12 Mar 2019 02:03:03 -0700 (PDT) Received: from localhost ([127.0.0.1]:47653 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dJH-0007Mn-Pl for importer@patchew.org; Tue, 12 Mar 2019 05:02:55 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47288) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC5-0001Tn-Ko for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC4-0001M1-3j for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:29 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:47013) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC2-0001JH-Pp; Tue, 12 Mar 2019 04:55:28 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMG6Dmrz9s7h; Tue, 12 Mar 2019 19:55:22 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380922; bh=CtJZnPdT0k7AZ4hgqR3mpNV0QNnTmlYWSScqch58bfo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PYt4XtZ/pUYv6iXQNL1hH1nqalJqCQUB4jHvhsIHH/jyB16SOIm1hnmzMdUtAXUz6 PYRXfRynehqwTFQdBXZ/8lVmeR9uJEU5Rz3seDpBdXAlUqcQL3Ejsjh6hLAH8kRrC2 V4F88C97i6SKmBXGAuky5Mi/OHZpxkoJdl8Vmj9w= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:01 +1100 Message-Id: <20190312085502.8203-2-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 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, Alexey Kardashevskiy , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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=3D28 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/arc= h/powerpc/Kconfig?h=3Dv5.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 =3D 0; IOMMUMemoryRegion *iommu_mr =3D IOMMU_MEMORY_REGION(section->mr); uint64_t pagesize =3D 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 =3D { .argsz =3D sizeof(crea= te) }; long systempagesize =3D qemu_getrampagesize(); =20 @@ -176,16 +176,38 @@ int vfio_spapr_create_window(VFIOContainer *container, create.window_size =3D int128_get64(section->size); create.page_shift =3D ctz64(pagesize); /* - * SPAPR host supports multilevel TCE tables, there is some - * heuristic to decide how many levels we want for our table: - * 0..64 =3D 1; 65..4096 =3D 2; 4097..262144 =3D 3; 262145.. =3D 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 iii= iiiii + * where: + * r =3D reserved (bits >=3D 55 are reserved in the existing hardwar= e) + * i =3D IOMMU page offset (64K in this example) + * x =3D bits to index a TCE which can be split to equal chunks to i= ndex + * within the level. + * The aim is to split "x" to smaller possible number of levels. */ entries =3D create.window_size >> create.page_shift; - pages =3D MAX((entries * sizeof(uint64_t)) / getpagesize(), 1); - pages =3D MAX(pow2ceil(pages), 1); /* Round up */ - create.levels =3D ctz64(pages) / 6 + 1; - - ret =3D ioctl(container->fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create); + /* bits_total is number of "x" needed */ + bits_total =3D ctz64(entries * sizeof(uint64_t)); + /* + * bits_per_level is a safe guess of how much we can allocate per leve= l: + * 8 is the current minimum for CONFIG_FORCE_MAX_ZONEORDER and MAX_ORD= ER + * is usually bigger than that. + * Below we look at getpagesize() as TCEs are allocated from system pa= ges. + */ + bits_per_level =3D ctz64(getpagesize()) + 8; + create.levels =3D bits_total / bits_per_level; + if (bits_total % bits_per_level) { + ++create.levels; + } + max_levels =3D (64 - create.page_shift) / ctz64(getpagesize()); + for ( ; create.levels <=3D max_levels; ++create.levels) { + ret =3D ioctl(container->fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create); + if (!ret) { + break; + } + } if (ret) { error_report("Failed to create a window, ret =3D %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 =3D 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, ui= nt64_t end) "0x%"PRIx64" vfio_prereg_listener_region_del_skip(uint64_t start, uint64_t end) "0x%"PR= Ix64" - 0x%"PRIx64 vfio_prereg_register(uint64_t va, uint64_t size, int ret) "va=3D0x%"PRIx64= " size=3D0x%"PRIx64" ret=3D%d" vfio_prereg_unregister(uint64_t va, uint64_t size, int ret) "va=3D0x%"PRIx= 64" size=3D0x%"PRIx64" ret=3D%d" -vfio_spapr_create_window(int ps, uint64_t ws, uint64_t off) "pageshift=3D0= x%x winsize=3D0x%"PRIx64" offset=3D0x%"PRIx64 +vfio_spapr_create_window(int ps, unsigned int levels, uint64_t ws, uint64_= t off) "pageshift=3D0x%x levels=3D%u winsize=3D0x%"PRIx64" offset=3D0x%"PRI= x64 vfio_spapr_remove_window(uint64_t off) "offset=3D0x%"PRIx64 vfio_spapr_group_attach(int groupfd, int tablefd) "Attached groupfd %d to = liobn fd %d" --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381224554570.3933056865484; Tue, 12 Mar 2019 02:00:24 -0700 (PDT) Received: from localhost ([127.0.0.1]:47599 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dGo-0005Ql-Ed for importer@patchew.org; Tue, 12 Mar 2019 05:00:22 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47283) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC5-0001Tg-G3 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC4-0001Lw-36 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:29 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:51651) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC3-0001JM-29; Tue, 12 Mar 2019 04:55:28 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMH0rwyz9sBF; Tue, 12 Mar 2019 19:55:22 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380923; bh=si1aQ5pgP/FbMclpUMtl4VQPCJ9/g1i31hyN6EZAbwA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DGCOoYyuowzC9fmaZRL15xtX/y9mifxDfwxnB1J94BSLFNR2vFNlcW7jgZxEtLnPH ufJMkUy38DyxKeSDESCGdYOPzclgFqFVuxuE658H94GFzGS9FmHDScxXyTHsPuulbV wcZGrFxjGIysEu9Q94+7AGbLfftOTGsj3DqEssTY= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:02 +1100 Message-Id: <20190312085502.8203-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 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, Alexey Kardashevskiy , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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 =3D 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 =3D { .argsz =3D sizeof(crea= te) }; - long systempagesize =3D qemu_getrampagesize(); + long rampagesize =3D qemu_getrampagesize(); =20 /* * 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 =3D systempagesize; + if (pagesize > rampagesize) { + pagesize =3D rampagesize; } pagesize =3D 1ULL << (63 - clz64(container->pgsizes & (pagesize | (pagesize - 1)))); --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381068444361.26348790318866; Tue, 12 Mar 2019 01:57:48 -0700 (PDT) Received: from localhost ([127.0.0.1]:47568 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dE9-00035G-BS for importer@patchew.org; Tue, 12 Mar 2019 04:57:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47299) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC6-0001VE-7I for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC5-0001Ms-5m for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:30 -0400 Received: from ozlabs.org ([203.11.71.1]:36595) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC2-0001JT-Ou; Tue, 12 Mar 2019 04:55:29 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMH24hNz9sBp; Tue, 12 Mar 2019 19:55:22 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380923; bh=d8KRjn1xSKbxO4oU0mWeI6TBG8oCZxOpv6BCSAIySzE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dKAinBCKfltwatcDGFebNnjQSN2qT0HSkZ2zZzWrFohHe2UhcbQQ5mFGb0kKscclB fpuLucdiQ28qdj+8OXR5AU7cASgBT5bmhs7UDTnDpIft3HST5l4aRaL4pVB2HJk9Sy wI2vXFD/q6nrvnLY9BqglTim2/walQollUlHL0po= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:03 +1100 Message-Id: <20190312085502.8203-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, Michael Roth , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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); =20 + /* + * 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 =3D spapr_ovec_clone(spapr->ov5); + } + /* DRC reset may cause a device to be unplugged. This will cause troub= les * if this device is used by another device (eg, a running vhost backe= nd * will crash QEMU if the DIMM holding the vring goes away). To avoid = such --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381180079402.23868017355767; Tue, 12 Mar 2019 01:59:40 -0700 (PDT) Received: from localhost ([127.0.0.1]:47595 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dG6-0004oM-SB for importer@patchew.org; Tue, 12 Mar 2019 04:59:38 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47297) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC6-0001Uy-0J for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC4-0001MX-UZ for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:29 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:57703) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC3-0001Jj-03; Tue, 12 Mar 2019 04:55:28 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMH3Lr0z9sBr; Tue, 12 Mar 2019 19:55:23 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380923; bh=aCrdGkZLGLU2BdQ18Stp8cbEYzzENhBuyBfmHvb/ePw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gttnjh39pAt5d0nHku88Bbx8r3p2a0thlLx6xzGtgq0FqN7WNuVzI3TPwFSfP2Xfy mmYRdBlJiyvoc0LGT/g2zApv2NyxrMM5A0/zDbRAELpEqsQWV35/RRk6w8HAi3yIt0 bsw2ll4A/SV91ihBYLKMxTMzUFq21G2KKVapP2KE= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:04 +1100 Message-Id: <20190312085502.8203-5-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 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, Thomas Huth , Michael Roth , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Greg Kurz Commit b8165118f52c broke CPU hotplug tests for old machine types: $ QTEST_QEMU_BINARY=3Dppc64-softmmu/qemu-system-ppc64 ./tests/cpu-plug-test= -m=3Dslow /ppc64/cpu-plug/pseries-3.1/device-add/2x3x1&maxcpus=3D6: OK /ppc64/cpu-plug/pseries-2.12-sxxm/device-add/2x3x1&maxcpus=3D6: OK /ppc64/cpu-plug/pseries-3.0/device-add/2x3x1&maxcpus=3D6: OK /ppc64/cpu-plug/pseries-2.10/device-add/2x3x1&maxcpus=3D6: OK /ppc64/cpu-plug/pseries-2.11/device-add/2x3x1&maxcpus=3D6: OK /ppc64/cpu-plug/pseries-2.12/device-add/2x3x1&maxcpus=3D6: OK /ppc64/cpu-plug/pseries-2.9/device-add/2x3x1&maxcpus=3D6: OK /ppc64/cpu-plug/pseries-2.7/device-add/2x3x1&maxcpus=3D6: ** ERROR:/home/thuth/devel/qemu/hw/ppc/spapr_events.c:313:rtas_event_log_to_so= urce: assertion failed: (source->enabled) Broken pipe /home/thuth/devel/qemu/tests/libqtest.c:143: kill_qemu() detected QEMU deat= h 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 =20 @@ -132,11 +131,6 @@ bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr) g_assert(ov); g_assert(bitnr < OV_MAXBITS); =20 - /* support memory unplug for qtest */ - if (qtest_enabled() && bitnr =3D=3D OV5_HP_EVT) { - return true; - } - return test_bit(bitnr, ov->bitmap) ? true : false; } =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381432202566.2335951402214; Tue, 12 Mar 2019 02:03:52 -0700 (PDT) Received: from localhost ([127.0.0.1]:47670 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dK5-0007wZ-3T for importer@patchew.org; Tue, 12 Mar 2019 05:03:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47354) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC8-0001XW-KF for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC6-0001Qz-PW for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:32 -0400 Received: from ozlabs.org ([203.11.71.1]:59359) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC6-0001MB-3y; Tue, 12 Mar 2019 04:55:30 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMH5Xrpz9sNG; Tue, 12 Mar 2019 19:55:23 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380923; bh=LYYUUIQ/WU2wI1al2YxlAP0yWjEbrfWmN1YhXM1BPKs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LAJiAW5iYg6j2gzhRwwWYAWe59YRoxOaOygtb+9rYMiIb3iK01K+to8XAFqZ8ZEDO bxsicSS6IIa9kV/cMjfrXk1IRrbE2mTXQIhodnNM4OwMOXYLK06SRs7Wr6tPB8zm7o mYs7mP4SX+Yj+sceLDhypm4/GztVbJj9RfAcPPgI= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:05 +1100 Message-Id: <20190312085502.8203-6-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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 =3D { &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] =3D SPAPR_CAP_BROKEN; smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] =3D 16; /* 64kiB */ smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] =3D SPAPR_CAP_OFF; + smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] =3D SPAPR_CAP_OFF; spapr_caps_add_properties(smc, &error_abort); smc->irq =3D &spapr_irq_xics; smc->dr_phb_enabled =3D 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, } } =20 +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=3Doff= "); +} + sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D { [SPAPR_CAP_HTM] =3D { .name =3D "htm", @@ -468,6 +476,15 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = =3D { .type =3D "bool", .apply =3D cap_nested_kvm_hv_apply, }, + [SPAPR_CAP_LARGE_DECREMENTER] =3D { + .name =3D "large-decr", + .description =3D "Allow Large Decrementer", + .index =3D SPAPR_CAP_LARGE_DECREMENTER, + .get =3D spapr_cap_get_bool, + .set =3D spapr_cap_set_bool, + .type =3D "bool", + .apply =3D cap_large_decr_apply, + }, }; =20 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); =20 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) =20 /* * 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; =20 static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap) { --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381826735907.2581926874334; Tue, 12 Mar 2019 02:10:26 -0700 (PDT) Received: from localhost ([127.0.0.1]:47764 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dQX-00057C-Db for importer@patchew.org; Tue, 12 Mar 2019 05:10:25 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47441) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCA-0001Z8-V4 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC6-0001RH-Ul for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:34 -0400 Received: from ozlabs.org ([203.11.71.1]:48283) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC6-0001MK-6M; Tue, 12 Mar 2019 04:55:30 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMJ0KbGz9sNp; Tue, 12 Mar 2019 19:55:23 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380924; bh=Zb2DtfMXfDvvgWg9mePX2+A8eE1zfuCF8NQ4i8aQ/uM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=meQnC+UEYueqB/FcH1VzYLGbdUKs/8DDKNLfZzbPF9WUBAaZk6CuJi4+267N79UvQ McDi6ZEgJvQUjqpiDz90oXAB+AayXHup8jvi5w0rcr2qwVMh0Q2RwnONTZqe74FFqj rUNDA1fXZJMfB5Idz4Olp+iQ8YFTc91ufVrQOT5g= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:06 +1100 Message-Id: <20190312085502.8203-7-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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=C3=A9dric 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) =3D=3D PPC_DECR_UNDERFLOW_TRIGGERED); } =20 -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 =3D env->tb_env; - uint32_t decr; - int64_t diff; + int64_t decr, diff; =20 diff =3D next - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); if (diff >=3D 0) { @@ -758,27 +757,49 @@ static inline uint32_t _cpu_ppc_load_decr(CPUPPCState= *env, uint64_t next) } else { decr =3D -muldiv64(-diff, tb_env->decr_freq, NANOSECONDS_PER_SECON= D); } - LOG_TB("%s: %08" PRIx32 "\n", __func__, decr); + LOG_TB("%s: %016" PRIx64 "\n", __func__, decr); =20 return decr; } =20 -uint32_t cpu_ppc_load_decr (CPUPPCState *env) +target_ulong cpu_ppc_load_decr(CPUPPCState *env) { ppc_tb_t *tb_env =3D env->tb_env; + uint64_t decr; =20 if (kvm_enabled()) { return env->spr[SPR_DECR]; } =20 - return _cpu_ppc_load_decr(env, tb_env->decr_next); + decr =3D _cpu_ppc_load_decr(env, tb_env->decr_next); + + /* + * If large decrementer is enabled then the decrementer is signed exte= ned + * to 64 bits, otherwise it is a 32 bit value. + */ + if (env->spr[SPR_LPCR] & LPCR_LD) { + return decr; + } + return (uint32_t) decr; } =20 -uint32_t cpu_ppc_load_hdecr (CPUPPCState *env) +target_ulong cpu_ppc_load_hdecr(CPUPPCState *env) { + PowerPCCPU *cpu =3D ppc_env_get_cpu(env); + PowerPCCPUClass *pcc =3D POWERPC_CPU_GET_CLASS(cpu); ppc_tb_t *tb_env =3D env->tb_env; + uint64_t hdecr; + + hdecr =3D _cpu_ppc_load_decr(env, tb_env->hdecr_next); =20 - 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; } =20 uint64_t cpu_ppc_load_purr (CPUPPCState *env) @@ -832,13 +853,22 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uin= t64_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 =3D &cpu->env; ppc_tb_t *tb_env =3D env->tb_env; uint64_t now, next; + bool negative; + + /* Truncate value to decr_width and sign extend for simplicity */ + value &=3D ((1ULL << nr_bits) - 1); + negative =3D !!(value & (1ULL << (nr_bits - 1))); + if (negative) { + value |=3D (0xFFFFFFFFULL << nr_bits); + } =20 - LOG_TB("%s: %08" PRIx32 " =3D> %08" PRIx32 "\n", __func__, + LOG_TB("%s: " TARGET_FMT_lx " =3D> " TARGET_FMT_lx "\n", __func__, decr, value); =20 if (kvm_enabled()) { @@ -860,15 +890,15 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uin= t64_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 & 0x8000= 0000) - && !(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; } =20 /* 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); } =20 @@ -881,21 +911,27 @@ static void __cpu_ppc_store_decr(PowerPCCPU *cpu, uin= t64_t *nextp, timer_mod(timer, next); } =20 -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 =3D cpu->env.tb_env; =20 __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); } =20 -void cpu_ppc_store_decr (CPUPPCState *env, uint32_t value) +void cpu_ppc_store_decr(CPUPPCState *env, target_ulong value) { PowerPCCPU *cpu =3D ppc_env_get_cpu(env); + PowerPCCPUClass *pcc =3D POWERPC_CPU_GET_CLASS(cpu); + int nr_bits =3D 32; + + if (env->spr[SPR_LPCR] & LPCR_LD) { + nr_bits =3D pcc->lrg_decr_bits; + } =20 - _cpu_ppc_store_decr(cpu, cpu_ppc_load_decr(env), value); + _cpu_ppc_store_decr(cpu, cpu_ppc_load_decr(env), value, nr_bits); } =20 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); } =20 -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 hdec= r, + target_ulong value, int nr_bits) { ppc_tb_t *tb_env =3D cpu->env.tb_env; =20 if (tb_env->hdecr_timer !=3D 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); } } =20 -void cpu_ppc_store_hdecr (CPUPPCState *env, uint32_t value) +void cpu_ppc_store_hdecr(CPUPPCState *env, target_ulong value) { PowerPCCPU *cpu =3D ppc_env_get_cpu(env); + PowerPCCPUClass *pcc =3D POWERPC_CPU_GET_CLASS(cpu); =20 - _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); } =20 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 sta= rtup, * 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); } =20 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) !=3D SPAPR_CAP_O= FF) + _FDT((fdt_setprop_u32(fdt, offset, "ibm,dec-bits", + pcc->lrg_decr_bits))); } =20 static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spap= r) 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 =3D 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 POWE= R9"); + return; + } + } else { error_setg(errp, "No large decrementer support, try cap-large-decr=3Doff= "); + } +} + +static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr, + PowerPCCPU *cpu, + uint8_t val, Error **errp) +{ + CPUPPCState *env =3D &cpu->env; + target_ulong lpcr =3D env->spr[SPR_LPCR]; + + if (val) { + lpcr |=3D LPCR_LD; + } else { + lpcr &=3D ~LPCR_LD; + } + ppc_store_lpcr(cpu, lpcr); } =20 sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D { @@ -484,6 +513,7 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D= { .set =3D spapr_cap_set_bool, .type =3D "bool", .apply =3D cap_large_decr_apply, + .cpu_apply =3D cap_large_decr_cpu_apply, }, }; =20 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 =3D 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_L= D | (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EE= E | 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, fprint= f_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.in= c.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 =3D ppc_hash64_handle_mmu_fault; pcc->hash64_opts =3D &ppc_hash64_opts_basic; + pcc->lrg_decr_bits =3D 32; #endif pcc->excp_model =3D POWERPC_EXCP_970; pcc->bus_model =3D PPC_FLAGS_INPUT_970; @@ -8550,6 +8551,7 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data) #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault =3D ppc_hash64_handle_mmu_fault; pcc->hash64_opts =3D &ppc_hash64_opts_POWER7; + pcc->lrg_decr_bits =3D 32; #endif pcc->excp_model =3D POWERPC_EXCP_POWER7; pcc->bus_model =3D PPC_FLAGS_INPUT_POWER7; @@ -8718,6 +8720,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data) #if defined(CONFIG_SOFTMMU) pcc->handle_mmu_fault =3D ppc_hash64_handle_mmu_fault; pcc->hash64_opts =3D &ppc_hash64_opts_POWER7; + pcc->lrg_decr_bits =3D 32; #endif pcc->excp_model =3D POWERPC_EXCP_POWER8; pcc->bus_model =3D PPC_FLAGS_INPUT_POWER7; @@ -8926,6 +8929,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) /* segment page size remain the same */ pcc->hash64_opts =3D &ppc_hash64_opts_POWER7; pcc->radix_page_info =3D &POWER9_radix_page_info; + pcc->lrg_decr_bits =3D 56; #endif pcc->excp_model =3D POWERPC_EXCP_POWER9; pcc->bus_model =3D PPC_FLAGS_INPUT_POWER9; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381569422976.3545683291599; Tue, 12 Mar 2019 02:06:09 -0700 (PDT) Received: from localhost ([127.0.0.1]:47726 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dMM-0001V0-OP for importer@patchew.org; Tue, 12 Mar 2019 05:06:06 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47349) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC8-0001XU-Do for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC6-0001QU-LI for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:32 -0400 Received: from ozlabs.org ([203.11.71.1]:59891) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC5-0001MA-Vh; Tue, 12 Mar 2019 04:55:30 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMH4bTQz9sDn; Tue, 12 Mar 2019 19:55:23 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380923; bh=OvnEEP7kPg+yzm2FBRfVMvT/lAkm9R8S9IFnPXi+KGs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fP+rwKPpIet4M0/Hw27b06e266226GmyGo7OLCYtoBhUJWJVTG+ouxYSB9PwGQRH1 Vykvr/0j+laBxF115peSSZkXlIY8aGMJhM7QRRACxEMfzJwqgja/7Nj3nzUDoLjC5k 5N+V8C0qWqLHKO1Jfr5y1WtQLhZEnGieHHEjoNAU= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:07 +1100 Message-Id: <20190312085502.8203-8-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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=C3=A9dric 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 *spa= pr, uint8_t val, Error **errp) { PowerPCCPU *cpu =3D POWERPC_CPU(first_cpu); + PowerPCCPUClass *pcc =3D POWERPC_CPU_GET_CLASS(cpu); =20 if (!val) { return; /* Disabled by default */ @@ -406,9 +407,17 @@ static void cap_large_decr_apply(sPAPRMachineState *sp= apr, "Large decrementer only supported on POWER9, try -cpu POWE= R9"); return; } - } else { - error_setg(errp, - "No large decrementer support, try cap-large-decr=3Doff= "); + } else if (kvm_enabled()) { + int kvm_nr_bits =3D kvmppc_get_cap_large_decr(); + + if (!kvm_nr_bits) { + error_setg(errp, + "No large decrementer support, try cap-large-decr= =3Doff"); + } else if (pcc->lrg_decr_bits !=3D kvm_nr_bits) { + error_setg(errp, +"KVM large decrementer size (%d) differs to model (%d), try -cap-large-dec= r=3Doff", + kvm_nr_bits, pcc->lrg_decr_bits); + } } } =20 @@ -419,6 +428,13 @@ static void cap_large_decr_cpu_apply(sPAPRMachineState= *spapr, CPUPPCState *env =3D &cpu->env; target_ulong lpcr =3D env->spr[SPR_LPCR]; =20 + if (kvm_enabled()) { + if (kvmppc_enable_cap_large_decr(cpu, val)) { + error_setg(errp, + "No large decrementer support, try cap-large-decr= =3Doff"); + } + } + if (val) { lpcr |=3D 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; =20 static uint32_t debug_inst_opcode; =20 @@ -124,6 +125,7 @@ static bool kvmppc_is_pr(KVMState *ks) =20 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); =20 int kvm_arch_init(MachineState *ms, KVMState *s) { @@ -151,6 +153,7 @@ int kvm_arch_init(MachineState *ms, KVMState *s) cap_resize_hpt =3D kvm_vm_check_extension(s, KVM_CAP_SPAPR_RESIZE_HPT); kvmppc_get_cpu_characteristics(s); cap_ppc_nested_kvm_hv =3D kvm_vm_check_extension(s, KVM_CAP_PPC_NESTED= _HV); + cap_large_decr =3D 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"); } =20 +static int kvmppc_get_dec_bits(void) +{ + int nr_bits =3D 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 *pvin= fo) { PowerPCCPU *cpu =3D ppc_env_get_cpu(env); @@ -2442,6 +2455,35 @@ bool kvmppc_has_cap_spapr_vfio(void) return cap_spapr_vfio; } =20 +int kvmppc_get_cap_large_decr(void) +{ + return cap_large_decr; +} + +int kvmppc_enable_cap_large_decr(PowerPCCPU *cpu, int enable) +{ + CPUState *cs =3D 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) !=3D !!enable) { + if (enable) { + lpcr |=3D LPCR_LD; + } else { + lpcr &=3D ~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) !=3D !!enable) { + return -1; + } + } + + return 0; +} + PowerPCCPUClass *kvm_ppc_get_host_cpu_class(void) { uint32_t host_pvr =3D 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 ena= ble) return -1; } =20 +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; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381082392277.56439326508996; Tue, 12 Mar 2019 01:58:02 -0700 (PDT) Received: from localhost ([127.0.0.1]:47571 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dET-0003Pi-Ji for importer@patchew.org; Tue, 12 Mar 2019 04:57:57 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47339) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC7-0001XC-S9 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC6-0001Qj-Ow for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:31 -0400 Received: from ozlabs.org ([203.11.71.1]:36469) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC6-0001ML-9l; Tue, 12 Mar 2019 04:55:30 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMJ1YYqz9sN6; Tue, 12 Mar 2019 19:55:23 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380924; bh=LQuQAhiLQBrR4L2zGhw7Rpi3FVfFRxlgMoOswQPfdiI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jdKsnMhPUi5LKqOJd7yXZfE3k7l4W+q84jZQSGw+9IPYXAY8UIXlqxTqMtHfiwASa iDnfFDSxiPmaH+ZB/gvgStOA011yqgjthsArqBaLGwzITn3lG54Z7muHIqMPvvqK8H safoHLYVg2SkfTo4lHsWmi17/DoxR6b8HwKt3f4c= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:08 +1100 Message-Id: <20190312085502.8203-9-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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] =3D SPAPR_CAP_BROKEN; smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] =3D 16; /* 64kiB */ smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] =3D SPAPR_CAP_OFF; - smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] =3D SPAPR_CAP_OFF; + smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] =3D SPAPR_CAP_ON; spapr_caps_add_properties(smc, &error_abort); smc->irq =3D &spapr_irq_xics; smc->dr_phb_enabled =3D true; @@ -4387,6 +4387,7 @@ static void spapr_machine_3_1_class_options(MachineCl= ass *mc) mc->default_cpu_type =3D POWERPC_CPU_TYPE_NAME("power8_v2.0"); smc->update_dt_enabled =3D false; smc->dr_phb_enabled =3D false; + smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] =3D SPAPR_CAP_OFF; } =20 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(sPAPRMa= chineState *spapr, =20 caps =3D smc->default_caps; =20 + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_3_00, + 0, spapr->max_compat_pvr)) { + caps.caps[SPAPR_CAP_LARGE_DECREMENTER] =3D SPAPR_CAP_OFF; + } + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_2_07, 0, spapr->max_compat_pvr)) { caps.caps[SPAPR_CAP_HTM] =3D SPAPR_CAP_OFF; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381255081590.5260509550519; Tue, 12 Mar 2019 02:00:55 -0700 (PDT) Received: from localhost ([127.0.0.1]:47631 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dHJ-0005t1-Sm for importer@patchew.org; Tue, 12 Mar 2019 05:00:53 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47395) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC9-0001Xl-IT for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC7-0001Rv-8S for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:33 -0400 Received: from ozlabs.org ([203.11.71.1]:50811) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC6-0001MP-Gd; Tue, 12 Mar 2019 04:55:31 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMJ5xMXz9sNx; Tue, 12 Mar 2019 19:55:23 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380924; bh=ZabrS88oqhSgcIO0ayoWN82tRfi20ufdk+yFPqZqqxo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K/Io/sxlkBt6U9+FOl/WmgeOeotPygMFptC9TTQA1gcB/sTP4IrDfO+fePrySEe9X 1n1C49MdvRkVB+fWvJcyx1pvoiK7K4ReuhOve66RtPXwaBcM+SsBxtHT2oGMQlkilh DjlhIMFmoA6Q9yF0MVi70qKtihcesCN4eUzvK7Rg= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:09 +1100 Message-Id: <20190312085502.8203-10-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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(sPAPRMachineS= tate *spapr, uint8_t val, } =20 sPAPRCapPossible cap_ibs_possible =3D { - .num =3D 4, + .num =3D 5, /* Note workaround only maintained for compatibility */ - .vals =3D {"broken", "workaround", "fixed-ibs", "fixed-ccd"}, - .help =3D "broken - no protection, fixed-ibs - indirect branch seriali= sation," - " fixed-ccd - cache count disabled", + .vals =3D {"broken", "workaround", "fixed-ibs", "fixed-ccd", "fixed-na= "}, + .help =3D "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)", }; =20 static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, @@ -288,15 +290,11 @@ static void cap_safe_indirect_branch_apply(sPAPRMachi= neState *spapr, { uint8_t kvm_val =3D kvmppc_get_cap_safe_indirect_branch(); =20 - if (val =3D=3D SPAPR_CAP_WORKAROUND) { /* Can only be Broken or Fixed = */ - error_setg(errp, -"Requested safe indirect branch capability level \"workaround\" not valid,= try cap-ibs=3D%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 !=3D 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=3D%s", cap_ibs_possible.vals[kvm_val]); @@ -494,7 +492,8 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D= { [SPAPR_CAP_IBS] =3D { .name =3D "ibs", .description =3D - "Indirect Branch Speculation (broken, fixed-ibs, fixed-ccd)", + "Indirect Branch Speculation (broken, workaround, fixed-ibs," + "fixed-ccd, fixed-na)", .index =3D SPAPR_CAP_IBS, .get =3D spapr_cap_get_string, .set =3D 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(Power= PCCPU *cpu, } =20 switch (safe_indirect_branch) { + case SPAPR_CAP_FIXED_NA: + break; case SPAPR_CAP_FIXED_CCD: characteristics |=3D H_CPU_CHAR_CACHE_COUNT_DIS; break; case SPAPR_CAP_FIXED_IBS: characteristics |=3D H_CPU_CHAR_BCCTRL_SERIALISED; break; + case SPAPR_CAP_WORKAROUND: + behaviour |=3D H_CPU_BEHAV_FLUSH_COUNT_CACHE; + break; default: /* broken */ assert(safe_indirect_branch =3D=3D 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.= .. */ =20 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) =20 /* 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 kv= m_ppc_cpu_char c) =20 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_CA= CHE) { + 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_SERIALIS= ED) { return SPAPR_CAP_FIXED_IBS; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381660702128.91948610565134; Tue, 12 Mar 2019 02:07:40 -0700 (PDT) Received: from localhost ([127.0.0.1]:47736 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dNp-0002fd-91 for importer@patchew.org; Tue, 12 Mar 2019 05:07:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47407) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dC9-0001Y3-UB for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dC7-0001RY-3A for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:33 -0400 Received: from ozlabs.org ([203.11.71.1]:49469) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dC6-0001MN-CJ; Tue, 12 Mar 2019 04:55:30 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMJ33cdz9sNH; Tue, 12 Mar 2019 19:55:24 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380924; bh=t+KYmKTxH3gAEabZ1BB9TvhHvBQf9X+Fbr+9POSEsGY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hXK6CsNnNviyIv4IOv8zNt/glO9adQnOWtJQAQAgHUyRE2F1Ktd6SEg0mVfi8GgSf BRa1Kxlt+lTWSFPm36Q+2nqTR/S37hj35q+Yg9edpPA91avDU2NYRhuwMSkKl3xPB0 rCzHTJgXW11l97VeJkhZ5rxCS0PP6n//EANtToTk= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:10 +1100 Message-Id: <20190312085502.8203-11-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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 =3D { &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] =3D 16; /* 64kiB */ smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] =3D SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] =3D SPAPR_CAP_ON; + smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] =3D SPAPR_CAP_OFF; spapr_caps_add_properties(smc, &error_abort); smc->irq =3D &spapr_irq_xics; smc->dr_phb_enabled =3D 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); } =20 +static void cap_ccf_assist_apply(sPAPRMachineState *spapr, uint8_t val, + Error **errp) +{ + uint8_t kvm_val =3D 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=3Doff"); + } 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=3Doff"); + } +} + sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D { [SPAPR_CAP_HTM] =3D { .name =3D "htm", @@ -530,6 +545,15 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = =3D { .apply =3D cap_large_decr_apply, .cpu_apply =3D cap_large_decr_cpu_apply, }, + [SPAPR_CAP_CCF_ASSIST] =3D { + .name =3D "ccf-assist", + .description =3D "Count Cache Flush Assist via HW Instruction", + .index =3D SPAPR_CAP_CCF_ASSIST, + .get =3D spapr_cap_get_bool, + .set =3D spapr_cap_set_bool, + .type =3D "bool", + .apply =3D cap_ccf_assist_apply, + }, }; =20 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); =20 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(PowerPC= CPU *cpu, uint8_t safe_cache =3D spapr_get_cap(spapr, SPAPR_CAP_CFPC); uint8_t safe_bounds_check =3D spapr_get_cap(spapr, SPAPR_CAP_SBBC); uint8_t safe_indirect_branch =3D spapr_get_cap(spapr, SPAPR_CAP_IBS); + uint8_t count_cache_flush_assist =3D spapr_get_cap(spapr, + SPAPR_CAP_CCF_ASSIST); =20 switch (safe_cache) { case SPAPR_CAP_WORKAROUND: @@ -1733,6 +1735,9 @@ static target_ulong h_get_cpu_characteristics(PowerPC= CPU *cpu, break; case SPAPR_CAP_WORKAROUND: behaviour |=3D H_CPU_BEHAV_FLUSH_COUNT_CACHE; + if (count_cache_flush_assist) { + characteristics |=3D H_CPU_CHAR_BCCTR_FLUSH_ASSIST; + } break; default: /* broken */ assert(safe_indirect_branch =3D=3D 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) =20 /* * 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; =20 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; =20 @@ -2407,6 +2408,14 @@ static int parse_cap_ppc_safe_indirect_branch(struct= kvm_ppc_cpu_char c) return 0; } =20 +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 =3D parse_cap_ppc_safe_cache(c); cap_ppc_safe_bounds_check =3D parse_cap_ppc_safe_bounds_check(c); cap_ppc_safe_indirect_branch =3D parse_cap_ppc_safe_indirect_branch(c); + cap_ppc_count_cache_flush_assist =3D + parse_cap_ppc_count_cache_flush_assist(c); } =20 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; } =20 +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; } =20 +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; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382231281909.344630269499; Tue, 12 Mar 2019 02:17:11 -0700 (PDT) Received: from localhost ([127.0.0.1]:47900 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dX1-00031D-4g for importer@patchew.org; Tue, 12 Mar 2019 05:17:07 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47552) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCF-0001cz-0f for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCD-0001Z8-IN for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:38 -0400 Received: from ozlabs.org ([203.11.71.1]:49303) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCC-0001NK-Q0; Tue, 12 Mar 2019 04:55:37 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMK13q9z9sNM; Tue, 12 Mar 2019 19:55:24 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380925; bh=Zq/GjxDmA4dbVz9fqIGIKihyJsFOyFL1uSWBZtSHJ/A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Laks7NC28lzkAPrIqUZ5WhpEnBArHAFi1nDCsQmxV/ixlMQZyI8DF+aBYyNz8rOfO Ua0XKwRA/64H7sXkQ69ZyGeMCyY9Sg8FhavJmfodb5ih++adh65GEXB96FOtlivo5A VNkZKtSFxzQTBCOtdy0QT7e3bl82FpCjH6V+nYtw= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:11 +1100 Message-Id: <20190312085502.8203-12-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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" =20 #include "hw/ppc/spapr.h" =20 @@ -239,17 +240,22 @@ sPAPRCapPossible cap_cfpc_possible =3D { static void cap_safe_cache_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { + Error *local_err =3D NULL; uint8_t kvm_val =3D kvmppc_get_cap_safe_cache(); =20 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 differe= nt value for cap-cfpc"); + /* TCG only supports broken, allow other values and print a warnin= g */ + error_setg(&local_err, + "TCG doesn't support requested feature, cap-cfpc=3D%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= =3D%s", cap_cfpc_possible.vals[kvm_val]); } + + if (local_err !=3D NULL) + warn_report_err(local_err); } =20 sPAPRCapPossible cap_sbbc_possible =3D { @@ -262,17 +268,22 @@ sPAPRCapPossible cap_sbbc_possible =3D { static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t = val, Error **errp) { + Error *local_err =3D NULL; uint8_t kvm_val =3D kvmppc_get_cap_safe_bounds_check(); =20 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 warnin= g */ + error_setg(&local_err, + "TCG doesn't support requested feature, cap-sbbc=3D%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 ca= p-sbbc=3D%s", cap_sbbc_possible.vals[kvm_val]); } + + if (local_err !=3D NULL) + warn_report_err(local_err); } =20 sPAPRCapPossible cap_ibs_possible =3D { @@ -288,17 +299,23 @@ sPAPRCapPossible cap_ibs_possible =3D { static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { + Error *local_err =3D NULL; uint8_t kvm_val =3D kvmppc_get_cap_safe_indirect_branch(); =20 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 warnin= g */ + error_setg(&local_err, + "TCG doesn't support requested feature, cap-ibs=3D%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=3D%s", cap_ibs_possible.vals[kvm_val]); } + + if (local_err !=3D NULL) { + warn_report_err(local_err); + } } =20 #define VALUE_DESC_TRISTATE " (broken, workaround, fixed)" --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382274590132.86550694856498; Tue, 12 Mar 2019 02:17:54 -0700 (PDT) Received: from localhost ([127.0.0.1]:47906 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dXj-0003UB-DD for importer@patchew.org; Tue, 12 Mar 2019 05:17:51 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47761) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCZ-00021N-AG for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCY-0001oN-Cd for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:59 -0400 Received: from ozlabs.org ([203.11.71.1]:33339) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCX-0001Rd-Vk; Tue, 12 Mar 2019 04:55:58 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMK3sR5z9sP2; Tue, 12 Mar 2019 19:55:24 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380925; bh=1129KgM3hzoZaItATBc90PC4HlSZ4OoQBvzQvn/UrXI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cJp8OVk1Wo1Fl39mhzT193kcUspDVlojEMfGz8/JUOs9Xb/YZ+oVO40om8S331b8T M01hZeIKYHlid9AEfjQolg8g4XQ5kjoe5dGx4kDj3f88S4B7mH/pc0q3qrEzwDNC5P MoJ1K1KYMdaLpE9sqeMHGo8/gEXt69MBpNZV9cF0= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:12 +1100 Message-Id: <20190312085502.8203-13-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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] =3D SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_VSX] =3D SPAPR_CAP_ON; smc->default_caps.caps[SPAPR_CAP_DFP] =3D SPAPR_CAP_ON; - smc->default_caps.caps[SPAPR_CAP_CFPC] =3D SPAPR_CAP_BROKEN; - smc->default_caps.caps[SPAPR_CAP_SBBC] =3D SPAPR_CAP_BROKEN; - smc->default_caps.caps[SPAPR_CAP_IBS] =3D SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_CFPC] =3D SPAPR_CAP_WORKAROUND; + smc->default_caps.caps[SPAPR_CAP_SBBC] =3D SPAPR_CAP_WORKAROUND; + smc->default_caps.caps[SPAPR_CAP_IBS] =3D SPAPR_CAP_WORKAROUND; smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] =3D 16; /* 64kiB */ smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] =3D SPAPR_CAP_OFF; smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] =3D SPAPR_CAP_ON; @@ -4389,6 +4389,9 @@ static void spapr_machine_3_1_class_options(MachineCl= ass *mc) mc->default_cpu_type =3D POWERPC_CPU_TYPE_NAME("power8_v2.0"); smc->update_dt_enabled =3D false; smc->dr_phb_enabled =3D false; + smc->default_caps.caps[SPAPR_CAP_CFPC] =3D SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_SBBC] =3D SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_IBS] =3D SPAPR_CAP_BROKEN; smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] =3D SPAPR_CAP_OFF; } =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382049951115.21275950796746; Tue, 12 Mar 2019 02:14:09 -0700 (PDT) Received: from localhost ([127.0.0.1]:47842 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dU5-00087A-7H for importer@patchew.org; Tue, 12 Mar 2019 05:14:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47551) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCF-0001cy-0e for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCD-0001ZU-RC for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:38 -0400 Received: from ozlabs.org ([203.11.71.1]:40631) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCD-0001OV-Bg; Tue, 12 Mar 2019 04:55:37 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMK2CLlz9sNy; Tue, 12 Mar 2019 19:55:25 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380925; bh=VMO/Zhzw4HeuR3K80BXH37ri6fuDg8EhFGofHgHXSJM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=THKTReRkIKBHhzgyAVFC+EBOhhlkRZRteTeS4B35YXA47SJx1Lcrk4kdT8fpICawS uzXuT8QuzbaS+aZK7CSoc+b4lz88KL+82zGCLVbuPUzmXZcyhojfimbKAGyvxpXq6R z1+qTP3/L4eAmC1j2tPB+RNNgYlOxjuIekcYT0PM= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:13 +1100 Message-Id: <20190312085502.8203-14-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, Fabiano Rosas , Alexey Kardashevskiy , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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, CPUPPCSt= ate *env, int excp, return POWERPC_EXCP_RESET; } =20 +static uint64_t ppc_excp_vector_offset(CPUState *cs, int ail) +{ + uint64_t offset =3D 0; + + switch (ail) { + case AIL_0001_8000: + offset =3D 0x18000; + break; + case AIL_C000_0000_0000_4000: + offset =3D 0xc000000000004000ull; + break; + default: + cpu_abort(cs, "Invalid AIL combination %d\n", ail); + break; + } + + return offset; +} =20 /* 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 e= xcp_model, int excp) /* Handle AIL */ if (ail) { new_msr |=3D (1 << MSR_IR) | (1 << MSR_DR); - switch(ail) { - case AIL_0001_8000: - vector |=3D 0x18000; - break; - case AIL_C000_0000_0000_4000: - vector |=3D 0xc000000000004000ull; - break; - default: - cpu_abort(cs, "Invalid AIL combination %d\n", ail); - break; - } + vector |=3D ppc_excp_vector_offset(cs, ail); } =20 #if defined(TARGET_PPC64) --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381280277165.2994278546836; Tue, 12 Mar 2019 02:01:20 -0700 (PDT) Received: from localhost ([127.0.0.1]:47639 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dHj-00068f-1A for importer@patchew.org; Tue, 12 Mar 2019 05:01:19 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47483) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCC-0001aS-KR for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCB-0001XY-JP for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:36 -0400 Received: from ozlabs.org ([203.11.71.1]:42887) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCA-0001Rz-Tr; Tue, 12 Mar 2019 04:55:35 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTML38Hdz9sP6; Tue, 12 Mar 2019 19:55:25 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380926; bh=qR/R0MY3QIAq48FDvnmhNjl92og3dwnqH+1oxvI5Pjo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CF1n1UqrbOQkXwlBvhv3MgcFtpRqvkBAh69Bki2wDEoVZTkMIuPyHwjAkdgG+u7lx K+3bioVsJJnNrtUpUmA88YuP8iKSLkk8Ej7S9MD3QkIR3KVpR6iMuJWSlhbBBxYDXY qf8YW00sK4LI453fn9nXHm9+S4FDCZF21HcN6M8g= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:14 +1100 Message-Id: <20190312085502.8203-15-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, Fabiano Rosas , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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, stru= ct kvm_guest_debug *dbg) } } =20 +static int kvm_handle_hw_breakpoint(CPUState *cs, + struct kvm_debug_exit_arch *arch_info) +{ + int handle =3D 0; + int n; + int flag =3D 0; + + if (nb_hw_breakpoint + nb_hw_watchpoint > 0) { + if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { + n =3D find_hw_breakpoint(arch_info->address, GDB_BREAKPOINT_HW= ); + if (n >=3D 0) { + handle =3D 1; + } + } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | + KVMPPC_DEBUG_WATCH_WRITE)) { + n =3D find_hw_watchpoint(arch_info->address, &flag); + if (n >=3D 0) { + handle =3D 1; + cs->watchpoint_hit =3D &hw_watchpoint; + hw_watchpoint.vaddr =3D hw_debug_points[n].addr; + hw_watchpoint.flags =3D flag; + } + } + } + return handle; +} + static int kvm_handle_debug(PowerPCCPU *cpu, struct kvm_run *run) { CPUState *cs =3D CPU(cpu); CPUPPCState *env =3D &cpu->env; struct kvm_debug_exit_arch *arch_info =3D &run->debug.arch; int handle =3D 0; - int n; - int flag =3D 0; =20 if (cs->singlestep_enabled) { handle =3D 1; } else if (arch_info->status) { - if (nb_hw_breakpoint + nb_hw_watchpoint > 0) { - if (arch_info->status & KVMPPC_DEBUG_BREAKPOINT) { - n =3D find_hw_breakpoint(arch_info->address, GDB_BREAKPOIN= T_HW); - if (n >=3D 0) { - handle =3D 1; - } - } else if (arch_info->status & (KVMPPC_DEBUG_WATCH_READ | - KVMPPC_DEBUG_WATCH_WRITE)) { - n =3D find_hw_watchpoint(arch_info->address, &flag); - if (n >=3D 0) { - handle =3D 1; - cs->watchpoint_hit =3D &hw_watchpoint; - hw_watchpoint.vaddr =3D hw_debug_points[n].addr; - hw_watchpoint.flags =3D flag; - } - } - } + handle =3D kvm_handle_hw_breakpoint(cs, arch_info); } else if (kvm_find_sw_breakpoint(cs, arch_info->address)) { handle =3D 1; } else { --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381538051864.4870552048963; Tue, 12 Mar 2019 02:05:38 -0700 (PDT) Received: from localhost ([127.0.0.1]:47688 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dLt-00010a-0N for importer@patchew.org; Tue, 12 Mar 2019 05:05:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47771) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCZ-00021e-Kc for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCY-0001oV-E9 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:59 -0400 Received: from ozlabs.org ([203.11.71.1]:40961) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCX-0001SB-Jt; Tue, 12 Mar 2019 04:55:58 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTML4wR3z9sP3; Tue, 12 Mar 2019 19:55:25 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380926; bh=+7D9TKkDLfa7A2GaqxbDuEgM3U5UOSVXe+25Kr6WabI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nZYXGO2VRh4jZdfiTBAHktrUGzHBsuxKdtDGoKcDpw+6EPFTaOHwqFXA3EvpUal5s ZfUO332WJu/9h79P75BHeAxzToiBJLZtDTOh3vyGxpqaan83uA4jmruTZMXpVSGYEN J5etQbrSjryq1bGRMgqJjU5oKo7Vi7KjhhuafmhY= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:15 +1100 Message-Id: <20190312085502.8203-16-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, Fabiano Rosas , Alexey Kardashevskiy , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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; } =20 +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 =3D CPU(cpu); CPUPPCState *env =3D &cpu->env; struct kvm_debug_exit_arch *arch_info =3D &run->debug.arch; - int handle =3D 0; =20 if (cs->singlestep_enabled) { - handle =3D 1; - } else if (arch_info->status) { - handle =3D kvm_handle_hw_breakpoint(cs, arch_info); - } else if (kvm_find_sw_breakpoint(cs, arch_info->address)) { - handle =3D 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(); + } =20 - cpu_synchronize_state(cs); - /* env->nip is PC, so increment this by 4 to use - * ppc_cpu_do_interrupt(), which set srr0 =3D env->nip - 4. - */ - env->nip +=3D 4; - cs->exception_index =3D POWERPC_EXCP_PROGRAM; - env->error_code =3D POWERPC_EXCP_INVAL; - ppc_cpu_do_interrupt(cs); + if (arch_info->status) { + return kvm_handle_hw_breakpoint(cs, arch_info); } =20 - 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 =3D env->nip - 4. + */ + env->nip +=3D 4; + cs->exception_index =3D POWERPC_EXCP_PROGRAM; + env->error_code =3D POWERPC_EXCP_INVAL; + ppc_cpu_do_interrupt(cs); + + return 0; } =20 int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run) --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 155238334646154.84631463440462; Tue, 12 Mar 2019 02:35:46 -0700 (PDT) Received: from localhost ([127.0.0.1]:48168 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3doz-0003Oq-LH for importer@patchew.org; Tue, 12 Mar 2019 05:35:41 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48072) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCv-0002PS-2A for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCF-0001b4-AK for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:21 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:49315) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCC-0001S4-UR; Tue, 12 Mar 2019 04:55:39 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMK6XGbz9sP1; Tue, 12 Mar 2019 19:55:25 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380925; bh=6DT8Z3mhmr51nBnnOirEf1mzbmWErRNnV1fR7uhoyds=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Vfc4YnuCDihRedEXOUg8iQxllQS6FzwX1YpWW6pT67iI4cM6ix4RVZQFNAWMXuMqx FkROTGzu0e2RdnEcgd+nbSY82Neg9ZatseCy9n5U6xqneZVUcn7QEulpJUA2s177Hq hlBoYer5RghUfMkEpnhW3vNCgF8vTPLMOcUCrXBU= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:16 +1100 Message-Id: <20190312085502.8203-17-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 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, qemu-devel@nongnu.org, groug@kaod.org, Alexander Graf , qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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..732660f348f6123d24144ee29ef= 38611428dc2d9 100644 GIT binary patch literal 349148 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 uwC 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�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

cULUbAe`rToX#%6E% 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%0A@F;Ey9=3D?i>|i3=3Dme4EVi7lzi-l`SzeU=3D& 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 mYo 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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 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381853763265.1912864516828; Tue, 12 Mar 2019 02:10:53 -0700 (PDT) Received: from localhost ([127.0.0.1]:47801 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dQy-0005TI-I9 for importer@patchew.org; Tue, 12 Mar 2019 05:10:52 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47503) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCD-0001b7-DK for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCC-0001YE-8M for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:37 -0400 Received: from ozlabs.org ([203.11.71.1]:58615) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCB-0001SO-FD; Tue, 12 Mar 2019 04:55:36 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTML64yVz9sN1; Tue, 12 Mar 2019 19:55:26 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380926; bh=ub8sKAX4BEvkjhuFoKZZoPzgF9hwRkn0G4aspdYKvow=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J3xQ3wN6XqT6X2SoIg+6YYAW3/H1OzQUntMXVqVpTT9P0FI9zlxm3w4/bZhg7RHdc +2qRiXtwHS02m+xBmiJUknTxrAkmIx3lWAeNtPbb5uvfMXtaik6dfOwR1l3p66W8vM NMGsg0EXiZ1mA7TD2rK2AFI57IhUAgvai1Y1EL2g= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:17 +1100 Message-Id: <20190312085502.8203-18-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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=3D-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, i= nt shift, } } /* We're setting up a hash table, so that means we're not radix */ + spapr->patb_entry =3D 0; spapr_set_all_lpcrs(0, LPCR_HR | LPCR_UPRT); } =20 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(PowerPCC= PU *cpu, target_ulong proc_tbl =3D args[1]; target_ulong page_size =3D args[2]; target_ulong table_size =3D args[3]; + target_ulong update_lpcr =3D 0; uint64_t cproc; =20 if (flags & ~FLAGS_MASK) { /* Check no reserved bits are set */ @@ -1394,10 +1395,13 @@ static target_ulong h_register_process_table(PowerP= CCPU *cpu, spapr->patb_entry =3D cproc; /* Save new process table */ =20 /* 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 |=3D (LPCR_UPRT | LPCR_HR); + else if (flags & FLAG_HASH_PROC_TBL) /* Hash with process tables */ + update_lpcr |=3D LPCR_UPRT; + if (flags & FLAG_GTSE) /* Guest translation shootdown enable */ + update_lpcr |=3D FLAG_GTSE; + spapr_set_all_lpcrs(update_lpcr, LPCR_UPRT | LPCR_HR | LPCR_GTSE); =20 if (kvm_enabled()) { return kvmppc_configure_v3_mmu(cpu, flags & FLAG_RADIX, --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381917672703.5113389611994; Tue, 12 Mar 2019 02:11:57 -0700 (PDT) Received: from localhost ([127.0.0.1]:47812 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dS0-0006PX-F6 for importer@patchew.org; Tue, 12 Mar 2019 05:11:56 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47929) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCh-0002Af-Uj for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCc-0001uT-3q for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:07 -0400 Received: from ozlabs.org ([203.11.71.1]:45937) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCb-0001Ya-Nu; Tue, 12 Mar 2019 04:56:02 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMM3NLWz9sPD; Tue, 12 Mar 2019 19:55:26 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380927; bh=pd3/Zt9I+QIf5SvUUcCcPyaQnV4kkikhQmRPeT+U5kw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NuSQqZtBfuV6unQXEykSO5sdAyKyxKDCXqEzzRcWPY+IDjk0qHZWfKUCGvbtx60+V p8+qE/Sp9QsPYoKfIaA0Sq8vH6U9svt0Y3WOW2F1U5CpjksbtatHUjgAmQn0rbZn2e OT91zXWP1sFFSZhpXFRnRLPq+Z7Aehm/xCy0TfeI= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:18 +1100 Message-Id: <20190312085502.8203-19-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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); =20 #define TYPE_SPAPR_RNG "spapr-rng" =20 -#define SPAPR_MEMORY_BLOCK_SIZE (1 << 28) /* 256MB */ +#define SPAPR_MEMORY_BLOCK_SIZE ((hwaddr)1 << 28) /* 256MB */ =20 /* * This defines the maximum number of DIMM slots we can have for sPAPR --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382087346431.24941168768316; Tue, 12 Mar 2019 02:14:47 -0700 (PDT) Received: from localhost ([127.0.0.1]:47847 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUe-0000N2-Pm for importer@patchew.org; Tue, 12 Mar 2019 05:14:40 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47755) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCY-000212-W1 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCY-0001oE-5d for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:58 -0400 Received: from ozlabs.org ([203.11.71.1]:33829) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCX-0001T2-On; Tue, 12 Mar 2019 04:55:58 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMM01cwz9sP7; Tue, 12 Mar 2019 19:55:26 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380927; bh=titUcxTrICKhmBYoMKYdwbyF9YagmoLk5KPZVgW8YSM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pz8Rvpk+7AIqKIa7Nqv8GgfqWFLdXnFp+Xv8fv5NPteln6X8HrhjzE1D5LJxZ+Bzz P1xnHyR73jNjYOQuI1RR/NF/IB0xWpEDeuK6ythmvXsaD2TJZUnAnpCNTg9U1qWy6w SR4JuU4f+vtwL+HQOtFBv2BmxUalCm/XAT7HQzfQ= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:19 +1100 Message-Id: <20190312085502.8203-20-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, Suraj Jitindar Singh , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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) =20 /* 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(); } =20 /* 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); } =20 +void kvmppc_enable_h_page_init(void) +{ + kvmppc_enable_hcall(kvm_state, H_PAGE_INIT); +} + void kvmppc_set_papr(PowerPCCPU *cpu) { CPUState *cs =3D 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 le= vel); 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) { } =20 +static inline void kvmppc_enable_h_page_init(void) +{ +} + static inline void kvmppc_set_papr(PowerPCCPU *cpu) { } --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382682261206.84510932801493; Tue, 12 Mar 2019 02:24:42 -0700 (PDT) Received: from localhost ([127.0.0.1]:47998 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3deD-0008Tn-PA for importer@patchew.org; Tue, 12 Mar 2019 05:24:33 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47632) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCL-0001jn-PY for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCJ-0001dl-Jp for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:45 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:39321) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCI-0001Y3-Rn; Tue, 12 Mar 2019 04:55:43 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMM1qq4z9sPC; Tue, 12 Mar 2019 19:55:26 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380927; bh=x85ijsfk4QI/6FNFUAYL+8Cbg7BWrOZAvTv+Me4GfJ8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PMTWFpg/+Z8/rDznLL0eyKIJ9i/4oJaSWPBopUQ5x65FHvx352AcF/CpFoaNp+cPD kvF4fh38WMtHGSpMIfLCv8RkVRE0gpUyGi5vPueFCeigtyHGnQW5N7dCMfxyrh4nHC UphxJzokuAqQhntvwBk/Qxuqj1UQWl9D0n707hlI= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:20 +1100 Message-Id: <20190312085502.8203-21-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 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, qemu-devel@nongnu.org, groug@kaod.org, Amit Singh Tomar , qemu-ppc@nongnu.org, clg@kaod.org, Andrew Randrianasulu , David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" 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 mach= ine 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 er= rors 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 =20 # For embedded PPCs: +CONFIG_MPC_I2C=3Dy +CONFIG_DS1338=3Dy CONFIG_E500=3Dy CONFIG_PPC405=3Dy CONFIG_PPC440=3Dy 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) +=3D exynos4210_i2c.o common-obj-$(CONFIG_IMX_I2C) +=3D imx_i2c.o common-obj-$(CONFIG_ASPEED_SOC) +=3D aspeed_i2c.o common-obj-$(CONFIG_NRF51_SOC) +=3D microbit_i2c.o +common-obj-$(CONFIG_MPC_I2C) +=3D mpc_i2c.o obj-$(CONFIG_OMAP) +=3D omap_i2c.o obj-$(CONFIG_PPC4XX) +=3D 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 late= r, + * 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 =3D MPC_I2C(dev); + + i2c->address =3D 0xFF; + i2c->adr =3D 0x00; + i2c->fdr =3D 0x00; + i2c->cr =3D 0x00; + i2c->sr =3D 0x81; + i2c->dr =3D 0x00; +} + +static void mpc_i2c_irq(MPCI2CState *s) +{ + bool irq_active =3D false; + + if (mpc_i2c_is_enabled(s) && mpc_i2c_irq_is_enabled(s) + && mpc_i2c_irq_pending(s)) { + irq_active =3D 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 =3D s->adr; + mpc_i2c_reset(DEVICE(s)); + s->adr =3D 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 |=3D CSR_RXAK; + } else { + s->address =3D s->dr; + s->sr &=3D ~CSR_RXAK; + s->sr |=3D CSR_MCF; /* Set after Byte Transfer is completed */ + s->sr |=3D 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 |=3D CSR_RXAK; + i2c_end_transfer(s->bus); + } else { + s->sr &=3D ~CSR_RXAK; + s->sr |=3D CSR_MCF; /* Set after Byte Transfer is completed */ + s->sr |=3D 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 =3D i2c_recv(s->bus); + if (ret >=3D 0) { + s->sr |=3D CSR_MCF; /* Set after Byte Transfer is completed */ + s->sr |=3D CSR_MIF; /* Set after Byte Transfer is completed */ + mpc_i2c_irq(s); + } else { + DPRINTF("read failed for device"); + ret =3D 0xff; + } + s->dr =3D ret; +} + +static uint64_t mpc_i2c_read(void *opaque, hwaddr addr, unsigned size) +{ + MPCI2CState *s =3D opaque; + uint8_t value; + + switch (addr) { + case MPC_I2C_ADR: + value =3D s->adr; + break; + case MPC_I2C_FDR: + value =3D s->fdr; + break; + case MPC_I2C_CR: + value =3D s->cr; + break; + case MPC_I2C_SR: + value =3D s->sr; + break; + case MPC_I2C_DR: + value =3D 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 =3D 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 =3D opaque; + + DPRINTF("%s: addr " TARGET_FMT_plx " val %08" PRIx64 "\n", __func__, + addr, value); + switch (addr) { + case MPC_I2C_ADR: + s->adr =3D value & CADR_MASK; + break; + case MPC_I2C_FDR: + s->fdr =3D value & CFDR_MASK; + break; + case MPC_I2C_CR: + if (mpc_i2c_is_enabled(s) && ((value & CCR_MEN) =3D=3D 0)) { + mpc_i2c_soft_reset(s); + break; + } + /* normal write */ + s->cr =3D 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 |=3D CSR_MBB; + } else { + /* bus is not busy anymore */ + s->sr &=3D ~CSR_MBB; + /* Reset the address for fresh write/read cycle */ + if (s->address !=3D CYCLE_RESET) { + i2c_end_transfer(s->bus); + s->address =3D CYCLE_RESET; + } + } + /* For restart end the onging transfer */ + if (s->cr & CCR_RSTA) { + if (s->address !=3D CYCLE_RESET) { + s->address =3D CYCLE_RESET; + i2c_end_transfer(s->bus); + s->cr &=3D ~CCR_RSTA; + } + } + break; + case MPC_I2C_SR: + s->sr =3D 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 =3D value & CDR_MASK; + if (mpc_i2c_is_master(s)) { /* master mode */ + if (s->address =3D=3D CYCLE_RESET) { + mpc_i2c_address_send(s); + } else { + mpc_i2c_data_send(s); + } + } + break; + case MPC_I2C_DFSRR: + s->dfssr =3D value; + break; + default: + DPRINTF("ERROR: Bad write addr 0x%x\n", (unsigned int)addr); + break; + } +} + +static const MemoryRegionOps i2c_ops =3D { + .read =3D mpc_i2c_read, + .write =3D mpc_i2c_write, + .valid.max_access_size =3D 1, + .endianness =3D DEVICE_NATIVE_ENDIAN, +}; + +static const VMStateDescription mpc_i2c_vmstate =3D { + .name =3D TYPE_MPC_I2C, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (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 =3D 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 =3D i2c_init_bus(DEVICE(dev), "i2c"); +} + +static void mpc_i2c_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->vmsd =3D &mpc_i2c_vmstate ; + dc->reset =3D mpc_i2c_reset; + dc->realize =3D mpc_i2c_realize; + dc->desc =3D "MPC I2C Controller"; +} + +static const TypeInfo mpc_i2c_type_info =3D { + .name =3D TYPE_MPC_I2C, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(MPCI2CState), + .class_init =3D 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" =20 #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 =20 struct boot_info { @@ -161,6 +165,39 @@ static void create_dt_mpc8xxx_gpio(void *fdt, const ch= ar *soc, const char *mpic) g_free(poweroff); } =20 +static void dt_rtc_create(void *fdt, const char *i2c, const char *alias) +{ + int offset =3D RTC_REGS_OFFSET; + + gchar *rtc =3D 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 =3D MPC8544_I2C_REGS_OFFSET; + int irq0 =3D MPC8544_I2C_IRQ; + + gchar *i2c =3D 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(PPCE500MachineStat= e *pms, soc, mpic, "serial0", 0, true); } =20 + /* i2c */ + dt_i2c_create(fdt, soc, mpic, "i2c"); + + dt_rtc_create(fdt, "i2c", "rtc"); + + gutil =3D 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; =20 irqs =3D g_new0(IrqLines, smp_cpus); for (i =3D 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 =3D qdev_create(NULL, "mpc-i2c"); + s =3D 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 =3D (I2CBus *)qdev_get_child_bus(dev, "i2c"); + i2c_create_slave(i2c, "ds1338", RTC_REGS_OFFSET); + =20 /* General Utility device */ dev =3D qdev_create(NULL, "mpc8544-guts"); --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382130468624.7327573126528; Tue, 12 Mar 2019 02:15:30 -0700 (PDT) Received: from localhost ([127.0.0.1]:47854 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dVO-0001WQ-9G for importer@patchew.org; Tue, 12 Mar 2019 05:15:26 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48005) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCo-0002Ia-0t for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCn-00024c-4B for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:13 -0400 Received: from ozlabs.org ([203.11.71.1]:38669) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCm-0001jt-FM; Tue, 12 Mar 2019 04:56:13 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMP50fsz9sPK; Tue, 12 Mar 2019 19:55:26 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380929; bh=IUGzJU2JtjtouJXDXSMctBRln3SEkm4SSXHyeiLM7ro=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oxFImbbj+1P9jQ1e/NzURFUjhBriz5ot2T4paMrcu/2SOn/omuAWi1o/7TVJHP/T1 xMkvTS916VBSVWet9f5merRKc9+Oix441KvyhNnq0pAe8DtoALwYnaZp/jG/Xr42h2 LFl6yK5ZW+GG/JHTo7jh2LgdRQYl4zXG1pWyklV0= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:21 +1100 Message-Id: <20190312085502.8203-22-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric 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=C3=A9dric 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, CPU= State *cs) return xrc->get_tctx(xrtr, cs); } =20 +/* + * 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 =3D &POWERPC_CPU(tctx->cs)->env; + uint32_t pir =3D env->spr_cb[SPR_PIR].default_value; + + return hw_cam_line((pir >> 8) & 0xf, pir & 0x7f) =3D=3D + 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 =3D xive_nvt_cam_line(nvt_blk, nvt_idx); + uint32_t qw3w2 =3D xive_tctx_word2(&tctx->regs[TM_QW3_HV_PHYS]); uint32_t qw2w2 =3D xive_tctx_word2(&tctx->regs[TM_QW2_HV_POOL]); uint32_t qw1w2 =3D xive_tctx_word2(&tctx->regs[TM_QW1_OS]); uint32_t qw0w2 =3D xive_tctx_word2(&tctx->regs[TM_QW0_USER]); @@ -1142,7 +1167,11 @@ static int xive_presenter_tctx_match(XiveTCTX *tctx,= uint8_t format, =20 /* F=3D0 & i=3D0: Specific NVT notification */ =20 - /* 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; + } =20 /* HV POOL ring */ if ((be32_to_cpu(qw2w2) & TM_QW2W2_VP) && --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 155238333106114.85764494238083; Tue, 12 Mar 2019 02:35:31 -0700 (PDT) Received: from localhost ([127.0.0.1]:48164 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3doi-0003D6-N9 for importer@patchew.org; Tue, 12 Mar 2019 05:35:24 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47884) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCe-00026u-Kq for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCd-0001wm-PE for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:04 -0400 Received: from ozlabs.org ([203.11.71.1]:33649) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCd-0001Zf-Br; Tue, 12 Mar 2019 04:56:03 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMM4scGz9sP8; Tue, 12 Mar 2019 19:55:26 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380927; bh=4eZwWGJCAbNTdgJZSU9dt9DnBS93HfqzG0q1+H4gUNY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=McyxshJoQn+itpPAPCOAFH02fzQk21hGX7oqmAaFJa2fwqW0eyvFvSjbM7mF9l2JA gKAHyGtdlkr09O9DyJoo3Pm11zMfVH6lLxkKF/Skf8/C/3OeYY/n+xF7FuQGuxnKRA HNX2Dnud1w9NQjfyG9iJO0dql0F22GQUA4/6UkMI= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:22 +1100 Message-Id: <20190312085502.8203-23-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric 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=C3=A9dric 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) } } =20 -static PowerPCCPU *ppc_get_vcpu_by_pir(int pir) -{ - CPUState *cs; - - CPU_FOREACH(cs) { - PowerPCCPU *cpu =3D POWERPC_CPU(cs); - CPUPPCState *env =3D &cpu->env; - - if (env->spr_cb[SPR_PIR].default_value =3D=3D pir) { - return cpu; - } - } - - return NULL; -} - static ICPState *pnv_icp_get(XICSFabric *xi, int pir) { PowerPCCPU *cpu =3D 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, u= int32_t val) break; } } + +PowerPCCPU *ppc_get_vcpu_by_pir(int pir) +{ + CPUState *cs; + + CPU_FOREACH(cs) { + PowerPCCPU *cpu =3D POWERPC_CPU(cs); + CPUPPCState *env =3D &cpu->env; + + if (env->spr_cb[SPR_PIR].default_value =3D=3D 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" =20 void ppc_set_irq(PowerPCCPU *cpu, int n_IRQ, int level); +PowerPCCPU *ppc_get_vcpu_by_pir(int pir); =20 /* PowerPC hardware exceptions management helpers */ typedef void (*clk_setup_cb)(void *opaque, uint32_t freq); --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552383071685945.0590776226395; Tue, 12 Mar 2019 02:31:11 -0700 (PDT) Received: from localhost ([127.0.0.1]:48118 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dkX-0007Hv-HS for importer@patchew.org; Tue, 12 Mar 2019 05:31:05 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47696) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCR-0001sy-AV for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCQ-0001jd-EJ for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:51 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:44747) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCP-0001ei-Ls; Tue, 12 Mar 2019 04:55:50 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMP17C9z9sPL; Tue, 12 Mar 2019 19:55:27 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380929; bh=gNRkrsopT4gf2qrmiiQQoqGimqfukJrq+otGfGp+ZIE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VBDN/61fY9zMeRfhynxBZWEjobB96O6xCXQL6sHp1OIpJvf7uDCkmYJOwhCYZvVr1 82BMBrC7oE+lVNEpl111jLpj65cxuhaWJMoHOlg1ms5/vzsaWmJ1azRKoBwJ05IJ+l H46cRc1nkAjkkfMEMFMAk09YxUOEx2tV/7Hmw6tc= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:23 +1100 Message-Id: <20190312085502.8203-24-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric 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=C3=A9dric 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 =3D xive_router_get_tctx(XIVE_ROUTER(opaque), current_c= pu); const XiveTmOp *xto; =20 /* @@ -356,9 +355,8 @@ static void xive_tm_write(void *opaque, hwaddr offset, xive_tm_raw_write(tctx, offset, value, size); } =20 -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 =3D xive_router_get_tctx(XIVE_ROUTER(opaque), current_c= pu); const XiveTmOp *xto; =20 /* @@ -392,6 +390,21 @@ static uint64_t xive_tm_read(void *opaque, hwaddr offs= et, unsigned size) return xive_tm_raw_read(tctx, offset, size); } =20 +static void xive_tm_write(void *opaque, hwaddr offset, + uint64_t value, unsigned size) +{ + XiveTCTX *tctx =3D xive_router_get_tctx(XIVE_ROUTER(opaque), current_c= pu); + + xive_tctx_tm_write(tctx, offset, value, size); +} + +static uint64_t xive_tm_read(void *opaque, hwaddr offset, unsigned size) +{ + XiveTCTX *tctx =3D xive_router_get_tctx(XIVE_ROUTER(opaque), current_c= pu); + + return xive_tctx_tm_read(tctx, offset, size); +} + const MemoryRegionOps xive_tm_ops =3D { .read =3D xive_tm_read, .write =3D 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 =20 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); =20 void xive_tctx_pic_print_info(XiveTCTX *tctx, Monitor *mon); Object *xive_tctx_create(Object *cpu, XiveRouter *xrtr, Error **errp); --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 155238194563064.78952231234723; Tue, 12 Mar 2019 02:12:25 -0700 (PDT) Received: from localhost ([127.0.0.1]:47818 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dSP-0006gj-Fd for importer@patchew.org; Tue, 12 Mar 2019 05:12:21 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47986) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCl-0002GV-R0 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCl-00023M-2r for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:11 -0400 Received: from ozlabs.org ([203.11.71.1]:60335) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCk-0001gw-MJ; Tue, 12 Mar 2019 04:56:11 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMP2t8jz9sPJ; Tue, 12 Mar 2019 19:55:27 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380929; bh=n6AveYcFQ6+e1nQhS9cUa+UxID3PGfpVHH95MaeNPA4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mvhLdsjELVayogLPejyIMkhuCYpH4BWnoBvgySkLzMKpvylGZUaKp7mPqRnQxoh9G +BkkbYzUOZrRAQ/xlcKtkCCHobLV//RXg57DA5HsqJwJg8rtOGnM9V2ClllXo7YARC qtsrjBNvtdBU1+aVHYQtcvpk9KRI7UZgMdVvn9/Y= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:24 +1100 Message-Id: <20190312085502.8203-25-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric 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=C3=A9dric 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. */ } =20 -static void xive_router_notify(XiveNotifier *xn, uint32_t lisn) +void xive_router_notify(XiveNotifier *xn, uint32_t lisn) { XiveRouter *xrtr =3D XIVE_ROUTER(xn); uint8_t eas_blk =3D 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_b= lk, 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); =20 /* * XIVE END ESBs --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382897991800.8318921201931; Tue, 12 Mar 2019 02:28:17 -0700 (PDT) Received: from localhost ([127.0.0.1]:48058 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dhd-0003Ae-Ui for importer@patchew.org; Tue, 12 Mar 2019 05:28:06 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47666) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCP-0001o7-0w for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCO-0001gi-7b for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:48 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:47397) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCN-0001e0-Q7; Tue, 12 Mar 2019 04:55:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMN6CD2z9sPM; Tue, 12 Mar 2019 19:55:27 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380928; bh=3OfMfsikQIsdLZ7R8ZOxJvXqivQnfwVUDX3CTvqHwJk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dnXJOjuOkUUOpZ1Pe3XPXcIlzPNNaWcPg+at+x7omaGeLtfqro9WDQlCaAff5FKZt aBOHgyg1SBex2wwxk7x0AhS7WPyqRO4mQE0Xu4cjzASJxLkMS0k+WP5j3piA9HyXw1 3JDYrsne3er+/qYTAxdjE9iNljUfUtPqg5GJmuVY= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:25 +1100 Message-Id: <20190312085502.8203-26-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The POWER9 PowerNV machine will use a XIVE interrupt presenter type. Signed-off-by: C=C3=A9dric 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; } =20 - pnv_cpu->icp =3D ICP(obj); + pnv_cpu->intc =3D obj; } =20 /* @@ -1086,7 +1086,7 @@ static ICPState *pnv_icp_get(XICSFabric *xi, int pir) { PowerPCCPU *cpu =3D ppc_get_vcpu_by_pir(pir); =20 - return cpu ? pnv_cpu_state(cpu)->icp : NULL; + return cpu ? ICP(pnv_cpu_state(cpu)->intc) : NULL; } =20 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 =3D POWERPC_CPU(cs); =20 - icp_pic_print_info(pnv_cpu_state(cpu)->icp, mon); + icp_pic_print_info(ICP(pnv_cpu_state(cpu)->intc), mon); } =20 for (i =3D 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 =3D pnv_cpu_state(cpu); =20 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 =3D 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 =20 typedef struct PnvCPUState { - struct ICPState *icp; + Object *intc; } PnvCPUState; =20 static inline PnvCPUState *pnv_cpu_state(PowerPCCPU *cpu) --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382340669607.3831436056322; Tue, 12 Mar 2019 02:19:00 -0700 (PDT) Received: from localhost ([127.0.0.1]:47910 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dYm-0004Cn-3H for importer@patchew.org; Tue, 12 Mar 2019 05:18:56 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47974) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCl-0002Fr-7m for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCe-0001xR-GC for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:11 -0400 Received: from ozlabs.org ([203.11.71.1]:32987) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCd-0001bU-Dh; Tue, 12 Mar 2019 04:56:04 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMN2c2lz9sPP; Tue, 12 Mar 2019 19:55:27 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380928; bh=FzVdWh1Yuw9t+vidPOwHlw2+xekUz/c7Mpfop8KKIEs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=d3S3ckfPDs5JqIN5JIh9NMhK7D8FoDEi//eJUTO7luySkITaZxHuQLx6HB9gVg13e lhW/t7EcwyA13dV43KbHu9+Rm12KpjT5NrjTCSWHGg5ptFKPk48yitza14IE+q5mJ0 787lnAJQ5ABRhO/B0L+12EzZSQeuGXjLFoF8khUw= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:26 +1100 Message-Id: <20190312085502.8203-27-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric 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=C3=A9dric 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) +=3D xics_spapr.o obj-$(CONFIG_XICS_KVM) +=3D xics_kvm.o obj-$(CONFIG_XIVE) +=3D xive.o obj-$(CONFIG_XIVE_SPAPR) +=3D spapr_xive.o -obj-$(CONFIG_POWERNV) +=3D xics_pnv.o +obj-$(CONFIG_POWERNV) +=3D xics_pnv.o pnv_xive.o obj-$(CONFIG_ALLWINNER_A10_PIC) +=3D allwinner-a10-pic.o obj-$(CONFIG_S390_FLIC) +=3D s390_flic.o obj-$(CONFIG_S390_FLIC_KVM) +=3D 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[] =3D { + [VST_TSEL_IVT] =3D { "EAT", sizeof(XiveEAS), 16 }, + [VST_TSEL_SBE] =3D { "SBE", 1, 16 }, + [VST_TSEL_EQDT] =3D { "ENDT", sizeof(XiveEND), 16 }, + [VST_TSEL_VPDT] =3D { "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] =3D { "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 =3D PNV_MACHINE(qdev_get_machine()); + int i; + + for (i =3D 0; i < pnv->num_chips; i++) { + Pnv9Chip *chip9 =3D PNV9_CHIP(pnv->chips[i]); + PnvXive *xive =3D &chip9->xive; + + if (xive->chip->chip_id =3D=3D 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 =3D=3D 12 || page_shift =3D=3D 16 || + page_shift =3D=3D 21 || page_shift =3D=3D 24; +} + +static uint64_t pnv_xive_vst_size(uint64_t vsd) +{ + uint64_t vst_tsize =3D 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 =3D vst_tsize / XIVE_VSD_SIZE; + uint32_t page_shift; + + vsd =3D ldq_be_dma(&address_space_memory, vsd & VSD_ADDRESS_MASK); + page_shift =3D 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 =3D &vst_infos[type]; + uint64_t vst_addr =3D 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 =3D &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 =3D vsd & VSD_ADDRESS_MASK; + vsd =3D 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 =3D 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 =3D (1ull << page_shift) / info->size; + vsd_idx =3D idx / vst_per_page; + + /* Load the VSD we are looking for, if not already done */ + if (vsd_idx) { + vsd_addr =3D vsd_addr + vsd_idx * XIVE_VSD_SIZE; + vsd =3D 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 !=3D 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 bl= k, + uint32_t idx) +{ + const XiveVstInfo *info =3D &vst_infos[type]; + uint64_t vsd; + uint32_t idx_max; + + if (blk >=3D info->max_blocks) { + xive_error(xive, "VST: invalid block id %d for VST %s %d !?", + blk, info->name, idx); + return 0; + } + + vsd =3D xive->vsds[type][blk]; + + /* Remote VST access */ + if (GETFIELD(VSD_MODE, vsd) =3D=3D VSD_MODE_FORWARD) { + xive =3D pnv_xive_get_ic(blk); + + return xive ? pnv_xive_vst_addr(xive, type, blk, idx) : 0; + } + + idx_max =3D 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 =3D &vst_infos[type]; + uint64_t addr =3D 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_numb= er) +{ + const XiveVstInfo *info =3D &vst_infos[type]; + uint64_t addr =3D pnv_xive_vst_addr(xive, type, blk, idx); + + if (!addr) { + return -1; + } + + if (word_number =3D=3D 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 =3D 0; i < ARRAY_SIZE(eqc_watch); i++) { + eqc_watch[i] =3D 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 =3D 0; i < ARRAY_SIZE(vpc_watch); i++) { + vpc_watch[i] =3D 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 =3D PNV_XIVE(xrtr); + + if (pnv_xive_get_ic(blk) !=3D 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 =3D POWERPC_CPU(cs); + XiveTCTX *tctx =3D XIVE_TCTX(pnv_cpu_state(cpu)->intc); + PnvXive *xive =3D NULL; + CPUPPCState *env =3D &cpu->env; + int pir =3D 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 =3D 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 =3D PNV_XIVE(xn); + uint8_t blk =3D 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 =3D 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 =3D 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 =3D 1ull << pnv_xive_edt_shift(xive); + uint64_t size =3D 0; + int i; + + for (i =3D 0; i < XIVE_TABLE_EDT_MAX; i++) { + uint64_t edt_type =3D GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]); + + if (edt_type =3D=3D type) { + size +=3D 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 =3D 1ull << pnv_xive_edt_shift(xive); + uint64_t edt_offset =3D vc_offset; + + for (i =3D 0; i < XIVE_TABLE_EDT_MAX && (i * edt_size) < vc_offset; i+= +) { + uint64_t edt_type =3D GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[i]); + + if (edt_type !=3D type) { + edt_offset -=3D edt_size; + } + } + + return edt_offset; +} + +static void pnv_xive_edt_resize(PnvXive *xive) +{ + uint64_t ipi_edt_size =3D pnv_xive_edt_size(xive, CQ_TDR_EDT_IPI); + uint64_t end_edt_size =3D 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 =3D xive->regs[CQ_TAR >> 3] & CQ_TAR_TSEL; + uint8_t tsel_index =3D 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 =3D ARRAY_SIZE(xive->blk); + xive_table =3D xive->blk; + break; + case CQ_TAR_TSEL_MIG: + max_index =3D ARRAY_SIZE(xive->mig); + xive_table =3D xive->mig; + break; + case CQ_TAR_TSEL_EDT: + max_index =3D ARRAY_SIZE(xive->edt); + xive_table =3D xive->edt; + break; + case CQ_TAR_TSEL_VDT: + max_index =3D ARRAY_SIZE(xive->vdt); + xive_table =3D xive->vdt; + break; + default: + xive_error(xive, "IC: invalid table %d", (int) tsel); + return -1; + } + + if (tsel_index >=3D max_index) { + xive_error(xive, "IC: invalid index %d", (int) tsel_index); + return -1; + } + + xive_table[tsel_index] =3D val; + + if (xive->regs[CQ_TAR >> 3] & CQ_TAR_TBL_AUTOINC) { + xive->regs[CQ_TAR >> 3] =3D + SETFIELD(CQ_TAR_TSEL_INDEX, xive->regs[CQ_TAR >> 3], ++tsel_in= dex); + } + + /* + * EDT configuration is complete. Resize the MMIO windows exposing + * the IPI and the END ESBs in the VC region. + */ + if (tsel =3D=3D CQ_TAR_TSEL_EDT && tsel_index =3D=3D 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 =3D &xive->end_source; + XiveSource *xsrc =3D &xive->ipi_source; + const XiveVstInfo *info =3D &vst_infos[type]; + uint32_t page_shift =3D GETFIELD(VSD_TSIZE, vsd) + 12; + uint64_t vst_addr =3D 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] =3D 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_mmi= o); + 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_eng= ine) +{ + uint8_t mode =3D GETFIELD(VSD_MODE, vsd); + uint8_t type =3D GETFIELD(VST_TABLE_SELECT, + xive->regs[VC_VSD_TABLE_ADDR >> 3]); + uint8_t blk =3D GETFIELD(VST_TABLE_BLOCK, + xive->regs[VC_VSD_TABLE_ADDR >> 3]); + uint64_t vst_addr =3D vsd & VSD_ADDRESS_MASK; + + if (type > VST_TSEL_IRQ) { + xive_error(xive, "VST: invalid table type %d", type); + return; + } + + if (blk >=3D 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] =3D 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 =3D PNV_XIVE(opaque); + MemoryRegion *sysmem =3D get_system_memory(); + uint32_t reg =3D offset >> 3; + bool is_chip0 =3D xive->chip->chip_id =3D=3D 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 =3D 16; + } + if (val & CQ_PBI_VC_64K) { + xive->vc_shift =3D 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 =3D 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_fa= tal); + } + 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 =3D val & CQ_IC_BAR_64K ? 16 : 12; + if (!(val & CQ_IC_BAR_VALID)) { + xive->ic_base =3D 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 =3D 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 =3D val & CQ_TM_BAR_64K ? 16 : 12; + if (!(val & CQ_TM_BAR_VALID)) { + xive->tm_base =3D 0; + if (xive->regs[reg] & CQ_TM_BAR_VALID && is_chip0) { + memory_region_del_subregion(sysmem, &xive->tm_mmio); + } + } else { + xive->tm_base =3D 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] =3D 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 =3D 0; + if (xive->regs[reg] & CQ_PC_BAR_VALID) { + memory_region_del_subregion(sysmem, &xive->pc_mmio); + } + } else { + xive->pc_base =3D 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] =3D 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 =3D 0; + if (xive->regs[reg] & CQ_VC_BAR_VALID) { + memory_region_del_subregion(sysmem, &xive->vc_mmio); + } + } else { + xive->vc_base =3D 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 =3D=3D 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] |=3D val; + break; + case PC_THREAD_EN_REG1_SET: + xive->regs[PC_THREAD_EN_REG1 >> 3] |=3D val; + break; + case PC_THREAD_EN_REG0_CLR: + xive->regs[PC_THREAD_EN_REG0 >> 3] &=3D ~val; + break; + case PC_THREAD_EN_REG1_CLR: + xive->regs[PC_THREAD_EN_REG1 >> 3] &=3D ~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=3D0x%"HWADDR_PRIx, offs= et); + return; + } + + xive->regs[reg] =3D val; +} + +static uint64_t pnv_xive_ic_reg_read(void *opaque, hwaddr offset, unsigned= size) +{ + PnvXive *xive =3D PNV_XIVE(opaque); + uint64_t val =3D 0; + uint32_t reg =3D 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 =3D xive->regs[reg]; + break; + + /* + * XIVE hardware thread enablement + */ + case PC_THREAD_EN_REG0_SET: + case PC_THREAD_EN_REG0_CLR: + val =3D xive->regs[PC_THREAD_EN_REG0 >> 3]; + break; + case PC_THREAD_EN_REG1_SET: + case PC_THREAD_EN_REG1_CLR: + val =3D xive->regs[PC_THREAD_EN_REG1 >> 3]; + break; + + case CQ_MSGSND: /* Identifies which cores have msgsnd enabled. */ + val =3D 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] &=3D ~VC_SCRUB_VALID; + val =3D xive->regs[reg]; + break; + + /* + * XIVE PC & VC cache invalidation + */ + case PC_AT_KILL: + xive->regs[reg] &=3D ~PC_AT_KILL_VALID; + val =3D xive->regs[reg]; + break; + case VC_AT_MACRO_KILL: + xive->regs[reg] &=3D ~VC_KILL_VALID; + val =3D xive->regs[reg]; + break; + + /* + * XIVE synchronisation + */ + case VC_EQC_CONFIG: + val =3D VC_EQC_SYNC_MASK; + break; + + default: + xive_error(xive, "IC: invalid read reg=3D0x%"HWADDR_PRIx, offset); + } + + return val; +} + +static const MemoryRegionOps pnv_xive_ic_reg_ops =3D { + .read =3D pnv_xive_ic_reg_read, + .write =3D pnv_xive_ic_reg_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 8, + .max_access_size =3D 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 operati= on */ +#define PNV_XIVE_RESERVED6 0xb00 /* Cache line 6 PowerBUS operati= on */ +#define PNV_XIVE_RESERVED7 0xb80 /* Cache line 7 PowerBUS operati= on */ + +/* 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 va= l) +{ + /* + * 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 v= al, + unsigned size) +{ + PnvXive *xive =3D 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%"PRIx6= 4, + 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 =3D 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 =3D { + .read =3D pnv_xive_ic_notify_read, + .write =3D pnv_xive_ic_notify_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 8, + .max_access_size =3D 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 =3D 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 s= ize) +{ + PnvXive *xive =3D PNV_XIVE(opaque); + + xive_error(xive, "IC: LSI invalid read @%"HWADDR_PRIx, addr); + return -1; +} + +static const MemoryRegionOps pnv_xive_ic_lsi_ops =3D { + .read =3D pnv_xive_ic_lsi_read, + .write =3D pnv_xive_ic_lsi_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 8, + .max_access_size =3D 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 =3D xive->regs[PC_TCTXT_INDIR0 >> 3]; + PowerPCCPU *cpu =3D NULL; + int pir; + + if (!(tctxt_indir & PC_TCTXT_INDIR_VALID)) { + xive_error(xive, "IC: no indirect TIMA access in progress"); + return NULL; + } + + pir =3D GETFIELD(PC_TCTXT_INDIR_THRDID, tctxt_indir) & 0xff; + cpu =3D 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 =3D 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 =3D pnv_xive_get_indirect_tctx(PNV_XIVE(opaque)); + + return xive_tctx_tm_read(tctx, offset, size); +} + +static const MemoryRegionOps xive_tm_indirect_ops =3D { + .read =3D xive_tm_indirect_read, + .write =3D xive_tm_indirect_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 1, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 1, + .max_access_size =3D 8, + }, +}; + +/* + * Interrupt controller XSCOM region. + */ +static uint64_t pnv_xive_xscom_read(void *opaque, hwaddr addr, unsigned si= ze) +{ + 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 =3D { + .read =3D pnv_xive_xscom_read, + .write =3D pnv_xive_xscom_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + } +}; + +/* + * Virtualization Controller MMIO region containing the IPI and END ESB pa= ges + */ +static uint64_t pnv_xive_vc_read(void *opaque, hwaddr offset, + unsigned size) +{ + PnvXive *xive =3D PNV_XIVE(opaque); + uint64_t edt_index =3D offset >> pnv_xive_edt_shift(xive); + uint64_t edt_type =3D 0; + uint64_t edt_offset; + MemTxResult result; + AddressSpace *edt_as =3D NULL; + uint64_t ret =3D -1; + + if (edt_index < XIVE_TABLE_EDT_MAX) { + edt_type =3D GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]); + } + + switch (edt_type) { + case CQ_TDR_EDT_IPI: + edt_as =3D &xive->ipi_as; + break; + case CQ_TDR_EDT_EQ: + edt_as =3D &xive->end_as; + break; + default: + xive_error(xive, "VC: invalid EDT type for read @%"HWADDR_PRIx, of= fset); + return -1; + } + + /* Remap the offset for the targeted address space */ + edt_offset =3D pnv_xive_edt_offset(xive, offset, edt_type); + + ret =3D address_space_ldq(edt_as, edt_offset, MEMTXATTRS_UNSPECIFIED, + &result); + + if (result !=3D MEMTX_OK) { + xive_error(xive, "VC: %s read failed at @0x%"HWADDR_PRIx " -> @0x%" + HWADDR_PRIx, edt_type =3D=3D 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 =3D PNV_XIVE(opaque); + uint64_t edt_index =3D offset >> pnv_xive_edt_shift(xive); + uint64_t edt_type =3D 0; + uint64_t edt_offset; + MemTxResult result; + AddressSpace *edt_as =3D NULL; + + if (edt_index < XIVE_TABLE_EDT_MAX) { + edt_type =3D GETFIELD(CQ_TDR_EDT_TYPE, xive->edt[edt_index]); + } + + switch (edt_type) { + case CQ_TDR_EDT_IPI: + edt_as =3D &xive->ipi_as; + break; + case CQ_TDR_EDT_EQ: + edt_as =3D &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 =3D pnv_xive_edt_offset(xive, offset, edt_type); + + address_space_stq(edt_as, edt_offset, val, MEMTXATTRS_UNSPECIFIED, &re= sult); + if (result !=3D MEMTX_OK) { + xive_error(xive, "VC: write failed at @0x%"HWADDR_PRIx, edt_offset= ); + } +} + +static const MemoryRegionOps pnv_xive_vc_ops =3D { + .read =3D pnv_xive_vc_read, + .write =3D pnv_xive_vc_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 8, + .max_access_size =3D 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 =3D 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 =3D PNV_XIVE(opaque); + + xive_error(xive, "PC: invalid write to VC @%"HWADDR_PRIx, addr); +} + +static const MemoryRegionOps pnv_xive_pc_ops =3D { + .read =3D pnv_xive_pc_read, + .write =3D pnv_xive_pc_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, +}; + +void pnv_xive_pic_print_info(PnvXive *xive, Monitor *mon) +{ + XiveRouter *xrtr =3D XIVE_ROUTER(xive); + uint8_t blk =3D xive->chip->chip_id; + uint32_t srcno0 =3D XIVE_SRCNO(blk, 0); + uint32_t nr_ipis =3D pnv_xive_nr_ipis(xive); + uint32_t nr_ends =3D 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 =3D 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 =3D 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 =3D PNV_XIVE(dev); + XiveSource *xsrc =3D &xive->ipi_source; + XiveENDSource *end_xsrc =3D &xive->end_source; + + /* + * Use the PnvChip id to identify the XIVE interrupt controller. + * It can be overriden by configuration at runtime. + */ + xive->tctx_chipid =3D xive->chip->chip_id; + + /* Default page size (Should be changed at runtime to 64k) */ + xive->ic_shift =3D xive->vc_shift =3D xive->pc_shift =3D 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_mm= io); + } + + 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 =3D 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 =3D PNV_XIVE(dev); + XiveSource *xsrc =3D &xive->ipi_source; + XiveENDSource *end_xsrc =3D &xive->end_source; + Error *local_err =3D NULL; + Object *obj; + + obj =3D 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 =3D 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_er= r); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* Default page size. Generally changed at runtime to 64k */ + xive->ic_shift =3D xive->vc_shift =3D xive->pc_shift =3D 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_re= g_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_ls= i_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[] =3D "ibm,power9-xive-x"; + char *name; + int offset; + uint32_t lpc_pcba =3D PNV9_XSCOM_XIVE_BASE; + uint32_t reg[] =3D { + cpu_to_be32(lpc_pcba), + cpu_to_be32(PNV9_XSCOM_XIVE_SIZE) + }; + + name =3D g_strdup_printf("xive@%x", lpc_pcba); + offset =3D 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[] =3D { + 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 =3D DEVICE_CLASS(klass); + PnvXScomInterfaceClass *xdc =3D PNV_XSCOM_INTERFACE_CLASS(klass); + XiveRouterClass *xrc =3D XIVE_ROUTER_CLASS(klass); + XiveNotifierClass *xnc =3D XIVE_NOTIFIER_CLASS(klass); + + xdc->dt_xscom =3D pnv_xive_dt_xscom; + + dc->desc =3D "PowerNV XIVE Interrupt Controller"; + dc->realize =3D pnv_xive_realize; + dc->props =3D pnv_xive_properties; + + xrc->get_eas =3D pnv_xive_get_eas; + xrc->get_end =3D pnv_xive_get_end; + xrc->write_end =3D pnv_xive_write_end; + xrc->get_nvt =3D pnv_xive_get_nvt; + xrc->write_nvt =3D pnv_xive_write_nvt; + xrc->get_tctx =3D pnv_xive_get_tctx; + + xnc->notify =3D pnv_xive_notify; +}; + +static const TypeInfo pnv_xive_info =3D { + .name =3D TYPE_PNV_XIVE, + .parent =3D TYPE_XIVE_ROUTER, + .instance_init =3D pnv_xive_init, + .instance_size =3D sizeof(PnvXive), + .class_init =3D pnv_xive_class_init, + .interfaces =3D (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, ui= nt32_t core_id) static void pnv_chip_power9_intc_create(PnvChip *chip, PowerPCCPU *cpu, Error **errp) { - return; + Pnv9Chip *chip9 =3D PNV9_CHIP(chip); + Error *local_err =3D NULL; + Object *obj; + PnvCPUState *pnv_cpu =3D 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 =3D xive_tctx_create(OBJECT(cpu), XIVE_ROUTER(&chip9->xive), errp); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + pnv_cpu->intc =3D obj; } =20 /* Allowed core identifiers on a POWER8 Processor Chip : @@ -887,11 +903,19 @@ static void pnv_chip_power8nvl_class_init(ObjectClass= *klass, void *data) =20 static void pnv_chip_power9_instance_init(Object *obj) { + Pnv9Chip *chip9 =3D 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); } =20 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) { PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(dev); + Pnv9Chip *chip9 =3D PNV9_CHIP(dev); + PnvChip *chip =3D PNV_CHIP(dev); Error *local_err =3D NULL; =20 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); } =20 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" =20 #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; =20 /*< public >*/ + PnvXive xive; } Pnv9Chip; =20 typedef struct PnvChipClass { @@ -215,4 +217,23 @@ void pnv_bmc_powerdown(IPMIBmc *bmc); (0x0003ffe000000000ull + (uint64_t)PNV_CHIP_INDEX(chip) * \ PNV_PSIHB_FSP_SIZE) =20 +/* + * 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, 0x00060100000000= 00ull) + +#define PNV9_XIVE_PC_SIZE 0x0000001000000000ull +#define PNV9_XIVE_PC_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060180000000= 00ull) + +#define PNV9_XIVE_IC_SIZE 0x0000000000080000ull +#define PNV9_XIVE_IC_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060302031000= 00ull) + +#define PNV9_XIVE_TM_SIZE 0x0000000000040000ull +#define PNV9_XIVE_TM_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060302031800= 00ull) + + #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 =20 +#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); =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382489521937.8158602675854; Tue, 12 Mar 2019 02:21:29 -0700 (PDT) Received: from localhost ([127.0.0.1]:47965 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3db3-000623-8H for importer@patchew.org; Tue, 12 Mar 2019 05:21:17 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47629) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCL-0001jH-Gl for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCK-0001eJ-Ht for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:55:45 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:40655) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCJ-0001Zt-Or; Tue, 12 Mar 2019 04:55:44 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMM6fG0z9sPF; Tue, 12 Mar 2019 19:55:27 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380927; bh=Ie5zM0oVpXB+FEJVG1zsQ1KBzBG/ZFo4e+xPEjNQdsY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iDEla8/ZPd+/iAHIoJGYmNt8GS5Inw6Ga9sgcCWtmp8niyYvXsJQ7z1+uMLvzUQX8 g9FbD9tUk9rxUEqmQPOTjcx7PSQ86QncOYRMlMF+wp1AkljBu8NBIcRx3QpzwtcVIi ZDyOqLrURY4oSqyHENvflLanax9HcM8qbsMu0ilM= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:27 +1100 Message-Id: <20190312085502.8203-28-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 27/62] ppc/pnv: introduce a new dt_populate() operation to the chip model 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The POWER9 and POWER8 processors have a different set of devices and a different device tree layout. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190306085032.15744-8-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 27 +++++++++++++++++++++++++-- include/hw/ppc/pnv.h | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index a7ec76dbd6..087541a91a 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -267,7 +267,7 @@ static void pnv_dt_icp(PnvChip *chip, void *fdt, uint32= _t pir, g_free(reg); } =20 -static void pnv_dt_chip(PnvChip *chip, void *fdt) +static void pnv_chip_power8_dt_populate(PnvChip *chip, void *fdt) { const char *typename =3D pnv_chip_core_typename(chip); size_t typesize =3D object_type_get_instance_size(typename); @@ -289,6 +289,25 @@ static void pnv_dt_chip(PnvChip *chip, void *fdt) } } =20 +static void pnv_chip_power9_dt_populate(PnvChip *chip, void *fdt) +{ + const char *typename =3D pnv_chip_core_typename(chip); + size_t typesize =3D object_type_get_instance_size(typename); + int i; + + pnv_dt_xscom(chip, fdt, 0); + + for (i =3D 0; i < chip->nr_cores; i++) { + PnvCore *pnv_core =3D PNV_CORE(chip->cores + i * typesize); + + pnv_dt_core(chip, pnv_core, fdt); + } + + if (chip->ram_size) { + pnv_dt_memory(fdt, chip->chip_id, chip->ram_start, chip->ram_size); + } +} + static void pnv_dt_rtc(ISADevice *d, void *fdt, int lpc_off) { uint32_t io_base =3D d->ioport_id; @@ -474,7 +493,7 @@ static void *pnv_dt_create(MachineState *machine) =20 /* Populate device tree for each chip */ for (i =3D 0; i < pnv->num_chips; i++) { - pnv_dt_chip(pnv->chips[i], fdt); + PNV_CHIP_GET_CLASS(pnv->chips[i])->dt_populate(pnv->chips[i], fdt); } =20 /* Populate ISA devices on chip 0 */ @@ -858,6 +877,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *kl= ass, void *data) k->core_pir =3D pnv_chip_core_pir_p8; k->intc_create =3D pnv_chip_power8_intc_create; k->isa_create =3D pnv_chip_power8_isa_create; + k->dt_populate =3D pnv_chip_power8_dt_populate; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8E"; =20 @@ -876,6 +896,7 @@ static void pnv_chip_power8_class_init(ObjectClass *kla= ss, void *data) k->core_pir =3D pnv_chip_core_pir_p8; k->intc_create =3D pnv_chip_power8_intc_create; k->isa_create =3D pnv_chip_power8_isa_create; + k->dt_populate =3D pnv_chip_power8_dt_populate; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8"; =20 @@ -894,6 +915,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *= klass, void *data) k->core_pir =3D pnv_chip_core_pir_p8; k->intc_create =3D pnv_chip_power8_intc_create; k->isa_create =3D pnv_chip_power8nvl_isa_create; + k->dt_populate =3D pnv_chip_power8_dt_populate; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8NVL"; =20 @@ -954,6 +976,7 @@ static void pnv_chip_power9_class_init(ObjectClass *kla= ss, void *data) k->core_pir =3D pnv_chip_core_pir_p9; k->intc_create =3D pnv_chip_power9_intc_create; k->isa_create =3D pnv_chip_power9_isa_create; + k->dt_populate =3D pnv_chip_power9_dt_populate; k->xscom_base =3D 0x00603fc00000000ull; dc->desc =3D "PowerNV Chip POWER9"; =20 diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index ebbb3d0e9a..fa9ec50fd5 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -102,6 +102,7 @@ typedef struct PnvChipClass { uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp); ISABus *(*isa_create)(PnvChip *chip, Error **errp); + void (*dt_populate)(PnvChip *chip, void *fdt); } PnvChipClass; =20 #define PNV_CHIP_TYPE_SUFFIX "-" TYPE_PNV_CHIP --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381561344282.66611519154014; Tue, 12 Mar 2019 02:06:01 -0700 (PDT) Received: from localhost ([127.0.0.1]:47722 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dMG-0001PZ-6Q for importer@patchew.org; Tue, 12 Mar 2019 05:06:00 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47846) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCc-00024n-Ng for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCb-0001sv-Nd for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:02 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:54463) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCa-0001ox-WE; Tue, 12 Mar 2019 04:56:01 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMT09S1z9sPS; Tue, 12 Mar 2019 19:55:27 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380933; bh=azXpz97OGWFofTT+IFcm8e+r5aZ2C0NnlrQgWdlJWGY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mVvTccVPJOQbXUYtd9Rjv5FiRPuXbgRFsQcoTK+1GKOMH8XBURhPkxRNVMqBQVcjU JQhTB3Vzhj+ASXMtMdjdlCT5qqzKKf+QNtlD3ZRzIhEznEfZw5/GUQfWO/teYbr7Tv K1mO5QLA62yPPoyf0ykaa6i1hxt6Q6FeGrE3F84c= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:28 +1100 Message-Id: <20190312085502.8203-29-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 28/62] ppc/pnv: introduce a new pic_print_info() operation to the chip model 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The POWER9 and POWER8 processors have different interrupt controllers, and reporting their state requires calling different helper routines. However, the interrupt presenters are still handled in the higher level pic_print_info() routine because they are not related to the chip. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190306085032.15744-9-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 27 ++++++++++++++++++++++++--- include/hw/ppc/pnv.h | 1 + 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 087541a91a..7660eaa22c 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -567,6 +567,20 @@ static ISABus *pnv_isa_create(PnvChip *chip, Error **e= rrp) return PNV_CHIP_GET_CLASS(chip)->isa_create(chip, errp); } =20 +static void pnv_chip_power8_pic_print_info(PnvChip *chip, Monitor *mon) +{ + Pnv8Chip *chip8 =3D PNV8_CHIP(chip); + + ics_pic_print_info(&chip8->psi.ics, mon); +} + +static void pnv_chip_power9_pic_print_info(PnvChip *chip, Monitor *mon) +{ + Pnv9Chip *chip9 =3D PNV9_CHIP(chip); + + pnv_xive_pic_print_info(&chip9->xive, mon); +} + static void pnv_init(MachineState *machine) { PnvMachineState *pnv =3D PNV_MACHINE(machine); @@ -878,6 +892,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *kl= ass, void *data) k->intc_create =3D pnv_chip_power8_intc_create; k->isa_create =3D pnv_chip_power8_isa_create; k->dt_populate =3D pnv_chip_power8_dt_populate; + k->pic_print_info =3D pnv_chip_power8_pic_print_info; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8E"; =20 @@ -897,6 +912,7 @@ static void pnv_chip_power8_class_init(ObjectClass *kla= ss, void *data) k->intc_create =3D pnv_chip_power8_intc_create; k->isa_create =3D pnv_chip_power8_isa_create; k->dt_populate =3D pnv_chip_power8_dt_populate; + k->pic_print_info =3D pnv_chip_power8_pic_print_info; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8"; =20 @@ -916,6 +932,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *= klass, void *data) k->intc_create =3D pnv_chip_power8_intc_create; k->isa_create =3D pnv_chip_power8nvl_isa_create; k->dt_populate =3D pnv_chip_power8_dt_populate; + k->pic_print_info =3D pnv_chip_power8_pic_print_info; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8NVL"; =20 @@ -977,6 +994,7 @@ static void pnv_chip_power9_class_init(ObjectClass *kla= ss, void *data) k->intc_create =3D pnv_chip_power9_intc_create; k->isa_create =3D pnv_chip_power9_isa_create; k->dt_populate =3D pnv_chip_power9_dt_populate; + k->pic_print_info =3D pnv_chip_power9_pic_print_info; k->xscom_base =3D 0x00603fc00000000ull; dc->desc =3D "PowerNV Chip POWER9"; =20 @@ -1164,12 +1182,15 @@ static void pnv_pic_print_info(InterruptStatsProvid= er *obj, CPU_FOREACH(cs) { PowerPCCPU *cpu =3D POWERPC_CPU(cs); =20 - icp_pic_print_info(ICP(pnv_cpu_state(cpu)->intc), mon); + if (pnv_chip_is_power9(pnv->chips[0])) { + xive_tctx_pic_print_info(XIVE_TCTX(pnv_cpu_state(cpu)->intc), = mon); + } else { + icp_pic_print_info(ICP(pnv_cpu_state(cpu)->intc), mon); + } } =20 for (i =3D 0; i < pnv->num_chips; i++) { - Pnv8Chip *chip8 =3D PNV8_CHIP(pnv->chips[i]); - ics_pic_print_info(&chip8->psi.ics, mon); + PNV_CHIP_GET_CLASS(pnv->chips[i])->pic_print_info(pnv->chips[i], m= on); } } =20 diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index fa9ec50fd5..eb4bba25b3 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -103,6 +103,7 @@ typedef struct PnvChipClass { void (*intc_create)(PnvChip *chip, PowerPCCPU *cpu, Error **errp); ISABus *(*isa_create)(PnvChip *chip, Error **errp); void (*dt_populate)(PnvChip *chip, void *fdt); + void (*pic_print_info)(PnvChip *chip, Monitor *mon); } PnvChipClass; =20 #define PNV_CHIP_TYPE_SUFFIX "-" TYPE_PNV_CHIP --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382747229412.16381621102767; Tue, 12 Mar 2019 02:25:47 -0700 (PDT) Received: from localhost ([127.0.0.1]:48007 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dfI-0000xh-44 for importer@patchew.org; Tue, 12 Mar 2019 05:25:40 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48089) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCw-0002Qh-Ja for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCv-00029F-Fa for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:22 -0400 Received: from ozlabs.org ([203.11.71.1]:54571) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCu-0001ok-Q3; Tue, 12 Mar 2019 04:56:21 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMS4dJqz9sPY; Tue, 12 Mar 2019 19:55:28 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380932; bh=oC8reTZTExnIDlAwmY83WV005vQyrXDD0PQmdeLO4hQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S3Qi0OMNBoGgslOcmZF9Ipdl3xyiiit8LyfgcGhw+NHHpeDQh96s/G+S5MBGefDWN G3PYm+mzFZkSczc4ruqwtqSlvzVdVKvUjQBwNOIq8rL//LkRF0pLorFOuljjX7oplG PXvrTJp9tIfITyRWzlhSsuj5X+ktWDT8qlx1unZo= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:29 +1100 Message-Id: <20190312085502.8203-30-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 29/62] ppc/xive: activate HV support 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The NSR register of the HV ring has a different, although similar, bit layout. TM_QW3_NSR_HE_PHYS bit should now be raised when the Hypervisor interrupt line is signaled. Other bits TM_QW3_NSR_HE_POOL and TM_QW3_NSR_HE_LSI are not modeled. LSI are for special interrupts reserved for HW bringup and the POOL bit is used when signaling a group of VPs. This is not currently implemented in Linux but it is in pHyp. The most important special commands on the HV TIMA page are added to let the core manage interrupts : acking and changing the CPU priority. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190306085032.15744-10-clg@kaod.org> Signed-off-by: David Gibson --- hw/intc/xive.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/hw/intc/xive.c b/hw/intc/xive.c index 7d7992c0ce..a0b87001da 100644 --- a/hw/intc/xive.c +++ b/hw/intc/xive.c @@ -54,6 +54,8 @@ static uint8_t exception_mask(uint8_t ring) switch (ring) { case TM_QW1_OS: return TM_QW1_NSR_EO; + case TM_QW3_HV_PHYS: + return TM_QW3_NSR_HE; default: g_assert_not_reached(); } @@ -88,7 +90,16 @@ static void xive_tctx_notify(XiveTCTX *tctx, uint8_t rin= g) uint8_t *regs =3D &tctx->regs[ring]; =20 if (regs[TM_PIPR] < regs[TM_CPPR]) { - regs[TM_NSR] |=3D exception_mask(ring); + switch (ring) { + case TM_QW1_OS: + regs[TM_NSR] |=3D TM_QW1_NSR_EO; + break; + case TM_QW3_HV_PHYS: + regs[TM_NSR] |=3D (TM_QW3_NSR_HE_PHYS << 6); + break; + default: + g_assert_not_reached(); + } qemu_irq_raise(tctx->output); } } @@ -109,6 +120,38 @@ static void xive_tctx_set_cppr(XiveTCTX *tctx, uint8_t= ring, uint8_t cppr) * XIVE Thread Interrupt Management Area (TIMA) */ =20 +static void xive_tm_set_hv_cppr(XiveTCTX *tctx, hwaddr offset, + uint64_t value, unsigned size) +{ + xive_tctx_set_cppr(tctx, TM_QW3_HV_PHYS, value & 0xff); +} + +static uint64_t xive_tm_ack_hv_reg(XiveTCTX *tctx, hwaddr offset, unsigned= size) +{ + return xive_tctx_accept(tctx, TM_QW3_HV_PHYS); +} + +static uint64_t xive_tm_pull_pool_ctx(XiveTCTX *tctx, hwaddr offset, + unsigned size) +{ + uint64_t ret; + + ret =3D tctx->regs[TM_QW2_HV_POOL + TM_WORD2] & TM_QW2W2_POOL_CAM; + tctx->regs[TM_QW2_HV_POOL + TM_WORD2] &=3D ~TM_QW2W2_POOL_CAM; + return ret; +} + +static void xive_tm_vt_push(XiveTCTX *tctx, hwaddr offset, + uint64_t value, unsigned size) +{ + tctx->regs[TM_QW3_HV_PHYS + TM_WORD2] =3D value & 0xff; +} + +static uint64_t xive_tm_vt_poll(XiveTCTX *tctx, hwaddr offset, unsigned si= ze) +{ + return tctx->regs[TM_QW3_HV_PHYS + TM_WORD2] & 0xff; +} + /* * Define an access map for each page of the TIMA that we will use in * the memory region ops to filter values when doing loads and stores @@ -288,10 +331,16 @@ static const XiveTmOp xive_tm_operations[] =3D { * effects */ { XIVE_TM_OS_PAGE, TM_QW1_OS + TM_CPPR, 1, xive_tm_set_os_cppr, NULL= }, + { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_CPPR, 1, xive_tm_set_hv_cppr, N= ULL }, + { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_WORD2, 1, xive_tm_vt_push, NULL= }, + { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_WORD2, 1, NULL, xive_tm_vt_poll= }, =20 /* MMIOs above 2K : special operations with side effects */ { XIVE_TM_OS_PAGE, TM_SPC_ACK_OS_REG, 2, NULL, xive_tm_ack_os_reg = }, { XIVE_TM_OS_PAGE, TM_SPC_SET_OS_PENDING, 1, xive_tm_set_os_pending, N= ULL }, + { XIVE_TM_HV_PAGE, TM_SPC_ACK_HV_REG, 2, NULL, xive_tm_ack_hv_reg = }, + { XIVE_TM_HV_PAGE, TM_SPC_PULL_POOL_CTX, 4, NULL, xive_tm_pull_pool_c= tx }, + { XIVE_TM_HV_PAGE, TM_SPC_PULL_POOL_CTX, 8, NULL, xive_tm_pull_pool_c= tx }, }; =20 static const XiveTmOp *xive_tm_find_op(hwaddr offset, unsigned size, bool = write) @@ -323,7 +372,7 @@ void xive_tctx_tm_write(XiveTCTX *tctx, hwaddr offset, = uint64_t value, const XiveTmOp *xto; =20 /* - * TODO: check V bit in Q[0-3]W2, check PTER bit associated with CPU + * TODO: check V bit in Q[0-3]W2 */ =20 /* @@ -360,7 +409,7 @@ uint64_t xive_tctx_tm_read(XiveTCTX *tctx, hwaddr offse= t, unsigned size) const XiveTmOp *xto; =20 /* - * TODO: check V bit in Q[0-3]W2, check PTER bit associated with CPU + * TODO: check V bit in Q[0-3]W2 */ =20 /* @@ -472,6 +521,8 @@ static void xive_tctx_reset(void *dev) */ tctx->regs[TM_QW1_OS + TM_PIPR] =3D ipb_to_pipr(tctx->regs[TM_QW1_OS + TM_IPB]); + tctx->regs[TM_QW3_HV_PHYS + TM_PIPR] =3D + ipb_to_pipr(tctx->regs[TM_QW3_HV_PHYS + TM_IPB]); } =20 static void xive_tctx_realize(DeviceState *dev, Error **errp) --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382751261473.8521274881499; Tue, 12 Mar 2019 02:25:51 -0700 (PDT) Received: from localhost ([127.0.0.1]:48023 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dfQ-00013S-4C for importer@patchew.org; Tue, 12 Mar 2019 05:25:48 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48126) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCz-0002Sl-IH for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCy-0002BP-N1 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:25 -0400 Received: from ozlabs.org ([203.11.71.1]:36889) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCy-0001ud-8v; Tue, 12 Mar 2019 04:56:24 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMV43cYz9sPc; Tue, 12 Mar 2019 19:55:28 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380934; bh=jcq4e83bjweWp0gF6tb4oVE4qj/6rsWNZjEGildFkos=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pBiiuv2JdDfd7HbZL7M55Hy3U5hOfxOLGxnivCMX/SajUc2dveIHXgB/k9UH/ULP1 h9x8931ZWBgwcrQL8JAWFOtSmpMAI2stmecBu4ddiKSnsvjWU4k92/GAxgPfBrdK+j OrqCzpBOF0rcaFMwoL/7yq8PScNYmLi9ahe6lz/c= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:30 +1100 Message-Id: <20190312085502.8203-31-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 30/62] ppc/pnv: fix logging primitives using Ox 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190306085032.15744-12-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv_lpc.c | 10 +++++----- hw/ppc/pnv_psi.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c index 172a915cfc..9b18ce55e3 100644 --- a/hw/ppc/pnv_lpc.c +++ b/hw/ppc/pnv_lpc.c @@ -294,7 +294,7 @@ static uint64_t lpc_hc_read(void *opaque, hwaddr addr, = unsigned size) val =3D lpc->lpc_hc_error_addr; break; default: - qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: Ox%" + qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: 0x%" HWADDR_PRIx "\n", addr); } return val; @@ -332,7 +332,7 @@ static void lpc_hc_write(void *opaque, hwaddr addr, uin= t64_t val, case LPC_HC_ERROR_ADDRESS: break; default: - qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: Ox%" + qemu_log_mask(LOG_UNIMP, "LPC HC Unimplemented register: 0x%" HWADDR_PRIx "\n", addr); } } @@ -370,7 +370,7 @@ static uint64_t opb_master_read(void *opaque, hwaddr ad= dr, unsigned size) val =3D lpc->opb_irq_input; break; default: - qemu_log_mask(LOG_UNIMP, "OPB MASTER Unimplemented register: Ox%" + qemu_log_mask(LOG_UNIMP, "OPBM: read on unimplemented register: 0x= %" HWADDR_PRIx "\n", addr); } =20 @@ -399,8 +399,8 @@ static void opb_master_write(void *opaque, hwaddr addr, /* Read only */ break; default: - qemu_log_mask(LOG_UNIMP, "OPB MASTER Unimplemented register: Ox%" - HWADDR_PRIx "\n", addr); + qemu_log_mask(LOG_UNIMP, "OPBM: write on unimplemented register: 0= x%" + HWADDR_PRIx " val=3D0x%08"PRIx64"\n", addr, val); } } =20 diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c index 44bc0cbf58..c872be0b9c 100644 --- a/hw/ppc/pnv_psi.c +++ b/hw/ppc/pnv_psi.c @@ -323,7 +323,7 @@ static uint64_t pnv_psi_reg_read(PnvPsi *psi, uint32_t = offset, bool mmio) val =3D psi->regs[offset]; break; default: - qemu_log_mask(LOG_UNIMP, "PSI: read at Ox%" PRIx32 "\n", offset); + qemu_log_mask(LOG_UNIMP, "PSI: read at 0x%" PRIx32 "\n", offset); } return val; } @@ -382,7 +382,7 @@ static void pnv_psi_reg_write(PnvPsi *psi, uint32_t off= set, uint64_t val, pnv_psi_set_irsn(psi, val); break; default: - qemu_log_mask(LOG_UNIMP, "PSI: write at Ox%" PRIx32 "\n", offset); + qemu_log_mask(LOG_UNIMP, "PSI: write at 0x%" PRIx32 "\n", offset); } } =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381751365185.86776093312926; Tue, 12 Mar 2019 02:09:11 -0700 (PDT) Received: from localhost ([127.0.0.1]:47755 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dPC-0003oE-Lb for importer@patchew.org; Tue, 12 Mar 2019 05:09:02 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47928) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCh-0002Ad-UO for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCg-0001zG-Sk for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:07 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:51585) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCg-0001xG-E0; Tue, 12 Mar 2019 04:56:06 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMW4bb9z9sPd; Tue, 12 Mar 2019 19:55:29 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380935; bh=dgTpVd1xtOPl2wAzFapWU6j2Abxb/+l4cstcBEND5BQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MM2Nzw9lN02He/o7gDGUhuIVe9L2nvqjrBOCvSdR17xhJU4ZQ5+8SGmgOqvquxSK/ ECOWRCyFARwoHTqiEMJ5/D4A9Fj7J+ncTub0lAxPp6mKWYSSuBp31dtHY2VqAkLany qepBvTzd3rx6EuQKiZdTN3SxzKvm7oEzR9YpwlRk= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:31 +1100 Message-Id: <20190312085502.8203-32-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 31/62] ppc/pnv: psi: add a PSIHB_REG macro 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater This is a simple helper to translate XSCOM addresses to MMIO addresses Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190306085032.15744-13-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv_psi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c index c872be0b9c..a2f8d0dece 100644 --- a/hw/ppc/pnv_psi.c +++ b/hw/ppc/pnv_psi.c @@ -114,6 +114,8 @@ #define PSIHB_BAR_MASK 0x0003fffffff00000ull #define PSIHB_FSPBAR_MASK 0x0003ffff00000000ull =20 +#define PSIHB_REG(addr) (((addr) >> 3) + PSIHB_XSCOM_BAR) + static void pnv_psi_set_bar(PnvPsi *psi, uint64_t bar) { MemoryRegion *sysmem =3D get_system_memory(); @@ -392,13 +394,13 @@ static void pnv_psi_reg_write(PnvPsi *psi, uint32_t o= ffset, uint64_t val, */ static uint64_t pnv_psi_mmio_read(void *opaque, hwaddr addr, unsigned size) { - return pnv_psi_reg_read(opaque, (addr >> 3) + PSIHB_XSCOM_BAR, true); + return pnv_psi_reg_read(opaque, PSIHB_REG(addr), true); } =20 static void pnv_psi_mmio_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { - pnv_psi_reg_write(opaque, (addr >> 3) + PSIHB_XSCOM_BAR, val, true); + pnv_psi_reg_write(opaque, PSIHB_REG(addr), val, true); } =20 static const MemoryRegionOps psi_mmio_ops =3D { --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382487443347.1482482273118; Tue, 12 Mar 2019 02:21:27 -0700 (PDT) Received: from localhost ([127.0.0.1]:47963 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3db1-00060I-0I for importer@patchew.org; Tue, 12 Mar 2019 05:21:15 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47826) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCc-000247-0Q for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCb-0001sS-6g for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:01 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:39661) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCa-0001of-Od; Tue, 12 Mar 2019 04:56:01 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMQ054Vz9sP4; Tue, 12 Mar 2019 19:55:29 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380930; bh=AyY9RAkWpL1IZ+QbTM8F/qTxGkPj0/45TPK50VE1NVI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FAAS/kNhnM6xT5Q2+MK4sVirfkxl469v7Al2T737eBsst9n22hQo3n6LPll2MRrP7 /tZtlsWNmJUC3uRtY2PLxhY+OKWZUNs6xSzS58F3FOSc8AlrVNnKzXu61VJPRedP30 UYj/04XmwcYNd8Nh22yW9C1DGy9oEitrjC6uktJY= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:32 +1100 Message-Id: <20190312085502.8203-33-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 32/62] ppc/pnv: psi: add a reset handler 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater Reset all regs but keep the MMIO BAR enabled as it is at realize time. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190306085032.15744-14-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv_psi.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c index a2f8d0dece..e61861bfd3 100644 --- a/hw/ppc/pnv_psi.c +++ b/hw/ppc/pnv_psi.c @@ -442,6 +442,15 @@ static const MemoryRegionOps pnv_psi_xscom_ops =3D { } }; =20 +static void pnv_psi_reset(void *dev) +{ + PnvPsi *psi =3D PNV_PSI(dev); + + memset(psi->regs, 0x0, sizeof(psi->regs)); + + psi->regs[PSIHB_XSCOM_BAR] =3D psi->bar | PSIHB_BAR_EN; +} + static void pnv_psi_init(Object *obj) { PnvPsi *psi =3D PNV_PSI(obj); @@ -511,6 +520,8 @@ static void pnv_psi_realize(DeviceState *dev, Error **e= rrp) psi->regs[xivr] =3D PSIHB_XIVR_PRIO_MSK | ((uint64_t) i << PSIHB_XIVR_SRC_SH); } + + qemu_register_reset(pnv_psi_reset, dev); } =20 static int pnv_psi_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_o= ffset) --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382352112216.46132344562704; Tue, 12 Mar 2019 02:19:12 -0700 (PDT) Received: from localhost ([127.0.0.1]:47914 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dYy-0004QW-RW for importer@patchew.org; Tue, 12 Mar 2019 05:19:08 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48199) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dD3-0002Wi-4E for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dD1-0002Dn-Ll for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:29 -0400 Received: from ozlabs.org ([203.11.71.1]:48163) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dD0-0001xc-Vv; Tue, 12 Mar 2019 04:56:27 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMX18r8z9sNj; Tue, 12 Mar 2019 19:55:29 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380936; bh=pgheis9jdFhT2uVgdkKLKQN8Sy7ToI2aWn3Y3DxvxGs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=njs7tEDe8uaPgxAuza1vF20ORnpYZxEeHhiQVy7hHdwLH4WdHSR+LMEbMDAe3KzJV 6OQNLEqlF7hYPdzOb9PXa23DG6KYBoxtl+pyKMvhAwX+gDn4nn6y5UQZdSvQa+TslG lRbQQ0eCT2h+ncPZFMWdwjeAvD0QQ9+GaMxY5ZUw= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:33 +1100 Message-Id: <20190312085502.8203-34-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 33/62] spapr_iommu: Do not replay mappings from just created DMA window 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, Alexey Kardashevskiy , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Alexey Kardashevskiy On sPAPR vfio_listener_region_add() is called in 2 situations: 1. a new listener is registered from vfio_connect_container(); 2. a new IOMMU Memory Region is added from rtas_ibm_create_pe_dma_window(). In both cases vfio_listener_region_add() calls memory_region_iommu_replay() to notify newly registered IOMMU notifiers about existing mappings which is totally desirable for case 1. However for case 2 it is nothing but noop as the window has just been created and has no valid mappings so replaying those does not do anything. It is barely noticeable with usual guests but if the window happens to be really big, such no-op replay might take minutes and trigger RCU stall warnings in the guest. For example, a upcoming GPU RAM memory region mapped at 64TiB (right after SPAPR_PCI_LIMIT) causes a 64bit DMA window to be at least 128TiB which is (128<<40)/0x10000=3D2.147.483.648 TCEs to replay. This mitigates the problem by adding an "skipping_replay" flag to sPAPRTCETable and defining sPAPR own IOMMU MR replay() hook which does exactly the same thing as the generic one except it returns early if @skipping_replay=3D=3Dtrue. Another way of fixing this would be delaying replay till the very first H_PUT_TCE but this does not work if in-kernel H_PUT_TCE handler is enabled (a likely case). When "ibm,create-pe-dma-window" is complete, the guest will map only required regions of the huge DMA window. Signed-off-by: Alexey Kardashevskiy Message-Id: <20190307050518.64968-2-aik@ozlabs.ru> Signed-off-by: David Gibson --- hw/ppc/spapr_iommu.c | 31 +++++++++++++++++++++++++++++++ hw/ppc/spapr_rtas_ddw.c | 10 ++++++++++ include/hw/ppc/spapr.h | 1 + 3 files changed, 42 insertions(+) diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c index 37e98f9321..8f231799b2 100644 --- a/hw/ppc/spapr_iommu.c +++ b/hw/ppc/spapr_iommu.c @@ -141,6 +141,36 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(IOMMUMe= moryRegion *iommu, return ret; } =20 +static void spapr_tce_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n) +{ + MemoryRegion *mr =3D MEMORY_REGION(iommu_mr); + IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_GET_CLASS(iommu_m= r); + hwaddr addr, granularity; + IOMMUTLBEntry iotlb; + sPAPRTCETable *tcet =3D container_of(iommu_mr, sPAPRTCETable, iommu); + + if (tcet->skipping_replay) { + return; + } + + granularity =3D memory_region_iommu_get_min_page_size(iommu_mr); + + for (addr =3D 0; addr < memory_region_size(mr); addr +=3D granularity)= { + iotlb =3D imrc->translate(iommu_mr, addr, IOMMU_NONE, n->iommu_idx= ); + if (iotlb.perm !=3D IOMMU_NONE) { + n->notify(n, &iotlb); + } + + /* + * if (2^64 - MR size) < granularity, it's possible to get an + * infinite loop here. This should catch such a wraparound. + */ + if ((addr + granularity) < addr) { + break; + } + } +} + static int spapr_tce_table_pre_save(void *opaque) { sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(opaque); @@ -659,6 +689,7 @@ static void spapr_iommu_memory_region_class_init(Object= Class *klass, void *data) IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_CLASS(klass); =20 imrc->translate =3D spapr_tce_translate_iommu; + imrc->replay =3D spapr_tce_replay; imrc->get_min_page_size =3D spapr_tce_get_min_page_size; imrc->notify_flag_changed =3D spapr_tce_notify_flag_changed; imrc->get_attr =3D spapr_tce_get_attr; diff --git a/hw/ppc/spapr_rtas_ddw.c b/hw/ppc/spapr_rtas_ddw.c index cb8a410359..cc9d1f5c1c 100644 --- a/hw/ppc/spapr_rtas_ddw.c +++ b/hw/ppc/spapr_rtas_ddw.c @@ -171,8 +171,18 @@ static void rtas_ibm_create_pe_dma_window(PowerPCCPU *= cpu, } =20 win_addr =3D (windows =3D=3D 0) ? sphb->dma_win_addr : sphb->dma64_win= _addr; + /* + * We have just created a window, we know for the fact that it is empt= y, + * use a hack to avoid iterating over the table as it is quite possible + * to have billions of TCEs, all empty. + * Note that we cannot delay this to the first H_PUT_TCE as this hcall= is + * mostly likely to be handled in KVM so QEMU just does not know if it + * happened. + */ + tcet->skipping_replay =3D true; spapr_tce_table_enable(tcet, page_shift, win_addr, 1ULL << (window_shift - page_shift)); + tcet->skipping_replay =3D false; if (!tcet->nb_table) { goto hw_error_exit; } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 1311ebe28e..f117a7ce6e 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -723,6 +723,7 @@ struct sPAPRTCETable { uint64_t *mig_table; bool bypass; bool need_vfio; + bool skipping_replay; int fd; MemoryRegion root; IOMMUMemoryRegion iommu; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382928448974.922992213565; Tue, 12 Mar 2019 02:28:48 -0700 (PDT) Received: from localhost ([127.0.0.1]:48060 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3diH-0004L0-Bl for importer@patchew.org; Tue, 12 Mar 2019 05:28:45 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48140) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dD0-0002Ta-7a for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCz-0002Bv-An for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:26 -0400 Received: from ozlabs.org ([203.11.71.1]:37173) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCy-0001ux-TS; Tue, 12 Mar 2019 04:56:25 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMV6xCFz9sPW; Tue, 12 Mar 2019 19:55:29 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380934; bh=SOuqjR73sXjFmud3vZ31oCB34YYYWp0PDi8PwfJjGmg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WBjPuas9YZfx3UYJaOFASD2jvABjwMZngilqiYWlqmLJ2oUPDmu5TYn60ceafplZc nQhZrJC83+rJzwnb/BJxmefaa9LSJJSEBIFQHfKyqFUDtXrUagwPKE3djAgdux0Zug +28lw5HLSPvsvNNlZ0BX/qtqIvl/QDMV80ZRfwKM= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:34 +1100 Message-Id: <20190312085502.8203-35-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 34/62] target/ppc: introduce single fpr_offset() 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, Richard Henderson , Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland Instead of having multiple copies of the offset calculation logic, move it = to a single fpr_offset() function. Signed-off-by: Mark Cave-Ayland Reviewed-by: Richard Henderson Message-Id: <20190307180520.13868-2-mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson --- target/ppc/cpu.h | 7 ++++++- target/ppc/translate.c | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 21e418d6b1..eaf4297616 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2563,9 +2563,14 @@ static inline bool lsw_reg_in_range(int start, int n= regs, int rx) } =20 /* Accessors for FP, VMX and VSX registers */ +static inline int fpr_offset(int i) +{ + return offsetof(CPUPPCState, vsr[i].u64[0]); +} + static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i) { - return &env->vsr[i].u64[0]; + return (uint64_t *)((uintptr_t)env + fpr_offset(i)); } =20 static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i) diff --git a/target/ppc/translate.c b/target/ppc/translate.c index b156be4d98..668d4cf75a 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -6677,12 +6677,12 @@ GEN_TM_PRIV_NOOP(trechkpt); =20 static inline void get_fpr(TCGv_i64 dst, int regno) { - tcg_gen_ld_i64(dst, cpu_env, offsetof(CPUPPCState, vsr[regno].u64[0])); + tcg_gen_ld_i64(dst, cpu_env, fpr_offset(regno)); } =20 static inline void set_fpr(int regno, TCGv_i64 src) { - tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState, vsr[regno].u64[0])); + tcg_gen_st_i64(src, cpu_env, fpr_offset(regno)); } =20 static inline void get_avr64(TCGv_i64 dst, int regno, bool high) --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552381754455141.33568070916954; Tue, 12 Mar 2019 02:09:14 -0700 (PDT) Received: from localhost ([127.0.0.1]:47757 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dPE-0003q8-SG for importer@patchew.org; Tue, 12 Mar 2019 05:09:04 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47898) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCf-00027R-42 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCe-0001x7-5Y for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:05 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:56811) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCd-0001t7-MW; Tue, 12 Mar 2019 04:56:04 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMT5vZtz9sPR; Tue, 12 Mar 2019 19:55:29 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380933; bh=o410vx+QrNh/LZ7fR0hgZg2MuSZuhNOMa5tDK9OEmew=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fxxVFYpuVJ4rtM2JQpE42pZhNY3fIiV7M5FsLJkx1JzDPqbFQqghZbS82z4YLoiqs OPvxrGmEpKrl98hZ45wBQiP/iwTasuYpAfOHKGIFRskLWIh1TMgbjffV8jBL10gT5H dp4MqIPpGfiOtUkJNtje1Ccio3EhF2+IJjbEDp5Q= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:35 +1100 Message-Id: <20190312085502.8203-36-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 35/62] target/ppc: introduce single vsrl_offset() 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, Richard Henderson , Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland Instead of having multiple copies of the offset calculation logic, move it = to a single vsrl_offset() function. This commit also renames the existing get_vsr()/set_vsr() functions to get_vsrl()/set_vsrl() which better describes their purpose. Signed-off-by: Mark Cave-Ayland Reviewed-by: Richard Henderson Message-Id: <20190307180520.13868-3-mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson --- target/ppc/cpu.h | 7 ++++++- target/ppc/translate/vsx-impl.inc.c | 12 ++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index eaf4297616..fb0f021bf4 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2573,9 +2573,14 @@ static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env= , int i) return (uint64_t *)((uintptr_t)env + fpr_offset(i)); } =20 +static inline int vsrl_offset(int i) +{ + return offsetof(CPUPPCState, vsr[i].u64[1]); +} + static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i) { - return &env->vsr[i].u64[1]; + return (uint64_t *)((uintptr_t)env + vsrl_offset(i)); } =20 static inline ppc_avr_t *cpu_avr_ptr(CPUPPCState *env, int i) diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx= -impl.inc.c index e73197e717..381ae0f2e9 100644 --- a/target/ppc/translate/vsx-impl.inc.c +++ b/target/ppc/translate/vsx-impl.inc.c @@ -1,13 +1,13 @@ /*** VSX extension = ***/ =20 -static inline void get_vsr(TCGv_i64 dst, int n) +static inline void get_vsrl(TCGv_i64 dst, int n) { - tcg_gen_ld_i64(dst, cpu_env, offsetof(CPUPPCState, vsr[n].u64[1])); + tcg_gen_ld_i64(dst, cpu_env, vsrl_offset(n)); } =20 -static inline void set_vsr(int n, TCGv_i64 src) +static inline void set_vsrl(int n, TCGv_i64 src) { - tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState, vsr[n].u64[1])); + tcg_gen_st_i64(src, cpu_env, vsrl_offset(n)); } =20 static inline int vsr_full_offset(int n) @@ -27,7 +27,7 @@ static inline void get_cpu_vsrh(TCGv_i64 dst, int n) static inline void get_cpu_vsrl(TCGv_i64 dst, int n) { if (n < 32) { - get_vsr(dst, n); + get_vsrl(dst, n); } else { get_avr64(dst, n - 32, false); } @@ -45,7 +45,7 @@ static inline void set_cpu_vsrh(int n, TCGv_i64 src) static inline void set_cpu_vsrl(int n, TCGv_i64 src) { if (n < 32) { - set_vsr(n, src); + set_vsrl(n, src); } else { set_avr64(n - 32, src, false); } --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382746169833.1450400921058; Tue, 12 Mar 2019 02:25:46 -0700 (PDT) Received: from localhost ([127.0.0.1]:48015 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dfK-0000zl-WE for importer@patchew.org; Tue, 12 Mar 2019 05:25:43 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48291) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dD7-0002cA-GN for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dD1-0002Db-GU for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:33 -0400 Received: from ozlabs.org ([203.11.71.1]:57781) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dD1-0001y5-2r; Tue, 12 Mar 2019 04:56:27 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMX3jwXz9sNd; Tue, 12 Mar 2019 19:55:30 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380936; bh=pNs0CN9IUhmKK4xV0EWNuf13/+JUPK+25/gBdm1lLvo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F592FnfrvcU2G8FC8ES2VmyAgGUyV0bP+rBHmaOazpqh7FHDY/geJS26eI5Nx5h0r qperQw07447qRFwT90pdOKxFN4/BKeGkpn2C6aY73svIiLEqNoRFEafHwyajrIBQnW FRWWx5ybyX1LStbNP1sBwbcaEhqMq3F+2XT02d0U= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:36 +1100 Message-Id: <20190312085502.8203-37-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 36/62] target/ppc: move Vsr* macros from internal.h to cpu.h 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, Richard Henderson , Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland It isn't possible to include internal.h from cpu.h so move the Vsr* macros into cpu.h alongside the other VMX/VSX register access functions. Signed-off-by: Mark Cave-Ayland Message-Id: <20190307180520.13868-4-mark.cave-ayland@ilande.co.uk> Reviewed-by: Richard Henderson Signed-off-by: David Gibson --- target/ppc/cpu.h | 20 ++++++++++++++++++++ target/ppc/internal.h | 19 ------------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index fb0f021bf4..86d9faaa2c 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2563,6 +2563,26 @@ static inline bool lsw_reg_in_range(int start, int n= regs, int rx) } =20 /* Accessors for FP, VMX and VSX registers */ +#if defined(HOST_WORDS_BIGENDIAN) +#define VsrB(i) u8[i] +#define VsrSB(i) s8[i] +#define VsrH(i) u16[i] +#define VsrSH(i) s16[i] +#define VsrW(i) u32[i] +#define VsrSW(i) s32[i] +#define VsrD(i) u64[i] +#define VsrSD(i) s64[i] +#else +#define VsrB(i) u8[15 - (i)] +#define VsrSB(i) s8[15 - (i)] +#define VsrH(i) u16[7 - (i)] +#define VsrSH(i) s16[7 - (i)] +#define VsrW(i) u32[3 - (i)] +#define VsrSW(i) s32[3 - (i)] +#define VsrD(i) u64[1 - (i)] +#define VsrSD(i) s64[1 - (i)] +#endif + static inline int fpr_offset(int i) { return offsetof(CPUPPCState, vsr[i].u64[0]); diff --git a/target/ppc/internal.h b/target/ppc/internal.h index f26a71ffcf..3ebbdf4da4 100644 --- a/target/ppc/internal.h +++ b/target/ppc/internal.h @@ -204,25 +204,6 @@ EXTRACT_HELPER(IMM8, 11, 8); EXTRACT_HELPER(DCMX, 16, 7); EXTRACT_HELPER_SPLIT_3(DCMX_XV, 5, 16, 0, 1, 2, 5, 1, 6, 6); =20 -#if defined(HOST_WORDS_BIGENDIAN) -#define VsrB(i) u8[i] -#define VsrSB(i) s8[i] -#define VsrH(i) u16[i] -#define VsrSH(i) s16[i] -#define VsrW(i) u32[i] -#define VsrSW(i) s32[i] -#define VsrD(i) u64[i] -#define VsrSD(i) s64[i] -#else -#define VsrB(i) u8[15 - (i)] -#define VsrSB(i) s8[15 - (i)] -#define VsrH(i) u16[7 - (i)] -#define VsrSH(i) s16[7 - (i)] -#define VsrW(i) u32[3 - (i)] -#define VsrSW(i) s32[3 - (i)] -#define VsrD(i) u64[1 - (i)] -#define VsrSD(i) s64[1 - (i)] -#endif static inline void getVSR(int n, ppc_vsr_t *vsr, CPUPPCState *env) { vsr->VsrD(0) =3D env->vsr[n].u64[0]; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382557310413.4188115484262; Tue, 12 Mar 2019 02:22:37 -0700 (PDT) Received: from localhost ([127.0.0.1]:47968 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dcH-0006vv-3r for importer@patchew.org; Tue, 12 Mar 2019 05:22:33 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48070) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCu-0002P4-T7 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCt-00028U-Qh for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:20 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:57041) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCt-00026o-0e; Tue, 12 Mar 2019 04:56:19 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMd2S3fz9sPj; Tue, 12 Mar 2019 19:55:33 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380941; bh=cvSohcN44ETXgsIrE5FIZMAzKqE+F+FEZXat5UewmHU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oPLNOrsL5/5JEZuXQltWJNRcYIfehTqq5hdJNdvaKSO56dFAWjNp+ZM1zqpaAa167 JBvZ41XSwO6K7F2F2Dk5y2DuU7JQ81Px/1c3BjNEm6G16cHJ9f/X1CpCyx15UYZRE8 jTgD8pe+1/ReCq5JZltgctpiY0BlzeQhapR4Sk5k= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:37 +1100 Message-Id: <20190312085502.8203-38-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 37/62] target/ppc: introduce avr_full_offset() 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, Richard Henderson , Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland All TCG vector operations require pointers to the base address of the vector rather than separate access to the top and bottom 64-bits. Convert the VMX = TCG instructions to use a new avr_full_offset() function instead of avr64_offse= t() which can then itself be written as a simple wrapper onto vsr_full_offset(). This same function can also reused in cpu_avr_ptr() to avoid having more th= an one copy of the offset calculation logic. Signed-off-by: Mark Cave-Ayland Message-Id: <20190307180520.13868-5-mark.cave-ayland@ilande.co.uk> Reviewed-by: Richard Henderson Signed-off-by: David Gibson --- target/ppc/cpu.h | 12 +++++++++++- target/ppc/translate/vmx-impl.inc.c | 22 +++++++++++----------- target/ppc/translate/vsx-impl.inc.c | 5 ----- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 86d9faaa2c..03fd06aecd 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2598,14 +2598,24 @@ static inline int vsrl_offset(int i) return offsetof(CPUPPCState, vsr[i].u64[1]); } =20 +static inline int vsr_full_offset(int i) +{ + return offsetof(CPUPPCState, vsr[i].u64[0]); +} + static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i) { return (uint64_t *)((uintptr_t)env + vsrl_offset(i)); } =20 +static inline int avr_full_offset(int i) +{ + return vsr_full_offset(i + 32); +} + static inline ppc_avr_t *cpu_avr_ptr(CPUPPCState *env, int i) { - return &env->vsr[32 + i]; + return (ppc_avr_t *)((uintptr_t)env + avr_full_offset(i)); } =20 void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env); diff --git a/target/ppc/translate/vmx-impl.inc.c b/target/ppc/translate/vmx= -impl.inc.c index f1b15ae2cb..4e5d0bc0e0 100644 --- a/target/ppc/translate/vmx-impl.inc.c +++ b/target/ppc/translate/vmx-impl.inc.c @@ -10,7 +10,7 @@ static inline TCGv_ptr gen_avr_ptr(int reg) { TCGv_ptr r =3D tcg_temp_new_ptr(); - tcg_gen_addi_ptr(r, cpu_env, offsetof(CPUPPCState, vsr[32 + reg].u64[0= ])); + tcg_gen_addi_ptr(r, cpu_env, avr_full_offset(reg)); return r; } =20 @@ -205,7 +205,7 @@ static void gen_mtvscr(DisasContext *ctx) } =20 val =3D tcg_temp_new_i32(); - bofs =3D avr64_offset(rB(ctx->opcode), true); + bofs =3D avr_full_offset(rB(ctx->opcode)); #ifdef HOST_WORDS_BIGENDIAN bofs +=3D 3 * 4; #endif @@ -284,9 +284,9 @@ static void glue(gen_, name)(DisasContext *ctx) = \ } \ \ tcg_op(vece, \ - avr64_offset(rD(ctx->opcode), true), \ - avr64_offset(rA(ctx->opcode), true), \ - avr64_offset(rB(ctx->opcode), true), \ + avr_full_offset(rD(ctx->opcode)), \ + avr_full_offset(rA(ctx->opcode)), \ + avr_full_offset(rB(ctx->opcode)), \ 16, 16); \ } =20 @@ -578,10 +578,10 @@ static void glue(gen_, NAME)(DisasContext *ctx) = \ gen_exception(ctx, POWERPC_EXCP_VPU); \ return; \ } \ - tcg_gen_gvec_4(avr64_offset(rD(ctx->opcode), true), \ + tcg_gen_gvec_4(avr_full_offset(rD(ctx->opcode)), \ offsetof(CPUPPCState, vscr_sat), \ - avr64_offset(rA(ctx->opcode), true), \ - avr64_offset(rB(ctx->opcode), true), \ + avr_full_offset(rA(ctx->opcode)), \ + avr_full_offset(rB(ctx->opcode)), \ 16, 16, &g); \ } =20 @@ -755,7 +755,7 @@ static void glue(gen_, name)(DisasContext *ctx) = \ return; \ } \ simm =3D SIMM5(ctx->opcode); \ - tcg_op(avr64_offset(rD(ctx->opcode), true), 16, 16, simm); \ + tcg_op(avr_full_offset(rD(ctx->opcode)), 16, 16, simm); \ } =20 GEN_VXFORM_DUPI(vspltisb, tcg_gen_gvec_dup8i, 6, 12); @@ -850,8 +850,8 @@ static void gen_vsplt(DisasContext *ctx, int vece) } =20 uimm =3D UIMM5(ctx->opcode); - bofs =3D avr64_offset(rB(ctx->opcode), true); - dofs =3D avr64_offset(rD(ctx->opcode), true); + bofs =3D avr_full_offset(rB(ctx->opcode)); + dofs =3D avr_full_offset(rD(ctx->opcode)); =20 /* Experimental testing shows that hardware masks the immediate. */ bofs +=3D (uimm << vece) & 15; diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx= -impl.inc.c index 381ae0f2e9..7d02a235e7 100644 --- a/target/ppc/translate/vsx-impl.inc.c +++ b/target/ppc/translate/vsx-impl.inc.c @@ -10,11 +10,6 @@ static inline void set_vsrl(int n, TCGv_i64 src) tcg_gen_st_i64(src, cpu_env, vsrl_offset(n)); } =20 -static inline int vsr_full_offset(int n) -{ - return offsetof(CPUPPCState, vsr[n].u64[0]); -} - static inline void get_cpu_vsrh(TCGv_i64 dst, int n) { if (n < 32) { --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552383985690148.56263351898247; Tue, 12 Mar 2019 02:46:25 -0700 (PDT) Received: from localhost ([127.0.0.1]:48427 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dzG-0004Vm-ET for importer@patchew.org; Tue, 12 Mar 2019 05:46:18 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48434) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDM-0002pU-Cw for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDL-0002Rb-F2 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:48 -0400 Received: from ozlabs.org ([203.11.71.1]:35779) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDK-0002Bn-PF; Tue, 12 Mar 2019 04:56:47 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMf6443z9s70; Tue, 12 Mar 2019 19:55:33 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380942; bh=vy8anSBrzCOsdvTD3NoBiSsFsGrdkkyR+VZyz+oGOVA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bgRadzJWhNZZqTBNwidABCN1LpbU7bR+60FprIXY3Zfn4coJMxUHUOiYf/TmfR//0 sYszKsxp/OH21Jcyi3I3h321SRqLa2F2rN3ipWiDi02tsNaEIG0Eilfj+b5nPbWRVj qkgRaBqBkv1lEfz0DqmPWVo3igx6s61vauj+k/Fk= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:38 +1100 Message-Id: <20190312085502.8203-39-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 38/62] target/ppc: improve avr64_offset() and use it to simplify get_avr64()/set_avr64() 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, Richard Henderson , Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland By using the VsrD macro in avr64_offset() the same offset calculation can be used regardless of the host endian. This allows get_avr64() and set_avr64()= to be simplified accordingly. Signed-off-by: Mark Cave-Ayland Message-Id: <20190307180520.13868-6-mark.cave-ayland@ilande.co.uk> Reviewed-by: Richard Henderson Signed-off-by: David Gibson --- target/ppc/cpu.h | 5 +++++ target/ppc/translate.c | 16 ++-------------- target/ppc/translate/vmx-impl.inc.c | 5 ----- 3 files changed, 7 insertions(+), 19 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 03fd06aecd..7e18866ee2 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2608,6 +2608,11 @@ static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *en= v, int i) return (uint64_t *)((uintptr_t)env + vsrl_offset(i)); } =20 +static inline long avr64_offset(int i, bool high) +{ + return offsetof(CPUPPCState, vsr[32 + i].VsrD(high ? 0 : 1)); +} + static inline int avr_full_offset(int i) { return vsr_full_offset(i + 32); diff --git a/target/ppc/translate.c b/target/ppc/translate.c index 668d4cf75a..98b37cebc2 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -6687,24 +6687,12 @@ static inline void set_fpr(int regno, TCGv_i64 src) =20 static inline void get_avr64(TCGv_i64 dst, int regno, bool high) { -#ifdef HOST_WORDS_BIGENDIAN - tcg_gen_ld_i64(dst, cpu_env, offsetof(CPUPPCState, - vsr[32 + regno].u64[(high ? 0 : = 1)])); -#else - tcg_gen_ld_i64(dst, cpu_env, offsetof(CPUPPCState, - vsr[32 + regno].u64[(high ? 1 : = 0)])); -#endif + tcg_gen_ld_i64(dst, cpu_env, avr64_offset(regno, high)); } =20 static inline void set_avr64(int regno, TCGv_i64 src, bool high) { -#ifdef HOST_WORDS_BIGENDIAN - tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState, - vsr[32 + regno].u64[(high ? 0 : = 1)])); -#else - tcg_gen_st_i64(src, cpu_env, offsetof(CPUPPCState, - vsr[32 + regno].u64[(high ? 1 : = 0)])); -#endif + tcg_gen_st_i64(src, cpu_env, avr64_offset(regno, high)); } =20 #include "translate/fp-impl.inc.c" diff --git a/target/ppc/translate/vmx-impl.inc.c b/target/ppc/translate/vmx= -impl.inc.c index 4e5d0bc0e0..eb10c533ca 100644 --- a/target/ppc/translate/vmx-impl.inc.c +++ b/target/ppc/translate/vmx-impl.inc.c @@ -14,11 +14,6 @@ static inline TCGv_ptr gen_avr_ptr(int reg) return r; } =20 -static inline long avr64_offset(int reg, bool high) -{ - return offsetof(CPUPPCState, vsr[32 + reg].u64[(high ? 0 : 1)]); -} - #define GEN_VR_LDX(name, opc2, opc3) = \ static void glue(gen_, name)(DisasContext *ctx) = \ { = \ --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382935261501.30637591717175; Tue, 12 Mar 2019 02:28:55 -0700 (PDT) Received: from localhost ([127.0.0.1]:48062 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3diN-0004Yj-6B for importer@patchew.org; Tue, 12 Mar 2019 05:28:51 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48322) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dD8-0002dy-TO for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dD7-0002J1-TG for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:34 -0400 Received: from ozlabs.org ([203.11.71.1]:44915) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dD7-00023h-7S; Tue, 12 Mar 2019 04:56:33 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMc3wfvz9sBp; Tue, 12 Mar 2019 19:55:34 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380940; bh=ar2ZpziWXyWyvtTQQnLyP4+oHMt9O0y9AfY0sMFWzpQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DLuFD89ieQoIqg6LwAcgGPLIUyfywXaq2112T6W5r2jIe0DfVUrUlthRXaspMcEix kRpVBbtUOiMxL10UaGtVXg13atn1FQaGHFQGEsGI+mEaGxqJ0hGpmFJeCY/r0VDuOp lloKAgTriU0P5y3DFbzfeJFWyBSPy/T4d5h+u4wk= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:39 +1100 Message-Id: <20190312085502.8203-40-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 39/62] target/ppc: switch fpr/vsrl registers so all VSX registers are in host endian order 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, Richard Henderson , Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland When VSX support was initially added, the fpr registers were added at offset 0 of the VSR register and the vsrl registers were added at offset 1. This is in contrast to the VMX registers (the last 32 VSX registers) whi= ch are stored in host-endian order. Switch the fpr/vsrl registers so that the lower 32 VSX registers are now al= so stored in host endian order to match the VMX registers. This ensures that T= CG vector operations involving mixed VMX and VSX registers will function correctly. Signed-off-by: Mark Cave-Ayland Reviewed-by: Richard Henderson Message-Id: <20190307180520.13868-7-mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson --- target/ppc/cpu.h | 4 ++-- target/ppc/internal.h | 8 ++++---- target/ppc/machine.c | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 7e18866ee2..612dd05e94 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2585,7 +2585,7 @@ static inline bool lsw_reg_in_range(int start, int nr= egs, int rx) =20 static inline int fpr_offset(int i) { - return offsetof(CPUPPCState, vsr[i].u64[0]); + return offsetof(CPUPPCState, vsr[i].VsrD(0)); } =20 static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i) @@ -2595,7 +2595,7 @@ static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env,= int i) =20 static inline int vsrl_offset(int i) { - return offsetof(CPUPPCState, vsr[i].u64[1]); + return offsetof(CPUPPCState, vsr[i].VsrD(1)); } =20 static inline int vsr_full_offset(int i) diff --git a/target/ppc/internal.h b/target/ppc/internal.h index 3ebbdf4da4..fb6f64ed1e 100644 --- a/target/ppc/internal.h +++ b/target/ppc/internal.h @@ -206,14 +206,14 @@ EXTRACT_HELPER_SPLIT_3(DCMX_XV, 5, 16, 0, 1, 2, 5, 1,= 6, 6); =20 static inline void getVSR(int n, ppc_vsr_t *vsr, CPUPPCState *env) { - vsr->VsrD(0) =3D env->vsr[n].u64[0]; - vsr->VsrD(1) =3D env->vsr[n].u64[1]; + vsr->VsrD(0) =3D env->vsr[n].VsrD(0); + vsr->VsrD(1) =3D env->vsr[n].VsrD(1); } =20 static inline void putVSR(int n, ppc_vsr_t *vsr, CPUPPCState *env) { - env->vsr[n].u64[0] =3D vsr->VsrD(0); - env->vsr[n].u64[1] =3D vsr->VsrD(1); + env->vsr[n].VsrD(0) =3D vsr->VsrD(0); + env->vsr[n].VsrD(1) =3D vsr->VsrD(1); } =20 void helper_compute_fprf_float16(CPUPPCState *env, float16 arg); diff --git a/target/ppc/machine.c b/target/ppc/machine.c index 756b6d2971..a92d0ad3a3 100644 --- a/target/ppc/machine.c +++ b/target/ppc/machine.c @@ -150,7 +150,7 @@ static int get_fpr(QEMUFile *f, void *pv, size_t size, { ppc_vsr_t *v =3D pv; =20 - v->u64[0] =3D qemu_get_be64(f); + v->VsrD(0) =3D qemu_get_be64(f); =20 return 0; } @@ -160,7 +160,7 @@ static int put_fpr(QEMUFile *f, void *pv, size_t size, { ppc_vsr_t *v =3D pv; =20 - qemu_put_be64(f, v->u64[0]); + qemu_put_be64(f, v->VsrD(0)); return 0; } =20 @@ -181,7 +181,7 @@ static int get_vsr(QEMUFile *f, void *pv, size_t size, { ppc_vsr_t *v =3D pv; =20 - v->u64[1] =3D qemu_get_be64(f); + v->VsrD(1) =3D qemu_get_be64(f); =20 return 0; } @@ -191,7 +191,7 @@ static int put_vsr(QEMUFile *f, void *pv, size_t size, { ppc_vsr_t *v =3D pv; =20 - qemu_put_be64(f, v->u64[1]); + qemu_put_be64(f, v->VsrD(1)); return 0; } =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552383488113418.24955338282666; Tue, 12 Mar 2019 02:38:08 -0700 (PDT) Received: from localhost ([127.0.0.1]:48232 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3drH-0005Yx-Oq for importer@patchew.org; Tue, 12 Mar 2019 05:38:03 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48042) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dCr-0002Lx-Ex for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCq-00026P-Ia for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:17 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:52813) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCp-00024v-OO; Tue, 12 Mar 2019 04:56:16 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMc687xz9sPh; Tue, 12 Mar 2019 19:55:34 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380940; bh=3nJ/919tYc7kigYGnFbk3a5F03QzGuZ5yRZFUk6f4uU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PcDir9plO+SAlo44rQllG6Doc1yedP3pYT7fQNilzuP/wRZqNSEUcXRwKUhGn+PoM NqzaoL7XlixyBN4OpezvXShqypyux4vgM1tVmwQBebCAVycm26en7RLGh2fzSkmxpF bEOHJ1xc/N9nAIsOxPA+0b98C0p9f2u6Qx+4eaVs= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:40 +1100 Message-Id: <20190312085502.8203-41-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 40/62] target/ppc: introduce vsr64_offset() to simplify get_cpu_vsr{l, h}() and set_cpu_vsr{l, h}() 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, Richard Henderson , Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland Now that all VSX registers are stored in host endian order, there is no need to go via different accessors depending upon the register number. Instead we introduce vsr64_offset() and use it directly from within get_cpu_vsr{l,h}()= and set_cpu_vsr{l,h}(). This also allows us to rewrite avr64_offset() and fpr_offset() in terms of = the new vsr64_offset() function to more clearly express the relationship betwee= n the VSX, FPR and VMX registers, and also remove vsrl_offset() which is no longer required. Signed-off-by: Mark Cave-Ayland Message-Id: <20190307180520.13868-8-mark.cave-ayland@ilande.co.uk> Reviewed-by: Richard Henderson Signed-off-by: David Gibson --- target/ppc/cpu.h | 20 ++++++++--------- target/ppc/translate/vsx-impl.inc.c | 34 ++++------------------------- 2 files changed, 14 insertions(+), 40 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 612dd05e94..fc12b4688e 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2583,34 +2583,34 @@ static inline bool lsw_reg_in_range(int start, int = nregs, int rx) #define VsrSD(i) s64[1 - (i)] #endif =20 -static inline int fpr_offset(int i) +static inline int vsr64_offset(int i, bool high) { - return offsetof(CPUPPCState, vsr[i].VsrD(0)); + return offsetof(CPUPPCState, vsr[i].VsrD(high ? 0 : 1)); } =20 -static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i) +static inline int vsr_full_offset(int i) { - return (uint64_t *)((uintptr_t)env + fpr_offset(i)); + return offsetof(CPUPPCState, vsr[i].u64[0]); } =20 -static inline int vsrl_offset(int i) +static inline int fpr_offset(int i) { - return offsetof(CPUPPCState, vsr[i].VsrD(1)); + return vsr64_offset(i, true); } =20 -static inline int vsr_full_offset(int i) +static inline uint64_t *cpu_fpr_ptr(CPUPPCState *env, int i) { - return offsetof(CPUPPCState, vsr[i].u64[0]); + return (uint64_t *)((uintptr_t)env + fpr_offset(i)); } =20 static inline uint64_t *cpu_vsrl_ptr(CPUPPCState *env, int i) { - return (uint64_t *)((uintptr_t)env + vsrl_offset(i)); + return (uint64_t *)((uintptr_t)env + vsr64_offset(i, false)); } =20 static inline long avr64_offset(int i, bool high) { - return offsetof(CPUPPCState, vsr[32 + i].VsrD(high ? 0 : 1)); + return vsr64_offset(i + 32, high); } =20 static inline int avr_full_offset(int i) diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx= -impl.inc.c index 7d02a235e7..95a269fff0 100644 --- a/target/ppc/translate/vsx-impl.inc.c +++ b/target/ppc/translate/vsx-impl.inc.c @@ -1,49 +1,23 @@ /*** VSX extension = ***/ =20 -static inline void get_vsrl(TCGv_i64 dst, int n) -{ - tcg_gen_ld_i64(dst, cpu_env, vsrl_offset(n)); -} - -static inline void set_vsrl(int n, TCGv_i64 src) -{ - tcg_gen_st_i64(src, cpu_env, vsrl_offset(n)); -} - static inline void get_cpu_vsrh(TCGv_i64 dst, int n) { - if (n < 32) { - get_fpr(dst, n); - } else { - get_avr64(dst, n - 32, true); - } + tcg_gen_ld_i64(dst, cpu_env, vsr64_offset(n, true)); } =20 static inline void get_cpu_vsrl(TCGv_i64 dst, int n) { - if (n < 32) { - get_vsrl(dst, n); - } else { - get_avr64(dst, n - 32, false); - } + tcg_gen_ld_i64(dst, cpu_env, vsr64_offset(n, false)); } =20 static inline void set_cpu_vsrh(int n, TCGv_i64 src) { - if (n < 32) { - set_fpr(n, src); - } else { - set_avr64(n - 32, src, true); - } + tcg_gen_st_i64(src, cpu_env, vsr64_offset(n, true)); } =20 static inline void set_cpu_vsrl(int n, TCGv_i64 src) { - if (n < 32) { - set_vsrl(n, src); - } else { - set_avr64(n - 32, src, false); - } + tcg_gen_st_i64(src, cpu_env, vsr64_offset(n, false)); } =20 #define VSX_LOAD_SCALAR(name, operation) \ --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382564574929.2204258652735; Tue, 12 Mar 2019 02:22:44 -0700 (PDT) Received: from localhost ([127.0.0.1]:47970 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dcI-0006yA-Vz for importer@patchew.org; Tue, 12 Mar 2019 05:22:35 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48225) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dD4-0002Y0-7F for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dD3-0002FI-Cb for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:30 -0400 Received: from ozlabs.org ([203.11.71.1]:51485) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dD2-0001ze-V8; Tue, 12 Mar 2019 04:56:29 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMc0ctzz9s7h; Tue, 12 Mar 2019 19:55:34 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380940; bh=rYOZW3bD49nGQVw99+oHXH7My3dk/6fj1GmzSqZJBxc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XEWFh046gMDTPjValTxXB6s+YZTsa0siKN6nfaiFjNUHaeZB3Ks5+2nAPfjku/SpX ocnSIZamhxN8TClWBs/x8Q4g0KB5jvAONG50/kpCniWeliZaKz3YKk0RHBqy/rJxoy nTRtZBrXkJchL1A4qj0JaA/pAATXuCNTYs+X1Vuk= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:41 +1100 Message-Id: <20190312085502.8203-42-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 41/62] mac_oldworld: use node name instead of alias name for hd device in FWPathProvider 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, Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland When using -drive to configure the hd drive for the Old World machine, the = node name "disk" should be used instead of the "hd" alias. Signed-off-by: Mark Cave-Ayland Message-Id: <20190307212058.4890-2-mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson --- hw/ppc/mac_oldworld.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c index cc1e463466..460cbc7923 100644 --- a/hw/ppc/mac_oldworld.c +++ b/hw/ppc/mac_oldworld.c @@ -402,11 +402,11 @@ static char *heathrow_fw_dev_path(FWPathProvider *p, = BusState *bus, return g_strdup("cdrom"); } =20 - return g_strdup("hd"); + return g_strdup("disk"); } =20 if (!strcmp(object_get_typename(OBJECT(dev)), "ide-hd")) { - return g_strdup("hd"); + return g_strdup("disk"); } =20 if (!strcmp(object_get_typename(OBJECT(dev)), "ide-cd")) { --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382976327907.0567759800837; Tue, 12 Mar 2019 02:29:36 -0700 (PDT) Received: from localhost ([127.0.0.1]:48064 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dj2-0005Gd-7o for importer@patchew.org; Tue, 12 Mar 2019 05:29:32 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48380) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDH-0002m1-Ax for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDG-0002OL-9p for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:43 -0400 Received: from ozlabs.org ([203.11.71.1]:59685) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDF-00028b-Tv; Tue, 12 Mar 2019 04:56:42 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMd4jKNz9sPb; Tue, 12 Mar 2019 19:55:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380941; bh=5kQ+QisL5R9wkPtz3UlPheVhSJX23EGe2BzhoNJN85w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RcE+ubC2xZPQTOAOWnCT/PNIHb1tQd+40MXDW8mdTu9Z4Ei1fq+cL+lWkvCZYhobd Uct08y9gHhWuHICf/kQvhWPJbc3s+GhyBCnZy9w7MdS3XFnXeLU2r0G8F9OXp82S2A tWSU5Fw6ROrH2qEcWaucYduCUxbdUoOaefXlk5+g= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:42 +1100 Message-Id: <20190312085502.8203-43-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 42/62] mac_newworld: use node name instead of alias name for hd device in FWPathProvider 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, Mark Cave-Ayland , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland When using -drive to configure the hd drive for the New World machine, the = node name "disk" should be used instead of the "hd" alias. Signed-off-by: Mark Cave-Ayland Message-Id: <20190307212058.4890-3-mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson --- hw/ppc/mac_newworld.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c index 97e8817145..02d8559621 100644 --- a/hw/ppc/mac_newworld.c +++ b/hw/ppc/mac_newworld.c @@ -547,11 +547,11 @@ static char *core99_fw_dev_path(FWPathProvider *p, Bu= sState *bus, return g_strdup("cdrom"); } =20 - return g_strdup("hd"); + return g_strdup("disk"); } =20 if (!strcmp(object_get_typename(OBJECT(dev)), "ide-hd")) { - return g_strdup("hd"); + return g_strdup("disk"); } =20 if (!strcmp(object_get_typename(OBJECT(dev)), "ide-cd")) { --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552383781164565.5755091797248; Tue, 12 Mar 2019 02:43:01 -0700 (PDT) Received: from localhost ([127.0.0.1]:48352 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dvv-0001Rx-05 for importer@patchew.org; Tue, 12 Mar 2019 05:42:51 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48215) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dD3-0002XZ-Q5 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dD1-0002E2-RZ for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:29 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:42505) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dD1-0002Bq-32; Tue, 12 Mar 2019 04:56:27 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMf3fvhz9sPZ; Tue, 12 Mar 2019 19:55:35 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380942; bh=rXmEQ4jnsdIY7KFfYeFaYJw+MgR691taBMujSZdj/zg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UdnGdVPiWrkoYKtN6wJAv7haLkGt88q16YjftMKoKZ4qxvnOaAQiLmgBFbji1U66h /wWhxhQZQtBe2tV0vSbBAzyFYo8vYYKToIMWL3hFRqF3W9U7XiMqPp0j8yICBo3aSS sg4jUIGcYUvyhDYAMmFyiurw6Gwx3g0fjfgL+NeM= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:43 +1100 Message-Id: <20190312085502.8203-44-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 43/62] ppc/pnv: add a PSI bridge class model 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater To ease the introduction of the PSI bridge model for POWER9, abstract the POWER chip differences in a PnvPsi class model and introduce a specific Pnv8Psi type for POWER8. POWER8 interface to the interrupt controller is still XICS whereas POWER9 uses the new XIVE model. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-2-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 6 ++- hw/ppc/pnv_psi.c | 79 ++++++++++++++++++++++++++++------------ include/hw/ppc/pnv.h | 2 +- include/hw/ppc/pnv_psi.h | 29 ++++++++++++++- 4 files changed, 87 insertions(+), 29 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 7660eaa22c..5bb2332f16 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -788,7 +788,7 @@ static void pnv_chip_power8_instance_init(Object *obj) Pnv8Chip *chip8 =3D PNV8_CHIP(obj); =20 object_initialize_child(obj, "psi", &chip8->psi, sizeof(chip8->psi), - TYPE_PNV_PSI, &error_abort, NULL); + TYPE_PNV8_PSI, &error_abort, NULL); object_property_add_const_link(OBJECT(&chip8->psi), "xics", OBJECT(qdev_get_machine()), &error_abor= t); =20 @@ -840,6 +840,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, E= rror **errp) PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(dev); PnvChip *chip =3D PNV_CHIP(dev); Pnv8Chip *chip8 =3D PNV8_CHIP(dev); + Pnv8Psi *psi8 =3D &chip8->psi; Error *local_err =3D NULL; =20 pcc->parent_realize(dev, &local_err); @@ -856,7 +857,8 @@ static void pnv_chip_power8_realize(DeviceState *dev, E= rror **errp) error_propagate(errp, local_err); return; } - pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE, &chip8->psi.xscom_= regs); + pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE, + &PNV_PSI(psi8)->xscom_regs); =20 /* Create LPC controller */ object_property_set_bool(OBJECT(&chip8->lpc), true, "realized", diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c index e61861bfd3..067f733f1e 100644 --- a/hw/ppc/pnv_psi.c +++ b/hw/ppc/pnv_psi.c @@ -118,10 +118,11 @@ =20 static void pnv_psi_set_bar(PnvPsi *psi, uint64_t bar) { + PnvPsiClass *ppc =3D PNV_PSI_GET_CLASS(psi); MemoryRegion *sysmem =3D get_system_memory(); uint64_t old =3D psi->regs[PSIHB_XSCOM_BAR]; =20 - psi->regs[PSIHB_XSCOM_BAR] =3D bar & (PSIHB_BAR_MASK | PSIHB_BAR_EN); + psi->regs[PSIHB_XSCOM_BAR] =3D bar & (ppc->bar_mask | PSIHB_BAR_EN); =20 /* Update MR, always remove it first */ if (old & PSIHB_BAR_EN) { @@ -130,7 +131,7 @@ static void pnv_psi_set_bar(PnvPsi *psi, uint64_t bar) =20 /* Then add it back if needed */ if (bar & PSIHB_BAR_EN) { - uint64_t addr =3D bar & PSIHB_BAR_MASK; + uint64_t addr =3D bar & ppc->bar_mask; memory_region_add_subregion(sysmem, addr, &psi->regs_mr); } } @@ -154,7 +155,7 @@ static void pnv_psi_set_cr(PnvPsi *psi, uint64_t cr) =20 static void pnv_psi_set_irsn(PnvPsi *psi, uint64_t val) { - ICSState *ics =3D &psi->ics; + ICSState *ics =3D &PNV8_PSI(psi)->ics; =20 /* In this model we ignore the up/down enable bits for now * as SW doesn't use them (other than setting them at boot). @@ -207,7 +208,12 @@ static const uint64_t stat_bits[] =3D { [PSIHB_IRQ_EXTERNAL] =3D PSIHB_IRQ_STAT_EXT, }; =20 -void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool state) +void pnv_psi_irq_set(PnvPsi *psi, int irq, bool state) +{ + PNV_PSI_GET_CLASS(psi)->irq_set(psi, irq, state); +} + +static void pnv_psi_power8_irq_set(PnvPsi *psi, int irq, bool state) { uint32_t xivr_reg; uint32_t stat_reg; @@ -262,7 +268,7 @@ void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool s= tate) =20 static void pnv_psi_set_xivr(PnvPsi *psi, uint32_t reg, uint64_t val) { - ICSState *ics =3D &psi->ics; + ICSState *ics =3D &PNV8_PSI(psi)->ics; uint16_t server; uint8_t prio; uint8_t src; @@ -451,11 +457,11 @@ static void pnv_psi_reset(void *dev) psi->regs[PSIHB_XSCOM_BAR] =3D psi->bar | PSIHB_BAR_EN; } =20 -static void pnv_psi_init(Object *obj) +static void pnv_psi_power8_instance_init(Object *obj) { - PnvPsi *psi =3D PNV_PSI(obj); + Pnv8Psi *psi8 =3D PNV8_PSI(obj); =20 - object_initialize_child(obj, "ics-psi", &psi->ics, sizeof(psi->ics), + object_initialize_child(obj, "ics-psi", &psi8->ics, sizeof(psi8->ics), TYPE_ICS_SIMPLE, &error_abort, NULL); } =20 @@ -468,10 +474,10 @@ static const uint8_t irq_to_xivr[] =3D { PSIHB_XSCOM_XIVR_EXT, }; =20 -static void pnv_psi_realize(DeviceState *dev, Error **errp) +static void pnv_psi_power8_realize(DeviceState *dev, Error **errp) { PnvPsi *psi =3D PNV_PSI(dev); - ICSState *ics =3D &psi->ics; + ICSState *ics =3D &PNV8_PSI(psi)->ics; Object *obj; Error *err =3D NULL; unsigned int i; @@ -524,28 +530,28 @@ static void pnv_psi_realize(DeviceState *dev, Error *= *errp) qemu_register_reset(pnv_psi_reset, dev); } =20 +static const char compat_p8[] =3D "ibm,power8-psihb-x\0ibm,psihb-x"; + static int pnv_psi_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_o= ffset) { - const char compat[] =3D "ibm,power8-psihb-x\0ibm,psihb-x"; + PnvPsiClass *ppc =3D PNV_PSI_GET_CLASS(dev); char *name; int offset; - uint32_t lpc_pcba =3D PNV_XSCOM_PSIHB_BASE; uint32_t reg[] =3D { - cpu_to_be32(lpc_pcba), - cpu_to_be32(PNV_XSCOM_PSIHB_SIZE) + cpu_to_be32(ppc->xscom_pcba), + cpu_to_be32(ppc->xscom_size) }; =20 - name =3D g_strdup_printf("psihb@%x", lpc_pcba); + name =3D g_strdup_printf("psihb@%x", ppc->xscom_pcba); offset =3D fdt_add_subnode(fdt, xscom_offset, name); _FDT(offset); g_free(name); =20 - _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg)))); - - _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 2))); - _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1))); - _FDT((fdt_setprop(fdt, offset, "compatible", compat, - sizeof(compat)))); + _FDT(fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))); + _FDT(fdt_setprop_cell(fdt, offset, "#address-cells", 2)); + _FDT(fdt_setprop_cell(fdt, offset, "#size-cells", 1)); + _FDT(fdt_setprop(fdt, offset, "compatible", compat_p8, + sizeof(compat_p8))); return 0; } =20 @@ -555,6 +561,29 @@ static Property pnv_psi_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static void pnv_psi_power8_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + PnvPsiClass *ppc =3D PNV_PSI_CLASS(klass); + + dc->desc =3D "PowerNV PSI Controller POWER8"; + dc->realize =3D pnv_psi_power8_realize; + + ppc->chip_type =3D PNV_CHIP_POWER8; + ppc->xscom_pcba =3D PNV_XSCOM_PSIHB_BASE; + ppc->xscom_size =3D PNV_XSCOM_PSIHB_SIZE; + ppc->bar_mask =3D PSIHB_BAR_MASK; + ppc->irq_set =3D pnv_psi_power8_irq_set; +} + +static const TypeInfo pnv_psi_power8_info =3D { + .name =3D TYPE_PNV8_PSI, + .parent =3D TYPE_PNV_PSI, + .instance_size =3D sizeof(Pnv8Psi), + .instance_init =3D pnv_psi_power8_instance_init, + .class_init =3D pnv_psi_power8_class_init, +}; + static void pnv_psi_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -562,7 +591,7 @@ static void pnv_psi_class_init(ObjectClass *klass, void= *data) =20 xdc->dt_xscom =3D pnv_psi_dt_xscom; =20 - dc->realize =3D pnv_psi_realize; + dc->desc =3D "PowerNV PSI Controller"; dc->props =3D pnv_psi_properties; } =20 @@ -570,8 +599,9 @@ static const TypeInfo pnv_psi_info =3D { .name =3D TYPE_PNV_PSI, .parent =3D TYPE_SYS_BUS_DEVICE, .instance_size =3D sizeof(PnvPsi), - .instance_init =3D pnv_psi_init, .class_init =3D pnv_psi_class_init, + .class_size =3D sizeof(PnvPsiClass), + .abstract =3D true, .interfaces =3D (InterfaceInfo[]) { { TYPE_PNV_XSCOM_INTERFACE }, { } @@ -581,6 +611,7 @@ static const TypeInfo pnv_psi_info =3D { static void pnv_psi_register_types(void) { type_register_static(&pnv_psi_info); + type_register_static(&pnv_psi_power8_info); } =20 -type_init(pnv_psi_register_types) +type_init(pnv_psi_register_types); diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index eb4bba25b3..3b5f9cd531 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -71,7 +71,7 @@ typedef struct Pnv8Chip { MemoryRegion icp_mmio; =20 PnvLpcController lpc; - PnvPsi psi; + Pnv8Psi psi; PnvOCC occ; } Pnv8Chip; =20 diff --git a/include/hw/ppc/pnv_psi.h b/include/hw/ppc/pnv_psi.h index 64ac73512e..7087cbcb9a 100644 --- a/include/hw/ppc/pnv_psi.h +++ b/include/hw/ppc/pnv_psi.h @@ -39,7 +39,6 @@ typedef struct PnvPsi { uint64_t fsp_bar; =20 /* Interrupt generation */ - ICSState ics; qemu_irq *qirqs; =20 /* Registers */ @@ -48,6 +47,32 @@ typedef struct PnvPsi { MemoryRegion xscom_regs; } PnvPsi; =20 +#define TYPE_PNV8_PSI TYPE_PNV_PSI "-POWER8" +#define PNV8_PSI(obj) \ + OBJECT_CHECK(Pnv8Psi, (obj), TYPE_PNV8_PSI) + +typedef struct Pnv8Psi { + PnvPsi parent; + + ICSState ics; +} Pnv8Psi; + +#define PNV_PSI_CLASS(klass) \ + OBJECT_CLASS_CHECK(PnvPsiClass, (klass), TYPE_PNV_PSI) +#define PNV_PSI_GET_CLASS(obj) \ + OBJECT_GET_CLASS(PnvPsiClass, (obj), TYPE_PNV_PSI) + +typedef struct PnvPsiClass { + SysBusDeviceClass parent_class; + + int chip_type; + uint32_t xscom_pcba; + uint32_t xscom_size; + uint64_t bar_mask; + + void (*irq_set)(PnvPsi *psi, int, bool state); +} PnvPsiClass; + /* The PSI and FSP interrupts are muxed on the same IRQ number */ typedef enum PnvPsiIrq { PSIHB_IRQ_PSI, /* internal use only */ @@ -61,6 +86,6 @@ typedef enum PnvPsiIrq { =20 #define PSI_NUM_INTERRUPTS 6 =20 -extern void pnv_psi_irq_set(PnvPsi *psi, PnvPsiIrq irq, bool state); +void pnv_psi_irq_set(PnvPsi *psi, int irq, bool state); =20 #endif /* _PPC_PNV_PSI_H */ --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552382150961351.16053378260597; Tue, 12 Mar 2019 02:15:50 -0700 (PDT) Received: from localhost ([127.0.0.1]:47882 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dVj-0001wm-Jx for importer@patchew.org; Tue, 12 Mar 2019 05:15:47 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48152) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dD0-0002UM-QZ for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dCy-0002BJ-MX for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:26 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:54527) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dCx-00029c-TK; Tue, 12 Mar 2019 04:56:24 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMf1D4Fz9sPf; Tue, 12 Mar 2019 19:55:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380942; bh=Nl0yP0RFUaDSInQh1Km76wnIGMVlGBWzCGL2eIWtWds=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gQ5OcHLtIZO+idXZUF7X3akk+1mJq594qp4R5b+mTybY1vmhDvavJDNoKfZD4uMFm W+1wGe6IJA7XVa7ixeKY0R5D3c3MXDtrgI4+tOA8sZc0DDHmIiGh/RC7Sihs80vL/2 Mlx0b5P9TNn4Q4zvMOrCJsNXLs5oO/QESBA8DcWQ= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:44 +1100 Message-Id: <20190312085502.8203-45-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 44/62] ppc/pnv: add a PSI bridge 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The PSI bridge on POWER9 is very similar to POWER8. The BAR is still set through XSCOM but the controls are now entirely done with MMIOs. More interrupts are defined and the interrupt controller interface has changed to XIVE. The POWER9 model is a first example of the usage of the notify() handler of the XiveNotifier interface, linking the PSI XiveSource to its owning device model. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-3-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 18 ++ hw/ppc/pnv_psi.c | 329 ++++++++++++++++++++++++++++++++++++- include/hw/ppc/pnv.h | 6 + include/hw/ppc/pnv_psi.h | 30 ++++ include/hw/ppc/pnv_xscom.h | 3 + 5 files changed, 384 insertions(+), 2 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 5bb2332f16..1cc454cbbc 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -579,6 +579,7 @@ static void pnv_chip_power9_pic_print_info(PnvChip *chi= p, Monitor *mon) Pnv9Chip *chip9 =3D PNV9_CHIP(chip); =20 pnv_xive_pic_print_info(&chip9->xive, mon); + pnv_psi_pic_print_info(&chip9->psi, mon); } =20 static void pnv_init(MachineState *machine) @@ -950,6 +951,11 @@ static void pnv_chip_power9_instance_init(Object *obj) TYPE_PNV_XIVE, &error_abort, NULL); object_property_add_const_link(OBJECT(&chip9->xive), "chip", obj, &error_abort); + + object_initialize_child(obj, "psi", &chip9->psi, sizeof(chip9->psi), + TYPE_PNV9_PSI, &error_abort, NULL); + object_property_add_const_link(OBJECT(&chip9->psi), "chip", obj, + &error_abort); } =20 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) @@ -957,6 +963,7 @@ static void pnv_chip_power9_realize(DeviceState *dev, E= rror **errp) PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(dev); Pnv9Chip *chip9 =3D PNV9_CHIP(dev); PnvChip *chip =3D PNV_CHIP(dev); + Pnv9Psi *psi9 =3D &chip9->psi; Error *local_err =3D NULL; =20 pcc->parent_realize(dev, &local_err); @@ -982,6 +989,17 @@ static void pnv_chip_power9_realize(DeviceState *dev, = Error **errp) } pnv_xscom_add_subregion(chip, PNV9_XSCOM_XIVE_BASE, &chip9->xive.xscom_regs); + + /* Processor Service Interface (PSI) Host Bridge */ + object_property_set_int(OBJECT(&chip9->psi), PNV9_PSIHB_BASE(chip), + "bar", &error_fatal); + object_property_set_bool(OBJECT(&chip9->psi), true, "realized", &local= _err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + pnv_xscom_add_subregion(chip, PNV9_XSCOM_PSIHB_BASE, + &PNV_PSI(psi9)->xscom_regs); } =20 static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) diff --git a/hw/ppc/pnv_psi.c b/hw/ppc/pnv_psi.c index 067f733f1e..5a923e4151 100644 --- a/hw/ppc/pnv_psi.c +++ b/hw/ppc/pnv_psi.c @@ -22,6 +22,7 @@ #include "target/ppc/cpu.h" #include "qemu/log.h" #include "qapi/error.h" +#include "monitor/monitor.h" =20 #include "exec/address-spaces.h" =20 @@ -114,6 +115,9 @@ #define PSIHB_BAR_MASK 0x0003fffffff00000ull #define PSIHB_FSPBAR_MASK 0x0003ffff00000000ull =20 +#define PSIHB9_BAR_MASK 0x00fffffffff00000ull +#define PSIHB9_FSPBAR_MASK 0x00ffffff00000000ull + #define PSIHB_REG(addr) (((addr) >> 3) + PSIHB_XSCOM_BAR) =20 static void pnv_psi_set_bar(PnvPsi *psi, uint64_t bar) @@ -531,6 +535,7 @@ static void pnv_psi_power8_realize(DeviceState *dev, Er= ror **errp) } =20 static const char compat_p8[] =3D "ibm,power8-psihb-x\0ibm,psihb-x"; +static const char compat_p9[] =3D "ibm,power9-psihb-x\0ibm,psihb-x"; =20 static int pnv_psi_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_o= ffset) { @@ -550,8 +555,13 @@ static int pnv_psi_dt_xscom(PnvXScomInterface *dev, vo= id *fdt, int xscom_offset) _FDT(fdt_setprop(fdt, offset, "reg", reg, sizeof(reg))); _FDT(fdt_setprop_cell(fdt, offset, "#address-cells", 2)); _FDT(fdt_setprop_cell(fdt, offset, "#size-cells", 1)); - _FDT(fdt_setprop(fdt, offset, "compatible", compat_p8, - sizeof(compat_p8))); + if (ppc->chip_type =3D=3D PNV_CHIP_POWER9) { + _FDT(fdt_setprop(fdt, offset, "compatible", compat_p9, + sizeof(compat_p9))); + } else { + _FDT(fdt_setprop(fdt, offset, "compatible", compat_p8, + sizeof(compat_p8))); + } return 0; } =20 @@ -584,6 +594,308 @@ static const TypeInfo pnv_psi_power8_info =3D { .class_init =3D pnv_psi_power8_class_init, }; =20 + +/* Common registers */ + +#define PSIHB9_CR 0x20 +#define PSIHB9_SEMR 0x28 + +/* P9 registers */ + +#define PSIHB9_INTERRUPT_CONTROL 0x58 +#define PSIHB9_IRQ_METHOD PPC_BIT(0) +#define PSIHB9_IRQ_RESET PPC_BIT(1) +#define PSIHB9_ESB_CI_BASE 0x60 +#define PSIHB9_ESB_CI_VALID 1 +#define PSIHB9_ESB_NOTIF_ADDR 0x68 +#define PSIHB9_ESB_NOTIF_VALID 1 +#define PSIHB9_IVT_OFFSET 0x70 +#define PSIHB9_IVT_OFF_SHIFT 32 + +#define PSIHB9_IRQ_LEVEL 0x78 /* assertion */ +#define PSIHB9_IRQ_LEVEL_PSI PPC_BIT(0) +#define PSIHB9_IRQ_LEVEL_OCC PPC_BIT(1) +#define PSIHB9_IRQ_LEVEL_FSI PPC_BIT(2) +#define PSIHB9_IRQ_LEVEL_LPCHC PPC_BIT(3) +#define PSIHB9_IRQ_LEVEL_LOCAL_ERR PPC_BIT(4) +#define PSIHB9_IRQ_LEVEL_GLOBAL_ERR PPC_BIT(5) +#define PSIHB9_IRQ_LEVEL_TPM PPC_BIT(6) +#define PSIHB9_IRQ_LEVEL_LPC_SIRQ1 PPC_BIT(7) +#define PSIHB9_IRQ_LEVEL_LPC_SIRQ2 PPC_BIT(8) +#define PSIHB9_IRQ_LEVEL_LPC_SIRQ3 PPC_BIT(9) +#define PSIHB9_IRQ_LEVEL_LPC_SIRQ4 PPC_BIT(10) +#define PSIHB9_IRQ_LEVEL_SBE_I2C PPC_BIT(11) +#define PSIHB9_IRQ_LEVEL_DIO PPC_BIT(12) +#define PSIHB9_IRQ_LEVEL_PSU PPC_BIT(13) +#define PSIHB9_IRQ_LEVEL_I2C_C PPC_BIT(14) +#define PSIHB9_IRQ_LEVEL_I2C_D PPC_BIT(15) +#define PSIHB9_IRQ_LEVEL_I2C_E PPC_BIT(16) +#define PSIHB9_IRQ_LEVEL_SBE PPC_BIT(19) + +#define PSIHB9_IRQ_STAT 0x80 /* P bit */ +#define PSIHB9_IRQ_STAT_PSI PPC_BIT(0) +#define PSIHB9_IRQ_STAT_OCC PPC_BIT(1) +#define PSIHB9_IRQ_STAT_FSI PPC_BIT(2) +#define PSIHB9_IRQ_STAT_LPCHC PPC_BIT(3) +#define PSIHB9_IRQ_STAT_LOCAL_ERR PPC_BIT(4) +#define PSIHB9_IRQ_STAT_GLOBAL_ERR PPC_BIT(5) +#define PSIHB9_IRQ_STAT_TPM PPC_BIT(6) +#define PSIHB9_IRQ_STAT_LPC_SIRQ1 PPC_BIT(7) +#define PSIHB9_IRQ_STAT_LPC_SIRQ2 PPC_BIT(8) +#define PSIHB9_IRQ_STAT_LPC_SIRQ3 PPC_BIT(9) +#define PSIHB9_IRQ_STAT_LPC_SIRQ4 PPC_BIT(10) +#define PSIHB9_IRQ_STAT_SBE_I2C PPC_BIT(11) +#define PSIHB9_IRQ_STAT_DIO PPC_BIT(12) +#define PSIHB9_IRQ_STAT_PSU PPC_BIT(13) + +static void pnv_psi_notify(XiveNotifier *xf, uint32_t srcno) +{ + PnvPsi *psi =3D PNV_PSI(xf); + uint64_t notif_port =3D psi->regs[PSIHB_REG(PSIHB9_ESB_NOTIF_ADDR)]; + bool valid =3D notif_port & PSIHB9_ESB_NOTIF_VALID; + uint64_t notify_addr =3D notif_port & ~PSIHB9_ESB_NOTIF_VALID; + + uint32_t offset =3D + (psi->regs[PSIHB_REG(PSIHB9_IVT_OFFSET)] >> PSIHB9_IVT_OFF_SHIFT); + uint64_t lisn =3D cpu_to_be64(offset + srcno); + + if (valid) { + cpu_physical_memory_write(notify_addr, &lisn, sizeof(lisn)); + } +} + +static uint64_t pnv_psi_p9_mmio_read(void *opaque, hwaddr addr, unsigned s= ize) +{ + PnvPsi *psi =3D PNV_PSI(opaque); + uint32_t reg =3D PSIHB_REG(addr); + uint64_t val =3D -1; + + switch (addr) { + case PSIHB9_CR: + case PSIHB9_SEMR: + /* FSP stuff */ + case PSIHB9_INTERRUPT_CONTROL: + case PSIHB9_ESB_CI_BASE: + case PSIHB9_ESB_NOTIF_ADDR: + case PSIHB9_IVT_OFFSET: + val =3D psi->regs[reg]; + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "PSI: read at 0x%" PRIx64 "\n", add= r); + } + + return val; +} + +static void pnv_psi_p9_mmio_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvPsi *psi =3D PNV_PSI(opaque); + Pnv9Psi *psi9 =3D PNV9_PSI(psi); + uint32_t reg =3D PSIHB_REG(addr); + MemoryRegion *sysmem =3D get_system_memory(); + + switch (addr) { + case PSIHB9_CR: + case PSIHB9_SEMR: + /* FSP stuff */ + break; + case PSIHB9_INTERRUPT_CONTROL: + if (val & PSIHB9_IRQ_RESET) { + device_reset(DEVICE(&psi9->source)); + } + psi->regs[reg] =3D val; + break; + + case PSIHB9_ESB_CI_BASE: + if (!(val & PSIHB9_ESB_CI_VALID)) { + if (psi->regs[reg] & PSIHB9_ESB_CI_VALID) { + memory_region_del_subregion(sysmem, &psi9->source.esb_mmio= ); + } + } else { + if (!(psi->regs[reg] & PSIHB9_ESB_CI_VALID)) { + memory_region_add_subregion(sysmem, + val & ~PSIHB9_ESB_CI_VALID, + &psi9->source.esb_mmio); + } + } + psi->regs[reg] =3D val; + break; + + case PSIHB9_ESB_NOTIF_ADDR: + psi->regs[reg] =3D val; + break; + case PSIHB9_IVT_OFFSET: + psi->regs[reg] =3D val; + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "PSI: write at 0x%" PRIx64 "\n", ad= dr); + } +} + +static const MemoryRegionOps pnv_psi_p9_mmio_ops =3D { + .read =3D pnv_psi_p9_mmio_read, + .write =3D pnv_psi_p9_mmio_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, +}; + +static uint64_t pnv_psi_p9_xscom_read(void *opaque, hwaddr addr, unsigned = size) +{ + /* No read are expected */ + qemu_log_mask(LOG_GUEST_ERROR, "PSI: xscom read at 0x%" PRIx64 "\n", a= ddr); + return -1; +} + +static void pnv_psi_p9_xscom_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvPsi *psi =3D PNV_PSI(opaque); + + /* XSCOM is only used to set the PSIHB MMIO region */ + switch (addr >> 3) { + case PSIHB_XSCOM_BAR: + pnv_psi_set_bar(psi, val); + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "PSI: xscom write at 0x%" PRIx64 "\= n", + addr); + } +} + +static const MemoryRegionOps pnv_psi_p9_xscom_ops =3D { + .read =3D pnv_psi_p9_xscom_read, + .write =3D pnv_psi_p9_xscom_write, + .endianness =3D DEVICE_BIG_ENDIAN, + .valid =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + }, + .impl =3D { + .min_access_size =3D 8, + .max_access_size =3D 8, + } +}; + +static void pnv_psi_power9_irq_set(PnvPsi *psi, int irq, bool state) +{ + uint32_t irq_method =3D psi->regs[PSIHB_REG(PSIHB9_INTERRUPT_CONTROL)]; + + if (irq > PSIHB9_NUM_IRQS) { + qemu_log_mask(LOG_GUEST_ERROR, "PSI: Unsupported irq %d\n", irq); + return; + } + + if (irq_method & PSIHB9_IRQ_METHOD) { + qemu_log_mask(LOG_GUEST_ERROR, "PSI: LSI IRQ method no supported\n= "); + return; + } + + /* Update LSI levels */ + if (state) { + psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] |=3D PPC_BIT(irq); + } else { + psi->regs[PSIHB_REG(PSIHB9_IRQ_LEVEL)] &=3D ~PPC_BIT(irq); + } + + qemu_set_irq(psi->qirqs[irq], state); +} + +static void pnv_psi_power9_reset(void *dev) +{ + Pnv9Psi *psi =3D PNV9_PSI(dev); + + pnv_psi_reset(dev); + + if (memory_region_is_mapped(&psi->source.esb_mmio)) { + memory_region_del_subregion(get_system_memory(), &psi->source.esb_= mmio); + } +} + +static void pnv_psi_power9_instance_init(Object *obj) +{ + Pnv9Psi *psi =3D PNV9_PSI(obj); + + object_initialize_child(obj, "source", &psi->source, sizeof(psi->sourc= e), + TYPE_XIVE_SOURCE, &error_abort, NULL); +} + +static void pnv_psi_power9_realize(DeviceState *dev, Error **errp) +{ + PnvPsi *psi =3D PNV_PSI(dev); + XiveSource *xsrc =3D &PNV9_PSI(psi)->source; + Error *local_err =3D NULL; + int i; + + /* This is the only device with 4k ESB pages */ + object_property_set_int(OBJECT(xsrc), XIVE_ESB_4K, "shift", + &error_fatal); + object_property_set_int(OBJECT(xsrc), PSIHB9_NUM_IRQS, "nr-irqs", + &error_fatal); + object_property_add_const_link(OBJECT(xsrc), "xive", OBJECT(psi), + &error_fatal); + object_property_set_bool(OBJECT(xsrc), true, "realized", &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + for (i =3D 0; i < xsrc->nr_irqs; i++) { + xive_source_irq_set_lsi(xsrc, i); + } + + psi->qirqs =3D qemu_allocate_irqs(xive_source_set_irq, xsrc, xsrc->nr_= irqs); + + /* XSCOM region for PSI registers */ + pnv_xscom_region_init(&psi->xscom_regs, OBJECT(dev), &pnv_psi_p9_xscom= _ops, + psi, "xscom-psi", PNV9_XSCOM_PSIHB_SIZE); + + /* MMIO region for PSI registers */ + memory_region_init_io(&psi->regs_mr, OBJECT(dev), &pnv_psi_p9_mmio_ops= , psi, + "psihb", PNV9_PSIHB_SIZE); + + pnv_psi_set_bar(psi, psi->bar | PSIHB_BAR_EN); + + qemu_register_reset(pnv_psi_power9_reset, dev); +} + +static void pnv_psi_power9_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + PnvPsiClass *ppc =3D PNV_PSI_CLASS(klass); + XiveNotifierClass *xfc =3D XIVE_NOTIFIER_CLASS(klass); + + dc->desc =3D "PowerNV PSI Controller POWER9"; + dc->realize =3D pnv_psi_power9_realize; + + ppc->chip_type =3D PNV_CHIP_POWER9; + ppc->xscom_pcba =3D PNV9_XSCOM_PSIHB_BASE; + ppc->xscom_size =3D PNV9_XSCOM_PSIHB_SIZE; + ppc->bar_mask =3D PSIHB9_BAR_MASK; + ppc->irq_set =3D pnv_psi_power9_irq_set; + + xfc->notify =3D pnv_psi_notify; +} + +static const TypeInfo pnv_psi_power9_info =3D { + .name =3D TYPE_PNV9_PSI, + .parent =3D TYPE_PNV_PSI, + .instance_size =3D sizeof(Pnv9Psi), + .instance_init =3D pnv_psi_power9_instance_init, + .class_init =3D pnv_psi_power9_class_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_XIVE_NOTIFIER }, + { }, + }, +}; + static void pnv_psi_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -612,6 +924,19 @@ static void pnv_psi_register_types(void) { type_register_static(&pnv_psi_info); type_register_static(&pnv_psi_power8_info); + type_register_static(&pnv_psi_power9_info); } =20 type_init(pnv_psi_register_types); + +void pnv_psi_pic_print_info(Pnv9Psi *psi9, Monitor *mon) +{ + PnvPsi *psi =3D PNV_PSI(psi9); + + uint32_t offset =3D + (psi->regs[PSIHB_REG(PSIHB9_IVT_OFFSET)] >> PSIHB9_IVT_OFF_SHIFT); + + monitor_printf(mon, "PSIHB Source %08x .. %08x\n", + offset, offset + psi9->source.nr_irqs - 1); + xive_source_pic_print_info(&psi9->source, offset, mon); +} diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 3b5f9cd531..8d80cb34ee 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -84,6 +84,7 @@ typedef struct Pnv9Chip { =20 /*< public >*/ PnvXive xive; + Pnv9Psi psi; } Pnv9Chip; =20 typedef struct PnvChipClass { @@ -231,11 +232,16 @@ void pnv_bmc_powerdown(IPMIBmc *bmc); #define PNV9_XIVE_PC_SIZE 0x0000001000000000ull #define PNV9_XIVE_PC_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060180000000= 00ull) =20 +#define PNV9_PSIHB_SIZE 0x0000000000100000ull +#define PNV9_PSIHB_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060302030000= 00ull) + #define PNV9_XIVE_IC_SIZE 0x0000000000080000ull #define PNV9_XIVE_IC_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060302031000= 00ull) =20 #define PNV9_XIVE_TM_SIZE 0x0000000000040000ull #define PNV9_XIVE_TM_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060302031800= 00ull) =20 +#define PNV9_PSIHB_ESB_SIZE 0x0000000000010000ull +#define PNV9_PSIHB_ESB_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060302031c00= 00ull) =20 #endif /* _PPC_PNV_H */ diff --git a/include/hw/ppc/pnv_psi.h b/include/hw/ppc/pnv_psi.h index 7087cbcb9a..2c1b27e865 100644 --- a/include/hw/ppc/pnv_psi.h +++ b/include/hw/ppc/pnv_psi.h @@ -21,6 +21,7 @@ =20 #include "hw/sysbus.h" #include "hw/ppc/xics.h" +#include "hw/ppc/xive.h" =20 #define TYPE_PNV_PSI "pnv-psi" #define PNV_PSI(obj) \ @@ -57,6 +58,16 @@ typedef struct Pnv8Psi { ICSState ics; } Pnv8Psi; =20 +#define TYPE_PNV9_PSI TYPE_PNV_PSI "-POWER9" +#define PNV9_PSI(obj) \ + OBJECT_CHECK(Pnv9Psi, (obj), TYPE_PNV9_PSI) + +typedef struct Pnv9Psi { + PnvPsi parent; + + XiveSource source; +} Pnv9Psi; + #define PNV_PSI_CLASS(klass) \ OBJECT_CLASS_CHECK(PnvPsiClass, (klass), TYPE_PNV_PSI) #define PNV_PSI_GET_CLASS(obj) \ @@ -88,4 +99,23 @@ typedef enum PnvPsiIrq { =20 void pnv_psi_irq_set(PnvPsi *psi, int irq, bool state); =20 +/* P9 PSI Interrupts */ +#define PSIHB9_IRQ_PSI 0 +#define PSIHB9_IRQ_OCC 1 +#define PSIHB9_IRQ_FSI 2 +#define PSIHB9_IRQ_LPCHC 3 +#define PSIHB9_IRQ_LOCAL_ERR 4 +#define PSIHB9_IRQ_GLOBAL_ERR 5 +#define PSIHB9_IRQ_TPM 6 +#define PSIHB9_IRQ_LPC_SIRQ0 7 +#define PSIHB9_IRQ_LPC_SIRQ1 8 +#define PSIHB9_IRQ_LPC_SIRQ2 9 +#define PSIHB9_IRQ_LPC_SIRQ3 10 +#define PSIHB9_IRQ_SBE_I2C 11 +#define PSIHB9_IRQ_DIO 12 +#define PSIHB9_IRQ_PSU 13 +#define PSIHB9_NUM_IRQS 14 + +void pnv_psi_pic_print_info(Pnv9Psi *psi, Monitor *mon); + #endif /* _PPC_PNV_PSI_H */ diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h index 6623ec54a7..403a365ed2 100644 --- a/include/hw/ppc/pnv_xscom.h +++ b/include/hw/ppc/pnv_xscom.h @@ -73,6 +73,9 @@ typedef struct PnvXScomInterfaceClass { #define PNV_XSCOM_OCC_BASE 0x0066000 #define PNV_XSCOM_OCC_SIZE 0x6000 =20 +#define PNV9_XSCOM_PSIHB_BASE 0x5012900 +#define PNV9_XSCOM_PSIHB_SIZE 0x100 + #define PNV9_XSCOM_XIVE_BASE 0x5013000 #define PNV9_XSCOM_XIVE_SIZE 0x300 =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552384618875758.7225904950451; Tue, 12 Mar 2019 02:56:58 -0700 (PDT) Received: from localhost ([127.0.0.1]:48579 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3e9W-0004Rx-FC for importer@patchew.org; Tue, 12 Mar 2019 05:56:54 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48604) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDV-0002yl-Ev for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDU-0002dm-P4 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:57 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:46167) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDU-0002Jc-Ai; Tue, 12 Mar 2019 04:56:56 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMh2CtYz9sPn; Tue, 12 Mar 2019 19:55:36 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380944; bh=3nQJBFvT0ClgZcsh9iSEilCXM4YD9V5C1Ur8pOjP74E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Z4ncJ+U7ezx6vXU1QX3q6QIuRNXlsKWNS5kn5M+jLHEGrH1o+rNR1SV1NvgKRBd9o ab8cDG5LfcAU2E+9ZlLWKbXtvzQcLbr4DZKmtSESdkl6ktkrfYS+YJdSdf8k+JaaKJ 8VNcdnkdtxrwJDU2+3dSLhXMGEawL7uV8kVDxpEU= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:45 +1100 Message-Id: <20190312085502.8203-46-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 45/62] ppc/pnv: lpc: fix OPB address ranges 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The PowerNV LPC Controller exposes different sets of registers for each of the functional units it encompasses, among which the OPB (On-Chip Peripheral Bus) Master and Arbitrer and the LPC HOST Controller. The mapping addresses of each register range are correct but the sizes are too large. Fix the sizes and define the OPB Arbitrer range to fill the gap between the OPB Master registers and the LPC HOST Controller registers. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-4-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv_lpc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c index 9b18ce55e3..547be609ca 100644 --- a/hw/ppc/pnv_lpc.c +++ b/hw/ppc/pnv_lpc.c @@ -89,10 +89,11 @@ enum { #define LPC_FW_OPB_SIZE 0x10000000 =20 #define LPC_OPB_REGS_OPB_ADDR 0xc0010000 -#define LPC_OPB_REGS_OPB_SIZE 0x00002000 +#define LPC_OPB_REGS_OPB_SIZE 0x00000060 +#define LPC_OPB_REGS_OPBA_ADDR 0xc0011000 +#define LPC_OPB_REGS_OPBA_SIZE 0x00000008 #define LPC_HC_REGS_OPB_ADDR 0xc0012000 -#define LPC_HC_REGS_OPB_SIZE 0x00001000 - +#define LPC_HC_REGS_OPB_SIZE 0x00000100 =20 static int pnv_lpc_dt_xscom(PnvXScomInterface *dev, void *fdt, int xscom_o= ffset) { --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552383133533163.509263147585; Tue, 12 Mar 2019 02:32:13 -0700 (PDT) Received: from localhost ([127.0.0.1]:48124 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dla-0008Be-5U for importer@patchew.org; Tue, 12 Mar 2019 05:32:10 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48501) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDP-0002sb-Pk for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDO-0002Yq-Ki for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:51 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:53769) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDN-0002EA-Tg; Tue, 12 Mar 2019 04:56:50 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMg2wQwz9s4V; Tue, 12 Mar 2019 19:55:40 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380943; bh=gyC5Y6QPM7xD3SJKA9/XuvSaVkVVPWPDZ8MAs6uUFY4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EaulcpY28p9gzz6bIT7g3xLJ5cn7r2lMDS5P4DX/MrLuMBgQ3Aos+CAyzVLW4wqrc zeGQbPojeTRtGIqLWIy3C+IBxHWoaiEpf/lpANLdTiiPSPUuH8XZ8d6anBIQ+RAVtt qo8rPEhC+X2MXZAp2Do6dKFL+6IUgruleTg41F0k= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:46 +1100 Message-Id: <20190312085502.8203-47-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 46/62] ppc/pnv: add a LPC Controller class model 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater It will ease the introduction of the LPC Controller model for POWER9. Signed-off-by: C=C3=A9dric Le Goater Reviewed-by: David Gibson Message-Id: <20190307223548.20516-5-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 2 +- hw/ppc/pnv_lpc.c | 85 ++++++++++++++++++++++++++++------------ include/hw/ppc/pnv_lpc.h | 15 +++++++ 3 files changed, 77 insertions(+), 25 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 1cc454cbbc..922e3ec48b 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -794,7 +794,7 @@ static void pnv_chip_power8_instance_init(Object *obj) OBJECT(qdev_get_machine()), &error_abor= t); =20 object_initialize_child(obj, "lpc", &chip8->lpc, sizeof(chip8->lpc), - TYPE_PNV_LPC, &error_abort, NULL); + TYPE_PNV8_LPC, &error_abort, NULL); object_property_add_const_link(OBJECT(&chip8->lpc), "psi", OBJECT(&chip8->psi), &error_abort); =20 diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c index 547be609ca..3c509a30a0 100644 --- a/hw/ppc/pnv_lpc.c +++ b/hw/ppc/pnv_lpc.c @@ -245,6 +245,7 @@ static const MemoryRegionOps pnv_lpc_xscom_ops =3D { static void pnv_lpc_eval_irqs(PnvLpcController *lpc) { bool lpc_to_opb_irq =3D false; + PnvLpcClass *plc =3D PNV_LPC_GET_CLASS(lpc); =20 /* Update LPC controller to OPB line */ if (lpc->lpc_hc_irqser_ctrl & LPC_HC_IRQSER_EN) { @@ -267,7 +268,7 @@ static void pnv_lpc_eval_irqs(PnvLpcController *lpc) lpc->opb_irq_stat |=3D lpc->opb_irq_input & lpc->opb_irq_mask; =20 /* Reflect the interrupt */ - pnv_psi_irq_set(lpc->psi, PSIHB_IRQ_LPC_I2C, lpc->opb_irq_stat !=3D 0); + pnv_psi_irq_set(lpc->psi, plc->psi_irq, lpc->opb_irq_stat !=3D 0); } =20 static uint64_t lpc_hc_read(void *opaque, hwaddr addr, unsigned size) @@ -419,11 +420,65 @@ static const MemoryRegionOps opb_master_ops =3D { }, }; =20 +static void pnv_lpc_power8_realize(DeviceState *dev, Error **errp) +{ + PnvLpcController *lpc =3D PNV_LPC(dev); + PnvLpcClass *plc =3D PNV_LPC_GET_CLASS(dev); + Error *local_err =3D NULL; + + plc->parent_realize(dev, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* P8 uses a XSCOM region for LPC registers */ + pnv_xscom_region_init(&lpc->xscom_regs, OBJECT(lpc), + &pnv_lpc_xscom_ops, lpc, "xscom-lpc", + PNV_XSCOM_LPC_SIZE); +} + +static void pnv_lpc_power8_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + PnvXScomInterfaceClass *xdc =3D PNV_XSCOM_INTERFACE_CLASS(klass); + PnvLpcClass *plc =3D PNV_LPC_CLASS(klass); + + dc->desc =3D "PowerNV LPC Controller POWER8"; + + xdc->dt_xscom =3D pnv_lpc_dt_xscom; + + plc->psi_irq =3D PSIHB_IRQ_LPC_I2C; + + device_class_set_parent_realize(dc, pnv_lpc_power8_realize, + &plc->parent_realize); +} + +static const TypeInfo pnv_lpc_power8_info =3D { + .name =3D TYPE_PNV8_LPC, + .parent =3D TYPE_PNV_LPC, + .instance_size =3D sizeof(PnvLpcController), + .class_init =3D pnv_lpc_power8_class_init, + .interfaces =3D (InterfaceInfo[]) { + { TYPE_PNV_XSCOM_INTERFACE }, + { } + } +}; + static void pnv_lpc_realize(DeviceState *dev, Error **errp) { PnvLpcController *lpc =3D PNV_LPC(dev); Object *obj; - Error *error =3D NULL; + Error *local_err =3D NULL; + + obj =3D object_property_get_link(OBJECT(dev), "psi", &local_err); + if (!obj) { + error_propagate(errp, local_err); + error_prepend(errp, "required link 'psi' not found: "); + return; + } + /* The LPC controller needs PSI to generate interrupts */ + lpc->psi =3D PNV_PSI(obj); =20 /* Reg inits */ lpc->lpc_hc_fw_rd_acc_size =3D LPC_HC_FW_RD_4B; @@ -463,46 +518,28 @@ static void pnv_lpc_realize(DeviceState *dev, Error *= *errp) "lpc-hc", LPC_HC_REGS_OPB_SIZE); memory_region_add_subregion(&lpc->opb_mr, LPC_HC_REGS_OPB_ADDR, &lpc->lpc_hc_regs); - - /* XScom region for LPC registers */ - pnv_xscom_region_init(&lpc->xscom_regs, OBJECT(dev), - &pnv_lpc_xscom_ops, lpc, "xscom-lpc", - PNV_XSCOM_LPC_SIZE); - - /* get PSI object from chip */ - obj =3D object_property_get_link(OBJECT(dev), "psi", &error); - if (!obj) { - error_setg(errp, "%s: required link 'psi' not found: %s", - __func__, error_get_pretty(error)); - return; - } - lpc->psi =3D PNV_PSI(obj); } =20 static void pnv_lpc_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - PnvXScomInterfaceClass *xdc =3D PNV_XSCOM_INTERFACE_CLASS(klass); - - xdc->dt_xscom =3D pnv_lpc_dt_xscom; =20 dc->realize =3D pnv_lpc_realize; + dc->desc =3D "PowerNV LPC Controller"; } =20 static const TypeInfo pnv_lpc_info =3D { .name =3D TYPE_PNV_LPC, .parent =3D TYPE_DEVICE, - .instance_size =3D sizeof(PnvLpcController), .class_init =3D pnv_lpc_class_init, - .interfaces =3D (InterfaceInfo[]) { - { TYPE_PNV_XSCOM_INTERFACE }, - { } - } + .class_size =3D sizeof(PnvLpcClass), + .abstract =3D true, }; =20 static void pnv_lpc_register_types(void) { type_register_static(&pnv_lpc_info); + type_register_static(&pnv_lpc_power8_info); } =20 type_init(pnv_lpc_register_types) diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h index d657489b07..f3f24419b1 100644 --- a/include/hw/ppc/pnv_lpc.h +++ b/include/hw/ppc/pnv_lpc.h @@ -24,6 +24,8 @@ #define TYPE_PNV_LPC "pnv-lpc" #define PNV_LPC(obj) \ OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV_LPC) +#define TYPE_PNV8_LPC TYPE_PNV_LPC "-POWER8" +#define PNV8_LPC(obj) OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV8_LPC) =20 typedef struct PnvLpcController { DeviceState parent; @@ -70,6 +72,19 @@ typedef struct PnvLpcController { PnvPsi *psi; } PnvLpcController; =20 +#define PNV_LPC_CLASS(klass) \ + OBJECT_CLASS_CHECK(PnvLpcClass, (klass), TYPE_PNV_LPC) +#define PNV_LPC_GET_CLASS(obj) \ + OBJECT_GET_CLASS(PnvLpcClass, (obj), TYPE_PNV_LPC) + +typedef struct PnvLpcClass { + DeviceClass parent_class; + + int psi_irq; + + DeviceRealize parent_realize; +} PnvLpcClass; + ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **e= rrp); =20 #endif /* _PPC_PNV_LPC_H */ --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552384189669629.290725137908; Tue, 12 Mar 2019 02:49:49 -0700 (PDT) Received: from localhost ([127.0.0.1]:48453 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3e2S-00073O-Bu for importer@patchew.org; Tue, 12 Mar 2019 05:49:36 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48453) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDN-0002pW-7c for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDM-0002SL-8K for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:49 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:41697) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDL-0002CF-PZ; Tue, 12 Mar 2019 04:56:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMg11psz9sPg; Tue, 12 Mar 2019 19:55:40 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380943; bh=d+oT/cHqlOK28e3sYVHMP+tZy6/WSbv156rV0xYgpKE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WU7cTKAJMBZ7FXi4gzHrou+Jkip2kM3eRBROfmNAaJ23boEpwDk09LDfWtvTd/3IW +yNGs2mQXYPabybR5Fnr+oNCVoob6YxTg3R+diyU7SPgnkEpZhJQQ1rzuj6MUT7s0W v9437CU67M5fCN8am6qsR6pxC0LOyCtHy2zrxzII= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:47 +1100 Message-Id: <20190312085502.8203-48-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 47/62] ppc/pnv: add a 'dt_isa_nodename' to the chip 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The ISA bus has a different DT nodename on POWER9. Compute the name when the PnvChip is realized, that is before it is used by the machine to populate the device tree with the ISA devices. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-6-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 18 +++++------------- include/hw/ppc/pnv.h | 2 ++ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 922e3ec48b..6625562d27 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -417,24 +417,12 @@ static int pnv_dt_isa_device(DeviceState *dev, void *= opaque) return 0; } =20 -static int pnv_chip_isa_offset(PnvChip *chip, void *fdt) -{ - char *name; - int offset; - - name =3D g_strdup_printf("/xscom@%" PRIx64 "/isa@%x", - (uint64_t) PNV_XSCOM_BASE(chip), PNV_XSCOM_LPC_= BASE); - offset =3D fdt_path_offset(fdt, name); - g_free(name); - return offset; -} - /* The default LPC bus of a multichip system is on chip 0. It's * recognized by the firmware (skiboot) using a "primary" property. */ static void pnv_dt_isa(PnvMachineState *pnv, void *fdt) { - int isa_offset =3D pnv_chip_isa_offset(pnv->chips[0], fdt); + int isa_offset =3D fdt_path_offset(fdt, pnv->chips[0]->dt_isa_nodename= ); ForeachPopulateArgs args =3D { .fdt =3D fdt, .offset =3D isa_offset, @@ -866,6 +854,10 @@ static void pnv_chip_power8_realize(DeviceState *dev, = Error **errp) &error_fatal); pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip8->lpc.xscom_re= gs); =20 + chip->dt_isa_nodename =3D g_strdup_printf("/xscom@%" PRIx64 "/isa@%x", + (uint64_t) PNV_XSCOM_BASE(chip= ), + PNV_XSCOM_LPC_BASE); + /* Interrupt Management Area. This is the memory region holding * all the Interrupt Control Presenter (ICP) registers */ pnv_chip_icp_realize(chip8, &local_err); diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 8d80cb34ee..c81f157f41 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -58,6 +58,8 @@ typedef struct PnvChip { MemoryRegion xscom_mmio; MemoryRegion xscom; AddressSpace xscom_as; + + gchar *dt_isa_nodename; } PnvChip; =20 #define TYPE_PNV8_CHIP "pnv8-chip" --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552385617328212.44242763180534; Tue, 12 Mar 2019 03:13:37 -0700 (PDT) Received: from localhost ([127.0.0.1]:48865 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3ePd-0002bX-6j for importer@patchew.org; Tue, 12 Mar 2019 06:13:33 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUW-0008KY-7c for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDi-0002pI-Lm for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:12 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:44277) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDh-0002S5-TQ; Tue, 12 Mar 2019 04:57:10 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMh5T6lz9sPx; Tue, 12 Mar 2019 19:55:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380944; bh=V0TtepStJxDwOYBF3rtJamQy71fLmLUbULqQ+5pMSHo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=B4LJJE0FE+s2caawojh38JEYq4D3TCPga9pQ1AEvs1x+xFwFn8PvYS+g+jCPFgGsX 1spuuXkEWnVFuSKEDXdppyQTtq/AOm9QNIqfcSmXdnSJ4MBEc2IU7xHV7zXXDoLyjg IIYiMBOjuV8OXyXOpdysyi0E99dZjyVlA54xBu4c= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:48 +1100 Message-Id: <20190312085502.8203-49-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 48/62] ppc/pnv: add a LPC 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The LPC Controller on POWER9 is very similar to the one found on POWER8 but accesses are now done via on MMIOs, without the XSCOM and ECCB logic. The device tree is populated differently so we add a specific POWER9 routine for the purpose. SerIRQ routing is yet to be done. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-7-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 22 ++++- hw/ppc/pnv_lpc.c | 200 +++++++++++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 4 + include/hw/ppc/pnv_lpc.h | 9 ++ 4 files changed, 234 insertions(+), 1 deletion(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 6625562d27..918fae057b 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -306,6 +306,8 @@ static void pnv_chip_power9_dt_populate(PnvChip *chip, = void *fdt) if (chip->ram_size) { pnv_dt_memory(fdt, chip->chip_id, chip->ram_start, chip->ram_size); } + + pnv_dt_lpc(chip, fdt, 0); } =20 static void pnv_dt_rtc(ISADevice *d, void *fdt, int lpc_off) @@ -547,7 +549,8 @@ static ISABus *pnv_chip_power8nvl_isa_create(PnvChip *c= hip, Error **errp) =20 static ISABus *pnv_chip_power9_isa_create(PnvChip *chip, Error **errp) { - return NULL; + Pnv9Chip *chip9 =3D PNV9_CHIP(chip); + return pnv_lpc_isa_create(&chip9->lpc, false, errp); } =20 static ISABus *pnv_isa_create(PnvChip *chip, Error **errp) @@ -948,6 +951,11 @@ static void pnv_chip_power9_instance_init(Object *obj) TYPE_PNV9_PSI, &error_abort, NULL); object_property_add_const_link(OBJECT(&chip9->psi), "chip", obj, &error_abort); + + object_initialize_child(obj, "lpc", &chip9->lpc, sizeof(chip9->lpc), + TYPE_PNV9_LPC, &error_abort, NULL); + object_property_add_const_link(OBJECT(&chip9->lpc), "psi", + OBJECT(&chip9->psi), &error_abort); } =20 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) @@ -992,6 +1000,18 @@ static void pnv_chip_power9_realize(DeviceState *dev,= Error **errp) } pnv_xscom_add_subregion(chip, PNV9_XSCOM_PSIHB_BASE, &PNV_PSI(psi9)->xscom_regs); + + /* LPC */ + object_property_set_bool(OBJECT(&chip9->lpc), true, "realized", &local= _err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + memory_region_add_subregion(get_system_memory(), PNV9_LPCM_BASE(chip), + &chip9->lpc.xscom_regs); + + chip->dt_isa_nodename =3D g_strdup_printf("/lpcm-opb@%" PRIx64 "/lpc@0= ", + (uint64_t) PNV9_LPCM_BASE(chip= )); } =20 static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c index 3c509a30a0..6df694e0ab 100644 --- a/hw/ppc/pnv_lpc.c +++ b/hw/ppc/pnv_lpc.c @@ -118,6 +118,100 @@ static int pnv_lpc_dt_xscom(PnvXScomInterface *dev, v= oid *fdt, int xscom_offset) return 0; } =20 +/* POWER9 only */ +int pnv_dt_lpc(PnvChip *chip, void *fdt, int root_offset) +{ + const char compat[] =3D "ibm,power9-lpcm-opb\0simple-bus"; + const char lpc_compat[] =3D "ibm,power9-lpc\0ibm,lpc"; + char *name; + int offset, lpcm_offset; + uint64_t lpcm_addr =3D PNV9_LPCM_BASE(chip); + uint32_t opb_ranges[8] =3D { 0, + cpu_to_be32(lpcm_addr >> 32), + cpu_to_be32((uint32_t)lpcm_addr), + cpu_to_be32(PNV9_LPCM_SIZE / 2), + cpu_to_be32(PNV9_LPCM_SIZE / 2), + cpu_to_be32(lpcm_addr >> 32), + cpu_to_be32(PNV9_LPCM_SIZE / 2), + cpu_to_be32(PNV9_LPCM_SIZE / 2), + }; + uint32_t opb_reg[4] =3D { cpu_to_be32(lpcm_addr >> 32), + cpu_to_be32((uint32_t)lpcm_addr), + cpu_to_be32(PNV9_LPCM_SIZE >> 32), + cpu_to_be32((uint32_t)PNV9_LPCM_SIZE), + }; + uint32_t reg[2]; + + /* + * OPB bus + */ + name =3D g_strdup_printf("lpcm-opb@%"PRIx64, lpcm_addr); + lpcm_offset =3D fdt_add_subnode(fdt, root_offset, name); + _FDT(lpcm_offset); + g_free(name); + + _FDT((fdt_setprop(fdt, lpcm_offset, "reg", opb_reg, sizeof(opb_reg)))); + _FDT((fdt_setprop_cell(fdt, lpcm_offset, "#address-cells", 1))); + _FDT((fdt_setprop_cell(fdt, lpcm_offset, "#size-cells", 1))); + _FDT((fdt_setprop(fdt, lpcm_offset, "compatible", compat, sizeof(compa= t)))); + _FDT((fdt_setprop_cell(fdt, lpcm_offset, "ibm,chip-id", chip->chip_id)= )); + _FDT((fdt_setprop(fdt, lpcm_offset, "ranges", opb_ranges, + sizeof(opb_ranges)))); + + /* + * OPB Master registers + */ + name =3D g_strdup_printf("opb-master@%x", LPC_OPB_REGS_OPB_ADDR); + offset =3D fdt_add_subnode(fdt, lpcm_offset, name); + _FDT(offset); + g_free(name); + + reg[0] =3D cpu_to_be32(LPC_OPB_REGS_OPB_ADDR); + reg[1] =3D cpu_to_be32(LPC_OPB_REGS_OPB_SIZE); + _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg)))); + _FDT((fdt_setprop_string(fdt, offset, "compatible", + "ibm,power9-lpcm-opb-master"))); + + /* + * OPB arbitrer registers + */ + name =3D g_strdup_printf("opb-arbitrer@%x", LPC_OPB_REGS_OPBA_ADDR); + offset =3D fdt_add_subnode(fdt, lpcm_offset, name); + _FDT(offset); + g_free(name); + + reg[0] =3D cpu_to_be32(LPC_OPB_REGS_OPBA_ADDR); + reg[1] =3D cpu_to_be32(LPC_OPB_REGS_OPBA_SIZE); + _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg)))); + _FDT((fdt_setprop_string(fdt, offset, "compatible", + "ibm,power9-lpcm-opb-arbiter"))); + + /* + * LPC Host Controller registers + */ + name =3D g_strdup_printf("lpc-controller@%x", LPC_HC_REGS_OPB_ADDR); + offset =3D fdt_add_subnode(fdt, lpcm_offset, name); + _FDT(offset); + g_free(name); + + reg[0] =3D cpu_to_be32(LPC_HC_REGS_OPB_ADDR); + reg[1] =3D cpu_to_be32(LPC_HC_REGS_OPB_SIZE); + _FDT((fdt_setprop(fdt, offset, "reg", reg, sizeof(reg)))); + _FDT((fdt_setprop_string(fdt, offset, "compatible", + "ibm,power9-lpc-controller"))); + + name =3D g_strdup_printf("lpc@0"); + offset =3D fdt_add_subnode(fdt, lpcm_offset, name); + _FDT(offset); + g_free(name); + _FDT((fdt_setprop_cell(fdt, offset, "#address-cells", 2))); + _FDT((fdt_setprop_cell(fdt, offset, "#size-cells", 1))); + _FDT((fdt_setprop(fdt, offset, "compatible", lpc_compat, + sizeof(lpc_compat)))); + + return 0; +} + /* * These read/write handlers of the OPB address space should be common * with the P9 LPC Controller which uses direct MMIOs. @@ -242,6 +336,74 @@ static const MemoryRegionOps pnv_lpc_xscom_ops =3D { .endianness =3D DEVICE_BIG_ENDIAN, }; =20 +static uint64_t pnv_lpc_mmio_read(void *opaque, hwaddr addr, unsigned size) +{ + PnvLpcController *lpc =3D PNV_LPC(opaque); + uint64_t val =3D 0; + uint32_t opb_addr =3D addr & ECCB_CTL_ADDR_MASK; + MemTxResult result; + + switch (size) { + case 4: + val =3D address_space_ldl(&lpc->opb_as, opb_addr, MEMTXATTRS_UNSPE= CIFIED, + &result); + break; + case 1: + val =3D address_space_ldub(&lpc->opb_as, opb_addr, MEMTXATTRS_UNSP= ECIFIED, + &result); + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "OPB read failed at @0x%" + HWADDR_PRIx " invalid size %d\n", addr, size); + return 0; + } + + if (result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "OPB read failed at @0x%" + HWADDR_PRIx "\n", addr); + } + + return val; +} + +static void pnv_lpc_mmio_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvLpcController *lpc =3D PNV_LPC(opaque); + uint32_t opb_addr =3D addr & ECCB_CTL_ADDR_MASK; + MemTxResult result; + + switch (size) { + case 4: + address_space_stl(&lpc->opb_as, opb_addr, val, MEMTXATTRS_UNSPECIF= IED, + &result); + break; + case 1: + address_space_stb(&lpc->opb_as, opb_addr, val, MEMTXATTRS_UNSPECIF= IED, + &result); + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "OPB write failed at @0x%" + HWADDR_PRIx " invalid size %d\n", addr, size); + return; + } + + if (result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, "OPB write failed at @0x%" + HWADDR_PRIx "\n", addr); + } +} + +static const MemoryRegionOps pnv_lpc_mmio_ops =3D { + .read =3D pnv_lpc_mmio_read, + .write =3D pnv_lpc_mmio_write, + .impl =3D { + .min_access_size =3D 1, + .max_access_size =3D 4, + }, + .endianness =3D DEVICE_BIG_ENDIAN, +}; + static void pnv_lpc_eval_irqs(PnvLpcController *lpc) { bool lpc_to_opb_irq =3D false; @@ -465,6 +627,43 @@ static const TypeInfo pnv_lpc_power8_info =3D { } }; =20 +static void pnv_lpc_power9_realize(DeviceState *dev, Error **errp) +{ + PnvLpcController *lpc =3D PNV_LPC(dev); + PnvLpcClass *plc =3D PNV_LPC_GET_CLASS(dev); + Error *local_err =3D NULL; + + plc->parent_realize(dev, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* P9 uses a MMIO region */ + memory_region_init_io(&lpc->xscom_regs, OBJECT(lpc), &pnv_lpc_mmio_ops, + lpc, "lpcm", PNV9_LPCM_SIZE); +} + +static void pnv_lpc_power9_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + PnvLpcClass *plc =3D PNV_LPC_CLASS(klass); + + dc->desc =3D "PowerNV LPC Controller POWER9"; + + plc->psi_irq =3D PSIHB9_IRQ_LPCHC; + + device_class_set_parent_realize(dc, pnv_lpc_power9_realize, + &plc->parent_realize); +} + +static const TypeInfo pnv_lpc_power9_info =3D { + .name =3D TYPE_PNV9_LPC, + .parent =3D TYPE_PNV_LPC, + .instance_size =3D sizeof(PnvLpcController), + .class_init =3D pnv_lpc_power9_class_init, +}; + static void pnv_lpc_realize(DeviceState *dev, Error **errp) { PnvLpcController *lpc =3D PNV_LPC(dev); @@ -540,6 +739,7 @@ static void pnv_lpc_register_types(void) { type_register_static(&pnv_lpc_info); type_register_static(&pnv_lpc_power8_info); + type_register_static(&pnv_lpc_power9_info); } =20 type_init(pnv_lpc_register_types) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index c81f157f41..1cd1ad622d 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -87,6 +87,7 @@ typedef struct Pnv9Chip { /*< public >*/ PnvXive xive; Pnv9Psi psi; + PnvLpcController lpc; } Pnv9Chip; =20 typedef struct PnvChipClass { @@ -234,6 +235,9 @@ void pnv_bmc_powerdown(IPMIBmc *bmc); #define PNV9_XIVE_PC_SIZE 0x0000001000000000ull #define PNV9_XIVE_PC_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060180000000= 00ull) =20 +#define PNV9_LPCM_SIZE 0x0000000100000000ull +#define PNV9_LPCM_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060300000000= 00ull) + #define PNV9_PSIHB_SIZE 0x0000000000100000ull #define PNV9_PSIHB_BASE(chip) PNV9_CHIP_BASE(chip, 0x00060302030000= 00ull) =20 diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h index f3f24419b1..242b18081c 100644 --- a/include/hw/ppc/pnv_lpc.h +++ b/include/hw/ppc/pnv_lpc.h @@ -27,6 +27,9 @@ #define TYPE_PNV8_LPC TYPE_PNV_LPC "-POWER8" #define PNV8_LPC(obj) OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV8_LPC) =20 +#define TYPE_PNV9_LPC TYPE_PNV_LPC "-POWER9" +#define PNV9_LPC(obj) OBJECT_CHECK(PnvLpcController, (obj), TYPE_PNV9_LPC) + typedef struct PnvLpcController { DeviceState parent; =20 @@ -85,6 +88,12 @@ typedef struct PnvLpcClass { DeviceRealize parent_realize; } PnvLpcClass; =20 +/* + * Old compilers error on typdef forward declarations. Keep them happy. + */ +struct PnvChip; + ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **e= rrp); +int pnv_dt_lpc(struct PnvChip *chip, void *fdt, int root_offset); =20 #endif /* _PPC_PNV_LPC_H */ --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552383375210891.0418735247765; Tue, 12 Mar 2019 02:36:15 -0700 (PDT) Received: from localhost ([127.0.0.1]:48204 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dpU-00042p-64 for importer@patchew.org; Tue, 12 Mar 2019 05:36:12 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48489) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDP-0002sH-Eb for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDO-0002Yw-Mp for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:51 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:52075) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDO-0002EW-9G; Tue, 12 Mar 2019 04:56:50 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMg5rYmz9sPw; Tue, 12 Mar 2019 19:55:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380943; bh=sxzR6eEs5wp4RKSaQFcfbK/ZsWI+vJsSnZ3jGxXLyoc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UCwrnC2Mg55A9eE+nPqkN03ba0YTeszmbZn55v96Ma8QHSUZBrFV77i0PGhmiCCY8 2I6CQpZwjzjpyCKzBgQt2uHpjse6zx61OYSmRZ5HjZ5Iv8bJrqK/lax9r89ZtVFtyO pZ+pAP7JoVALGuMEOZ2t4hEFVDSBTyH8nIt6DdQg= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:49 +1100 Message-Id: <20190312085502.8203-50-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 49/62] ppc/pnv: add SerIRQ routing registers 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater This is just a simple reminder that SerIRQ routing should be addressed. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-8-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv_lpc.c | 14 ++++++++++++++ include/hw/ppc/pnv_lpc.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c index 6df694e0ab..641e2046db 100644 --- a/hw/ppc/pnv_lpc.c +++ b/hw/ppc/pnv_lpc.c @@ -39,6 +39,8 @@ enum { }; =20 /* OPB Master LS registers */ +#define OPB_MASTER_LS_ROUTE0 0x8 +#define OPB_MASTER_LS_ROUTE1 0xC #define OPB_MASTER_LS_IRQ_STAT 0x50 #define OPB_MASTER_IRQ_LPC 0x00000800 #define OPB_MASTER_LS_IRQ_MASK 0x54 @@ -521,6 +523,12 @@ static uint64_t opb_master_read(void *opaque, hwaddr a= ddr, unsigned size) uint64_t val =3D 0xfffffffffffffffful; =20 switch (addr) { + case OPB_MASTER_LS_ROUTE0: /* TODO */ + val =3D lpc->opb_irq_route0; + break; + case OPB_MASTER_LS_ROUTE1: /* TODO */ + val =3D lpc->opb_irq_route1; + break; case OPB_MASTER_LS_IRQ_STAT: val =3D lpc->opb_irq_stat; break; @@ -547,6 +555,12 @@ static void opb_master_write(void *opaque, hwaddr addr, PnvLpcController *lpc =3D opaque; =20 switch (addr) { + case OPB_MASTER_LS_ROUTE0: /* TODO */ + lpc->opb_irq_route0 =3D val; + break; + case OPB_MASTER_LS_ROUTE1: /* TODO */ + lpc->opb_irq_route1 =3D val; + break; case OPB_MASTER_LS_IRQ_STAT: lpc->opb_irq_stat &=3D ~val; pnv_lpc_eval_irqs(lpc); diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h index 242b18081c..413579792e 100644 --- a/include/hw/ppc/pnv_lpc.h +++ b/include/hw/ppc/pnv_lpc.h @@ -55,6 +55,8 @@ typedef struct PnvLpcController { MemoryRegion opb_master_regs; =20 /* OPB Master LS registers */ + uint32_t opb_irq_route0; + uint32_t opb_irq_route1; uint32_t opb_irq_stat; uint32_t opb_irq_mask; uint32_t opb_irq_pol; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552386486024870.6724397122442; Tue, 12 Mar 2019 03:28:06 -0700 (PDT) Received: from localhost ([127.0.0.1]:49123 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eda-0005yT-QZ for importer@patchew.org; Tue, 12 Mar 2019 06:27:58 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53909) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUW-0000hy-Hd for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDj-0002pu-0C for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:12 -0400 Received: from ozlabs.org ([203.11.71.1]:51685) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDi-0002T8-BL; Tue, 12 Mar 2019 04:57:10 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMj03QGz9sPk; Tue, 12 Mar 2019 19:55:41 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380945; bh=40RxWPWDKlAxY3nEh81gDyLtaizCB8fBTd4IAEoAG1k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=O3Md5dUIjCBExIRggliQA7w+rVymy2NCHf7rMfwTem7gMwCk/1J06W5w3R4kIp4DK UlGBYsNwwnw1tA/xAtG+JgOlSpCQ0WNTq+0rMmzQ5fm6g9iSJTtyhD7ufAV0jLaL3P H3zRz/FSCL61Z6e28zmk8ojUOTUwD1mMsFkT0SKY= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:50 +1100 Message-Id: <20190312085502.8203-51-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 50/62] ppc/pnv: add a OCC model class 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater To ease the introduction of the OCC model for POWER9, provide a new class attributes to define XSCOM operations per CPU family and a PSI IRQ number. Signed-off-by: C=C3=A9dric Le Goater Reviewed-by: David Gibson Message-Id: <20190307223548.20516-9-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 2 +- hw/ppc/pnv_occ.c | 55 +++++++++++++++++++++++++++------------- include/hw/ppc/pnv_occ.h | 15 +++++++++++ 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 918fae057b..6ae9ce6795 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -790,7 +790,7 @@ static void pnv_chip_power8_instance_init(Object *obj) OBJECT(&chip8->psi), &error_abort); =20 object_initialize_child(obj, "occ", &chip8->occ, sizeof(chip8->occ), - TYPE_PNV_OCC, &error_abort, NULL); + TYPE_PNV8_OCC, &error_abort, NULL); object_property_add_const_link(OBJECT(&chip8->occ), "psi", OBJECT(&chip8->psi), &error_abort); } diff --git a/hw/ppc/pnv_occ.c b/hw/ppc/pnv_occ.c index 04880f26d6..ea725647c9 100644 --- a/hw/ppc/pnv_occ.c +++ b/hw/ppc/pnv_occ.c @@ -34,15 +34,17 @@ static void pnv_occ_set_misc(PnvOCC *occ, uint64_t val) { bool irq_state; + PnvOCCClass *poc =3D PNV_OCC_GET_CLASS(occ); =20 val &=3D 0xffff000000000000ull; =20 occ->occmisc =3D val; irq_state =3D !!(val >> 63); - pnv_psi_irq_set(occ->psi, PSIHB_IRQ_OCC, irq_state); + pnv_psi_irq_set(occ->psi, poc->psi_irq, irq_state); } =20 -static uint64_t pnv_occ_xscom_read(void *opaque, hwaddr addr, unsigned siz= e) +static uint64_t pnv_occ_power8_xscom_read(void *opaque, hwaddr addr, + unsigned size) { PnvOCC *occ =3D PNV_OCC(opaque); uint32_t offset =3D addr >> 3; @@ -54,13 +56,13 @@ static uint64_t pnv_occ_xscom_read(void *opaque, hwaddr= addr, unsigned size) break; default: qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%" - HWADDR_PRIx "\n", addr); + HWADDR_PRIx "\n", addr >> 3); } return val; } =20 -static void pnv_occ_xscom_write(void *opaque, hwaddr addr, - uint64_t val, unsigned size) +static void pnv_occ_power8_xscom_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) { PnvOCC *occ =3D PNV_OCC(opaque); uint32_t offset =3D addr >> 3; @@ -77,13 +79,13 @@ static void pnv_occ_xscom_write(void *opaque, hwaddr ad= dr, break; default: qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%" - HWADDR_PRIx "\n", addr); + HWADDR_PRIx "\n", addr >> 3); } } =20 -static const MemoryRegionOps pnv_occ_xscom_ops =3D { - .read =3D pnv_occ_xscom_read, - .write =3D pnv_occ_xscom_write, +static const MemoryRegionOps pnv_occ_power8_xscom_ops =3D { + .read =3D pnv_occ_power8_xscom_read, + .write =3D pnv_occ_power8_xscom_write, .valid.min_access_size =3D 8, .valid.max_access_size =3D 8, .impl.min_access_size =3D 8, @@ -91,27 +93,42 @@ static const MemoryRegionOps pnv_occ_xscom_ops =3D { .endianness =3D DEVICE_BIG_ENDIAN, }; =20 +static void pnv_occ_power8_class_init(ObjectClass *klass, void *data) +{ + PnvOCCClass *poc =3D PNV_OCC_CLASS(klass); + + poc->xscom_size =3D PNV_XSCOM_OCC_SIZE; + poc->xscom_ops =3D &pnv_occ_power8_xscom_ops; + poc->psi_irq =3D PSIHB_IRQ_OCC; +} + +static const TypeInfo pnv_occ_power8_type_info =3D { + .name =3D TYPE_PNV8_OCC, + .parent =3D TYPE_PNV_OCC, + .instance_size =3D sizeof(PnvOCC), + .class_init =3D pnv_occ_power8_class_init, +}; =20 static void pnv_occ_realize(DeviceState *dev, Error **errp) { PnvOCC *occ =3D PNV_OCC(dev); + PnvOCCClass *poc =3D PNV_OCC_GET_CLASS(occ); Object *obj; - Error *error =3D NULL; + Error *local_err =3D NULL; =20 occ->occmisc =3D 0; =20 - /* get PSI object from chip */ - obj =3D object_property_get_link(OBJECT(dev), "psi", &error); + obj =3D object_property_get_link(OBJECT(dev), "psi", &local_err); if (!obj) { - error_setg(errp, "%s: required link 'psi' not found: %s", - __func__, error_get_pretty(error)); + error_propagate(errp, local_err); + error_prepend(errp, "required link 'psi' not found: "); return; } occ->psi =3D PNV_PSI(obj); =20 /* XScom region for OCC registers */ - pnv_xscom_region_init(&occ->xscom_regs, OBJECT(dev), &pnv_occ_xscom_op= s, - occ, "xscom-occ", PNV_XSCOM_OCC_SIZE); + pnv_xscom_region_init(&occ->xscom_regs, OBJECT(dev), poc->xscom_ops, + occ, "xscom-occ", poc->xscom_size); } =20 static void pnv_occ_class_init(ObjectClass *klass, void *data) @@ -119,6 +136,7 @@ static void pnv_occ_class_init(ObjectClass *klass, void= *data) DeviceClass *dc =3D DEVICE_CLASS(klass); =20 dc->realize =3D pnv_occ_realize; + dc->desc =3D "PowerNV OCC Controller"; } =20 static const TypeInfo pnv_occ_type_info =3D { @@ -126,11 +144,14 @@ static const TypeInfo pnv_occ_type_info =3D { .parent =3D TYPE_DEVICE, .instance_size =3D sizeof(PnvOCC), .class_init =3D pnv_occ_class_init, + .class_size =3D sizeof(PnvOCCClass), + .abstract =3D true, }; =20 static void pnv_occ_register_types(void) { type_register_static(&pnv_occ_type_info); + type_register_static(&pnv_occ_power8_type_info); } =20 -type_init(pnv_occ_register_types) +type_init(pnv_occ_register_types); diff --git a/include/hw/ppc/pnv_occ.h b/include/hw/ppc/pnv_occ.h index 82f299dc76..dab5a05f8e 100644 --- a/include/hw/ppc/pnv_occ.h +++ b/include/hw/ppc/pnv_occ.h @@ -23,6 +23,8 @@ =20 #define TYPE_PNV_OCC "pnv-occ" #define PNV_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV_OCC) +#define TYPE_PNV8_OCC TYPE_PNV_OCC "-POWER8" +#define PNV8_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV8_OCC) =20 typedef struct PnvOCC { DeviceState xd; @@ -35,4 +37,17 @@ typedef struct PnvOCC { MemoryRegion xscom_regs; } PnvOCC; =20 +#define PNV_OCC_CLASS(klass) \ + OBJECT_CLASS_CHECK(PnvOCCClass, (klass), TYPE_PNV_OCC) +#define PNV_OCC_GET_CLASS(obj) \ + OBJECT_GET_CLASS(PnvOCCClass, (obj), TYPE_PNV_OCC) + +typedef struct PnvOCCClass { + DeviceClass parent_class; + + int xscom_size; + const MemoryRegionOps *xscom_ops; + int psi_irq; +} PnvOCCClass; + #endif /* _PPC_PNV_OCC_H */ --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552383171599789.2735622327649; Tue, 12 Mar 2019 02:32:51 -0700 (PDT) Received: from localhost ([127.0.0.1]:48132 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dmC-0000IU-FQ for importer@patchew.org; Tue, 12 Mar 2019 05:32:48 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48492) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDP-0002sM-HY for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDO-0002Yf-BE for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:51 -0400 Received: from ozlabs.org ([203.11.71.1]:60019) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDN-0002EE-Mc; Tue, 12 Mar 2019 04:56:50 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMg4Dg2z9s9N; Tue, 12 Mar 2019 19:55:42 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380943; bh=HBccqEQvLvkxH9DEmqHJp/qtewxEHP3vGYNodk3KBMs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cRC4cuv7WwvN5cHmguEn/ggVzQMI+U24jhVl3EclPxa9a/TojV2tzcRshx8ARw4Ce k8rlMbuwYd6J2fPjG6sqrMP4mHtCEPRrRZOyrAb+VBdNt7FVzDIXJL65GV11K67e+x TqEzotUyAlXSHOtc7XJaJ/gpIci7UYQCPTFhurT8= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:51 +1100 Message-Id: <20190312085502.8203-52-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 51/62] ppc/pnv: add a OCC 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The OCC on POWER9 is very similar to the one found on POWER8. Provide the same routines with P9 values for the registers and IRQ number. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-10-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 13 +++++++ hw/ppc/pnv_occ.c | 72 ++++++++++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 1 + include/hw/ppc/pnv_occ.h | 2 ++ include/hw/ppc/pnv_xscom.h | 3 ++ 5 files changed, 91 insertions(+) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 6ae9ce6795..1559a73323 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -956,6 +956,11 @@ static void pnv_chip_power9_instance_init(Object *obj) TYPE_PNV9_LPC, &error_abort, NULL); object_property_add_const_link(OBJECT(&chip9->lpc), "psi", OBJECT(&chip9->psi), &error_abort); + + object_initialize_child(obj, "occ", &chip9->occ, sizeof(chip9->occ), + TYPE_PNV9_OCC, &error_abort, NULL); + object_property_add_const_link(OBJECT(&chip9->occ), "psi", + OBJECT(&chip9->psi), &error_abort); } =20 static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) @@ -1012,6 +1017,14 @@ static void pnv_chip_power9_realize(DeviceState *dev= , Error **errp) =20 chip->dt_isa_nodename =3D g_strdup_printf("/lpcm-opb@%" PRIx64 "/lpc@0= ", (uint64_t) PNV9_LPCM_BASE(chip= )); + + /* Create the simplified OCC model */ + object_property_set_bool(OBJECT(&chip9->occ), true, "realized", &local= _err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + pnv_xscom_add_subregion(chip, PNV9_XSCOM_OCC_BASE, &chip9->occ.xscom_r= egs); } =20 static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) diff --git a/hw/ppc/pnv_occ.c b/hw/ppc/pnv_occ.c index ea725647c9..fdd9296e1b 100644 --- a/hw/ppc/pnv_occ.c +++ b/hw/ppc/pnv_occ.c @@ -109,6 +109,77 @@ static const TypeInfo pnv_occ_power8_type_info =3D { .class_init =3D pnv_occ_power8_class_init, }; =20 +#define P9_OCB_OCI_OCCMISC 0x6080 +#define P9_OCB_OCI_OCCMISC_CLEAR 0x6081 +#define P9_OCB_OCI_OCCMISC_OR 0x6082 + + +static uint64_t pnv_occ_power9_xscom_read(void *opaque, hwaddr addr, + unsigned size) +{ + PnvOCC *occ =3D PNV_OCC(opaque); + uint32_t offset =3D addr >> 3; + uint64_t val =3D 0; + + switch (offset) { + case P9_OCB_OCI_OCCMISC: + val =3D occ->occmisc; + break; + default: + qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%" + HWADDR_PRIx "\n", addr >> 3); + } + return val; +} + +static void pnv_occ_power9_xscom_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvOCC *occ =3D PNV_OCC(opaque); + uint32_t offset =3D addr >> 3; + + switch (offset) { + case P9_OCB_OCI_OCCMISC_CLEAR: + pnv_occ_set_misc(occ, 0); + break; + case P9_OCB_OCI_OCCMISC_OR: + pnv_occ_set_misc(occ, occ->occmisc | val); + break; + case P9_OCB_OCI_OCCMISC: + pnv_occ_set_misc(occ, val); + break; + default: + qemu_log_mask(LOG_UNIMP, "OCC Unimplemented register: Ox%" + HWADDR_PRIx "\n", addr >> 3); + } +} + +static const MemoryRegionOps pnv_occ_power9_xscom_ops =3D { + .read =3D pnv_occ_power9_xscom_read, + .write =3D pnv_occ_power9_xscom_write, + .valid.min_access_size =3D 8, + .valid.max_access_size =3D 8, + .impl.min_access_size =3D 8, + .impl.max_access_size =3D 8, + .endianness =3D DEVICE_BIG_ENDIAN, +}; + +static void pnv_occ_power9_class_init(ObjectClass *klass, void *data) +{ + PnvOCCClass *poc =3D PNV_OCC_CLASS(klass); + + poc->xscom_size =3D PNV9_XSCOM_OCC_SIZE; + poc->xscom_ops =3D &pnv_occ_power9_xscom_ops; + poc->psi_irq =3D PSIHB9_IRQ_OCC; +} + +static const TypeInfo pnv_occ_power9_type_info =3D { + .name =3D TYPE_PNV9_OCC, + .parent =3D TYPE_PNV_OCC, + .instance_size =3D sizeof(PnvOCC), + .class_init =3D pnv_occ_power9_class_init, +}; + static void pnv_occ_realize(DeviceState *dev, Error **errp) { PnvOCC *occ =3D PNV_OCC(dev); @@ -152,6 +223,7 @@ static void pnv_occ_register_types(void) { type_register_static(&pnv_occ_type_info); type_register_static(&pnv_occ_power8_type_info); + type_register_static(&pnv_occ_power9_type_info); } =20 type_init(pnv_occ_register_types); diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 1cd1ad622d..39888f9d52 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -88,6 +88,7 @@ typedef struct Pnv9Chip { PnvXive xive; Pnv9Psi psi; PnvLpcController lpc; + PnvOCC occ; } Pnv9Chip; =20 typedef struct PnvChipClass { diff --git a/include/hw/ppc/pnv_occ.h b/include/hw/ppc/pnv_occ.h index dab5a05f8e..d22b65a71a 100644 --- a/include/hw/ppc/pnv_occ.h +++ b/include/hw/ppc/pnv_occ.h @@ -25,6 +25,8 @@ #define PNV_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV_OCC) #define TYPE_PNV8_OCC TYPE_PNV_OCC "-POWER8" #define PNV8_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV8_OCC) +#define TYPE_PNV9_OCC TYPE_PNV_OCC "-POWER9" +#define PNV9_OCC(obj) OBJECT_CHECK(PnvOCC, (obj), TYPE_PNV9_OCC) =20 typedef struct PnvOCC { DeviceState xd; diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h index 403a365ed2..3292459fbb 100644 --- a/include/hw/ppc/pnv_xscom.h +++ b/include/hw/ppc/pnv_xscom.h @@ -73,6 +73,9 @@ typedef struct PnvXScomInterfaceClass { #define PNV_XSCOM_OCC_BASE 0x0066000 #define PNV_XSCOM_OCC_SIZE 0x6000 =20 +#define PNV9_XSCOM_OCC_BASE PNV_XSCOM_OCC_BASE +#define PNV9_XSCOM_OCC_SIZE 0x8000 + #define PNV9_XSCOM_PSIHB_BASE 0x5012900 #define PNV9_XSCOM_PSIHB_SIZE 0x100 =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552383522415551.153251257558; Tue, 12 Mar 2019 02:38:42 -0700 (PDT) Received: from localhost ([127.0.0.1]:48240 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3drq-00062f-6x for importer@patchew.org; Tue, 12 Mar 2019 05:38:38 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48656) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDe-00037n-8U for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDd-0002jy-0V for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:06 -0400 Received: from ozlabs.org ([203.11.71.1]:57501) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDc-0002Ob-CL; Tue, 12 Mar 2019 04:57:04 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMh3jYqz9sPl; Tue, 12 Mar 2019 19:55:42 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380944; bh=fbKunjuyvylw+im8ggBeAk3tUYzw0mjLNYlv48Le31I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Lziqf5VYS64fmaDAtT8hIfaNhnQ8LY53YC+IKnXsq5L2/1IIik65KW0tuB+W4m6Gh 6A3pZ/ZeEJCrJodxMPjMCwKL/9Ht5bGvbUBZnrLMk8xerDeWU+za0c81BN4r5xShqK GkSlX6vjhTT24l33drQL/kwetQ+b+lr/ufkANuyQ= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:52 +1100 Message-Id: <20190312085502.8203-53-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 52/62] ppc/pnv: extend XSCOM core support 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater Provide a new class attribute to define XSCOM operations per CPU family and add a couple of XSCOM addresses controlling the power management states of the core on POWER9. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-11-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv_core.c | 100 +++++++++++++++++++++++++++++++++----- include/hw/ppc/pnv_core.h | 2 + 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c index 38179cdc53..171474e080 100644 --- a/hw/ppc/pnv_core.c +++ b/hw/ppc/pnv_core.c @@ -60,8 +60,8 @@ static void pnv_cpu_reset(void *opaque) #define PNV_XSCOM_EX_DTS_RESULT0 0x50000 #define PNV_XSCOM_EX_DTS_RESULT1 0x50001 =20 -static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr, - unsigned int width) +static uint64_t pnv_core_power8_xscom_read(void *opaque, hwaddr addr, + unsigned int width) { uint32_t offset =3D addr >> 3; uint64_t val =3D 0; @@ -82,16 +82,74 @@ static uint64_t pnv_core_xscom_read(void *opaque, hwadd= r addr, return val; } =20 -static void pnv_core_xscom_write(void *opaque, hwaddr addr, uint64_t val, - unsigned int width) +static void pnv_core_power8_xscom_write(void *opaque, hwaddr addr, uint64_= t val, + unsigned int width) { qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=3D0x%" HWADDR_PRIx "= \n", addr); } =20 -static const MemoryRegionOps pnv_core_xscom_ops =3D { - .read =3D pnv_core_xscom_read, - .write =3D pnv_core_xscom_write, +static const MemoryRegionOps pnv_core_power8_xscom_ops =3D { + .read =3D pnv_core_power8_xscom_read, + .write =3D pnv_core_power8_xscom_write, + .valid.min_access_size =3D 8, + .valid.max_access_size =3D 8, + .impl.min_access_size =3D 8, + .impl.max_access_size =3D 8, + .endianness =3D DEVICE_BIG_ENDIAN, +}; + + +/* + * POWER9 core controls + */ +#define PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_HYP 0xf010d +#define PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_OTR 0xf010a + +static uint64_t pnv_core_power9_xscom_read(void *opaque, hwaddr addr, + unsigned int width) +{ + uint32_t offset =3D addr >> 3; + uint64_t val =3D 0; + + /* The result should be 38 C */ + switch (offset) { + case PNV_XSCOM_EX_DTS_RESULT0: + val =3D 0x26f024f023f0000ull; + break; + case PNV_XSCOM_EX_DTS_RESULT1: + val =3D 0x24f000000000000ull; + break; + case PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_HYP: + case PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_OTR: + val =3D 0x0; + break; + default: + qemu_log_mask(LOG_UNIMP, "Warning: reading reg=3D0x%" HWADDR_PRIx = "\n", + addr); + } + + return val; +} + +static void pnv_core_power9_xscom_write(void *opaque, hwaddr addr, uint64_= t val, + unsigned int width) +{ + uint32_t offset =3D addr >> 3; + + switch (offset) { + case PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_HYP: + case PNV9_XSCOM_EC_PPM_SPECIAL_WKUP_OTR: + break; + default: + qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=3D0x%" HWADDR_PR= Ix "\n", + addr); + } +} + +static const MemoryRegionOps pnv_core_power9_xscom_ops =3D { + .read =3D pnv_core_power9_xscom_read, + .write =3D pnv_core_power9_xscom_write, .valid.min_access_size =3D 8, .valid.max_access_size =3D 8, .impl.min_access_size =3D 8, @@ -138,6 +196,7 @@ static void pnv_realize_vcpu(PowerPCCPU *cpu, PnvChip *= chip, Error **errp) static void pnv_core_realize(DeviceState *dev, Error **errp) { PnvCore *pc =3D PNV_CORE(OBJECT(dev)); + PnvCoreClass *pcc =3D PNV_CORE_GET_CLASS(pc); CPUCore *cc =3D CPU_CORE(OBJECT(dev)); const char *typename =3D pnv_core_cpu_typename(pc); Error *local_err =3D NULL; @@ -180,7 +239,7 @@ static void pnv_core_realize(DeviceState *dev, Error **= errp) } =20 snprintf(name, sizeof(name), "xscom-core.%d", cc->core_id); - pnv_xscom_region_init(&pc->xscom_regs, OBJECT(dev), &pnv_core_xscom_op= s, + pnv_xscom_region_init(&pc->xscom_regs, OBJECT(dev), pcc->xscom_ops, pc, name, PNV_XSCOM_EX_SIZE); return; =20 @@ -222,6 +281,20 @@ static Property pnv_core_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static void pnv_core_power8_class_init(ObjectClass *oc, void *data) +{ + PnvCoreClass *pcc =3D PNV_CORE_CLASS(oc); + + pcc->xscom_ops =3D &pnv_core_power8_xscom_ops; +} + +static void pnv_core_power9_class_init(ObjectClass *oc, void *data) +{ + PnvCoreClass *pcc =3D PNV_CORE_CLASS(oc); + + pcc->xscom_ops =3D &pnv_core_power9_xscom_ops; +} + static void pnv_core_class_init(ObjectClass *oc, void *data) { DeviceClass *dc =3D DEVICE_CLASS(oc); @@ -231,10 +304,11 @@ static void pnv_core_class_init(ObjectClass *oc, void= *data) dc->props =3D pnv_core_properties; } =20 -#define DEFINE_PNV_CORE_TYPE(cpu_model) \ +#define DEFINE_PNV_CORE_TYPE(family, cpu_model) \ { \ .parent =3D TYPE_PNV_CORE, \ .name =3D PNV_CORE_TYPE_NAME(cpu_model), \ + .class_init =3D pnv_core_##family##_class_init, \ } =20 static const TypeInfo pnv_core_infos[] =3D { @@ -246,10 +320,10 @@ static const TypeInfo pnv_core_infos[] =3D { .class_init =3D pnv_core_class_init, .abstract =3D true, }, - DEFINE_PNV_CORE_TYPE("power8e_v2.1"), - DEFINE_PNV_CORE_TYPE("power8_v2.0"), - DEFINE_PNV_CORE_TYPE("power8nvl_v1.0"), - DEFINE_PNV_CORE_TYPE("power9_v2.0"), + DEFINE_PNV_CORE_TYPE(power8, "power8e_v2.1"), + DEFINE_PNV_CORE_TYPE(power8, "power8_v2.0"), + DEFINE_PNV_CORE_TYPE(power8, "power8nvl_v1.0"), + DEFINE_PNV_CORE_TYPE(power9, "power9_v2.0"), }; =20 DEFINE_TYPES(pnv_core_infos) diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h index 6874bb847a..cbe9ad36f3 100644 --- a/include/hw/ppc/pnv_core.h +++ b/include/hw/ppc/pnv_core.h @@ -42,6 +42,8 @@ typedef struct PnvCore { =20 typedef struct PnvCoreClass { DeviceClass parent_class; + + const MemoryRegionOps *xscom_ops; } PnvCoreClass; =20 #define PNV_CORE_TYPE_SUFFIX "-" TYPE_PNV_CORE --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552384407412446.7531118834494; Tue, 12 Mar 2019 02:53:27 -0700 (PDT) Received: from localhost ([127.0.0.1]:48516 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3e65-0001WY-8f for importer@patchew.org; Tue, 12 Mar 2019 05:53:21 -0400 Received: from eggs.gnu.org ([209.51.188.92]:48544) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dDR-0002uP-GG for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDQ-0002aJ-6L for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:56:53 -0400 Received: from ozlabs.org ([203.11.71.1]:38883) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDP-0002Fg-Ht; Tue, 12 Mar 2019 04:56:52 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMh0Sbtz9sPp; Tue, 12 Mar 2019 19:55:43 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380944; bh=gxkMyjOoATMDnJ01YD6/zbhHKYRYwfRS0mqOap/iFS4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HNhq6gEjB0LB6ZtKUD+7up+GB9AdMESBYRTwCPye4TYD2EPOSKYHRDwBIIORbj67K bcw1HKn66FHorsmeQ3JFYiCQZCz1+XBXAv/28u/M/1DQ2a5Uc3sCRRgOiY1sYGpvfy Otd5kP0qSMgDKZAZJl7wph9cSOYO4fQYOdBT/iTM= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:53 +1100 Message-Id: <20190312085502.8203-54-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 53/62] ppc/pnv: POWER9 XSCOM quad support 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The POWER9 processor does not support per-core frequency control. The cores are arranged in groups of four, along with their respective L2 and L3 caches, into a structure known as a Quad. The frequency must be managed at the Quad level. Provide a basic Quad model to fake the settings done by the firmware on the Non-Cacheable Unit (NCU). Each core pair (EX) needs a special BAR setting for the TIMA area of XIVE because it resides on the same address on all chips. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-12-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 38 ++++++++++++++++- hw/ppc/pnv_core.c | 87 ++++++++++++++++++++++++++++++++++++++ include/hw/ppc/pnv.h | 4 ++ include/hw/ppc/pnv_core.h | 10 +++++ include/hw/ppc/pnv_xscom.h | 12 ++++-- 5 files changed, 146 insertions(+), 5 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 1559a73323..e68d419203 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -963,6 +963,36 @@ static void pnv_chip_power9_instance_init(Object *obj) OBJECT(&chip9->psi), &error_abort); } =20 +static void pnv_chip_quad_realize(Pnv9Chip *chip9, Error **errp) +{ + PnvChip *chip =3D PNV_CHIP(chip9); + const char *typename =3D pnv_chip_core_typename(chip); + size_t typesize =3D object_type_get_instance_size(typename); + int i; + + chip9->nr_quads =3D DIV_ROUND_UP(chip->nr_cores, 4); + chip9->quads =3D g_new0(PnvQuad, chip9->nr_quads); + + for (i =3D 0; i < chip9->nr_quads; i++) { + char eq_name[32]; + PnvQuad *eq =3D &chip9->quads[i]; + PnvCore *pnv_core =3D PNV_CORE(chip->cores + (i * 4) * typesize); + int core_id =3D CPU_CORE(pnv_core)->core_id; + + object_initialize(eq, sizeof(*eq), TYPE_PNV_QUAD); + snprintf(eq_name, sizeof(eq_name), "eq[%d]", core_id); + + object_property_add_child(OBJECT(chip), eq_name, OBJECT(eq), + &error_fatal); + object_property_set_int(OBJECT(eq), core_id, "id", &error_fatal); + object_property_set_bool(OBJECT(eq), true, "realized", &error_fata= l); + object_unref(OBJECT(eq)); + + pnv_xscom_add_subregion(chip, PNV9_XSCOM_EQ_BASE(eq->id), + &eq->xscom_regs); + } +} + static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) { PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(dev); @@ -977,6 +1007,12 @@ static void pnv_chip_power9_realize(DeviceState *dev,= Error **errp) return; } =20 + pnv_chip_quad_realize(chip9, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + /* XIVE interrupt controller (POWER9) */ object_property_set_int(OBJECT(&chip9->xive), PNV9_XIVE_IC_BASE(chip), "ic-bar", &error_fatal); @@ -1135,7 +1171,7 @@ static void pnv_chip_core_realize(PnvChip *chip, Erro= r **errp) if (!pnv_chip_is_power9(chip)) { xscom_core_base =3D PNV_XSCOM_EX_BASE(core_hwid); } else { - xscom_core_base =3D PNV_XSCOM_P9_EC_BASE(core_hwid); + xscom_core_base =3D PNV9_XSCOM_EC_BASE(core_hwid); } =20 pnv_xscom_add_subregion(chip, xscom_core_base, diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c index 171474e080..5feeed6bc4 100644 --- a/hw/ppc/pnv_core.c +++ b/hw/ppc/pnv_core.c @@ -327,3 +327,90 @@ static const TypeInfo pnv_core_infos[] =3D { }; =20 DEFINE_TYPES(pnv_core_infos) + +/* + * POWER9 Quads + */ + +#define P9X_EX_NCU_SPEC_BAR 0x11010 + +static uint64_t pnv_quad_xscom_read(void *opaque, hwaddr addr, + unsigned int width) +{ + uint32_t offset =3D addr >> 3; + uint64_t val =3D -1; + + switch (offset) { + case P9X_EX_NCU_SPEC_BAR: + case P9X_EX_NCU_SPEC_BAR + 0x400: /* Second EX */ + val =3D 0; + break; + default: + qemu_log_mask(LOG_UNIMP, "%s: writing @0x%08x\n", __func__, + offset); + } + + return val; +} + +static void pnv_quad_xscom_write(void *opaque, hwaddr addr, uint64_t val, + unsigned int width) +{ + uint32_t offset =3D addr >> 3; + + switch (offset) { + case P9X_EX_NCU_SPEC_BAR: + case P9X_EX_NCU_SPEC_BAR + 0x400: /* Second EX */ + break; + default: + qemu_log_mask(LOG_UNIMP, "%s: writing @0x%08x\n", __func__, + offset); + } +} + +static const MemoryRegionOps pnv_quad_xscom_ops =3D { + .read =3D pnv_quad_xscom_read, + .write =3D pnv_quad_xscom_write, + .valid.min_access_size =3D 8, + .valid.max_access_size =3D 8, + .impl.min_access_size =3D 8, + .impl.max_access_size =3D 8, + .endianness =3D DEVICE_BIG_ENDIAN, +}; + +static void pnv_quad_realize(DeviceState *dev, Error **errp) +{ + PnvQuad *eq =3D PNV_QUAD(dev); + char name[32]; + + snprintf(name, sizeof(name), "xscom-quad.%d", eq->id); + pnv_xscom_region_init(&eq->xscom_regs, OBJECT(dev), &pnv_quad_xscom_op= s, + eq, name, PNV9_XSCOM_EQ_SIZE); +} + +static Property pnv_quad_properties[] =3D { + DEFINE_PROP_UINT32("id", PnvQuad, id, 0), + DEFINE_PROP_END_OF_LIST(), +}; + +static void pnv_quad_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + + dc->realize =3D pnv_quad_realize; + dc->props =3D pnv_quad_properties; +} + +static const TypeInfo pnv_quad_info =3D { + .name =3D TYPE_PNV_QUAD, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(PnvQuad), + .class_init =3D pnv_quad_class_init, +}; + +static void pnv_core_register_types(void) +{ + type_register_static(&pnv_quad_info); +} + +type_init(pnv_core_register_types) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 39888f9d52..e5b00d373e 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -26,6 +26,7 @@ #include "hw/ppc/pnv_psi.h" #include "hw/ppc/pnv_occ.h" #include "hw/ppc/pnv_xive.h" +#include "hw/ppc/pnv_core.h" =20 #define TYPE_PNV_CHIP "pnv-chip" #define PNV_CHIP(obj) OBJECT_CHECK(PnvChip, (obj), TYPE_PNV_CHIP) @@ -89,6 +90,9 @@ typedef struct Pnv9Chip { Pnv9Psi psi; PnvLpcController lpc; PnvOCC occ; + + uint32_t nr_quads; + PnvQuad *quads; } Pnv9Chip; =20 typedef struct PnvChipClass { diff --git a/include/hw/ppc/pnv_core.h b/include/hw/ppc/pnv_core.h index cbe9ad36f3..50cdb2b358 100644 --- a/include/hw/ppc/pnv_core.h +++ b/include/hw/ppc/pnv_core.h @@ -58,4 +58,14 @@ static inline PnvCPUState *pnv_cpu_state(PowerPCCPU *cpu) return (PnvCPUState *)cpu->machine_data; } =20 +#define TYPE_PNV_QUAD "powernv-cpu-quad" +#define PNV_QUAD(obj) \ + OBJECT_CHECK(PnvQuad, (obj), TYPE_PNV_QUAD) + +typedef struct PnvQuad { + DeviceState parent_obj; + + uint32_t id; + MemoryRegion xscom_regs; +} PnvQuad; #endif /* _PPC_PNV_CORE_H */ diff --git a/include/hw/ppc/pnv_xscom.h b/include/hw/ppc/pnv_xscom.h index 3292459fbb..68dfae0dfe 100644 --- a/include/hw/ppc/pnv_xscom.h +++ b/include/hw/ppc/pnv_xscom.h @@ -60,10 +60,6 @@ typedef struct PnvXScomInterfaceClass { (PNV_XSCOM_EX_CORE_BASE | ((uint64_t)(core) << 24)) #define PNV_XSCOM_EX_SIZE 0x100000 =20 -#define PNV_XSCOM_P9_EC_BASE(core) \ - ((uint64_t)(((core) & 0x1F) + 0x20) << 24) -#define PNV_XSCOM_P9_EC_SIZE 0x100000 - #define PNV_XSCOM_LPC_BASE 0xb0020 #define PNV_XSCOM_LPC_SIZE 0x4 =20 @@ -73,6 +69,14 @@ typedef struct PnvXScomInterfaceClass { #define PNV_XSCOM_OCC_BASE 0x0066000 #define PNV_XSCOM_OCC_SIZE 0x6000 =20 +#define PNV9_XSCOM_EC_BASE(core) \ + ((uint64_t)(((core) & 0x1F) + 0x20) << 24) +#define PNV9_XSCOM_EC_SIZE 0x100000 + +#define PNV9_XSCOM_EQ_BASE(core) \ + ((uint64_t)(((core) & 0x1C) + 0x40) << 22) +#define PNV9_XSCOM_EQ_SIZE 0x100000 + #define PNV9_XSCOM_OCC_BASE PNV_XSCOM_OCC_BASE #define PNV9_XSCOM_OCC_SIZE 0x8000 =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552385589522452.9256423776343; Tue, 12 Mar 2019 03:13:09 -0700 (PDT) Received: from localhost ([127.0.0.1]:48861 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eP7-0002AX-J2 for importer@patchew.org; Tue, 12 Mar 2019 06:13:01 -0400 Received: from eggs.gnu.org ([209.51.188.92]:54078) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUT-0000v5-5W for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDm-0002tv-Lk for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:15 -0400 Received: from ozlabs.org ([203.11.71.1]:51811) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDm-0002ap-9n; Tue, 12 Mar 2019 04:57:14 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMm6dVZz9sNM; Tue, 12 Mar 2019 19:55:43 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380948; bh=8OIouNU27F1fdmcyA+H6Q/P5Ak/HZFMGPHQF/W0TrkU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=XBeuNuIyk1UAzmfxiPgsxGo+izF8Ci4LUOjWyifzOtJOJVWEZwMLu5vkyQ/q0PPSM W3whNEMY1TtKnyXX1PxXM/jIJankwhzeN/HclIllM/v0FefZpuPSmrSMQd7ZuhZA30 yoJ0CEgCvcglaAdtk3P3dFMvYgi454BYndHJy23M= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:54 +1100 Message-Id: <20190312085502.8203-55-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 54/62] ppc/pnv: activate XSCOM tests 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater We now have enough support to let the XSCOM test run on POWER9. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-13-clg@kaod.org> Signed-off-by: David Gibson --- tests/pnv-xscom-test.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/pnv-xscom-test.c b/tests/pnv-xscom-test.c index 974f8da5b2..63d464048d 100644 --- a/tests/pnv-xscom-test.c +++ b/tests/pnv-xscom-test.c @@ -39,7 +39,6 @@ static const PnvChip pnv_chips[] =3D { .cfam_id =3D 0x120d304980000000ull, .first_core =3D 0x1, }, -#if 0 /* POWER9 support is not ready yet */ { .chip_type =3D PNV_CHIP_POWER9, .cpu_model =3D "POWER9", @@ -47,7 +46,6 @@ static const PnvChip pnv_chips[] =3D { .cfam_id =3D 0x220d104900008000ull, .first_core =3D 0x0, }, -#endif }; =20 static uint64_t pnv_xscom_addr(const PnvChip *chip, uint32_t pcba) --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552385244551290.00597219131885; Tue, 12 Mar 2019 03:07:24 -0700 (PDT) Received: from localhost ([127.0.0.1]:48763 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eJa-0005Mr-D8 for importer@patchew.org; Tue, 12 Mar 2019 06:07:18 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52669) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUP-00083H-Jh for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dE5-00033f-3Y for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:33 -0400 Received: from ozlabs.org ([203.11.71.1]:34113) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dE4-0002qR-Nh; Tue, 12 Mar 2019 04:57:33 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMn5h6nz9sQp; Tue, 12 Mar 2019 19:55:43 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380949; bh=lRMT6hQ2HOWkp7ypJlhBXQ0cJiAM81tHnWOEsY6IChg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UHjcJmvVyQls4RgR+yAL8T4NVOWJsQ/REaytqxCjGjrIatpteYgykLbClwhdOjlbr FSHLAFuC5hsIrpP/A5vK7YOLSfNpdoEcl8c5Y+mgoSCqH/vcwH+1UnGpjGohnosFqi KK5lP/Gd9mWelgUIamU3ceXkHQ8CorQJMmpO+zxY= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:55 +1100 Message-Id: <20190312085502.8203-56-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 55/62] ppc/pnv: add more dummy XSCOM addresses 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater To improve OPAL/skiboot support. We don't need to strictly model these XSCOM accesses. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-14-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv_xscom.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c index 46fae41f32..c285ef514e 100644 --- a/hw/ppc/pnv_xscom.c +++ b/hw/ppc/pnv_xscom.c @@ -64,11 +64,21 @@ static uint64_t xscom_read_default(PnvChip *chip, uint3= 2_t pcba) switch (pcba) { case 0xf000f: return PNV_CHIP_GET_CLASS(chip)->chip_cfam_id; + case 0x18002: /* ECID2 */ + return 0; + case 0x1010c00: /* PIBAM FIR */ case 0x1010c03: /* PIBAM FIR MASK */ - case 0x2020007: /* ADU stuff */ - case 0x2020009: /* ADU stuff */ - case 0x202000f: /* ADU stuff */ + + /* P9 xscom reset */ + case 0x0090018: /* Receive status reg */ + case 0x0090012: /* log register */ + case 0x0090013: /* error register */ + + /* P8 xscom reset */ + case 0x2020007: /* ADU stuff, log register */ + case 0x2020009: /* ADU stuff, error register */ + case 0x202000f: /* ADU stuff, receive status register*/ return 0; case 0x2013f00: /* PBA stuff */ case 0x2013f01: /* PBA stuff */ @@ -100,9 +110,20 @@ static bool xscom_write_default(PnvChip *chip, uint32_= t pcba, uint64_t val) case 0x1010c03: /* PIBAM FIR MASK */ case 0x1010c04: /* PIBAM FIR MASK */ case 0x1010c05: /* PIBAM FIR MASK */ - case 0x2020007: /* ADU stuff */ - case 0x2020009: /* ADU stuff */ - case 0x202000f: /* ADU stuff */ + /* P9 xscom reset */ + case 0x0090018: /* Receive status reg */ + case 0x0090012: /* log register */ + case 0x0090013: /* error register */ + + /* P8 xscom reset */ + case 0x2020007: /* ADU stuff, log register */ + case 0x2020009: /* ADU stuff, error register */ + case 0x202000f: /* ADU stuff, receive status register*/ + + case 0x2013028: /* CAPP stuff */ + case 0x201302a: /* CAPP stuff */ + case 0x2013801: /* CAPP stuff */ + case 0x2013802: /* CAPP stuff */ return true; default: return false; --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552385444685940.987302362626; Tue, 12 Mar 2019 03:10:44 -0700 (PDT) Received: from localhost ([127.0.0.1]:48823 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eMq-0008VE-L9 for importer@patchew.org; Tue, 12 Mar 2019 06:10:40 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUU-0008KY-HQ for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDl-0002t1-J0 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:14 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:40471) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDl-0002ZS-4b; Tue, 12 Mar 2019 04:57:13 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMm4jHzz9sDn; Tue, 12 Mar 2019 19:55:43 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380948; bh=zPzj+jPPRwulU2rrva9MgyW/EuMJD7LDPo6QjMWJOd0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DRl3urPhRIYvH+1m39kLEuWbq5dfDlKq/LScRkb/yFnGd8wfFzaum/eE66m5jONje 4rgP45vEzymotsXlCyN7H5Bxj5Zlq3F79vGqgWKAWjmzZ4cgjGpUgpJXkKpoSslsxe MXId4CFtscY8ymzt4/6UGZF7+6U7I3g09L7fGAw0= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:56 +1100 Message-Id: <20190312085502.8203-57-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 56/62] ppc/pnv: add a "ibm, opal/power-mgt" device tree node on 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater Activate only stop0 and stop1 levels. We should not need more levels when under QEMU. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-15-clg@kaod.org> Signed-off-by: David Gibson --- hw/ppc/pnv.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index e68d419203..8be4d4cbf7 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -438,6 +438,16 @@ static void pnv_dt_isa(PnvMachineState *pnv, void *fdt) &args); } =20 +static void pnv_dt_power_mgt(void *fdt) +{ + int off; + + off =3D fdt_add_subnode(fdt, 0, "ibm,opal"); + off =3D fdt_add_subnode(fdt, off, "power-mgt"); + + _FDT(fdt_setprop_cell(fdt, off, "ibm,enabled-stop-levels", 0xc0000000)= ); +} + static void *pnv_dt_create(MachineState *machine) { const char plat_compat[] =3D "qemu,powernv\0ibm,powernv"; @@ -493,6 +503,11 @@ static void *pnv_dt_create(MachineState *machine) pnv_dt_bmc_sensors(pnv->bmc, fdt); } =20 + /* Create an extra node for power management on Power9 */ + if (pnv_is_power9(pnv)) { + pnv_dt_power_mgt(fdt); + } + return fdt; } =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552386865096639.3594031521887; Tue, 12 Mar 2019 03:34:25 -0700 (PDT) Received: from localhost ([127.0.0.1]:49227 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3ejl-0001J0-0M for importer@patchew.org; Tue, 12 Mar 2019 06:34:21 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53909) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUR-0000hy-KE for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDr-0002xH-LI for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:20 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:53119) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDr-0002eA-7D; Tue, 12 Mar 2019 04:57:19 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMn1n0sz9sPv; Tue, 12 Mar 2019 19:55:43 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380949; bh=5o9zy3BYUnvXLiMNlPbd34O8l37vnV322DUqfyt2BHo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BKKG+RoBNY0l7I4LPmVTN04VlrhkgibesoiPs2qLz8158NV97okBZIw9sODcBw0Jx fu3d3B+/1/onCSIOpOEfS6yQoLSy71XNL/RX//0S6PwoYwk+imVi8vE5yd8QZtknS4 yg88P8lV8juDzhorwboUwShHM7SlK/P9s83GS7kE= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:57 +1100 Message-Id: <20190312085502.8203-58-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 57/62] target/ppc: add HV support 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater We now have enough support to boot a PowerNV machine with a POWER9 processor. Allow HV mode on POWER9. Signed-off-by: C=C3=A9dric Le Goater Message-Id: <20190307223548.20516-16-clg@kaod.org> Signed-off-by: David Gibson --- target/ppc/translate_init.inc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.in= c.c index af70a3b78c..0bd555eb19 100644 --- a/target/ppc/translate_init.inc.c +++ b/target/ppc/translate_init.inc.c @@ -8895,7 +8895,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBSYNC | - PPC_64B | PPC_64BX | PPC_ALTIVEC | + PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC | PPC_SEGMENT_64B | PPC_SLBI | PPC_POPCNTB | PPC_POPCNTWD | PPC_CILDST; @@ -8907,6 +8907,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data) PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL; pcc->msr_mask =3D (1ull << MSR_SF) | + (1ull << MSR_SHV) | (1ull << MSR_TM) | (1ull << MSR_VR) | (1ull << MSR_VSX) | --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552385045405191.05923407618263; Tue, 12 Mar 2019 03:04:05 -0700 (PDT) Received: from localhost ([127.0.0.1]:48699 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eGS-0001xi-9p for importer@patchew.org; Tue, 12 Mar 2019 06:04:04 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53909) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUO-0000hy-92 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dE5-000344-Uq for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:34 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:33597) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dE5-0002qg-GF; Tue, 12 Mar 2019 04:57:33 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMn6rMBz9sQq; Tue, 12 Mar 2019 19:55:44 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380949; bh=8Sh8FPVmqkdMKzDHQfohWcHfIgLrvvG9WVXgZSnJYO8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pzjluUx8sYy/o+VyOrp+l3pAWxktWA19zOJu5P7PE+6QXWnboftog48kXRNRznHfZ wIKYnKRvaScQIzsjff8U3l2QlTT2A5Ma1t7sgqgTNMR8wIK0tY+UX88uOUH3c8FBTX NiENB2VnCeol6OHvj45O6eReNQEaWzB+0pq8Wwhc= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:58 +1100 Message-Id: <20190312085502.8203-59-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 58/62] target/ppc: Optimize xviexpdp() using deposit_i64() 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, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Philippe Mathieu-Daud=C3=A9 The t0 tcg_temp register is now unused, remove it. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20190309214255.9952-2-f4bug@amsat.org> Signed-off-by: David Gibson --- target/ppc/translate/vsx-impl.inc.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx= -impl.inc.c index 95a269fff0..30d8aabd92 100644 --- a/target/ppc/translate/vsx-impl.inc.c +++ b/target/ppc/translate/vsx-impl.inc.c @@ -1695,7 +1695,6 @@ static void gen_xviexpdp(DisasContext *ctx) TCGv_i64 xal; TCGv_i64 xbh; TCGv_i64 xbl; - TCGv_i64 t0; =20 if (unlikely(!ctx->vsx_enabled)) { gen_exception(ctx, POWERPC_EXCP_VSXU); @@ -1711,20 +1710,13 @@ static void gen_xviexpdp(DisasContext *ctx) get_cpu_vsrl(xal, xA(ctx->opcode)); get_cpu_vsrh(xbh, xB(ctx->opcode)); get_cpu_vsrl(xbl, xB(ctx->opcode)); - t0 =3D tcg_temp_new_i64(); =20 - tcg_gen_andi_i64(xth, xah, 0x800FFFFFFFFFFFFF); - tcg_gen_andi_i64(t0, xbh, 0x7FF); - tcg_gen_shli_i64(t0, t0, 52); - tcg_gen_or_i64(xth, xth, t0); + tcg_gen_deposit_i64(xth, xah, xbh, 52, 11); set_cpu_vsrh(xT(ctx->opcode), xth); - tcg_gen_andi_i64(xtl, xal, 0x800FFFFFFFFFFFFF); - tcg_gen_andi_i64(t0, xbl, 0x7FF); - tcg_gen_shli_i64(t0, t0, 52); - tcg_gen_or_i64(xtl, xtl, t0); + + tcg_gen_deposit_i64(xtl, xal, xbl, 52, 11); set_cpu_vsrl(xT(ctx->opcode), xtl); =20 - tcg_temp_free_i64(t0); tcg_temp_free_i64(xth); tcg_temp_free_i64(xtl); tcg_temp_free_i64(xah); --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552385271645397.8252083282715; Tue, 12 Mar 2019 03:07:51 -0700 (PDT) Received: from localhost ([127.0.0.1]:48767 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eK3-0005mL-C7 for importer@patchew.org; Tue, 12 Mar 2019 06:07:47 -0400 Received: from eggs.gnu.org ([209.51.188.92]:52981) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUN-0008KY-Q2 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dE7-00035m-V3 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:36 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:38125) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dE7-0002t8-GB; Tue, 12 Mar 2019 04:57:35 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMp13ghz9sQr; Tue, 12 Mar 2019 19:55:44 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380950; bh=XevmpADMNbbAmvAOBsr/zi+lQ2GIlv8khc71wa72H4w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FGIDaeYqo5Um/7cj9PgA++/u6JzGdUEsBLYyEXF68VfuX1Lx9PJHkQfTzDM9+ayHc U2h9yVpqy943Lsv3N4/doBLEpnAW8bI0+SdYY+zY/BYXfGTsH5Orl+IsAP7RH0A6PI 6+26asQKfmMCzIwCZ4oYuUWiurdr9M8N2g2fVig0= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:54:59 +1100 Message-Id: <20190312085502.8203-60-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 59/62] target/ppc: Optimize x[sv]xsigdp using deposit_i64() 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, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Philippe Mathieu-Daud=C3=A9 Message-Id: <20190309214255.9952-3-f4bug@amsat.org> Signed-off-by: David Gibson --- target/ppc/translate/vsx-impl.inc.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/target/ppc/translate/vsx-impl.inc.c b/target/ppc/translate/vsx= -impl.inc.c index 30d8aabd92..508e9199c8 100644 --- a/target/ppc/translate/vsx-impl.inc.c +++ b/target/ppc/translate/vsx-impl.inc.c @@ -1587,8 +1587,7 @@ static void gen_xsxsigdp(DisasContext *ctx) tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, zr, zr, t0); tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0); get_cpu_vsrh(t1, xB(ctx->opcode)); - tcg_gen_andi_i64(rt, t1, 0x000FFFFFFFFFFFFF); - tcg_gen_or_i64(rt, rt, t0); + tcg_gen_deposit_i64(rt, t0, t1, 0, 52); =20 tcg_temp_free_i64(t0); tcg_temp_free_i64(t1); @@ -1624,8 +1623,7 @@ static void gen_xsxsigqp(DisasContext *ctx) tcg_gen_movi_i64(t0, 0x0001000000000000); tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, zr, zr, t0); tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0); - tcg_gen_andi_i64(xth, xbh, 0x0000FFFFFFFFFFFF); - tcg_gen_or_i64(xth, xth, t0); + tcg_gen_deposit_i64(xth, t0, xbh, 0, 48); set_cpu_vsrh(rD(ctx->opcode) + 32, xth); tcg_gen_mov_i64(xtl, xbl); set_cpu_vsrl(rD(ctx->opcode) + 32, xtl); @@ -1814,16 +1812,14 @@ static void gen_xvxsigdp(DisasContext *ctx) tcg_gen_movi_i64(t0, 0x0010000000000000); tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, zr, zr, t0); tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0); - tcg_gen_andi_i64(xth, xbh, 0x000FFFFFFFFFFFFF); - tcg_gen_or_i64(xth, xth, t0); + tcg_gen_deposit_i64(xth, t0, xbh, 0, 52); set_cpu_vsrh(xT(ctx->opcode), xth); =20 tcg_gen_extract_i64(exp, xbl, 52, 11); tcg_gen_movi_i64(t0, 0x0010000000000000); tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, zr, zr, t0); tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0); - tcg_gen_andi_i64(xtl, xbl, 0x000FFFFFFFFFFFFF); - tcg_gen_or_i64(xtl, xtl, t0); + tcg_gen_deposit_i64(xth, t0, xbl, 0, 52); set_cpu_vsrl(xT(ctx->opcode), xtl); =20 tcg_temp_free_i64(t0); --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552386692830991.7791320184091; Tue, 12 Mar 2019 03:31:32 -0700 (PDT) Received: from localhost ([127.0.0.1]:49187 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3egz-0007kD-13 for importer@patchew.org; Tue, 12 Mar 2019 06:31:29 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53335) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUN-00005V-Ts for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:15:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDm-0002u1-OR for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:36 -0400 Received: from ozlabs.org ([203.11.71.1]:35589) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDk-0002ZJ-Lg; Tue, 12 Mar 2019 04:57:14 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMm0b2zz9sBr; Tue, 12 Mar 2019 19:55:44 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380948; bh=aT/bySLlwwzpgahV4OC79aZthRIPqTNS6pggZFwKrz0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gxp7W3P0BDv84cpF6m54R3QhHqghlVWMXyx408gArkQeP4FKZcBW2s1xCcvxfJT0E c39/M8g8ai0vg6C7aVx2bCe8x0Ot+CaJYIYWwQ3KL5MEM9j6dQ1vNAjmAfvvxC83g+ qmLQ4ZY1Eqta35Qp8cGAngRXm+AeDM2c7GQHSWds= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:55:00 +1100 Message-Id: <20190312085502.8203-61-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 60/62] spapr: Use CamelCase properly 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" The qemu coding standard is to use CamelCase for type and structure names, and the pseries code follows that... sort of. There are quite a lot of places where we bend the rules in order to preserve the capitalization of internal acronyms like "PHB", "TCE", "DIMM" and most commonly "sPAPR". That was a bad idea - it frequently leads to names ending up with hard to read clusters of capital letters, and means they don't catch the eye as type identifiers, which is kind of the point of the CamelCase convention in the first place. In short, keeping type identifiers look like CamelCase is more important than preserving standard capitalization of internal "words". So, this patch renames a heap of spapr internal type names to a more standard CamelCase. In addition to case changes, we also make some other identifier renames: VIOsPAPR* -> SpaprVio* The reverse word ordering was only ever used to mitigate the capital cluster, so revert to the natural ordering. VIOsPAPRVTYDevice -> SpaprVioVty VIOsPAPRVLANDevice -> SpaprVioVlan Brevity, since the "Device" didn't add useful information sPAPRDRConnector -> SpaprDrc sPAPRDRConnectorClass -> SpaprDrcClass Brevity, and makes it clearer this is the same thing as a "DRC" mentioned in many other places in the code This is 100% a mechanical search-and-replace patch. It will, however, conflict with essentially any and all outstanding patches touching the spapr code. Signed-off-by: David Gibson --- hw/char/spapr_vty.c | 58 +++--- hw/intc/spapr_xive.c | 86 ++++----- hw/intc/xics_kvm.c | 4 +- hw/intc/xics_spapr.c | 24 +-- hw/net/spapr_llan.c | 110 +++++------ hw/nvram/spapr_nvram.c | 42 ++--- hw/ppc/spapr.c | 324 ++++++++++++++++---------------- hw/ppc/spapr_caps.c | 110 +++++------ hw/ppc/spapr_cpu_core.c | 52 ++--- hw/ppc/spapr_drc.c | 134 ++++++------- hw/ppc/spapr_events.c | 92 ++++----- hw/ppc/spapr_hcall.c | 98 +++++----- hw/ppc/spapr_iommu.c | 78 ++++---- hw/ppc/spapr_irq.c | 104 +++++----- hw/ppc/spapr_ovec.c | 40 ++-- hw/ppc/spapr_pci.c | 212 ++++++++++----------- hw/ppc/spapr_pci_vfio.c | 14 +- hw/ppc/spapr_rng.c | 18 +- hw/ppc/spapr_rtas.c | 30 +-- hw/ppc/spapr_rtas_ddw.c | 32 ++-- hw/ppc/spapr_rtc.c | 16 +- hw/ppc/spapr_vio.c | 116 ++++++------ hw/scsi/spapr_vscsi.c | 14 +- include/hw/pci-host/spapr.h | 44 ++--- include/hw/ppc/spapr.h | 176 ++++++++--------- include/hw/ppc/spapr_cpu_core.h | 24 +-- include/hw/ppc/spapr_drc.h | 108 +++++------ include/hw/ppc/spapr_irq.h | 58 +++--- include/hw/ppc/spapr_ovec.h | 30 +-- include/hw/ppc/spapr_vio.h | 74 ++++---- include/hw/ppc/spapr_xive.h | 18 +- include/hw/ppc/xics_spapr.h | 6 +- target/ppc/kvm.c | 4 +- 33 files changed, 1175 insertions(+), 1175 deletions(-) diff --git a/hw/char/spapr_vty.c b/hw/char/spapr_vty.c index 6748334ded..617303dbaf 100644 --- a/hw/char/spapr_vty.c +++ b/hw/char/spapr_vty.c @@ -10,27 +10,27 @@ =20 #define VTERM_BUFSIZE 16 =20 -typedef struct VIOsPAPRVTYDevice { - VIOsPAPRDevice sdev; +typedef struct SpaprVioVty { + SpaprVioDevice sdev; CharBackend chardev; uint32_t in, out; uint8_t buf[VTERM_BUFSIZE]; -} VIOsPAPRVTYDevice; +} SpaprVioVty; =20 #define TYPE_VIO_SPAPR_VTY_DEVICE "spapr-vty" #define VIO_SPAPR_VTY_DEVICE(obj) \ - OBJECT_CHECK(VIOsPAPRVTYDevice, (obj), TYPE_VIO_SPAPR_VTY_DEVICE) + OBJECT_CHECK(SpaprVioVty, (obj), TYPE_VIO_SPAPR_VTY_DEVICE) =20 static int vty_can_receive(void *opaque) { - VIOsPAPRVTYDevice *dev =3D VIO_SPAPR_VTY_DEVICE(opaque); + SpaprVioVty *dev =3D VIO_SPAPR_VTY_DEVICE(opaque); =20 return VTERM_BUFSIZE - (dev->in - dev->out); } =20 static void vty_receive(void *opaque, const uint8_t *buf, int size) { - VIOsPAPRVTYDevice *dev =3D VIO_SPAPR_VTY_DEVICE(opaque); + SpaprVioVty *dev =3D VIO_SPAPR_VTY_DEVICE(opaque); int i; =20 if ((dev->in =3D=3D dev->out) && size) { @@ -51,9 +51,9 @@ static void vty_receive(void *opaque, const uint8_t *buf,= int size) } } =20 -static int vty_getchars(VIOsPAPRDevice *sdev, uint8_t *buf, int max) +static int vty_getchars(SpaprVioDevice *sdev, uint8_t *buf, int max) { - VIOsPAPRVTYDevice *dev =3D VIO_SPAPR_VTY_DEVICE(sdev); + SpaprVioVty *dev =3D VIO_SPAPR_VTY_DEVICE(sdev); int n =3D 0; =20 while ((n < max) && (dev->out !=3D dev->in)) { @@ -83,18 +83,18 @@ static int vty_getchars(VIOsPAPRDevice *sdev, uint8_t *= buf, int max) return n; } =20 -void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len) +void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len) { - VIOsPAPRVTYDevice *dev =3D VIO_SPAPR_VTY_DEVICE(sdev); + SpaprVioVty *dev =3D VIO_SPAPR_VTY_DEVICE(sdev); =20 /* XXX this blocks entire thread. Rewrite to use * qemu_chr_fe_write and background I/O callbacks */ qemu_chr_fe_write_all(&dev->chardev, buf, len); } =20 -static void spapr_vty_realize(VIOsPAPRDevice *sdev, Error **errp) +static void spapr_vty_realize(SpaprVioDevice *sdev, Error **errp) { - VIOsPAPRVTYDevice *dev =3D VIO_SPAPR_VTY_DEVICE(sdev); + SpaprVioVty *dev =3D VIO_SPAPR_VTY_DEVICE(sdev); =20 if (!qemu_chr_fe_backend_connected(&dev->chardev)) { error_setg(errp, "chardev property not set"); @@ -106,14 +106,14 @@ static void spapr_vty_realize(VIOsPAPRDevice *sdev, E= rror **errp) } =20 /* Forward declaration */ -static target_ulong h_put_term_char(PowerPCCPU *cpu, sPAPRMachineState *sp= apr, +static target_ulong h_put_term_char(PowerPCCPU *cpu, SpaprMachineState *sp= apr, target_ulong opcode, target_ulong *arg= s) { target_ulong reg =3D args[0]; target_ulong len =3D args[1]; target_ulong char0_7 =3D args[2]; target_ulong char8_15 =3D args[3]; - VIOsPAPRDevice *sdev; + SpaprVioDevice *sdev; uint8_t buf[16]; =20 sdev =3D vty_lookup(spapr, reg); @@ -133,14 +133,14 @@ static target_ulong h_put_term_char(PowerPCCPU *cpu, = sPAPRMachineState *spapr, return H_SUCCESS; } =20 -static target_ulong h_get_term_char(PowerPCCPU *cpu, sPAPRMachineState *sp= apr, +static target_ulong h_get_term_char(PowerPCCPU *cpu, SpaprMachineState *sp= apr, target_ulong opcode, target_ulong *arg= s) { target_ulong reg =3D args[0]; target_ulong *len =3D args + 0; target_ulong *char0_7 =3D args + 1; target_ulong *char8_15 =3D args + 2; - VIOsPAPRDevice *sdev; + SpaprVioDevice *sdev; uint8_t buf[16]; =20 sdev =3D vty_lookup(spapr, reg); @@ -159,7 +159,7 @@ static target_ulong h_get_term_char(PowerPCCPU *cpu, sP= APRMachineState *spapr, return H_SUCCESS; } =20 -void spapr_vty_create(VIOsPAPRBus *bus, Chardev *chardev) +void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev) { DeviceState *dev; =20 @@ -169,8 +169,8 @@ void spapr_vty_create(VIOsPAPRBus *bus, Chardev *charde= v) } =20 static Property spapr_vty_properties[] =3D { - DEFINE_SPAPR_PROPERTIES(VIOsPAPRVTYDevice, sdev), - DEFINE_PROP_CHR("chardev", VIOsPAPRVTYDevice, chardev), + DEFINE_SPAPR_PROPERTIES(SpaprVioVty, sdev), + DEFINE_PROP_CHR("chardev", SpaprVioVty, chardev), DEFINE_PROP_END_OF_LIST(), }; =20 @@ -179,11 +179,11 @@ static const VMStateDescription vmstate_spapr_vty =3D= { .version_id =3D 1, .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { - VMSTATE_SPAPR_VIO(sdev, VIOsPAPRVTYDevice), + VMSTATE_SPAPR_VIO(sdev, SpaprVioVty), =20 - VMSTATE_UINT32(in, VIOsPAPRVTYDevice), - VMSTATE_UINT32(out, VIOsPAPRVTYDevice), - VMSTATE_BUFFER(buf, VIOsPAPRVTYDevice), + VMSTATE_UINT32(in, SpaprVioVty), + VMSTATE_UINT32(out, SpaprVioVty), + VMSTATE_BUFFER(buf, SpaprVioVty), VMSTATE_END_OF_LIST() }, }; @@ -191,7 +191,7 @@ static const VMStateDescription vmstate_spapr_vty =3D { static void spapr_vty_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - VIOsPAPRDeviceClass *k =3D VIO_SPAPR_DEVICE_CLASS(klass); + SpaprVioDeviceClass *k =3D VIO_SPAPR_DEVICE_CLASS(klass); =20 k->realize =3D spapr_vty_realize; k->dt_name =3D "vty"; @@ -205,13 +205,13 @@ static void spapr_vty_class_init(ObjectClass *klass, = void *data) static const TypeInfo spapr_vty_info =3D { .name =3D TYPE_VIO_SPAPR_VTY_DEVICE, .parent =3D TYPE_VIO_SPAPR_DEVICE, - .instance_size =3D sizeof(VIOsPAPRVTYDevice), + .instance_size =3D sizeof(SpaprVioVty), .class_init =3D spapr_vty_class_init, }; =20 -VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus) +SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus) { - VIOsPAPRDevice *sdev, *selected; + SpaprVioDevice *sdev, *selected; BusChild *kid; =20 /* @@ -246,9 +246,9 @@ VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus) return selected; } =20 -VIOsPAPRDevice *vty_lookup(sPAPRMachineState *spapr, target_ulong reg) +SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg) { - VIOsPAPRDevice *sdev; + SpaprVioDevice *sdev; =20 sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); if (!sdev && reg =3D=3D 0) { diff --git a/hw/intc/spapr_xive.c b/hw/intc/spapr_xive.c index e0e5cb5d8e..097f88d460 100644 --- a/hw/intc/spapr_xive.c +++ b/hw/intc/spapr_xive.c @@ -117,7 +117,7 @@ static int spapr_xive_target_to_end(uint32_t target, ui= nt8_t prio, * On sPAPR machines, use a simplified output for the XIVE END * structure dumping only the information related to the OS EQ. */ -static void spapr_xive_end_pic_print_info(sPAPRXive *xive, XiveEND *end, +static void spapr_xive_end_pic_print_info(SpaprXive *xive, XiveEND *end, Monitor *mon) { uint32_t qindex =3D xive_get_field32(END_W1_PAGE_OFF, end->w1); @@ -135,7 +135,7 @@ static void spapr_xive_end_pic_print_info(sPAPRXive *xi= ve, XiveEND *end, monitor_printf(mon, "]"); } =20 -void spapr_xive_pic_print_info(sPAPRXive *xive, Monitor *mon) +void spapr_xive_pic_print_info(SpaprXive *xive, Monitor *mon) { XiveSource *xsrc =3D &xive->source; int i; @@ -173,14 +173,14 @@ void spapr_xive_pic_print_info(sPAPRXive *xive, Monit= or *mon) } } =20 -static void spapr_xive_map_mmio(sPAPRXive *xive) +static void spapr_xive_map_mmio(SpaprXive *xive) { sysbus_mmio_map(SYS_BUS_DEVICE(xive), 0, xive->vc_base); sysbus_mmio_map(SYS_BUS_DEVICE(xive), 1, xive->end_base); sysbus_mmio_map(SYS_BUS_DEVICE(xive), 2, xive->tm_base); } =20 -void spapr_xive_mmio_set_enabled(sPAPRXive *xive, bool enable) +void spapr_xive_mmio_set_enabled(SpaprXive *xive, bool enable) { memory_region_set_enabled(&xive->source.esb_mmio, enable); memory_region_set_enabled(&xive->tm_mmio, enable); @@ -216,7 +216,7 @@ static void spapr_xive_end_reset(XiveEND *end) =20 static void spapr_xive_reset(void *dev) { - sPAPRXive *xive =3D SPAPR_XIVE(dev); + SpaprXive *xive =3D SPAPR_XIVE(dev); int i; =20 /* @@ -242,7 +242,7 @@ static void spapr_xive_reset(void *dev) =20 static void spapr_xive_instance_init(Object *obj) { - sPAPRXive *xive =3D SPAPR_XIVE(obj); + SpaprXive *xive =3D SPAPR_XIVE(obj); =20 object_initialize_child(obj, "source", &xive->source, sizeof(xive->sou= rce), TYPE_XIVE_SOURCE, &error_abort, NULL); @@ -254,7 +254,7 @@ static void spapr_xive_instance_init(Object *obj) =20 static void spapr_xive_realize(DeviceState *dev, Error **errp) { - sPAPRXive *xive =3D SPAPR_XIVE(dev); + SpaprXive *xive =3D SPAPR_XIVE(dev); XiveSource *xsrc =3D &xive->source; XiveENDSource *end_xsrc =3D &xive->end_source; Error *local_err =3D NULL; @@ -325,7 +325,7 @@ static void spapr_xive_realize(DeviceState *dev, Error = **errp) static int spapr_xive_get_eas(XiveRouter *xrtr, uint8_t eas_blk, uint32_t eas_idx, XiveEAS *eas) { - sPAPRXive *xive =3D SPAPR_XIVE(xrtr); + SpaprXive *xive =3D SPAPR_XIVE(xrtr); =20 if (eas_idx >=3D xive->nr_irqs) { return -1; @@ -338,7 +338,7 @@ static int spapr_xive_get_eas(XiveRouter *xrtr, uint8_t= eas_blk, static int spapr_xive_get_end(XiveRouter *xrtr, uint8_t end_blk, uint32_t end_idx, XiveEND *= end) { - sPAPRXive *xive =3D SPAPR_XIVE(xrtr); + SpaprXive *xive =3D SPAPR_XIVE(xrtr); =20 if (end_idx >=3D xive->nr_ends) { return -1; @@ -352,7 +352,7 @@ static int spapr_xive_write_end(XiveRouter *xrtr, uint8= _t end_blk, uint32_t end_idx, XiveEND *end, uint8_t word_number) { - sPAPRXive *xive =3D SPAPR_XIVE(xrtr); + SpaprXive *xive =3D SPAPR_XIVE(xrtr); =20 if (end_idx >=3D xive->nr_ends) { return -1; @@ -432,20 +432,20 @@ static const VMStateDescription vmstate_spapr_xive = =3D { .version_id =3D 1, .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { - VMSTATE_UINT32_EQUAL(nr_irqs, sPAPRXive, NULL), - VMSTATE_STRUCT_VARRAY_POINTER_UINT32(eat, sPAPRXive, nr_irqs, + VMSTATE_UINT32_EQUAL(nr_irqs, SpaprXive, NULL), + VMSTATE_STRUCT_VARRAY_POINTER_UINT32(eat, SpaprXive, nr_irqs, vmstate_spapr_xive_eas, XiveEAS), - VMSTATE_STRUCT_VARRAY_POINTER_UINT32(endt, sPAPRXive, nr_ends, + VMSTATE_STRUCT_VARRAY_POINTER_UINT32(endt, SpaprXive, nr_ends, vmstate_spapr_xive_end, XiveE= ND), VMSTATE_END_OF_LIST() }, }; =20 static Property spapr_xive_properties[] =3D { - DEFINE_PROP_UINT32("nr-irqs", sPAPRXive, nr_irqs, 0), - DEFINE_PROP_UINT32("nr-ends", sPAPRXive, nr_ends, 0), - DEFINE_PROP_UINT64("vc-base", sPAPRXive, vc_base, SPAPR_XIVE_VC_BASE), - DEFINE_PROP_UINT64("tm-base", sPAPRXive, tm_base, SPAPR_XIVE_TM_BASE), + DEFINE_PROP_UINT32("nr-irqs", SpaprXive, nr_irqs, 0), + DEFINE_PROP_UINT32("nr-ends", SpaprXive, nr_ends, 0), + DEFINE_PROP_UINT64("vc-base", SpaprXive, vc_base, SPAPR_XIVE_VC_BASE), + DEFINE_PROP_UINT64("tm-base", SpaprXive, tm_base, SPAPR_XIVE_TM_BASE), DEFINE_PROP_END_OF_LIST(), }; =20 @@ -471,7 +471,7 @@ static const TypeInfo spapr_xive_info =3D { .name =3D TYPE_SPAPR_XIVE, .parent =3D TYPE_XIVE_ROUTER, .instance_init =3D spapr_xive_instance_init, - .instance_size =3D sizeof(sPAPRXive), + .instance_size =3D sizeof(SpaprXive), .class_init =3D spapr_xive_class_init, }; =20 @@ -482,7 +482,7 @@ static void spapr_xive_register_types(void) =20 type_init(spapr_xive_register_types) =20 -bool spapr_xive_irq_claim(sPAPRXive *xive, uint32_t lisn, bool lsi) +bool spapr_xive_irq_claim(SpaprXive *xive, uint32_t lisn, bool lsi) { XiveSource *xsrc =3D &xive->source; =20 @@ -497,7 +497,7 @@ bool spapr_xive_irq_claim(sPAPRXive *xive, uint32_t lis= n, bool lsi) return true; } =20 -bool spapr_xive_irq_free(sPAPRXive *xive, uint32_t lisn) +bool spapr_xive_irq_free(SpaprXive *xive, uint32_t lisn) { if (lisn >=3D xive->nr_irqs) { return false; @@ -576,11 +576,11 @@ static bool spapr_xive_priority_is_reserved(uint8_t p= riority) #define SPAPR_XIVE_SRC_STORE_EOI PPC_BIT(63) /* Store EOI support */ =20 static target_ulong h_int_get_source_info(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; XiveSource *xsrc =3D &xive->source; target_ulong flags =3D args[0]; target_ulong lisn =3D args[1]; @@ -686,11 +686,11 @@ static target_ulong h_int_get_source_info(PowerPCCPU = *cpu, #define SPAPR_XIVE_SRC_MASK PPC_BIT(63) =20 static target_ulong h_int_set_source_config(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; XiveEAS eas, new_eas; target_ulong flags =3D args[0]; target_ulong lisn =3D args[1]; @@ -783,11 +783,11 @@ out: * equivalent to the LISN if not changed by H_INT_SET_SOURCE_CONFIG) */ static target_ulong h_int_get_source_config(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; target_ulong flags =3D args[0]; target_ulong lisn =3D args[1]; XiveEAS eas; @@ -856,11 +856,11 @@ static target_ulong h_int_get_source_config(PowerPCCP= U *cpu, * - R5: Power of 2 page size of the notification page */ static target_ulong h_int_get_queue_info(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; XiveENDSource *end_xsrc =3D &xive->end_source; target_ulong flags =3D args[0]; target_ulong target =3D args[1]; @@ -942,11 +942,11 @@ static target_ulong h_int_get_queue_info(PowerPCCPU *= cpu, #define SPAPR_XIVE_END_ALWAYS_NOTIFY PPC_BIT(63) =20 static target_ulong h_int_set_queue_config(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; target_ulong flags =3D args[0]; target_ulong target =3D args[1]; target_ulong priority =3D args[2]; @@ -1095,11 +1095,11 @@ out: #define SPAPR_XIVE_END_DEBUG PPC_BIT(63) =20 static target_ulong h_int_get_queue_config(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; target_ulong flags =3D args[0]; target_ulong target =3D args[1]; target_ulong priority =3D args[2]; @@ -1187,7 +1187,7 @@ static target_ulong h_int_get_queue_config(PowerPCCPU= *cpu, * - None */ static target_ulong h_int_set_os_reporting_line(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { @@ -1223,7 +1223,7 @@ static target_ulong h_int_set_os_reporting_line(Power= PCCPU *cpu, * - R4: The logical real address of the reporting line if set, else -1 */ static target_ulong h_int_get_os_reporting_line(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { @@ -1266,11 +1266,11 @@ static target_ulong h_int_get_os_reporting_line(Pow= erPCCPU *cpu, #define SPAPR_XIVE_ESB_STORE PPC_BIT(63) =20 static target_ulong h_int_esb(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; XiveEAS eas; target_ulong flags =3D args[0]; target_ulong lisn =3D args[1]; @@ -1334,11 +1334,11 @@ static target_ulong h_int_esb(PowerPCCPU *cpu, * - None */ static target_ulong h_int_sync(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; XiveEAS eas; target_ulong flags =3D args[0]; target_ulong lisn =3D args[1]; @@ -1388,11 +1388,11 @@ static target_ulong h_int_sync(PowerPCCPU *cpu, * - None */ static target_ulong h_int_reset(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; target_ulong flags =3D args[0]; =20 if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) { @@ -1407,7 +1407,7 @@ static target_ulong h_int_reset(PowerPCCPU *cpu, return H_SUCCESS; } =20 -void spapr_xive_hcall_init(sPAPRMachineState *spapr) +void spapr_xive_hcall_init(SpaprMachineState *spapr) { spapr_register_hypercall(H_INT_GET_SOURCE_INFO, h_int_get_source_info); spapr_register_hypercall(H_INT_SET_SOURCE_CONFIG, h_int_set_source_con= fig); @@ -1424,10 +1424,10 @@ void spapr_xive_hcall_init(sPAPRMachineState *spapr) spapr_register_hypercall(H_INT_RESET, h_int_reset); } =20 -void spapr_dt_xive(sPAPRMachineState *spapr, uint32_t nr_servers, void *fd= t, +void spapr_dt_xive(SpaprMachineState *spapr, uint32_t nr_servers, void *fd= t, uint32_t phandle) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; int node; uint64_t timas[2 * 2]; /* Interrupt number ranges for the IPIs */ diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c index c6e1b630a4..78a252e6df 100644 --- a/hw/intc/xics_kvm.c +++ b/hw/intc/xics_kvm.c @@ -291,7 +291,7 @@ void ics_kvm_set_irq(ICSState *ics, int srcno, int val) } } =20 -static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_dummy(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -300,7 +300,7 @@ static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineSta= te *spapr, __func__); } =20 -int xics_kvm_init(sPAPRMachineState *spapr, Error **errp) +int xics_kvm_init(SpaprMachineState *spapr, Error **errp) { int rc; =20 diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c index 53bda6661b..607e1c167b 100644 --- a/hw/intc/xics_spapr.c +++ b/hw/intc/xics_spapr.c @@ -41,7 +41,7 @@ * Guest interfaces */ =20 -static target_ulong h_cppr(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_cppr(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong cppr =3D args[0]; @@ -50,7 +50,7 @@ static target_ulong h_cppr(PowerPCCPU *cpu, sPAPRMachineS= tate *spapr, return H_SUCCESS; } =20 -static target_ulong h_ipi(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_ipi(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong mfrr =3D args[1]; @@ -64,7 +64,7 @@ static target_ulong h_ipi(PowerPCCPU *cpu, sPAPRMachineSt= ate *spapr, return H_SUCCESS; } =20 -static target_ulong h_xirr(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_xirr(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { uint32_t xirr =3D icp_accept(spapr_cpu_state(cpu)->icp); @@ -73,7 +73,7 @@ static target_ulong h_xirr(PowerPCCPU *cpu, sPAPRMachineS= tate *spapr, return H_SUCCESS; } =20 -static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_xirr_x(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { uint32_t xirr =3D icp_accept(spapr_cpu_state(cpu)->icp); @@ -83,7 +83,7 @@ static target_ulong h_xirr_x(PowerPCCPU *cpu, sPAPRMachin= eState *spapr, return H_SUCCESS; } =20 -static target_ulong h_eoi(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_eoi(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong xirr =3D args[0]; @@ -92,7 +92,7 @@ static target_ulong h_eoi(PowerPCCPU *cpu, sPAPRMachineSt= ate *spapr, return H_SUCCESS; } =20 -static target_ulong h_ipoll(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_ipoll(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { uint32_t mfrr; @@ -104,7 +104,7 @@ static target_ulong h_ipoll(PowerPCCPU *cpu, sPAPRMachi= neState *spapr, return H_SUCCESS; } =20 -static void rtas_set_xive(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_set_xive(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -137,7 +137,7 @@ static void rtas_set_xive(PowerPCCPU *cpu, sPAPRMachine= State *spapr, rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -static void rtas_get_xive(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_get_xive(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -167,7 +167,7 @@ static void rtas_get_xive(PowerPCCPU *cpu, sPAPRMachine= State *spapr, rtas_st(rets, 2, ics->irqs[srcno].priority); } =20 -static void rtas_int_off(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_int_off(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -198,7 +198,7 @@ static void rtas_int_off(PowerPCCPU *cpu, sPAPRMachineS= tate *spapr, rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -static void rtas_int_on(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_int_on(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -230,7 +230,7 @@ static void rtas_int_on(PowerPCCPU *cpu, sPAPRMachineSt= ate *spapr, rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -void xics_spapr_init(sPAPRMachineState *spapr) +void xics_spapr_init(SpaprMachineState *spapr) { /* Registration of global state belongs into realize */ spapr_rtas_register(RTAS_IBM_SET_XIVE, "ibm,set-xive", rtas_set_xive); @@ -246,7 +246,7 @@ void xics_spapr_init(sPAPRMachineState *spapr) spapr_register_hypercall(H_IPOLL, h_ipoll); } =20 -void spapr_dt_xics(sPAPRMachineState *spapr, uint32_t nr_servers, void *fd= t, +void spapr_dt_xics(SpaprMachineState *spapr, uint32_t nr_servers, void *fd= t, uint32_t phandle) { uint32_t interrupt_server_ranges_prop[] =3D { diff --git a/hw/net/spapr_llan.c b/hw/net/spapr_llan.c index d239e4bd7d..63ba3929e9 100644 --- a/hw/net/spapr_llan.c +++ b/hw/net/spapr_llan.c @@ -84,7 +84,7 @@ typedef uint64_t vlan_bd_t; =20 #define TYPE_VIO_SPAPR_VLAN_DEVICE "spapr-vlan" #define VIO_SPAPR_VLAN_DEVICE(obj) \ - OBJECT_CHECK(VIOsPAPRVLANDevice, (obj), TYPE_VIO_SPAPR_VLAN_DEVICE) + OBJECT_CHECK(SpaprVioVlan, (obj), TYPE_VIO_SPAPR_VLAN_DEVICE) =20 #define RX_POOL_MAX_BDS 4096 #define RX_MAX_POOLS 5 @@ -95,8 +95,8 @@ typedef struct { vlan_bd_t bds[RX_POOL_MAX_BDS]; } RxBufPool; =20 -typedef struct VIOsPAPRVLANDevice { - VIOsPAPRDevice sdev; +typedef struct SpaprVioVlan { + SpaprVioDevice sdev; NICConf nicconf; NICState *nic; MACAddr perm_mac; @@ -107,11 +107,11 @@ typedef struct VIOsPAPRVLANDevice { QEMUTimer *rxp_timer; uint32_t compat_flags; /* Compatibility flags for migratio= n */ RxBufPool *rx_pool[RX_MAX_POOLS]; /* Receive buffer descriptor pools = */ -} VIOsPAPRVLANDevice; +} SpaprVioVlan; =20 static int spapr_vlan_can_receive(NetClientState *nc) { - VIOsPAPRVLANDevice *dev =3D qemu_get_nic_opaque(nc); + SpaprVioVlan *dev =3D qemu_get_nic_opaque(nc); =20 return (dev->isopen && dev->rx_bufs > 0); } @@ -123,7 +123,7 @@ static int spapr_vlan_can_receive(NetClientState *nc) * suitable receive buffer available. This function is used to increase * this counter by one. */ -static void spapr_vlan_record_dropped_rx_frame(VIOsPAPRVLANDevice *dev) +static void spapr_vlan_record_dropped_rx_frame(SpaprVioVlan *dev) { uint64_t cnt; =20 @@ -134,7 +134,7 @@ static void spapr_vlan_record_dropped_rx_frame(VIOsPAPR= VLANDevice *dev) /** * Get buffer descriptor from one of our receive buffer pools */ -static vlan_bd_t spapr_vlan_get_rx_bd_from_pool(VIOsPAPRVLANDevice *dev, +static vlan_bd_t spapr_vlan_get_rx_bd_from_pool(SpaprVioVlan *dev, size_t size) { vlan_bd_t bd; @@ -168,7 +168,7 @@ static vlan_bd_t spapr_vlan_get_rx_bd_from_pool(VIOsPAP= RVLANDevice *dev, * Get buffer descriptor from the receive buffer list page that has been * supplied by the guest with the H_REGISTER_LOGICAL_LAN call */ -static vlan_bd_t spapr_vlan_get_rx_bd_from_page(VIOsPAPRVLANDevice *dev, +static vlan_bd_t spapr_vlan_get_rx_bd_from_page(SpaprVioVlan *dev, size_t size) { int buf_ptr =3D dev->use_buf_ptr; @@ -203,8 +203,8 @@ static vlan_bd_t spapr_vlan_get_rx_bd_from_page(VIOsPAP= RVLANDevice *dev, static ssize_t spapr_vlan_receive(NetClientState *nc, const uint8_t *buf, size_t size) { - VIOsPAPRVLANDevice *dev =3D qemu_get_nic_opaque(nc); - VIOsPAPRDevice *sdev =3D VIO_SPAPR_DEVICE(dev); + SpaprVioVlan *dev =3D qemu_get_nic_opaque(nc); + SpaprVioDevice *sdev =3D VIO_SPAPR_DEVICE(dev); vlan_bd_t rxq_bd =3D vio_ldq(sdev, dev->buf_list + VLAN_RXQ_BD_OFF); vlan_bd_t bd; uint64_t handle; @@ -280,7 +280,7 @@ static NetClientInfo net_spapr_vlan_info =3D { =20 static void spapr_vlan_flush_rx_queue(void *opaque) { - VIOsPAPRVLANDevice *dev =3D opaque; + SpaprVioVlan *dev =3D opaque; =20 qemu_flush_queued_packets(qemu_get_queue(dev->nic)); } @@ -296,9 +296,9 @@ static void spapr_vlan_reset_rx_pool(RxBufPool *rxp) memset(rxp->bds, 0, sizeof(rxp->bds)); } =20 -static void spapr_vlan_reset(VIOsPAPRDevice *sdev) +static void spapr_vlan_reset(SpaprVioDevice *sdev) { - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); int i; =20 dev->buf_list =3D 0; @@ -316,9 +316,9 @@ static void spapr_vlan_reset(VIOsPAPRDevice *sdev) qemu_format_nic_info_str(qemu_get_queue(dev->nic), dev->nicconf.macadd= r.a); } =20 -static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Error **errp) +static void spapr_vlan_realize(SpaprVioDevice *sdev, Error **errp) { - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); =20 qemu_macaddr_default_if_unset(&dev->nicconf.macaddr); =20 @@ -334,7 +334,7 @@ static void spapr_vlan_realize(VIOsPAPRDevice *sdev, Er= ror **errp) =20 static void spapr_vlan_instance_init(Object *obj) { - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(obj); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(obj); int i; =20 device_add_bootindex_property(obj, &dev->nicconf.bootindex, @@ -351,7 +351,7 @@ static void spapr_vlan_instance_init(Object *obj) =20 static void spapr_vlan_instance_finalize(Object *obj) { - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(obj); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(obj); int i; =20 if (dev->compat_flags & SPAPRVLAN_FLAG_RX_BUF_POOLS) { @@ -367,7 +367,7 @@ static void spapr_vlan_instance_finalize(Object *obj) } } =20 -void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd) +void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd) { DeviceState *dev; =20 @@ -378,9 +378,9 @@ void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd) qdev_init_nofail(dev); } =20 -static int spapr_vlan_devnode(VIOsPAPRDevice *dev, void *fdt, int node_off) +static int spapr_vlan_devnode(SpaprVioDevice *dev, void *fdt, int node_off) { - VIOsPAPRVLANDevice *vdev =3D VIO_SPAPR_VLAN_DEVICE(dev); + SpaprVioVlan *vdev =3D VIO_SPAPR_VLAN_DEVICE(dev); uint8_t padded_mac[8] =3D {0, 0}; int ret; =20 @@ -415,7 +415,7 @@ static int spapr_vlan_devnode(VIOsPAPRDevice *dev, void= *fdt, int node_off) return 0; } =20 -static int check_bd(VIOsPAPRVLANDevice *dev, vlan_bd_t bd, +static int check_bd(SpaprVioVlan *dev, vlan_bd_t bd, target_ulong alignment) { if ((VLAN_BD_ADDR(bd) % alignment) @@ -434,7 +434,7 @@ static int check_bd(VIOsPAPRVLANDevice *dev, vlan_bd_t = bd, } =20 static target_ulong h_register_logical_lan(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { @@ -442,8 +442,8 @@ static target_ulong h_register_logical_lan(PowerPCCPU *= cpu, target_ulong buf_list =3D args[1]; target_ulong rec_queue =3D args[2]; target_ulong filter_list =3D args[3]; - VIOsPAPRDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); + SpaprVioDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); vlan_bd_t filter_list_bd; =20 if (!dev) { @@ -500,12 +500,12 @@ static target_ulong h_register_logical_lan(PowerPCCPU= *cpu, =20 =20 static target_ulong h_free_logical_lan(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *= args) { target_ulong reg =3D args[0]; - VIOsPAPRDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); + SpaprVioDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); =20 if (!dev) { return H_PARAMETER; @@ -539,7 +539,7 @@ static int rx_pool_size_compare(const void *p1, const v= oid *p2) * Search for a matching buffer pool with exact matching size, * or return -1 if no matching pool has been found. */ -static int spapr_vlan_get_rx_pool_id(VIOsPAPRVLANDevice *dev, int size) +static int spapr_vlan_get_rx_pool_id(SpaprVioVlan *dev, int size) { int pool; =20 @@ -555,7 +555,7 @@ static int spapr_vlan_get_rx_pool_id(VIOsPAPRVLANDevice= *dev, int size) /** * Enqueuing receive buffer by adding it to one of our receive buffer pools */ -static target_long spapr_vlan_add_rxbuf_to_pool(VIOsPAPRVLANDevice *dev, +static target_long spapr_vlan_add_rxbuf_to_pool(SpaprVioVlan *dev, target_ulong buf) { int size =3D VLAN_BD_LEN(buf); @@ -602,7 +602,7 @@ static target_long spapr_vlan_add_rxbuf_to_pool(VIOsPAP= RVLANDevice *dev, * This is the old way of enqueuing receive buffers: Add it to the rx queue * page that has been supplied by the guest (which is quite limited in siz= e). */ -static target_long spapr_vlan_add_rxbuf_to_page(VIOsPAPRVLANDevice *dev, +static target_long spapr_vlan_add_rxbuf_to_page(SpaprVioVlan *dev, target_ulong buf) { vlan_bd_t bd; @@ -628,14 +628,14 @@ static target_long spapr_vlan_add_rxbuf_to_page(VIOsP= APRVLANDevice *dev, } =20 static target_ulong h_add_logical_lan_buffer(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong reg =3D args[0]; target_ulong buf =3D args[1]; - VIOsPAPRDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); + SpaprVioDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); target_long ret; =20 trace_spapr_vlan_h_add_logical_lan_buffer(reg, buf); @@ -678,14 +678,14 @@ static target_ulong h_add_logical_lan_buffer(PowerPCC= PU *cpu, } =20 static target_ulong h_send_logical_lan(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *= args) { target_ulong reg =3D args[0]; target_ulong *bufs =3D args + 1; target_ulong continue_token =3D args[7]; - VIOsPAPRDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); + SpaprVioDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); unsigned total_len; uint8_t *lbuf, *p; int i, nbufs; @@ -745,11 +745,11 @@ static target_ulong h_send_logical_lan(PowerPCCPU *cp= u, return H_SUCCESS; } =20 -static target_ulong h_multicast_ctrl(PowerPCCPU *cpu, sPAPRMachineState *s= papr, +static target_ulong h_multicast_ctrl(PowerPCCPU *cpu, SpaprMachineState *s= papr, target_ulong opcode, target_ulong *ar= gs) { target_ulong reg =3D args[0]; - VIOsPAPRDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); =20 if (!dev) { return H_PARAMETER; @@ -759,14 +759,14 @@ static target_ulong h_multicast_ctrl(PowerPCCPU *cpu,= sPAPRMachineState *spapr, } =20 static target_ulong h_change_logical_lan_mac(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong reg =3D args[0]; target_ulong macaddr =3D args[1]; - VIOsPAPRDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); - VIOsPAPRVLANDevice *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); + SpaprVioDevice *sdev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioVlan *dev =3D VIO_SPAPR_VLAN_DEVICE(sdev); int i; =20 for (i =3D 0; i < ETH_ALEN; i++) { @@ -780,16 +780,16 @@ static target_ulong h_change_logical_lan_mac(PowerPCC= PU *cpu, } =20 static Property spapr_vlan_properties[] =3D { - DEFINE_SPAPR_PROPERTIES(VIOsPAPRVLANDevice, sdev), - DEFINE_NIC_PROPERTIES(VIOsPAPRVLANDevice, nicconf), - DEFINE_PROP_BIT("use-rx-buffer-pools", VIOsPAPRVLANDevice, + DEFINE_SPAPR_PROPERTIES(SpaprVioVlan, sdev), + DEFINE_NIC_PROPERTIES(SpaprVioVlan, nicconf), + DEFINE_PROP_BIT("use-rx-buffer-pools", SpaprVioVlan, compat_flags, SPAPRVLAN_FLAG_RX_BUF_POOLS_BIT, true), DEFINE_PROP_END_OF_LIST(), }; =20 static bool spapr_vlan_rx_buffer_pools_needed(void *opaque) { - VIOsPAPRVLANDevice *dev =3D opaque; + SpaprVioVlan *dev =3D opaque; =20 return (dev->compat_flags & SPAPRVLAN_FLAG_RX_BUF_POOLS) !=3D 0; } @@ -813,7 +813,7 @@ static const VMStateDescription vmstate_rx_pools =3D { .minimum_version_id =3D 1, .needed =3D spapr_vlan_rx_buffer_pools_needed, .fields =3D (VMStateField[]) { - VMSTATE_ARRAY_OF_POINTER_TO_STRUCT(rx_pool, VIOsPAPRVLANDevice, + VMSTATE_ARRAY_OF_POINTER_TO_STRUCT(rx_pool, SpaprVioVlan, RX_MAX_POOLS, 1, vmstate_rx_buffer_pool, RxBufPo= ol), VMSTATE_END_OF_LIST() @@ -825,14 +825,14 @@ static const VMStateDescription vmstate_spapr_llan = =3D { .version_id =3D 1, .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { - VMSTATE_SPAPR_VIO(sdev, VIOsPAPRVLANDevice), + VMSTATE_SPAPR_VIO(sdev, SpaprVioVlan), /* LLAN state */ - VMSTATE_BOOL(isopen, VIOsPAPRVLANDevice), - VMSTATE_UINT64(buf_list, VIOsPAPRVLANDevice), - VMSTATE_UINT32(add_buf_ptr, VIOsPAPRVLANDevice), - VMSTATE_UINT32(use_buf_ptr, VIOsPAPRVLANDevice), - VMSTATE_UINT32(rx_bufs, VIOsPAPRVLANDevice), - VMSTATE_UINT64(rxq_ptr, VIOsPAPRVLANDevice), + VMSTATE_BOOL(isopen, SpaprVioVlan), + VMSTATE_UINT64(buf_list, SpaprVioVlan), + VMSTATE_UINT32(add_buf_ptr, SpaprVioVlan), + VMSTATE_UINT32(use_buf_ptr, SpaprVioVlan), + VMSTATE_UINT32(rx_bufs, SpaprVioVlan), + VMSTATE_UINT64(rxq_ptr, SpaprVioVlan), =20 VMSTATE_END_OF_LIST() }, @@ -845,7 +845,7 @@ static const VMStateDescription vmstate_spapr_llan =3D { static void spapr_vlan_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - VIOsPAPRDeviceClass *k =3D VIO_SPAPR_DEVICE_CLASS(klass); + SpaprVioDeviceClass *k =3D VIO_SPAPR_DEVICE_CLASS(klass); =20 k->realize =3D spapr_vlan_realize; k->reset =3D spapr_vlan_reset; @@ -863,7 +863,7 @@ static void spapr_vlan_class_init(ObjectClass *klass, v= oid *data) static const TypeInfo spapr_vlan_info =3D { .name =3D TYPE_VIO_SPAPR_VLAN_DEVICE, .parent =3D TYPE_VIO_SPAPR_DEVICE, - .instance_size =3D sizeof(VIOsPAPRVLANDevice), + .instance_size =3D sizeof(SpaprVioVlan), .class_init =3D spapr_vlan_class_init, .instance_init =3D spapr_vlan_instance_init, .instance_finalize =3D spapr_vlan_instance_finalize, diff --git a/hw/nvram/spapr_nvram.c b/hw/nvram/spapr_nvram.c index bed1557d83..c98c7576e6 100644 --- a/hw/nvram/spapr_nvram.c +++ b/hw/nvram/spapr_nvram.c @@ -36,28 +36,28 @@ #include "hw/ppc/spapr.h" #include "hw/ppc/spapr_vio.h" =20 -typedef struct sPAPRNVRAM { - VIOsPAPRDevice sdev; +typedef struct SpaprNvram { + SpaprVioDevice sdev; uint32_t size; uint8_t *buf; BlockBackend *blk; VMChangeStateEntry *vmstate; -} sPAPRNVRAM; +} SpaprNvram; =20 #define TYPE_VIO_SPAPR_NVRAM "spapr-nvram" #define VIO_SPAPR_NVRAM(obj) \ - OBJECT_CHECK(sPAPRNVRAM, (obj), TYPE_VIO_SPAPR_NVRAM) + OBJECT_CHECK(SpaprNvram, (obj), TYPE_VIO_SPAPR_NVRAM) =20 #define MIN_NVRAM_SIZE (8 * KiB) #define DEFAULT_NVRAM_SIZE (64 * KiB) #define MAX_NVRAM_SIZE (1 * MiB) =20 -static void rtas_nvram_fetch(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_nvram_fetch(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRNVRAM *nvram =3D spapr->nvram; + SpaprNvram *nvram =3D spapr->nvram; hwaddr offset, buffer, len; void *membuf; =20 @@ -93,12 +93,12 @@ static void rtas_nvram_fetch(PowerPCCPU *cpu, sPAPRMach= ineState *spapr, rtas_st(rets, 1, len); } =20 -static void rtas_nvram_store(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_nvram_store(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRNVRAM *nvram =3D spapr->nvram; + SpaprNvram *nvram =3D spapr->nvram; hwaddr offset, buffer, len; int alen; void *membuf; @@ -139,9 +139,9 @@ static void rtas_nvram_store(PowerPCCPU *cpu, sPAPRMach= ineState *spapr, rtas_st(rets, 1, (alen < 0) ? 0 : alen); } =20 -static void spapr_nvram_realize(VIOsPAPRDevice *dev, Error **errp) +static void spapr_nvram_realize(SpaprVioDevice *dev, Error **errp) { - sPAPRNVRAM *nvram =3D VIO_SPAPR_NVRAM(dev); + SpaprNvram *nvram =3D VIO_SPAPR_NVRAM(dev); int ret; =20 if (nvram->blk) { @@ -193,16 +193,16 @@ static void spapr_nvram_realize(VIOsPAPRDevice *dev, = Error **errp) spapr_rtas_register(RTAS_NVRAM_STORE, "nvram-store", rtas_nvram_store); } =20 -static int spapr_nvram_devnode(VIOsPAPRDevice *dev, void *fdt, int node_of= f) +static int spapr_nvram_devnode(SpaprVioDevice *dev, void *fdt, int node_of= f) { - sPAPRNVRAM *nvram =3D VIO_SPAPR_NVRAM(dev); + SpaprNvram *nvram =3D VIO_SPAPR_NVRAM(dev); =20 return fdt_setprop_cell(fdt, node_off, "#bytes", nvram->size); } =20 static int spapr_nvram_pre_load(void *opaque) { - sPAPRNVRAM *nvram =3D VIO_SPAPR_NVRAM(opaque); + SpaprNvram *nvram =3D VIO_SPAPR_NVRAM(opaque); =20 g_free(nvram->buf); nvram->buf =3D NULL; @@ -213,7 +213,7 @@ static int spapr_nvram_pre_load(void *opaque) =20 static void postload_update_cb(void *opaque, int running, RunState state) { - sPAPRNVRAM *nvram =3D opaque; + SpaprNvram *nvram =3D opaque; =20 /* This is called after bdrv_invalidate_cache_all. */ =20 @@ -225,7 +225,7 @@ static void postload_update_cb(void *opaque, int runnin= g, RunState state) =20 static int spapr_nvram_post_load(void *opaque, int version_id) { - sPAPRNVRAM *nvram =3D VIO_SPAPR_NVRAM(opaque); + SpaprNvram *nvram =3D VIO_SPAPR_NVRAM(opaque); =20 if (nvram->blk) { nvram->vmstate =3D qemu_add_vm_change_state_handler(postload_updat= e_cb, @@ -242,22 +242,22 @@ static const VMStateDescription vmstate_spapr_nvram = =3D { .pre_load =3D spapr_nvram_pre_load, .post_load =3D spapr_nvram_post_load, .fields =3D (VMStateField[]) { - VMSTATE_UINT32(size, sPAPRNVRAM), - VMSTATE_VBUFFER_ALLOC_UINT32(buf, sPAPRNVRAM, 1, NULL, size), + VMSTATE_UINT32(size, SpaprNvram), + VMSTATE_VBUFFER_ALLOC_UINT32(buf, SpaprNvram, 1, NULL, size), VMSTATE_END_OF_LIST() }, }; =20 static Property spapr_nvram_properties[] =3D { - DEFINE_SPAPR_PROPERTIES(sPAPRNVRAM, sdev), - DEFINE_PROP_DRIVE("drive", sPAPRNVRAM, blk), + DEFINE_SPAPR_PROPERTIES(SpaprNvram, sdev), + DEFINE_PROP_DRIVE("drive", SpaprNvram, blk), DEFINE_PROP_END_OF_LIST(), }; =20 static void spapr_nvram_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - VIOsPAPRDeviceClass *k =3D VIO_SPAPR_DEVICE_CLASS(klass); + SpaprVioDeviceClass *k =3D VIO_SPAPR_DEVICE_CLASS(klass); =20 k->realize =3D spapr_nvram_realize; k->devnode =3D spapr_nvram_devnode; @@ -274,7 +274,7 @@ static void spapr_nvram_class_init(ObjectClass *klass, = void *data) static const TypeInfo spapr_nvram_type_info =3D { .name =3D TYPE_VIO_SPAPR_NVRAM, .parent =3D TYPE_VIO_SPAPR_DEVICE, - .instance_size =3D sizeof(sPAPRNVRAM), + .instance_size =3D sizeof(SpaprNvram), .class_init =3D spapr_nvram_class_init, }; =20 diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index e764e89806..6c16d6cfaf 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -103,13 +103,13 @@ * all and one to identify thread 0 of a VCORE. Any change to the first one * is likely to have an impact on the second one, so let's keep them close. */ -static int spapr_vcpu_id(sPAPRMachineState *spapr, int cpu_index) +static int spapr_vcpu_id(SpaprMachineState *spapr, int cpu_index) { assert(spapr->vsmt); return (cpu_index / smp_threads) * spapr->vsmt + cpu_index % smp_threads; } -static bool spapr_is_thread0_in_vcore(sPAPRMachineState *spapr, +static bool spapr_is_thread0_in_vcore(SpaprMachineState *spapr, PowerPCCPU *cpu) { assert(spapr->vsmt); @@ -150,7 +150,7 @@ static void pre_2_10_vmstate_unregister_dummy_icp(int i) (void *)(uintptr_t) i); } =20 -int spapr_max_server_number(sPAPRMachineState *spapr) +int spapr_max_server_number(SpaprMachineState *spapr) { assert(spapr->vsmt); return DIV_ROUND_UP(max_cpus * spapr->vsmt, smp_threads); @@ -205,7 +205,7 @@ static int spapr_fixup_cpu_numa_dt(void *fdt, int offse= t, PowerPCCPU *cpu) } =20 /* Populate the "ibm,pa-features" property */ -static void spapr_populate_pa_features(sPAPRMachineState *spapr, +static void spapr_populate_pa_features(SpaprMachineState *spapr, PowerPCCPU *cpu, void *fdt, int offset, bool legacy_guest) @@ -284,7 +284,7 @@ static void spapr_populate_pa_features(sPAPRMachineStat= e *spapr, _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size= ))); } =20 -static int spapr_fixup_cpu_dt(void *fdt, sPAPRMachineState *spapr) +static int spapr_fixup_cpu_dt(void *fdt, SpaprMachineState *spapr) { int ret =3D 0, offset, cpus_offset; CPUState *cs; @@ -387,7 +387,7 @@ static int spapr_populate_memory_node(void *fdt, int no= deid, hwaddr start, return off; } =20 -static int spapr_populate_memory(sPAPRMachineState *spapr, void *fdt) +static int spapr_populate_memory(SpaprMachineState *spapr, void *fdt) { MachineState *machine =3D MACHINE(spapr); hwaddr mem_start, node_size; @@ -439,7 +439,7 @@ static int spapr_populate_memory(sPAPRMachineState *spa= pr, void *fdt) } =20 static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset, - sPAPRMachineState *spapr) + SpaprMachineState *spapr) { PowerPCCPU *cpu =3D POWERPC_CPU(cs); CPUPPCState *env =3D &cpu->env; @@ -455,7 +455,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *f= dt, int offset, uint32_t vcpus_per_socket =3D smp_threads * smp_cores; uint32_t pft_size_prop[] =3D {0, cpu_to_be32(spapr->htab_shift)}; int compat_smt =3D MIN(smp_threads, ppc_compat_max_vthreads(cpu)); - sPAPRDRConnector *drc; + SpaprDrc *drc; int drc_index; uint32_t radix_AP_encodings[PPC_PAGE_SIZES_MAX_SZ]; int i; @@ -568,7 +568,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *f= dt, int offset, pcc->lrg_decr_bits))); } =20 -static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spap= r) +static void spapr_populate_cpus_dt_node(void *fdt, SpaprMachineState *spap= r) { CPUState **rev; CPUState *cs; @@ -692,7 +692,7 @@ spapr_get_drconf_cell(uint32_t seq_lmbs, uint64_t base_= addr, } =20 /* ibm,dynamic-memory-v2 */ -static int spapr_populate_drmem_v2(sPAPRMachineState *spapr, void *fdt, +static int spapr_populate_drmem_v2(SpaprMachineState *spapr, void *fdt, int offset, MemoryDeviceInfoList *dimms) { MachineState *machine =3D MACHINE(spapr); @@ -704,7 +704,7 @@ static int spapr_populate_drmem_v2(sPAPRMachineState *s= papr, void *fdt, uint64_t mem_end =3D machine->device_memory->base + memory_region_size(&machine->device_memory->mr); uint32_t node, buf_len, nr_entries =3D 0; - sPAPRDRConnector *drc; + SpaprDrc *drc; DrconfCellQueue *elem, *next; MemoryDeviceInfoList *info; QSIMPLEQ_HEAD(, DrconfCellQueue) drconf_queue @@ -777,7 +777,7 @@ static int spapr_populate_drmem_v2(sPAPRMachineState *s= papr, void *fdt, } =20 /* ibm,dynamic-memory */ -static int spapr_populate_drmem_v1(sPAPRMachineState *spapr, void *fdt, +static int spapr_populate_drmem_v1(SpaprMachineState *spapr, void *fdt, int offset, MemoryDeviceInfoList *dimms) { MachineState *machine =3D MACHINE(spapr); @@ -801,7 +801,7 @@ static int spapr_populate_drmem_v1(sPAPRMachineState *s= papr, void *fdt, uint32_t *dynamic_memory =3D cur_index; =20 if (i >=3D device_lmb_start) { - sPAPRDRConnector *drc; + SpaprDrc *drc; =20 drc =3D spapr_drc_by_id(TYPE_SPAPR_DRC_LMB, i); g_assert(drc); @@ -846,7 +846,7 @@ static int spapr_populate_drmem_v1(sPAPRMachineState *s= papr, void *fdt, * Refer to docs/specs/ppc-spapr-hotplug.txt for the documentation * of this device tree node. */ -static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fd= t) +static int spapr_populate_drconf_memory(SpaprMachineState *spapr, void *fd= t) { MachineState *machine =3D MACHINE(spapr); int ret, i, offset; @@ -917,10 +917,10 @@ static int spapr_populate_drconf_memory(sPAPRMachineS= tate *spapr, void *fdt) return ret; } =20 -static int spapr_dt_cas_updates(sPAPRMachineState *spapr, void *fdt, - sPAPROptionVector *ov5_updates) +static int spapr_dt_cas_updates(SpaprMachineState *spapr, void *fdt, + SpaprOptionVector *ov5_updates) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); int ret =3D 0, offset; =20 /* Generate ibm,dynamic-reconfiguration-memory node if required */ @@ -966,12 +966,12 @@ static bool spapr_hotplugged_dev_before_cas(void) return false; } =20 -int spapr_h_cas_compose_response(sPAPRMachineState *spapr, +int spapr_h_cas_compose_response(SpaprMachineState *spapr, target_ulong addr, target_ulong size, - sPAPROptionVector *ov5_updates) + SpaprOptionVector *ov5_updates) { void *fdt, *fdt_skel; - sPAPRDeviceTreeUpdateHeader hdr =3D { .version_id =3D 1 }; + SpaprDeviceTreeUpdateHeader hdr =3D { .version_id =3D 1 }; =20 if (spapr_hotplugged_dev_before_cas()) { return 1; @@ -1020,7 +1020,7 @@ int spapr_h_cas_compose_response(sPAPRMachineState *s= papr, return 0; } =20 -static void spapr_dt_rtas(sPAPRMachineState *spapr, void *fdt) +static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt) { int rtas; GString *hypertas =3D g_string_sized_new(256); @@ -1109,7 +1109,7 @@ static void spapr_dt_rtas(sPAPRMachineState *spapr, v= oid *fdt) * and the XIVE features that the guest may request and thus the valid * values for bytes 23..26 of option vector 5: */ -static void spapr_dt_ov5_platform_support(sPAPRMachineState *spapr, void *= fdt, +static void spapr_dt_ov5_platform_support(SpaprMachineState *spapr, void *= fdt, int chosen) { PowerPCCPU *first_ppc_cpu =3D POWERPC_CPU(first_cpu); @@ -1145,7 +1145,7 @@ static void spapr_dt_ov5_platform_support(sPAPRMachin= eState *spapr, void *fdt, val, sizeof(val))); } =20 -static void spapr_dt_chosen(sPAPRMachineState *spapr, void *fdt) +static void spapr_dt_chosen(SpaprMachineState *spapr, void *fdt) { MachineState *machine =3D MACHINE(spapr); int chosen; @@ -1211,7 +1211,7 @@ static void spapr_dt_chosen(sPAPRMachineState *spapr,= void *fdt) g_free(bootlist); } =20 -static void spapr_dt_hypervisor(sPAPRMachineState *spapr, void *fdt) +static void spapr_dt_hypervisor(SpaprMachineState *spapr, void *fdt) { /* The /hypervisor node isn't in PAPR - this is a hack to allow PR * KVM to work under pHyp with some guest co-operation */ @@ -1234,14 +1234,14 @@ static void spapr_dt_hypervisor(sPAPRMachineState *= spapr, void *fdt) } } =20 -static void *spapr_build_fdt(sPAPRMachineState *spapr) +static void *spapr_build_fdt(SpaprMachineState *spapr) { MachineState *machine =3D MACHINE(spapr); MachineClass *mc =3D MACHINE_GET_CLASS(machine); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(machine); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(machine); int ret; void *fdt; - sPAPRPHBState *phb; + SpaprPhbState *phb; char *buf; =20 fdt =3D g_malloc0(FDT_MAX_SIZE); @@ -1439,7 +1439,7 @@ void spapr_set_all_lpcrs(target_ulong value, target_u= long mask) =20 static void spapr_get_pate(PPCVirtualHypervisor *vhyp, ppc_v3_pate_t *entr= y) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(vhyp); + SpaprMachineState *spapr =3D SPAPR_MACHINE(vhyp); =20 /* Copy PATE1:GR into PATE0:HR */ entry->dw0 =3D spapr->patb_entry & PATE0_HR; @@ -1455,7 +1455,7 @@ static void spapr_get_pate(PPCVirtualHypervisor *vhyp= , ppc_v3_pate_t *entry) /* * Get the fd to access the kernel htab, re-opening it if necessary */ -static int get_htab_fd(sPAPRMachineState *spapr) +static int get_htab_fd(SpaprMachineState *spapr) { Error *local_err =3D NULL; =20 @@ -1471,7 +1471,7 @@ static int get_htab_fd(sPAPRMachineState *spapr) return spapr->htab_fd; } =20 -void close_htab_fd(sPAPRMachineState *spapr) +void close_htab_fd(SpaprMachineState *spapr) { if (spapr->htab_fd >=3D 0) { close(spapr->htab_fd); @@ -1481,14 +1481,14 @@ void close_htab_fd(sPAPRMachineState *spapr) =20 static hwaddr spapr_hpt_mask(PPCVirtualHypervisor *vhyp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(vhyp); + SpaprMachineState *spapr =3D SPAPR_MACHINE(vhyp); =20 return HTAB_SIZE(spapr) / HASH_PTEG_SIZE_64 - 1; } =20 static target_ulong spapr_encode_hpt_for_kvm_pr(PPCVirtualHypervisor *vhyp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(vhyp); + SpaprMachineState *spapr =3D SPAPR_MACHINE(vhyp); =20 assert(kvm_enabled()); =20 @@ -1502,7 +1502,7 @@ static target_ulong spapr_encode_hpt_for_kvm_pr(PPCVi= rtualHypervisor *vhyp) static const ppc_hash_pte64_t *spapr_map_hptes(PPCVirtualHypervisor *vhyp, hwaddr ptex, int n) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(vhyp); + SpaprMachineState *spapr =3D SPAPR_MACHINE(vhyp); hwaddr pte_offset =3D ptex * HASH_PTE_SIZE_64; =20 if (!spapr->htab) { @@ -1525,7 +1525,7 @@ static void spapr_unmap_hptes(PPCVirtualHypervisor *v= hyp, const ppc_hash_pte64_t *hptes, hwaddr ptex, int n) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(vhyp); + SpaprMachineState *spapr =3D SPAPR_MACHINE(vhyp); =20 if (!spapr->htab) { g_free((void *)hptes); @@ -1537,7 +1537,7 @@ static void spapr_unmap_hptes(PPCVirtualHypervisor *v= hyp, static void spapr_store_hpte(PPCVirtualHypervisor *vhyp, hwaddr ptex, uint64_t pte0, uint64_t pte1) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(vhyp); + SpaprMachineState *spapr =3D SPAPR_MACHINE(vhyp); hwaddr offset =3D ptex * HASH_PTE_SIZE_64; =20 if (!spapr->htab) { @@ -1578,7 +1578,7 @@ int spapr_hpt_shift_for_ramsize(uint64_t ramsize) return shift; } =20 -void spapr_free_hpt(sPAPRMachineState *spapr) +void spapr_free_hpt(SpaprMachineState *spapr) { g_free(spapr->htab); spapr->htab =3D NULL; @@ -1586,7 +1586,7 @@ void spapr_free_hpt(sPAPRMachineState *spapr) close_htab_fd(spapr); } =20 -void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift, +void spapr_reallocate_hpt(SpaprMachineState *spapr, int shift, Error **errp) { long rc; @@ -1636,7 +1636,7 @@ void spapr_reallocate_hpt(sPAPRMachineState *spapr, i= nt shift, spapr_set_all_lpcrs(0, LPCR_HR | LPCR_UPRT); } =20 -void spapr_setup_hpt_and_vrma(sPAPRMachineState *spapr) +void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr) { int hpt_shift; =20 @@ -1660,8 +1660,8 @@ void spapr_setup_hpt_and_vrma(sPAPRMachineState *spap= r) =20 static int spapr_reset_drcs(Object *child, void *opaque) { - sPAPRDRConnector *drc =3D - (sPAPRDRConnector *) object_dynamic_cast(child, + SpaprDrc *drc =3D + (SpaprDrc *) object_dynamic_cast(child, TYPE_SPAPR_DR_CONNECTOR); =20 if (drc) { @@ -1674,7 +1674,7 @@ static int spapr_reset_drcs(Object *child, void *opaq= ue) static void spapr_machine_reset(void) { MachineState *machine =3D MACHINE(qdev_get_machine()); - sPAPRMachineState *spapr =3D SPAPR_MACHINE(machine); + SpaprMachineState *spapr =3D SPAPR_MACHINE(machine); PowerPCCPU *first_ppc_cpu; uint32_t rtas_limit; hwaddr rtas_addr, fdt_addr; @@ -1779,7 +1779,7 @@ static void spapr_machine_reset(void) spapr->cas_reboot =3D false; } =20 -static void spapr_create_nvram(sPAPRMachineState *spapr) +static void spapr_create_nvram(SpaprMachineState *spapr) { DeviceState *dev =3D qdev_create(&spapr->vio_bus->bus, "spapr-nvram"); DriveInfo *dinfo =3D drive_get(IF_PFLASH, 0, 0); @@ -1791,10 +1791,10 @@ static void spapr_create_nvram(sPAPRMachineState *s= papr) =20 qdev_init_nofail(dev); =20 - spapr->nvram =3D (struct sPAPRNVRAM *)dev; + spapr->nvram =3D (struct SpaprNvram *)dev; } =20 -static void spapr_rtc_create(sPAPRMachineState *spapr) +static void spapr_rtc_create(SpaprMachineState *spapr) { object_initialize_child(OBJECT(spapr), "rtc", &spapr->rtc, sizeof(spapr->rtc), TYPE_SPAPR_RT= C, @@ -1838,7 +1838,7 @@ static int spapr_pre_load(void *opaque) =20 static int spapr_post_load(void *opaque, int version_id) { - sPAPRMachineState *spapr =3D (sPAPRMachineState *)opaque; + SpaprMachineState *spapr =3D (SpaprMachineState *)opaque; int err =3D 0; =20 err =3D spapr_caps_post_migration(spapr); @@ -1905,7 +1905,7 @@ static bool version_before_3(void *opaque, int versio= n_id) =20 static bool spapr_pending_events_needed(void *opaque) { - sPAPRMachineState *spapr =3D (sPAPRMachineState *)opaque; + SpaprMachineState *spapr =3D (SpaprMachineState *)opaque; return !QTAILQ_EMPTY(&spapr->pending_events); } =20 @@ -1914,9 +1914,9 @@ static const VMStateDescription vmstate_spapr_event_e= ntry =3D { .version_id =3D 1, .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { - VMSTATE_UINT32(summary, sPAPREventLogEntry), - VMSTATE_UINT32(extended_length, sPAPREventLogEntry), - VMSTATE_VBUFFER_ALLOC_UINT32(extended_log, sPAPREventLogEntry, 0, + VMSTATE_UINT32(summary, SpaprEventLogEntry), + VMSTATE_UINT32(extended_length, SpaprEventLogEntry), + VMSTATE_VBUFFER_ALLOC_UINT32(extended_log, SpaprEventLogEntry, 0, NULL, extended_length), VMSTATE_END_OF_LIST() }, @@ -1928,21 +1928,21 @@ static const VMStateDescription vmstate_spapr_pendi= ng_events =3D { .minimum_version_id =3D 1, .needed =3D spapr_pending_events_needed, .fields =3D (VMStateField[]) { - VMSTATE_QTAILQ_V(pending_events, sPAPRMachineState, 1, - vmstate_spapr_event_entry, sPAPREventLogEntry, ne= xt), + VMSTATE_QTAILQ_V(pending_events, SpaprMachineState, 1, + vmstate_spapr_event_entry, SpaprEventLogEntry, ne= xt), VMSTATE_END_OF_LIST() }, }; =20 static bool spapr_ov5_cas_needed(void *opaque) { - sPAPRMachineState *spapr =3D opaque; - sPAPROptionVector *ov5_mask =3D spapr_ovec_new(); - sPAPROptionVector *ov5_legacy =3D spapr_ovec_new(); - sPAPROptionVector *ov5_removed =3D spapr_ovec_new(); + SpaprMachineState *spapr =3D opaque; + SpaprOptionVector *ov5_mask =3D spapr_ovec_new(); + SpaprOptionVector *ov5_legacy =3D spapr_ovec_new(); + SpaprOptionVector *ov5_removed =3D spapr_ovec_new(); bool cas_needed; =20 - /* Prior to the introduction of sPAPROptionVector, we had two option + /* Prior to the introduction of SpaprOptionVector, we had two option * vectors we dealt with: OV5_FORM1_AFFINITY, and OV5_DRCONF_MEMORY. * Both of these options encode machine topology into the device-tree * in such a way that the now-booted OS should still be able to intera= ct @@ -1992,15 +1992,15 @@ static const VMStateDescription vmstate_spapr_ov5_c= as =3D { .minimum_version_id =3D 1, .needed =3D spapr_ov5_cas_needed, .fields =3D (VMStateField[]) { - VMSTATE_STRUCT_POINTER_V(ov5_cas, sPAPRMachineState, 1, - vmstate_spapr_ovec, sPAPROptionVector), + VMSTATE_STRUCT_POINTER_V(ov5_cas, SpaprMachineState, 1, + vmstate_spapr_ovec, SpaprOptionVector), VMSTATE_END_OF_LIST() }, }; =20 static bool spapr_patb_entry_needed(void *opaque) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 return !!spapr->patb_entry; } @@ -2011,14 +2011,14 @@ static const VMStateDescription vmstate_spapr_patb_= entry =3D { .minimum_version_id =3D 1, .needed =3D spapr_patb_entry_needed, .fields =3D (VMStateField[]) { - VMSTATE_UINT64(patb_entry, sPAPRMachineState), + VMSTATE_UINT64(patb_entry, SpaprMachineState), VMSTATE_END_OF_LIST() }, }; =20 static bool spapr_irq_map_needed(void *opaque) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 return spapr->irq_map && !bitmap_empty(spapr->irq_map, spapr->irq_map_= nr); } @@ -2029,21 +2029,21 @@ static const VMStateDescription vmstate_spapr_irq_m= ap =3D { .minimum_version_id =3D 1, .needed =3D spapr_irq_map_needed, .fields =3D (VMStateField[]) { - VMSTATE_BITMAP(irq_map, sPAPRMachineState, 0, irq_map_nr), + VMSTATE_BITMAP(irq_map, SpaprMachineState, 0, irq_map_nr), VMSTATE_END_OF_LIST() }, }; =20 static bool spapr_dtb_needed(void *opaque) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(opaque); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(opaque); =20 return smc->update_dt_enabled; } =20 static int spapr_dtb_pre_load(void *opaque) { - sPAPRMachineState *spapr =3D (sPAPRMachineState *)opaque; + SpaprMachineState *spapr =3D (SpaprMachineState *)opaque; =20 g_free(spapr->fdt_blob); spapr->fdt_blob =3D NULL; @@ -2059,9 +2059,9 @@ static const VMStateDescription vmstate_spapr_dtb =3D= { .needed =3D spapr_dtb_needed, .pre_load =3D spapr_dtb_pre_load, .fields =3D (VMStateField[]) { - VMSTATE_UINT32(fdt_initial_size, sPAPRMachineState), - VMSTATE_UINT32(fdt_size, sPAPRMachineState), - VMSTATE_VBUFFER_ALLOC_UINT32(fdt_blob, sPAPRMachineState, 0, NULL, + VMSTATE_UINT32(fdt_initial_size, SpaprMachineState), + VMSTATE_UINT32(fdt_size, SpaprMachineState), + VMSTATE_VBUFFER_ALLOC_UINT32(fdt_blob, SpaprMachineState, 0, NULL, fdt_size), VMSTATE_END_OF_LIST() }, @@ -2079,9 +2079,9 @@ static const VMStateDescription vmstate_spapr =3D { VMSTATE_UNUSED_BUFFER(version_before_3, 0, 4), =20 /* RTC offset */ - VMSTATE_UINT64_TEST(rtc_offset, sPAPRMachineState, version_before_= 3), + VMSTATE_UINT64_TEST(rtc_offset, SpaprMachineState, version_before_= 3), =20 - VMSTATE_PPC_TIMEBASE_V(tb, sPAPRMachineState, 2), + VMSTATE_PPC_TIMEBASE_V(tb, SpaprMachineState, 2), VMSTATE_END_OF_LIST() }, .subsections =3D (const VMStateDescription*[]) { @@ -2105,7 +2105,7 @@ static const VMStateDescription vmstate_spapr =3D { =20 static int htab_save_setup(QEMUFile *f, void *opaque) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 /* "Iteration" header */ if (!spapr->htab_shift) { @@ -2127,7 +2127,7 @@ static int htab_save_setup(QEMUFile *f, void *opaque) return 0; } =20 -static void htab_save_chunk(QEMUFile *f, sPAPRMachineState *spapr, +static void htab_save_chunk(QEMUFile *f, SpaprMachineState *spapr, int chunkstart, int n_valid, int n_invalid) { qemu_put_be32(f, chunkstart); @@ -2144,7 +2144,7 @@ static void htab_save_end_marker(QEMUFile *f) qemu_put_be16(f, 0); } =20 -static void htab_save_first_pass(QEMUFile *f, sPAPRMachineState *spapr, +static void htab_save_first_pass(QEMUFile *f, SpaprMachineState *spapr, int64_t max_ns) { bool has_timeout =3D max_ns !=3D -1; @@ -2192,7 +2192,7 @@ static void htab_save_first_pass(QEMUFile *f, sPAPRMa= chineState *spapr, spapr->htab_save_index =3D index; } =20 -static int htab_save_later_pass(QEMUFile *f, sPAPRMachineState *spapr, +static int htab_save_later_pass(QEMUFile *f, SpaprMachineState *spapr, int64_t max_ns) { bool final =3D max_ns < 0; @@ -2270,7 +2270,7 @@ static int htab_save_later_pass(QEMUFile *f, sPAPRMac= hineState *spapr, =20 static int htab_save_iterate(QEMUFile *f, void *opaque) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; int fd; int rc =3D 0; =20 @@ -2307,7 +2307,7 @@ static int htab_save_iterate(QEMUFile *f, void *opaqu= e) =20 static int htab_save_complete(QEMUFile *f, void *opaque) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; int fd; =20 /* Iteration header */ @@ -2347,7 +2347,7 @@ static int htab_save_complete(QEMUFile *f, void *opaq= ue) =20 static int htab_load(QEMUFile *f, void *opaque, int version_id) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; uint32_t section_hdr; int fd =3D -1; Error *local_err =3D NULL; @@ -2437,7 +2437,7 @@ static int htab_load(QEMUFile *f, void *opaque, int v= ersion_id) =20 static void htab_save_cleanup(void *opaque) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 close_htab_fd(spapr); } @@ -2457,7 +2457,7 @@ static void spapr_boot_set(void *opaque, const char *= boot_device, machine->boot_order =3D g_strdup(boot_device); } =20 -static void spapr_create_lmb_dr_connectors(sPAPRMachineState *spapr) +static void spapr_create_lmb_dr_connectors(SpaprMachineState *spapr) { MachineState *machine =3D MACHINE(spapr); uint64_t lmb_size =3D SPAPR_MEMORY_BLOCK_SIZE; @@ -2524,7 +2524,7 @@ static CPUArchId *spapr_find_cpu_slot(MachineState *m= s, uint32_t id, int *idx) return &ms->possible_cpus->cpus[index]; } =20 -static void spapr_set_vsmt_mode(sPAPRMachineState *spapr, Error **errp) +static void spapr_set_vsmt_mode(SpaprMachineState *spapr, Error **errp) { Error *local_err =3D NULL; bool vsmt_user =3D !!spapr->vsmt; @@ -2596,11 +2596,11 @@ out: error_propagate(errp, local_err); } =20 -static void spapr_init_cpus(sPAPRMachineState *spapr) +static void spapr_init_cpus(SpaprMachineState *spapr) { MachineState *machine =3D MACHINE(spapr); MachineClass *mc =3D MACHINE_GET_CLASS(machine); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(machine); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(machine); const char *type =3D spapr_get_cpu_core_type(machine->cpu_type); const CPUArchIdList *possible_cpus; int boot_cores_nr =3D smp_cpus / smp_threads; @@ -2679,8 +2679,8 @@ static PCIHostState *spapr_create_default_phb(void) /* pSeries LPAR / sPAPR hardware init */ static void spapr_machine_init(MachineState *machine) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(machine); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(machine); + SpaprMachineState *spapr =3D SPAPR_MACHINE(machine); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(machine); const char *kernel_filename =3D machine->kernel_filename; const char *initrd_filename =3D machine->initrd_filename; PCIHostState *phb; @@ -3076,7 +3076,7 @@ static char *spapr_get_fw_dev_path(FWPathProvider *p,= BusState *bus, #define CAST(type, obj, name) \ ((type *)object_dynamic_cast(OBJECT(obj), (name))) SCSIDevice *d =3D CAST(SCSIDevice, dev, TYPE_SCSI_DEVICE); - sPAPRPHBState *phb =3D CAST(sPAPRPHBState, dev, TYPE_SPAPR_PCI_HOST_BR= IDGE); + SpaprPhbState *phb =3D CAST(SpaprPhbState, dev, TYPE_SPAPR_PCI_HOST_BR= IDGE); VHostSCSICommon *vsc =3D CAST(VHostSCSICommon, dev, TYPE_VHOST_SCSI_CO= MMON); =20 if (d) { @@ -3156,14 +3156,14 @@ static char *spapr_get_fw_dev_path(FWPathProvider *= p, BusState *bus, =20 static char *spapr_get_kvm_type(Object *obj, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 return g_strdup(spapr->kvm_type); } =20 static void spapr_set_kvm_type(Object *obj, const char *value, Error **err= p) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 g_free(spapr->kvm_type); spapr->kvm_type =3D g_strdup(value); @@ -3171,7 +3171,7 @@ static void spapr_set_kvm_type(Object *obj, const cha= r *value, Error **errp) =20 static bool spapr_get_modern_hotplug_events(Object *obj, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 return spapr->use_hotplug_event_source; } @@ -3179,7 +3179,7 @@ static bool spapr_get_modern_hotplug_events(Object *o= bj, Error **errp) static void spapr_set_modern_hotplug_events(Object *obj, bool value, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 spapr->use_hotplug_event_source =3D value; } @@ -3191,7 +3191,7 @@ static bool spapr_get_msix_emulation(Object *obj, Err= or **errp) =20 static char *spapr_get_resize_hpt(Object *obj, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 switch (spapr->resize_hpt) { case SPAPR_RESIZE_HPT_DEFAULT: @@ -3208,7 +3208,7 @@ static char *spapr_get_resize_hpt(Object *obj, Error = **errp) =20 static void spapr_set_resize_hpt(Object *obj, const char *value, Error **e= rrp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 if (strcmp(value, "default") =3D=3D 0) { spapr->resize_hpt =3D SPAPR_RESIZE_HPT_DEFAULT; @@ -3237,7 +3237,7 @@ static void spapr_set_vsmt(Object *obj, Visitor *v, c= onst char *name, =20 static char *spapr_get_ic_mode(Object *obj, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 if (spapr->irq =3D=3D &spapr_irq_xics_legacy) { return g_strdup("legacy"); @@ -3253,7 +3253,7 @@ static char *spapr_get_ic_mode(Object *obj, Error **e= rrp) =20 static void spapr_set_ic_mode(Object *obj, const char *value, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 if (SPAPR_MACHINE_GET_CLASS(spapr)->legacy_irq_allocation) { error_setg(errp, "This machine only uses the legacy XICS backend, = don't pass ic-mode"); @@ -3274,14 +3274,14 @@ static void spapr_set_ic_mode(Object *obj, const ch= ar *value, Error **errp) =20 static char *spapr_get_host_model(Object *obj, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 return g_strdup(spapr->host_model); } =20 static void spapr_set_host_model(Object *obj, const char *value, Error **e= rrp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 g_free(spapr->host_model); spapr->host_model =3D g_strdup(value); @@ -3289,14 +3289,14 @@ static void spapr_set_host_model(Object *obj, const= char *value, Error **errp) =20 static char *spapr_get_host_serial(Object *obj, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 return g_strdup(spapr->host_serial); } =20 static void spapr_set_host_serial(Object *obj, const char *value, Error **= errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 g_free(spapr->host_serial); spapr->host_serial =3D g_strdup(value); @@ -3304,8 +3304,8 @@ static void spapr_set_host_serial(Object *obj, const = char *value, Error **errp) =20 static void spapr_instance_init(Object *obj) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); =20 spapr->htab_fd =3D -1; spapr->use_hotplug_event_source =3D true; @@ -3362,7 +3362,7 @@ static void spapr_instance_init(Object *obj) =20 static void spapr_machine_finalizefn(Object *obj) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 g_free(spapr->kvm_type); } @@ -3382,7 +3382,7 @@ static void spapr_nmi(NMIState *n, int cpu_index, Err= or **errp) } } =20 -int spapr_lmb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr, +int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp) { uint64_t addr; @@ -3399,7 +3399,7 @@ int spapr_lmb_dt_populate(sPAPRDRConnector *drc, sPAP= RMachineState *spapr, static void spapr_add_lmbs(DeviceState *dev, uint64_t addr_start, uint64_t= size, bool dedicated_hp_event_source, Error **errp) { - sPAPRDRConnector *drc; + SpaprDrc *drc; uint32_t nr_lmbs =3D size/SPAPR_MEMORY_BLOCK_SIZE; int i; uint64_t addr =3D addr_start; @@ -3448,7 +3448,7 @@ static void spapr_memory_plug(HotplugHandler *hotplug= _dev, DeviceState *dev, Error **errp) { Error *local_err =3D NULL; - sPAPRMachineState *ms =3D SPAPR_MACHINE(hotplug_dev); + SpaprMachineState *ms =3D SPAPR_MACHINE(hotplug_dev); PCDIMMDevice *dimm =3D PC_DIMM(dev); uint64_t size, addr; =20 @@ -3482,8 +3482,8 @@ out: static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState= *dev, Error **errp) { - const sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(hotplug_dev); - sPAPRMachineState *spapr =3D SPAPR_MACHINE(hotplug_dev); + const SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(hotplug_dev); + SpaprMachineState *spapr =3D SPAPR_MACHINE(hotplug_dev); PCDIMMDevice *dimm =3D PC_DIMM(dev); Error *local_err =3D NULL; uint64_t size; @@ -3519,16 +3519,16 @@ static void spapr_memory_pre_plug(HotplugHandler *h= otplug_dev, DeviceState *dev, pc_dimm_pre_plug(dimm, MACHINE(hotplug_dev), NULL, errp); } =20 -struct sPAPRDIMMState { +struct SpaprDimmState { PCDIMMDevice *dimm; uint32_t nr_lmbs; - QTAILQ_ENTRY(sPAPRDIMMState) next; + QTAILQ_ENTRY(SpaprDimmState) next; }; =20 -static sPAPRDIMMState *spapr_pending_dimm_unplugs_find(sPAPRMachineState *= s, +static SpaprDimmState *spapr_pending_dimm_unplugs_find(SpaprMachineState *= s, PCDIMMDevice *dimm) { - sPAPRDIMMState *dimm_state =3D NULL; + SpaprDimmState *dimm_state =3D NULL; =20 QTAILQ_FOREACH(dimm_state, &s->pending_dimm_unplugs, next) { if (dimm_state->dimm =3D=3D dimm) { @@ -3538,11 +3538,11 @@ static sPAPRDIMMState *spapr_pending_dimm_unplugs_f= ind(sPAPRMachineState *s, return dimm_state; } =20 -static sPAPRDIMMState *spapr_pending_dimm_unplugs_add(sPAPRMachineState *s= papr, +static SpaprDimmState *spapr_pending_dimm_unplugs_add(SpaprMachineState *s= papr, uint32_t nr_lmbs, PCDIMMDevice *dimm) { - sPAPRDIMMState *ds =3D NULL; + SpaprDimmState *ds =3D NULL; =20 /* * If this request is for a DIMM whose removal had failed earlier @@ -3552,7 +3552,7 @@ static sPAPRDIMMState *spapr_pending_dimm_unplugs_add= (sPAPRMachineState *spapr, */ ds =3D spapr_pending_dimm_unplugs_find(spapr, dimm); if (!ds) { - ds =3D g_malloc0(sizeof(sPAPRDIMMState)); + ds =3D g_malloc0(sizeof(SpaprDimmState)); ds->nr_lmbs =3D nr_lmbs; ds->dimm =3D dimm; QTAILQ_INSERT_HEAD(&spapr->pending_dimm_unplugs, ds, next); @@ -3560,17 +3560,17 @@ static sPAPRDIMMState *spapr_pending_dimm_unplugs_a= dd(sPAPRMachineState *spapr, return ds; } =20 -static void spapr_pending_dimm_unplugs_remove(sPAPRMachineState *spapr, - sPAPRDIMMState *dimm_state) +static void spapr_pending_dimm_unplugs_remove(SpaprMachineState *spapr, + SpaprDimmState *dimm_state) { QTAILQ_REMOVE(&spapr->pending_dimm_unplugs, dimm_state, next); g_free(dimm_state); } =20 -static sPAPRDIMMState *spapr_recover_pending_dimm_state(sPAPRMachineState = *ms, +static SpaprDimmState *spapr_recover_pending_dimm_state(SpaprMachineState = *ms, PCDIMMDevice *dimm) { - sPAPRDRConnector *drc; + SpaprDrc *drc; uint64_t size =3D memory_device_get_region_size(MEMORY_DEVICE(dimm), &error_abort); uint32_t nr_lmbs =3D size / SPAPR_MEMORY_BLOCK_SIZE; @@ -3599,8 +3599,8 @@ static sPAPRDIMMState *spapr_recover_pending_dimm_sta= te(sPAPRMachineState *ms, void spapr_lmb_release(DeviceState *dev) { HotplugHandler *hotplug_ctrl =3D qdev_get_hotplug_handler(dev); - sPAPRMachineState *spapr =3D SPAPR_MACHINE(hotplug_ctrl); - sPAPRDIMMState *ds =3D spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(= dev)); + SpaprMachineState *spapr =3D SPAPR_MACHINE(hotplug_ctrl); + SpaprDimmState *ds =3D spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(= dev)); =20 /* This information will get lost if a migration occurs * during the unplug process. In this case recover it. */ @@ -3625,8 +3625,8 @@ void spapr_lmb_release(DeviceState *dev) =20 static void spapr_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *= dev) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(hotplug_dev); - sPAPRDIMMState *ds =3D spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(= dev)); + SpaprMachineState *spapr =3D SPAPR_MACHINE(hotplug_dev); + SpaprDimmState *ds =3D spapr_pending_dimm_unplugs_find(spapr, PC_DIMM(= dev)); =20 pc_dimm_unplug(PC_DIMM(dev), MACHINE(hotplug_dev)); object_property_set_bool(OBJECT(dev), false, "realized", NULL); @@ -3636,13 +3636,13 @@ static void spapr_memory_unplug(HotplugHandler *hot= plug_dev, DeviceState *dev) static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(hotplug_dev); + SpaprMachineState *spapr =3D SPAPR_MACHINE(hotplug_dev); Error *local_err =3D NULL; PCDIMMDevice *dimm =3D PC_DIMM(dev); uint32_t nr_lmbs; uint64_t size, addr_start, addr; int i; - sPAPRDRConnector *drc; + SpaprDrc *drc; =20 size =3D memory_device_get_region_size(MEMORY_DEVICE(dimm), &error_abo= rt); nr_lmbs =3D size / SPAPR_MEMORY_BLOCK_SIZE; @@ -3699,12 +3699,12 @@ void spapr_core_release(DeviceState *dev) static void spapr_core_unplug(HotplugHandler *hotplug_dev, DeviceState *de= v) { MachineState *ms =3D MACHINE(hotplug_dev); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(ms); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(ms); CPUCore *cc =3D CPU_CORE(dev); CPUArchId *core_slot =3D spapr_find_cpu_slot(ms, cc->core_id, NULL); =20 if (smc->pre_2_10_has_unused_icps) { - sPAPRCPUCore *sc =3D SPAPR_CPU_CORE(OBJECT(dev)); + SpaprCpuCore *sc =3D SPAPR_CPU_CORE(OBJECT(dev)); int i; =20 for (i =3D 0; i < cc->nr_threads; i++) { @@ -3723,9 +3723,9 @@ static void spapr_core_unplug_request(HotplugHandler *hotplug_dev, DeviceState *d= ev, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); + SpaprMachineState *spapr =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); int index; - sPAPRDRConnector *drc; + SpaprDrc *drc; CPUCore *cc =3D CPU_CORE(dev); =20 if (!spapr_find_cpu_slot(MACHINE(hotplug_dev), cc->core_id, &index)) { @@ -3747,10 +3747,10 @@ void spapr_core_unplug_request(HotplugHandler *hotp= lug_dev, DeviceState *dev, spapr_hotplug_req_remove_by_index(drc); } =20 -int spapr_core_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr, +int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp) { - sPAPRCPUCore *core =3D SPAPR_CPU_CORE(drc->dev); + SpaprCpuCore *core =3D SPAPR_CPU_CORE(drc->dev); CPUState *cs =3D CPU(core->threads[0]); PowerPCCPU *cpu =3D POWERPC_CPU(cs); DeviceClass *dc =3D DEVICE_GET_CLASS(cs); @@ -3771,13 +3771,13 @@ int spapr_core_dt_populate(sPAPRDRConnector *drc, s= PAPRMachineState *spapr, static void spapr_core_plug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); + SpaprMachineState *spapr =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); MachineClass *mc =3D MACHINE_GET_CLASS(spapr); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); - sPAPRCPUCore *core =3D SPAPR_CPU_CORE(OBJECT(dev)); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprCpuCore *core =3D SPAPR_CPU_CORE(OBJECT(dev)); CPUCore *cc =3D CPU_CORE(dev); CPUState *cs; - sPAPRDRConnector *drc; + SpaprDrc *drc; Error *local_err =3D NULL; CPUArchId *core_slot; int index; @@ -3880,10 +3880,10 @@ out: error_propagate(errp, local_err); } =20 -int spapr_phb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr, +int spapr_phb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp) { - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(drc->dev); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(drc->dev); int intc_phandle; =20 intc_phandle =3D spapr_irq_get_phandle(spapr, spapr->fdt_blob, errp); @@ -3906,9 +3906,9 @@ int spapr_phb_dt_populate(sPAPRDRConnector *drc, sPAP= RMachineState *spapr, static void spapr_phb_pre_plug(HotplugHandler *hotplug_dev, DeviceState *d= ev, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(dev); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); + SpaprMachineState *spapr =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(dev); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); const unsigned windows_supported =3D spapr_phb_windows_supported(sphb); =20 if (dev->hotplugged && !smc->dr_phb_enabled) { @@ -3934,10 +3934,10 @@ static void spapr_phb_pre_plug(HotplugHandler *hotp= lug_dev, DeviceState *dev, static void spapr_phb_plug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(dev); - sPAPRDRConnector *drc; + SpaprMachineState *spapr =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(dev); + SpaprDrc *drc; bool hotplugged =3D spapr_drc_hotplugged(dev); Error *local_err =3D NULL; =20 @@ -3978,8 +3978,8 @@ static void spapr_phb_unplug(HotplugHandler *hotplug_= dev, DeviceState *dev) static void spapr_phb_unplug_request(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(dev); - sPAPRDRConnector *drc; + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(dev); + SpaprDrc *drc; =20 drc =3D spapr_drc_by_id(TYPE_SPAPR_DRC_PHB, sphb->index); assert(drc); @@ -4017,9 +4017,9 @@ static void spapr_machine_device_unplug(HotplugHandle= r *hotplug_dev, static void spapr_machine_device_unplug_request(HotplugHandler *hotplug_de= v, DeviceState *dev, Error **= errp) { - sPAPRMachineState *sms =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); + SpaprMachineState *sms =3D SPAPR_MACHINE(OBJECT(hotplug_dev)); MachineClass *mc =3D MACHINE_GET_CLASS(sms); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); =20 if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) { @@ -4126,7 +4126,7 @@ static const CPUArchIdList *spapr_possible_cpu_arch_i= ds(MachineState *machine) return machine->possible_cpus; } =20 -static void spapr_phb_placement(sPAPRMachineState *spapr, uint32_t index, +static void spapr_phb_placement(SpaprMachineState *spapr, uint32_t index, uint64_t *buid, hwaddr *pio, hwaddr *mmio32, hwaddr *mmio64, unsigned n_dma, uint32_t *liobns, Error **= errp) @@ -4178,14 +4178,14 @@ static void spapr_phb_placement(sPAPRMachineState *= spapr, uint32_t index, =20 static ICSState *spapr_ics_get(XICSFabric *dev, int irq) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(dev); + SpaprMachineState *spapr =3D SPAPR_MACHINE(dev); =20 return ics_valid_irq(spapr->ics, irq) ? spapr->ics : NULL; } =20 static void spapr_ics_resend(XICSFabric *dev) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(dev); + SpaprMachineState *spapr =3D SPAPR_MACHINE(dev); =20 ics_resend(spapr->ics); } @@ -4200,7 +4200,7 @@ static ICPState *spapr_icp_get(XICSFabric *xi, int vc= pu_id) static void spapr_pic_print_info(InterruptStatsProvider *obj, Monitor *mon) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); =20 spapr->irq->print_info(spapr, mon); } @@ -4212,7 +4212,7 @@ int spapr_get_vcpu_id(PowerPCCPU *cpu) =20 void spapr_set_vcpu_id(PowerPCCPU *cpu, int cpu_index, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); int vcpu_id; =20 vcpu_id =3D spapr_vcpu_id(spapr, cpu_index); @@ -4246,7 +4246,7 @@ PowerPCCPU *spapr_find_cpu(int vcpu_id) static void spapr_machine_class_init(ObjectClass *oc, void *data) { MachineClass *mc =3D MACHINE_CLASS(oc); - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(oc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(oc); FWPathProviderClass *fwc =3D FW_PATH_PROVIDER_CLASS(oc); NMIClass *nc =3D NMI_CLASS(oc); HotplugHandlerClass *hc =3D HOTPLUG_HANDLER_CLASS(oc); @@ -4327,10 +4327,10 @@ static const TypeInfo spapr_machine_info =3D { .name =3D TYPE_SPAPR_MACHINE, .parent =3D TYPE_MACHINE, .abstract =3D true, - .instance_size =3D sizeof(sPAPRMachineState), + .instance_size =3D sizeof(SpaprMachineState), .instance_init =3D spapr_instance_init, .instance_finalize =3D spapr_machine_finalizefn, - .class_size =3D sizeof(sPAPRMachineClass), + .class_size =3D sizeof(SpaprMachineClass), .class_init =3D spapr_machine_class_init, .interfaces =3D (InterfaceInfo[]) { { TYPE_FW_PATH_PROVIDER }, @@ -4380,7 +4380,7 @@ DEFINE_SPAPR_MACHINE(4_0, "4.0", true); */ static void spapr_machine_3_1_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); static GlobalProperty compat[] =3D { { TYPE_SPAPR_MACHINE, "host-model", "passthrough" }, { TYPE_SPAPR_MACHINE, "host-serial", "passthrough" }, @@ -4407,7 +4407,7 @@ DEFINE_SPAPR_MACHINE(3_1, "3.1", false); =20 static void spapr_machine_3_0_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); =20 spapr_machine_3_1_class_options(mc); compat_props_add(mc->compat_props, hw_compat_3_0, hw_compat_3_0_len); @@ -4423,7 +4423,7 @@ DEFINE_SPAPR_MACHINE(3_0, "3.0", false); */ static void spapr_machine_2_12_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); static GlobalProperty compat[] =3D { { TYPE_POWERPC_CPU, "pre-3.0-migration", "on" }, { TYPE_SPAPR_CPU_CORE, "pre-3.0-migration", "on" }, @@ -4445,7 +4445,7 @@ DEFINE_SPAPR_MACHINE(2_12, "2.12", false); =20 static void spapr_machine_2_12_sxxm_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); =20 spapr_machine_2_12_class_options(mc); smc->default_caps.caps[SPAPR_CAP_CFPC] =3D SPAPR_CAP_WORKAROUND; @@ -4461,7 +4461,7 @@ DEFINE_SPAPR_MACHINE(2_12_sxxm, "2.12-sxxm", false); =20 static void spapr_machine_2_11_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); =20 spapr_machine_2_12_class_options(mc); smc->default_caps.caps[SPAPR_CAP_HTM] =3D SPAPR_CAP_ON; @@ -4488,7 +4488,7 @@ DEFINE_SPAPR_MACHINE(2_10, "2.10", false); =20 static void spapr_machine_2_9_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); static GlobalProperty compat[] =3D { { TYPE_POWERPC_CPU, "pre-2.10-migration", "on" }, }; @@ -4525,7 +4525,7 @@ DEFINE_SPAPR_MACHINE(2_8, "2.8", false); * pseries-2.7 */ =20 -static void phb_placement_2_7(sPAPRMachineState *spapr, uint32_t index, +static void phb_placement_2_7(SpaprMachineState *spapr, uint32_t index, uint64_t *buid, hwaddr *pio, hwaddr *mmio32, hwaddr *mmio64, unsigned n_dma, uint32_t *liobns, Error **er= rp) @@ -4576,7 +4576,7 @@ static void phb_placement_2_7(sPAPRMachineState *spap= r, uint32_t index, =20 static void spapr_machine_2_7_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); static GlobalProperty compat[] =3D { { TYPE_SPAPR_PCI_HOST_BRIDGE, "mem_win_size", "0xf80000000", }, { TYPE_SPAPR_PCI_HOST_BRIDGE, "mem64_win_size", "0", }, @@ -4618,7 +4618,7 @@ DEFINE_SPAPR_MACHINE(2_6, "2.6", false); =20 static void spapr_machine_2_5_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); static GlobalProperty compat[] =3D { { "spapr-vlan", "use-rx-buffer-pools", "off" }, }; @@ -4637,7 +4637,7 @@ DEFINE_SPAPR_MACHINE(2_5, "2.5", false); =20 static void spapr_machine_2_4_class_options(MachineClass *mc) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + SpaprMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); =20 spapr_machine_2_5_class_options(mc); smc->dr_lmb_enabled =3D false; diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 3b1cfae6c7..edc5ed0e0c 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -35,7 +35,7 @@ =20 #include "hw/ppc/spapr.h" =20 -typedef struct sPAPRCapPossible { +typedef struct SpaprCapPossible { int num; /* size of vals array below */ const char *help; /* help text for vals */ /* @@ -47,9 +47,9 @@ typedef struct sPAPRCapPossible { * point is observed */ const char *vals[]; -} sPAPRCapPossible; +} SpaprCapPossible; =20 -typedef struct sPAPRCapabilityInfo { +typedef struct SpaprCapabilityInfo { const char *name; const char *description; int index; @@ -59,18 +59,18 @@ typedef struct sPAPRCapabilityInfo { ObjectPropertyAccessor *set; const char *type; /* Possible values if this is a custom string type */ - sPAPRCapPossible *possible; + SpaprCapPossible *possible; /* Make sure the virtual hardware can support this capability */ - void (*apply)(sPAPRMachineState *spapr, uint8_t val, Error **errp); - void (*cpu_apply)(sPAPRMachineState *spapr, PowerPCCPU *cpu, + void (*apply)(SpaprMachineState *spapr, uint8_t val, Error **errp); + void (*cpu_apply)(SpaprMachineState *spapr, PowerPCCPU *cpu, uint8_t val, Error **errp); -} sPAPRCapabilityInfo; +} SpaprCapabilityInfo; =20 static void spapr_cap_get_bool(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { - sPAPRCapabilityInfo *cap =3D opaque; - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprCapabilityInfo *cap =3D opaque; + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); bool value =3D spapr_get_cap(spapr, cap->index) =3D=3D SPAPR_CAP_ON; =20 visit_type_bool(v, name, &value, errp); @@ -79,8 +79,8 @@ static void spapr_cap_get_bool(Object *obj, Visitor *v, c= onst char *name, static void spapr_cap_set_bool(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { - sPAPRCapabilityInfo *cap =3D opaque; - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprCapabilityInfo *cap =3D opaque; + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); bool value; Error *local_err =3D NULL; =20 @@ -98,8 +98,8 @@ static void spapr_cap_set_bool(Object *obj, Visitor *v, c= onst char *name, static void spapr_cap_get_string(Object *obj, Visitor *v, const char *nam= e, void *opaque, Error **errp) { - sPAPRCapabilityInfo *cap =3D opaque; - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprCapabilityInfo *cap =3D opaque; + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); char *val =3D NULL; uint8_t value =3D spapr_get_cap(spapr, cap->index); =20 @@ -117,8 +117,8 @@ static void spapr_cap_get_string(Object *obj, Visitor = *v, const char *name, static void spapr_cap_set_string(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { - sPAPRCapabilityInfo *cap =3D opaque; - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprCapabilityInfo *cap =3D opaque; + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); Error *local_err =3D NULL; uint8_t i; char *val; @@ -150,8 +150,8 @@ out: static void spapr_cap_get_pagesize(Object *obj, Visitor *v, const char *na= me, void *opaque, Error **errp) { - sPAPRCapabilityInfo *cap =3D opaque; - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprCapabilityInfo *cap =3D opaque; + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); uint8_t val =3D spapr_get_cap(spapr, cap->index); uint64_t pagesize =3D (1ULL << val); =20 @@ -161,8 +161,8 @@ static void spapr_cap_get_pagesize(Object *obj, Visitor= *v, const char *name, static void spapr_cap_set_pagesize(Object *obj, Visitor *v, const char *na= me, void *opaque, Error **errp) { - sPAPRCapabilityInfo *cap =3D opaque; - sPAPRMachineState *spapr =3D SPAPR_MACHINE(obj); + SpaprCapabilityInfo *cap =3D opaque; + SpaprMachineState *spapr =3D SPAPR_MACHINE(obj); uint64_t pagesize; uint8_t val; Error *local_err =3D NULL; @@ -183,7 +183,7 @@ static void spapr_cap_set_pagesize(Object *obj, Visitor= *v, const char *name, spapr->eff.caps[cap->index] =3D val; } =20 -static void cap_htm_apply(sPAPRMachineState *spapr, uint8_t val, Error **e= rrp) +static void cap_htm_apply(SpaprMachineState *spapr, uint8_t val, Error **e= rrp) { if (!val) { /* TODO: We don't support disabling htm yet */ @@ -199,7 +199,7 @@ static void cap_htm_apply(sPAPRMachineState *spapr, uin= t8_t val, Error **errp) } } =20 -static void cap_vsx_apply(sPAPRMachineState *spapr, uint8_t val, Error **e= rrp) +static void cap_vsx_apply(SpaprMachineState *spapr, uint8_t val, Error **e= rrp) { PowerPCCPU *cpu =3D POWERPC_CPU(first_cpu); CPUPPCState *env =3D &cpu->env; @@ -216,7 +216,7 @@ static void cap_vsx_apply(sPAPRMachineState *spapr, uin= t8_t val, Error **errp) } } =20 -static void cap_dfp_apply(sPAPRMachineState *spapr, uint8_t val, Error **e= rrp) +static void cap_dfp_apply(SpaprMachineState *spapr, uint8_t val, Error **e= rrp) { PowerPCCPU *cpu =3D POWERPC_CPU(first_cpu); CPUPPCState *env =3D &cpu->env; @@ -230,14 +230,14 @@ static void cap_dfp_apply(sPAPRMachineState *spapr, u= int8_t val, Error **errp) } } =20 -sPAPRCapPossible cap_cfpc_possible =3D { +SpaprCapPossible cap_cfpc_possible =3D { .num =3D 3, .vals =3D {"broken", "workaround", "fixed"}, .help =3D "broken - no protection, workaround - workaround available," " fixed - fixed in hardware", }; =20 -static void cap_safe_cache_apply(sPAPRMachineState *spapr, uint8_t val, +static void cap_safe_cache_apply(SpaprMachineState *spapr, uint8_t val, Error **errp) { Error *local_err =3D NULL; @@ -258,14 +258,14 @@ static void cap_safe_cache_apply(sPAPRMachineState *s= papr, uint8_t val, warn_report_err(local_err); } =20 -sPAPRCapPossible cap_sbbc_possible =3D { +SpaprCapPossible cap_sbbc_possible =3D { .num =3D 3, .vals =3D {"broken", "workaround", "fixed"}, .help =3D "broken - no protection, workaround - workaround available," " fixed - fixed in hardware", }; =20 -static void cap_safe_bounds_check_apply(sPAPRMachineState *spapr, uint8_t = val, +static void cap_safe_bounds_check_apply(SpaprMachineState *spapr, uint8_t = val, Error **errp) { Error *local_err =3D NULL; @@ -286,7 +286,7 @@ static void cap_safe_bounds_check_apply(sPAPRMachineSta= te *spapr, uint8_t val, warn_report_err(local_err); } =20 -sPAPRCapPossible cap_ibs_possible =3D { +SpaprCapPossible cap_ibs_possible =3D { .num =3D 5, /* Note workaround only maintained for compatibility */ .vals =3D {"broken", "workaround", "fixed-ibs", "fixed-ccd", "fixed-na= "}, @@ -296,7 +296,7 @@ sPAPRCapPossible cap_ibs_possible =3D { " fixed-na - fixed in hardware (no longer applicable)", }; =20 -static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, +static void cap_safe_indirect_branch_apply(SpaprMachineState *spapr, uint8_t val, Error **errp) { Error *local_err =3D NULL; @@ -320,7 +320,7 @@ static void cap_safe_indirect_branch_apply(sPAPRMachine= State *spapr, =20 #define VALUE_DESC_TRISTATE " (broken, workaround, fixed)" =20 -void spapr_check_pagesize(sPAPRMachineState *spapr, hwaddr pagesize, +void spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize, Error **errp) { hwaddr maxpagesize =3D (1ULL << spapr->eff.caps[SPAPR_CAP_HPT_MAXPAGES= IZE]); @@ -337,7 +337,7 @@ void spapr_check_pagesize(sPAPRMachineState *spapr, hwa= ddr pagesize, } } =20 -static void cap_hpt_maxpagesize_apply(sPAPRMachineState *spapr, +static void cap_hpt_maxpagesize_apply(SpaprMachineState *spapr, uint8_t val, Error **errp) { if (val < 12) { @@ -374,7 +374,7 @@ static bool spapr_pagesize_cb(void *opaque, uint32_t se= g_pshift, return true; } =20 -static void cap_hpt_maxpagesize_cpu_apply(sPAPRMachineState *spapr, +static void cap_hpt_maxpagesize_cpu_apply(SpaprMachineState *spapr, PowerPCCPU *cpu, uint8_t val, Error **errp) { @@ -383,7 +383,7 @@ static void cap_hpt_maxpagesize_cpu_apply(sPAPRMachineS= tate *spapr, ppc_hash64_filter_pagesizes(cpu, spapr_pagesize_cb, &maxshift); } =20 -static void cap_nested_kvm_hv_apply(sPAPRMachineState *spapr, +static void cap_nested_kvm_hv_apply(SpaprMachineState *spapr, uint8_t val, Error **errp) { if (!val) { @@ -405,7 +405,7 @@ static void cap_nested_kvm_hv_apply(sPAPRMachineState *= spapr, } } =20 -static void cap_large_decr_apply(sPAPRMachineState *spapr, +static void cap_large_decr_apply(SpaprMachineState *spapr, uint8_t val, Error **errp) { PowerPCCPU *cpu =3D POWERPC_CPU(first_cpu); @@ -436,7 +436,7 @@ static void cap_large_decr_apply(sPAPRMachineState *spa= pr, } } =20 -static void cap_large_decr_cpu_apply(sPAPRMachineState *spapr, +static void cap_large_decr_cpu_apply(SpaprMachineState *spapr, PowerPCCPU *cpu, uint8_t val, Error **errp) { @@ -458,7 +458,7 @@ static void cap_large_decr_cpu_apply(sPAPRMachineState = *spapr, ppc_store_lpcr(cpu, lpcr); } =20 -static void cap_ccf_assist_apply(sPAPRMachineState *spapr, uint8_t val, +static void cap_ccf_assist_apply(SpaprMachineState *spapr, uint8_t val, Error **errp) { uint8_t kvm_val =3D kvmppc_get_cap_count_cache_flush_assist(); @@ -473,7 +473,7 @@ static void cap_ccf_assist_apply(sPAPRMachineState *spa= pr, uint8_t val, } } =20 -sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D { +SpaprCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D { [SPAPR_CAP_HTM] =3D { .name =3D "htm", .description =3D "Allow Hardware Transactional Memory (HTM)", @@ -573,11 +573,11 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = =3D { }, }; =20 -static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, +static SpaprCapabilities default_caps_with_cpu(SpaprMachineState *spapr, const char *cputype) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); - sPAPRCapabilities caps; + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); + SpaprCapabilities caps; =20 caps =3D smc->default_caps; =20 @@ -622,7 +622,7 @@ static sPAPRCapabilities default_caps_with_cpu(sPAPRMac= hineState *spapr, =20 int spapr_caps_pre_load(void *opaque) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 /* Set to default so we can tell if this came in with the migration */ spapr->mig =3D spapr->def; @@ -631,7 +631,7 @@ int spapr_caps_pre_load(void *opaque) =20 int spapr_caps_pre_save(void *opaque) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 spapr->mig =3D spapr->eff; return 0; @@ -641,12 +641,12 @@ int spapr_caps_pre_save(void *opaque) * caps specific one. Otherwise it wouldn't be called when the source * caps are all defaults, which could still conflict with overridden * caps on the destination */ -int spapr_caps_post_migration(sPAPRMachineState *spapr) +int spapr_caps_post_migration(SpaprMachineState *spapr) { int i; bool ok =3D true; - sPAPRCapabilities dstcaps =3D spapr->eff; - sPAPRCapabilities srccaps; + SpaprCapabilities dstcaps =3D spapr->eff; + SpaprCapabilities srccaps; =20 srccaps =3D default_caps_with_cpu(spapr, MACHINE(spapr)->cpu_type); for (i =3D 0; i < SPAPR_CAP_NUM; i++) { @@ -657,7 +657,7 @@ int spapr_caps_post_migration(sPAPRMachineState *spapr) } =20 for (i =3D 0; i < SPAPR_CAP_NUM; i++) { - sPAPRCapabilityInfo *info =3D &capability_table[i]; + SpaprCapabilityInfo *info =3D &capability_table[i]; =20 if (srccaps.caps[i] > dstcaps.caps[i]) { error_report("cap-%s higher level (%d) in incoming stream than= on destination (%d)", @@ -678,7 +678,7 @@ int spapr_caps_post_migration(sPAPRMachineState *spapr) #define SPAPR_CAP_MIG_STATE(sname, cap) \ static bool spapr_cap_##sname##_needed(void *opaque) \ { \ - sPAPRMachineState *spapr =3D opaque; \ + SpaprMachineState *spapr =3D opaque; \ \ return spapr->cmd_line_caps[cap] && \ (spapr->eff.caps[cap] !=3D \ @@ -692,7 +692,7 @@ const VMStateDescription vmstate_spapr_cap_##sname =3D = { \ .needed =3D spapr_cap_##sname##_needed, \ .fields =3D (VMStateField[]) { \ VMSTATE_UINT8(mig.caps[cap], \ - sPAPRMachineState), \ + SpaprMachineState), \ VMSTATE_END_OF_LIST() \ }, \ } @@ -707,9 +707,9 @@ SPAPR_CAP_MIG_STATE(nested_kvm_hv, SPAPR_CAP_NESTED_KVM= _HV); SPAPR_CAP_MIG_STATE(large_decr, SPAPR_CAP_LARGE_DECREMENTER); SPAPR_CAP_MIG_STATE(ccf_assist, SPAPR_CAP_CCF_ASSIST); =20 -void spapr_caps_init(sPAPRMachineState *spapr) +void spapr_caps_init(SpaprMachineState *spapr) { - sPAPRCapabilities default_caps; + SpaprCapabilities default_caps; int i; =20 /* Compute the actual set of caps we should run with */ @@ -725,12 +725,12 @@ void spapr_caps_init(sPAPRMachineState *spapr) } } =20 -void spapr_caps_apply(sPAPRMachineState *spapr) +void spapr_caps_apply(SpaprMachineState *spapr) { int i; =20 for (i =3D 0; i < SPAPR_CAP_NUM; i++) { - sPAPRCapabilityInfo *info =3D &capability_table[i]; + SpaprCapabilityInfo *info =3D &capability_table[i]; =20 /* * If the apply function can't set the desired level and thinks it= 's @@ -740,12 +740,12 @@ void spapr_caps_apply(sPAPRMachineState *spapr) } } =20 -void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu) +void spapr_caps_cpu_apply(SpaprMachineState *spapr, PowerPCCPU *cpu) { int i; =20 for (i =3D 0; i < SPAPR_CAP_NUM; i++) { - sPAPRCapabilityInfo *info =3D &capability_table[i]; + SpaprCapabilityInfo *info =3D &capability_table[i]; =20 /* * If the apply function can't set the desired level and thinks it= 's @@ -757,14 +757,14 @@ void spapr_caps_cpu_apply(sPAPRMachineState *spapr, P= owerPCCPU *cpu) } } =20 -void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp) +void spapr_caps_add_properties(SpaprMachineClass *smc, Error **errp) { Error *local_err =3D NULL; ObjectClass *klass =3D OBJECT_CLASS(smc); int i; =20 for (i =3D 0; i < ARRAY_SIZE(capability_table); i++) { - sPAPRCapabilityInfo *cap =3D &capability_table[i]; + SpaprCapabilityInfo *cap =3D &capability_table[i]; const char *name =3D g_strdup_printf("cap-%s", cap->name); char *desc; =20 diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index ef6cbb9c29..f04e06cdf6 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -28,7 +28,7 @@ static void spapr_cpu_reset(void *opaque) CPUState *cs =3D CPU(cpu); CPUPPCState *env =3D &cpu->env; PowerPCCPUClass *pcc =3D POWERPC_CPU_GET_CLASS(cpu); - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); target_ulong lpcr; =20 cpu_reset(cs); @@ -116,7 +116,7 @@ const char *spapr_get_cpu_core_type(const char *cpu_typ= e) =20 static bool slb_shadow_needed(void *opaque) { - sPAPRCPUState *spapr_cpu =3D opaque; + SpaprCpuState *spapr_cpu =3D opaque; =20 return spapr_cpu->slb_shadow_addr !=3D 0; } @@ -127,15 +127,15 @@ static const VMStateDescription vmstate_spapr_cpu_slb= _shadow =3D { .minimum_version_id =3D 1, .needed =3D slb_shadow_needed, .fields =3D (VMStateField[]) { - VMSTATE_UINT64(slb_shadow_addr, sPAPRCPUState), - VMSTATE_UINT64(slb_shadow_size, sPAPRCPUState), + VMSTATE_UINT64(slb_shadow_addr, SpaprCpuState), + VMSTATE_UINT64(slb_shadow_size, SpaprCpuState), VMSTATE_END_OF_LIST() } }; =20 static bool dtl_needed(void *opaque) { - sPAPRCPUState *spapr_cpu =3D opaque; + SpaprCpuState *spapr_cpu =3D opaque; =20 return spapr_cpu->dtl_addr !=3D 0; } @@ -146,15 +146,15 @@ static const VMStateDescription vmstate_spapr_cpu_dtl= =3D { .minimum_version_id =3D 1, .needed =3D dtl_needed, .fields =3D (VMStateField[]) { - VMSTATE_UINT64(dtl_addr, sPAPRCPUState), - VMSTATE_UINT64(dtl_size, sPAPRCPUState), + VMSTATE_UINT64(dtl_addr, SpaprCpuState), + VMSTATE_UINT64(dtl_size, SpaprCpuState), VMSTATE_END_OF_LIST() } }; =20 static bool vpa_needed(void *opaque) { - sPAPRCPUState *spapr_cpu =3D opaque; + SpaprCpuState *spapr_cpu =3D opaque; =20 return spapr_cpu->vpa_addr !=3D 0; } @@ -165,7 +165,7 @@ static const VMStateDescription vmstate_spapr_cpu_vpa = =3D { .minimum_version_id =3D 1, .needed =3D vpa_needed, .fields =3D (VMStateField[]) { - VMSTATE_UINT64(vpa_addr, sPAPRCPUState), + VMSTATE_UINT64(vpa_addr, SpaprCpuState), VMSTATE_END_OF_LIST() }, .subsections =3D (const VMStateDescription * []) { @@ -188,7 +188,7 @@ static const VMStateDescription vmstate_spapr_cpu_state= =3D { } }; =20 -static void spapr_unrealize_vcpu(PowerPCCPU *cpu, sPAPRCPUCore *sc) +static void spapr_unrealize_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc) { if (!sc->pre_3_0_migration) { vmstate_unregister(NULL, &vmstate_spapr_cpu_state, cpu->machine_da= ta); @@ -206,7 +206,7 @@ static void spapr_unrealize_vcpu(PowerPCCPU *cpu, sPAPR= CPUCore *sc) =20 static void spapr_cpu_core_unrealize(DeviceState *dev, Error **errp) { - sPAPRCPUCore *sc =3D SPAPR_CPU_CORE(OBJECT(dev)); + SpaprCpuCore *sc =3D SPAPR_CPU_CORE(OBJECT(dev)); CPUCore *cc =3D CPU_CORE(dev); int i; =20 @@ -216,8 +216,8 @@ static void spapr_cpu_core_unrealize(DeviceState *dev, = Error **errp) g_free(sc->threads); } =20 -static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, - sPAPRCPUCore *sc, Error **errp) +static void spapr_realize_vcpu(PowerPCCPU *cpu, SpaprMachineState *spapr, + SpaprCpuCore *sc, Error **errp) { CPUPPCState *env =3D &cpu->env; CPUState *cs =3D CPU(cpu); @@ -256,9 +256,9 @@ error: error_propagate(errp, local_err); } =20 -static PowerPCCPU *spapr_create_vcpu(sPAPRCPUCore *sc, int i, Error **errp) +static PowerPCCPU *spapr_create_vcpu(SpaprCpuCore *sc, int i, Error **errp) { - sPAPRCPUCoreClass *scc =3D SPAPR_CPU_CORE_GET_CLASS(sc); + SpaprCpuCoreClass *scc =3D SPAPR_CPU_CORE_GET_CLASS(sc); CPUCore *cc =3D CPU_CORE(sc); Object *obj; char *id; @@ -285,7 +285,7 @@ static PowerPCCPU *spapr_create_vcpu(sPAPRCPUCore *sc, = int i, Error **errp) goto err; } =20 - cpu->machine_data =3D g_new0(sPAPRCPUState, 1); + cpu->machine_data =3D g_new0(SpaprCpuState, 1); =20 object_unref(obj); return cpu; @@ -296,9 +296,9 @@ err: return NULL; } =20 -static void spapr_delete_vcpu(PowerPCCPU *cpu, sPAPRCPUCore *sc) +static void spapr_delete_vcpu(PowerPCCPU *cpu, SpaprCpuCore *sc) { - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); =20 cpu->machine_data =3D NULL; g_free(spapr_cpu); @@ -310,10 +310,10 @@ static void spapr_cpu_core_realize(DeviceState *dev, = Error **errp) /* We don't use SPAPR_MACHINE() in order to exit gracefully if the user * tries to add a sPAPR CPU core to a non-pseries machine. */ - sPAPRMachineState *spapr =3D - (sPAPRMachineState *) object_dynamic_cast(qdev_get_machine(), + SpaprMachineState *spapr =3D + (SpaprMachineState *) object_dynamic_cast(qdev_get_machine(), TYPE_SPAPR_MACHINE); - sPAPRCPUCore *sc =3D SPAPR_CPU_CORE(OBJECT(dev)); + SpaprCpuCore *sc =3D SPAPR_CPU_CORE(OBJECT(dev)); CPUCore *cc =3D CPU_CORE(OBJECT(dev)); Error *local_err =3D NULL; int i, j; @@ -352,8 +352,8 @@ err: } =20 static Property spapr_cpu_core_properties[] =3D { - DEFINE_PROP_INT32("node-id", sPAPRCPUCore, node_id, CPU_UNSET_NUMA_NOD= E_ID), - DEFINE_PROP_BOOL("pre-3.0-migration", sPAPRCPUCore, pre_3_0_migration, + DEFINE_PROP_INT32("node-id", SpaprCpuCore, node_id, CPU_UNSET_NUMA_NOD= E_ID), + DEFINE_PROP_BOOL("pre-3.0-migration", SpaprCpuCore, pre_3_0_migration, false), DEFINE_PROP_END_OF_LIST() }; @@ -361,7 +361,7 @@ static Property spapr_cpu_core_properties[] =3D { static void spapr_cpu_core_class_init(ObjectClass *oc, void *data) { DeviceClass *dc =3D DEVICE_CLASS(oc); - sPAPRCPUCoreClass *scc =3D SPAPR_CPU_CORE_CLASS(oc); + SpaprCpuCoreClass *scc =3D SPAPR_CPU_CORE_CLASS(oc); =20 dc->realize =3D spapr_cpu_core_realize; dc->unrealize =3D spapr_cpu_core_unrealize; @@ -382,8 +382,8 @@ static const TypeInfo spapr_cpu_core_type_infos[] =3D { .name =3D TYPE_SPAPR_CPU_CORE, .parent =3D TYPE_CPU_CORE, .abstract =3D true, - .instance_size =3D sizeof(sPAPRCPUCore), - .class_size =3D sizeof(sPAPRCPUCoreClass), + .instance_size =3D sizeof(SpaprCpuCore), + .class_size =3D sizeof(SpaprCpuCoreClass), }, DEFINE_SPAPR_CPU_CORE_TYPE("970_v2.2"), DEFINE_SPAPR_CPU_CORE_TYPE("970mp_v1.0"), diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 2943cf47d4..597f236b9c 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -29,16 +29,16 @@ #define DRC_INDEX_TYPE_SHIFT 28 #define DRC_INDEX_ID_MASK ((1ULL << DRC_INDEX_TYPE_SHIFT) - 1) =20 -sPAPRDRConnectorType spapr_drc_type(sPAPRDRConnector *drc) +SpaprDrcType spapr_drc_type(SpaprDrc *drc) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 return 1 << drck->typeshift; } =20 -uint32_t spapr_drc_index(sPAPRDRConnector *drc) +uint32_t spapr_drc_index(SpaprDrc *drc) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 /* no set format for a drc index: it only needs to be globally * unique. this is how we encode the DRC type on bare-metal @@ -48,7 +48,7 @@ uint32_t spapr_drc_index(sPAPRDRConnector *drc) | (drc->id & DRC_INDEX_ID_MASK); } =20 -static uint32_t drc_isolate_physical(sPAPRDRConnector *drc) +static uint32_t drc_isolate_physical(SpaprDrc *drc) { switch (drc->state) { case SPAPR_DRC_STATE_PHYSICAL_POWERON: @@ -72,7 +72,7 @@ static uint32_t drc_isolate_physical(sPAPRDRConnector *dr= c) return RTAS_OUT_SUCCESS; } =20 -static uint32_t drc_unisolate_physical(sPAPRDRConnector *drc) +static uint32_t drc_unisolate_physical(SpaprDrc *drc) { switch (drc->state) { case SPAPR_DRC_STATE_PHYSICAL_UNISOLATE: @@ -99,7 +99,7 @@ static uint32_t drc_unisolate_physical(sPAPRDRConnector *= drc) return RTAS_OUT_SUCCESS; } =20 -static uint32_t drc_isolate_logical(sPAPRDRConnector *drc) +static uint32_t drc_isolate_logical(SpaprDrc *drc) { switch (drc->state) { case SPAPR_DRC_STATE_LOGICAL_AVAILABLE: @@ -146,7 +146,7 @@ static uint32_t drc_isolate_logical(sPAPRDRConnector *d= rc) return RTAS_OUT_SUCCESS; } =20 -static uint32_t drc_unisolate_logical(sPAPRDRConnector *drc) +static uint32_t drc_unisolate_logical(SpaprDrc *drc) { switch (drc->state) { case SPAPR_DRC_STATE_LOGICAL_UNISOLATE: @@ -170,7 +170,7 @@ static uint32_t drc_unisolate_logical(sPAPRDRConnector = *drc) return RTAS_OUT_SUCCESS; } =20 -static uint32_t drc_set_usable(sPAPRDRConnector *drc) +static uint32_t drc_set_usable(SpaprDrc *drc) { switch (drc->state) { case SPAPR_DRC_STATE_LOGICAL_AVAILABLE: @@ -202,7 +202,7 @@ static uint32_t drc_set_usable(sPAPRDRConnector *drc) return RTAS_OUT_SUCCESS; } =20 -static uint32_t drc_set_unusable(sPAPRDRConnector *drc) +static uint32_t drc_set_unusable(SpaprDrc *drc) { switch (drc->state) { case SPAPR_DRC_STATE_LOGICAL_UNUSABLE: @@ -226,9 +226,9 @@ static uint32_t drc_set_unusable(sPAPRDRConnector *drc) return RTAS_OUT_SUCCESS; } =20 -static const char *spapr_drc_name(sPAPRDRConnector *drc) +static const char *spapr_drc_name(SpaprDrc *drc) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 /* human-readable name for a DRC to encode into the DT * description. this is mainly only used within a guest in place @@ -261,7 +261,7 @@ static const char *spapr_drc_name(sPAPRDRConnector *drc) * based on the current allocation/indicator/power states * for the DR connector. */ -static sPAPRDREntitySense physical_entity_sense(sPAPRDRConnector *drc) +static SpaprDREntitySense physical_entity_sense(SpaprDrc *drc) { /* this assumes all PCI devices are assigned to a 'live insertion' * power domain, where QEMU manages power state automatically as @@ -272,7 +272,7 @@ static sPAPRDREntitySense physical_entity_sense(sPAPRDR= Connector *drc) : SPAPR_DR_ENTITY_SENSE_EMPTY; } =20 -static sPAPRDREntitySense logical_entity_sense(sPAPRDRConnector *drc) +static SpaprDREntitySense logical_entity_sense(SpaprDrc *drc) { switch (drc->state) { case SPAPR_DRC_STATE_LOGICAL_UNUSABLE: @@ -290,7 +290,7 @@ static sPAPRDREntitySense logical_entity_sense(sPAPRDRC= onnector *drc) static void prop_get_index(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { - sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(obj); + SpaprDrc *drc =3D SPAPR_DR_CONNECTOR(obj); uint32_t value =3D spapr_drc_index(drc); visit_type_uint32(v, name, &value, errp); } @@ -298,7 +298,7 @@ static void prop_get_index(Object *obj, Visitor *v, con= st char *name, static void prop_get_fdt(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { - sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(obj); + SpaprDrc *drc =3D SPAPR_DR_CONNECTOR(obj); QNull *null =3D NULL; Error *err =3D NULL; int fdt_offset_next, fdt_offset, fdt_depth; @@ -374,7 +374,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, const= char *name, } while (fdt_depth !=3D 0); } =20 -void spapr_drc_attach(sPAPRDRConnector *drc, DeviceState *d, Error **errp) +void spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp) { trace_spapr_drc_attach(spapr_drc_index(drc)); =20 @@ -393,9 +393,9 @@ void spapr_drc_attach(sPAPRDRConnector *drc, DeviceStat= e *d, Error **errp) NULL, 0, NULL); } =20 -static void spapr_drc_release(sPAPRDRConnector *drc) +static void spapr_drc_release(SpaprDrc *drc) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 drck->release(drc->dev); =20 @@ -407,9 +407,9 @@ static void spapr_drc_release(sPAPRDRConnector *drc) drc->dev =3D NULL; } =20 -void spapr_drc_detach(sPAPRDRConnector *drc) +void spapr_drc_detach(SpaprDrc *drc) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 trace_spapr_drc_detach(spapr_drc_index(drc)); =20 @@ -425,9 +425,9 @@ void spapr_drc_detach(sPAPRDRConnector *drc) spapr_drc_release(drc); } =20 -void spapr_drc_reset(sPAPRDRConnector *drc) +void spapr_drc_reset(SpaprDrc *drc) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 trace_spapr_drc_reset(spapr_drc_index(drc)); =20 @@ -456,8 +456,8 @@ void spapr_drc_reset(sPAPRDRConnector *drc) =20 bool spapr_drc_needed(void *opaque) { - sPAPRDRConnector *drc =3D (sPAPRDRConnector *)opaque; - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + SpaprDrc *drc =3D (SpaprDrc *)opaque; + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 /* If no dev is plugged in there is no need to migrate the DRC state */ if (!drc->dev) { @@ -477,14 +477,14 @@ static const VMStateDescription vmstate_spapr_drc =3D= { .minimum_version_id =3D 1, .needed =3D spapr_drc_needed, .fields =3D (VMStateField []) { - VMSTATE_UINT32(state, sPAPRDRConnector), + VMSTATE_UINT32(state, SpaprDrc), VMSTATE_END_OF_LIST() } }; =20 static void realize(DeviceState *d, Error **errp) { - sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(d); + SpaprDrc *drc =3D SPAPR_DR_CONNECTOR(d); Object *root_container; gchar *link_name; gchar *child_name; @@ -517,7 +517,7 @@ static void realize(DeviceState *d, Error **errp) =20 static void unrealize(DeviceState *d, Error **errp) { - sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(d); + SpaprDrc *drc =3D SPAPR_DR_CONNECTOR(d); Object *root_container; gchar *name; =20 @@ -529,10 +529,10 @@ static void unrealize(DeviceState *d, Error **errp) g_free(name); } =20 -sPAPRDRConnector *spapr_dr_connector_new(Object *owner, const char *type, +SpaprDrc *spapr_dr_connector_new(Object *owner, const char *type, uint32_t id) { - sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(object_new(type)); + SpaprDrc *drc =3D SPAPR_DR_CONNECTOR(object_new(type)); char *prop_name; =20 drc->id =3D id; @@ -549,8 +549,8 @@ sPAPRDRConnector *spapr_dr_connector_new(Object *owner,= const char *type, =20 static void spapr_dr_connector_instance_init(Object *obj) { - sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(obj); - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); + SpaprDrc *drc =3D SPAPR_DR_CONNECTOR(obj); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); =20 object_property_add_uint32_ptr(obj, "id", &drc->id, NULL); object_property_add(obj, "index", "uint32", prop_get_index, @@ -574,8 +574,8 @@ static void spapr_dr_connector_class_init(ObjectClass *= k, void *data) =20 static bool drc_physical_needed(void *opaque) { - sPAPRDRCPhysical *drcp =3D (sPAPRDRCPhysical *)opaque; - sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(drcp); + SpaprDrcPhysical *drcp =3D (SpaprDrcPhysical *)opaque; + SpaprDrc *drc =3D SPAPR_DR_CONNECTOR(drcp); =20 if ((drc->dev && (drcp->dr_indicator =3D=3D SPAPR_DR_INDICATOR_ACTIVE)) || (!drc->dev && (drcp->dr_indicator =3D=3D SPAPR_DR_INDICATOR_INA= CTIVE))) { @@ -590,15 +590,15 @@ static const VMStateDescription vmstate_spapr_drc_phy= sical =3D { .minimum_version_id =3D 1, .needed =3D drc_physical_needed, .fields =3D (VMStateField []) { - VMSTATE_UINT32(dr_indicator, sPAPRDRCPhysical), + VMSTATE_UINT32(dr_indicator, SpaprDrcPhysical), VMSTATE_END_OF_LIST() } }; =20 static void drc_physical_reset(void *opaque) { - sPAPRDRConnector *drc =3D SPAPR_DR_CONNECTOR(opaque); - sPAPRDRCPhysical *drcp =3D SPAPR_DRC_PHYSICAL(drc); + SpaprDrc *drc =3D SPAPR_DR_CONNECTOR(opaque); + SpaprDrcPhysical *drcp =3D SPAPR_DRC_PHYSICAL(drc); =20 if (drc->dev) { drcp->dr_indicator =3D SPAPR_DR_INDICATOR_ACTIVE; @@ -609,7 +609,7 @@ static void drc_physical_reset(void *opaque) =20 static void realize_physical(DeviceState *d, Error **errp) { - sPAPRDRCPhysical *drcp =3D SPAPR_DRC_PHYSICAL(d); + SpaprDrcPhysical *drcp =3D SPAPR_DRC_PHYSICAL(d); Error *local_err =3D NULL; =20 realize(d, &local_err); @@ -625,7 +625,7 @@ static void realize_physical(DeviceState *d, Error **er= rp) =20 static void unrealize_physical(DeviceState *d, Error **errp) { - sPAPRDRCPhysical *drcp =3D SPAPR_DRC_PHYSICAL(d); + SpaprDrcPhysical *drcp =3D SPAPR_DRC_PHYSICAL(d); Error *local_err =3D NULL; =20 unrealize(d, &local_err); @@ -641,7 +641,7 @@ static void unrealize_physical(DeviceState *d, Error **= errp) static void spapr_drc_physical_class_init(ObjectClass *k, void *data) { DeviceClass *dk =3D DEVICE_CLASS(k); - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); =20 dk->realize =3D realize_physical; dk->unrealize =3D unrealize_physical; @@ -654,7 +654,7 @@ static void spapr_drc_physical_class_init(ObjectClass *= k, void *data) =20 static void spapr_drc_logical_class_init(ObjectClass *k, void *data) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); =20 drck->dr_entity_sense =3D logical_entity_sense; drck->isolate =3D drc_isolate_logical; @@ -665,7 +665,7 @@ static void spapr_drc_logical_class_init(ObjectClass *k= , void *data) =20 static void spapr_drc_cpu_class_init(ObjectClass *k, void *data) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); =20 drck->typeshift =3D SPAPR_DR_CONNECTOR_TYPE_SHIFT_CPU; drck->typename =3D "CPU"; @@ -676,7 +676,7 @@ static void spapr_drc_cpu_class_init(ObjectClass *k, vo= id *data) =20 static void spapr_drc_pci_class_init(ObjectClass *k, void *data) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); =20 drck->typeshift =3D SPAPR_DR_CONNECTOR_TYPE_SHIFT_PCI; drck->typename =3D "28"; @@ -687,7 +687,7 @@ static void spapr_drc_pci_class_init(ObjectClass *k, vo= id *data) =20 static void spapr_drc_lmb_class_init(ObjectClass *k, void *data) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); =20 drck->typeshift =3D SPAPR_DR_CONNECTOR_TYPE_SHIFT_LMB; drck->typename =3D "MEM"; @@ -698,7 +698,7 @@ static void spapr_drc_lmb_class_init(ObjectClass *k, vo= id *data) =20 static void spapr_drc_phb_class_init(ObjectClass *k, void *data) { - sPAPRDRConnectorClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(k); =20 drck->typeshift =3D SPAPR_DR_CONNECTOR_TYPE_SHIFT_PHB; drck->typename =3D "PHB"; @@ -710,9 +710,9 @@ static void spapr_drc_phb_class_init(ObjectClass *k, vo= id *data) static const TypeInfo spapr_dr_connector_info =3D { .name =3D TYPE_SPAPR_DR_CONNECTOR, .parent =3D TYPE_DEVICE, - .instance_size =3D sizeof(sPAPRDRConnector), + .instance_size =3D sizeof(SpaprDrc), .instance_init =3D spapr_dr_connector_instance_init, - .class_size =3D sizeof(sPAPRDRConnectorClass), + .class_size =3D sizeof(SpaprDrcClass), .class_init =3D spapr_dr_connector_class_init, .abstract =3D true, }; @@ -720,7 +720,7 @@ static const TypeInfo spapr_dr_connector_info =3D { static const TypeInfo spapr_drc_physical_info =3D { .name =3D TYPE_SPAPR_DRC_PHYSICAL, .parent =3D TYPE_SPAPR_DR_CONNECTOR, - .instance_size =3D sizeof(sPAPRDRCPhysical), + .instance_size =3D sizeof(SpaprDrcPhysical), .class_init =3D spapr_drc_physical_class_init, .abstract =3D true, }; @@ -753,13 +753,13 @@ static const TypeInfo spapr_drc_lmb_info =3D { static const TypeInfo spapr_drc_phb_info =3D { .name =3D TYPE_SPAPR_DRC_PHB, .parent =3D TYPE_SPAPR_DRC_LOGICAL, - .instance_size =3D sizeof(sPAPRDRConnector), + .instance_size =3D sizeof(SpaprDrc), .class_init =3D spapr_drc_phb_class_init, }; =20 /* helper functions for external users */ =20 -sPAPRDRConnector *spapr_drc_by_index(uint32_t index) +SpaprDrc *spapr_drc_by_index(uint32_t index) { Object *obj; gchar *name; @@ -771,9 +771,9 @@ sPAPRDRConnector *spapr_drc_by_index(uint32_t index) return !obj ? NULL : SPAPR_DR_CONNECTOR(obj); } =20 -sPAPRDRConnector *spapr_drc_by_id(const char *type, uint32_t id) +SpaprDrc *spapr_drc_by_id(const char *type, uint32_t id) { - sPAPRDRConnectorClass *drck + SpaprDrcClass *drck =3D SPAPR_DR_CONNECTOR_CLASS(object_class_by_name(type)); =20 return spapr_drc_by_index(drck->typeshift << DRC_INDEX_TYPE_SHIFT @@ -787,7 +787,7 @@ sPAPRDRConnector *spapr_drc_by_id(const char *type, uin= t32_t id) * @path: path in the DT to generate properties * @owner: parent Object/DeviceState for which to generate DRC * descriptions for - * @drc_type_mask: mask of sPAPRDRConnectorType values corresponding + * @drc_type_mask: mask of SpaprDrcType values corresponding * to the types of DRCs to generate entries for * * generate OF properties to describe DRC topology/indices to guests @@ -826,8 +826,8 @@ int spapr_drc_populate_dt(void *fdt, int fdt_offset, Ob= ject *owner, object_property_iter_init(&iter, root_container); while ((prop =3D object_property_iter_next(&iter))) { Object *obj; - sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; + SpaprDrc *drc; + SpaprDrcClass *drck; uint32_t drc_index, drc_power_domain; =20 if (!strstart(prop->type, "link<", NULL)) { @@ -918,8 +918,8 @@ out: =20 static uint32_t rtas_set_isolation_state(uint32_t idx, uint32_t state) { - sPAPRDRConnector *drc =3D spapr_drc_by_index(idx); - sPAPRDRConnectorClass *drck; + SpaprDrc *drc =3D spapr_drc_by_index(idx); + SpaprDrcClass *drck; =20 if (!drc) { return RTAS_OUT_NO_SUCH_INDICATOR; @@ -943,7 +943,7 @@ static uint32_t rtas_set_isolation_state(uint32_t idx, = uint32_t state) =20 static uint32_t rtas_set_allocation_state(uint32_t idx, uint32_t state) { - sPAPRDRConnector *drc =3D spapr_drc_by_index(idx); + SpaprDrc *drc =3D spapr_drc_by_index(idx); =20 if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_LOGICAL))= { return RTAS_OUT_NO_SUCH_INDICATOR; @@ -965,7 +965,7 @@ static uint32_t rtas_set_allocation_state(uint32_t idx,= uint32_t state) =20 static uint32_t rtas_set_dr_indicator(uint32_t idx, uint32_t state) { - sPAPRDRConnector *drc =3D spapr_drc_by_index(idx); + SpaprDrc *drc =3D spapr_drc_by_index(idx); =20 if (!drc || !object_dynamic_cast(OBJECT(drc), TYPE_SPAPR_DRC_PHYSICAL)= ) { return RTAS_OUT_NO_SUCH_INDICATOR; @@ -982,7 +982,7 @@ static uint32_t rtas_set_dr_indicator(uint32_t idx, uin= t32_t state) return RTAS_OUT_SUCCESS; } =20 -static void rtas_set_indicator(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_set_indicator(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -1017,7 +1017,7 @@ out: rtas_st(rets, 0, ret); } =20 -static void rtas_get_sensor_state(PowerPCCPU *cpu, sPAPRMachineState *spap= r, +static void rtas_get_sensor_state(PowerPCCPU *cpu, SpaprMachineState *spap= r, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -1025,8 +1025,8 @@ static void rtas_get_sensor_state(PowerPCCPU *cpu, sP= APRMachineState *spapr, uint32_t sensor_type; uint32_t sensor_index; uint32_t sensor_state =3D 0; - sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; + SpaprDrc *drc; + SpaprDrcClass *drck; uint32_t ret =3D RTAS_OUT_SUCCESS; =20 if (nargs !=3D 2 || nret !=3D 2) { @@ -1079,7 +1079,7 @@ static void configure_connector_st(target_ulong addr,= target_ulong offset, } =20 static void rtas_ibm_configure_connector(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -1087,9 +1087,9 @@ static void rtas_ibm_configure_connector(PowerPCCPU *= cpu, uint64_t wa_addr; uint64_t wa_offset; uint32_t drc_index; - sPAPRDRConnector *drc; - sPAPRDRConnectorClass *drck; - sPAPRDRCCResponse resp =3D SPAPR_DR_CC_RESPONSE_CONTINUE; + SpaprDrc *drc; + SpaprDrcClass *drck; + SpaprDRCCResponse resp =3D SPAPR_DR_CC_RESPONSE_CONTINUE; int rc; =20 if (nargs !=3D 2 || nret !=3D 1) { diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index ab9a1f0063..ae0f093f59 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -229,18 +229,18 @@ static const char * const event_names[EVENT_CLASS_MAX= ] =3D { [EVENT_CLASS_IO] =3D "ibm,io-events", }; =20 -struct sPAPREventSource { +struct SpaprEventSource { int irq; uint32_t mask; bool enabled; }; =20 -static sPAPREventSource *spapr_event_sources_new(void) +static SpaprEventSource *spapr_event_sources_new(void) { - return g_new0(sPAPREventSource, EVENT_CLASS_MAX); + return g_new0(SpaprEventSource, EVENT_CLASS_MAX); } =20 -static void spapr_event_sources_register(sPAPREventSource *event_sources, +static void spapr_event_sources_register(SpaprEventSource *event_sources, EventClassIndex index, int irq) { /* we only support 1 irq per event class at the moment */ @@ -251,8 +251,8 @@ static void spapr_event_sources_register(sPAPREventSour= ce *event_sources, event_sources[index].enabled =3D true; } =20 -static const sPAPREventSource * -spapr_event_sources_get_source(sPAPREventSource *event_sources, +static const SpaprEventSource * +spapr_event_sources_get_source(SpaprEventSource *event_sources, EventClassIndex index) { g_assert(index < EVENT_CLASS_MAX); @@ -261,11 +261,11 @@ spapr_event_sources_get_source(sPAPREventSource *even= t_sources, return &event_sources[index]; } =20 -void spapr_dt_events(sPAPRMachineState *spapr, void *fdt) +void spapr_dt_events(SpaprMachineState *spapr, void *fdt) { uint32_t irq_ranges[EVENT_CLASS_MAX * 2]; int i, count =3D 0, event_sources; - sPAPREventSource *events =3D spapr->event_sources; + SpaprEventSource *events =3D spapr->event_sources; =20 g_assert(events); =20 @@ -274,7 +274,7 @@ void spapr_dt_events(sPAPRMachineState *spapr, void *fd= t) for (i =3D 0, count =3D 0; i < EVENT_CLASS_MAX; i++) { int node_offset; uint32_t interrupts[2]; - const sPAPREventSource *source =3D + const SpaprEventSource *source =3D spapr_event_sources_get_source(events, i); const char *source_name =3D event_names[i]; =20 @@ -298,10 +298,10 @@ void spapr_dt_events(sPAPRMachineState *spapr, void *= fdt) irq_ranges, count * sizeof(uint32_t)))); } =20 -static const sPAPREventSource * -rtas_event_log_to_source(sPAPRMachineState *spapr, int log_type) +static const SpaprEventSource * +rtas_event_log_to_source(SpaprMachineState *spapr, int log_type) { - const sPAPREventSource *source; + const SpaprEventSource *source; =20 g_assert(spapr->event_sources); =20 @@ -325,9 +325,9 @@ rtas_event_log_to_source(sPAPRMachineState *spapr, int = log_type) return source; } =20 -static int rtas_event_log_to_irq(sPAPRMachineState *spapr, int log_type) +static int rtas_event_log_to_irq(SpaprMachineState *spapr, int log_type) { - const sPAPREventSource *source; + const SpaprEventSource *source; =20 source =3D rtas_event_log_to_source(spapr, log_type); g_assert(source); @@ -336,24 +336,24 @@ static int rtas_event_log_to_irq(sPAPRMachineState *s= papr, int log_type) return source->irq; } =20 -static uint32_t spapr_event_log_entry_type(sPAPREventLogEntry *entry) +static uint32_t spapr_event_log_entry_type(SpaprEventLogEntry *entry) { return entry->summary & RTAS_LOG_TYPE_MASK; } =20 -static void rtas_event_log_queue(sPAPRMachineState *spapr, - sPAPREventLogEntry *entry) +static void rtas_event_log_queue(SpaprMachineState *spapr, + SpaprEventLogEntry *entry) { QTAILQ_INSERT_TAIL(&spapr->pending_events, entry, next); } =20 -static sPAPREventLogEntry *rtas_event_log_dequeue(sPAPRMachineState *spapr, +static SpaprEventLogEntry *rtas_event_log_dequeue(SpaprMachineState *spapr, uint32_t event_mask) { - sPAPREventLogEntry *entry =3D NULL; + SpaprEventLogEntry *entry =3D NULL; =20 QTAILQ_FOREACH(entry, &spapr->pending_events, next) { - const sPAPREventSource *source =3D + const SpaprEventSource *source =3D rtas_event_log_to_source(spapr, spapr_event_log_entry_type(entry)); =20 @@ -371,11 +371,11 @@ static sPAPREventLogEntry *rtas_event_log_dequeue(sPA= PRMachineState *spapr, =20 static bool rtas_event_log_contains(uint32_t event_mask) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); - sPAPREventLogEntry *entry =3D NULL; + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprEventLogEntry *entry =3D NULL; =20 QTAILQ_FOREACH(entry, &spapr->pending_events, next) { - const sPAPREventSource *source =3D + const SpaprEventSource *source =3D rtas_event_log_to_source(spapr, spapr_event_log_entry_type(entry)); =20 @@ -401,7 +401,7 @@ static void spapr_init_v6hdr(struct rtas_event_log_v6 *= v6hdr) static void spapr_init_maina(struct rtas_event_log_v6_maina *maina, int section_count) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); struct tm tm; int year; =20 @@ -424,15 +424,15 @@ static void spapr_init_maina(struct rtas_event_log_v6= _maina *maina, =20 static void spapr_powerdown_req(Notifier *n, void *opaque) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); - sPAPREventLogEntry *entry; + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprEventLogEntry *entry; struct rtas_event_log_v6 *v6hdr; struct rtas_event_log_v6_maina *maina; struct rtas_event_log_v6_mainb *mainb; struct rtas_event_log_v6_epow *epow; struct epow_extended_log *new_epow; =20 - entry =3D g_new(sPAPREventLogEntry, 1); + entry =3D g_new(SpaprEventLogEntry, 1); new_epow =3D g_malloc0(sizeof(*new_epow)); entry->extended_log =3D new_epow; =20 @@ -473,18 +473,18 @@ static void spapr_powerdown_req(Notifier *n, void *op= aque) } =20 static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t hp_action, - sPAPRDRConnectorType drc_type, + SpaprDrcType drc_type, union drc_identifier *drc_id) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); - sPAPREventLogEntry *entry; + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprEventLogEntry *entry; struct hp_extended_log *new_hp; struct rtas_event_log_v6 *v6hdr; struct rtas_event_log_v6_maina *maina; struct rtas_event_log_v6_mainb *mainb; struct rtas_event_log_v6_hp *hp; =20 - entry =3D g_new(sPAPREventLogEntry, 1); + entry =3D g_new(SpaprEventLogEntry, 1); new_hp =3D g_malloc0(sizeof(struct hp_extended_log)); entry->extended_log =3D new_hp; =20 @@ -558,9 +558,9 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint= 8_t hp_action, rtas_event_log_to_irq(spapr, RTAS_LOG_TYPE_HOTPLUG))); } =20 -void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc) +void spapr_hotplug_req_add_by_index(SpaprDrc *drc) { - sPAPRDRConnectorType drc_type =3D spapr_drc_type(drc); + SpaprDrcType drc_type =3D spapr_drc_type(drc); union drc_identifier drc_id; =20 drc_id.index =3D spapr_drc_index(drc); @@ -568,9 +568,9 @@ void spapr_hotplug_req_add_by_index(sPAPRDRConnector *d= rc) RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id); } =20 -void spapr_hotplug_req_remove_by_index(sPAPRDRConnector *drc) +void spapr_hotplug_req_remove_by_index(SpaprDrc *drc) { - sPAPRDRConnectorType drc_type =3D spapr_drc_type(drc); + SpaprDrcType drc_type =3D spapr_drc_type(drc); union drc_identifier drc_id; =20 drc_id.index =3D spapr_drc_index(drc); @@ -578,7 +578,7 @@ void spapr_hotplug_req_remove_by_index(sPAPRDRConnector= *drc) RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_i= d); } =20 -void spapr_hotplug_req_add_by_count(sPAPRDRConnectorType drc_type, +void spapr_hotplug_req_add_by_count(SpaprDrcType drc_type, uint32_t count) { union drc_identifier drc_id; @@ -588,7 +588,7 @@ void spapr_hotplug_req_add_by_count(sPAPRDRConnectorTyp= e drc_type, RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id); } =20 -void spapr_hotplug_req_remove_by_count(sPAPRDRConnectorType drc_type, +void spapr_hotplug_req_remove_by_count(SpaprDrcType drc_type, uint32_t count) { union drc_identifier drc_id; @@ -598,7 +598,7 @@ void spapr_hotplug_req_remove_by_count(sPAPRDRConnector= Type drc_type, RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_i= d); } =20 -void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConnectorType drc_type, +void spapr_hotplug_req_add_by_count_indexed(SpaprDrcType drc_type, uint32_t count, uint32_t index) { union drc_identifier drc_id; @@ -609,7 +609,7 @@ void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConn= ectorType drc_type, RTAS_LOG_V6_HP_ACTION_ADD, drc_type, &drc_id); } =20 -void spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_ty= pe, +void spapr_hotplug_req_remove_by_count_indexed(SpaprDrcType drc_type, uint32_t count, uint32_t in= dex) { union drc_identifier drc_id; @@ -620,14 +620,14 @@ void spapr_hotplug_req_remove_by_count_indexed(sPAPRD= RConnectorType drc_type, RTAS_LOG_V6_HP_ACTION_REMOVE, drc_type, &drc_i= d); } =20 -static void check_exception(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void check_exception(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { uint32_t mask, buf, len, event_len; uint64_t xinfo; - sPAPREventLogEntry *event; + SpaprEventLogEntry *event; struct rtas_error_log header; int i; =20 @@ -671,7 +671,7 @@ static void check_exception(PowerPCCPU *cpu, sPAPRMachi= neState *spapr, */ for (i =3D 0; i < EVENT_CLASS_MAX; i++) { if (rtas_event_log_contains(EVENT_CLASS_MASK(i))) { - const sPAPREventSource *source =3D + const SpaprEventSource *source =3D spapr_event_sources_get_source(spapr->event_sources, i); =20 g_assert(source->enabled); @@ -685,7 +685,7 @@ out_no_events: rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND); } =20 -static void event_scan(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void event_scan(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -697,9 +697,9 @@ static void event_scan(PowerPCCPU *cpu, sPAPRMachineSta= te *spapr, rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND); } =20 -void spapr_clear_pending_events(sPAPRMachineState *spapr) +void spapr_clear_pending_events(SpaprMachineState *spapr) { - sPAPREventLogEntry *entry =3D NULL, *next_entry; + SpaprEventLogEntry *entry =3D NULL, *next_entry; =20 QTAILQ_FOREACH_SAFE(entry, &spapr->pending_events, next, next_entry) { QTAILQ_REMOVE(&spapr->pending_events, entry, next); @@ -708,7 +708,7 @@ void spapr_clear_pending_events(sPAPRMachineState *spap= r) } } =20 -void spapr_events_init(sPAPRMachineState *spapr) +void spapr_events_init(SpaprMachineState *spapr) { int epow_irq =3D SPAPR_IRQ_EPOW; =20 diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 50af3c0a62..0761e10142 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -34,7 +34,7 @@ static inline bool valid_ptex(PowerPCCPU *cpu, target_ulo= ng ptex) return true; } =20 -static bool is_ram_address(sPAPRMachineState *spapr, hwaddr addr) +static bool is_ram_address(SpaprMachineState *spapr, hwaddr addr) { MachineState *machine =3D MACHINE(spapr); DeviceMemoryState *dms =3D machine->device_memory; @@ -50,7 +50,7 @@ static bool is_ram_address(sPAPRMachineState *spapr, hwad= dr addr) return false; } =20 -static target_ulong h_enter(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_enter(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong flags =3D args[0]; @@ -160,7 +160,7 @@ static RemoveResult remove_hpte(PowerPCCPU *cpu, target= _ulong ptex, return REMOVE_SUCCESS; } =20 -static target_ulong h_remove(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_remove(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUPPCState *env =3D &cpu->env; @@ -208,7 +208,7 @@ static target_ulong h_remove(PowerPCCPU *cpu, sPAPRMach= ineState *spapr, =20 #define H_BULK_REMOVE_MAX_BATCH 4 =20 -static target_ulong h_bulk_remove(PowerPCCPU *cpu, sPAPRMachineState *spap= r, +static target_ulong h_bulk_remove(PowerPCCPU *cpu, SpaprMachineState *spap= r, target_ulong opcode, target_ulong *args) { CPUPPCState *env =3D &cpu->env; @@ -260,7 +260,7 @@ static target_ulong h_bulk_remove(PowerPCCPU *cpu, sPAP= RMachineState *spapr, return rc; } =20 -static target_ulong h_protect(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_protect(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUPPCState *env =3D &cpu->env; @@ -299,7 +299,7 @@ static target_ulong h_protect(PowerPCCPU *cpu, sPAPRMac= hineState *spapr, return H_SUCCESS; } =20 -static target_ulong h_read(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_read(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong flags =3D args[0]; @@ -328,7 +328,7 @@ static target_ulong h_read(PowerPCCPU *cpu, sPAPRMachin= eState *spapr, return H_SUCCESS; } =20 -struct sPAPRPendingHPT { +struct SpaprPendingHpt { /* These fields are read-only after initialization */ int shift; QemuThread thread; @@ -342,7 +342,7 @@ struct sPAPRPendingHPT { void *hpt; }; =20 -static void free_pending_hpt(sPAPRPendingHPT *pending) +static void free_pending_hpt(SpaprPendingHpt *pending) { if (pending->hpt) { qemu_vfree(pending->hpt); @@ -353,7 +353,7 @@ static void free_pending_hpt(sPAPRPendingHPT *pending) =20 static void *hpt_prepare_thread(void *opaque) { - sPAPRPendingHPT *pending =3D opaque; + SpaprPendingHpt *pending =3D opaque; size_t size =3D 1ULL << pending->shift; =20 pending->hpt =3D qemu_memalign(size, size); @@ -379,9 +379,9 @@ static void *hpt_prepare_thread(void *opaque) } =20 /* Must be called with BQL held */ -static void cancel_hpt_prepare(sPAPRMachineState *spapr) +static void cancel_hpt_prepare(SpaprMachineState *spapr) { - sPAPRPendingHPT *pending =3D spapr->pending_hpt; + SpaprPendingHpt *pending =3D spapr->pending_hpt; =20 /* Let the thread know it's cancelled */ spapr->pending_hpt =3D NULL; @@ -438,13 +438,13 @@ static target_ulong resize_hpt_convert_rc(int ret) } =20 static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong flags =3D args[0]; int shift =3D args[1]; - sPAPRPendingHPT *pending =3D spapr->pending_hpt; + SpaprPendingHpt *pending =3D spapr->pending_hpt; uint64_t current_ram_size; int rc; =20 @@ -503,7 +503,7 @@ static target_ulong h_resize_hpt_prepare(PowerPCCPU *cp= u, =20 /* start new prepare */ =20 - pending =3D g_new0(sPAPRPendingHPT, 1); + pending =3D g_new0(SpaprPendingHpt, 1); pending->shift =3D shift; pending->ret =3D H_HARDWARE; =20 @@ -672,7 +672,7 @@ static void do_push_sregs_to_kvm_pr(CPUState *cs, run_o= n_cpu_data data) } } =20 -static void push_sregs_to_kvm_pr(sPAPRMachineState *spapr) +static void push_sregs_to_kvm_pr(SpaprMachineState *spapr) { CPUState *cs; =20 @@ -691,13 +691,13 @@ static void push_sregs_to_kvm_pr(sPAPRMachineState *s= papr) } =20 static target_ulong h_resize_hpt_commit(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong flags =3D args[0]; target_ulong shift =3D args[1]; - sPAPRPendingHPT *pending =3D spapr->pending_hpt; + SpaprPendingHpt *pending =3D spapr->pending_hpt; int rc; size_t newsize; =20 @@ -759,7 +759,7 @@ static target_ulong h_resize_hpt_commit(PowerPCCPU *cpu, return rc; } =20 -static target_ulong h_set_sprg0(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_set_sprg0(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { cpu_synchronize_state(CPU(cpu)); @@ -768,7 +768,7 @@ static target_ulong h_set_sprg0(PowerPCCPU *cpu, sPAPRM= achineState *spapr, return H_SUCCESS; } =20 -static target_ulong h_set_dabr(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_set_dabr(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { if (!has_spr(cpu, SPR_DABR)) { @@ -786,7 +786,7 @@ static target_ulong h_set_dabr(PowerPCCPU *cpu, sPAPRMa= chineState *spapr, return H_SUCCESS; } =20 -static target_ulong h_set_xdabr(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_set_xdabr(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong dabrx =3D args[1]; @@ -807,7 +807,7 @@ static target_ulong h_set_xdabr(PowerPCCPU *cpu, sPAPRM= achineState *spapr, return H_SUCCESS; } =20 -static target_ulong h_page_init(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_page_init(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong flags =3D args[0]; @@ -882,7 +882,7 @@ static target_ulong register_vpa(PowerPCCPU *cpu, targe= t_ulong vpa) { CPUState *cs =3D CPU(cpu); CPUPPCState *env =3D &cpu->env; - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); uint16_t size; uint8_t tmp; =20 @@ -918,7 +918,7 @@ static target_ulong register_vpa(PowerPCCPU *cpu, targe= t_ulong vpa) =20 static target_ulong deregister_vpa(PowerPCCPU *cpu, target_ulong vpa) { - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); =20 if (spapr_cpu->slb_shadow_addr) { return H_RESOURCE; @@ -934,7 +934,7 @@ static target_ulong deregister_vpa(PowerPCCPU *cpu, tar= get_ulong vpa) =20 static target_ulong register_slb_shadow(PowerPCCPU *cpu, target_ulong addr) { - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); uint32_t size; =20 if (addr =3D=3D 0) { @@ -963,7 +963,7 @@ static target_ulong register_slb_shadow(PowerPCCPU *cpu= , target_ulong addr) =20 static target_ulong deregister_slb_shadow(PowerPCCPU *cpu, target_ulong ad= dr) { - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); =20 spapr_cpu->slb_shadow_addr =3D 0; spapr_cpu->slb_shadow_size =3D 0; @@ -972,7 +972,7 @@ static target_ulong deregister_slb_shadow(PowerPCCPU *c= pu, target_ulong addr) =20 static target_ulong register_dtl(PowerPCCPU *cpu, target_ulong addr) { - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); uint32_t size; =20 if (addr =3D=3D 0) { @@ -998,7 +998,7 @@ static target_ulong register_dtl(PowerPCCPU *cpu, targe= t_ulong addr) =20 static target_ulong deregister_dtl(PowerPCCPU *cpu, target_ulong addr) { - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); =20 spapr_cpu->dtl_addr =3D 0; spapr_cpu->dtl_size =3D 0; @@ -1006,7 +1006,7 @@ static target_ulong deregister_dtl(PowerPCCPU *cpu, t= arget_ulong addr) return H_SUCCESS; } =20 -static target_ulong h_register_vpa(PowerPCCPU *cpu, sPAPRMachineState *spa= pr, +static target_ulong h_register_vpa(PowerPCCPU *cpu, SpaprMachineState *spa= pr, target_ulong opcode, target_ulong *args) { target_ulong flags =3D args[0]; @@ -1049,7 +1049,7 @@ static target_ulong h_register_vpa(PowerPCCPU *cpu, s= PAPRMachineState *spapr, return ret; } =20 -static target_ulong h_cede(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_cede(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { CPUPPCState *env =3D &cpu->env; @@ -1065,7 +1065,7 @@ static target_ulong h_cede(PowerPCCPU *cpu, sPAPRMach= ineState *spapr, return H_SUCCESS; } =20 -static target_ulong h_rtas(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_rtas(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong rtas_r3 =3D args[0]; @@ -1077,7 +1077,7 @@ static target_ulong h_rtas(PowerPCCPU *cpu, sPAPRMach= ineState *spapr, nret, rtas_r3 + 12 + 4*nargs); } =20 -static target_ulong h_logical_load(PowerPCCPU *cpu, sPAPRMachineState *spa= pr, +static target_ulong h_logical_load(PowerPCCPU *cpu, SpaprMachineState *spa= pr, target_ulong opcode, target_ulong *args) { CPUState *cs =3D CPU(cpu); @@ -1101,7 +1101,7 @@ static target_ulong h_logical_load(PowerPCCPU *cpu, s= PAPRMachineState *spapr, return H_PARAMETER; } =20 -static target_ulong h_logical_store(PowerPCCPU *cpu, sPAPRMachineState *sp= apr, +static target_ulong h_logical_store(PowerPCCPU *cpu, SpaprMachineState *sp= apr, target_ulong opcode, target_ulong *arg= s) { CPUState *cs =3D CPU(cpu); @@ -1127,7 +1127,7 @@ static target_ulong h_logical_store(PowerPCCPU *cpu, = sPAPRMachineState *spapr, return H_PARAMETER; } =20 -static target_ulong h_logical_memop(PowerPCCPU *cpu, sPAPRMachineState *sp= apr, +static target_ulong h_logical_memop(PowerPCCPU *cpu, SpaprMachineState *sp= apr, target_ulong opcode, target_ulong *arg= s) { CPUState *cs =3D CPU(cpu); @@ -1196,14 +1196,14 @@ static target_ulong h_logical_memop(PowerPCCPU *cpu= , sPAPRMachineState *spapr, return H_SUCCESS; } =20 -static target_ulong h_logical_icbi(PowerPCCPU *cpu, sPAPRMachineState *spa= pr, +static target_ulong h_logical_icbi(PowerPCCPU *cpu, SpaprMachineState *spa= pr, target_ulong opcode, target_ulong *args) { /* Nothing to do on emulation, KVM will trap this in the kernel */ return H_SUCCESS; } =20 -static target_ulong h_logical_dcbf(PowerPCCPU *cpu, sPAPRMachineState *spa= pr, +static target_ulong h_logical_dcbf(PowerPCCPU *cpu, SpaprMachineState *spa= pr, target_ulong opcode, target_ulong *args) { /* Nothing to do on emulation, KVM will trap this in the kernel */ @@ -1263,7 +1263,7 @@ static target_ulong h_set_mode_resource_addr_trans_mo= de(PowerPCCPU *cpu, return H_SUCCESS; } =20 -static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_set_mode(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong resource =3D args[1]; @@ -1282,7 +1282,7 @@ static target_ulong h_set_mode(PowerPCCPU *cpu, sPAPR= MachineState *spapr, return ret; } =20 -static target_ulong h_clean_slb(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_clean_slb(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { qemu_log_mask(LOG_UNIMP, "Unimplemented SPAPR hcall 0x"TARGET_FMT_lx"%= s\n", @@ -1290,7 +1290,7 @@ static target_ulong h_clean_slb(PowerPCCPU *cpu, sPAP= RMachineState *spapr, return H_FUNCTION; } =20 -static target_ulong h_invalidate_pid(PowerPCCPU *cpu, sPAPRMachineState *s= papr, +static target_ulong h_invalidate_pid(PowerPCCPU *cpu, SpaprMachineState *s= papr, target_ulong opcode, target_ulong *ar= gs) { qemu_log_mask(LOG_UNIMP, "Unimplemented SPAPR hcall 0x"TARGET_FMT_lx"%= s\n", @@ -1298,7 +1298,7 @@ static target_ulong h_invalidate_pid(PowerPCCPU *cpu,= sPAPRMachineState *spapr, return H_FUNCTION; } =20 -static void spapr_check_setup_free_hpt(sPAPRMachineState *spapr, +static void spapr_check_setup_free_hpt(SpaprMachineState *spapr, uint64_t patbe_old, uint64_t patbe_= new) { /* @@ -1331,7 +1331,7 @@ static void spapr_check_setup_free_hpt(sPAPRMachineSt= ate *spapr, #define FLAG_GTSE 0x01 =20 static target_ulong h_register_process_table(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { @@ -1414,7 +1414,7 @@ static target_ulong h_register_process_table(PowerPCC= PU *cpu, #define H_SIGNAL_SYS_RESET_ALLBUTSELF -2 =20 static target_ulong h_signal_sys_reset(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *= args) { target_long target =3D args[0]; @@ -1449,7 +1449,7 @@ static target_ulong h_signal_sys_reset(PowerPCCPU *cp= u, } } =20 -static uint32_t cas_check_pvr(sPAPRMachineState *spapr, PowerPCCPU *cpu, +static uint32_t cas_check_pvr(SpaprMachineState *spapr, PowerPCCPU *cpu, target_ulong *addr, bool *raw_mode_supported, Error **errp) { @@ -1500,7 +1500,7 @@ static uint32_t cas_check_pvr(sPAPRMachineState *spap= r, PowerPCCPU *cpu, } =20 static target_ulong h_client_architecture_support(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { @@ -1508,7 +1508,7 @@ static target_ulong h_client_architecture_support(Pow= erPCCPU *cpu, target_ulong addr =3D ppc64_phys_to_real(args[0]); target_ulong ov_table; uint32_t cas_pvr; - sPAPROptionVector *ov1_guest, *ov5_guest, *ov5_cas_old, *ov5_updates; + SpaprOptionVector *ov1_guest, *ov5_guest, *ov5_cas_old, *ov5_updates; bool guest_radix; Error *local_err =3D NULL; bool raw_mode_supported =3D false; @@ -1651,7 +1651,7 @@ static target_ulong h_client_architecture_support(Pow= erPCCPU *cpu, } =20 static target_ulong h_home_node_associativity(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { @@ -1687,7 +1687,7 @@ static target_ulong h_home_node_associativity(PowerPC= CPU *cpu, } =20 static target_ulong h_get_cpu_characteristics(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { @@ -1753,13 +1753,13 @@ static target_ulong h_get_cpu_characteristics(Power= PCCPU *cpu, return H_SUCCESS; } =20 -static target_ulong h_update_dt(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_update_dt(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong dt =3D ppc64_phys_to_real(args[0]); struct fdt_header hdr =3D { 0 }; unsigned cb; - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); void *fdt; =20 cpu_physical_memory_read(dt, &hdr, sizeof(hdr)); @@ -1818,7 +1818,7 @@ void spapr_register_hypercall(target_ulong opcode, sp= apr_hcall_fn fn) target_ulong spapr_hypercall(PowerPCCPU *cpu, target_ulong opcode, target_ulong *args) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); =20 if ((opcode <=3D MAX_HCALL_OPCODE) && ((opcode & 0x3) =3D=3D 0)) { diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c index 8f231799b2..5aff4d5a05 100644 --- a/hw/ppc/spapr_iommu.c +++ b/hw/ppc/spapr_iommu.c @@ -32,7 +32,7 @@ =20 #include =20 -enum sPAPRTCEAccess { +enum SpaprTceAccess { SPAPR_TCE_FAULT =3D 0, SPAPR_TCE_RO =3D 1, SPAPR_TCE_WO =3D 2, @@ -42,11 +42,11 @@ enum sPAPRTCEAccess { #define IOMMU_PAGE_SIZE(shift) (1ULL << (shift)) #define IOMMU_PAGE_MASK(shift) (~(IOMMU_PAGE_SIZE(shift) - 1)) =20 -static QLIST_HEAD(, sPAPRTCETable) spapr_tce_tables; +static QLIST_HEAD(, SpaprTceTable) spapr_tce_tables; =20 -sPAPRTCETable *spapr_tce_find_by_liobn(target_ulong liobn) +SpaprTceTable *spapr_tce_find_by_liobn(target_ulong liobn) { - sPAPRTCETable *tcet; + SpaprTceTable *tcet; =20 if (liobn & 0xFFFFFFFF00000000ULL) { hcall_dprintf("Request for out-of-bounds LIOBN 0x" TARGET_FMT_lx "= \n", @@ -115,7 +115,7 @@ static IOMMUTLBEntry spapr_tce_translate_iommu(IOMMUMem= oryRegion *iommu, IOMMUAccessFlags flag, int iommu_idx) { - sPAPRTCETable *tcet =3D container_of(iommu, sPAPRTCETable, iommu); + SpaprTceTable *tcet =3D container_of(iommu, SpaprTceTable, iommu); uint64_t tce; IOMMUTLBEntry ret =3D { .target_as =3D &address_space_memory, @@ -147,7 +147,7 @@ static void spapr_tce_replay(IOMMUMemoryRegion *iommu_m= r, IOMMUNotifier *n) IOMMUMemoryRegionClass *imrc =3D IOMMU_MEMORY_REGION_GET_CLASS(iommu_m= r); hwaddr addr, granularity; IOMMUTLBEntry iotlb; - sPAPRTCETable *tcet =3D container_of(iommu_mr, sPAPRTCETable, iommu); + SpaprTceTable *tcet =3D container_of(iommu_mr, SpaprTceTable, iommu); =20 if (tcet->skipping_replay) { return; @@ -173,7 +173,7 @@ static void spapr_tce_replay(IOMMUMemoryRegion *iommu_m= r, IOMMUNotifier *n) =20 static int spapr_tce_table_pre_save(void *opaque) { - sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(opaque); + SpaprTceTable *tcet =3D SPAPR_TCE_TABLE(opaque); =20 tcet->mig_table =3D tcet->table; tcet->mig_nb_table =3D tcet->nb_table; @@ -186,7 +186,7 @@ static int spapr_tce_table_pre_save(void *opaque) =20 static uint64_t spapr_tce_get_min_page_size(IOMMUMemoryRegion *iommu) { - sPAPRTCETable *tcet =3D container_of(iommu, sPAPRTCETable, iommu); + SpaprTceTable *tcet =3D container_of(iommu, SpaprTceTable, iommu); =20 return 1ULL << tcet->page_shift; } @@ -194,7 +194,7 @@ static uint64_t spapr_tce_get_min_page_size(IOMMUMemory= Region *iommu) static int spapr_tce_get_attr(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr attr, void *data) { - sPAPRTCETable *tcet =3D container_of(iommu, sPAPRTCETable, iommu); + SpaprTceTable *tcet =3D container_of(iommu, SpaprTceTable, iommu); =20 if (attr =3D=3D IOMMU_ATTR_SPAPR_TCE_FD && kvmppc_has_cap_spapr_vfio()= ) { *(int *) data =3D tcet->fd; @@ -208,7 +208,7 @@ static void spapr_tce_notify_flag_changed(IOMMUMemoryRe= gion *iommu, IOMMUNotifierFlag old, IOMMUNotifierFlag new) { - struct sPAPRTCETable *tbl =3D container_of(iommu, sPAPRTCETable, iommu= ); + struct SpaprTceTable *tbl =3D container_of(iommu, SpaprTceTable, iommu= ); =20 if (old =3D=3D IOMMU_NOTIFIER_NONE && new !=3D IOMMU_NOTIFIER_NONE) { spapr_tce_set_need_vfio(tbl, true); @@ -219,7 +219,7 @@ static void spapr_tce_notify_flag_changed(IOMMUMemoryRe= gion *iommu, =20 static int spapr_tce_table_post_load(void *opaque, int version_id) { - sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(opaque); + SpaprTceTable *tcet =3D SPAPR_TCE_TABLE(opaque); uint32_t old_nb_table =3D tcet->nb_table; uint64_t old_bus_offset =3D tcet->bus_offset; uint32_t old_page_shift =3D tcet->page_shift; @@ -253,7 +253,7 @@ static int spapr_tce_table_post_load(void *opaque, int = version_id) =20 static bool spapr_tce_table_ex_needed(void *opaque) { - sPAPRTCETable *tcet =3D opaque; + SpaprTceTable *tcet =3D opaque; =20 return tcet->bus_offset || tcet->page_shift !=3D 0xC; } @@ -264,8 +264,8 @@ static const VMStateDescription vmstate_spapr_tce_table= _ex =3D { .minimum_version_id =3D 1, .needed =3D spapr_tce_table_ex_needed, .fields =3D (VMStateField[]) { - VMSTATE_UINT64(bus_offset, sPAPRTCETable), - VMSTATE_UINT32(page_shift, sPAPRTCETable), + VMSTATE_UINT64(bus_offset, SpaprTceTable), + VMSTATE_UINT32(page_shift, SpaprTceTable), VMSTATE_END_OF_LIST() }, }; @@ -278,12 +278,12 @@ static const VMStateDescription vmstate_spapr_tce_tab= le =3D { .post_load =3D spapr_tce_table_post_load, .fields =3D (VMStateField []) { /* Sanity check */ - VMSTATE_UINT32_EQUAL(liobn, sPAPRTCETable, NULL), + VMSTATE_UINT32_EQUAL(liobn, SpaprTceTable, NULL), =20 /* IOMMU state */ - VMSTATE_UINT32(mig_nb_table, sPAPRTCETable), - VMSTATE_BOOL(bypass, sPAPRTCETable), - VMSTATE_VARRAY_UINT32_ALLOC(mig_table, sPAPRTCETable, mig_nb_table= , 0, + VMSTATE_UINT32(mig_nb_table, SpaprTceTable), + VMSTATE_BOOL(bypass, SpaprTceTable), + VMSTATE_VARRAY_UINT32_ALLOC(mig_table, SpaprTceTable, mig_nb_table= , 0, vmstate_info_uint64, uint64_t), =20 VMSTATE_END_OF_LIST() @@ -296,7 +296,7 @@ static const VMStateDescription vmstate_spapr_tce_table= =3D { =20 static void spapr_tce_table_realize(DeviceState *dev, Error **errp) { - sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(dev); + SpaprTceTable *tcet =3D SPAPR_TCE_TABLE(dev); Object *tcetobj =3D OBJECT(tcet); gchar *tmp; =20 @@ -318,7 +318,7 @@ static void spapr_tce_table_realize(DeviceState *dev, E= rror **errp) tcet); } =20 -void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio) +void spapr_tce_set_need_vfio(SpaprTceTable *tcet, bool need_vfio) { size_t table_size =3D tcet->nb_table * sizeof(uint64_t); uint64_t *oldtable; @@ -347,9 +347,9 @@ void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool = need_vfio) tcet->fd =3D newfd; } =20 -sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn) +SpaprTceTable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn) { - sPAPRTCETable *tcet; + SpaprTceTable *tcet; gchar *tmp; =20 if (spapr_tce_find_by_liobn(liobn)) { @@ -371,7 +371,7 @@ sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, = uint32_t liobn) return tcet; } =20 -void spapr_tce_table_enable(sPAPRTCETable *tcet, +void spapr_tce_table_enable(SpaprTceTable *tcet, uint32_t page_shift, uint64_t bus_offset, uint32_t nb_table) { @@ -396,7 +396,7 @@ void spapr_tce_table_enable(sPAPRTCETable *tcet, MEMORY_REGION(&tcet->iommu)); } =20 -void spapr_tce_table_disable(sPAPRTCETable *tcet) +void spapr_tce_table_disable(SpaprTceTable *tcet) { if (!tcet->nb_table) { return; @@ -415,7 +415,7 @@ void spapr_tce_table_disable(sPAPRTCETable *tcet) =20 static void spapr_tce_table_unrealize(DeviceState *dev, Error **errp) { - sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(dev); + SpaprTceTable *tcet =3D SPAPR_TCE_TABLE(dev); =20 vmstate_unregister(DEVICE(tcet), &vmstate_spapr_tce_table, tcet); =20 @@ -424,14 +424,14 @@ static void spapr_tce_table_unrealize(DeviceState *de= v, Error **errp) spapr_tce_table_disable(tcet); } =20 -MemoryRegion *spapr_tce_get_iommu(sPAPRTCETable *tcet) +MemoryRegion *spapr_tce_get_iommu(SpaprTceTable *tcet) { return &tcet->root; } =20 static void spapr_tce_reset(DeviceState *dev) { - sPAPRTCETable *tcet =3D SPAPR_TCE_TABLE(dev); + SpaprTceTable *tcet =3D SPAPR_TCE_TABLE(dev); size_t table_size =3D tcet->nb_table * sizeof(uint64_t); =20 if (tcet->nb_table) { @@ -439,7 +439,7 @@ static void spapr_tce_reset(DeviceState *dev) } } =20 -static target_ulong put_tce_emu(sPAPRTCETable *tcet, target_ulong ioba, +static target_ulong put_tce_emu(SpaprTceTable *tcet, target_ulong ioba, target_ulong tce) { IOMMUTLBEntry entry; @@ -465,7 +465,7 @@ static target_ulong put_tce_emu(sPAPRTCETable *tcet, ta= rget_ulong ioba, } =20 static target_ulong h_put_tce_indirect(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, target_ulong opcode, target_ulong *= args) { int i; @@ -475,7 +475,7 @@ static target_ulong h_put_tce_indirect(PowerPCCPU *cpu, target_ulong tce_list =3D args[2]; target_ulong npages =3D args[3]; target_ulong ret =3D H_PARAMETER, tce =3D 0; - sPAPRTCETable *tcet =3D spapr_tce_find_by_liobn(liobn); + SpaprTceTable *tcet =3D spapr_tce_find_by_liobn(liobn); CPUState *cs =3D CPU(cpu); hwaddr page_mask, page_size; =20 @@ -510,7 +510,7 @@ static target_ulong h_put_tce_indirect(PowerPCCPU *cpu, return ret; } =20 -static target_ulong h_stuff_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_stuff_tce(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { int i; @@ -519,7 +519,7 @@ static target_ulong h_stuff_tce(PowerPCCPU *cpu, sPAPRM= achineState *spapr, target_ulong tce_value =3D args[2]; target_ulong npages =3D args[3]; target_ulong ret =3D H_PARAMETER; - sPAPRTCETable *tcet =3D spapr_tce_find_by_liobn(liobn); + SpaprTceTable *tcet =3D spapr_tce_find_by_liobn(liobn); hwaddr page_mask, page_size; =20 if (!tcet) { @@ -549,14 +549,14 @@ static target_ulong h_stuff_tce(PowerPCCPU *cpu, sPAP= RMachineState *spapr, return ret; } =20 -static target_ulong h_put_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_put_tce(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong liobn =3D args[0]; target_ulong ioba =3D args[1]; target_ulong tce =3D args[2]; target_ulong ret =3D H_PARAMETER; - sPAPRTCETable *tcet =3D spapr_tce_find_by_liobn(liobn); + SpaprTceTable *tcet =3D spapr_tce_find_by_liobn(liobn); =20 if (tcet) { hwaddr page_mask =3D IOMMU_PAGE_MASK(tcet->page_shift); @@ -574,7 +574,7 @@ static target_ulong h_put_tce(PowerPCCPU *cpu, sPAPRMac= hineState *spapr, return ret; } =20 -static target_ulong get_tce_emu(sPAPRTCETable *tcet, target_ulong ioba, +static target_ulong get_tce_emu(SpaprTceTable *tcet, target_ulong ioba, target_ulong *tce) { unsigned long index =3D (ioba - tcet->bus_offset) >> tcet->page_shift; @@ -590,14 +590,14 @@ static target_ulong get_tce_emu(sPAPRTCETable *tcet, = target_ulong ioba, return H_SUCCESS; } =20 -static target_ulong h_get_tce(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_get_tce(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong liobn =3D args[0]; target_ulong ioba =3D args[1]; target_ulong tce =3D 0; target_ulong ret =3D H_PARAMETER; - sPAPRTCETable *tcet =3D spapr_tce_find_by_liobn(liobn); + SpaprTceTable *tcet =3D spapr_tce_find_by_liobn(liobn); =20 if (tcet) { hwaddr page_mask =3D IOMMU_PAGE_MASK(tcet->page_shift); @@ -649,7 +649,7 @@ int spapr_dma_dt(void *fdt, int node_off, const char *p= ropname, } =20 int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname, - sPAPRTCETable *tcet) + SpaprTceTable *tcet) { if (!tcet) { return 0; @@ -680,7 +680,7 @@ static void spapr_tce_table_class_init(ObjectClass *kla= ss, void *data) static TypeInfo spapr_tce_table_info =3D { .name =3D TYPE_SPAPR_TCE_TABLE, .parent =3D TYPE_DEVICE, - .instance_size =3D sizeof(sPAPRTCETable), + .instance_size =3D sizeof(SpaprTceTable), .class_init =3D spapr_tce_table_class_init, }; =20 diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c index 4145079d7f..253e4de7fd 100644 --- a/hw/ppc/spapr_irq.c +++ b/hw/ppc/spapr_irq.c @@ -20,13 +20,13 @@ =20 #include "trace.h" =20 -void spapr_irq_msi_init(sPAPRMachineState *spapr, uint32_t nr_msis) +void spapr_irq_msi_init(SpaprMachineState *spapr, uint32_t nr_msis) { spapr->irq_map_nr =3D nr_msis; spapr->irq_map =3D bitmap_new(spapr->irq_map_nr); } =20 -int spapr_irq_msi_alloc(sPAPRMachineState *spapr, uint32_t num, bool align, +int spapr_irq_msi_alloc(SpaprMachineState *spapr, uint32_t num, bool align, Error **errp) { int irq; @@ -51,12 +51,12 @@ int spapr_irq_msi_alloc(sPAPRMachineState *spapr, uint3= 2_t num, bool align, return irq + SPAPR_IRQ_MSI; } =20 -void spapr_irq_msi_free(sPAPRMachineState *spapr, int irq, uint32_t num) +void spapr_irq_msi_free(SpaprMachineState *spapr, int irq, uint32_t num) { bitmap_clear(spapr->irq_map, irq - SPAPR_IRQ_MSI, num); } =20 -void spapr_irq_msi_reset(sPAPRMachineState *spapr) +void spapr_irq_msi_reset(SpaprMachineState *spapr) { bitmap_clear(spapr->irq_map, 0, spapr->irq_map_nr); } @@ -66,7 +66,7 @@ void spapr_irq_msi_reset(sPAPRMachineState *spapr) * XICS IRQ backend. */ =20 -static ICSState *spapr_ics_create(sPAPRMachineState *spapr, +static ICSState *spapr_ics_create(SpaprMachineState *spapr, int nr_irqs, Error **errp) { Error *local_err =3D NULL; @@ -92,7 +92,7 @@ error: return NULL; } =20 -static void spapr_irq_init_xics(sPAPRMachineState *spapr, int nr_irqs, +static void spapr_irq_init_xics(SpaprMachineState *spapr, int nr_irqs, Error **errp) { MachineState *machine =3D MACHINE(spapr); @@ -126,7 +126,7 @@ error: #define ICS_IRQ_FREE(ics, srcno) \ (!((ics)->irqs[(srcno)].flags & (XICS_FLAGS_IRQ_MASK))) =20 -static int spapr_irq_claim_xics(sPAPRMachineState *spapr, int irq, bool ls= i, +static int spapr_irq_claim_xics(SpaprMachineState *spapr, int irq, bool ls= i, Error **errp) { ICSState *ics =3D spapr->ics; @@ -147,7 +147,7 @@ static int spapr_irq_claim_xics(sPAPRMachineState *spap= r, int irq, bool lsi, return 0; } =20 -static void spapr_irq_free_xics(sPAPRMachineState *spapr, int irq, int num) +static void spapr_irq_free_xics(SpaprMachineState *spapr, int irq, int num) { ICSState *ics =3D spapr->ics; uint32_t srcno =3D irq - ics->offset; @@ -164,7 +164,7 @@ static void spapr_irq_free_xics(sPAPRMachineState *spap= r, int irq, int num) } } =20 -static qemu_irq spapr_qirq_xics(sPAPRMachineState *spapr, int irq) +static qemu_irq spapr_qirq_xics(SpaprMachineState *spapr, int irq) { ICSState *ics =3D spapr->ics; uint32_t srcno =3D irq - ics->offset; @@ -176,7 +176,7 @@ static qemu_irq spapr_qirq_xics(sPAPRMachineState *spap= r, int irq) return NULL; } =20 -static void spapr_irq_print_info_xics(sPAPRMachineState *spapr, Monitor *m= on) +static void spapr_irq_print_info_xics(SpaprMachineState *spapr, Monitor *m= on) { CPUState *cs; =20 @@ -189,12 +189,12 @@ static void spapr_irq_print_info_xics(sPAPRMachineSta= te *spapr, Monitor *mon) ics_pic_print_info(spapr->ics, mon); } =20 -static void spapr_irq_cpu_intc_create_xics(sPAPRMachineState *spapr, +static void spapr_irq_cpu_intc_create_xics(SpaprMachineState *spapr, PowerPCCPU *cpu, Error **errp) { Error *local_err =3D NULL; Object *obj; - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); =20 obj =3D icp_create(OBJECT(cpu), TYPE_ICP, XICS_FABRIC(spapr), &local_err); @@ -206,7 +206,7 @@ static void spapr_irq_cpu_intc_create_xics(sPAPRMachine= State *spapr, spapr_cpu->icp =3D ICP(obj); } =20 -static int spapr_irq_post_load_xics(sPAPRMachineState *spapr, int version_= id) +static int spapr_irq_post_load_xics(SpaprMachineState *spapr, int version_= id) { if (!kvm_irqchip_in_kernel()) { CPUState *cs; @@ -220,17 +220,17 @@ static int spapr_irq_post_load_xics(sPAPRMachineState= *spapr, int version_id) =20 static void spapr_irq_set_irq_xics(void *opaque, int srcno, int val) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 ics_simple_set_irq(spapr->ics, srcno, val); } =20 -static void spapr_irq_reset_xics(sPAPRMachineState *spapr, Error **errp) +static void spapr_irq_reset_xics(SpaprMachineState *spapr, Error **errp) { /* TODO: create the KVM XICS device */ } =20 -static const char *spapr_irq_get_nodename_xics(sPAPRMachineState *spapr) +static const char *spapr_irq_get_nodename_xics(SpaprMachineState *spapr) { return XICS_NODENAME; } @@ -239,7 +239,7 @@ static const char *spapr_irq_get_nodename_xics(sPAPRMac= hineState *spapr) #define SPAPR_IRQ_XICS_NR_MSIS \ (XICS_IRQ_BASE + SPAPR_IRQ_XICS_NR_IRQS - SPAPR_IRQ_MSI) =20 -sPAPRIrq spapr_irq_xics =3D { +SpaprIrq spapr_irq_xics =3D { .nr_irqs =3D SPAPR_IRQ_XICS_NR_IRQS, .nr_msis =3D SPAPR_IRQ_XICS_NR_MSIS, .ov5 =3D SPAPR_OV5_XIVE_LEGACY, @@ -260,7 +260,7 @@ sPAPRIrq spapr_irq_xics =3D { /* * XIVE IRQ backend. */ -static void spapr_irq_init_xive(sPAPRMachineState *spapr, int nr_irqs, +static void spapr_irq_init_xive(SpaprMachineState *spapr, int nr_irqs, Error **errp) { MachineState *machine =3D MACHINE(spapr); @@ -294,7 +294,7 @@ static void spapr_irq_init_xive(sPAPRMachineState *spap= r, int nr_irqs, spapr_xive_hcall_init(spapr); } =20 -static int spapr_irq_claim_xive(sPAPRMachineState *spapr, int irq, bool ls= i, +static int spapr_irq_claim_xive(SpaprMachineState *spapr, int irq, bool ls= i, Error **errp) { if (!spapr_xive_irq_claim(spapr->xive, irq, lsi)) { @@ -304,7 +304,7 @@ static int spapr_irq_claim_xive(sPAPRMachineState *spap= r, int irq, bool lsi, return 0; } =20 -static void spapr_irq_free_xive(sPAPRMachineState *spapr, int irq, int num) +static void spapr_irq_free_xive(SpaprMachineState *spapr, int irq, int num) { int i; =20 @@ -313,9 +313,9 @@ static void spapr_irq_free_xive(sPAPRMachineState *spap= r, int irq, int num) } } =20 -static qemu_irq spapr_qirq_xive(sPAPRMachineState *spapr, int irq) +static qemu_irq spapr_qirq_xive(SpaprMachineState *spapr, int irq) { - sPAPRXive *xive =3D spapr->xive; + SpaprXive *xive =3D spapr->xive; =20 if (irq >=3D xive->nr_irqs) { return NULL; @@ -327,7 +327,7 @@ static qemu_irq spapr_qirq_xive(sPAPRMachineState *spap= r, int irq) return spapr->qirqs[irq]; } =20 -static void spapr_irq_print_info_xive(sPAPRMachineState *spapr, +static void spapr_irq_print_info_xive(SpaprMachineState *spapr, Monitor *mon) { CPUState *cs; @@ -341,12 +341,12 @@ static void spapr_irq_print_info_xive(sPAPRMachineSta= te *spapr, spapr_xive_pic_print_info(spapr->xive, mon); } =20 -static void spapr_irq_cpu_intc_create_xive(sPAPRMachineState *spapr, +static void spapr_irq_cpu_intc_create_xive(SpaprMachineState *spapr, PowerPCCPU *cpu, Error **errp) { Error *local_err =3D NULL; Object *obj; - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); =20 obj =3D xive_tctx_create(OBJECT(cpu), XIVE_ROUTER(spapr->xive), &local= _err); if (local_err) { @@ -363,12 +363,12 @@ static void spapr_irq_cpu_intc_create_xive(sPAPRMachi= neState *spapr, spapr_xive_set_tctx_os_cam(spapr_cpu->tctx); } =20 -static int spapr_irq_post_load_xive(sPAPRMachineState *spapr, int version_= id) +static int spapr_irq_post_load_xive(SpaprMachineState *spapr, int version_= id) { return 0; } =20 -static void spapr_irq_reset_xive(sPAPRMachineState *spapr, Error **errp) +static void spapr_irq_reset_xive(SpaprMachineState *spapr, Error **errp) { CPUState *cs; =20 @@ -385,12 +385,12 @@ static void spapr_irq_reset_xive(sPAPRMachineState *s= papr, Error **errp) =20 static void spapr_irq_set_irq_xive(void *opaque, int srcno, int val) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 xive_source_set_irq(&spapr->xive->source, srcno, val); } =20 -static const char *spapr_irq_get_nodename_xive(sPAPRMachineState *spapr) +static const char *spapr_irq_get_nodename_xive(SpaprMachineState *spapr) { return spapr->xive->nodename; } @@ -403,7 +403,7 @@ static const char *spapr_irq_get_nodename_xive(sPAPRMac= hineState *spapr) #define SPAPR_IRQ_XIVE_NR_IRQS 0x2000 #define SPAPR_IRQ_XIVE_NR_MSIS (SPAPR_IRQ_XIVE_NR_IRQS - SPAPR_IRQ_MSI) =20 -sPAPRIrq spapr_irq_xive =3D { +SpaprIrq spapr_irq_xive =3D { .nr_irqs =3D SPAPR_IRQ_XIVE_NR_IRQS, .nr_msis =3D SPAPR_IRQ_XIVE_NR_MSIS, .ov5 =3D SPAPR_OV5_XIVE_EXPLOIT, @@ -434,13 +434,13 @@ sPAPRIrq spapr_irq_xive =3D { * Returns the sPAPR IRQ backend negotiated by CAS. XICS is the * default. */ -static sPAPRIrq *spapr_irq_current(sPAPRMachineState *spapr) +static SpaprIrq *spapr_irq_current(SpaprMachineState *spapr) { return spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT) ? &spapr_irq_xive : &spapr_irq_xics; } =20 -static void spapr_irq_init_dual(sPAPRMachineState *spapr, int nr_irqs, +static void spapr_irq_init_dual(SpaprMachineState *spapr, int nr_irqs, Error **errp) { MachineState *machine =3D MACHINE(spapr); @@ -464,7 +464,7 @@ static void spapr_irq_init_dual(sPAPRMachineState *spap= r, int nr_irqs, } } =20 -static int spapr_irq_claim_dual(sPAPRMachineState *spapr, int irq, bool ls= i, +static int spapr_irq_claim_dual(SpaprMachineState *spapr, int irq, bool ls= i, Error **errp) { Error *local_err =3D NULL; @@ -485,30 +485,30 @@ static int spapr_irq_claim_dual(sPAPRMachineState *sp= apr, int irq, bool lsi, return ret; } =20 -static void spapr_irq_free_dual(sPAPRMachineState *spapr, int irq, int num) +static void spapr_irq_free_dual(SpaprMachineState *spapr, int irq, int num) { spapr_irq_xics.free(spapr, irq, num); spapr_irq_xive.free(spapr, irq, num); } =20 -static qemu_irq spapr_qirq_dual(sPAPRMachineState *spapr, int irq) +static qemu_irq spapr_qirq_dual(SpaprMachineState *spapr, int irq) { return spapr_irq_current(spapr)->qirq(spapr, irq); } =20 -static void spapr_irq_print_info_dual(sPAPRMachineState *spapr, Monitor *m= on) +static void spapr_irq_print_info_dual(SpaprMachineState *spapr, Monitor *m= on) { spapr_irq_current(spapr)->print_info(spapr, mon); } =20 -static void spapr_irq_dt_populate_dual(sPAPRMachineState *spapr, +static void spapr_irq_dt_populate_dual(SpaprMachineState *spapr, uint32_t nr_servers, void *fdt, uint32_t phandle) { spapr_irq_current(spapr)->dt_populate(spapr, nr_servers, fdt, phandle); } =20 -static void spapr_irq_cpu_intc_create_dual(sPAPRMachineState *spapr, +static void spapr_irq_cpu_intc_create_dual(SpaprMachineState *spapr, PowerPCCPU *cpu, Error **errp) { Error *local_err =3D NULL; @@ -522,7 +522,7 @@ static void spapr_irq_cpu_intc_create_dual(sPAPRMachine= State *spapr, spapr_irq_xics.cpu_intc_create(spapr, cpu, errp); } =20 -static int spapr_irq_post_load_dual(sPAPRMachineState *spapr, int version_= id) +static int spapr_irq_post_load_dual(SpaprMachineState *spapr, int version_= id) { /* * Force a reset of the XIVE backend after migration. The machine @@ -535,7 +535,7 @@ static int spapr_irq_post_load_dual(sPAPRMachineState *= spapr, int version_id) return spapr_irq_current(spapr)->post_load(spapr, version_id); } =20 -static void spapr_irq_reset_dual(sPAPRMachineState *spapr, Error **errp) +static void spapr_irq_reset_dual(SpaprMachineState *spapr, Error **errp) { /* * Deactivate the XIVE MMIOs. The XIVE backend will reenable them @@ -548,12 +548,12 @@ static void spapr_irq_reset_dual(sPAPRMachineState *s= papr, Error **errp) =20 static void spapr_irq_set_irq_dual(void *opaque, int srcno, int val) { - sPAPRMachineState *spapr =3D opaque; + SpaprMachineState *spapr =3D opaque; =20 spapr_irq_current(spapr)->set_irq(spapr, srcno, val); } =20 -static const char *spapr_irq_get_nodename_dual(sPAPRMachineState *spapr) +static const char *spapr_irq_get_nodename_dual(SpaprMachineState *spapr) { return spapr_irq_current(spapr)->get_nodename(spapr); } @@ -564,7 +564,7 @@ static const char *spapr_irq_get_nodename_dual(sPAPRMac= hineState *spapr) #define SPAPR_IRQ_DUAL_NR_IRQS 0x2000 #define SPAPR_IRQ_DUAL_NR_MSIS (SPAPR_IRQ_DUAL_NR_IRQS - SPAPR_IRQ_MSI) =20 -sPAPRIrq spapr_irq_dual =3D { +SpaprIrq spapr_irq_dual =3D { .nr_irqs =3D SPAPR_IRQ_DUAL_NR_IRQS, .nr_msis =3D SPAPR_IRQ_DUAL_NR_MSIS, .ov5 =3D SPAPR_OV5_XIVE_BOTH, @@ -585,7 +585,7 @@ sPAPRIrq spapr_irq_dual =3D { /* * sPAPR IRQ frontend routines for devices */ -void spapr_irq_init(sPAPRMachineState *spapr, Error **errp) +void spapr_irq_init(SpaprMachineState *spapr, Error **errp) { MachineState *machine =3D MACHINE(spapr); =20 @@ -611,34 +611,34 @@ void spapr_irq_init(sPAPRMachineState *spapr, Error *= *errp) spapr->irq->nr_irqs); } =20 -int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **e= rrp) +int spapr_irq_claim(SpaprMachineState *spapr, int irq, bool lsi, Error **e= rrp) { return spapr->irq->claim(spapr, irq, lsi, errp); } =20 -void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num) +void spapr_irq_free(SpaprMachineState *spapr, int irq, int num) { spapr->irq->free(spapr, irq, num); } =20 -qemu_irq spapr_qirq(sPAPRMachineState *spapr, int irq) +qemu_irq spapr_qirq(SpaprMachineState *spapr, int irq) { return spapr->irq->qirq(spapr, irq); } =20 -int spapr_irq_post_load(sPAPRMachineState *spapr, int version_id) +int spapr_irq_post_load(SpaprMachineState *spapr, int version_id) { return spapr->irq->post_load(spapr, version_id); } =20 -void spapr_irq_reset(sPAPRMachineState *spapr, Error **errp) +void spapr_irq_reset(SpaprMachineState *spapr, Error **errp) { if (spapr->irq->reset) { spapr->irq->reset(spapr, errp); } } =20 -int spapr_irq_get_phandle(sPAPRMachineState *spapr, void *fdt, Error **err= p) +int spapr_irq_get_phandle(SpaprMachineState *spapr, void *fdt, Error **err= p) { const char *nodename =3D spapr->irq->get_nodename(spapr); int offset, phandle; @@ -684,7 +684,7 @@ static int ics_find_free_block(ICSState *ics, int num, = int alignnum) return -1; } =20 -int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **= errp) +int spapr_irq_find(SpaprMachineState *spapr, int num, bool align, Error **= errp) { ICSState *ics =3D spapr->ics; int first =3D -1; @@ -716,7 +716,7 @@ int spapr_irq_find(sPAPRMachineState *spapr, int num, b= ool align, Error **errp) =20 #define SPAPR_IRQ_XICS_LEGACY_NR_IRQS 0x400 =20 -sPAPRIrq spapr_irq_xics_legacy =3D { +SpaprIrq spapr_irq_xics_legacy =3D { .nr_irqs =3D SPAPR_IRQ_XICS_LEGACY_NR_IRQS, .nr_msis =3D SPAPR_IRQ_XICS_LEGACY_NR_IRQS, .ov5 =3D SPAPR_OV5_XIVE_LEGACY, diff --git a/hw/ppc/spapr_ovec.c b/hw/ppc/spapr_ovec.c index 318bf33de4..a65b7c7da9 100644 --- a/hw/ppc/spapr_ovec.c +++ b/hw/ppc/spapr_ovec.c @@ -26,7 +26,7 @@ * allows us to more safely make assumptions about the bitmap size and * simplify the calling code somewhat */ -struct sPAPROptionVector { +struct SpaprOptionVector { unsigned long *bitmap; int32_t bitmap_size; /* only used for migration */ }; @@ -36,25 +36,25 @@ const VMStateDescription vmstate_spapr_ovec =3D { .version_id =3D 1, .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { - VMSTATE_BITMAP(bitmap, sPAPROptionVector, 1, bitmap_size), + VMSTATE_BITMAP(bitmap, SpaprOptionVector, 1, bitmap_size), VMSTATE_END_OF_LIST() } }; =20 -sPAPROptionVector *spapr_ovec_new(void) +SpaprOptionVector *spapr_ovec_new(void) { - sPAPROptionVector *ov; + SpaprOptionVector *ov; =20 - ov =3D g_new0(sPAPROptionVector, 1); + ov =3D g_new0(SpaprOptionVector, 1); ov->bitmap =3D bitmap_new(OV_MAXBITS); ov->bitmap_size =3D OV_MAXBITS; =20 return ov; } =20 -sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov_orig) +SpaprOptionVector *spapr_ovec_clone(SpaprOptionVector *ov_orig) { - sPAPROptionVector *ov; + SpaprOptionVector *ov; =20 g_assert(ov_orig); =20 @@ -64,9 +64,9 @@ sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov= _orig) return ov; } =20 -void spapr_ovec_intersect(sPAPROptionVector *ov, - sPAPROptionVector *ov1, - sPAPROptionVector *ov2) +void spapr_ovec_intersect(SpaprOptionVector *ov, + SpaprOptionVector *ov1, + SpaprOptionVector *ov2) { g_assert(ov); g_assert(ov1); @@ -76,9 +76,9 @@ void spapr_ovec_intersect(sPAPROptionVector *ov, } =20 /* returns true if options bits were removed, false otherwise */ -bool spapr_ovec_diff(sPAPROptionVector *ov, - sPAPROptionVector *ov_old, - sPAPROptionVector *ov_new) +bool spapr_ovec_diff(SpaprOptionVector *ov, + SpaprOptionVector *ov_old, + SpaprOptionVector *ov_new) { unsigned long *change_mask =3D bitmap_new(OV_MAXBITS); unsigned long *removed_bits =3D bitmap_new(OV_MAXBITS); @@ -102,7 +102,7 @@ bool spapr_ovec_diff(sPAPROptionVector *ov, return bits_were_removed; } =20 -void spapr_ovec_cleanup(sPAPROptionVector *ov) +void spapr_ovec_cleanup(SpaprOptionVector *ov) { if (ov) { g_free(ov->bitmap); @@ -110,7 +110,7 @@ void spapr_ovec_cleanup(sPAPROptionVector *ov) } } =20 -void spapr_ovec_set(sPAPROptionVector *ov, long bitnr) +void spapr_ovec_set(SpaprOptionVector *ov, long bitnr) { g_assert(ov); g_assert(bitnr < OV_MAXBITS); @@ -118,7 +118,7 @@ void spapr_ovec_set(sPAPROptionVector *ov, long bitnr) set_bit(bitnr, ov->bitmap); } =20 -void spapr_ovec_clear(sPAPROptionVector *ov, long bitnr) +void spapr_ovec_clear(SpaprOptionVector *ov, long bitnr) { g_assert(ov); g_assert(bitnr < OV_MAXBITS); @@ -126,7 +126,7 @@ void spapr_ovec_clear(sPAPROptionVector *ov, long bitnr) clear_bit(bitnr, ov->bitmap); } =20 -bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr) +bool spapr_ovec_test(SpaprOptionVector *ov, long bitnr) { g_assert(ov); g_assert(bitnr < OV_MAXBITS); @@ -178,9 +178,9 @@ static target_ulong vector_addr(target_ulong table_addr= , int vector) return table_addr; } =20 -sPAPROptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int ve= ctor) +SpaprOptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int ve= ctor) { - sPAPROptionVector *ov; + SpaprOptionVector *ov; target_ulong addr; uint16_t vector_len; int i; @@ -210,7 +210,7 @@ sPAPROptionVector *spapr_ovec_parse_vector(target_ulong= table_addr, int vector) } =20 int spapr_ovec_populate_dt(void *fdt, int fdt_offset, - sPAPROptionVector *ov, const char *name) + SpaprOptionVector *ov, const char *name) { uint8_t vec[OV_MAXBYTES + 1]; uint16_t vec_len; diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index 69059c36eb..20915d2b3c 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -61,9 +61,9 @@ #define RTAS_TYPE_MSI 1 #define RTAS_TYPE_MSIX 2 =20 -sPAPRPHBState *spapr_pci_find_phb(sPAPRMachineState *spapr, uint64_t buid) +SpaprPhbState *spapr_pci_find_phb(SpaprMachineState *spapr, uint64_t buid) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; =20 QLIST_FOREACH(sphb, &spapr->phbs, list) { if (sphb->buid !=3D buid) { @@ -75,10 +75,10 @@ sPAPRPHBState *spapr_pci_find_phb(sPAPRMachineState *sp= apr, uint64_t buid) return NULL; } =20 -PCIDevice *spapr_pci_find_dev(sPAPRMachineState *spapr, uint64_t buid, +PCIDevice *spapr_pci_find_dev(SpaprMachineState *spapr, uint64_t buid, uint32_t config_addr) { - sPAPRPHBState *sphb =3D spapr_pci_find_phb(spapr, buid); + SpaprPhbState *sphb =3D spapr_pci_find_phb(spapr, buid); PCIHostState *phb =3D PCI_HOST_BRIDGE(sphb); int bus_num =3D (config_addr >> 16) & 0xFF; int devfn =3D (config_addr >> 8) & 0xFF; @@ -96,7 +96,7 @@ static uint32_t rtas_pci_cfgaddr(uint32_t arg) return ((arg >> 20) & 0xf00) | (arg & 0xff); } =20 -static void finish_read_pci_config(sPAPRMachineState *spapr, uint64_t buid, +static void finish_read_pci_config(SpaprMachineState *spapr, uint64_t buid, uint32_t addr, uint32_t size, target_ulong rets) { @@ -126,7 +126,7 @@ static void finish_read_pci_config(sPAPRMachineState *s= papr, uint64_t buid, rtas_st(rets, 1, val); } =20 -static void rtas_ibm_read_pci_config(PowerPCCPU *cpu, sPAPRMachineState *s= papr, +static void rtas_ibm_read_pci_config(PowerPCCPU *cpu, SpaprMachineState *s= papr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -146,7 +146,7 @@ static void rtas_ibm_read_pci_config(PowerPCCPU *cpu, s= PAPRMachineState *spapr, finish_read_pci_config(spapr, buid, addr, size, rets); } =20 -static void rtas_read_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_read_pci_config(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -164,7 +164,7 @@ static void rtas_read_pci_config(PowerPCCPU *cpu, sPAPR= MachineState *spapr, finish_read_pci_config(spapr, 0, addr, size, rets); } =20 -static void finish_write_pci_config(sPAPRMachineState *spapr, uint64_t bui= d, +static void finish_write_pci_config(SpaprMachineState *spapr, uint64_t bui= d, uint32_t addr, uint32_t size, uint32_t val, target_ulong rets) { @@ -192,7 +192,7 @@ static void finish_write_pci_config(sPAPRMachineState *= spapr, uint64_t buid, rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -static void rtas_ibm_write_pci_config(PowerPCCPU *cpu, sPAPRMachineState *= spapr, +static void rtas_ibm_write_pci_config(PowerPCCPU *cpu, SpaprMachineState *= spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -213,7 +213,7 @@ static void rtas_ibm_write_pci_config(PowerPCCPU *cpu, = sPAPRMachineState *spapr, finish_write_pci_config(spapr, buid, addr, size, val, rets); } =20 -static void rtas_write_pci_config(PowerPCCPU *cpu, sPAPRMachineState *spap= r, +static void rtas_write_pci_config(PowerPCCPU *cpu, SpaprMachineState *spap= r, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -262,12 +262,12 @@ static void spapr_msi_setmsg(PCIDevice *pdev, hwaddr = addr, bool msix, } } =20 -static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_ibm_change_msi(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); + SpaprMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); uint32_t config_addr =3D rtas_ld(args, 0); uint64_t buid =3D rtas_ldq(args, 1); unsigned int func =3D rtas_ld(args, 3); @@ -275,14 +275,14 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAP= RMachineState *spapr, unsigned int seq_num =3D rtas_ld(args, 5); unsigned int ret_intr_type; unsigned int irq, max_irqs =3D 0; - sPAPRPHBState *phb =3D NULL; + SpaprPhbState *phb =3D NULL; PCIDevice *pdev =3D NULL; spapr_pci_msi *msi; int *config_addr_key; Error *err =3D NULL; int i; =20 - /* Fins sPAPRPHBState */ + /* Fins SpaprPhbState */ phb =3D spapr_pci_find_phb(spapr, buid); if (phb) { pdev =3D spapr_pci_find_dev(spapr, buid, config_addr); @@ -439,7 +439,7 @@ out: } =20 static void rtas_ibm_query_interrupt_source_number(PowerPCCPU *cpu, - sPAPRMachineState *spap= r, + SpaprMachineState *spap= r, uint32_t token, uint32_t nargs, target_ulong args, @@ -449,11 +449,11 @@ static void rtas_ibm_query_interrupt_source_number(Po= werPCCPU *cpu, uint32_t config_addr =3D rtas_ld(args, 0); uint64_t buid =3D rtas_ldq(args, 1); unsigned int intr_src_num =3D -1, ioa_intr_num =3D rtas_ld(args, 3); - sPAPRPHBState *phb =3D NULL; + SpaprPhbState *phb =3D NULL; PCIDevice *pdev =3D NULL; spapr_pci_msi *msi; =20 - /* Find sPAPRPHBState */ + /* Find SpaprPhbState */ phb =3D spapr_pci_find_phb(spapr, buid); if (phb) { pdev =3D spapr_pci_find_dev(spapr, buid, config_addr); @@ -480,12 +480,12 @@ static void rtas_ibm_query_interrupt_source_number(Po= werPCCPU *cpu, } =20 static void rtas_ibm_set_eeh_option(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; uint32_t addr, option; uint64_t buid; int ret; @@ -516,12 +516,12 @@ param_error_exit: } =20 static void rtas_ibm_get_config_addr_info2(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nre= t, target_ulong rets) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; PCIDevice *pdev; uint32_t addr, option; uint64_t buid; @@ -570,12 +570,12 @@ param_error_exit: } =20 static void rtas_ibm_read_slot_reset_state2(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nr= et, target_ulong rets) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; uint64_t buid; int state, ret; =20 @@ -612,12 +612,12 @@ param_error_exit: } =20 static void rtas_ibm_set_slot_reset(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; uint32_t option; uint64_t buid; int ret; @@ -646,12 +646,12 @@ param_error_exit: } =20 static void rtas_ibm_configure_pe(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; uint64_t buid; int ret; =20 @@ -679,12 +679,12 @@ param_error_exit: =20 /* To support it later */ static void rtas_ibm_slot_error_detail(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; int option; uint64_t buid; =20 @@ -741,7 +741,7 @@ static void pci_spapr_set_irq(void *opaque, int irq_num= , int level) * Here we use the number returned by pci_spapr_map_irq to find a * corresponding qemu_irq. */ - sPAPRPHBState *phb =3D opaque; + SpaprPhbState *phb =3D opaque; =20 trace_spapr_pci_lsi_set(phb->dtbusname, irq_num, phb->lsi_table[irq_nu= m].irq); qemu_set_irq(spapr_phb_lsi_qirq(phb, irq_num), level); @@ -749,7 +749,7 @@ static void pci_spapr_set_irq(void *opaque, int irq_num= , int level) =20 static PCIINTxRoute spapr_route_intx_pin_to_irq(void *opaque, int pin) { - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(opaque); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(opaque); PCIINTxRoute route; =20 route.mode =3D PCI_INTX_ENABLED; @@ -766,7 +766,7 @@ static PCIINTxRoute spapr_route_intx_pin_to_irq(void *o= paque, int pin) static void spapr_msi_write(void *opaque, hwaddr addr, uint64_t data, unsigned size) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); uint32_t irq =3D data; =20 trace_spapr_pci_msi_write(addr, data, irq); @@ -786,12 +786,12 @@ static const MemoryRegionOps spapr_msi_ops =3D { */ static AddressSpace *spapr_pci_dma_iommu(PCIBus *bus, void *opaque, int de= vfn) { - sPAPRPHBState *phb =3D opaque; + SpaprPhbState *phb =3D opaque; =20 return &phb->iommu_as; } =20 -static char *spapr_phb_vfio_get_loc_code(sPAPRPHBState *sphb, PCIDevice *= pdev) +static char *spapr_phb_vfio_get_loc_code(SpaprPhbState *sphb, PCIDevice *= pdev) { char *path =3D NULL, *buf =3D NULL, *host =3D NULL; =20 @@ -822,7 +822,7 @@ err_out: return NULL; } =20 -static char *spapr_phb_get_loc_code(sPAPRPHBState *sphb, PCIDevice *pdev) +static char *spapr_phb_get_loc_code(SpaprPhbState *sphb, PCIDevice *pdev) { char *buf; const char *devtype =3D "qemu"; @@ -1249,11 +1249,11 @@ static gchar *pci_get_node_name(PCIDevice *dev) } } =20 -static uint32_t spapr_phb_get_pci_drc_index(sPAPRPHBState *phb, +static uint32_t spapr_phb_get_pci_drc_index(SpaprPhbState *phb, PCIDevice *pdev); =20 static void spapr_populate_pci_child_dt(PCIDevice *dev, void *fdt, int off= set, - sPAPRPHBState *sphb) + SpaprPhbState *sphb) { ResourceProps rp; bool is_bridge =3D false; @@ -1358,7 +1358,7 @@ static void spapr_populate_pci_child_dt(PCIDevice *de= v, void *fdt, int offset, } =20 /* create OF node for pci device and required OF DT properties */ -static int spapr_create_pci_child_dt(sPAPRPHBState *phb, PCIDevice *dev, +static int spapr_create_pci_child_dt(SpaprPhbState *phb, PCIDevice *dev, void *fdt, int node_offset) { int offset; @@ -1382,7 +1382,7 @@ void spapr_phb_remove_pci_device_cb(DeviceState *dev) object_unparent(OBJECT(dev)); } =20 -static sPAPRDRConnector *spapr_phb_get_pci_func_drc(sPAPRPHBState *phb, +static SpaprDrc *spapr_phb_get_pci_func_drc(SpaprPhbState *phb, uint32_t busnr, int32_t devfn) { @@ -1390,17 +1390,17 @@ static sPAPRDRConnector *spapr_phb_get_pci_func_drc= (sPAPRPHBState *phb, (phb->index << 16) | (busnr << 8) | devfn); } =20 -static sPAPRDRConnector *spapr_phb_get_pci_drc(sPAPRPHBState *phb, +static SpaprDrc *spapr_phb_get_pci_drc(SpaprPhbState *phb, PCIDevice *pdev) { uint32_t busnr =3D pci_bus_num(PCI_BUS(qdev_get_parent_bus(DEVICE(pdev= )))); return spapr_phb_get_pci_func_drc(phb, busnr, pdev->devfn); } =20 -static uint32_t spapr_phb_get_pci_drc_index(sPAPRPHBState *phb, +static uint32_t spapr_phb_get_pci_drc_index(SpaprPhbState *phb, PCIDevice *pdev) { - sPAPRDRConnector *drc =3D spapr_phb_get_pci_drc(phb, pdev); + SpaprDrc *drc =3D spapr_phb_get_pci_drc(phb, pdev); =20 if (!drc) { return 0; @@ -1409,11 +1409,11 @@ static uint32_t spapr_phb_get_pci_drc_index(sPAPRPH= BState *phb, return spapr_drc_index(drc); } =20 -int spapr_pci_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr, +int spapr_pci_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp) { HotplugHandler *plug_handler =3D qdev_get_hotplug_handler(drc->dev); - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(plug_handler); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(plug_handler); PCIDevice *pdev =3D PCI_DEVICE(drc->dev); =20 *fdt_start_offset =3D spapr_create_pci_child_dt(sphb, pdev, fdt, 0); @@ -1423,9 +1423,9 @@ int spapr_pci_dt_populate(sPAPRDRConnector *drc, sPAP= RMachineState *spapr, static void spapr_pci_plug(HotplugHandler *plug_handler, DeviceState *plugged_dev, Error **errp) { - sPAPRPHBState *phb =3D SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler)); + SpaprPhbState *phb =3D SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler)); PCIDevice *pdev =3D PCI_DEVICE(plugged_dev); - sPAPRDRConnector *drc =3D spapr_phb_get_pci_drc(phb, pdev); + SpaprDrc *drc =3D spapr_phb_get_pci_drc(phb, pdev); Error *local_err =3D NULL; PCIBus *bus =3D PCI_BUS(qdev_get_parent_bus(DEVICE(pdev))); uint32_t slotnr =3D PCI_SLOT(pdev->devfn); @@ -1472,9 +1472,9 @@ static void spapr_pci_plug(HotplugHandler *plug_handl= er, int i; =20 for (i =3D 0; i < 8; i++) { - sPAPRDRConnector *func_drc; - sPAPRDRConnectorClass *func_drck; - sPAPRDREntitySense state; + SpaprDrc *func_drc; + SpaprDrcClass *func_drck; + SpaprDREntitySense state; =20 func_drc =3D spapr_phb_get_pci_func_drc(phb, pci_bus_num(bus), PCI_DEVFN(slotnr, i)); @@ -1513,9 +1513,9 @@ static void spapr_pci_unplug(HotplugHandler *plug_han= dler, static void spapr_pci_unplug_request(HotplugHandler *plug_handler, DeviceState *plugged_dev, Error **err= p) { - sPAPRPHBState *phb =3D SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler)); + SpaprPhbState *phb =3D SPAPR_PCI_HOST_BRIDGE(DEVICE(plug_handler)); PCIDevice *pdev =3D PCI_DEVICE(plugged_dev); - sPAPRDRConnector *drc =3D spapr_phb_get_pci_drc(phb, pdev); + SpaprDrc *drc =3D spapr_phb_get_pci_drc(phb, pdev); =20 if (!phb->dr_enabled) { error_setg(errp, QERR_BUS_NO_HOTPLUG, @@ -1529,9 +1529,9 @@ static void spapr_pci_unplug_request(HotplugHandler *= plug_handler, if (!spapr_drc_unplug_requested(drc)) { PCIBus *bus =3D PCI_BUS(qdev_get_parent_bus(DEVICE(pdev))); uint32_t slotnr =3D PCI_SLOT(pdev->devfn); - sPAPRDRConnector *func_drc; - sPAPRDRConnectorClass *func_drck; - sPAPRDREntitySense state; + SpaprDrc *func_drc; + SpaprDrcClass *func_drck; + SpaprDREntitySense state; int i; =20 /* ensure any other present functions are pending unplug */ @@ -1573,7 +1573,7 @@ static void spapr_pci_unplug_request(HotplugHandler *= plug_handler, =20 static void spapr_phb_finalizefn(Object *obj) { - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(obj); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(obj); =20 g_free(sphb->dtbusname); sphb->dtbusname =3D NULL; @@ -1581,11 +1581,11 @@ static void spapr_phb_finalizefn(Object *obj) =20 static void spapr_phb_unrealize(DeviceState *dev, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); SysBusDevice *s =3D SYS_BUS_DEVICE(dev); PCIHostState *phb =3D PCI_HOST_BRIDGE(s); - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(phb); - sPAPRTCETable *tcet; + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(phb); + SpaprTceTable *tcet; int i; const unsigned windows_supported =3D spapr_phb_windows_supported(sphb); =20 @@ -1608,7 +1608,7 @@ static void spapr_phb_unrealize(DeviceState *dev, Err= or **errp) =20 if (sphb->dr_enabled) { for (i =3D PCI_SLOT_MAX * 8 - 1; i >=3D 0; i--) { - sPAPRDRConnector *drc =3D spapr_drc_by_id(TYPE_SPAPR_DRC_PCI, + SpaprDrc *drc =3D spapr_drc_by_id(TYPE_SPAPR_DRC_PCI, (sphb->index << 16) | = i); =20 if (drc) { @@ -1645,18 +1645,18 @@ static void spapr_phb_realize(DeviceState *dev, Err= or **errp) /* We don't use SPAPR_MACHINE() in order to exit gracefully if the user * tries to add a sPAPR PHB to a non-pseries machine. */ - sPAPRMachineState *spapr =3D - (sPAPRMachineState *) object_dynamic_cast(qdev_get_machine(), + SpaprMachineState *spapr =3D + (SpaprMachineState *) object_dynamic_cast(qdev_get_machine(), TYPE_SPAPR_MACHINE); - sPAPRMachineClass *smc =3D spapr ? SPAPR_MACHINE_GET_CLASS(spapr) : NU= LL; + SpaprMachineClass *smc =3D spapr ? SPAPR_MACHINE_GET_CLASS(spapr) : NU= LL; SysBusDevice *s =3D SYS_BUS_DEVICE(dev); - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(s); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(s); PCIHostState *phb =3D PCI_HOST_BRIDGE(s); char *namebuf; int i; PCIBus *bus; uint64_t msi_window_size =3D 4096; - sPAPRTCETable *tcet; + SpaprTceTable *tcet; const unsigned windows_supported =3D spapr_phb_windows_supported(sphb); =20 if (!spapr) { @@ -1855,10 +1855,10 @@ static int spapr_phb_children_reset(Object *child, = void *opaque) return 0; } =20 -void spapr_phb_dma_reset(sPAPRPHBState *sphb) +void spapr_phb_dma_reset(SpaprPhbState *sphb) { int i; - sPAPRTCETable *tcet; + SpaprTceTable *tcet; =20 for (i =3D 0; i < SPAPR_PCI_DMA_MAX_WINDOWS; ++i) { tcet =3D spapr_tce_find_by_liobn(sphb->dma_liobn[i]); @@ -1876,7 +1876,7 @@ void spapr_phb_dma_reset(sPAPRPHBState *sphb) =20 static void spapr_phb_reset(DeviceState *qdev) { - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(qdev); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(qdev); =20 spapr_phb_dma_reset(sphb); =20 @@ -1889,27 +1889,27 @@ static void spapr_phb_reset(DeviceState *qdev) } =20 static Property spapr_phb_properties[] =3D { - DEFINE_PROP_UINT32("index", sPAPRPHBState, index, -1), - DEFINE_PROP_UINT64("mem_win_size", sPAPRPHBState, mem_win_size, + DEFINE_PROP_UINT32("index", SpaprPhbState, index, -1), + DEFINE_PROP_UINT64("mem_win_size", SpaprPhbState, mem_win_size, SPAPR_PCI_MEM32_WIN_SIZE), - DEFINE_PROP_UINT64("mem64_win_size", sPAPRPHBState, mem64_win_size, + DEFINE_PROP_UINT64("mem64_win_size", SpaprPhbState, mem64_win_size, SPAPR_PCI_MEM64_WIN_SIZE), - DEFINE_PROP_UINT64("io_win_size", sPAPRPHBState, io_win_size, + DEFINE_PROP_UINT64("io_win_size", SpaprPhbState, io_win_size, SPAPR_PCI_IO_WIN_SIZE), - DEFINE_PROP_BOOL("dynamic-reconfiguration", sPAPRPHBState, dr_enabled, + DEFINE_PROP_BOOL("dynamic-reconfiguration", SpaprPhbState, dr_enabled, true), /* Default DMA window is 0..1GB */ - DEFINE_PROP_UINT64("dma_win_addr", sPAPRPHBState, dma_win_addr, 0), - DEFINE_PROP_UINT64("dma_win_size", sPAPRPHBState, dma_win_size, 0x4000= 0000), - DEFINE_PROP_UINT64("dma64_win_addr", sPAPRPHBState, dma64_win_addr, + DEFINE_PROP_UINT64("dma_win_addr", SpaprPhbState, dma_win_addr, 0), + DEFINE_PROP_UINT64("dma_win_size", SpaprPhbState, dma_win_size, 0x4000= 0000), + DEFINE_PROP_UINT64("dma64_win_addr", SpaprPhbState, dma64_win_addr, 0x800000000000000ULL), - DEFINE_PROP_BOOL("ddw", sPAPRPHBState, ddw_enabled, true), - DEFINE_PROP_UINT64("pgsz", sPAPRPHBState, page_size_mask, + DEFINE_PROP_BOOL("ddw", SpaprPhbState, ddw_enabled, true), + DEFINE_PROP_UINT64("pgsz", SpaprPhbState, page_size_mask, (1ULL << 12) | (1ULL << 16)), - DEFINE_PROP_UINT32("numa_node", sPAPRPHBState, numa_node, -1), - DEFINE_PROP_BOOL("pre-2.8-migration", sPAPRPHBState, + DEFINE_PROP_UINT32("numa_node", SpaprPhbState, numa_node, -1), + DEFINE_PROP_BOOL("pre-2.8-migration", SpaprPhbState, pre_2_8_migration, false), - DEFINE_PROP_BOOL("pcie-extended-configuration-space", sPAPRPHBState, + DEFINE_PROP_BOOL("pcie-extended-configuration-space", SpaprPhbState, pcie_ecs, true), DEFINE_PROP_END_OF_LIST(), }; @@ -1939,7 +1939,7 @@ static const VMStateDescription vmstate_spapr_pci_msi= =3D { =20 static int spapr_pci_pre_save(void *opaque) { - sPAPRPHBState *sphb =3D opaque; + SpaprPhbState *sphb =3D opaque; GHashTableIter iter; gpointer key, value; int i; @@ -1977,7 +1977,7 @@ static int spapr_pci_pre_save(void *opaque) =20 static int spapr_pci_post_load(void *opaque, int version_id) { - sPAPRPHBState *sphb =3D opaque; + SpaprPhbState *sphb =3D opaque; gpointer key, value; int i; =20 @@ -1997,7 +1997,7 @@ static int spapr_pci_post_load(void *opaque, int vers= ion_id) =20 static bool pre_2_8_migration(void *opaque, int version_id) { - sPAPRPHBState *sphb =3D opaque; + SpaprPhbState *sphb =3D opaque; =20 return sphb->pre_2_8_migration; } @@ -2009,16 +2009,16 @@ static const VMStateDescription vmstate_spapr_pci = =3D { .pre_save =3D spapr_pci_pre_save, .post_load =3D spapr_pci_post_load, .fields =3D (VMStateField[]) { - VMSTATE_UINT64_EQUAL(buid, sPAPRPHBState, NULL), - VMSTATE_UINT32_TEST(mig_liobn, sPAPRPHBState, pre_2_8_migration), - VMSTATE_UINT64_TEST(mig_mem_win_addr, sPAPRPHBState, pre_2_8_migra= tion), - VMSTATE_UINT64_TEST(mig_mem_win_size, sPAPRPHBState, pre_2_8_migra= tion), - VMSTATE_UINT64_TEST(mig_io_win_addr, sPAPRPHBState, pre_2_8_migrat= ion), - VMSTATE_UINT64_TEST(mig_io_win_size, sPAPRPHBState, pre_2_8_migrat= ion), - VMSTATE_STRUCT_ARRAY(lsi_table, sPAPRPHBState, PCI_NUM_PINS, 0, + VMSTATE_UINT64_EQUAL(buid, SpaprPhbState, NULL), + VMSTATE_UINT32_TEST(mig_liobn, SpaprPhbState, pre_2_8_migration), + VMSTATE_UINT64_TEST(mig_mem_win_addr, SpaprPhbState, pre_2_8_migra= tion), + VMSTATE_UINT64_TEST(mig_mem_win_size, SpaprPhbState, pre_2_8_migra= tion), + VMSTATE_UINT64_TEST(mig_io_win_addr, SpaprPhbState, pre_2_8_migrat= ion), + VMSTATE_UINT64_TEST(mig_io_win_size, SpaprPhbState, pre_2_8_migrat= ion), + VMSTATE_STRUCT_ARRAY(lsi_table, SpaprPhbState, PCI_NUM_PINS, 0, vmstate_spapr_pci_lsi, struct spapr_pci_lsi), - VMSTATE_INT32(msi_devs_num, sPAPRPHBState), - VMSTATE_STRUCT_VARRAY_ALLOC(msi_devs, sPAPRPHBState, msi_devs_num,= 0, + VMSTATE_INT32(msi_devs_num, SpaprPhbState), + VMSTATE_STRUCT_VARRAY_ALLOC(msi_devs, SpaprPhbState, msi_devs_num,= 0, vmstate_spapr_pci_msi, spapr_pci_msi_m= ig), VMSTATE_END_OF_LIST() }, @@ -2027,7 +2027,7 @@ static const VMStateDescription vmstate_spapr_pci =3D= { static const char *spapr_phb_root_bus_path(PCIHostState *host_bridge, PCIBus *rootbus) { - sPAPRPHBState *sphb =3D SPAPR_PCI_HOST_BRIDGE(host_bridge); + SpaprPhbState *sphb =3D SPAPR_PCI_HOST_BRIDGE(host_bridge); =20 return sphb->dtbusname; } @@ -2055,7 +2055,7 @@ static void spapr_phb_class_init(ObjectClass *klass, = void *data) static const TypeInfo spapr_phb_info =3D { .name =3D TYPE_SPAPR_PCI_HOST_BRIDGE, .parent =3D TYPE_PCI_HOST_BRIDGE, - .instance_size =3D sizeof(sPAPRPHBState), + .instance_size =3D sizeof(SpaprPhbState), .instance_finalize =3D spapr_phb_finalizefn, .class_init =3D spapr_phb_class_init, .interfaces =3D (InterfaceInfo[]) { @@ -2064,19 +2064,19 @@ static const TypeInfo spapr_phb_info =3D { } }; =20 -typedef struct sPAPRFDT { +typedef struct SpaprFdt { void *fdt; int node_off; - sPAPRPHBState *sphb; -} sPAPRFDT; + SpaprPhbState *sphb; +} SpaprFdt; =20 static void spapr_populate_pci_devices_dt(PCIBus *bus, PCIDevice *pdev, void *opaque) { PCIBus *sec_bus; - sPAPRFDT *p =3D opaque; + SpaprFdt *p =3D opaque; int offset; - sPAPRFDT s_fdt; + SpaprFdt s_fdt; =20 offset =3D spapr_create_pci_child_dt(p->sphb, pdev, p->fdt, p->node_of= f); if (!offset) { @@ -2128,7 +2128,7 @@ static void spapr_phb_pci_enumerate_bridge(PCIBus *bu= s, PCIDevice *pdev, pci_default_write_config(pdev, PCI_SUBORDINATE_BUS, *bus_no, 1); } =20 -static void spapr_phb_pci_enumerate(sPAPRPHBState *phb) +static void spapr_phb_pci_enumerate(SpaprPhbState *phb) { PCIBus *bus =3D PCI_HOST_BRIDGE(phb)->bus; unsigned int bus_no =3D 0; @@ -2139,7 +2139,7 @@ static void spapr_phb_pci_enumerate(sPAPRPHBState *ph= b) =20 } =20 -int spapr_populate_pci_dt(sPAPRPHBState *phb, uint32_t intc_phandle, void = *fdt, +int spapr_populate_pci_dt(SpaprPhbState *phb, uint32_t intc_phandle, void = *fdt, uint32_t nr_msis, int *node_offset) { int bus_off, i, j, ret; @@ -2187,10 +2187,10 @@ int spapr_populate_pci_dt(sPAPRPHBState *phb, uint3= 2_t intc_phandle, void *fdt, cpu_to_be32(0x0), cpu_to_be32(0x0), cpu_to_be32(phb->numa_node)}; - sPAPRTCETable *tcet; + SpaprTceTable *tcet; PCIBus *bus =3D PCI_HOST_BRIDGE(phb)->bus; - sPAPRFDT s_fdt; - sPAPRDRConnector *drc; + SpaprFdt s_fdt; + SpaprDrc *drc; =20 /* Start populating the FDT */ nodename =3D g_strdup_printf("pci@%" PRIx64, phb->buid); @@ -2345,8 +2345,8 @@ static int spapr_switch_one_vga(DeviceState *dev, voi= d *opaque) =20 void spapr_pci_switch_vga(bool big_endian) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); - sPAPRPHBState *sphb; + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprPhbState *sphb; =20 /* * For backward compatibility with existing guests, we switch diff --git a/hw/ppc/spapr_pci_vfio.c b/hw/ppc/spapr_pci_vfio.c index 71491dbd28..5f5dde567d 100644 --- a/hw/ppc/spapr_pci_vfio.c +++ b/hw/ppc/spapr_pci_vfio.c @@ -28,12 +28,12 @@ #include "qemu/error-report.h" #include "sysemu/qtest.h" =20 -bool spapr_phb_eeh_available(sPAPRPHBState *sphb) +bool spapr_phb_eeh_available(SpaprPhbState *sphb) { return vfio_eeh_as_ok(&sphb->iommu_as); } =20 -static void spapr_phb_vfio_eeh_reenable(sPAPRPHBState *sphb) +static void spapr_phb_vfio_eeh_reenable(SpaprPhbState *sphb) { vfio_eeh_as_op(&sphb->iommu_as, VFIO_EEH_PE_ENABLE); } @@ -49,7 +49,7 @@ void spapr_phb_vfio_reset(DeviceState *qdev) spapr_phb_vfio_eeh_reenable(SPAPR_PCI_HOST_BRIDGE(qdev)); } =20 -int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, +int spapr_phb_vfio_eeh_set_option(SpaprPhbState *sphb, unsigned int addr, int option) { uint32_t op; @@ -96,7 +96,7 @@ int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, return RTAS_OUT_SUCCESS; } =20 -int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state) +int spapr_phb_vfio_eeh_get_state(SpaprPhbState *sphb, int *state) { int ret; =20 @@ -145,14 +145,14 @@ static void spapr_phb_vfio_eeh_clear_bus_msix(PCIBus = *bus, void *opaque) spapr_phb_vfio_eeh_clear_dev_msix, NULL); } =20 -static void spapr_phb_vfio_eeh_pre_reset(sPAPRPHBState *sphb) +static void spapr_phb_vfio_eeh_pre_reset(SpaprPhbState *sphb) { PCIHostState *phb =3D PCI_HOST_BRIDGE(sphb); =20 pci_for_each_bus(phb->bus, spapr_phb_vfio_eeh_clear_bus_msix, NULL); } =20 -int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option) +int spapr_phb_vfio_eeh_reset(SpaprPhbState *sphb, int option) { uint32_t op; int ret; @@ -181,7 +181,7 @@ int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int o= ption) return RTAS_OUT_SUCCESS; } =20 -int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb) +int spapr_phb_vfio_eeh_configure(SpaprPhbState *sphb) { int ret; =20 diff --git a/hw/ppc/spapr_rng.c b/hw/ppc/spapr_rng.c index 644bac96f8..4060987590 100644 --- a/hw/ppc/spapr_rng.c +++ b/hw/ppc/spapr_rng.c @@ -29,15 +29,15 @@ #include "kvm_ppc.h" =20 #define SPAPR_RNG(obj) \ - OBJECT_CHECK(sPAPRRngState, (obj), TYPE_SPAPR_RNG) + OBJECT_CHECK(SpaprRngState, (obj), TYPE_SPAPR_RNG) =20 -struct sPAPRRngState { +struct SpaprRngState { /*< private >*/ DeviceState ds; RngBackend *backend; bool use_kvm; }; -typedef struct sPAPRRngState sPAPRRngState; +typedef struct SpaprRngState SpaprRngState; =20 struct HRandomData { QemuSemaphore sem; @@ -64,10 +64,10 @@ static void random_recv(void *dest, const void *src, si= ze_t size) } =20 /* Handler for the H_RANDOM hypercall */ -static target_ulong h_random(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_random(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { - sPAPRRngState *rngstate; + SpaprRngState *rngstate; HRandomData hrdata; =20 rngstate =3D SPAPR_RNG(object_resolve_path_type("", TYPE_SPAPR_RNG, NU= LL)); @@ -109,7 +109,7 @@ static void spapr_rng_instance_init(Object *obj) static void spapr_rng_realize(DeviceState *dev, Error **errp) { =20 - sPAPRRngState *rngstate =3D SPAPR_RNG(dev); + SpaprRngState *rngstate =3D SPAPR_RNG(dev); =20 if (rngstate->use_kvm) { if (kvmppc_enable_hwrng() =3D=3D 0) { @@ -133,8 +133,8 @@ static void spapr_rng_realize(DeviceState *dev, Error *= *errp) } =20 static Property spapr_rng_properties[] =3D { - DEFINE_PROP_BOOL("use-kvm", sPAPRRngState, use_kvm, false), - DEFINE_PROP_LINK("rng", sPAPRRngState, backend, TYPE_RNG_BACKEND, + DEFINE_PROP_BOOL("use-kvm", SpaprRngState, use_kvm, false), + DEFINE_PROP_LINK("rng", SpaprRngState, backend, TYPE_RNG_BACKEND, RngBackend *), DEFINE_PROP_END_OF_LIST(), }; @@ -152,7 +152,7 @@ static void spapr_rng_class_init(ObjectClass *oc, void = *data) static const TypeInfo spapr_rng_info =3D { .name =3D TYPE_SPAPR_RNG, .parent =3D TYPE_DEVICE, - .instance_size =3D sizeof(sPAPRRngState), + .instance_size =3D sizeof(SpaprRngState), .instance_init =3D spapr_rng_instance_init, .class_init =3D spapr_rng_class_init, }; diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 7a2cb786a3..24c45b12d4 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -50,13 +50,13 @@ #include "target/ppc/mmu-hash64.h" #include "target/ppc/mmu-book3s-v3.h" =20 -static void rtas_display_character(PowerPCCPU *cpu, sPAPRMachineState *spa= pr, +static void rtas_display_character(PowerPCCPU *cpu, SpaprMachineState *spa= pr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { uint8_t c =3D rtas_ld(args, 0); - VIOsPAPRDevice *sdev =3D vty_lookup(spapr, 0); + SpaprVioDevice *sdev =3D vty_lookup(spapr, 0); =20 if (!sdev) { rtas_st(rets, 0, RTAS_OUT_HW_ERROR); @@ -66,7 +66,7 @@ static void rtas_display_character(PowerPCCPU *cpu, sPAPR= MachineState *spapr, } } =20 -static void rtas_power_off(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_power_off(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong ar= gs, uint32_t nret, target_ulong rets) { @@ -79,7 +79,7 @@ static void rtas_power_off(PowerPCCPU *cpu, sPAPRMachineS= tate *spapr, rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -static void rtas_system_reboot(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_system_reboot(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -93,7 +93,7 @@ static void rtas_system_reboot(PowerPCCPU *cpu, sPAPRMach= ineState *spapr, } =20 static void rtas_query_cpu_stopped_state(PowerPCCPU *cpu_, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -123,7 +123,7 @@ static void rtas_query_cpu_stopped_state(PowerPCCPU *cp= u_, rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); } =20 -static void rtas_start_cpu(PowerPCCPU *callcpu, sPAPRMachineState *spapr, +static void rtas_start_cpu(PowerPCCPU *callcpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -194,7 +194,7 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, sPAPRMa= chineState *spapr, rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -static void rtas_stop_self(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_stop_self(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -226,7 +226,7 @@ static inline int sysparm_st(target_ulong addr, target_= ulong len, } =20 static void rtas_ibm_get_system_parameter(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -268,7 +268,7 @@ static void rtas_ibm_get_system_parameter(PowerPCCPU *c= pu, } =20 static void rtas_ibm_set_system_parameter(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -288,7 +288,7 @@ static void rtas_ibm_set_system_parameter(PowerPCCPU *c= pu, } =20 static void rtas_ibm_os_term(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -298,7 +298,7 @@ static void rtas_ibm_os_term(PowerPCCPU *cpu, rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -static void rtas_set_power_level(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_set_power_level(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -323,7 +323,7 @@ static void rtas_set_power_level(PowerPCCPU *cpu, sPAPR= MachineState *spapr, rtas_st(rets, 1, 100); } =20 -static void rtas_get_power_level(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_get_power_level(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -353,7 +353,7 @@ static struct rtas_call { spapr_rtas_fn fn; } rtas_table[RTAS_TOKEN_MAX - RTAS_TOKEN_BASE]; =20 -target_ulong spapr_rtas_call(PowerPCCPU *cpu, sPAPRMachineState *spapr, +target_ulong spapr_rtas_call(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong = args, uint32_t nret, target_ulong rets) { @@ -387,7 +387,7 @@ uint64_t qtest_rtas_call(char *cmd, uint32_t nargs, uin= t64_t args, =20 for (token =3D 0; token < RTAS_TOKEN_MAX - RTAS_TOKEN_BASE; token++) { if (strcmp(cmd, rtas_table[token].name) =3D=3D 0) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); PowerPCCPU *cpu =3D POWERPC_CPU(first_cpu); =20 rtas_table[token].fn(cpu, spapr, token + RTAS_TOKEN_BASE, @@ -425,7 +425,7 @@ void spapr_dt_rtas_tokens(void *fdt, int rtas) } } =20 -void spapr_load_rtas(sPAPRMachineState *spapr, void *fdt, hwaddr addr) +void spapr_load_rtas(SpaprMachineState *spapr, void *fdt, hwaddr addr) { int rtas_node; int ret; diff --git a/hw/ppc/spapr_rtas_ddw.c b/hw/ppc/spapr_rtas_ddw.c index cc9d1f5c1c..f6538189f4 100644 --- a/hw/ppc/spapr_rtas_ddw.c +++ b/hw/ppc/spapr_rtas_ddw.c @@ -26,16 +26,16 @@ =20 static int spapr_phb_get_active_win_num_cb(Object *child, void *opaque) { - sPAPRTCETable *tcet; + SpaprTceTable *tcet; =20 - tcet =3D (sPAPRTCETable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_T= ABLE); + tcet =3D (SpaprTceTable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_T= ABLE); if (tcet && tcet->nb_table) { ++*(unsigned *)opaque; } return 0; } =20 -static unsigned spapr_phb_get_active_win_num(sPAPRPHBState *sphb) +static unsigned spapr_phb_get_active_win_num(SpaprPhbState *sphb) { unsigned ret =3D 0; =20 @@ -46,9 +46,9 @@ static unsigned spapr_phb_get_active_win_num(sPAPRPHBStat= e *sphb) =20 static int spapr_phb_get_free_liobn_cb(Object *child, void *opaque) { - sPAPRTCETable *tcet; + SpaprTceTable *tcet; =20 - tcet =3D (sPAPRTCETable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_T= ABLE); + tcet =3D (SpaprTceTable *) object_dynamic_cast(child, TYPE_SPAPR_TCE_T= ABLE); if (tcet && !tcet->nb_table) { *(uint32_t *)opaque =3D tcet->liobn; return 1; @@ -56,7 +56,7 @@ static int spapr_phb_get_free_liobn_cb(Object *child, voi= d *opaque) return 0; } =20 -static unsigned spapr_phb_get_free_liobn(sPAPRPHBState *sphb) +static unsigned spapr_phb_get_free_liobn(SpaprPhbState *sphb) { uint32_t liobn =3D 0; =20 @@ -90,12 +90,12 @@ static uint32_t spapr_page_mask_to_query_mask(uint64_t = page_mask) } =20 static void rtas_ibm_query_pe_dma_window(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; uint64_t buid; uint32_t avail, addr, pgmask =3D 0; =20 @@ -129,13 +129,13 @@ param_error_exit: } =20 static void rtas_ibm_create_pe_dma_window(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRPHBState *sphb; - sPAPRTCETable *tcet =3D NULL; + SpaprPhbState *sphb; + SpaprTceTable *tcet =3D NULL; uint32_t addr, page_shift, window_shift, liobn; uint64_t buid, win_addr; int windows; @@ -206,13 +206,13 @@ param_error_exit: } =20 static void rtas_ibm_remove_pe_dma_window(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRPHBState *sphb; - sPAPRTCETable *tcet; + SpaprPhbState *sphb; + SpaprTceTable *tcet; uint32_t liobn; =20 if ((nargs !=3D 1) || (nret !=3D 1)) { @@ -241,12 +241,12 @@ param_error_exit: } =20 static void rtas_ibm_reset_pe_dma_window(PowerPCCPU *cpu, - sPAPRMachineState *spapr, + SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRPHBState *sphb; + SpaprPhbState *sphb; uint64_t buid; uint32_t addr; =20 diff --git a/hw/ppc/spapr_rtc.c b/hw/ppc/spapr_rtc.c index eb95a7077d..d732a3ea95 100644 --- a/hw/ppc/spapr_rtc.c +++ b/hw/ppc/spapr_rtc.c @@ -34,7 +34,7 @@ #include "qapi/qapi-events-target.h" #include "qemu/cutils.h" =20 -void spapr_rtc_read(sPAPRRTCState *rtc, struct tm *tm, uint32_t *ns) +void spapr_rtc_read(SpaprRtcState *rtc, struct tm *tm, uint32_t *ns) { int64_t host_ns =3D qemu_clock_get_ns(rtc_clock); int64_t guest_ns; @@ -53,7 +53,7 @@ void spapr_rtc_read(sPAPRRTCState *rtc, struct tm *tm, ui= nt32_t *ns) } } =20 -int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset) +int spapr_rtc_import_offset(SpaprRtcState *rtc, int64_t legacy_offset) { if (!rtc) { return -ENODEV; @@ -64,7 +64,7 @@ int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t l= egacy_offset) return 0; } =20 -static void rtas_get_time_of_day(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_get_time_of_day(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) @@ -89,12 +89,12 @@ static void rtas_get_time_of_day(PowerPCCPU *cpu, sPAPR= MachineState *spapr, rtas_st(rets, 7, ns); } =20 -static void rtas_set_time_of_day(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_set_time_of_day(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - sPAPRRTCState *rtc =3D &spapr->rtc; + SpaprRtcState *rtc =3D &spapr->rtc; struct tm tm; time_t new_s; int64_t host_ns; @@ -134,7 +134,7 @@ static void spapr_rtc_qom_date(Object *obj, struct tm *= current_tm, Error **errp) =20 static void spapr_rtc_realize(DeviceState *dev, Error **errp) { - sPAPRRTCState *rtc =3D SPAPR_RTC(dev); + SpaprRtcState *rtc =3D SPAPR_RTC(dev); struct tm tm; time_t host_s; int64_t rtc_ns; @@ -154,7 +154,7 @@ static const VMStateDescription vmstate_spapr_rtc =3D { .version_id =3D 1, .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { - VMSTATE_INT64(ns_offset, sPAPRRTCState), + VMSTATE_INT64(ns_offset, SpaprRtcState), VMSTATE_END_OF_LIST() }, }; @@ -177,7 +177,7 @@ static void spapr_rtc_class_init(ObjectClass *oc, void = *data) static const TypeInfo spapr_rtc_info =3D { .name =3D TYPE_SPAPR_RTC, .parent =3D TYPE_DEVICE, - .instance_size =3D sizeof(sPAPRRTCState), + .instance_size =3D sizeof(SpaprRtcState), .class_init =3D spapr_rtc_class_init, }; =20 diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c index 2b7e7ecac5..583c13deda 100644 --- a/hw/ppc/spapr_vio.c +++ b/hw/ppc/spapr_vio.c @@ -46,8 +46,8 @@ =20 static char *spapr_vio_get_dev_name(DeviceState *qdev) { - VIOsPAPRDevice *dev =3D VIO_SPAPR_DEVICE(qdev); - VIOsPAPRDeviceClass *pc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); + SpaprVioDevice *dev =3D VIO_SPAPR_DEVICE(qdev); + SpaprVioDeviceClass *pc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); =20 /* Device tree style name device@reg */ return g_strdup_printf("%s@%x", pc->dt_name, dev->reg); @@ -65,16 +65,16 @@ static const TypeInfo spapr_vio_bus_info =3D { .name =3D TYPE_SPAPR_VIO_BUS, .parent =3D TYPE_BUS, .class_init =3D spapr_vio_bus_class_init, - .instance_size =3D sizeof(VIOsPAPRBus), + .instance_size =3D sizeof(SpaprVioBus), }; =20 -VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t reg) +SpaprVioDevice *spapr_vio_find_by_reg(SpaprVioBus *bus, uint32_t reg) { BusChild *kid; - VIOsPAPRDevice *dev =3D NULL; + SpaprVioDevice *dev =3D NULL; =20 QTAILQ_FOREACH(kid, &bus->bus.children, sibling) { - dev =3D (VIOsPAPRDevice *)kid->child; + dev =3D (SpaprVioDevice *)kid->child; if (dev->reg =3D=3D reg) { return dev; } @@ -83,10 +83,10 @@ VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus,= uint32_t reg) return NULL; } =20 -static int vio_make_devnode(VIOsPAPRDevice *dev, +static int vio_make_devnode(SpaprVioDevice *dev, void *fdt) { - VIOsPAPRDeviceClass *pc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); + SpaprVioDeviceClass *pc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); int vdevice_off, node_off, ret; char *dt_name; =20 @@ -152,13 +152,13 @@ static int vio_make_devnode(VIOsPAPRDevice *dev, /* * CRQ handling */ -static target_ulong h_reg_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_reg_crq(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong reg =3D args[0]; target_ulong queue_addr =3D args[1]; target_ulong queue_len =3D args[2]; - VIOsPAPRDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); =20 if (!dev) { hcall_dprintf("Unit 0x" TARGET_FMT_lx " does not exist\n", reg); @@ -197,7 +197,7 @@ static target_ulong h_reg_crq(PowerPCCPU *cpu, sPAPRMac= hineState *spapr, return H_SUCCESS; } =20 -static target_ulong free_crq(VIOsPAPRDevice *dev) +static target_ulong free_crq(SpaprVioDevice *dev) { dev->crq.qladdr =3D 0; dev->crq.qsize =3D 0; @@ -208,11 +208,11 @@ static target_ulong free_crq(VIOsPAPRDevice *dev) return H_SUCCESS; } =20 -static target_ulong h_free_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_free_crq(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong reg =3D args[0]; - VIOsPAPRDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); =20 if (!dev) { hcall_dprintf("Unit 0x" TARGET_FMT_lx " does not exist\n", reg); @@ -222,13 +222,13 @@ static target_ulong h_free_crq(PowerPCCPU *cpu, sPAPR= MachineState *spapr, return free_crq(dev); } =20 -static target_ulong h_send_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_send_crq(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong reg =3D args[0]; target_ulong msg_hi =3D args[1]; target_ulong msg_lo =3D args[2]; - VIOsPAPRDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); uint64_t crq_mangle[2]; =20 if (!dev) { @@ -245,11 +245,11 @@ static target_ulong h_send_crq(PowerPCCPU *cpu, sPAPR= MachineState *spapr, return H_HARDWARE; } =20 -static target_ulong h_enable_crq(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_enable_crq(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong reg =3D args[0]; - VIOsPAPRDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); =20 if (!dev) { hcall_dprintf("Unit 0x" TARGET_FMT_lx " does not exist\n", reg); @@ -260,7 +260,7 @@ static target_ulong h_enable_crq(PowerPCCPU *cpu, sPAPR= MachineState *spapr, } =20 /* Returns negative error, 0 success, or positive: queue full */ -int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq) +int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq) { int rc; uint8_t byte; @@ -303,7 +303,7 @@ int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *cr= q) =20 /* "quiesce" handling */ =20 -static void spapr_vio_quiesce_one(VIOsPAPRDevice *dev) +static void spapr_vio_quiesce_one(SpaprVioDevice *dev) { if (dev->tcet) { device_reset(DEVICE(dev->tcet)); @@ -311,7 +311,7 @@ static void spapr_vio_quiesce_one(VIOsPAPRDevice *dev) free_crq(dev); } =20 -void spapr_vio_set_bypass(VIOsPAPRDevice *dev, bool bypass) +void spapr_vio_set_bypass(SpaprVioDevice *dev, bool bypass) { if (!dev->tcet) { return; @@ -323,13 +323,13 @@ void spapr_vio_set_bypass(VIOsPAPRDevice *dev, bool b= ypass) dev->tcet->bypass =3D bypass; } =20 -static void rtas_set_tce_bypass(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_set_tce_bypass(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - VIOsPAPRBus *bus =3D spapr->vio_bus; - VIOsPAPRDevice *dev; + SpaprVioBus *bus =3D spapr->vio_bus; + SpaprVioDevice *dev; uint32_t unit, enable; =20 if (nargs !=3D 2) { @@ -354,14 +354,14 @@ static void rtas_set_tce_bypass(PowerPCCPU *cpu, sPAP= RMachineState *spapr, rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -static void rtas_quiesce(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static void rtas_quiesce(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets) { - VIOsPAPRBus *bus =3D spapr->vio_bus; + SpaprVioBus *bus =3D spapr->vio_bus; BusChild *kid; - VIOsPAPRDevice *dev =3D NULL; + SpaprVioDevice *dev =3D NULL; =20 if (nargs !=3D 0) { rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); @@ -369,18 +369,18 @@ static void rtas_quiesce(PowerPCCPU *cpu, sPAPRMachin= eState *spapr, } =20 QTAILQ_FOREACH(kid, &bus->bus.children, sibling) { - dev =3D (VIOsPAPRDevice *)kid->child; + dev =3D (SpaprVioDevice *)kid->child; spapr_vio_quiesce_one(dev); } =20 rtas_st(rets, 0, RTAS_OUT_SUCCESS); } =20 -static VIOsPAPRDevice *reg_conflict(VIOsPAPRDevice *dev) +static SpaprVioDevice *reg_conflict(SpaprVioDevice *dev) { - VIOsPAPRBus *bus =3D SPAPR_VIO_BUS(dev->qdev.parent_bus); + SpaprVioBus *bus =3D SPAPR_VIO_BUS(dev->qdev.parent_bus); BusChild *kid; - VIOsPAPRDevice *other; + SpaprVioDevice *other; =20 /* * Check for a device other than the given one which is already @@ -400,8 +400,8 @@ static VIOsPAPRDevice *reg_conflict(VIOsPAPRDevice *dev) =20 static void spapr_vio_busdev_reset(DeviceState *qdev) { - VIOsPAPRDevice *dev =3D VIO_SPAPR_DEVICE(qdev); - VIOsPAPRDeviceClass *pc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); + SpaprVioDevice *dev =3D VIO_SPAPR_DEVICE(qdev); + SpaprVioDeviceClass *pc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); =20 /* Shut down the request queue and TCEs if necessary */ spapr_vio_quiesce_one(dev); @@ -465,9 +465,9 @@ static inline uint32_t spapr_vio_reg_to_irq(uint32_t re= g) =20 static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); - VIOsPAPRDevice *dev =3D (VIOsPAPRDevice *)qdev; - VIOsPAPRDeviceClass *pc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprVioDevice *dev =3D (SpaprVioDevice *)qdev; + SpaprVioDeviceClass *pc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); char *id; Error *local_err =3D NULL; =20 @@ -478,7 +478,7 @@ static void spapr_vio_busdev_realize(DeviceState *qdev,= Error **errp) * rather than using spapr_vio_find_by_reg() because sdev * itself is already in the list. */ - VIOsPAPRDevice *other =3D reg_conflict(dev); + SpaprVioDevice *other =3D reg_conflict(dev); =20 if (other) { error_setg(errp, "%s and %s devices conflict at address %#x", @@ -489,7 +489,7 @@ static void spapr_vio_busdev_realize(DeviceState *qdev,= Error **errp) } } else { /* Need to assign an address */ - VIOsPAPRBus *bus =3D SPAPR_VIO_BUS(dev->qdev.parent_bus); + SpaprVioBus *bus =3D SPAPR_VIO_BUS(dev->qdev.parent_bus); =20 do { dev->reg =3D bus->next_reg++; @@ -540,14 +540,14 @@ static void spapr_vio_busdev_realize(DeviceState *qde= v, Error **errp) pc->realize(dev, errp); } =20 -static target_ulong h_vio_signal(PowerPCCPU *cpu, sPAPRMachineState *spapr, +static target_ulong h_vio_signal(PowerPCCPU *cpu, SpaprMachineState *spapr, target_ulong opcode, target_ulong *args) { target_ulong reg =3D args[0]; target_ulong mode =3D args[1]; - VIOsPAPRDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); - VIOsPAPRDeviceClass *pc; + SpaprVioDevice *dev =3D spapr_vio_find_by_reg(spapr->vio_bus, reg); + SpaprVioDeviceClass *pc; =20 if (!dev) { return H_PARAMETER; @@ -564,9 +564,9 @@ static target_ulong h_vio_signal(PowerPCCPU *cpu, sPAPR= MachineState *spapr, return H_SUCCESS; } =20 -VIOsPAPRBus *spapr_vio_bus_init(void) +SpaprVioBus *spapr_vio_bus_init(void) { - VIOsPAPRBus *bus; + SpaprVioBus *bus; BusState *qbus; DeviceState *dev; =20 @@ -615,14 +615,14 @@ const VMStateDescription vmstate_spapr_vio =3D { .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { /* Sanity check */ - VMSTATE_UINT32_EQUAL(reg, VIOsPAPRDevice, NULL), - VMSTATE_UINT32_EQUAL(irq, VIOsPAPRDevice, NULL), + VMSTATE_UINT32_EQUAL(reg, SpaprVioDevice, NULL), + VMSTATE_UINT32_EQUAL(irq, SpaprVioDevice, NULL), =20 /* General VIO device state */ - VMSTATE_UINT64(signal_state, VIOsPAPRDevice), - VMSTATE_UINT64(crq.qladdr, VIOsPAPRDevice), - VMSTATE_UINT32(crq.qsize, VIOsPAPRDevice), - VMSTATE_UINT32(crq.qnext, VIOsPAPRDevice), + VMSTATE_UINT64(signal_state, SpaprVioDevice), + VMSTATE_UINT64(crq.qladdr, SpaprVioDevice), + VMSTATE_UINT32(crq.qsize, SpaprVioDevice), + VMSTATE_UINT32(crq.qnext, SpaprVioDevice), =20 VMSTATE_END_OF_LIST() }, @@ -639,9 +639,9 @@ static void vio_spapr_device_class_init(ObjectClass *kl= ass, void *data) static const TypeInfo spapr_vio_type_info =3D { .name =3D TYPE_VIO_SPAPR_DEVICE, .parent =3D TYPE_DEVICE, - .instance_size =3D sizeof(VIOsPAPRDevice), + .instance_size =3D sizeof(SpaprVioDevice), .abstract =3D true, - .class_size =3D sizeof(VIOsPAPRDeviceClass), + .class_size =3D sizeof(SpaprVioDeviceClass), .class_init =3D vio_spapr_device_class_init, }; =20 @@ -656,10 +656,10 @@ type_init(spapr_vio_register_types) =20 static int compare_reg(const void *p1, const void *p2) { - VIOsPAPRDevice const *dev1, *dev2; + SpaprVioDevice const *dev1, *dev2; =20 - dev1 =3D (VIOsPAPRDevice *)*(DeviceState **)p1; - dev2 =3D (VIOsPAPRDevice *)*(DeviceState **)p2; + dev1 =3D (SpaprVioDevice *)*(DeviceState **)p1; + dev2 =3D (SpaprVioDevice *)*(DeviceState **)p2; =20 if (dev1->reg < dev2->reg) { return -1; @@ -672,7 +672,7 @@ static int compare_reg(const void *p1, const void *p2) return 1; } =20 -void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt) +void spapr_dt_vdevice(SpaprVioBus *bus, void *fdt) { DeviceState *qdev, **qdevs; BusChild *kid; @@ -707,8 +707,8 @@ void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt) /* Hack alert. Give the devices to libfdt in reverse order, we happen * to know that will mean they are in forward order in the tree. */ for (i =3D num - 1; i >=3D 0; i--) { - VIOsPAPRDevice *dev =3D (VIOsPAPRDevice *)(qdevs[i]); - VIOsPAPRDeviceClass *vdc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); + SpaprVioDevice *dev =3D (SpaprVioDevice *)(qdevs[i]); + SpaprVioDeviceClass *vdc =3D VIO_SPAPR_DEVICE_GET_CLASS(dev); =20 ret =3D vio_make_devnode(dev, fdt); if (ret < 0) { @@ -721,9 +721,9 @@ void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt) g_free(qdevs); } =20 -gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus) +gchar *spapr_vio_stdout_path(SpaprVioBus *bus) { - VIOsPAPRDevice *dev; + SpaprVioDevice *dev; char *name, *path; =20 dev =3D spapr_vty_get_default(bus); diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c index a9e49c7cb5..26dfc0340f 100644 --- a/hw/scsi/spapr_vscsi.c +++ b/hw/scsi/spapr_vscsi.c @@ -91,7 +91,7 @@ typedef struct vscsi_req { OBJECT_CHECK(VSCSIState, (obj), TYPE_VIO_SPAPR_VSCSI_DEVICE) =20 typedef struct { - VIOsPAPRDevice vdev; + SpaprVioDevice vdev; SCSIBus bus; vscsi_req reqs[VSCSI_REQ_LIMIT]; } VSCSIState; @@ -1115,7 +1115,7 @@ static void vscsi_got_payload(VSCSIState *s, vscsi_cr= q *crq) } =20 =20 -static int vscsi_do_crq(struct VIOsPAPRDevice *dev, uint8_t *crq_data) +static int vscsi_do_crq(struct SpaprVioDevice *dev, uint8_t *crq_data) { VSCSIState *s =3D VIO_SPAPR_VSCSI_DEVICE(dev); vscsi_crq crq; @@ -1187,7 +1187,7 @@ static const struct SCSIBusInfo vscsi_scsi_info =3D { .load_request =3D vscsi_load_request, }; =20 -static void spapr_vscsi_reset(VIOsPAPRDevice *dev) +static void spapr_vscsi_reset(SpaprVioDevice *dev) { VSCSIState *s =3D VIO_SPAPR_VSCSI_DEVICE(dev); int i; @@ -1198,7 +1198,7 @@ static void spapr_vscsi_reset(VIOsPAPRDevice *dev) } } =20 -static void spapr_vscsi_realize(VIOsPAPRDevice *dev, Error **errp) +static void spapr_vscsi_realize(SpaprVioDevice *dev, Error **errp) { VSCSIState *s =3D VIO_SPAPR_VSCSI_DEVICE(dev); =20 @@ -1208,7 +1208,7 @@ static void spapr_vscsi_realize(VIOsPAPRDevice *dev, = Error **errp) &vscsi_scsi_info, NULL); } =20 -void spapr_vscsi_create(VIOsPAPRBus *bus) +void spapr_vscsi_create(SpaprVioBus *bus) { DeviceState *dev; =20 @@ -1218,7 +1218,7 @@ void spapr_vscsi_create(VIOsPAPRBus *bus) scsi_bus_legacy_handle_cmdline(&VIO_SPAPR_VSCSI_DEVICE(dev)->bus); } =20 -static int spapr_vscsi_devnode(VIOsPAPRDevice *dev, void *fdt, int node_of= f) +static int spapr_vscsi_devnode(SpaprVioDevice *dev, void *fdt, int node_of= f) { int ret; =20 @@ -1256,7 +1256,7 @@ static const VMStateDescription vmstate_spapr_vscsi = =3D { static void spapr_vscsi_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); - VIOsPAPRDeviceClass *k =3D VIO_SPAPR_DEVICE_CLASS(klass); + SpaprVioDeviceClass *k =3D VIO_SPAPR_DEVICE_CLASS(klass); =20 k->realize =3D spapr_vscsi_realize; k->reset =3D spapr_vscsi_reset; diff --git a/include/hw/pci-host/spapr.h b/include/hw/pci-host/spapr.h index ab0e3a0a6f..b4aad26798 100644 --- a/include/hw/pci-host/spapr.h +++ b/include/hw/pci-host/spapr.h @@ -28,11 +28,11 @@ #define TYPE_SPAPR_PCI_HOST_BRIDGE "spapr-pci-host-bridge" =20 #define SPAPR_PCI_HOST_BRIDGE(obj) \ - OBJECT_CHECK(sPAPRPHBState, (obj), TYPE_SPAPR_PCI_HOST_BRIDGE) + OBJECT_CHECK(SpaprPhbState, (obj), TYPE_SPAPR_PCI_HOST_BRIDGE) =20 #define SPAPR_PCI_DMA_MAX_WINDOWS 2 =20 -typedef struct sPAPRPHBState sPAPRPHBState; +typedef struct SpaprPhbState SpaprPhbState; =20 typedef struct spapr_pci_msi { uint32_t first_irq; @@ -44,7 +44,7 @@ typedef struct spapr_pci_msi_mig { spapr_pci_msi value; } spapr_pci_msi_mig; =20 -struct sPAPRPHBState { +struct SpaprPhbState { PCIHostState parent_obj; =20 uint32_t index; @@ -72,7 +72,7 @@ struct sPAPRPHBState { int32_t msi_devs_num; spapr_pci_msi_mig *msi_devs; =20 - QLIST_ENTRY(sPAPRPHBState) list; + QLIST_ENTRY(SpaprPhbState) list; =20 bool ddw_enabled; uint64_t page_size_mask; @@ -105,56 +105,56 @@ struct sPAPRPHBState { =20 #define SPAPR_PCI_MSI_WINDOW 0x40000000000ULL =20 -static inline qemu_irq spapr_phb_lsi_qirq(struct sPAPRPHBState *phb, int p= in) +static inline qemu_irq spapr_phb_lsi_qirq(struct SpaprPhbState *phb, int p= in) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); =20 return spapr_qirq(spapr, phb->lsi_table[pin].irq); } =20 -int spapr_populate_pci_dt(sPAPRPHBState *phb, uint32_t intc_phandle, void = *fdt, +int spapr_populate_pci_dt(SpaprPhbState *phb, uint32_t intc_phandle, void = *fdt, uint32_t nr_msis, int *node_offset); =20 void spapr_pci_rtas_init(void); =20 -sPAPRPHBState *spapr_pci_find_phb(sPAPRMachineState *spapr, uint64_t buid); -PCIDevice *spapr_pci_find_dev(sPAPRMachineState *spapr, uint64_t buid, +SpaprPhbState *spapr_pci_find_phb(SpaprMachineState *spapr, uint64_t buid); +PCIDevice *spapr_pci_find_dev(SpaprMachineState *spapr, uint64_t buid, uint32_t config_addr); =20 /* DRC callbacks */ void spapr_phb_remove_pci_device_cb(DeviceState *dev); -int spapr_pci_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr, +int spapr_pci_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp); =20 /* VFIO EEH hooks */ #ifdef CONFIG_LINUX -bool spapr_phb_eeh_available(sPAPRPHBState *sphb); -int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, +bool spapr_phb_eeh_available(SpaprPhbState *sphb); +int spapr_phb_vfio_eeh_set_option(SpaprPhbState *sphb, unsigned int addr, int option); -int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, int *state); -int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option); -int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb); +int spapr_phb_vfio_eeh_get_state(SpaprPhbState *sphb, int *state); +int spapr_phb_vfio_eeh_reset(SpaprPhbState *sphb, int option); +int spapr_phb_vfio_eeh_configure(SpaprPhbState *sphb); void spapr_phb_vfio_reset(DeviceState *qdev); #else -static inline bool spapr_phb_eeh_available(sPAPRPHBState *sphb) +static inline bool spapr_phb_eeh_available(SpaprPhbState *sphb) { return false; } -static inline int spapr_phb_vfio_eeh_set_option(sPAPRPHBState *sphb, +static inline int spapr_phb_vfio_eeh_set_option(SpaprPhbState *sphb, unsigned int addr, int opt= ion) { return RTAS_OUT_HW_ERROR; } -static inline int spapr_phb_vfio_eeh_get_state(sPAPRPHBState *sphb, +static inline int spapr_phb_vfio_eeh_get_state(SpaprPhbState *sphb, int *state) { return RTAS_OUT_HW_ERROR; } -static inline int spapr_phb_vfio_eeh_reset(sPAPRPHBState *sphb, int option) +static inline int spapr_phb_vfio_eeh_reset(SpaprPhbState *sphb, int option) { return RTAS_OUT_HW_ERROR; } -static inline int spapr_phb_vfio_eeh_configure(sPAPRPHBState *sphb) +static inline int spapr_phb_vfio_eeh_configure(SpaprPhbState *sphb) { return RTAS_OUT_HW_ERROR; } @@ -163,9 +163,9 @@ static inline void spapr_phb_vfio_reset(DeviceState *qd= ev) } #endif =20 -void spapr_phb_dma_reset(sPAPRPHBState *sphb); +void spapr_phb_dma_reset(SpaprPhbState *sphb); =20 -static inline unsigned spapr_phb_windows_supported(sPAPRPHBState *sphb) +static inline unsigned spapr_phb_windows_supported(SpaprPhbState *sphb) { return sphb->ddw_enabled ? SPAPR_PCI_DMA_MAX_WINDOWS : 1; } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index f117a7ce6e..2b4c05a2ec 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -8,16 +8,16 @@ #include "hw/mem/pc-dimm.h" #include "hw/ppc/spapr_ovec.h" #include "hw/ppc/spapr_irq.h" -#include "hw/ppc/spapr_xive.h" /* For sPAPRXive */ +#include "hw/ppc/spapr_xive.h" /* For SpaprXive */ #include "hw/ppc/xics.h" /* For ICSState */ =20 -struct VIOsPAPRBus; -struct sPAPRPHBState; -struct sPAPRNVRAM; +struct SpaprVioBus; +struct SpaprPhbState; +struct SpaprNvram; =20 -typedef struct sPAPREventLogEntry sPAPREventLogEntry; -typedef struct sPAPREventSource sPAPREventSource; -typedef struct sPAPRPendingHPT sPAPRPendingHPT; +typedef struct SpaprEventLogEntry SpaprEventLogEntry; +typedef struct SpaprEventSource SpaprEventSource; +typedef struct SpaprPendingHpt SpaprPendingHpt; =20 #define HPTE64_V_HPTE_DIRTY 0x0000000000000040ULL #define SPAPR_ENTRY_POINT 0x100 @@ -27,32 +27,32 @@ typedef struct sPAPRPendingHPT sPAPRPendingHPT; #define TYPE_SPAPR_RTC "spapr-rtc" =20 #define SPAPR_RTC(obj) \ - OBJECT_CHECK(sPAPRRTCState, (obj), TYPE_SPAPR_RTC) + OBJECT_CHECK(SpaprRtcState, (obj), TYPE_SPAPR_RTC) =20 -typedef struct sPAPRRTCState sPAPRRTCState; -struct sPAPRRTCState { +typedef struct SpaprRtcState SpaprRtcState; +struct SpaprRtcState { /*< private >*/ DeviceState parent_obj; int64_t ns_offset; }; =20 -typedef struct sPAPRDIMMState sPAPRDIMMState; -typedef struct sPAPRMachineClass sPAPRMachineClass; +typedef struct SpaprDimmState SpaprDimmState; +typedef struct SpaprMachineClass SpaprMachineClass; =20 #define TYPE_SPAPR_MACHINE "spapr-machine" #define SPAPR_MACHINE(obj) \ - OBJECT_CHECK(sPAPRMachineState, (obj), TYPE_SPAPR_MACHINE) + OBJECT_CHECK(SpaprMachineState, (obj), TYPE_SPAPR_MACHINE) #define SPAPR_MACHINE_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRMachineClass, obj, TYPE_SPAPR_MACHINE) + OBJECT_GET_CLASS(SpaprMachineClass, obj, TYPE_SPAPR_MACHINE) #define SPAPR_MACHINE_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRMachineClass, klass, TYPE_SPAPR_MACHINE) + OBJECT_CLASS_CHECK(SpaprMachineClass, klass, TYPE_SPAPR_MACHINE) =20 typedef enum { SPAPR_RESIZE_HPT_DEFAULT =3D 0, SPAPR_RESIZE_HPT_DISABLED, SPAPR_RESIZE_HPT_ENABLED, SPAPR_RESIZE_HPT_REQUIRED, -} sPAPRResizeHPT; +} SpaprResizeHpt; =20 /** * Capabilities @@ -99,15 +99,15 @@ typedef enum { #define SPAPR_CAP_FIXED_CCD 0x03 #define SPAPR_CAP_FIXED_NA 0x10 /* Lets leave a bit of a gap.= .. */ =20 -typedef struct sPAPRCapabilities sPAPRCapabilities; -struct sPAPRCapabilities { +typedef struct SpaprCapabilities SpaprCapabilities; +struct SpaprCapabilities { uint8_t caps[SPAPR_CAP_NUM]; }; =20 /** - * sPAPRMachineClass: + * SpaprMachineClass: */ -struct sPAPRMachineClass { +struct SpaprMachineClass { /*< private >*/ MachineClass parent_class; =20 @@ -119,33 +119,33 @@ struct sPAPRMachineClass { bool pre_2_10_has_unused_icps; bool legacy_irq_allocation; =20 - void (*phb_placement)(sPAPRMachineState *spapr, uint32_t index, + void (*phb_placement)(SpaprMachineState *spapr, uint32_t index, uint64_t *buid, hwaddr *pio,=20 hwaddr *mmio32, hwaddr *mmio64, unsigned n_dma, uint32_t *liobns, Error **errp); - sPAPRResizeHPT resize_hpt_default; - sPAPRCapabilities default_caps; - sPAPRIrq *irq; + SpaprResizeHpt resize_hpt_default; + SpaprCapabilities default_caps; + SpaprIrq *irq; }; =20 /** - * sPAPRMachineState: + * SpaprMachineState: */ -struct sPAPRMachineState { +struct SpaprMachineState { /*< private >*/ MachineState parent_obj; =20 - struct VIOsPAPRBus *vio_bus; - QLIST_HEAD(, sPAPRPHBState) phbs; - struct sPAPRNVRAM *nvram; + struct SpaprVioBus *vio_bus; + QLIST_HEAD(, SpaprPhbState) phbs; + struct SpaprNvram *nvram; ICSState *ics; - sPAPRRTCState rtc; + SpaprRtcState rtc; =20 - sPAPRResizeHPT resize_hpt; + SpaprResizeHpt resize_hpt; void *htab; uint32_t htab_shift; uint64_t patb_entry; /* Process tbl registed in H_REGISTER_PROCESS_TAB= LE */ - sPAPRPendingHPT *pending_hpt; /* in-progress resize */ + SpaprPendingHpt *pending_hpt; /* in-progress resize */ =20 hwaddr rma_size; int vrma_adjust; @@ -164,15 +164,15 @@ struct sPAPRMachineState { uint32_t vsmt; /* Virtual SMT mode (KVM's "core stride") */ =20 Notifier epow_notifier; - QTAILQ_HEAD(, sPAPREventLogEntry) pending_events; + QTAILQ_HEAD(, SpaprEventLogEntry) pending_events; bool use_hotplug_event_source; - sPAPREventSource *event_sources; + SpaprEventSource *event_sources; =20 /* ibm,client-architecture-support option negotiation */ bool cas_reboot; bool cas_legacy_guest_workaround; - sPAPROptionVector *ov5; /* QEMU-supported option vectors */ - sPAPROptionVector *ov5_cas; /* negotiated (via CAS) option vectors= */ + SpaprOptionVector *ov5; /* QEMU-supported option vectors */ + SpaprOptionVector *ov5_cas; /* negotiated (via CAS) option vectors= */ uint32_t max_compat_pvr; =20 /* Migration state */ @@ -183,7 +183,7 @@ struct sPAPRMachineState { /* Pending DIMM unplug cache. It is populated when a LMB * unplug starts. It can be regenerated if a migration * occurs during the unplug process. */ - QTAILQ_HEAD(, sPAPRDIMMState) pending_dimm_unplugs; + QTAILQ_HEAD(, SpaprDimmState) pending_dimm_unplugs; =20 /*< public >*/ char *kvm_type; @@ -192,12 +192,12 @@ struct sPAPRMachineState { =20 int32_t irq_map_nr; unsigned long *irq_map; - sPAPRXive *xive; - sPAPRIrq *irq; + SpaprXive *xive; + SpaprIrq *irq; qemu_irq *qirqs; =20 bool cmd_line_caps[SPAPR_CAP_NUM]; - sPAPRCapabilities def, eff, mig; + SpaprCapabilities def, eff, mig; }; =20 #define H_SUCCESS 0 @@ -503,16 +503,16 @@ struct sPAPRMachineState { #define KVMPPC_H_UPDATE_DT (KVMPPC_HCALL_BASE + 0x3) #define KVMPPC_HCALL_MAX KVMPPC_H_UPDATE_DT =20 -typedef struct sPAPRDeviceTreeUpdateHeader { +typedef struct SpaprDeviceTreeUpdateHeader { uint32_t version_id; -} sPAPRDeviceTreeUpdateHeader; +} SpaprDeviceTreeUpdateHeader; =20 #define hcall_dprintf(fmt, ...) \ do { \ qemu_log_mask(LOG_GUEST_ERROR, "%s: " fmt, __func__, ## __VA_ARGS_= _); \ } while (0) =20 -typedef target_ulong (*spapr_hcall_fn)(PowerPCCPU *cpu, sPAPRMachineState = *sm, +typedef target_ulong (*spapr_hcall_fn)(PowerPCCPU *cpu, SpaprMachineState = *sm, target_ulong opcode, target_ulong *args); =20 @@ -666,16 +666,16 @@ static inline void rtas_st(target_ulong phys, int n, = uint32_t val) stl_be_phys(&address_space_memory, ppc64_phys_to_real(phys + 4*n), val= ); } =20 -typedef void (*spapr_rtas_fn)(PowerPCCPU *cpu, sPAPRMachineState *sm, +typedef void (*spapr_rtas_fn)(PowerPCCPU *cpu, SpaprMachineState *sm, uint32_t token, uint32_t nargs, target_ulong args, uint32_t nret, target_ulong rets); void spapr_rtas_register(int token, const char *name, spapr_rtas_fn fn); -target_ulong spapr_rtas_call(PowerPCCPU *cpu, sPAPRMachineState *sm, +target_ulong spapr_rtas_call(PowerPCCPU *cpu, SpaprMachineState *sm, uint32_t token, uint32_t nargs, target_ulong = args, uint32_t nret, target_ulong rets); void spapr_dt_rtas_tokens(void *fdt, int rtas); -void spapr_load_rtas(sPAPRMachineState *spapr, void *fdt, hwaddr addr); +void spapr_load_rtas(SpaprMachineState *spapr, void *fdt, hwaddr addr); =20 #define SPAPR_TCE_PAGE_SHIFT 12 #define SPAPR_TCE_PAGE_SIZE (1ULL << SPAPR_TCE_PAGE_SHIFT) @@ -702,17 +702,17 @@ static inline void spapr_dt_irq(uint32_t *intspec, in= t irq, bool is_lsi) intspec[1] =3D is_lsi ? cpu_to_be32(1) : 0; } =20 -typedef struct sPAPRTCETable sPAPRTCETable; +typedef struct SpaprTceTable SpaprTceTable; =20 #define TYPE_SPAPR_TCE_TABLE "spapr-tce-table" #define SPAPR_TCE_TABLE(obj) \ - OBJECT_CHECK(sPAPRTCETable, (obj), TYPE_SPAPR_TCE_TABLE) + OBJECT_CHECK(SpaprTceTable, (obj), TYPE_SPAPR_TCE_TABLE) =20 #define TYPE_SPAPR_IOMMU_MEMORY_REGION "spapr-iommu-memory-region" #define SPAPR_IOMMU_MEMORY_REGION(obj) \ OBJECT_CHECK(IOMMUMemoryRegion, (obj), TYPE_SPAPR_IOMMU_MEMORY_REG= ION) =20 -struct sPAPRTCETable { +struct SpaprTceTable { DeviceState parent; uint32_t liobn; uint32_t nb_table; @@ -727,69 +727,69 @@ struct sPAPRTCETable { int fd; MemoryRegion root; IOMMUMemoryRegion iommu; - struct VIOsPAPRDevice *vdev; /* for @bypass migration compatibility on= ly */ - QLIST_ENTRY(sPAPRTCETable) list; + struct SpaprVioDevice *vdev; /* for @bypass migration compatibility on= ly */ + QLIST_ENTRY(SpaprTceTable) list; }; =20 -sPAPRTCETable *spapr_tce_find_by_liobn(target_ulong liobn); +SpaprTceTable *spapr_tce_find_by_liobn(target_ulong liobn); =20 -struct sPAPREventLogEntry { +struct SpaprEventLogEntry { uint32_t summary; uint32_t extended_length; void *extended_log; - QTAILQ_ENTRY(sPAPREventLogEntry) next; + QTAILQ_ENTRY(SpaprEventLogEntry) next; }; =20 -void spapr_events_init(sPAPRMachineState *sm); -void spapr_dt_events(sPAPRMachineState *sm, void *fdt); -int spapr_h_cas_compose_response(sPAPRMachineState *sm, +void spapr_events_init(SpaprMachineState *sm); +void spapr_dt_events(SpaprMachineState *sm, void *fdt); +int spapr_h_cas_compose_response(SpaprMachineState *sm, target_ulong addr, target_ulong size, - sPAPROptionVector *ov5_updates); -void close_htab_fd(sPAPRMachineState *spapr); -void spapr_setup_hpt_and_vrma(sPAPRMachineState *spapr); -void spapr_free_hpt(sPAPRMachineState *spapr); -sPAPRTCETable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn); -void spapr_tce_table_enable(sPAPRTCETable *tcet, + SpaprOptionVector *ov5_updates); +void close_htab_fd(SpaprMachineState *spapr); +void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr); +void spapr_free_hpt(SpaprMachineState *spapr); +SpaprTceTable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn); +void spapr_tce_table_enable(SpaprTceTable *tcet, uint32_t page_shift, uint64_t bus_offset, uint32_t nb_table); -void spapr_tce_table_disable(sPAPRTCETable *tcet); -void spapr_tce_set_need_vfio(sPAPRTCETable *tcet, bool need_vfio); +void spapr_tce_table_disable(SpaprTceTable *tcet); +void spapr_tce_set_need_vfio(SpaprTceTable *tcet, bool need_vfio); =20 -MemoryRegion *spapr_tce_get_iommu(sPAPRTCETable *tcet); +MemoryRegion *spapr_tce_get_iommu(SpaprTceTable *tcet); int spapr_dma_dt(void *fdt, int node_off, const char *propname, uint32_t liobn, uint64_t window, uint32_t size); int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname, - sPAPRTCETable *tcet); + SpaprTceTable *tcet); void spapr_pci_switch_vga(bool big_endian); -void spapr_hotplug_req_add_by_index(sPAPRDRConnector *drc); -void spapr_hotplug_req_remove_by_index(sPAPRDRConnector *drc); -void spapr_hotplug_req_add_by_count(sPAPRDRConnectorType drc_type, +void spapr_hotplug_req_add_by_index(SpaprDrc *drc); +void spapr_hotplug_req_remove_by_index(SpaprDrc *drc); +void spapr_hotplug_req_add_by_count(SpaprDrcType drc_type, uint32_t count); -void spapr_hotplug_req_remove_by_count(sPAPRDRConnectorType drc_type, +void spapr_hotplug_req_remove_by_count(SpaprDrcType drc_type, uint32_t count); -void spapr_hotplug_req_add_by_count_indexed(sPAPRDRConnectorType drc_type, +void spapr_hotplug_req_add_by_count_indexed(SpaprDrcType drc_type, uint32_t count, uint32_t index= ); -void spapr_hotplug_req_remove_by_count_indexed(sPAPRDRConnectorType drc_ty= pe, +void spapr_hotplug_req_remove_by_count_indexed(SpaprDrcType drc_type, uint32_t count, uint32_t in= dex); int spapr_hpt_shift_for_ramsize(uint64_t ramsize); -void spapr_reallocate_hpt(sPAPRMachineState *spapr, int shift, +void spapr_reallocate_hpt(SpaprMachineState *spapr, int shift, Error **errp); -void spapr_clear_pending_events(sPAPRMachineState *spapr); -int spapr_max_server_number(sPAPRMachineState *spapr); +void spapr_clear_pending_events(SpaprMachineState *spapr); +int spapr_max_server_number(SpaprMachineState *spapr); =20 /* DRC callbacks. */ void spapr_core_release(DeviceState *dev); -int spapr_core_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr, +int spapr_core_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp); void spapr_lmb_release(DeviceState *dev); -int spapr_lmb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr, +int spapr_lmb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp); void spapr_phb_release(DeviceState *dev); -int spapr_phb_dt_populate(sPAPRDRConnector *drc, sPAPRMachineState *spapr, +int spapr_phb_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp); =20 -void spapr_rtc_read(sPAPRRTCState *rtc, struct tm *tm, uint32_t *ns); -int spapr_rtc_import_offset(sPAPRRTCState *rtc, int64_t legacy_offset); +void spapr_rtc_read(SpaprRtcState *rtc, struct tm *tm, uint32_t *ns); +int spapr_rtc_import_offset(SpaprRtcState *rtc, int64_t legacy_offset); =20 #define TYPE_SPAPR_RNG "spapr-rng" =20 @@ -843,18 +843,18 @@ extern const VMStateDescription vmstate_spapr_cap_nes= ted_kvm_hv; extern const VMStateDescription vmstate_spapr_cap_large_decr; extern const VMStateDescription vmstate_spapr_cap_ccf_assist; =20 -static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap) +static inline uint8_t spapr_get_cap(SpaprMachineState *spapr, int cap) { return spapr->eff.caps[cap]; } =20 -void spapr_caps_init(sPAPRMachineState *spapr); -void spapr_caps_apply(sPAPRMachineState *spapr); -void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu); -void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp); -int spapr_caps_post_migration(sPAPRMachineState *spapr); +void spapr_caps_init(SpaprMachineState *spapr); +void spapr_caps_apply(SpaprMachineState *spapr); +void spapr_caps_cpu_apply(SpaprMachineState *spapr, PowerPCCPU *cpu); +void spapr_caps_add_properties(SpaprMachineClass *smc, Error **errp); +int spapr_caps_post_migration(SpaprMachineState *spapr); =20 -void spapr_check_pagesize(sPAPRMachineState *spapr, hwaddr pagesize, +void spapr_check_pagesize(SpaprMachineState *spapr, hwaddr pagesize, Error **errp); /* * XIVE definitions diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_cor= e.h index d64f86bc28..f9645a7290 100644 --- a/include/hw/ppc/spapr_cpu_core.h +++ b/include/hw/ppc/spapr_cpu_core.h @@ -16,43 +16,43 @@ =20 #define TYPE_SPAPR_CPU_CORE "spapr-cpu-core" #define SPAPR_CPU_CORE(obj) \ - OBJECT_CHECK(sPAPRCPUCore, (obj), TYPE_SPAPR_CPU_CORE) + OBJECT_CHECK(SpaprCpuCore, (obj), TYPE_SPAPR_CPU_CORE) #define SPAPR_CPU_CORE_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRCPUCoreClass, (klass), TYPE_SPAPR_CPU_CORE) + OBJECT_CLASS_CHECK(SpaprCpuCoreClass, (klass), TYPE_SPAPR_CPU_CORE) #define SPAPR_CPU_CORE_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRCPUCoreClass, (obj), TYPE_SPAPR_CPU_CORE) + OBJECT_GET_CLASS(SpaprCpuCoreClass, (obj), TYPE_SPAPR_CPU_CORE) =20 #define SPAPR_CPU_CORE_TYPE_NAME(model) model "-" TYPE_SPAPR_CPU_CORE =20 -typedef struct sPAPRCPUCore { +typedef struct SpaprCpuCore { /*< private >*/ CPUCore parent_obj; =20 /*< public >*/ PowerPCCPU **threads; int node_id; - bool pre_3_0_migration; /* older machine don't know about sPAPRCPUStat= e */ -} sPAPRCPUCore; + bool pre_3_0_migration; /* older machine don't know about SpaprCpuStat= e */ +} SpaprCpuCore; =20 -typedef struct sPAPRCPUCoreClass { +typedef struct SpaprCpuCoreClass { DeviceClass parent_class; const char *cpu_type; -} sPAPRCPUCoreClass; +} SpaprCpuCoreClass; =20 const char *spapr_get_cpu_core_type(const char *cpu_type); void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_u= long r3); =20 -typedef struct sPAPRCPUState { +typedef struct SpaprCpuState { uint64_t vpa_addr; uint64_t slb_shadow_addr, slb_shadow_size; uint64_t dtl_addr, dtl_size; struct ICPState *icp; struct XiveTCTX *tctx; -} sPAPRCPUState; +} SpaprCpuState; =20 -static inline sPAPRCPUState *spapr_cpu_state(PowerPCCPU *cpu) +static inline SpaprCpuState *spapr_cpu_state(PowerPCCPU *cpu) { - return (sPAPRCPUState *)cpu->machine_data; + return (SpaprCpuState *)cpu->machine_data; } =20 #endif diff --git a/include/hw/ppc/spapr_drc.h b/include/hw/ppc/spapr_drc.h index 46b0f6216d..fad0a887f9 100644 --- a/include/hw/ppc/spapr_drc.h +++ b/include/hw/ppc/spapr_drc.h @@ -22,65 +22,65 @@ =20 #define TYPE_SPAPR_DR_CONNECTOR "spapr-dr-connector" #define SPAPR_DR_CONNECTOR_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DR_CONNECT= OR) + OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DR_CONNECTOR) #define SPAPR_DR_CONNECTOR_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, \ + OBJECT_CLASS_CHECK(SpaprDrcClass, klass, \ TYPE_SPAPR_DR_CONNECTOR) -#define SPAPR_DR_CONNECTOR(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ +#define SPAPR_DR_CONNECTOR(obj) OBJECT_CHECK(SpaprDrc, (obj), \ TYPE_SPAPR_DR_CONNECTOR) =20 #define TYPE_SPAPR_DRC_PHYSICAL "spapr-drc-physical" #define SPAPR_DRC_PHYSICAL_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_PHYSIC= AL) + OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_PHYSICAL) #define SPAPR_DRC_PHYSICAL_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, \ + OBJECT_CLASS_CHECK(SpaprDrcClass, klass, \ TYPE_SPAPR_DRC_PHYSICAL) -#define SPAPR_DRC_PHYSICAL(obj) OBJECT_CHECK(sPAPRDRCPhysical, (obj), \ +#define SPAPR_DRC_PHYSICAL(obj) OBJECT_CHECK(SpaprDrcPhysical, (obj), \ TYPE_SPAPR_DRC_PHYSICAL) =20 #define TYPE_SPAPR_DRC_LOGICAL "spapr-drc-logical" #define SPAPR_DRC_LOGICAL_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_LOGICA= L) + OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_LOGICAL) #define SPAPR_DRC_LOGICAL_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, \ + OBJECT_CLASS_CHECK(SpaprDrcClass, klass, \ TYPE_SPAPR_DRC_LOGICAL) -#define SPAPR_DRC_LOGICAL(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ +#define SPAPR_DRC_LOGICAL(obj) OBJECT_CHECK(SpaprDrc, (obj), \ TYPE_SPAPR_DRC_LOGICAL) =20 #define TYPE_SPAPR_DRC_CPU "spapr-drc-cpu" #define SPAPR_DRC_CPU_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_CPU) + OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_CPU) #define SPAPR_DRC_CPU_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_CP= U) -#define SPAPR_DRC_CPU(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ + OBJECT_CLASS_CHECK(SpaprDrcClass, klass, TYPE_SPAPR_DRC_CPU) +#define SPAPR_DRC_CPU(obj) OBJECT_CHECK(SpaprDrc, (obj), \ TYPE_SPAPR_DRC_CPU) =20 #define TYPE_SPAPR_DRC_PCI "spapr-drc-pci" #define SPAPR_DRC_PCI_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_PCI) + OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_PCI) #define SPAPR_DRC_PCI_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_PC= I) -#define SPAPR_DRC_PCI(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ + OBJECT_CLASS_CHECK(SpaprDrcClass, klass, TYPE_SPAPR_DRC_PCI) +#define SPAPR_DRC_PCI(obj) OBJECT_CHECK(SpaprDrc, (obj), \ TYPE_SPAPR_DRC_PCI) =20 #define TYPE_SPAPR_DRC_LMB "spapr-drc-lmb" #define SPAPR_DRC_LMB_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_LMB) + OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_LMB) #define SPAPR_DRC_LMB_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_LM= B) -#define SPAPR_DRC_LMB(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ + OBJECT_CLASS_CHECK(SpaprDrcClass, klass, TYPE_SPAPR_DRC_LMB) +#define SPAPR_DRC_LMB(obj) OBJECT_CHECK(SpaprDrc, (obj), \ TYPE_SPAPR_DRC_LMB) =20 #define TYPE_SPAPR_DRC_PHB "spapr-drc-phb" #define SPAPR_DRC_PHB_GET_CLASS(obj) \ - OBJECT_GET_CLASS(sPAPRDRConnectorClass, obj, TYPE_SPAPR_DRC_PHB) + OBJECT_GET_CLASS(SpaprDrcClass, obj, TYPE_SPAPR_DRC_PHB) #define SPAPR_DRC_PHB_CLASS(klass) \ - OBJECT_CLASS_CHECK(sPAPRDRConnectorClass, klass, TYPE_SPAPR_DRC_PH= B) -#define SPAPR_DRC_PHB(obj) OBJECT_CHECK(sPAPRDRConnector, (obj), \ + OBJECT_CLASS_CHECK(SpaprDrcClass, klass, TYPE_SPAPR_DRC_PHB) +#define SPAPR_DRC_PHB(obj) OBJECT_CHECK(SpaprDrc, (obj), \ TYPE_SPAPR_DRC_PHB) =20 /* - * Various hotplug types managed by sPAPRDRConnector + * Various hotplug types managed by SpaprDrc * * these are somewhat arbitrary, but to make things easier * when generating DRC indexes later we've aligned the bit @@ -96,7 +96,7 @@ typedef enum { SPAPR_DR_CONNECTOR_TYPE_SHIFT_VIO =3D 3, SPAPR_DR_CONNECTOR_TYPE_SHIFT_PCI =3D 4, SPAPR_DR_CONNECTOR_TYPE_SHIFT_LMB =3D 8, -} sPAPRDRConnectorTypeShift; +} SpaprDrcTypeShift; =20 typedef enum { SPAPR_DR_CONNECTOR_TYPE_ANY =3D ~0, @@ -105,7 +105,7 @@ typedef enum { SPAPR_DR_CONNECTOR_TYPE_VIO =3D 1 << SPAPR_DR_CONNECTOR_TYPE_SHIFT_VIO, SPAPR_DR_CONNECTOR_TYPE_PCI =3D 1 << SPAPR_DR_CONNECTOR_TYPE_SHIFT_PCI, SPAPR_DR_CONNECTOR_TYPE_LMB =3D 1 << SPAPR_DR_CONNECTOR_TYPE_SHIFT_LMB, -} sPAPRDRConnectorType; +} SpaprDrcType; =20 /* * set via set-indicator RTAS calls @@ -117,7 +117,7 @@ typedef enum { typedef enum { SPAPR_DR_ISOLATION_STATE_ISOLATED =3D 0, SPAPR_DR_ISOLATION_STATE_UNISOLATED =3D 1 -} sPAPRDRIsolationState; +} SpaprDRIsolationState; =20 /* * set via set-indicator RTAS calls @@ -133,7 +133,7 @@ typedef enum { SPAPR_DR_ALLOCATION_STATE_USABLE =3D 1, SPAPR_DR_ALLOCATION_STATE_EXCHANGE =3D 2, SPAPR_DR_ALLOCATION_STATE_RECOVER =3D 3 -} sPAPRDRAllocationState; +} SpaprDRAllocationState; =20 /* * DR-indicator (LED/visual indicator) @@ -152,7 +152,7 @@ typedef enum { SPAPR_DR_INDICATOR_ACTIVE =3D 1, SPAPR_DR_INDICATOR_IDENTIFY =3D 2, SPAPR_DR_INDICATOR_ACTION =3D 3, -} sPAPRDRIndicatorState; +} SpaprDRIndicatorState; =20 /* * returned via get-sensor-state RTAS calls @@ -170,7 +170,7 @@ typedef enum { SPAPR_DR_ENTITY_SENSE_UNUSABLE =3D 2, SPAPR_DR_ENTITY_SENSE_EXCHANGE =3D 3, SPAPR_DR_ENTITY_SENSE_RECOVER =3D 4, -} sPAPRDREntitySense; +} SpaprDREntitySense; =20 typedef enum { SPAPR_DR_CC_RESPONSE_NEXT_SIB =3D 1, /* currently unused */ @@ -181,7 +181,7 @@ typedef enum { SPAPR_DR_CC_RESPONSE_ERROR =3D -1, SPAPR_DR_CC_RESPONSE_CONTINUE =3D -2, SPAPR_DR_CC_RESPONSE_NOT_CONFIGURABLE =3D -9003, -} sPAPRDRCCResponse; +} SpaprDRCCResponse; =20 typedef enum { /* @@ -199,9 +199,9 @@ typedef enum { SPAPR_DRC_STATE_PHYSICAL_POWERON =3D 6, SPAPR_DRC_STATE_PHYSICAL_UNISOLATE =3D 7, SPAPR_DRC_STATE_PHYSICAL_CONFIGURED =3D 8, -} sPAPRDRCState; +} SpaprDrcState; =20 -typedef struct sPAPRDRConnector { +typedef struct SpaprDrc { /*< private >*/ DeviceState parent; =20 @@ -220,60 +220,60 @@ typedef struct sPAPRDRConnector { bool unplug_requested; void *fdt; int fdt_start_offset; -} sPAPRDRConnector; +} SpaprDrc; =20 -struct sPAPRMachineState; +struct SpaprMachineState; =20 -typedef struct sPAPRDRConnectorClass { +typedef struct SpaprDrcClass { /*< private >*/ DeviceClass parent; - sPAPRDRCState empty_state; - sPAPRDRCState ready_state; + SpaprDrcState empty_state; + SpaprDrcState ready_state; =20 /*< public >*/ - sPAPRDRConnectorTypeShift typeshift; + SpaprDrcTypeShift typeshift; const char *typename; /* used in device tree, PAPR 13.5.2.6 & C.6.1 */ const char *drc_name_prefix; /* used other places in device tree */ =20 - sPAPRDREntitySense (*dr_entity_sense)(sPAPRDRConnector *drc); - uint32_t (*isolate)(sPAPRDRConnector *drc); - uint32_t (*unisolate)(sPAPRDRConnector *drc); + SpaprDREntitySense (*dr_entity_sense)(SpaprDrc *drc); + uint32_t (*isolate)(SpaprDrc *drc); + uint32_t (*unisolate)(SpaprDrc *drc); void (*release)(DeviceState *dev); =20 - int (*dt_populate)(sPAPRDRConnector *drc, struct sPAPRMachineState *sp= apr, + int (*dt_populate)(SpaprDrc *drc, struct SpaprMachineState *spapr, void *fdt, int *fdt_start_offset, Error **errp); -} sPAPRDRConnectorClass; +} SpaprDrcClass; =20 -typedef struct sPAPRDRCPhysical { +typedef struct SpaprDrcPhysical { /*< private >*/ - sPAPRDRConnector parent; + SpaprDrc parent; =20 /* DR-indicator */ uint32_t dr_indicator; -} sPAPRDRCPhysical; +} SpaprDrcPhysical; =20 static inline bool spapr_drc_hotplugged(DeviceState *dev) { return dev->hotplugged && !runstate_check(RUN_STATE_INMIGRATE); } =20 -void spapr_drc_reset(sPAPRDRConnector *drc); +void spapr_drc_reset(SpaprDrc *drc); =20 -uint32_t spapr_drc_index(sPAPRDRConnector *drc); -sPAPRDRConnectorType spapr_drc_type(sPAPRDRConnector *drc); +uint32_t spapr_drc_index(SpaprDrc *drc); +SpaprDrcType spapr_drc_type(SpaprDrc *drc); =20 -sPAPRDRConnector *spapr_dr_connector_new(Object *owner, const char *type, +SpaprDrc *spapr_dr_connector_new(Object *owner, const char *type, uint32_t id); -sPAPRDRConnector *spapr_drc_by_index(uint32_t index); -sPAPRDRConnector *spapr_drc_by_id(const char *type, uint32_t id); +SpaprDrc *spapr_drc_by_index(uint32_t index); +SpaprDrc *spapr_drc_by_id(const char *type, uint32_t id); int spapr_drc_populate_dt(void *fdt, int fdt_offset, Object *owner, uint32_t drc_type_mask); =20 -void spapr_drc_attach(sPAPRDRConnector *drc, DeviceState *d, Error **errp); -void spapr_drc_detach(sPAPRDRConnector *drc); +void spapr_drc_attach(SpaprDrc *drc, DeviceState *d, Error **errp); +void spapr_drc_detach(SpaprDrc *drc); bool spapr_drc_needed(void *opaque); =20 -static inline bool spapr_drc_unplug_requested(sPAPRDRConnector *drc) +static inline bool spapr_drc_unplug_requested(SpaprDrc *drc) { return drc->unplug_requested; } diff --git a/include/hw/ppc/spapr_irq.h b/include/hw/ppc/spapr_irq.h index ec1ee64fa6..b855f74e44 100644 --- a/include/hw/ppc/spapr_irq.h +++ b/include/hw/ppc/spapr_irq.h @@ -22,51 +22,51 @@ #define SPAPR_IRQ_MSI 0x1300 /* Offset of the dynamic range covered * by the bitmap allocator */ =20 -typedef struct sPAPRMachineState sPAPRMachineState; +typedef struct SpaprMachineState SpaprMachineState; =20 -void spapr_irq_msi_init(sPAPRMachineState *spapr, uint32_t nr_msis); -int spapr_irq_msi_alloc(sPAPRMachineState *spapr, uint32_t num, bool align, +void spapr_irq_msi_init(SpaprMachineState *spapr, uint32_t nr_msis); +int spapr_irq_msi_alloc(SpaprMachineState *spapr, uint32_t num, bool align, Error **errp); -void spapr_irq_msi_free(sPAPRMachineState *spapr, int irq, uint32_t num); -void spapr_irq_msi_reset(sPAPRMachineState *spapr); +void spapr_irq_msi_free(SpaprMachineState *spapr, int irq, uint32_t num); +void spapr_irq_msi_reset(SpaprMachineState *spapr); =20 -typedef struct sPAPRIrq { +typedef struct SpaprIrq { uint32_t nr_irqs; uint32_t nr_msis; uint8_t ov5; =20 - void (*init)(sPAPRMachineState *spapr, int nr_irqs, Error **errp); - int (*claim)(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp= ); - void (*free)(sPAPRMachineState *spapr, int irq, int num); - qemu_irq (*qirq)(sPAPRMachineState *spapr, int irq); - void (*print_info)(sPAPRMachineState *spapr, Monitor *mon); - void (*dt_populate)(sPAPRMachineState *spapr, uint32_t nr_servers, + void (*init)(SpaprMachineState *spapr, int nr_irqs, Error **errp); + int (*claim)(SpaprMachineState *spapr, int irq, bool lsi, Error **errp= ); + void (*free)(SpaprMachineState *spapr, int irq, int num); + qemu_irq (*qirq)(SpaprMachineState *spapr, int irq); + void (*print_info)(SpaprMachineState *spapr, Monitor *mon); + void (*dt_populate)(SpaprMachineState *spapr, uint32_t nr_servers, void *fdt, uint32_t phandle); - void (*cpu_intc_create)(sPAPRMachineState *spapr, PowerPCCPU *cpu, + void (*cpu_intc_create)(SpaprMachineState *spapr, PowerPCCPU *cpu, Error **errp); - int (*post_load)(sPAPRMachineState *spapr, int version_id); - void (*reset)(sPAPRMachineState *spapr, Error **errp); + int (*post_load)(SpaprMachineState *spapr, int version_id); + void (*reset)(SpaprMachineState *spapr, Error **errp); void (*set_irq)(void *opaque, int srcno, int val); - const char *(*get_nodename)(sPAPRMachineState *spapr); -} sPAPRIrq; + const char *(*get_nodename)(SpaprMachineState *spapr); +} SpaprIrq; =20 -extern sPAPRIrq spapr_irq_xics; -extern sPAPRIrq spapr_irq_xics_legacy; -extern sPAPRIrq spapr_irq_xive; -extern sPAPRIrq spapr_irq_dual; +extern SpaprIrq spapr_irq_xics; +extern SpaprIrq spapr_irq_xics_legacy; +extern SpaprIrq spapr_irq_xive; +extern SpaprIrq spapr_irq_dual; =20 -void spapr_irq_init(sPAPRMachineState *spapr, Error **errp); -int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **e= rrp); -void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num); -qemu_irq spapr_qirq(sPAPRMachineState *spapr, int irq); -int spapr_irq_post_load(sPAPRMachineState *spapr, int version_id); -void spapr_irq_reset(sPAPRMachineState *spapr, Error **errp); -int spapr_irq_get_phandle(sPAPRMachineState *spapr, void *fdt, Error **err= p); +void spapr_irq_init(SpaprMachineState *spapr, Error **errp); +int spapr_irq_claim(SpaprMachineState *spapr, int irq, bool lsi, Error **e= rrp); +void spapr_irq_free(SpaprMachineState *spapr, int irq, int num); +qemu_irq spapr_qirq(SpaprMachineState *spapr, int irq); +int spapr_irq_post_load(SpaprMachineState *spapr, int version_id); +void spapr_irq_reset(SpaprMachineState *spapr, Error **errp); +int spapr_irq_get_phandle(SpaprMachineState *spapr, void *fdt, Error **err= p); =20 /* * XICS legacy routines */ -int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **= errp); +int spapr_irq_find(SpaprMachineState *spapr, int num, bool align, Error **= errp); #define spapr_irq_findone(spapr, errp) spapr_irq_find(spapr, 1, false, err= p) =20 #endif diff --git a/include/hw/ppc/spapr_ovec.h b/include/hw/ppc/spapr_ovec.h index 0f2d8d715d..188a9367e2 100644 --- a/include/hw/ppc/spapr_ovec.h +++ b/include/hw/ppc/spapr_ovec.h @@ -39,7 +39,7 @@ #include "cpu.h" #include "migration/vmstate.h" =20 -typedef struct sPAPROptionVector sPAPROptionVector; +typedef struct SpaprOptionVector SpaprOptionVector; =20 #define OV_BIT(byte, bit) ((byte - 1) * BITS_PER_BYTE + bit) =20 @@ -61,21 +61,21 @@ typedef struct sPAPROptionVector sPAPROptionVector; #define OV5_MMU_RADIX_GTSE OV_BIT(26, 1) /* Radix GTSE */ =20 /* interfaces */ -sPAPROptionVector *spapr_ovec_new(void); -sPAPROptionVector *spapr_ovec_clone(sPAPROptionVector *ov_orig); -void spapr_ovec_intersect(sPAPROptionVector *ov, - sPAPROptionVector *ov1, - sPAPROptionVector *ov2); -bool spapr_ovec_diff(sPAPROptionVector *ov, - sPAPROptionVector *ov_old, - sPAPROptionVector *ov_new); -void spapr_ovec_cleanup(sPAPROptionVector *ov); -void spapr_ovec_set(sPAPROptionVector *ov, long bitnr); -void spapr_ovec_clear(sPAPROptionVector *ov, long bitnr); -bool spapr_ovec_test(sPAPROptionVector *ov, long bitnr); -sPAPROptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int ve= ctor); +SpaprOptionVector *spapr_ovec_new(void); +SpaprOptionVector *spapr_ovec_clone(SpaprOptionVector *ov_orig); +void spapr_ovec_intersect(SpaprOptionVector *ov, + SpaprOptionVector *ov1, + SpaprOptionVector *ov2); +bool spapr_ovec_diff(SpaprOptionVector *ov, + SpaprOptionVector *ov_old, + SpaprOptionVector *ov_new); +void spapr_ovec_cleanup(SpaprOptionVector *ov); +void spapr_ovec_set(SpaprOptionVector *ov, long bitnr); +void spapr_ovec_clear(SpaprOptionVector *ov, long bitnr); +bool spapr_ovec_test(SpaprOptionVector *ov, long bitnr); +SpaprOptionVector *spapr_ovec_parse_vector(target_ulong table_addr, int ve= ctor); int spapr_ovec_populate_dt(void *fdt, int fdt_offset, - sPAPROptionVector *ov, const char *name); + SpaprOptionVector *ov, const char *name); =20 /* migration */ extern const VMStateDescription vmstate_spapr_ovec; diff --git a/include/hw/ppc/spapr_vio.h b/include/hw/ppc/spapr_vio.h index e8b006d18f..04609f214e 100644 --- a/include/hw/ppc/spapr_vio.h +++ b/include/hw/ppc/spapr_vio.h @@ -26,91 +26,91 @@ =20 #define TYPE_VIO_SPAPR_DEVICE "vio-spapr-device" #define VIO_SPAPR_DEVICE(obj) \ - OBJECT_CHECK(VIOsPAPRDevice, (obj), TYPE_VIO_SPAPR_DEVICE) + OBJECT_CHECK(SpaprVioDevice, (obj), TYPE_VIO_SPAPR_DEVICE) #define VIO_SPAPR_DEVICE_CLASS(klass) \ - OBJECT_CLASS_CHECK(VIOsPAPRDeviceClass, (klass), TYPE_VIO_SPAPR_DEVIC= E) + OBJECT_CLASS_CHECK(SpaprVioDeviceClass, (klass), TYPE_VIO_SPAPR_DEVIC= E) #define VIO_SPAPR_DEVICE_GET_CLASS(obj) \ - OBJECT_GET_CLASS(VIOsPAPRDeviceClass, (obj), TYPE_VIO_SPAPR_DEVICE) + OBJECT_GET_CLASS(SpaprVioDeviceClass, (obj), TYPE_VIO_SPAPR_DEVICE) =20 #define TYPE_SPAPR_VIO_BUS "spapr-vio-bus" -#define SPAPR_VIO_BUS(obj) OBJECT_CHECK(VIOsPAPRBus, (obj), TYPE_SPAPR_VIO= _BUS) +#define SPAPR_VIO_BUS(obj) OBJECT_CHECK(SpaprVioBus, (obj), TYPE_SPAPR_VIO= _BUS) =20 #define TYPE_SPAPR_VIO_BRIDGE "spapr-vio-bridge" =20 -typedef struct VIOsPAPR_CRQ { +typedef struct SpaprVioCrq { uint64_t qladdr; uint32_t qsize; uint32_t qnext; - int(*SendFunc)(struct VIOsPAPRDevice *vdev, uint8_t *crq); -} VIOsPAPR_CRQ; + int(*SendFunc)(struct SpaprVioDevice *vdev, uint8_t *crq); +} SpaprVioCrq; =20 -typedef struct VIOsPAPRDevice VIOsPAPRDevice; -typedef struct VIOsPAPRBus VIOsPAPRBus; +typedef struct SpaprVioDevice SpaprVioDevice; +typedef struct SpaprVioBus SpaprVioBus; =20 -typedef struct VIOsPAPRDeviceClass { +typedef struct SpaprVioDeviceClass { DeviceClass parent_class; =20 const char *dt_name, *dt_type, *dt_compatible; target_ulong signal_mask; uint32_t rtce_window_size; - void (*realize)(VIOsPAPRDevice *dev, Error **errp); - void (*reset)(VIOsPAPRDevice *dev); - int (*devnode)(VIOsPAPRDevice *dev, void *fdt, int node_off); -} VIOsPAPRDeviceClass; + void (*realize)(SpaprVioDevice *dev, Error **errp); + void (*reset)(SpaprVioDevice *dev); + int (*devnode)(SpaprVioDevice *dev, void *fdt, int node_off); +} SpaprVioDeviceClass; =20 -struct VIOsPAPRDevice { +struct SpaprVioDevice { DeviceState qdev; uint32_t reg; uint32_t irq; uint64_t signal_state; - VIOsPAPR_CRQ crq; + SpaprVioCrq crq; AddressSpace as; MemoryRegion mrroot; MemoryRegion mrbypass; - sPAPRTCETable *tcet; + SpaprTceTable *tcet; }; =20 #define DEFINE_SPAPR_PROPERTIES(type, field) \ DEFINE_PROP_UINT32("reg", type, field.reg, -1) =20 -struct VIOsPAPRBus { +struct SpaprVioBus { BusState bus; uint32_t next_reg; }; =20 -extern VIOsPAPRBus *spapr_vio_bus_init(void); -extern VIOsPAPRDevice *spapr_vio_find_by_reg(VIOsPAPRBus *bus, uint32_t re= g); -void spapr_dt_vdevice(VIOsPAPRBus *bus, void *fdt); -extern gchar *spapr_vio_stdout_path(VIOsPAPRBus *bus); +extern SpaprVioBus *spapr_vio_bus_init(void); +extern SpaprVioDevice *spapr_vio_find_by_reg(SpaprVioBus *bus, uint32_t re= g); +void spapr_dt_vdevice(SpaprVioBus *bus, void *fdt); +extern gchar *spapr_vio_stdout_path(SpaprVioBus *bus); =20 -static inline qemu_irq spapr_vio_qirq(VIOsPAPRDevice *dev) +static inline qemu_irq spapr_vio_qirq(SpaprVioDevice *dev) { - sPAPRMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); + SpaprMachineState *spapr =3D SPAPR_MACHINE(qdev_get_machine()); =20 return spapr_qirq(spapr, dev->irq); } =20 -static inline bool spapr_vio_dma_valid(VIOsPAPRDevice *dev, uint64_t taddr, +static inline bool spapr_vio_dma_valid(SpaprVioDevice *dev, uint64_t taddr, uint32_t size, DMADirection dir) { return dma_memory_valid(&dev->as, taddr, size, dir); } =20 -static inline int spapr_vio_dma_read(VIOsPAPRDevice *dev, uint64_t taddr, +static inline int spapr_vio_dma_read(SpaprVioDevice *dev, uint64_t taddr, void *buf, uint32_t size) { return (dma_memory_read(&dev->as, taddr, buf, size) !=3D 0) ? H_DEST_PARM : H_SUCCESS; } =20 -static inline int spapr_vio_dma_write(VIOsPAPRDevice *dev, uint64_t taddr, +static inline int spapr_vio_dma_write(SpaprVioDevice *dev, uint64_t taddr, const void *buf, uint32_t size) { return (dma_memory_write(&dev->as, taddr, buf, size) !=3D 0) ? H_DEST_PARM : H_SUCCESS; } =20 -static inline int spapr_vio_dma_set(VIOsPAPRDevice *dev, uint64_t taddr, +static inline int spapr_vio_dma_set(SpaprVioDevice *dev, uint64_t taddr, uint8_t c, uint32_t size) { return (dma_memory_set(&dev->as, taddr, c, size) !=3D 0) ? @@ -123,21 +123,21 @@ static inline int spapr_vio_dma_set(VIOsPAPRDevice *d= ev, uint64_t taddr, #define vio_stq(_dev, _addr, _val) (stq_be_dma(&(_dev)->as, (_addr), (_val= ))) #define vio_ldq(_dev, _addr) (ldq_be_dma(&(_dev)->as, (_addr))) =20 -int spapr_vio_send_crq(VIOsPAPRDevice *dev, uint8_t *crq); +int spapr_vio_send_crq(SpaprVioDevice *dev, uint8_t *crq); =20 -VIOsPAPRDevice *vty_lookup(sPAPRMachineState *spapr, target_ulong reg); -void vty_putchars(VIOsPAPRDevice *sdev, uint8_t *buf, int len); -void spapr_vty_create(VIOsPAPRBus *bus, Chardev *chardev); -void spapr_vlan_create(VIOsPAPRBus *bus, NICInfo *nd); -void spapr_vscsi_create(VIOsPAPRBus *bus); +SpaprVioDevice *vty_lookup(SpaprMachineState *spapr, target_ulong reg); +void vty_putchars(SpaprVioDevice *sdev, uint8_t *buf, int len); +void spapr_vty_create(SpaprVioBus *bus, Chardev *chardev); +void spapr_vlan_create(SpaprVioBus *bus, NICInfo *nd); +void spapr_vscsi_create(SpaprVioBus *bus); =20 -VIOsPAPRDevice *spapr_vty_get_default(VIOsPAPRBus *bus); +SpaprVioDevice *spapr_vty_get_default(SpaprVioBus *bus); =20 extern const VMStateDescription vmstate_spapr_vio; =20 #define VMSTATE_SPAPR_VIO(_f, _s) \ - VMSTATE_STRUCT(_f, _s, 0, vmstate_spapr_vio, VIOsPAPRDevice) + VMSTATE_STRUCT(_f, _s, 0, vmstate_spapr_vio, SpaprVioDevice) =20 -void spapr_vio_set_bypass(VIOsPAPRDevice *dev, bool bypass); +void spapr_vio_set_bypass(SpaprVioDevice *dev, bool bypass); =20 #endif /* HW_SPAPR_VIO_H */ diff --git a/include/hw/ppc/spapr_xive.h b/include/hw/ppc/spapr_xive.h index 2d31f24e3b..fc3e9652f9 100644 --- a/include/hw/ppc/spapr_xive.h +++ b/include/hw/ppc/spapr_xive.h @@ -13,9 +13,9 @@ #include "hw/ppc/xive.h" =20 #define TYPE_SPAPR_XIVE "spapr-xive" -#define SPAPR_XIVE(obj) OBJECT_CHECK(sPAPRXive, (obj), TYPE_SPAPR_XIVE) +#define SPAPR_XIVE(obj) OBJECT_CHECK(SpaprXive, (obj), TYPE_SPAPR_XIVE) =20 -typedef struct sPAPRXive { +typedef struct SpaprXive { XiveRouter parent; =20 /* Internal interrupt source for IPIs and virtual devices */ @@ -38,16 +38,16 @@ typedef struct sPAPRXive { /* TIMA mapping address */ hwaddr tm_base; MemoryRegion tm_mmio; -} sPAPRXive; +} SpaprXive; =20 -bool spapr_xive_irq_claim(sPAPRXive *xive, uint32_t lisn, bool lsi); -bool spapr_xive_irq_free(sPAPRXive *xive, uint32_t lisn); -void spapr_xive_pic_print_info(sPAPRXive *xive, Monitor *mon); +bool spapr_xive_irq_claim(SpaprXive *xive, uint32_t lisn, bool lsi); +bool spapr_xive_irq_free(SpaprXive *xive, uint32_t lisn); +void spapr_xive_pic_print_info(SpaprXive *xive, Monitor *mon); =20 -void spapr_xive_hcall_init(sPAPRMachineState *spapr); -void spapr_dt_xive(sPAPRMachineState *spapr, uint32_t nr_servers, void *fd= t, +void spapr_xive_hcall_init(SpaprMachineState *spapr); +void spapr_dt_xive(SpaprMachineState *spapr, uint32_t nr_servers, void *fd= t, uint32_t phandle); void spapr_xive_set_tctx_os_cam(XiveTCTX *tctx); -void spapr_xive_mmio_set_enabled(sPAPRXive *xive, bool enable); +void spapr_xive_mmio_set_enabled(SpaprXive *xive, bool enable); =20 #endif /* PPC_SPAPR_XIVE_H */ diff --git a/include/hw/ppc/xics_spapr.h b/include/hw/ppc/xics_spapr.h index b8d924baf4..15a8dcff66 100644 --- a/include/hw/ppc/xics_spapr.h +++ b/include/hw/ppc/xics_spapr.h @@ -31,9 +31,9 @@ =20 #define XICS_NODENAME "interrupt-controller" =20 -void spapr_dt_xics(sPAPRMachineState *spapr, uint32_t nr_servers, void *fd= t, +void spapr_dt_xics(SpaprMachineState *spapr, uint32_t nr_servers, void *fd= t, uint32_t phandle); -int xics_kvm_init(sPAPRMachineState *spapr, Error **errp); -void xics_spapr_init(sPAPRMachineState *spapr); +int xics_kvm_init(SpaprMachineState *spapr, Error **errp); +void xics_spapr_init(SpaprMachineState *spapr); =20 #endif /* XICS_SPAPR_H */ diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 1c0a586ea8..2427c8ee13 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -756,7 +756,7 @@ static int kvm_get_fp(CPUState *cs) static int kvm_get_vpa(CPUState *cs) { PowerPCCPU *cpu =3D POWERPC_CPU(cs); - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); struct kvm_one_reg reg; int ret; =20 @@ -796,7 +796,7 @@ static int kvm_get_vpa(CPUState *cs) static int kvm_put_vpa(CPUState *cs) { PowerPCCPU *cpu =3D POWERPC_CPU(cs); - sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); + SpaprCpuState *spapr_cpu =3D spapr_cpu_state(cpu); struct kvm_one_reg reg; int ret; =20 --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552386282201894.3041500854473; Tue, 12 Mar 2019 03:24:42 -0700 (PDT) Received: from localhost ([127.0.0.1]:49041 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eaI-00031l-1s for importer@patchew.org; Tue, 12 Mar 2019 06:24:34 -0400 Received: from eggs.gnu.org ([209.51.188.92]:54098) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUV-0000xK-5l for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDl-0002sY-1S for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:14 -0400 Received: from ozlabs.org ([203.11.71.1]:43997) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDk-0002Z2-E5; Tue, 12 Mar 2019 04:57:12 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMk4SdRz9sPq; Tue, 12 Mar 2019 19:55:44 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380946; bh=NWVM0WYb41rB+m1iKVloSY4OjFUj5M/X8/OhPYmhJf4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZgvQvSJ3fTHN+rXtcrtFr+O4daInEzI2fUFpJYHiRWzL3wLpuw3qwx+XqlEXpAL2T c7xhCz/WArawcVOzPsCq1scQwMqsyACqtuKxOopKHqroAweY1zqBJXQOgvqt7KZPQn yXnYLiDKzy4nfJYM+IbHT0aDp3D/KMrC77JzhHvA= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:55:01 +1100 Message-Id: <20190312085502.8203-62-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 61/62] Suppress test warnings about missing Spectre/Meltdown mitigations with 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, qemu-devel@nongnu.org, groug@kaod.org, qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" The new pseries-4.0 machine type defaults to enabling Spectre/Meltdown mitigations. Unfortunately those mitigations aren't implemented for TCG because we're not yet sure if they're necessary or how to implement them. We don't fail fatally, but we do warn in this case, because it is quite plausible that Spectre/Meltdown can be exploited through TCG (at least for the guest to get access to the qemu address space). This create noise in our testcases though. So, modify the affected tests to explicitly disable the mitigations to suppress these warnings. Signed-off-by: David Gibson --- tests/boot-serial-test.c | 4 +++- tests/prom-env-test.c | 13 ++++++++++--- tests/pxe-test.c | 19 ++++++++++++++----- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c index 58a48f39bf..c591748aaf 100644 --- a/tests/boot-serial-test.c +++ b/tests/boot-serial-test.c @@ -100,7 +100,9 @@ static testdef_t tests[] =3D { { "ppc64", "ppce500", "", "U-Boot" }, { "ppc64", "40p", "-m 192", "Memory: 192M" }, { "ppc64", "mac99", "", "PowerPC,970FX" }, - { "ppc64", "pseries", "", "Open Firmware" }, + { "ppc64", "pseries", + "-machine cap-cfpc=3Dbroken,cap-sbbc=3Dbroken,cap-ibs=3Dbroken", + "Open Firmware" }, { "ppc64", "powernv", "-cpu POWER8", "OPAL" }, { "ppc64", "sam460ex", "-device e1000", "8086 100e" }, { "i386", "isapc", "-cpu qemu32 -device sga", "SGABIOS" }, diff --git a/tests/prom-env-test.c b/tests/prom-env-test.c index 4821254b7e..61bc1d1e7b 100644 --- a/tests/prom-env-test.c +++ b/tests/prom-env-test.c @@ -44,11 +44,18 @@ static void check_guest_memory(QTestState *qts) =20 static void test_machine(const void *machine) { - const char *extra_args; + const char *extra_args =3D ""; QTestState *qts; =20 - /* The pseries firmware boots much faster without the default devices = */ - extra_args =3D strcmp(machine, "pseries") =3D=3D 0 ? "-nodefaults" : "= "; + /* + * The pseries firmware boots much faster without the default + * devices, it also needs Spectre/Meltdown workarounds disabled to + * avoid warnings with TCG + */ + if (strcmp(machine, "pseries") =3D=3D 0) { + extra_args =3D "-nodefaults" + " -machine cap-cfpc=3Dbroken,cap-sbbc=3Dbroken,cap-ibs=3Dbroke= n"; + } =20 qts =3D qtest_initf("-M %s,accel=3Dtcg %s -prom-env 'use-nvramrc?=3Dtr= ue' " "-prom-env 'nvramrc=3D%x %x l!' ", (const char *)mac= hine, diff --git a/tests/pxe-test.c b/tests/pxe-test.c index 73ac1d1c61..948b0fbdc7 100644 --- a/tests/pxe-test.c +++ b/tests/pxe-test.c @@ -25,6 +25,7 @@ static char disk[] =3D "tests/pxe-test-disk-XXXXXX"; typedef struct testdef { const char *machine; /* Machine type */ const char *model; /* NIC device model */ + const char *extra; /* Any additional parameters */ } testdef_t; =20 static testdef_t x86_tests[] =3D { @@ -44,13 +45,16 @@ static testdef_t x86_tests_slow[] =3D { }; =20 static testdef_t ppc64_tests[] =3D { - { "pseries", "spapr-vlan" }, - { "pseries", "virtio-net-pci", }, + { "pseries", "spapr-vlan", + "-machine cap-cfpc=3Dbroken,cap-sbbc=3Dbroken,cap-ibs=3Dbroken" }, + { "pseries", "virtio-net-pci", + "-machine cap-cfpc=3Dbroken,cap-sbbc=3Dbroken,cap-ibs=3Dbroken" }, { NULL }, }; =20 static testdef_t ppc64_tests_slow[] =3D { - { "pseries", "e1000" }, + { "pseries", "e1000", + "-machine cap-cfpc=3Dbroken,cap-sbbc=3Dbroken,cap-ibs=3Dbroken" }, { NULL }, }; =20 @@ -63,13 +67,18 @@ static void test_pxe_one(const testdef_t *test, bool ip= v6) { QTestState *qts; char *args; + const char *extra =3D test->extra; + + if (!extra) { + extra =3D ""; + } =20 args =3D g_strdup_printf( "-machine %s,accel=3Dkvm:tcg -nodefaults -boot order=3Dn " "-netdev user,id=3D" NETNAME ",tftp=3D./,bootfile=3D%s,ipv4=3D%s,i= pv6=3D%s " - "-device %s,bootindex=3D1,netdev=3D" NETNAME, + "-device %s,bootindex=3D1,netdev=3D" NETNAME " %s", test->machine, disk, ipv6 ? "off" : "on", ipv6 ? "on" : "off", - test->model); + test->model, extra); =20 qts =3D qtest_init(args); boot_sector_test(qts); --=20 2.20.1 From nobody Sun May 5 04:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1552385426151518.3622537982702; Tue, 12 Mar 2019 03:10:26 -0700 (PDT) Received: from localhost ([127.0.0.1]:48803 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3eMP-00088K-V9 for importer@patchew.org; Tue, 12 Mar 2019 06:10:13 -0400 Received: from eggs.gnu.org ([209.51.188.92]:53977) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3dUQ-0000mG-61 for qemu-devel@nongnu.org; Tue, 12 Mar 2019 05:14:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3dDz-00031R-TU for qemu-devel@nongnu.org; Tue, 12 Mar 2019 04:57:28 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:53787) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h3dDz-0002kL-G0; Tue, 12 Mar 2019 04:57:27 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 44JTMn48K9z9sQn; Tue, 12 Mar 2019 19:55:45 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1552380949; bh=/SOWnS87DFN9hUb7mNrOboWCjoPrGzm6ipI2XT60QgU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NvxcxIDB0GXLOF/XtyRcQBKpLSs5GiUO+pBcH3pbH/+9ddWqG/fQ9aco1Z4QOtfwS gsCm/3G3dRMw16sRpxxDN5A9lRLZ41EGwTGPQ17uTOoLm6k0tvFxMTcrk3zjRbjiZe UDYYWIJLNIb6OdK2xwhEGGuh8hIubWYCDl0XS2Yg= From: David Gibson To: peter.maydell@linaro.org Date: Tue, 12 Mar 2019 19:55:02 +1100 Message-Id: <20190312085502.8203-63-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190312085502.8203-1-david@gibson.dropbear.id.au> References: <20190312085502.8203-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2401:3900:2:1::2 Subject: [Qemu-devel] [PULL 62/62] vfio: Make vfio_get_region_info_cap public 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, Alexey Kardashevskiy , qemu-devel@nongnu.org, groug@kaod.org, Alex Williamson , qemu-ppc@nongnu.org, clg@kaod.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" From: Alexey Kardashevskiy This makes vfio_get_region_info_cap() to be used in quirks. Signed-off-by: Alexey Kardashevskiy Acked-by: Alex Williamson Message-Id: <20190307050518.64968-3-aik@ozlabs.ru> Signed-off-by: David Gibson --- hw/vfio/common.c | 2 +- include/hw/vfio/vfio-common.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/vfio/common.c b/hw/vfio/common.c index df2b4721bf..4374cc6176 100644 --- a/hw/vfio/common.c +++ b/hw/vfio/common.c @@ -729,7 +729,7 @@ static void vfio_listener_release(VFIOContainer *contai= ner) } } =20 -static struct vfio_info_cap_header * +struct vfio_info_cap_header * vfio_get_region_info_cap(struct vfio_region_info *info, uint16_t id) { struct vfio_info_cap_header *hdr; diff --git a/include/hw/vfio/vfio-common.h b/include/hw/vfio/vfio-common.h index 7624c9f511..fbf0966af4 100644 --- a/include/hw/vfio/vfio-common.h +++ b/include/hw/vfio/vfio-common.h @@ -189,6 +189,8 @@ int vfio_get_region_info(VFIODevice *vbasedev, int inde= x, int vfio_get_dev_region_info(VFIODevice *vbasedev, uint32_t type, uint32_t subtype, struct vfio_region_info **i= nfo); bool vfio_has_region_cap(VFIODevice *vbasedev, int region, uint16_t cap_ty= pe); +struct vfio_info_cap_header * +vfio_get_region_info_cap(struct vfio_region_info *info, uint16_t id); #endif extern const MemoryListener vfio_prereg_listener; =20 --=20 2.20.1