From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 152966416426595.71470371634234; Fri, 22 Jun 2018 03:42:44 -0700 (PDT) Received: from localhost ([::1]:60709 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJWd-0005zV-Fo for importer@patchew.org; Fri, 22 Jun 2018 06:42:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45585) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPq-0000bv-1f for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPl-0003LB-UX for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:42 -0400 Received: from ozlabs.org ([203.11.71.1]:49583) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPl-0003JW-9P; Fri, 22 Jun 2018 06:35:37 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2G0pSpz9s4s; Fri, 22 Jun 2018 20:35:33 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663734; bh=iDq1RdUtodaLl3+YDphUt28ncjQ1vN1Iz0674CDcxkI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KTaGp2Pu9VB0iC3wgkBz0b1525EmRUDT+uvhRr9p1sieIQWvfIvEKkTUYY/cOfKqK g5eM9c4EMpNUOaNzdL3Sl/y8XeWJBhZq96uBOiMPdnhs5yiLqC7PWeUfq7qWzEr01t ticmNDyW09MSLSN7cWjxDJsZgUE5aAv4Tvf9uWcg= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:04 +1000 Message-Id: <20180622103528.28598-2-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 01/25] ppc/pnv: introduce a new intc_create() 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater On Power9, the thread interrupt presenter has a different type and is linked to the chip owning the cores. Signed-off-by: C=C3=A9dric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 21 +++++++++++++++++++-- hw/ppc/pnv_core.c | 18 +++++++++--------- include/hw/ppc/pnv.h | 1 + 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 0d2b79f798..c7e127ae97 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -671,6 +671,13 @@ static uint32_t pnv_chip_core_pir_p8(PnvChip *chip, ui= nt32_t core_id) return (chip->chip_id << 7) | (core_id << 3); } =20 +static Object *pnv_chip_power8_intc_create(PnvChip *chip, Object *child, + Error **errp) +{ + return icp_create(child, TYPE_PNV_ICP, XICS_FABRIC(qdev_get_machine()), + errp); +} + /* * 0:48 Reserved - Read as zeroes * 49:52 Node ID @@ -686,6 +693,12 @@ static uint32_t pnv_chip_core_pir_p9(PnvChip *chip, ui= nt32_t core_id) return (chip->chip_id << 8) | (core_id << 2); } =20 +static Object *pnv_chip_power9_intc_create(PnvChip *chip, Object *child, + Error **errp) +{ + return NULL; +} + /* Allowed core identifiers on a POWER8 Processor Chip : * * @@ -721,6 +734,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *kl= ass, void *data) k->chip_cfam_id =3D 0x221ef04980000000ull; /* P8 Murano DD2.1 */ k->cores_mask =3D POWER8E_CORE_MASK; k->core_pir =3D pnv_chip_core_pir_p8; + k->intc_create =3D pnv_chip_power8_intc_create; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8E"; } @@ -734,6 +748,7 @@ static void pnv_chip_power8_class_init(ObjectClass *kla= ss, void *data) k->chip_cfam_id =3D 0x220ea04980000000ull; /* P8 Venice DD2.0 */ k->cores_mask =3D POWER8_CORE_MASK; k->core_pir =3D pnv_chip_core_pir_p8; + k->intc_create =3D pnv_chip_power8_intc_create; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8"; } @@ -747,6 +762,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *= klass, void *data) k->chip_cfam_id =3D 0x120d304980000000ull; /* P8 Naples DD1.0 */ k->cores_mask =3D POWER8_CORE_MASK; k->core_pir =3D pnv_chip_core_pir_p8; + k->intc_create =3D pnv_chip_power8_intc_create; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8NVL"; } @@ -760,6 +776,7 @@ static void pnv_chip_power9_class_init(ObjectClass *kla= ss, void *data) k->chip_cfam_id =3D 0x220d104900008000ull; /* P9 Nimbus DD2.0 */ k->cores_mask =3D POWER9_CORE_MASK; k->core_pir =3D pnv_chip_core_pir_p9; + k->intc_create =3D pnv_chip_power9_intc_create; k->xscom_base =3D 0x00603fc00000000ull; dc->desc =3D "PowerNV Chip POWER9"; } @@ -892,8 +909,8 @@ static void pnv_chip_core_realize(PnvChip *chip, Error = **errp) object_property_set_int(OBJECT(pnv_core), pcc->core_pir(chip, core_hwid), "pir", &error_fatal); - object_property_add_const_link(OBJECT(pnv_core), "xics", - qdev_get_machine(), &error_fatal); + object_property_add_const_link(OBJECT(pnv_core), "chip", + OBJECT(chip), &error_fatal); object_property_set_bool(OBJECT(pnv_core), true, "realized", &error_fatal); object_unref(OBJECT(pnv_core)); diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c index f7cf33f547..a9f129fc2c 100644 --- a/hw/ppc/pnv_core.c +++ b/hw/ppc/pnv_core.c @@ -99,13 +99,14 @@ static const MemoryRegionOps pnv_core_xscom_ops =3D { .endianness =3D DEVICE_BIG_ENDIAN, }; =20 -static void pnv_realize_vcpu(PowerPCCPU *cpu, XICSFabric *xi, Error **errp) +static void pnv_realize_vcpu(PowerPCCPU *cpu, PnvChip *chip, Error **errp) { CPUPPCState *env =3D &cpu->env; int core_pir; int thread_index =3D 0; /* TODO: TCG supports only one thread */ ppc_spr_t *pir =3D &env->spr_cb[SPR_PIR]; Error *local_err =3D NULL; + PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(chip); =20 object_property_set_bool(OBJECT(cpu), true, "realized", &local_err); if (local_err) { @@ -113,7 +114,7 @@ static void pnv_realize_vcpu(PowerPCCPU *cpu, XICSFabri= c *xi, Error **errp) return; } =20 - cpu->intc =3D icp_create(OBJECT(cpu), TYPE_PNV_ICP, xi, &local_err); + cpu->intc =3D pcc->intc_create(chip, OBJECT(cpu), &local_err); if (local_err) { error_propagate(errp, local_err); return; @@ -143,13 +144,12 @@ static void pnv_core_realize(DeviceState *dev, Error = **errp) void *obj; int i, j; char name[32]; - Object *xi; + Object *chip; =20 - xi =3D object_property_get_link(OBJECT(dev), "xics", &local_err); - if (!xi) { - error_setg(errp, "%s: required link 'xics' not found: %s", - __func__, error_get_pretty(local_err)); - return; + chip =3D object_property_get_link(OBJECT(dev), "chip", &local_err); + if (!chip) { + error_propagate(errp, local_err); + error_prepend(errp, "required link 'chip' not found: "); } =20 pc->threads =3D g_new(PowerPCCPU *, cc->nr_threads); @@ -166,7 +166,7 @@ static void pnv_core_realize(DeviceState *dev, Error **= errp) } =20 for (j =3D 0; j < cc->nr_threads; j++) { - pnv_realize_vcpu(pc->threads[j], XICS_FABRIC(xi), &local_err); + pnv_realize_vcpu(pc->threads[j], PNV_CHIP(chip), &local_err); if (local_err) { goto err; } diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 90759240a7..e934e84f55 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -76,6 +76,7 @@ typedef struct PnvChipClass { hwaddr xscom_base; =20 uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); + Object *(*intc_create)(PnvChip *chip, Object *child, Error **errp); } PnvChipClass; =20 #define PNV_CHIP_TYPE_SUFFIX "-" TYPE_PNV_CHIP --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664245216902.9871054093119; Fri, 22 Jun 2018 03:44:05 -0700 (PDT) Received: from localhost ([::1]:60712 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJXw-00071D-9h for importer@patchew.org; Fri, 22 Jun 2018 06:44:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45696) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPt-0000fF-FA for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPq-0003Pi-0E for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:45 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:56607) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPo-0003M1-Q1; Fri, 22 Jun 2018 06:35:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2G4NX2z9s76; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663734; bh=GP49fxwOMDLz1GWA4CmxzLPopI941DzjOsLsKZ17pq4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nN8lJkFld42qHqlebYQF5VeEzwcV8NclJwDDx3YnvbqTa5nHhYbrq7bSULxCfItr6 Lw+ZhZpCx5fytK3MmnG3LNRaQqEuIak6Exu0HhhoEoCcEoybD1OhWBXO2uA1/fpAml JCfJ8TJ/p8m9BwtBzZABF8FaykHcPMXKA81KyElU= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:05 +1000 Message-Id: <20180622103528.28598-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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/25] ppc/pnv: introduce a new isa_create() 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater This moves the details of the ISA bus creation under the LPC model but more important, the new PnvChip operation will let us choose the chip class to use when we introduce the different chip classes for Power9 and Power8. It hides away the processor chip controllers from the machine. Signed-off-by: C=C3=A9dric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 34 +++++++++++++++++++--------------- hw/ppc/pnv_lpc.c | 30 +++++++++++++++++++++++++----- include/hw/ppc/pnv.h | 1 + include/hw/ppc/pnv_lpc.h | 3 +-- 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index c7e127ae97..ac828d1331 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -529,24 +529,24 @@ static void pnv_reset(void) cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt)); } =20 -static ISABus *pnv_isa_create(PnvChip *chip) +static ISABus *pnv_chip_power8_isa_create(PnvChip *chip, Error **errp) { - PnvLpcController *lpc =3D &chip->lpc; - ISABus *isa_bus; - qemu_irq *irqs; - PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(chip); + return pnv_lpc_isa_create(&chip->lpc, true, errp); +} =20 - /* let isa_bus_new() create its own bridge on SysBus otherwise - * devices speficied on the command line won't find the bus and - * will fail to create. - */ - isa_bus =3D isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io, - &error_fatal); +static ISABus *pnv_chip_power8nvl_isa_create(PnvChip *chip, Error **errp) +{ + return pnv_lpc_isa_create(&chip->lpc, false, errp); +} =20 - irqs =3D pnv_lpc_isa_irq_create(lpc, pcc->chip_type, ISA_NUM_IRQS); +static ISABus *pnv_chip_power9_isa_create(PnvChip *chip, Error **errp) +{ + return NULL; +} =20 - isa_bus_irqs(isa_bus, irqs); - return isa_bus; +static ISABus *pnv_isa_create(PnvChip *chip, Error **errp) +{ + return PNV_CHIP_GET_CLASS(chip)->isa_create(chip, errp); } =20 static void pnv_init(MachineState *machine) @@ -646,7 +646,7 @@ static void pnv_init(MachineState *machine) g_free(chip_typename); =20 /* Instantiate ISA bus on chip 0 */ - pnv->isa_bus =3D pnv_isa_create(pnv->chips[0]); + pnv->isa_bus =3D pnv_isa_create(pnv->chips[0], &error_fatal); =20 /* Create serial port */ serial_hds_isa_init(pnv->isa_bus, 0, MAX_ISA_SERIAL_PORTS); @@ -735,6 +735,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *kl= ass, void *data) k->cores_mask =3D POWER8E_CORE_MASK; 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->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8E"; } @@ -749,6 +750,7 @@ static void pnv_chip_power8_class_init(ObjectClass *kla= ss, void *data) k->cores_mask =3D POWER8_CORE_MASK; 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->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8"; } @@ -763,6 +765,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *= klass, void *data) k->cores_mask =3D POWER8_CORE_MASK; 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->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8NVL"; } @@ -777,6 +780,7 @@ static void pnv_chip_power9_class_init(ObjectClass *kla= ss, void *data) k->cores_mask =3D POWER9_CORE_MASK; 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->xscom_base =3D 0x00603fc00000000ull; dc->desc =3D "PowerNV Chip POWER9"; } diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c index 402c4fefa8..d7721320a2 100644 --- a/hw/ppc/pnv_lpc.c +++ b/hw/ppc/pnv_lpc.c @@ -22,6 +22,7 @@ #include "target/ppc/cpu.h" #include "qapi/error.h" #include "qemu/log.h" +#include "hw/isa/isa.h" =20 #include "hw/ppc/pnv.h" #include "hw/ppc/pnv_lpc.h" @@ -535,16 +536,35 @@ static void pnv_lpc_isa_irq_handler(void *opaque, int= n, int level) } } =20 -qemu_irq *pnv_lpc_isa_irq_create(PnvLpcController *lpc, int chip_type, - int nirqs) +ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **e= rrp) { + Error *local_err =3D NULL; + ISABus *isa_bus; + qemu_irq *irqs; + qemu_irq_handler handler; + + /* let isa_bus_new() create its own bridge on SysBus otherwise + * devices speficied on the command line won't find the bus and + * will fail to create. + */ + isa_bus =3D isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return NULL; + } + /* Not all variants have a working serial irq decoder. If not, * handling of LPC interrupts becomes a platform issue (some * platforms have a CPLD to do it). */ - if (chip_type =3D=3D PNV_CHIP_POWER8NVL) { - return qemu_allocate_irqs(pnv_lpc_isa_irq_handler, lpc, nirqs); + if (use_cpld) { + handler =3D pnv_lpc_isa_irq_handler_cpld; } else { - return qemu_allocate_irqs(pnv_lpc_isa_irq_handler_cpld, lpc, nirqs= ); + handler =3D pnv_lpc_isa_irq_handler; } + + irqs =3D qemu_allocate_irqs(handler, lpc, ISA_NUM_IRQS); + + isa_bus_irqs(isa_bus, irqs); + return isa_bus; } diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index e934e84f55..563279f3e0 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -77,6 +77,7 @@ typedef struct PnvChipClass { =20 uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); Object *(*intc_create)(PnvChip *chip, Object *child, Error **errp); + ISABus *(*isa_create)(PnvChip *chip, Error **errp); } PnvChipClass; =20 #define PNV_CHIP_TYPE_SUFFIX "-" TYPE_PNV_CHIP diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h index 53fdd5bb64..d657489b07 100644 --- a/include/hw/ppc/pnv_lpc.h +++ b/include/hw/ppc/pnv_lpc.h @@ -70,7 +70,6 @@ typedef struct PnvLpcController { PnvPsi *psi; } PnvLpcController; =20 -qemu_irq *pnv_lpc_isa_irq_create(PnvLpcController *lpc, int chip_type, - int nirqs); +ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **e= rrp); =20 #endif /* _PPC_PNV_LPC_H */ --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664072770325.75666814468923; Fri, 22 Jun 2018 03:41:12 -0700 (PDT) Received: from localhost ([::1]:60701 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJVA-0004k9-1U for importer@patchew.org; Fri, 22 Jun 2018 06:41:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45708) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPt-0000fb-Rg for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPq-0003QS-FM for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:45 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:51929) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPp-0003M0-Dw; Fri, 22 Jun 2018 06:35:42 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2G378sz9s52; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663734; bh=G4s6/0pBmyj4PzO/+c1w5Zz94gBQ470lhqO/C+bl3OU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oXLbEjVLyCL+hlB0aQuoB0fkym/UYyB5UaGoa4pSPSWLTzmPJCJX/586fbiwg8qDH fUfGJn37DLVyDsamBtRIsMd7Pexsa6sAUixVeEVhmjrFVAxHJJAk+qVAn/9PrVqL6+ I/K9p/RLjOV9+P93Wea2LMej9FFTphK1ETJ71QKQ= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:06 +1000 Message-Id: <20180622103528.28598-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> 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 03/25] spapr_cpu_core: migrate per-CPU data 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Greg Kurz A per-CPU machine data pointer was recently added to PowerPCCPU. The motivation is to to hide platform specific details from the core CPU code. This per-CPU data can hold state which is relevant to the guest though, eg, Virtual Processor Areas, and we should migrate this state. This patch adds the plumbing so that we can migrate the per-CPU data for PAPR guests. We only do this for newer machine types for the sake of backward compatibility. No state is migrated for the moment: the vmstate_spapr_cpu_state structure will be populated by subsequent patches. Signed-off-by: Greg Kurz [dwg: Fix some trivial spelling and spacing errors] Signed-off-by: David Gibson --- hw/ppc/spapr.c | 7 ++++++- hw/ppc/spapr_cpu_core.c | 22 ++++++++++++++++++++-- include/hw/ppc/spapr_cpu_core.h | 1 + 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index db0fb385d4..3174468fc5 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -4115,7 +4115,12 @@ DEFINE_SPAPR_MACHINE(3_0, "3.0", true); HW_COMPAT_2_12 \ { \ .driver =3D TYPE_POWERPC_CPU, \ - .property =3D "pre-3.0-migration", \ + .property =3D "pre-3.0-migration", \ + .value =3D "on", \ + }, \ + { \ + .driver =3D TYPE_SPAPR_CPU_CORE, \ + .property =3D "pre-3.0-migration", \ .value =3D "on", \ }, =20 diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index aef3be33a3..f129ac884e 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -129,6 +129,15 @@ static void spapr_cpu_core_unrealize(DeviceState *dev,= Error **errp) g_free(sc->threads); } =20 +static const VMStateDescription vmstate_spapr_cpu_state =3D { + .name =3D "spapr_cpu", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_END_OF_LIST() + }, +}; + static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, Error **errp) { @@ -194,6 +203,10 @@ static PowerPCCPU *spapr_create_vcpu(sPAPRCPUCore *sc,= int i, Error **errp) } =20 cpu->machine_data =3D g_new0(sPAPRCPUState, 1); + if (!sc->pre_3_0_migration) { + vmstate_register(NULL, cs->cpu_index, &vmstate_spapr_cpu_state, + cpu->machine_data); + } =20 object_unref(obj); return cpu; @@ -204,10 +217,13 @@ err: return NULL; } =20 -static void spapr_delete_vcpu(PowerPCCPU *cpu) +static void spapr_delete_vcpu(PowerPCCPU *cpu, sPAPRCPUCore *sc) { sPAPRCPUState *spapr_cpu =3D spapr_cpu_state(cpu); =20 + if (!sc->pre_3_0_migration) { + vmstate_unregister(NULL, &vmstate_spapr_cpu_state, cpu->machine_da= ta); + } cpu->machine_data =3D NULL; g_free(spapr_cpu); object_unparent(OBJECT(cpu)); @@ -253,7 +269,7 @@ err_unrealize: } err: while (--i >=3D 0) { - spapr_delete_vcpu(sc->threads[i]); + spapr_delete_vcpu(sc->threads[i], sc); } g_free(sc->threads); error_propagate(errp, local_err); @@ -261,6 +277,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, + false), DEFINE_PROP_END_OF_LIST() }; =20 diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_cor= e.h index 8ceea2973a..9e2821e4b3 100644 --- a/include/hw/ppc/spapr_cpu_core.h +++ b/include/hw/ppc/spapr_cpu_core.h @@ -31,6 +31,7 @@ typedef struct sPAPRCPUCore { /*< public >*/ PowerPCCPU **threads; int node_id; + bool pre_3_0_migration; /* older machine don't know about sPAPRCPUStat= e */ } sPAPRCPUCore; =20 typedef struct sPAPRCPUCoreClass { --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664230371142.78016584489183; Fri, 22 Jun 2018 03:43:50 -0700 (PDT) Received: from localhost ([::1]:60711 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJXh-0006qU-JF for importer@patchew.org; Fri, 22 Jun 2018 06:43:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45620) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPr-0000ch-6E for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPp-0003P0-Ia for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:43 -0400 Received: from ozlabs.org ([203.11.71.1]:44519) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPo-0003MH-Qk; Fri, 22 Jun 2018 06:35:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2H28qrz9s8J; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663735; bh=Gttg2MbnSGMNYnufpRs11A+GBJFDm+FJgzTQ5EkIuZw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C//pDxN7TehpJZ3W+X/Mgm5+ptsIXwNK3F1JWaKeHca2JBIQmeVYhcqQ6/mTfKQ14 yj/yHB56FFw1OpouEoRBLqpYab57tg5LPqRwGiGSC2pu1O9fFNyMKTW9pV84jUbX8S ZygfVikubMZ7LhQIJm6STaW/Ew6xF/VhsjUjAVUA= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:07 +1000 Message-Id: <20180622103528.28598-5-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 04/25] spapr_cpu_core: migrate VPA related state 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Greg Kurz QEMU implements the "Shared Processor LPAR" (SPLPAR) option, which allows the hypervisor to time-slice a physical processor into multiple virtual processor. The intent is to allow more guests to run, and to optimize processor utilization. The guest OS can cede idle VCPUs, so that their processing capacity may be used by other VCPUs, with the H_CEDE hcall. The guest OS can also optimize spinlocks, by confering the time-slice of a spinning VCPU to the spinlock holder if it's currently notrunning, with the H_CONFER hcall. Both hcalls depend on a "Virtual Processor Area" (VPA) to be registered by the guest OS, generally during early boot. Other per-VCPU areas can be registered: the "SLB Shadow Buffer" which allows a more efficient dispatching of VCPUs, and the "Dispatch Trace Log Buffer" (DTL) which is used to compute time stolen by the hypervisor. Both DTL and SLB Shadow areas depend on the VPA to be registered. The VPA/SLB Shadow/DTL are state that QEMU should migrate, but this doesn't happen, for no apparent reason other than it was just never coded. This causes the features listed above to stop working after migration, and it breaks the logic of the H_REGISTER_VPA hcall in the destination. The VPA is set at the guest request, ie, we don't have to migrate it before the guest has actually set it. This patch hence adds an "spapr_cpu/vpa" subsection to the recently introduced per-CPU machine data migration stream. Since DTL and SLB Shadow are optional and both depend on VPA, they get their own subsections "spapr_cpu/vpa/slb_shadow" and "spapr_cpu/vpa/dtl" hanging from the "spapr_cpu/vpa" subsection. Note that this won't break migration to older QEMUs. Is is already handled by only registering the vmstate handler for per-CPU data with newer machine types. Signed-off-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr_cpu_core.c | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index f129ac884e..67f1596c57 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -129,6 +129,67 @@ static void spapr_cpu_core_unrealize(DeviceState *dev,= Error **errp) g_free(sc->threads); } =20 +static bool slb_shadow_needed(void *opaque) +{ + sPAPRCPUState *spapr_cpu =3D opaque; + + return spapr_cpu->slb_shadow_addr !=3D 0; +} + +static const VMStateDescription vmstate_spapr_cpu_slb_shadow =3D { + .name =3D "spapr_cpu/vpa/slb_shadow", + .version_id =3D 1, + .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_END_OF_LIST() + } +}; + +static bool dtl_needed(void *opaque) +{ + sPAPRCPUState *spapr_cpu =3D opaque; + + return spapr_cpu->dtl_addr !=3D 0; +} + +static const VMStateDescription vmstate_spapr_cpu_dtl =3D { + .name =3D "spapr_cpu/vpa/dtl", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D dtl_needed, + .fields =3D (VMStateField[]) { + VMSTATE_UINT64(dtl_addr, sPAPRCPUState), + VMSTATE_UINT64(dtl_size, sPAPRCPUState), + VMSTATE_END_OF_LIST() + } +}; + +static bool vpa_needed(void *opaque) +{ + sPAPRCPUState *spapr_cpu =3D opaque; + + return spapr_cpu->vpa_addr !=3D 0; +} + +static const VMStateDescription vmstate_spapr_cpu_vpa =3D { + .name =3D "spapr_cpu/vpa", + .version_id =3D 1, + .minimum_version_id =3D 1, + .needed =3D vpa_needed, + .fields =3D (VMStateField[]) { + VMSTATE_UINT64(vpa_addr, sPAPRCPUState), + VMSTATE_END_OF_LIST() + }, + .subsections =3D (const VMStateDescription * []) { + &vmstate_spapr_cpu_slb_shadow, + &vmstate_spapr_cpu_dtl, + NULL + } +}; + static const VMStateDescription vmstate_spapr_cpu_state =3D { .name =3D "spapr_cpu", .version_id =3D 1, @@ -136,6 +197,10 @@ static const VMStateDescription vmstate_spapr_cpu_stat= e =3D { .fields =3D (VMStateField[]) { VMSTATE_END_OF_LIST() }, + .subsections =3D (const VMStateDescription * []) { + &vmstate_spapr_cpu_vpa, + NULL + } }; =20 static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664926060465.2200832021922; Fri, 22 Jun 2018 03:55:26 -0700 (PDT) Received: from localhost ([::1]:60778 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJiv-0007VK-9K for importer@patchew.org; Fri, 22 Jun 2018 06:55:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45746) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPu-0000gt-TP for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPp-0003Pd-TH for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:46 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:52329) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPp-0003MN-3g; Fri, 22 Jun 2018 06:35:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2G5b1mz9s8f; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663734; bh=Vj+6KoJN8gmNUNdKU6UBo4ASajGvwdtIBnQ2EQBsKCg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JajsYGLkFlc9DOmh6Y+zUL0KwyIATpN7RWRixb2QADcWr1XABhb2PP4Emd9DyL+jZ HTjD3OHTykir6CRXMzSnZUHISTQYkQ2+0OUzVbJdJY2OUe/KT+GmhSmvpDeVc05YZZ psXFQNPi0TH4NF33atPsp1fe4NDxpTX27wV8sblg= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:08 +1000 Message-Id: <20180622103528.28598-6-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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 05/25] ppc/pnv: introduce Pnv8Chip and Pnv9Chip models 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater It introduces a base PnvChip class from which the specific processor chip classes, Pnv8Chip and Pnv9Chip, inherit. Each of them needs to define an init and a realize routine which will create the controllers of the target processor. For the moment, the base PnvChip class handles the XSCOM bus and the cores. Signed-off-by: C=C3=A9dric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 281 +++++++++++++++++++++++++++---------------- include/hw/ppc/pnv.h | 24 +++- 2 files changed, 202 insertions(+), 103 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index ac828d1331..a29ea996b4 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -531,12 +531,14 @@ static void pnv_reset(void) =20 static ISABus *pnv_chip_power8_isa_create(PnvChip *chip, Error **errp) { - return pnv_lpc_isa_create(&chip->lpc, true, errp); + Pnv8Chip *chip8 =3D PNV8_CHIP(chip); + return pnv_lpc_isa_create(&chip8->lpc, true, errp); } =20 static ISABus *pnv_chip_power8nvl_isa_create(PnvChip *chip, Error **errp) { - return pnv_lpc_isa_create(&chip->lpc, false, errp); + Pnv8Chip *chip8 =3D PNV8_CHIP(chip); + return pnv_lpc_isa_create(&chip8->lpc, false, errp); } =20 static ISABus *pnv_chip_power9_isa_create(PnvChip *chip, Error **errp) @@ -725,6 +727,103 @@ static Object *pnv_chip_power9_intc_create(PnvChip *c= hip, Object *child, */ #define POWER9_CORE_MASK (0xffffffffffffffull) =20 +static void pnv_chip_power8_instance_init(Object *obj) +{ + Pnv8Chip *chip8 =3D PNV8_CHIP(obj); + + object_initialize(&chip8->psi, sizeof(chip8->psi), TYPE_PNV_PSI); + object_property_add_child(obj, "psi", OBJECT(&chip8->psi), NULL); + object_property_add_const_link(OBJECT(&chip8->psi), "xics", + OBJECT(qdev_get_machine()), &error_abor= t); + + object_initialize(&chip8->lpc, sizeof(chip8->lpc), TYPE_PNV_LPC); + object_property_add_child(obj, "lpc", OBJECT(&chip8->lpc), NULL); + object_property_add_const_link(OBJECT(&chip8->lpc), "psi", + OBJECT(&chip8->psi), &error_abort); + + object_initialize(&chip8->occ, sizeof(chip8->occ), TYPE_PNV_OCC); + object_property_add_child(obj, "occ", OBJECT(&chip8->occ), NULL); + object_property_add_const_link(OBJECT(&chip8->occ), "psi", + OBJECT(&chip8->psi), &error_abort); +} + +static void pnv_chip_icp_realize(Pnv8Chip *chip8, Error **errp) + { + PnvChip *chip =3D PNV_CHIP(chip8); + PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(chip); + const char *typename =3D pnv_chip_core_typename(chip); + size_t typesize =3D object_type_get_instance_size(typename); + int i, j; + char *name; + XICSFabric *xi =3D XICS_FABRIC(qdev_get_machine()); + + name =3D g_strdup_printf("icp-%x", chip->chip_id); + memory_region_init(&chip8->icp_mmio, OBJECT(chip), name, PNV_ICP_SIZE); + sysbus_init_mmio(SYS_BUS_DEVICE(chip), &chip8->icp_mmio); + g_free(name); + + sysbus_mmio_map(SYS_BUS_DEVICE(chip), 1, PNV_ICP_BASE(chip)); + + /* Map the ICP registers for each thread */ + for (i =3D 0; i < chip->nr_cores; i++) { + PnvCore *pnv_core =3D PNV_CORE(chip->cores + i * typesize); + int core_hwid =3D CPU_CORE(pnv_core)->core_id; + + for (j =3D 0; j < CPU_CORE(pnv_core)->nr_threads; j++) { + uint32_t pir =3D pcc->core_pir(chip, core_hwid) + j; + PnvICPState *icp =3D PNV_ICP(xics_icp_get(xi, pir)); + + memory_region_add_subregion(&chip8->icp_mmio, pir << 12, + &icp->mmio); + } + } +} + +static void pnv_chip_power8_realize(DeviceState *dev, Error **errp) +{ + PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(dev); + PnvChip *chip =3D PNV_CHIP(dev); + Pnv8Chip *chip8 =3D PNV8_CHIP(dev); + Error *local_err =3D NULL; + + pcc->parent_realize(dev, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* Processor Service Interface (PSI) Host Bridge */ + object_property_set_int(OBJECT(&chip8->psi), PNV_PSIHB_BASE(chip), + "bar", &error_fatal); + object_property_set_bool(OBJECT(&chip8->psi), true, "realized", &local= _err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE, &chip8->psi.xscom_= regs); + + /* Create LPC controller */ + object_property_set_bool(OBJECT(&chip8->lpc), true, "realized", + &error_fatal); + pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip8->lpc.xscom_re= gs); + + /* Interrupt Management Area. This is the memory region holding + * all the Interrupt Control Presenter (ICP) registers */ + pnv_chip_icp_realize(chip8, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* Create the simplified OCC model */ + object_property_set_bool(OBJECT(&chip8->occ), true, "realized", &local= _err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip8->occ.xscom_re= gs); +} + static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); @@ -738,6 +837,9 @@ static void pnv_chip_power8e_class_init(ObjectClass *kl= ass, void *data) k->isa_create =3D pnv_chip_power8_isa_create; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8E"; + + device_class_set_parent_realize(dc, pnv_chip_power8_realize, + &k->parent_realize); } =20 static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) @@ -753,6 +855,9 @@ static void pnv_chip_power8_class_init(ObjectClass *kla= ss, void *data) k->isa_create =3D pnv_chip_power8_isa_create; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8"; + + device_class_set_parent_realize(dc, pnv_chip_power8_realize, + &k->parent_realize); } =20 static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) @@ -768,6 +873,25 @@ static void pnv_chip_power8nvl_class_init(ObjectClass = *klass, void *data) k->isa_create =3D pnv_chip_power8nvl_isa_create; k->xscom_base =3D 0x003fc0000000000ull; dc->desc =3D "PowerNV Chip POWER8NVL"; + + device_class_set_parent_realize(dc, pnv_chip_power8_realize, + &k->parent_realize); +} + +static void pnv_chip_power9_instance_init(Object *obj) +{ +} + +static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) +{ + PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(dev); + Error *local_err =3D NULL; + + pcc->parent_realize(dev, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } } =20 static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) @@ -783,6 +907,9 @@ static void pnv_chip_power9_class_init(ObjectClass *kla= ss, void *data) k->isa_create =3D pnv_chip_power9_isa_create; k->xscom_base =3D 0x00603fc00000000ull; dc->desc =3D "PowerNV Chip POWER9"; + + device_class_set_parent_realize(dc, pnv_chip_power9_realize, + &k->parent_realize); } =20 static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp) @@ -815,59 +942,9 @@ static void pnv_chip_core_sanitize(PnvChip *chip, Erro= r **errp) } } =20 -static void pnv_chip_init(Object *obj) +static void pnv_chip_instance_init(Object *obj) { - PnvChip *chip =3D PNV_CHIP(obj); - PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(chip); - - chip->xscom_base =3D pcc->xscom_base; - - object_initialize(&chip->lpc, sizeof(chip->lpc), TYPE_PNV_LPC); - object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), NULL); - - object_initialize(&chip->psi, sizeof(chip->psi), TYPE_PNV_PSI); - object_property_add_child(obj, "psi", OBJECT(&chip->psi), NULL); - object_property_add_const_link(OBJECT(&chip->psi), "xics", - OBJECT(qdev_get_machine()), &error_abor= t); - - object_initialize(&chip->occ, sizeof(chip->occ), TYPE_PNV_OCC); - object_property_add_child(obj, "occ", OBJECT(&chip->occ), NULL); - object_property_add_const_link(OBJECT(&chip->occ), "psi", - OBJECT(&chip->psi), &error_abort); - - /* The LPC controller needs PSI to generate interrupts */ - object_property_add_const_link(OBJECT(&chip->lpc), "psi", - OBJECT(&chip->psi), &error_abort); -} - -static void pnv_chip_icp_realize(PnvChip *chip, Error **errp) -{ - PnvChipClass *pcc =3D PNV_CHIP_GET_CLASS(chip); - const char *typename =3D pnv_chip_core_typename(chip); - size_t typesize =3D object_type_get_instance_size(typename); - int i, j; - char *name; - XICSFabric *xi =3D XICS_FABRIC(qdev_get_machine()); - - name =3D g_strdup_printf("icp-%x", chip->chip_id); - memory_region_init(&chip->icp_mmio, OBJECT(chip), name, PNV_ICP_SIZE); - sysbus_init_mmio(SYS_BUS_DEVICE(chip), &chip->icp_mmio); - g_free(name); - - sysbus_mmio_map(SYS_BUS_DEVICE(chip), 1, PNV_ICP_BASE(chip)); - - /* Map the ICP registers for each thread */ - for (i =3D 0; i < chip->nr_cores; i++) { - PnvCore *pnv_core =3D PNV_CORE(chip->cores + i * typesize); - int core_hwid =3D CPU_CORE(pnv_core)->core_id; - - for (j =3D 0; j < CPU_CORE(pnv_core)->nr_threads; j++) { - uint32_t pir =3D pcc->core_pir(chip, core_hwid) + j; - PnvICPState *icp =3D PNV_ICP(xics_icp_get(xi, pir)); - - memory_region_add_subregion(&chip->icp_mmio, pir << 12, &icp->= mmio); - } - } + PNV_CHIP(obj)->xscom_base =3D PNV_CHIP_GET_CLASS(obj)->xscom_base; } =20 static void pnv_chip_core_realize(PnvChip *chip, Error **errp) @@ -951,37 +1028,6 @@ static void pnv_chip_realize(DeviceState *dev, Error = **errp) error_propagate(errp, error); return; } - - /* Create LPC controller */ - object_property_set_bool(OBJECT(&chip->lpc), true, "realized", - &error_fatal); - pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip->lpc.xscom_reg= s); - - /* Interrupt Management Area. This is the memory region holding - * all the Interrupt Control Presenter (ICP) registers */ - pnv_chip_icp_realize(chip, &error); - if (error) { - error_propagate(errp, error); - return; - } - - /* Processor Service Interface (PSI) Host Bridge */ - object_property_set_int(OBJECT(&chip->psi), PNV_PSIHB_BASE(chip), - "bar", &error_fatal); - object_property_set_bool(OBJECT(&chip->psi), true, "realized", &error); - if (error) { - error_propagate(errp, error); - return; - } - pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE, &chip->psi.xscom_r= egs); - - /* Create the simplified OCC model */ - object_property_set_bool(OBJECT(&chip->occ), true, "realized", &error); - if (error) { - error_propagate(errp, error); - return; - } - pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip->occ.xscom_reg= s); } =20 static Property pnv_chip_properties[] =3D { @@ -1009,8 +1055,10 @@ static ICSState *pnv_ics_get(XICSFabric *xi, int irq) int i; =20 for (i =3D 0; i < pnv->num_chips; i++) { - if (ics_valid_irq(&pnv->chips[i]->psi.ics, irq)) { - return &pnv->chips[i]->psi.ics; + Pnv8Chip *chip8 =3D PNV8_CHIP(pnv->chips[i]); + + if (ics_valid_irq(&chip8->psi.ics, irq)) { + return &chip8->psi.ics; } } return NULL; @@ -1022,7 +1070,8 @@ static void pnv_ics_resend(XICSFabric *xi) int i; =20 for (i =3D 0; i < pnv->num_chips; i++) { - ics_resend(&pnv->chips[i]->psi.ics); + Pnv8Chip *chip8 =3D PNV8_CHIP(pnv->chips[i]); + ics_resend(&chip8->psi.ics); } } =20 @@ -1063,7 +1112,8 @@ static void pnv_pic_print_info(InterruptStatsProvider= *obj, } =20 for (i =3D 0; i < pnv->num_chips; i++) { - ics_pic_print_info(&pnv->chips[i]->psi.ics, mon); + Pnv8Chip *chip8 =3D PNV8_CHIP(pnv->chips[i]); + ics_pic_print_info(&chip8->psi.ics, mon); } } =20 @@ -1098,7 +1148,7 @@ static void pnv_set_num_chips(Object *obj, Visitor *v= , const char *name, pnv->num_chips =3D num_chips; } =20 -static void pnv_machine_initfn(Object *obj) +static void pnv_machine_instance_init(Object *obj) { PnvMachineState *pnv =3D PNV_MACHINE(obj); pnv->num_chips =3D 1; @@ -1138,11 +1188,18 @@ static void pnv_machine_class_init(ObjectClass *oc,= void *data) pnv_machine_class_props_init(oc); } =20 -#define DEFINE_PNV_CHIP_TYPE(type, class_initfn) \ - { \ - .name =3D type, \ - .class_init =3D class_initfn, \ - .parent =3D TYPE_PNV_CHIP, \ +#define DEFINE_PNV8_CHIP_TYPE(type, class_initfn) \ + { \ + .name =3D type, \ + .class_init =3D class_initfn, \ + .parent =3D TYPE_PNV8_CHIP, \ + } + +#define DEFINE_PNV9_CHIP_TYPE(type, class_initfn) \ + { \ + .name =3D type, \ + .class_init =3D class_initfn, \ + .parent =3D TYPE_PNV9_CHIP, \ } =20 static const TypeInfo types[] =3D { @@ -1150,7 +1207,7 @@ static const TypeInfo types[] =3D { .name =3D TYPE_PNV_MACHINE, .parent =3D TYPE_MACHINE, .instance_size =3D sizeof(PnvMachineState), - .instance_init =3D pnv_machine_initfn, + .instance_init =3D pnv_machine_instance_init, .class_init =3D pnv_machine_class_init, .interfaces =3D (InterfaceInfo[]) { { TYPE_XICS_FABRIC }, @@ -1162,16 +1219,36 @@ static const TypeInfo types[] =3D { .name =3D TYPE_PNV_CHIP, .parent =3D TYPE_SYS_BUS_DEVICE, .class_init =3D pnv_chip_class_init, - .instance_init =3D pnv_chip_init, + .instance_init =3D pnv_chip_instance_init, .instance_size =3D sizeof(PnvChip), .class_size =3D sizeof(PnvChipClass), .abstract =3D true, }, - DEFINE_PNV_CHIP_TYPE(TYPE_PNV_CHIP_POWER9, pnv_chip_power9_class_init), - DEFINE_PNV_CHIP_TYPE(TYPE_PNV_CHIP_POWER8, pnv_chip_power8_class_init), - DEFINE_PNV_CHIP_TYPE(TYPE_PNV_CHIP_POWER8E, pnv_chip_power8e_class_ini= t), - DEFINE_PNV_CHIP_TYPE(TYPE_PNV_CHIP_POWER8NVL, - pnv_chip_power8nvl_class_init), + + /* + * P9 chip and variants + */ + { + .name =3D TYPE_PNV9_CHIP, + .parent =3D TYPE_PNV_CHIP, + .instance_init =3D pnv_chip_power9_instance_init, + .instance_size =3D sizeof(Pnv9Chip), + }, + DEFINE_PNV9_CHIP_TYPE(TYPE_PNV_CHIP_POWER9, pnv_chip_power9_class_init= ), + + /* + * P8 chip and variants + */ + { + .name =3D TYPE_PNV8_CHIP, + .parent =3D TYPE_PNV_CHIP, + .instance_init =3D pnv_chip_power8_instance_init, + .instance_size =3D sizeof(Pnv8Chip), + }, + DEFINE_PNV8_CHIP_TYPE(TYPE_PNV_CHIP_POWER8, pnv_chip_power8_class_init= ), + DEFINE_PNV8_CHIP_TYPE(TYPE_PNV_CHIP_POWER8E, pnv_chip_power8e_class_in= it), + DEFINE_PNV8_CHIP_TYPE(TYPE_PNV_CHIP_POWER8NVL, + pnv_chip_power8nvl_class_init), }; =20 DEFINE_TYPES(types) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 563279f3e0..86d5f54e54 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -57,12 +57,32 @@ typedef struct PnvChip { MemoryRegion xscom_mmio; MemoryRegion xscom; AddressSpace xscom_as; +} PnvChip; + +#define TYPE_PNV8_CHIP "pnv8-chip" +#define PNV8_CHIP(obj) OBJECT_CHECK(Pnv8Chip, (obj), TYPE_PNV8_CHIP) + +typedef struct Pnv8Chip { + /*< private >*/ + PnvChip parent_obj; + + /*< public >*/ MemoryRegion icp_mmio; =20 PnvLpcController lpc; PnvPsi psi; PnvOCC occ; -} PnvChip; +} Pnv8Chip; + +#define TYPE_PNV9_CHIP "pnv9-chip" +#define PNV9_CHIP(obj) OBJECT_CHECK(Pnv9Chip, (obj), TYPE_PNV9_CHIP) + +typedef struct Pnv9Chip { + /*< private >*/ + PnvChip parent_obj; + + /*< public >*/ +} Pnv9Chip; =20 typedef struct PnvChipClass { /*< private >*/ @@ -75,6 +95,8 @@ typedef struct PnvChipClass { =20 hwaddr xscom_base; =20 + DeviceRealize parent_realize; + uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); Object *(*intc_create)(PnvChip *chip, Object *child, Error **errp); ISABus *(*isa_create)(PnvChip *chip, Error **errp); --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664337508423.74211000661126; Fri, 22 Jun 2018 03:45:37 -0700 (PDT) Received: from localhost ([::1]:60721 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJZP-0008Qn-Si for importer@patchew.org; Fri, 22 Jun 2018 06:45:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45675) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPs-0000ei-SU for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPq-0003Qd-KZ for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:44 -0400 Received: from ozlabs.org ([203.11.71.1]:56013) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPo-0003ME-Pa; Fri, 22 Jun 2018 06:35:42 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2H15Ztz9s9J; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663735; bh=tluKWJuSjMbLo1HJFwzFbeJ4BhUiUGs87QTdYAhlYYU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pU7XMrfwheA43QyPXBYfvE5PbH3jDLdPhGlWDsigtZPqqzATBTVybQ9372WSXBWr2 7vD9hzhaBkadhqN8vHblXYWSh2OFi5q/SO/bEtxk4CJx7NgosT3lBZ31bsXMlp0MDx WiXOkNmxs7ngwSQ3MPzIwFOls5uXsdJa86UcN9ec= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:09 +1000 Message-Id: <20180622103528.28598-7-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 06/25] ppc/pnv: consolidate the creation of the ISA bus device tree 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater The device tree node of the ISA bus was being partially done in different places. Move all the nodes creation under the same routine. Signed-off-by: C=C3=A9dric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index a29ea996b4..7401ffe5b0 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -265,18 +265,6 @@ static void pnv_dt_icp(PnvChip *chip, void *fdt, uint3= 2_t pir, g_free(reg); } =20 -static int pnv_chip_lpc_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; -} - static void pnv_dt_chip(PnvChip *chip, void *fdt) { const char *typename =3D pnv_chip_core_typename(chip); @@ -285,16 +273,6 @@ static void pnv_dt_chip(PnvChip *chip, void *fdt) =20 pnv_dt_xscom(chip, fdt, 0); =20 - /* The default LPC bus of a multichip system is on chip 0. It's - * recognized by the firmware (skiboot) using a "primary" - * property. - */ - if (chip->chip_id =3D=3D 0x0) { - int lpc_offset =3D pnv_chip_lpc_offset(chip, fdt); - - _FDT((fdt_setprop(fdt, lpc_offset, "primary", NULL, 0))); - } - for (i =3D 0; i < chip->nr_cores; i++) { PnvCore *pnv_core =3D PNV_CORE(chip->cores + i * typesize); =20 @@ -418,16 +396,35 @@ static int pnv_dt_isa_device(DeviceState *dev, void *= opaque) return 0; } =20 -static void pnv_dt_isa(ISABus *bus, void *fdt, int lpc_offset) +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); ForeachPopulateArgs args =3D { .fdt =3D fdt, - .offset =3D lpc_offset, + .offset =3D isa_offset, }; =20 + _FDT((fdt_setprop(fdt, isa_offset, "primary", NULL, 0))); + /* ISA devices are not necessarily parented to the ISA bus so we * can not use object_child_foreach() */ - qbus_walk_children(BUS(bus), pnv_dt_isa_device, NULL, NULL, NULL, &arg= s); + qbus_walk_children(BUS(pnv->isa_bus), pnv_dt_isa_device, NULL, NULL, N= ULL, + &args); } =20 static void *pnv_dt_create(MachineState *machine) @@ -438,7 +435,6 @@ static void *pnv_dt_create(MachineState *machine) char *buf; int off; int i; - int lpc_offset; =20 fdt =3D g_malloc0(FDT_MAX_SIZE); _FDT((fdt_create_empty_tree(fdt, FDT_MAX_SIZE))); @@ -480,8 +476,7 @@ static void *pnv_dt_create(MachineState *machine) } =20 /* Populate ISA devices on chip 0 */ - lpc_offset =3D pnv_chip_lpc_offset(pnv->chips[0], fdt); - pnv_dt_isa(pnv->isa_bus, fdt, lpc_offset); + pnv_dt_isa(pnv, fdt); =20 if (pnv->bmc) { pnv_dt_bmc_sensors(pnv->bmc, fdt); --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664407175571.0146347993687; Fri, 22 Jun 2018 03:46:47 -0700 (PDT) Received: from localhost ([::1]:60731 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJaU-0000xN-8Q for importer@patchew.org; Fri, 22 Jun 2018 06:46:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45624) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPr-0000cl-91 for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPp-0003OR-0U for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:43 -0400 Received: from ozlabs.org ([203.11.71.1]:47415) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPo-0003Lt-Cm; Fri, 22 Jun 2018 06:35:40 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2G4zlSz9s70; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663734; bh=98AL0gJyosMz84B0LuXMzkBnihdwnvkM7gjZTZztqfo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nD7ymIkVl1eMgy9D6JgDdyZK0ptABwm19Byo155idpsIwdvT+ELxh+USqSxtJ5Cd7 Lk0G/a6G9LrHTBvwo+kS9MPZzXBDWtBsvzfou4q+rsjGolnYJS/21wA0VsU41zkUkJ MYwN8rCpybsdeeJWP50vI/k+uIiWzxTJcklCMEAc= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:10 +1000 Message-Id: <20180622103528.28598-8-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 07/25] target/ppc: Allow cpu compatiblity checks based on type, not instance 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" ppc_check_compat() is used in a number of places to check if a cpu object supports a certain compatiblity mode, subject to various constraints. It takes a PowerPCCPU *, however it really only depends on the cpu's class. We have upcoming cases where it would be useful to make compatibility checks before we fully instantiate the cpu objects. ppc_type_check_compat() will now make an equivalent check, but based on a CPU's QOM typename instead of an instantiated CPU object. We make use of the new interface in several places in spapr, where we're essentially making a global check, rather than one specific to a particular cpu. This avoids some ugly uses of first_cpu to grab a "representative" instance. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: C=C3=A9dric Le Goater --- hw/ppc/spapr.c | 10 ++++------ hw/ppc/spapr_caps.c | 19 +++++++++---------- target/ppc/compat.c | 27 +++++++++++++++++++++------ target/ppc/cpu.h | 4 ++++ 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 3174468fc5..bc179f6f89 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1616,8 +1616,8 @@ static void spapr_machine_reset(void) =20 first_ppc_cpu =3D POWERPC_CPU(first_cpu); if (kvm_enabled() && kvmppc_has_cap_mmu_radix() && - ppc_check_compat(first_ppc_cpu, CPU_POWERPC_LOGICAL_3_00, 0, - spapr->max_compat_pvr)) { + ppc_type_check_compat(machine->cpu_type, CPU_POWERPC_LOGICAL_3_00,= 0, + spapr->max_compat_pvr)) { /* If using KVM with radix mode available, VCPUs can be started * without a HPT because KVM will start them in radix mode. * Set the GR bit in PATB so that we know there is no HPT. */ @@ -2520,7 +2520,6 @@ static void spapr_machine_init(MachineState *machine) long load_limit, fw_size; char *filename; Error *resize_hpt_err =3D NULL; - PowerPCCPU *first_ppc_cpu; =20 msi_nonbroken =3D true; =20 @@ -2618,10 +2617,9 @@ static void spapr_machine_init(MachineState *machine) /* init CPUs */ spapr_init_cpus(spapr); =20 - first_ppc_cpu =3D POWERPC_CPU(first_cpu); if ((!kvm_enabled() || kvmppc_has_cap_mmu_radix()) && - ppc_check_compat(first_ppc_cpu, CPU_POWERPC_LOGICAL_3_00, 0, - spapr->max_compat_pvr)) { + ppc_type_check_compat(machine->cpu_type, CPU_POWERPC_LOGICAL_3_00,= 0, + spapr->max_compat_pvr)) { /* KVM and TCG always allow GTSE with radix... */ spapr_ovec_set(spapr->ov5, OV5_MMU_RADIX_GTSE); } diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 00e43a9ba7..469f38f0ef 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -327,27 +327,26 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = =3D { }; =20 static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, - CPUState *cs) + const char *cputype) { sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(spapr); - PowerPCCPU *cpu =3D POWERPC_CPU(cs); sPAPRCapabilities caps; =20 caps =3D smc->default_caps; =20 - if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_2_07, - 0, spapr->max_compat_pvr)) { + 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; caps.caps[SPAPR_CAP_CFPC] =3D SPAPR_CAP_BROKEN; } =20 - if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_2_06_PLUS, - 0, spapr->max_compat_pvr)) { + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_2_06_PLUS, + 0, spapr->max_compat_pvr)) { caps.caps[SPAPR_CAP_SBBC] =3D SPAPR_CAP_BROKEN; } =20 - if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_2_06, - 0, spapr->max_compat_pvr)) { + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_2_06, + 0, spapr->max_compat_pvr)) { caps.caps[SPAPR_CAP_VSX] =3D SPAPR_CAP_OFF; caps.caps[SPAPR_CAP_DFP] =3D SPAPR_CAP_OFF; caps.caps[SPAPR_CAP_IBS] =3D SPAPR_CAP_BROKEN; @@ -384,7 +383,7 @@ int spapr_caps_post_migration(sPAPRMachineState *spapr) sPAPRCapabilities dstcaps =3D spapr->eff; sPAPRCapabilities srccaps; =20 - srccaps =3D default_caps_with_cpu(spapr, first_cpu); + srccaps =3D default_caps_with_cpu(spapr, MACHINE(spapr)->cpu_type); for (i =3D 0; i < SPAPR_CAP_NUM; i++) { /* If not default value then assume came in with the migration */ if (spapr->mig.caps[i] !=3D spapr->def.caps[i]) { @@ -446,7 +445,7 @@ void spapr_caps_reset(sPAPRMachineState *spapr) int i; =20 /* First compute the actual set of caps we're running with.. */ - default_caps =3D default_caps_with_cpu(spapr, first_cpu); + default_caps =3D default_caps_with_cpu(spapr, MACHINE(spapr)->cpu_type= ); =20 for (i =3D 0; i < SPAPR_CAP_NUM; i++) { /* Store the defaults */ diff --git a/target/ppc/compat.c b/target/ppc/compat.c index 807c906f68..7de4bf3122 100644 --- a/target/ppc/compat.c +++ b/target/ppc/compat.c @@ -105,17 +105,13 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr) return NULL; } =20 -bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr, - uint32_t min_compat_pvr, uint32_t max_compat_pvr) +static bool pcc_compat(PowerPCCPUClass *pcc, uint32_t compat_pvr, + uint32_t min_compat_pvr, uint32_t max_compat_pvr) { - PowerPCCPUClass *pcc =3D POWERPC_CPU_GET_CLASS(cpu); const CompatInfo *compat =3D compat_by_pvr(compat_pvr); const CompatInfo *min =3D compat_by_pvr(min_compat_pvr); const CompatInfo *max =3D compat_by_pvr(max_compat_pvr); =20 -#if !defined(CONFIG_USER_ONLY) - g_assert(cpu->vhyp); -#endif g_assert(!min_compat_pvr || min); g_assert(!max_compat_pvr || max); =20 @@ -134,6 +130,25 @@ bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat= _pvr, return true; } =20 +bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr, + uint32_t min_compat_pvr, uint32_t max_compat_pvr) +{ + PowerPCCPUClass *pcc =3D POWERPC_CPU_GET_CLASS(cpu); + +#if !defined(CONFIG_USER_ONLY) + g_assert(cpu->vhyp); +#endif + + return pcc_compat(pcc, compat_pvr, min_compat_pvr, max_compat_pvr); +} + +bool ppc_type_check_compat(const char *cputype, uint32_t compat_pvr, + uint32_t min_compat_pvr, uint32_t max_compat_pv= r) +{ + PowerPCCPUClass *pcc =3D POWERPC_CPU_CLASS(object_class_by_name(cputyp= e)); + return pcc_compat(pcc, compat_pvr, min_compat_pvr, max_compat_pvr); +} + void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp) { const CompatInfo *compat =3D compat_by_pvr(compat_pvr); diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 874da6efbc..c7f3fb6b73 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1369,7 +1369,11 @@ static inline int cpu_mmu_index (CPUPPCState *env, b= ool ifetch) #if defined(TARGET_PPC64) bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr, uint32_t min_compat_pvr, uint32_t max_compat_pvr); +bool ppc_type_check_compat(const char *cputype, uint32_t compat_pvr, + uint32_t min_compat_pvr, uint32_t max_compat_pv= r); + void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp); + #if !defined(CONFIG_USER_ONLY) void ppc_set_compat_all(uint32_t compat_pvr, Error **errp); #endif --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529663890834911.8061381134214; Fri, 22 Jun 2018 03:38:10 -0700 (PDT) Received: from localhost ([::1]:60683 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJSA-00026o-44 for importer@patchew.org; Fri, 22 Jun 2018 06:38:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45657) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPs-0000dy-9O for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPp-0003Pn-VX for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:44 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:56355) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPp-0003MW-4b; Fri, 22 Jun 2018 06:35:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2G6FFbz9s7T; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663734; bh=5kVo7kuy6Crpk2lviDJ0KahBmkaoHUO8wc6doWkIOAY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bsHBek2+Sr9CmdQCXXcdiwLD+y8L6Jl6KKiOu9Y46yfWfFzH1F1h/1Uu3rISQnlpQ A/NW9l65A5mwy68k9O5Oj9GLFwGacMgAw6Ex1Giv5/K4mRHde6HyCvXlUCAdZkbNeW bNJDD/UffPUWe4yJBFTFZczv++4Hdh7pFPBE2OJc= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:11 +1000 Message-Id: <20180622103528.28598-9-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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 08/25] spapr: Compute effective capability values earlier 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Previously, the effective values of the various spapr capability flags were only determined at machine reset time. That was a lazy way of making sure it was after cpu initialization so it could use the cpu object to inform the defaults. But we've now improved the compat checking code so that we don't need to instantiate the cpus to use it. That lets us move the resolution of the capability defaults much earlier. This is going to be necessary for some future capabilities. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: C=C3=A9dric Le Goater --- hw/ppc/spapr.c | 6 ++++-- hw/ppc/spapr_caps.c | 9 ++++++--- include/hw/ppc/spapr.h | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index bc179f6f89..4a0b679166 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1612,7 +1612,7 @@ static void spapr_machine_reset(void) void *fdt; int rc; =20 - spapr_caps_reset(spapr); + spapr_caps_apply(spapr); =20 first_ppc_cpu =3D POWERPC_CPU(first_cpu); if (kvm_enabled() && kvmppc_has_cap_mmu_radix() && @@ -2526,7 +2526,9 @@ static void spapr_machine_init(MachineState *machine) QLIST_INIT(&spapr->phbs); QTAILQ_INIT(&spapr->pending_dimm_unplugs); =20 - /* Check HPT resizing availability */ + /* Determine capabilities to run with */ + spapr_caps_init(spapr); + kvmppc_check_papr_resize_hpt(&resize_hpt_err); if (spapr->resize_hpt =3D=3D SPAPR_RESIZE_HPT_DEFAULT) { /* diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 469f38f0ef..dabed817d1 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -439,12 +439,12 @@ SPAPR_CAP_MIG_STATE(cfpc, SPAPR_CAP_CFPC); SPAPR_CAP_MIG_STATE(sbbc, SPAPR_CAP_SBBC); SPAPR_CAP_MIG_STATE(ibs, SPAPR_CAP_IBS); =20 -void spapr_caps_reset(sPAPRMachineState *spapr) +void spapr_caps_init(sPAPRMachineState *spapr) { sPAPRCapabilities default_caps; int i; =20 - /* First compute the actual set of caps we're running with.. */ + /* Compute the actual set of caps we should run with */ default_caps =3D default_caps_with_cpu(spapr, MACHINE(spapr)->cpu_type= ); =20 for (i =3D 0; i < SPAPR_CAP_NUM; i++) { @@ -455,8 +455,11 @@ void spapr_caps_reset(sPAPRMachineState *spapr) spapr->eff.caps[i] =3D default_caps.caps[i]; } } +} =20 - /* .. then apply those caps to the virtual hardware */ +void spapr_caps_apply(sPAPRMachineState *spapr) +{ + int i; =20 for (i =3D 0; i < SPAPR_CAP_NUM; i++) { sPAPRCapabilityInfo *info =3D &capability_table[i]; diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 3388750fc7..9dbd6010f5 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -798,7 +798,8 @@ static inline uint8_t spapr_get_cap(sPAPRMachineState *= spapr, int cap) return spapr->eff.caps[cap]; } =20 -void spapr_caps_reset(sPAPRMachineState *spapr); +void spapr_caps_init(sPAPRMachineState *spapr); +void spapr_caps_apply(sPAPRMachineState *spapr); void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp); int spapr_caps_post_migration(sPAPRMachineState *spapr); =20 --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664059043198.01735207803745; Fri, 22 Jun 2018 03:40:59 -0700 (PDT) Received: from localhost ([::1]:60698 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJUw-0004Vg-4x for importer@patchew.org; Fri, 22 Jun 2018 06:40:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45638) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPr-0000d6-ND for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPp-0003P1-IT for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:43 -0400 Received: from ozlabs.org ([203.11.71.1]:35663) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPo-0003MD-Sg; Fri, 22 Jun 2018 06:35:41 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2H04frz9s8r; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663735; bh=/02E3Ot4nEC5soMzKEWeplEFm65cLOiCPzc+FZJDpZg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=omM50PL5unR9zI0xN07TcFjRFJ8KElKUGt47Nj6Q0Lcsk5E0MPqaradVFzp5OsnUE wh8kqMXf4kRjQcGBFVJ1smi9UzivH+KFAZgWn3smhNJFVD+5MYKV4jWnW+fckbkGzg 4v473otL5CmZnidjWE/AR5/MEO2lvQzm/JnMbVw4= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:12 +1000 Message-Id: <20180622103528.28598-10-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 09/25] spapr: Add cpu_apply hook to capabilities 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" spapr capabilities have an apply hook to actually activate (or deactivate) the feature in the system at reset time. However, a number of capabilities affect the setup of cpus, and need to be applied to each of them - including hotplugged cpus for extra complication. To make this simpler, add an optional cpu_apply hook that is called from spapr_cpu_reset(). Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: C=C3=A9dric Le Goater --- hw/ppc/spapr_caps.c | 19 +++++++++++++++++++ hw/ppc/spapr_cpu_core.c | 2 ++ include/hw/ppc/spapr.h | 1 + 3 files changed, 22 insertions(+) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index dabed817d1..68a4243efc 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -59,6 +59,8 @@ typedef struct sPAPRCapabilityInfo { 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, + uint8_t val, Error **errp); } sPAPRCapabilityInfo; =20 static void spapr_cap_get_bool(Object *obj, Visitor *v, const char *name, @@ -472,6 +474,23 @@ void spapr_caps_apply(sPAPRMachineState *spapr) } } =20 +void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu) +{ + int i; + + for (i =3D 0; i < SPAPR_CAP_NUM; i++) { + sPAPRCapabilityInfo *info =3D &capability_table[i]; + + /* + * If the apply function can't set the desired level and thinks it= 's + * fatal, it should cause that. + */ + if (info->cpu_apply) { + info->cpu_apply(spapr, cpu, spapr->eff.caps[i], &error_fatal); + } + } +} + void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp) { Error *local_err =3D NULL; diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index 67f1596c57..bfb94f650c 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -76,6 +76,8 @@ static void spapr_cpu_reset(void *opaque) spapr_cpu->slb_shadow_size =3D 0; spapr_cpu->dtl_addr =3D 0; spapr_cpu->dtl_size =3D 0; + + spapr_caps_cpu_apply(SPAPR_MACHINE(qdev_get_machine()), cpu); } =20 void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_u= long r3) diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 9dbd6010f5..9dd46a72f6 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -800,6 +800,7 @@ static inline uint8_t spapr_get_cap(sPAPRMachineState *= spapr, int 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); =20 --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664700746539.0781256333489; Fri, 22 Jun 2018 03:51:40 -0700 (PDT) Received: from localhost ([::1]:60757 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJfI-0004f8-27 for importer@patchew.org; Fri, 22 Jun 2018 06:51:40 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45761) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPv-0000hG-6S for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPs-0003Sh-No for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:47 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:56107) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPr-0003P8-Uo; Fri, 22 Jun 2018 06:35:44 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2H30kHz9s7M; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663735; bh=4JLNuZOc3oROrWXV082ERH9/K7BvZEP4qZtFC1h7RlU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eme6ZKh1xJtXk+CGjW6VFeICPBmMNEmMQ0n5FkUhG2l2oZyUIHAOQx9G/FeeoozS6 MRTVx16X5zbbWrTJb2zVOng71ow9YjQyRrtovDrmmNdegZIJUnAFtgf5er3dya4poY OiWFmke5DMGu1PV8ckPEujExG9S3JBQLsy1i77o4= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:13 +1000 Message-Id: <20180622103528.28598-11-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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 10/25] target/ppc: Add kvmppc_hpt_needs_host_contiguous_pages() helper 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" KVM HV has a restriction that for HPT mode guests, guest pages must be hpa contiguous as well as gpa contiguous. We have to account for that in various places. We determine whether we're subject to this restriction from the SMMU information exposed by KVM. Planned cleanups to the way we handle this will require knowing whether this restriction is in play in wider parts of the code. So, expose a helper function which returns it. This does mean some redundant calls to kvm_get_smmu_info(), but they'll go away again with future cleanups. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: C=C3=A9dric Le Goater --- target/ppc/kvm.c | 17 +++++++++++++++-- target/ppc/kvm_ppc.h | 6 ++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 5c0e313ca6..50b5d01432 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -406,9 +406,22 @@ target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu, } } =20 +bool kvmppc_hpt_needs_host_contiguous_pages(void) +{ + PowerPCCPU *cpu =3D POWERPC_CPU(first_cpu); + static struct kvm_ppc_smmu_info smmu_info; + + if (!kvm_enabled()) { + return false; + } + + kvm_get_smmu_info(cpu, &smmu_info); + return !!(smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL); +} + static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t s= hift) { - if (!(flags & KVM_PPC_PAGE_SIZES_REAL)) { + if (!kvmppc_hpt_needs_host_contiguous_pages()) { return true; } =20 @@ -445,7 +458,7 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu) /* If we have HV KVM, we need to forbid CI large pages if our * host page size is smaller than 64K. */ - if (smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL) { + if (kvmppc_hpt_needs_host_contiguous_pages()) { if (getpagesize() >=3D 0x10000) { cpu->hash64_opts->flags |=3D PPC_HASH64_CI_LARGEPAGE; } else { diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index e2840e1d33..a7ddb8a5d6 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -70,6 +70,7 @@ int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, target_ulo= ng flags, int shift); int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shif= t); bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu); =20 +bool kvmppc_hpt_needs_host_contiguous_pages(void); bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path); =20 #else @@ -222,6 +223,11 @@ static inline uint64_t kvmppc_rma_size(uint64_t curren= t_size, return ram_size; } =20 +static inline bool kvmppc_hpt_needs_host_contiguous_pages(void) +{ + return false; +} + static inline bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) { return true; --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664656839668.7357850915006; Fri, 22 Jun 2018 03:50:56 -0700 (PDT) Received: from localhost ([::1]:60752 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJeU-0003zY-Qk for importer@patchew.org; Fri, 22 Jun 2018 06:50:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45942) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJQ0-0000oe-5Y for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPw-0003Wp-Lv for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:52 -0400 Received: from ozlabs.org ([203.11.71.1]:45005) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPv-0003Tu-Pj; Fri, 22 Jun 2018 06:35:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2K223Jz9sBb; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663737; bh=nndXPzGNeXLekZzQg5M0EYOgYJSrozEaSHXM2IGeV/Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OOWHG5G8zZeWcP1i/qVSt3SgozyJux8KTzcxmxkPgRWdZDyihsHHBZ+BOskbNUYgG UqIg1fnMQ+NRRF26oL101vffJU0JAvTYORxTR6CJvJbZSRKq6J3sbYxIMZrSTIOQSf K8/Wcy+6wbcKLFfZFIUaoX2FlfclK9zIUKUzRkhA= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:14 +1000 Message-Id: <20180622103528.28598-12-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 11/25] spapr: split the IRQ allocation sequence 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater Today, when a device requests for IRQ number in a sPAPR machine, the spapr_irq_alloc() routine first scans the ICSState status array to find an empty slot and then performs the assignement of the selected numbers. Split this sequence in two distinct routines : spapr_irq_find() for lookups and spapr_irq_claim() for claiming the IRQ numbers. This will ease the introduction of a static layout of IRQ numbers. Signed-off-by: C=C3=A9dric Le Goater Signed-off-by: David Gibson --- hw/ppc/spapr.c | 50 ++++++++++++++++++++++++++++++++++++++++++ hw/ppc/spapr_events.c | 18 +++++++++++---- hw/ppc/spapr_pci.c | 23 ++++++++++++++++--- hw/ppc/spapr_vio.c | 10 ++++++++- include/hw/ppc/spapr.h | 4 ++++ 5 files changed, 97 insertions(+), 8 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 4a0b679166..b7705c3944 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3816,6 +3816,36 @@ static int ics_find_free_block(ICSState *ics, int nu= m, int alignnum) return -1; } =20 +int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **= errp) +{ + ICSState *ics =3D spapr->ics; + int first =3D -1; + + assert(ics); + + /* + * MSIMesage::data is used for storing VIRQ so + * it has to be aligned to num to support multiple + * MSI vectors. MSI-X is not affected by this. + * The hint is used for the first IRQ, the rest should + * be allocated continuously. + */ + if (align) { + assert((num =3D=3D 1) || (num =3D=3D 2) || (num =3D=3D 4) || + (num =3D=3D 8) || (num =3D=3D 16) || (num =3D=3D 32)); + first =3D ics_find_free_block(ics, num, num); + } else { + first =3D ics_find_free_block(ics, num, 1); + } + + if (first < 0) { + error_setg(errp, "can't find a free %d-IRQ block", num); + return -1; + } + + return first + ics->offset; +} + /* * Allocate the IRQ number and set the IRQ type, LSI or MSI */ @@ -3894,6 +3924,26 @@ int spapr_irq_alloc_block(sPAPRMachineState *spapr, = int num, bool lsi, return first; } =20 +int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **e= rrp) +{ + ICSState *ics =3D spapr->ics; + + assert(ics); + + if (!ics_valid_irq(ics, irq)) { + error_setg(errp, "IRQ %d is invalid", irq); + return -1; + } + + if (!ICS_IRQ_FREE(ics, irq - ics->offset)) { + error_setg(errp, "IRQ %d is not free", irq); + return -1; + } + + spapr_irq_set_lsi(spapr, irq, lsi); + return 0; +} + void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num) { ICSState *ics =3D spapr->ics; diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 86836f0626..e4f5946a21 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -707,13 +707,18 @@ void spapr_clear_pending_events(sPAPRMachineState *sp= apr) =20 void spapr_events_init(sPAPRMachineState *spapr) { + int epow_irq; + + epow_irq =3D spapr_irq_findone(spapr, &error_fatal); + + spapr_irq_claim(spapr, epow_irq, false, &error_fatal); + QTAILQ_INIT(&spapr->pending_events); =20 spapr->event_sources =3D spapr_event_sources_new(); =20 spapr_event_sources_register(spapr->event_sources, EVENT_CLASS_EPOW, - spapr_irq_alloc(spapr, 0, false, - &error_fatal)); + epow_irq); =20 /* NOTE: if machine supports modern/dedicated hotplug event source, * we add it to the device-tree unconditionally. This means we may @@ -724,9 +729,14 @@ void spapr_events_init(sPAPRMachineState *spapr) * checking that it's enabled. */ if (spapr->use_hotplug_event_source) { + int hp_irq; + + hp_irq =3D spapr_irq_findone(spapr, &error_fatal); + + spapr_irq_claim(spapr, hp_irq, false, &error_fatal); + spapr_event_sources_register(spapr->event_sources, EVENT_CLASS_HOT= _PLUG, - spapr_irq_alloc(spapr, 0, false, - &error_fatal)); + hp_irq); } =20 spapr->epow_notifier.notify =3D spapr_powerdown_req; diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index f936ce63ef..497b896c7d 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -279,6 +279,7 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRM= achineState *spapr, spapr_pci_msi *msi; int *config_addr_key; Error *err =3D NULL; + int i; =20 /* Fins sPAPRPHBState */ phb =3D spapr_pci_find_phb(spapr, buid); @@ -371,8 +372,7 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRM= achineState *spapr, } =20 /* Allocate MSIs */ - irq =3D spapr_irq_alloc_block(spapr, req_num, false, - ret_intr_type =3D=3D RTAS_TYPE_MSI, &err); + irq =3D spapr_irq_find(spapr, req_num, ret_intr_type =3D=3D RTAS_TYPE_= MSI, &err); if (err) { error_reportf_err(err, "Can't allocate MSIs for device %x: ", config_addr); @@ -380,6 +380,16 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPR= MachineState *spapr, return; } =20 + for (i =3D 0; i < req_num; i++) { + spapr_irq_claim(spapr, irq + i, false, &err); + if (err) { + error_reportf_err(err, "Can't allocate MSIs for device %x: ", + config_addr); + rtas_st(rets, 0, RTAS_OUT_HW_ERROR); + return; + } + } + /* Release previous MSIs */ if (msi) { spapr_irq_free(spapr, msi->first_irq, msi->num); @@ -1698,7 +1708,14 @@ static void spapr_phb_realize(DeviceState *dev, Erro= r **errp) uint32_t irq; Error *local_err =3D NULL; =20 - irq =3D spapr_irq_alloc_block(spapr, 1, true, false, &local_err); + irq =3D spapr_irq_findone(spapr, &local_err); + if (local_err) { + error_propagate(errp, local_err); + error_prepend(errp, "can't allocate LSIs: "); + return; + } + + spapr_irq_claim(spapr, irq, true, &local_err); if (local_err) { error_propagate(errp, local_err); error_prepend(errp, "can't allocate LSIs: "); diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c index 4555c648a8..daf85130b5 100644 --- a/hw/ppc/spapr_vio.c +++ b/hw/ppc/spapr_vio.c @@ -475,7 +475,15 @@ static void spapr_vio_busdev_realize(DeviceState *qdev= , Error **errp) dev->qdev.id =3D id; } =20 - dev->irq =3D spapr_irq_alloc(spapr, dev->irq, false, &local_err); + if (!dev->irq) { + dev->irq =3D spapr_irq_findone(spapr, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + } + + spapr_irq_claim(spapr, dev->irq, false, &local_err); if (local_err) { error_propagate(errp, local_err); return; diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 9dd46a72f6..6bfdf5a2fb 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -776,6 +776,10 @@ int spapr_irq_alloc(sPAPRMachineState *spapr, int irq_= hint, bool lsi, Error **errp); int spapr_irq_alloc_block(sPAPRMachineState *spapr, int num, bool lsi, 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) +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); =20 --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664461709519.5126804551581; Fri, 22 Jun 2018 03:47:41 -0700 (PDT) Received: from localhost ([::1]:60735 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJbR-0001d6-0l for importer@patchew.org; Fri, 22 Jun 2018 06:47:41 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45852) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPx-0000kZ-Mh for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPu-0003Uo-HR for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:49 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:53031) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPt-0003Qy-Jr; Fri, 22 Jun 2018 06:35:46 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2J4CHRz9sBJ; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663736; bh=m05T2XFj3FxA5bAxC47MB8ys1YHP43N470/0NmsivWY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DtFcWBjJ9XA+i9aKaCtP+ABo6oFzTGMY5DXUNDMuJNm0+oh0my//eqtj8sM2hqexK rPXI/mZj/YeGpVtSpeAzowYgAzmtbNQDXWFcFgz+jAPEb2wShmSVAdY+yFHg1PlFdy w3uUn/GyXlKVy2RS/aXuYJIJOVIhxnTyMViWCHrI= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:15 +1000 Message-Id: <20180622103528.28598-13-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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 12/25] spapr: remove unused spapr_irq routines 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: C=C3=A9dric Le Goater spapr_irq_alloc_block and spapr_irq_alloc() are now deprecated. Signed-off-by: C=C3=A9dric Le Goater Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/spapr.c | 80 +----------------------------------------- include/hw/ppc/spapr.h | 4 --- 2 files changed, 1 insertion(+), 83 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index b7705c3944..78186500e9 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3846,84 +3846,6 @@ int spapr_irq_find(sPAPRMachineState *spapr, int num= , bool align, Error **errp) return first + ics->offset; } =20 -/* - * Allocate the IRQ number and set the IRQ type, LSI or MSI - */ -static void spapr_irq_set_lsi(sPAPRMachineState *spapr, int irq, bool lsi) -{ - ics_set_irq_type(spapr->ics, irq - spapr->ics->offset, lsi); -} - -int spapr_irq_alloc(sPAPRMachineState *spapr, int irq_hint, bool lsi, - Error **errp) -{ - ICSState *ics =3D spapr->ics; - int irq; - - assert(ics); - - if (irq_hint) { - if (!ICS_IRQ_FREE(ics, irq_hint - ics->offset)) { - error_setg(errp, "can't allocate IRQ %d: already in use", irq_= hint); - return -1; - } - irq =3D irq_hint; - } else { - irq =3D ics_find_free_block(ics, 1, 1); - if (irq < 0) { - error_setg(errp, "can't allocate IRQ: no IRQ left"); - return -1; - } - irq +=3D ics->offset; - } - - spapr_irq_set_lsi(spapr, irq, lsi); - trace_spapr_irq_alloc(irq); - - return irq; -} - -/* - * Allocate block of consecutive IRQs, and return the number of the first = IRQ in - * the block. If align=3D=3Dtrue, aligns the first IRQ number to num. - */ -int spapr_irq_alloc_block(sPAPRMachineState *spapr, int num, bool lsi, - bool align, Error **errp) -{ - ICSState *ics =3D spapr->ics; - int i, first =3D -1; - - assert(ics); - - /* - * MSIMesage::data is used for storing VIRQ so - * it has to be aligned to num to support multiple - * MSI vectors. MSI-X is not affected by this. - * The hint is used for the first IRQ, the rest should - * be allocated continuously. - */ - if (align) { - assert((num =3D=3D 1) || (num =3D=3D 2) || (num =3D=3D 4) || - (num =3D=3D 8) || (num =3D=3D 16) || (num =3D=3D 32)); - first =3D ics_find_free_block(ics, num, num); - } else { - first =3D ics_find_free_block(ics, num, 1); - } - if (first < 0) { - error_setg(errp, "can't find a free %d-IRQ block", num); - return -1; - } - - first +=3D ics->offset; - for (i =3D first; i < first + num; ++i) { - spapr_irq_set_lsi(spapr, i, lsi); - } - - trace_spapr_irq_alloc_block(first, num, lsi, align); - - return first; -} - int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **e= rrp) { ICSState *ics =3D spapr->ics; @@ -3940,7 +3862,7 @@ int spapr_irq_claim(sPAPRMachineState *spapr, int irq= , bool lsi, Error **errp) return -1; } =20 - spapr_irq_set_lsi(spapr, irq, lsi); + ics_set_irq_type(ics, irq - ics->offset, lsi); return 0; } =20 diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 6bfdf5a2fb..8a9142244f 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -772,10 +772,6 @@ int spapr_get_vcpu_id(PowerPCCPU *cpu); void spapr_set_vcpu_id(PowerPCCPU *cpu, int cpu_index, Error **errp); PowerPCCPU *spapr_find_cpu(int vcpu_id); =20 -int spapr_irq_alloc(sPAPRMachineState *spapr, int irq_hint, bool lsi, - Error **errp); -int spapr_irq_alloc_block(sPAPRMachineState *spapr, int num, bool lsi, - 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 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664255308130.1187112432773; Fri, 22 Jun 2018 03:44:15 -0700 (PDT) Received: from localhost ([::1]:60715 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJY6-0007Bb-JO for importer@patchew.org; Fri, 22 Jun 2018 06:44:14 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45781) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPv-0000ha-J5 for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPt-0003TG-6S for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:47 -0400 Received: from ozlabs.org ([203.11.71.1]:51415) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPs-0003QK-J6; Fri, 22 Jun 2018 06:35:45 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2J1MBmz9sBQ; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663736; bh=M8aQkUpC2cOVnLCKzRST3f7Xq+oPzCoVI7MvJSUZr0o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VoH/121weJlonafXUsBUzJvhu3QbzNfIoNPGPrJ2PQiy9a1+YtvHihI2yFbzfEzOG NBJb43hPEeFFOR2K3nPd+UzdgdDMgkisa5NfOmwiTSLUMI2Pt4UCVNPerK2TW7XI7W J/BcmJDupbFcP2ZAvDOOgFYRZcePYUCWUgD64tDI= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:16 +1000 Message-Id: <20180622103528.28598-14-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 13/25] fpu_helper.c: fix helper_fpscr_clrbit() 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, John Arbuckle , 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: John Arbuckle Fix the helper_fpscr_clrbit() function so it correctly sets the FEX and VX bits. Determining the value for the Floating Point Status and Control Register's (FPSCR) FEX bit is suppose to be done like this: FEX =3D (VX & VE) | (OX & OE) | (UX & UE) | (ZX & ZE) | (XX & XE)) It is described as "the logical OR of all the floating-point exception bits masked by their respective enable bits". It was not implemented correctly. The value of FEX would stay on even when all other bits were set to off. The VX bit is described as "the logical OR of all of the invalid operation exceptions". This bit was also not implemented correctly. It too would stay on when all the other bits were set to off. My main source of information is an IBM document called: PowerPC Microprocessor Family: The Programming Environments for 32-Bit Microprocessors Page 62 is where the FPSCR information is located. This is an older copy than the one I use but it is still very useful: https://www.pdfdrive.net/powerpc-microprocessor-family-the-programming-envi= ronments-for-32-e3087633.html I use a G3 and G5 iMac to compare bit values with QEMU. This patch fixed all the problems I was having with these bits. Signed-off-by: John Arbuckle [dwg: Re-wrapped commit message] Signed-off-by: David Gibson --- target/ppc/fpu_helper.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c index d31a933cbb..7714bfe0f9 100644 --- a/target/ppc/fpu_helper.c +++ b/target/ppc/fpu_helper.c @@ -325,6 +325,34 @@ void helper_fpscr_clrbit(CPUPPCState *env, uint32_t bi= t) case FPSCR_RN: fpscr_set_rounding_mode(env); break; + case FPSCR_VXSNAN: + case FPSCR_VXISI: + case FPSCR_VXIDI: + case FPSCR_VXZDZ: + case FPSCR_VXIMZ: + case FPSCR_VXVC: + case FPSCR_VXSOFT: + case FPSCR_VXSQRT: + case FPSCR_VXCVI: + if (!fpscr_ix) { + /* Set VX bit to zero */ + env->fpscr &=3D ~(1 << FPSCR_VX); + } + break; + case FPSCR_OX: + case FPSCR_UX: + case FPSCR_ZX: + case FPSCR_XX: + case FPSCR_VE: + case FPSCR_OE: + case FPSCR_UE: + case FPSCR_ZE: + case FPSCR_XE: + if (!fpscr_eex) { + /* Set the FEX bit */ + env->fpscr &=3D ~(1 << FPSCR_FEX); + } + break; default: break; } --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664527916353.5399857898386; Fri, 22 Jun 2018 03:48:47 -0700 (PDT) Received: from localhost ([::1]:60738 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJcV-0002MV-5N for importer@patchew.org; Fri, 22 Jun 2018 06:48:47 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45790) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPv-0000hs-TS for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPt-0003UE-Vn for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:47 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:42631) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPt-0003Qt-7i; Fri, 22 Jun 2018 06:35:45 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2J2Tz5z9sBD; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663736; bh=SmVfq5yUdFq/bu5sn9/D0HT0S5QmwzDMGsMchaU99C8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pHgzZncQDQr+DsYp++lvo7GP4uxl/gkYjC0lDMmN/L01HeWVn2Ob87x8SWQccHLeK +Aw4P7UHVyaFzl10vM452Hx0OhLHfawUPtp8Cje9jS9u1t9YXUduZ7buuuz459gzR3 V+zn/uinWmVBAxYCgTHysShRxNNMdSUjuIQz4X3k= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:17 +1000 Message-Id: <20180622103528.28598-15-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> 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 14/25] sm501: Fix hardware cursor color conversion 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, aik@ozlabs.ru, Sebastian Bauer , qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Sebastian Bauer According to the sm501 specs the hardware cursor colors are to be given in the rgb565 format, but the code currently interprets them as bgr565. Therefore, the colors of the hardware cursors are wrong in the QEMU display, e.g., the standard mouse pointer of AmigaOS appears blue instead of red. This change fixes this issue by replacing the existing naive bgr565 =3D> rgb888 conversion with a standard rgb565 =3D> rgb888 one that a= lso scales the color component values properly. Signed-off-by: Sebastian Bauer Signed-off-by: David Gibson --- hw/display/sm501.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/display/sm501.c b/hw/display/sm501.c index ca0840f6fa..8206ae81a1 100644 --- a/hw/display/sm501.c +++ b/hw/display/sm501.c @@ -652,9 +652,9 @@ static inline void get_hwc_palette(SM501State *state, i= nt crt, uint8_t *palette) } else { rgb565 =3D color_reg & 0xFFFF; } - palette[i * 3 + 0] =3D (rgb565 << 3) & 0xf8; /* red */ - palette[i * 3 + 1] =3D (rgb565 >> 3) & 0xfc; /* green */ - palette[i * 3 + 2] =3D (rgb565 >> 8) & 0xf8; /* blue */ + palette[i * 3 + 0] =3D ((rgb565 >> 11) * 527 + 23) >> 6; /* r */ + palette[i * 3 + 1] =3D (((rgb565 >> 5) & 0x3f) * 259 + 33) >> 6; /= * g */ + palette[i * 3 + 2] =3D ((rgb565 & 0x1f) * 527 + 23) >> 6; /* b */ } } =20 --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664742428562.5926977639928; Fri, 22 Jun 2018 03:52:22 -0700 (PDT) Received: from localhost ([::1]:60758 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJfx-00059f-O7 for importer@patchew.org; Fri, 22 Jun 2018 06:52:21 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45784) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPv-0000hh-Mc for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPt-0003TY-C4 for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:47 -0400 Received: from ozlabs.org ([203.11.71.1]:58089) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPs-0003QF-HW; Fri, 22 Jun 2018 06:35:45 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2H5zD1z9sBZ; Fri, 22 Jun 2018 20:35:34 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663735; bh=mibbBfDv2VFUbRVnNO+PsjzgrZmShFebtR4HjSYnUcs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QnvO+bgPmyJrFwi/Li7GzNHp3P2TBV041i+fQBhWU0NoZTfbYKhsUM4WayJkUlr3b 7cjcYYkB5gCUe+oKp0unj4/5DxPeykcusXrAdE9zu1U9X2hwYP8XBXdr0OxdqRslmz Jo5OPRgGjk2HN+tEgBwz2nd83mFRXzxKDGE7j6J8= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:18 +1000 Message-Id: <20180622103528.28598-16-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 15/25] ppc4xx_i2c: Remove unimplemented sdata and intr 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: BALATON Zoltan We don't emulate slave mode so related registers are not needed. [lh]sadr are only retained to avoid too many warnings and simplify debugging but sdata is not even correct because device has a 4 byte FIFO instead so just remove this unimplemented register for now. The intr register is also not implemented correctly, it is for diagnostics and normally not even visible on device without explicitly enabling it. As no guests are known to need this remove it as well. Signed-off-by: BALATON Zoltan Signed-off-by: David Gibson --- hw/i2c/ppc4xx_i2c.c | 16 +--------------- include/hw/i2c/ppc4xx_i2c.h | 4 +--- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/hw/i2c/ppc4xx_i2c.c b/hw/i2c/ppc4xx_i2c.c index d1936dbdca..4e0aaae1fc 100644 --- a/hw/i2c/ppc4xx_i2c.c +++ b/hw/i2c/ppc4xx_i2c.c @@ -3,7 +3,7 @@ * * Copyright (c) 2007 Jocelyn Mayer * Copyright (c) 2012 Fran=C3=A7ois Revol - * Copyright (c) 2016 BALATON Zoltan + * Copyright (c) 2016-2018 BALATON Zoltan * * Permission is hereby granted, free of charge, to any person obtaining a= copy * of this software and associated documentation files (the "Software"), t= o deal @@ -63,7 +63,6 @@ static void ppc4xx_i2c_reset(DeviceState *s) i2c->mdcntl =3D 0; i2c->sts =3D 0; i2c->extsts =3D 0x8f; - i2c->sdata =3D 0; i2c->lsadr =3D 0; i2c->hsadr =3D 0; i2c->clkdiv =3D 0; @@ -71,7 +70,6 @@ static void ppc4xx_i2c_reset(DeviceState *s) i2c->xfrcnt =3D 0; i2c->xtcntlss =3D 0; i2c->directcntl =3D 0xf; - i2c->intr =3D 0; } =20 static inline bool ppc4xx_i2c_is_master(PPC4xxI2CState *i2c) @@ -139,9 +137,6 @@ static uint64_t ppc4xx_i2c_readb(void *opaque, hwaddr a= ddr, unsigned int size) TYPE_PPC4xx_I2C, __func__); } break; - case 2: - ret =3D i2c->sdata; - break; case 4: ret =3D i2c->lmadr; break; @@ -181,9 +176,6 @@ static uint64_t ppc4xx_i2c_readb(void *opaque, hwaddr a= ddr, unsigned int size) case 16: ret =3D i2c->directcntl; break; - case 17: - ret =3D i2c->intr; - break; default: if (addr < PPC4xx_I2C_MEM_SIZE) { qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register 0x%" @@ -229,9 +221,6 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr= , uint64_t value, } } break; - case 2: - i2c->sdata =3D value; - break; case 4: i2c->lmadr =3D value; if (i2c_bus_busy(i2c->bus)) { @@ -302,9 +291,6 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr= , uint64_t value, case 16: i2c->directcntl =3D value & 0x7; break; - case 17: - i2c->intr =3D value; - break; default: if (addr < PPC4xx_I2C_MEM_SIZE) { qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register 0x%" diff --git a/include/hw/i2c/ppc4xx_i2c.h b/include/hw/i2c/ppc4xx_i2c.h index 3c603071bd..e4b6ded855 100644 --- a/include/hw/i2c/ppc4xx_i2c.h +++ b/include/hw/i2c/ppc4xx_i2c.h @@ -3,7 +3,7 @@ * * Copyright (c) 2007 Jocelyn Mayer * Copyright (c) 2012 Fran=C3=A7ois Revol - * Copyright (c) 2016 BALATON Zoltan + * Copyright (c) 2016-2018 BALATON Zoltan * * Permission is hereby granted, free of charge, to any person obtaining a= copy * of this software and associated documentation files (the "Software"), t= o deal @@ -49,7 +49,6 @@ typedef struct PPC4xxI2CState { uint8_t mdcntl; uint8_t sts; uint8_t extsts; - uint8_t sdata; uint8_t lsadr; uint8_t hsadr; uint8_t clkdiv; @@ -57,7 +56,6 @@ typedef struct PPC4xxI2CState { uint8_t xfrcnt; uint8_t xtcntlss; uint8_t directcntl; - uint8_t intr; } PPC4xxI2CState; =20 #endif /* PPC4XX_I2C_H */ --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664883288568.4443918570662; Fri, 22 Jun 2018 03:54:43 -0700 (PDT) Received: from localhost ([::1]:60776 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJiE-0006xg-GU for importer@patchew.org; Fri, 22 Jun 2018 06:54:42 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45785) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPv-0000hi-Mb for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPt-0003T3-1x for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:47 -0400 Received: from ozlabs.org ([203.11.71.1]:47359) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPs-0003Ps-A6; Fri, 22 Jun 2018 06:35:44 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2H3zH4z9s9T; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663735; bh=s4/B+4agv9pdc4PMSSfbW4vNF6W9ZQYZw0fQHucUwfk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OVJJjf4W2MsIbTBHU4NqpOWMpWo2/Klvc4CfRJjTwM58Oe4NRLYy1AIRv0uIwsIHE Q+MtB2cGCeRemwaZAiDJJ8/uloG7vV2iAU7keY1KovayUg3gEKWTzgkum2w94Jo2Rn 0mhTaUh0631OcOGlQHDEcpS8XGq5BK+OSzxomj2g= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:19 +1000 Message-Id: <20180622103528.28598-17-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 16/25] ppc4xx_i2c: Implement directcntl register 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: BALATON Zoltan As well as being able to generate its own i2c transactions, the ppc4xx i2c controller has a DIRECTCNTL register which allows explicit control of the i2c lines. Using this register an OS can directly bitbang i2c operations. In order to let emulated i2c devices respond to this, we need to wire up the DIRECTCNTL register to qemu's bitbanged i2c handling code. Signed-off-by: BALATON Zoltan Signed-off-by: David Gibson --- default-configs/ppc-softmmu.mak | 1 + default-configs/ppcemb-softmmu.mak | 1 + hw/i2c/ppc4xx_i2c.c | 14 +++++++++++++- include/hw/i2c/ppc4xx_i2c.h | 4 ++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/default-configs/ppc-softmmu.mak b/default-configs/ppc-softmmu.= mak index abeeb0418a..851b4afc21 100644 --- a/default-configs/ppc-softmmu.mak +++ b/default-configs/ppc-softmmu.mak @@ -26,6 +26,7 @@ CONFIG_USB_EHCI_SYSBUS=3Dy CONFIG_SM501=3Dy CONFIG_IDE_SII3112=3Dy CONFIG_I2C=3Dy +CONFIG_BITBANG_I2C=3Dy =20 # For Macs CONFIG_MAC=3Dy diff --git a/default-configs/ppcemb-softmmu.mak b/default-configs/ppcemb-so= ftmmu.mak index 67d18b2e0e..37af1930b3 100644 --- a/default-configs/ppcemb-softmmu.mak +++ b/default-configs/ppcemb-softmmu.mak @@ -19,3 +19,4 @@ CONFIG_USB_EHCI_SYSBUS=3Dy CONFIG_SM501=3Dy CONFIG_IDE_SII3112=3Dy CONFIG_I2C=3Dy +CONFIG_BITBANG_I2C=3Dy diff --git a/hw/i2c/ppc4xx_i2c.c b/hw/i2c/ppc4xx_i2c.c index 4e0aaae1fc..fca80d695a 100644 --- a/hw/i2c/ppc4xx_i2c.c +++ b/hw/i2c/ppc4xx_i2c.c @@ -30,6 +30,7 @@ #include "cpu.h" #include "hw/hw.h" #include "hw/i2c/ppc4xx_i2c.h" +#include "bitbang_i2c.h" =20 #define PPC4xx_I2C_MEM_SIZE 18 =20 @@ -46,6 +47,11 @@ =20 #define IIC_XTCNTLSS_SRST (1 << 0) =20 +#define IIC_DIRECTCNTL_SDAC (1 << 3) +#define IIC_DIRECTCNTL_SCLC (1 << 2) +#define IIC_DIRECTCNTL_MSDA (1 << 1) +#define IIC_DIRECTCNTL_MSCL (1 << 0) + static void ppc4xx_i2c_reset(DeviceState *s) { PPC4xxI2CState *i2c =3D PPC4xx_I2C(s); @@ -289,7 +295,12 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr add= r, uint64_t value, i2c->xtcntlss =3D value; break; case 16: - i2c->directcntl =3D value & 0x7; + i2c->directcntl =3D value & (IIC_DIRECTCNTL_SDAC & IIC_DIRECTCNTL_= SCLC); + i2c->directcntl |=3D (value & IIC_DIRECTCNTL_SCLC ? 1 : 0); + bitbang_i2c_set(i2c->bitbang, BITBANG_I2C_SCL, + i2c->directcntl & IIC_DIRECTCNTL_MSCL); + i2c->directcntl |=3D bitbang_i2c_set(i2c->bitbang, BITBANG_I2C_SDA, + (value & IIC_DIRECTCNTL_SDAC) !=3D 0) << 1; break; default: if (addr < PPC4xx_I2C_MEM_SIZE) { @@ -322,6 +333,7 @@ static void ppc4xx_i2c_init(Object *o) sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem); sysbus_init_irq(SYS_BUS_DEVICE(s), &s->irq); s->bus =3D i2c_init_bus(DEVICE(s), "i2c"); + s->bitbang =3D bitbang_i2c_init(s->bus); } =20 static void ppc4xx_i2c_class_init(ObjectClass *klass, void *data) diff --git a/include/hw/i2c/ppc4xx_i2c.h b/include/hw/i2c/ppc4xx_i2c.h index e4b6ded855..ea6c8e1a58 100644 --- a/include/hw/i2c/ppc4xx_i2c.h +++ b/include/hw/i2c/ppc4xx_i2c.h @@ -31,6 +31,9 @@ #include "hw/sysbus.h" #include "hw/i2c/i2c.h" =20 +/* from hw/i2c/bitbang_i2c.h */ +typedef struct bitbang_i2c_interface bitbang_i2c_interface; + #define TYPE_PPC4xx_I2C "ppc4xx-i2c" #define PPC4xx_I2C(obj) OBJECT_CHECK(PPC4xxI2CState, (obj), TYPE_PPC4xx_I2= C) =20 @@ -42,6 +45,7 @@ typedef struct PPC4xxI2CState { I2CBus *bus; qemu_irq irq; MemoryRegion iomem; + bitbang_i2c_interface *bitbang; uint8_t mdata; uint8_t lmadr; uint8_t hmadr; --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 152966443170224.947625985980494; Fri, 22 Jun 2018 03:47:11 -0700 (PDT) Received: from localhost ([::1]:60734 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJaw-0001GW-VO for importer@patchew.org; Fri, 22 Jun 2018 06:47:11 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45750) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPv-0000h2-1H for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPt-0003TO-8S for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:47 -0400 Received: from ozlabs.org ([203.11.71.1]:33561) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPs-0003QI-Kv; Fri, 22 Jun 2018 06:35:45 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2J0bqYz9sBK; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663736; bh=3/36QlZ2urOPp3rZnxef8W2T43FFTi5nHAA82CXSisI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KVrsO9oivkdBP3xI396bdxayDrMUrlqpCKsS4Raoh8He22LqU0F/rssh1H41YX0zv p0T2XqSa4XneyFTPvvxwWVco5xJGNUkF0yXsDH/QdV7g66u02FwRRsZ1huVJS40EE7 zon/X3MuvgjqpJRUu0e4Yv/xJtamfFrdh4dAc7kc= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:20 +1000 Message-Id: <20180622103528.28598-18-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 17/25] target/ppc: Add missing opcode for icbt on PPC440 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: BALATON Zoltan According to PPC440 User Manual PPC440 has multiple opcodes for icbt instruction: one for compatibility with older cores and two 440 specific opcodes one of which is defined in BookE. QEMU only implements two of these, add the missing one. Signed-off-by: BALATON Zoltan Signed-off-by: David Gibson --- target/ppc/translate.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/ppc/translate.c b/target/ppc/translate.c index 5fe1ba6555..3a215a1dc6 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -6707,6 +6707,8 @@ GEN_HANDLER_E(mbar, 0x1F, 0x16, 0x1a, 0x001FF801, GEN_HANDLER(msync_4xx, 0x1F, 0x16, 0x12, 0x03FFF801, PPC_BOOKE), GEN_HANDLER2_E(icbt_440, "icbt", 0x1F, 0x16, 0x00, 0x03E00001, PPC_BOOKE, PPC2_BOOKE206), +GEN_HANDLER2(icbt_440, "icbt", 0x1F, 0x06, 0x08, 0x03E00001, + PPC_440_SPEC), GEN_HANDLER(lvsl, 0x1f, 0x06, 0x00, 0x00000001, PPC_ALTIVEC), GEN_HANDLER(lvsr, 0x1f, 0x06, 0x01, 0x00000001, PPC_ALTIVEC), GEN_HANDLER(mfvscr, 0x04, 0x2, 0x18, 0x001ff800, PPC_ALTIVEC), --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529665287372733.2691650094647; Fri, 22 Jun 2018 04:01:27 -0700 (PDT) Received: from localhost ([::1]:60825 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJoh-0004wl-0W for importer@patchew.org; Fri, 22 Jun 2018 07:01:23 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46772) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJQa-0001P7-1Q for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:36:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPx-0003Xg-TN for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:36:28 -0400 Received: from ozlabs.org ([203.11.71.1]:33261) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPv-0003TL-GK; Fri, 22 Jun 2018 06:35:49 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2J5H2fz9sB8; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663736; bh=sMMDedKgvRpEv3mRCPoB3o+VZh9jTMynq/ZpiX/6V4Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Nlkd7LaVXK2UxGKEvzcWii7vkbaQ75kREypEu51qK79/qElNaM0xpDdFGXQGnulzM V2LbHW0DUVDpfSZCbNlnJi2UahOnAvGCb3mJoQU8bvlEzqQQ/XJPUuVQ6dEFaXGwa6 SB49ALDu+jMi655uyt9Tc0vlGxvZBvEbXBHanMPQ= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:21 +1000 Message-Id: <20180622103528.28598-19-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 18/25] pseries: Update SLOF firmware image to qemu-slof-20180621 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Alexey Kardashevskiy The changes are: 1. fixed broken_sc1; 2. added switching between boot consoles; 3. added PXE boot. The full list is: > lib/libnet/pxelinux: Fix two off-by-one bugs in the pxelinux.cfg parser > lib/libnet/pxelinux: Make the size handling for pxelinux_load_cfg more l= ogical > libc: Add a simple implementation of an assert() function > libnet: Support UUID-based pxelinux.cfg file names > slof: Add a helper function to get the contents of a property in C code > libnet: Add support for DHCPv4 options 209 and 210 > libnet: Wire up pxelinux.cfg network booting > libnet: Add functions for downloading and parsing pxelinux.cfg files > libnet: Put code for determing TFTP error strings into a separate functi= on > libc: Add the snprintf() function > libnet: Pass ip_version via struct filename_ip > resolve ihandle and xt handle in the input command (like for the output) > Fix output word > obp-tftp: Make sure to not overwrite paflof in memory > libnet: Get rid of unused huge_load and block_size parameters > libc: Check for NULL pointers in free() > libc: Implement strrchr() > libnet: Get rid of unnecessary (char *) casts > broken_sc1: check for H_PRIVILEGE > OF: Use new property "stdout-path" for boot console Signed-off-by: Alexey Kardashevskiy Signed-off-by: David Gibson --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 913880 -> 924840 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index a843e1e8b1..99e15a737b 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -17,7 +17,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20171214. + built from git tag qemu-slof-20180621. =20 - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index d46c83efb706e4664fec834234ba69d96ede3473..4e0e33f8297888ca8e143be784c= 30ce404f072cd 100644 GIT binary patch delta 231859 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 =3D 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 delta 221666 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 =3D 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 U&)nGEW5@N|C;#^jU!U~<0rFLY<^TWy diff --git a/roms/SLOF b/roms/SLOF index 2317427ce7..7d37babcfa 160000 --- a/roms/SLOF +++ b/roms/SLOF @@ -1 +1 @@ -Subproject commit 2317427ce76006723f7ae103a6998ab41dd79c68 +Subproject commit 7d37babcfa48a6eb08e726a8d13b745cb2eebe1c --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529665105452418.27806551870503; Fri, 22 Jun 2018 03:58:25 -0700 (PDT) Received: from localhost ([::1]:60803 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJlo-0001nh-Kb for importer@patchew.org; Fri, 22 Jun 2018 06:58:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45921) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPz-0000oD-KN for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPw-0003WN-9u for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:51 -0400 Received: from ozlabs.org ([203.11.71.1]:53089) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPv-0003Tm-HM; Fri, 22 Jun 2018 06:35:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2K0k1vz9sBR; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663737; bh=YDEyA+TrsW7RJ+g+8aqO9tyJZwYsVqFeyTUgP4pJYZA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GQX9QxhmAbZQ9E9v0bpgV777amrmPyfarQQghzhvn9QBy7bjDQuS7l/W4mlUJClIJ MnJ1ClXXcx2d4cZpZqE9vQdUk2pV7xQc4eK2IRLULGK3HwxQtkO1sniBBGrO2alS8T faotwwj2ujEqu54e9SNcs3gDCXfDKqSfwDSwh6zw= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:22 +1000 Message-Id: <20180622103528.28598-20-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 19/25] spapr: Maximum (HPT) pagesize property 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The way the POWER Hash Page Table (HPT) MMU is virtualized by KVM HV means that every page that the guest puts in the pagetables must be truly physically contiguous, not just GPA-contiguous. In effect this means that an HPT guest can't use any pagesizes greater than the host page size used to back its memory. At present we handle this by changing what we advertise to the guest based on the backing pagesizes. This is pretty bad, because it means the guest sees a different environment depending on what should be host configuration details. As a start on fixing this, we add a new capability parameter to the pseries machine type which gives the maximum allowed pagesizes for an HPT guest. For now we just create and validate the parameter without making it do anything. For backwards compatibility, on older machine types we set it to the max available page size for the host. For the 3.0 machine type, we fix it to 16, the intention being to only allow HPT pagesizes up to 64kiB by default in future. Signed-off-by: David Gibson Reviewed-by: C=C3=A9dric Le Goater Reviewed-by: Greg Kurz --- hw/ppc/spapr.c | 12 +++++++++ hw/ppc/spapr_caps.c | 56 ++++++++++++++++++++++++++++++++++++++++++ include/hw/ppc/spapr.h | 4 ++- 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 78186500e9..70b150b098 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -63,6 +63,7 @@ #include "hw/virtio/vhost-scsi-common.h" =20 #include "exec/address-spaces.h" +#include "exec/ram_addr.h" #include "hw/usb.h" #include "qemu/config-file.h" #include "qemu/error-report.h" @@ -4015,6 +4016,7 @@ static void spapr_machine_class_init(ObjectClass *oc,= void *data) 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_HPT_MAXPAGESIZE] =3D 16; /* 64kiB */ spapr_caps_add_properties(smc, &error_abort); } =20 @@ -4103,8 +4105,18 @@ static void spapr_machine_2_12_instance_options(Mach= ineState *machine) =20 static void spapr_machine_2_12_class_options(MachineClass *mc) { + sPAPRMachineClass *smc =3D SPAPR_MACHINE_CLASS(mc); + uint8_t mps; + spapr_machine_3_0_class_options(mc); SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_12); + + if (kvmppc_hpt_needs_host_contiguous_pages()) { + mps =3D ctz64(qemu_getrampagesize()); + } else { + mps =3D 34; /* allow everything up to 16GiB, i.e. everything */ + } + smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] =3D mps; } =20 DEFINE_SPAPR_MACHINE(2_12, "2.12", false); diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 68a4243efc..6cdc0c94e7 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -27,6 +27,7 @@ #include "qapi/visitor.h" #include "sysemu/hw_accel.h" #include "target/ppc/cpu.h" +#include "target/ppc/mmu-hash64.h" #include "cpu-models.h" #include "kvm_ppc.h" =20 @@ -144,6 +145,42 @@ out: g_free(val); } =20 +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); + uint8_t val =3D spapr_get_cap(spapr, cap->index); + uint64_t pagesize =3D (1ULL << val); + + visit_type_size(v, name, &pagesize, errp); +} + +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); + uint64_t pagesize; + uint8_t val; + Error *local_err =3D NULL; + + visit_type_size(v, name, &pagesize, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + if (!is_power_of_2(pagesize)) { + error_setg(errp, "cap-%s must be a power of 2", cap->name); + return; + } + + val =3D ctz64(pagesize); + spapr->cmd_line_caps[cap->index] =3D true; + spapr->eff.caps[cap->index] =3D val; +} + static void cap_htm_apply(sPAPRMachineState *spapr, uint8_t val, Error **e= rrp) { if (!val) { @@ -267,6 +304,16 @@ static void cap_safe_indirect_branch_apply(sPAPRMachin= eState *spapr, =20 #define VALUE_DESC_TRISTATE " (broken, workaround, fixed)" =20 +static void cap_hpt_maxpagesize_apply(sPAPRMachineState *spapr, + uint8_t val, Error **errp) +{ + if (val < 12) { + error_setg(errp, "Require at least 4kiB hpt-max-page-size"); + } else if (val < 16) { + warn_report("Many guests require at least 64kiB hpt-max-page-size"= ); + } +} + sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D { [SPAPR_CAP_HTM] =3D { .name =3D "htm", @@ -326,6 +373,15 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = =3D { .possible =3D &cap_ibs_possible, .apply =3D cap_safe_indirect_branch_apply, }, + [SPAPR_CAP_HPT_MAXPAGESIZE] =3D { + .name =3D "hpt-max-page-size", + .description =3D "Maximum page size for Hash Page Table guests", + .index =3D SPAPR_CAP_HPT_MAXPAGESIZE, + .get =3D spapr_cap_get_pagesize, + .set =3D spapr_cap_set_pagesize, + .type =3D "int", + .apply =3D cap_hpt_maxpagesize_apply, + }, }; =20 static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 8a9142244f..4bc9dbff96 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -66,8 +66,10 @@ typedef enum { #define SPAPR_CAP_SBBC 0x04 /* Indirect Branch Serialisation */ #define SPAPR_CAP_IBS 0x05 +/* HPT Maximum Page Size (encoded as a shift) */ +#define SPAPR_CAP_HPT_MAXPAGESIZE 0x06 /* Num Caps */ -#define SPAPR_CAP_NUM (SPAPR_CAP_IBS + 1) +#define SPAPR_CAP_NUM (SPAPR_CAP_HPT_MAXPAGESIZE + 1) =20 /* * Capability Values --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664662689547.9963320402092; Fri, 22 Jun 2018 03:51:02 -0700 (PDT) Received: from localhost ([::1]:60753 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJec-00046n-HW for importer@patchew.org; Fri, 22 Jun 2018 06:50:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45804) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPw-0000iH-Be for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPt-0003TT-9e for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:48 -0400 Received: from ozlabs.org ([203.11.71.1]:34395) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPs-0003Pt-Ez; Fri, 22 Jun 2018 06:35:45 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2H5LMGz9sBL; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663735; bh=FPzZ0ckImaG7yRY9eh52ye71NtIZTeYEc5kdpoaK2hY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Wqt63WUM4oL391nAbsv8l4gxb/9Ti0WKp9gG4QOl79G/4+AM1QwpRjjDLuluPigg5 ip5gVUFx7YXh1MuHOCJk9VovysO2yox+89yq67IekRcT0epAbAQcv92DEZKcHbhYD9 JBb6s+my8lIQxD4kmwEcHawqVKodh5Ci2kdkkKuo= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:23 +1000 Message-Id: <20180622103528.28598-21-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 20/25] spapr: Use maximum page size capability to simplify memory backend checking 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The way we used to handle KVM allowable guest pagesizes for PAPR guests required some convoluted checking of memory attached to the guest. The allowable pagesizes advertised to the guest cpus depended on the memory which was attached at boot, but then we needed to ensure that any memory later hotplugged didn't change which pagesizes were allowed. Now that we have an explicit machine option to control the allowable maximum pagesize we can simplify this. We just check all memory backends against that declared pagesize. We check base and cold-plugged memory at reset time, and hotplugged memory at pre_plug() time. Signed-off-by: David Gibson Reviewed-by: C=C3=A9dric Le Goater Reviewed-by: Greg Kurz --- hw/ppc/spapr.c | 17 +++++++---------- hw/ppc/spapr_caps.c | 21 +++++++++++++++++++++ include/hw/ppc/spapr.h | 3 +++ target/ppc/kvm.c | 14 -------------- target/ppc/kvm_ppc.h | 6 ------ 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 70b150b098..0d032a1ad0 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3192,11 +3192,13 @@ static void spapr_memory_pre_plug(HotplugHandler *h= otplug_dev, DeviceState *dev, Error **errp) { const sPAPRMachineClass *smc =3D SPAPR_MACHINE_GET_CLASS(hotplug_dev); + sPAPRMachineState *spapr =3D SPAPR_MACHINE(hotplug_dev); PCDIMMDevice *dimm =3D PC_DIMM(dev); PCDIMMDeviceClass *ddc =3D PC_DIMM_GET_CLASS(dimm); MemoryRegion *mr; uint64_t size; - char *mem_dev; + Object *memdev; + hwaddr pagesize; =20 if (!smc->dr_lmb_enabled) { error_setg(errp, "Memory hotplug not supported for this machine"); @@ -3215,15 +3217,10 @@ static void spapr_memory_pre_plug(HotplugHandler *h= otplug_dev, DeviceState *dev, return; } =20 - mem_dev =3D object_property_get_str(OBJECT(dimm), PC_DIMM_MEMDEV_PROP,= NULL); - if (mem_dev && !kvmppc_is_mem_backend_page_size_ok(mem_dev)) { - error_setg(errp, "Memory backend has bad page size. " - "Use 'memory-backend-file' with correct mem-path."); - goto out; - } - -out: - g_free(mem_dev); + memdev =3D object_property_get_link(OBJECT(dimm), PC_DIMM_MEMDEV_PROP, + &error_abort); + pagesize =3D host_memory_backend_pagesize(MEMORY_BACKEND(memdev)); + spapr_check_pagesize(spapr, pagesize, errp); } =20 struct sPAPRDIMMState { diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 6cdc0c94e7..722b213d9a 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -26,6 +26,7 @@ #include "qapi/error.h" #include "qapi/visitor.h" #include "sysemu/hw_accel.h" +#include "exec/ram_addr.h" #include "target/ppc/cpu.h" #include "target/ppc/mmu-hash64.h" #include "cpu-models.h" @@ -304,14 +305,34 @@ static void cap_safe_indirect_branch_apply(sPAPRMachi= neState *spapr, =20 #define VALUE_DESC_TRISTATE " (broken, workaround, fixed)" =20 +void spapr_check_pagesize(sPAPRMachineState *spapr, hwaddr pagesize, + Error **errp) +{ + hwaddr maxpagesize =3D (1ULL << spapr->eff.caps[SPAPR_CAP_HPT_MAXPAGES= IZE]); + + if (!kvmppc_hpt_needs_host_contiguous_pages()) { + return; + } + + if (maxpagesize > pagesize) { + error_setg(errp, + "Can't support %"HWADDR_PRIu" kiB guest pages with %" + HWADDR_PRIu" kiB host pages with this KVM implementatio= n", + maxpagesize >> 10, pagesize >> 10); + } +} + static void cap_hpt_maxpagesize_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { if (val < 12) { error_setg(errp, "Require at least 4kiB hpt-max-page-size"); + return; } else if (val < 16) { warn_report("Many guests require at least 64kiB hpt-max-page-size"= ); } + + spapr_check_pagesize(spapr, qemu_getrampagesize(), errp); } =20 sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D { diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 4bc9dbff96..7e028164ba 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -806,4 +806,7 @@ void spapr_caps_cpu_apply(sPAPRMachineState *spapr, Pow= erPCCPU *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, + Error **errp); + #endif /* HW_SPAPR_H */ diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 50b5d01432..9cfbd388ad 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -500,26 +500,12 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu) cpu->hash64_opts->flags &=3D ~PPC_HASH64_1TSEG; } } - -bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) -{ - Object *mem_obj =3D object_resolve_path(obj_path, NULL); - long pagesize =3D host_memory_backend_pagesize(MEMORY_BACKEND(mem_obj)= ); - - return pagesize >=3D max_cpu_page_size; -} - #else /* defined (TARGET_PPC64) */ =20 static inline void kvm_fixup_page_sizes(PowerPCCPU *cpu) { } =20 -bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) -{ - return true; -} - #endif /* !defined (TARGET_PPC64) */ =20 unsigned long kvm_arch_vcpu_id(CPUState *cpu) diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index a7ddb8a5d6..443fca0a4e 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -71,7 +71,6 @@ int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulon= g flags, int shift); bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu); =20 bool kvmppc_hpt_needs_host_contiguous_pages(void); -bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path); =20 #else =20 @@ -228,11 +227,6 @@ static inline bool kvmppc_hpt_needs_host_contiguous_pa= ges(void) return false; } =20 -static inline bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) -{ - return true; -} - static inline bool kvmppc_has_cap_spapr_vfio(void) { return false; --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529665293381680.9509501763704; Fri, 22 Jun 2018 04:01:33 -0700 (PDT) Received: from localhost ([::1]:60827 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJom-0005Aj-OR for importer@patchew.org; Fri, 22 Jun 2018 07:01:28 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45918) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPz-0000o9-JL for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPw-0003WY-GY for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:51 -0400 Received: from ozlabs.org ([203.11.71.1]:59847) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPv-0003Ts-Nz; Fri, 22 Jun 2018 06:35:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2K1VBtz9sBW; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663737; bh=3yGzj1my1DmrKY+VP1SfWC8fZuvEwWj1G6YqBzycQbY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ncigAUeMthW6T6sbMBuMOyyLowMIc+a7GNfPFzHoaXkK6+p4vR84OGajSBmsZdfqR 38F8e/NjsfPwtWq96va+eI5eXJGoZQ8FaNgKmb1T33StOfDim4ykUzZZdxyfVQKMBY N6pVacRObzZA56HnFxCh8WcjDnvWq4mvRp0DXekk= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:24 +1000 Message-Id: <20180622103528.28598-22-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 21/25] target/ppc: Add ppc_hash64_filter_pagesizes() 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The paravirtualized PAPR platform sometimes needs to restrict the guest to using only some of the page sizes actually supported by the host's MMU. At the moment this is handled in KVM specific code, but for consistency we want to apply the same limitations to all accelerators. This makes a start on this by providing a helper function in the cpu code to allow platform code to remove some of the cpu's page size definitions via a caller supplied callback. Signed-off-by: David Gibson Reviewed-by: C=C3=A9dric Le Goater Reviewed-by: Greg Kurz --- target/ppc/mmu-hash64.c | 59 +++++++++++++++++++++++++++++++++++++++++ target/ppc/mmu-hash64.h | 3 +++ 2 files changed, 62 insertions(+) diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index aa200cba4c..276d9015e7 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -1166,3 +1166,62 @@ const PPCHash64Options ppc_hash64_opts_POWER7 =3D { }, } }; + +void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu, + bool (*cb)(void *, uint32_t, uint32_t), + void *opaque) +{ + PPCHash64Options *opts =3D cpu->hash64_opts; + int i; + int n =3D 0; + bool ci_largepage =3D false; + + assert(opts); + + n =3D 0; + for (i =3D 0; i < ARRAY_SIZE(opts->sps); i++) { + PPCHash64SegmentPageSizes *sps =3D &opts->sps[i]; + int j; + int m =3D 0; + + assert(n <=3D i); + + if (!sps->page_shift) { + break; + } + + for (j =3D 0; j < ARRAY_SIZE(sps->enc); j++) { + PPCHash64PageSize *ps =3D &sps->enc[j]; + + assert(m <=3D j); + if (!ps->page_shift) { + break; + } + + if (cb(opaque, sps->page_shift, ps->page_shift)) { + if (ps->page_shift >=3D 16) { + ci_largepage =3D true; + } + sps->enc[m++] =3D *ps; + } + } + + /* Clear rest of the row */ + for (j =3D m; j < ARRAY_SIZE(sps->enc); j++) { + memset(&sps->enc[j], 0, sizeof(sps->enc[j])); + } + + if (m) { + n++; + } + } + + /* Clear the rest of the table */ + for (i =3D n; i < ARRAY_SIZE(opts->sps); i++) { + memset(&opts->sps[i], 0, sizeof(opts->sps[i])); + } + + if (!ci_largepage) { + opts->flags &=3D ~PPC_HASH64_CI_LARGEPAGE; + } +} diff --git a/target/ppc/mmu-hash64.h b/target/ppc/mmu-hash64.h index 53dcec5b93..f11efc9cbc 100644 --- a/target/ppc/mmu-hash64.h +++ b/target/ppc/mmu-hash64.h @@ -20,6 +20,9 @@ unsigned ppc_hash64_hpte_page_shift_noslb(PowerPCCPU *cpu, void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val); void ppc_hash64_init(PowerPCCPU *cpu); void ppc_hash64_finalize(PowerPCCPU *cpu); +void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu, + bool (*cb)(void *, uint32_t, uint32_t), + void *opaque); #endif =20 /* --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529665241585857.8143831638859; Fri, 22 Jun 2018 04:00:41 -0700 (PDT) Received: from localhost ([::1]:60821 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJo0-0004Y3-KE for importer@patchew.org; Fri, 22 Jun 2018 07:00:40 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45893) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPy-0000nN-Pl for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPw-0003Wf-J1 for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:50 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:39811) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPw-0003Tx-0i; Fri, 22 Jun 2018 06:35:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2K4V1Cz9s9m; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663737; bh=+C1rwuyE9BVJq98OzSqbtEjAW8SaoMy9JV5B/R8X75k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cfC9XRkGGeDHf3e1A1vIfryq2Blf7zLJHPyWNObcx9E2j2d5drJ4ba7VkuBzNcidw 9+3owWeHWS7Q0ra/s1HqrPXPppboIX7yJ4HSxuYrhGLsKB19icZ1VzuUq+ctaquc7K 5Y90q8C0LZQPuIjR3CcSIAf9fnGhgTYOn6qf80jc= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:25 +1000 Message-Id: <20180622103528.28598-23-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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 22/25] spapr: Limit available pagesizes to provide a consistent guest environment 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" KVM HV has some limitations (deriving from the hardware) that mean not all host-cpu supported pagesizes may be usable in the guest. At present this means that KVM guests and TCG guests may see different available page sizes even if they notionally have the same vcpu model. This is confusing and also prevents migration between TCG and KVM. This patch makes the environment consistent by always allowing the same set of pagesizes. Since we can't remove the KVM limitations, we do this by always applying the same limitations it has, even to TCG guests. Signed-off-by: David Gibson Reviewed-by: C=C3=A9dric Le Goater Reviewed-by: Greg Kurz --- hw/ppc/spapr_caps.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 722b213d9a..62663ebdf5 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -335,6 +335,39 @@ static void cap_hpt_maxpagesize_apply(sPAPRMachineStat= e *spapr, spapr_check_pagesize(spapr, qemu_getrampagesize(), errp); } =20 +static bool spapr_pagesize_cb(void *opaque, uint32_t seg_pshift, + uint32_t pshift) +{ + unsigned maxshift =3D *((unsigned *)opaque); + + assert(pshift >=3D seg_pshift); + + /* Don't allow the guest to use pages bigger than the configured + * maximum size */ + if (pshift > maxshift) { + return false; + } + + /* For whatever reason, KVM doesn't allow multiple pagesizes + * within a segment, *except* for the case of 16M pages in a 4k or + * 64k segment. Always exclude other cases, so that TCG and KVM + * guests see a consistent environment */ + if ((pshift !=3D seg_pshift) && (pshift !=3D 24)) { + return false; + } + + return true; +} + +static void cap_hpt_maxpagesize_cpu_apply(sPAPRMachineState *spapr, + PowerPCCPU *cpu, + uint8_t val, Error **errp) +{ + unsigned maxshift =3D val; + + ppc_hash64_filter_pagesizes(cpu, spapr_pagesize_cb, &maxshift); +} + sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D { [SPAPR_CAP_HTM] =3D { .name =3D "htm", @@ -402,6 +435,7 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] =3D= { .set =3D spapr_cap_set_pagesize, .type =3D "int", .apply =3D cap_hpt_maxpagesize_apply, + .cpu_apply =3D cap_hpt_maxpagesize_cpu_apply, }, }; =20 --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529665483755230.8699846394644; Fri, 22 Jun 2018 04:04:43 -0700 (PDT) Received: from localhost ([::1]:60857 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJrv-0007PP-18 for importer@patchew.org; Fri, 22 Jun 2018 07:04:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46029) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJQ2-0000qO-KO for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPx-0003XS-Lr for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:54 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:55067) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPw-0003Ui-JN; Fri, 22 Jun 2018 06:35:49 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2L08Bxz9sBk; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663738; bh=XPs4DnOUT4ToAEmBbnubY71bv8w40jZ+nVZ7b3AU/2U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=odT4cyMR4P3Vqzhn9ywyZ5GEAj4/l7NZ9h/ZbParUzL6tNJ2TZDMt5RFD6bXal8Xo LLCsoVwmYIdvP+MjAa8EsGXryYcEDQ9vOQGmi5hOBkrpDXBanAc3fCpUusIqMV88eu AvTEcH89at16XybP3YOcdK8EstElupHzq2bC91K8= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:26 +1000 Message-Id: <20180622103528.28598-24-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-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/25] spapr: Don't rewrite mmu capabilities in KVM mode 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, aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Currently during KVM initialization on POWER, kvm_fixup_page_sizes() rewrites a bunch of information in the cpu state to reflect the capabilities of the host MMU and KVM. This overwrites the information that's already there reflecting how the TCG implementation of the MMU will operate. This means that we can get guest-visibly different behaviour between KVM and TCG (and between different KVM implementations). That's bad. It also prevents migration between KVM and TCG. The pseries machine type now has filtering of the pagesizes it allows the guest to use which means it can present a consistent model of the MMU across all accelerators. So, we can now replace kvm_fixup_page_sizes() with kvm_check_mmu() which merely verifies that the expected cpu model can be faithfully handled by KVM, rather than updating the cpu model to match KVM. We call kvm_check_mmu() from the spapr cpu reset code. This is a hack: conceptually it makes more sense where fixup_page_sizes() was - in the KVM cpu init path. However, doing that would require moving the platform's pagesize filtering much earlier, which would require a lot of work making further adjustments. There wouldn't be a lot of concrete point to doing that, since the only KVM implementation which has the awkward MMU restrictions is KVM HV, which can only work with an spapr guest anyway. Signed-off-by: David Gibson Reviewed-by: C=C3=A9dric Le Goater --- hw/ppc/spapr_cpu_core.c | 2 + target/ppc/kvm.c | 133 ++++++++++++++++++++-------------------- target/ppc/kvm_ppc.h | 5 ++ 3 files changed, 72 insertions(+), 68 deletions(-) diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index bfb94f650c..993759db47 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -78,6 +78,8 @@ static void spapr_cpu_reset(void *opaque) spapr_cpu->dtl_size =3D 0; =20 spapr_caps_cpu_apply(SPAPR_MACHINE(qdev_get_machine()), cpu); + + kvm_check_mmu(cpu, &error_fatal); } =20 void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_u= long r3) diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 9cfbd388ad..4df4ff6cbf 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -419,93 +419,93 @@ bool kvmppc_hpt_needs_host_contiguous_pages(void) return !!(smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL); } =20 -static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t s= hift) +void kvm_check_mmu(PowerPCCPU *cpu, Error **errp) { - if (!kvmppc_hpt_needs_host_contiguous_pages()) { - return true; - } - - return (1ul << shift) <=3D rampgsize; -} - -static long max_cpu_page_size; - -static void kvm_fixup_page_sizes(PowerPCCPU *cpu) -{ - static struct kvm_ppc_smmu_info smmu_info; - static bool has_smmu_info; - CPUPPCState *env =3D &cpu->env; + struct kvm_ppc_smmu_info smmu_info; int iq, ik, jq, jk; =20 - /* We only handle page sizes for 64-bit server guests for now */ - if (!(env->mmu_model & POWERPC_MMU_64)) { + /* For now, we only have anything to check on hash64 MMUs */ + if (!cpu->hash64_opts || !kvm_enabled()) { return; } =20 - /* Collect MMU info from kernel if not already */ - if (!has_smmu_info) { - kvm_get_smmu_info(cpu, &smmu_info); - has_smmu_info =3D true; - } + kvm_get_smmu_info(cpu, &smmu_info); =20 - if (!max_cpu_page_size) { - max_cpu_page_size =3D qemu_getrampagesize(); + if (ppc_hash64_has(cpu, PPC_HASH64_1TSEG) + && !(smmu_info.flags & KVM_PPC_1T_SEGMENTS)) { + error_setg(errp, + "KVM does not support 1TiB segments which guest expects= "); + return; } =20 - /* Convert to QEMU form */ - memset(cpu->hash64_opts->sps, 0, sizeof(*cpu->hash64_opts->sps)); - - /* If we have HV KVM, we need to forbid CI large pages if our - * host page size is smaller than 64K. - */ - if (kvmppc_hpt_needs_host_contiguous_pages()) { - if (getpagesize() >=3D 0x10000) { - cpu->hash64_opts->flags |=3D PPC_HASH64_CI_LARGEPAGE; - } else { - cpu->hash64_opts->flags &=3D ~PPC_HASH64_CI_LARGEPAGE; - } + if (smmu_info.slb_size < cpu->hash64_opts->slb_size) { + error_setg(errp, "KVM only supports %u SLB entries, but guest need= s %u", + smmu_info.slb_size, cpu->hash64_opts->slb_size); + return; } =20 /* - * XXX This loop should be an entry wide AND of the capabilities that - * the selected CPU has with the capabilities that KVM supports. + * Verify that every pagesize supported by the cpu model is + * supported by KVM with the same encodings */ - for (ik =3D iq =3D 0; ik < KVM_PPC_PAGE_SIZES_MAX_SZ; ik++) { + for (iq =3D 0; iq < ARRAY_SIZE(cpu->hash64_opts->sps); iq++) { PPCHash64SegmentPageSizes *qsps =3D &cpu->hash64_opts->sps[iq]; - struct kvm_ppc_one_seg_page_size *ksps =3D &smmu_info.sps[ik]; + struct kvm_ppc_one_seg_page_size *ksps; =20 - if (!kvm_valid_page_size(smmu_info.flags, max_cpu_page_size, - ksps->page_shift)) { - continue; - } - qsps->page_shift =3D ksps->page_shift; - qsps->slb_enc =3D ksps->slb_enc; - for (jk =3D jq =3D 0; jk < KVM_PPC_PAGE_SIZES_MAX_SZ; jk++) { - if (!kvm_valid_page_size(smmu_info.flags, max_cpu_page_size, - ksps->enc[jk].page_shift)) { - continue; - } - qsps->enc[jq].page_shift =3D ksps->enc[jk].page_shift; - qsps->enc[jq].pte_enc =3D ksps->enc[jk].pte_enc; - if (++jq >=3D PPC_PAGE_SIZES_MAX_SZ) { + for (ik =3D 0; ik < ARRAY_SIZE(smmu_info.sps); ik++) { + if (qsps->page_shift =3D=3D smmu_info.sps[ik].page_shift) { break; } } - if (++iq >=3D PPC_PAGE_SIZES_MAX_SZ) { - break; + if (ik >=3D ARRAY_SIZE(smmu_info.sps)) { + error_setg(errp, "KVM doesn't support for base page shift %u", + qsps->page_shift); + return; + } + + ksps =3D &smmu_info.sps[ik]; + if (ksps->slb_enc !=3D qsps->slb_enc) { + error_setg(errp, +"KVM uses SLB encoding 0x%x for page shift %u, but guest expects 0x%x", + ksps->slb_enc, ksps->page_shift, qsps->slb_enc); + return; + } + + for (jq =3D 0; jq < ARRAY_SIZE(qsps->enc); jq++) { + for (jk =3D 0; jk < ARRAY_SIZE(ksps->enc); jk++) { + if (qsps->enc[jq].page_shift =3D=3D ksps->enc[jk].page_shi= ft) { + break; + } + } + + if (jk >=3D ARRAY_SIZE(ksps->enc)) { + error_setg(errp, "KVM doesn't support page shift %u/%u", + qsps->enc[jq].page_shift, qsps->page_shift); + return; + } + if (qsps->enc[jq].pte_enc !=3D ksps->enc[jk].pte_enc) { + error_setg(errp, +"KVM uses PTE encoding 0x%x for page shift %u/%u, but guest expects 0x%x", + ksps->enc[jk].pte_enc, qsps->enc[jq].page_shift, + qsps->page_shift, qsps->enc[jq].pte_enc); + return; + } } } - cpu->hash64_opts->slb_size =3D smmu_info.slb_size; - if (!(smmu_info.flags & KVM_PPC_1T_SEGMENTS)) { - cpu->hash64_opts->flags &=3D ~PPC_HASH64_1TSEG; - } -} -#else /* defined (TARGET_PPC64) */ =20 -static inline void kvm_fixup_page_sizes(PowerPCCPU *cpu) -{ + if (ppc_hash64_has(cpu, PPC_HASH64_CI_LARGEPAGE)) { + /* Mostly what guest pagesizes we can use are related to the + * host pages used to map guest RAM, which is handled in the + * platform code. Cache-Inhibited largepages (64k) however are + * used for I/O, so if they're mapped to the host at all it + * will be a normal mapping, not a special hugepage one used + * for RAM. */ + if (getpagesize() < 0x10000) { + error_setg(errp, + "KVM can't supply 64kiB CI pages, which guest expec= ts"); + } + } } - #endif /* !defined (TARGET_PPC64) */ =20 unsigned long kvm_arch_vcpu_id(CPUState *cpu) @@ -551,9 +551,6 @@ int kvm_arch_init_vcpu(CPUState *cs) CPUPPCState *cenv =3D &cpu->env; int ret; =20 - /* Gather server mmu info from KVM and update the CPU state */ - kvm_fixup_page_sizes(cpu); - /* Synchronize sregs with kvm */ ret =3D kvm_arch_sync_sregs(cpu); if (ret) { diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index 443fca0a4e..657582bb32 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -71,6 +71,7 @@ int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulon= g flags, int shift); bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu); =20 bool kvmppc_hpt_needs_host_contiguous_pages(void); +void kvm_check_mmu(PowerPCCPU *cpu, Error **errp); =20 #else =20 @@ -227,6 +228,10 @@ static inline bool kvmppc_hpt_needs_host_contiguous_pa= ges(void) return false; } =20 +static inline void kvm_check_mmu(PowerPCCPU *cpu, Error **errp) +{ +} + static inline bool kvmppc_has_cap_spapr_vfio(void) { return false; --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529664851634862.6122366895173; Fri, 22 Jun 2018 03:54:11 -0700 (PDT) Received: from localhost ([::1]:60775 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJhi-0006Ua-SE for importer@patchew.org; Fri, 22 Jun 2018 06:54:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45916) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPz-0000ny-EA for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPw-0003Wx-O9 for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:51 -0400 Received: from ozlabs.org ([2401:3900:2:1::2]:58887) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPw-0003Tz-2z; Fri, 22 Jun 2018 06:35:48 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2K61JWz9sBh; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663737; bh=SrepHO9KNwqXwd7eVND8YUbfNl1DPbSo9/VXR730ClU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BcWJ6eblwYYEAsYrpO6KN9FICdw/0YslAkfuYHkQNikpsIXYLAiAjB6RCJSCSbfFR Cqc65EX1lfBTX84olp5XAVQZKi7gNRuJf7IQjg0sh/GILBZ5B8YlDhk+b1gI5N4LTu bc4DU9Y4TfwG+t5luTC8YIxqYMfXK0WTRgc1dpeQ= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:27 +1000 Message-Id: <20180622103528.28598-25-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> 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 24/25] mac_dbdma: only dump commands for debug enabled channels 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, aik@ozlabs.ru, Mark Cave-Ayland , qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland This enables us to apply the same filter in DEBUG_DBDMA_CHANMASK to the DBDMA command execution debug output. Signed-off-by: Mark Cave-Ayland Signed-off-by: David Gibson --- hw/misc/macio/mac_dbdma.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/hw/misc/macio/mac_dbdma.c b/hw/misc/macio/mac_dbdma.c index 1b2a69b3ef..87ae246d37 100644 --- a/hw/misc/macio/mac_dbdma.c +++ b/hw/misc/macio/mac_dbdma.c @@ -71,18 +71,19 @@ static DBDMAState *dbdma_from_ch(DBDMA_channel *ch) } =20 #if DEBUG_DBDMA -static void dump_dbdma_cmd(dbdma_cmd *cmd) +static void dump_dbdma_cmd(DBDMA_channel *ch, dbdma_cmd *cmd) { - printf("dbdma_cmd %p\n", cmd); - printf(" req_count 0x%04x\n", le16_to_cpu(cmd->req_count)); - printf(" command 0x%04x\n", le16_to_cpu(cmd->command)); - printf(" phy_addr 0x%08x\n", le32_to_cpu(cmd->phy_addr)); - printf(" cmd_dep 0x%08x\n", le32_to_cpu(cmd->cmd_dep)); - printf(" res_count 0x%04x\n", le16_to_cpu(cmd->res_count)); - printf(" xfer_status 0x%04x\n", le16_to_cpu(cmd->xfer_status)); + DBDMA_DPRINTFCH(ch, "dbdma_cmd %p\n", cmd); + DBDMA_DPRINTFCH(ch, " req_count 0x%04x\n", le16_to_cpu(cmd->req_cou= nt)); + DBDMA_DPRINTFCH(ch, " command 0x%04x\n", le16_to_cpu(cmd->command)); + DBDMA_DPRINTFCH(ch, " phy_addr 0x%08x\n", le32_to_cpu(cmd->phy_addr= )); + DBDMA_DPRINTFCH(ch, " cmd_dep 0x%08x\n", le32_to_cpu(cmd->cmd_dep)); + DBDMA_DPRINTFCH(ch, " res_count 0x%04x\n", le16_to_cpu(cmd->res_cou= nt)); + DBDMA_DPRINTFCH(ch, " xfer_status 0x%04x\n", + le16_to_cpu(cmd->xfer_status)); } #else -static void dump_dbdma_cmd(dbdma_cmd *cmd) +static void dump_dbdma_cmd(DBDMA_channel *ch, dbdma_cmd *cmd) { } #endif @@ -448,7 +449,7 @@ static void channel_run(DBDMA_channel *ch) uint32_t phy_addr; =20 DBDMA_DPRINTFCH(ch, "channel_run\n"); - dump_dbdma_cmd(current); + dump_dbdma_cmd(ch, current); =20 /* clear WAKE flag at command fetch */ =20 --=20 2.17.1 From nobody Fri May 3 11:38:50 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.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 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1529665079991639.9127104837918; Fri, 22 Jun 2018 03:57:59 -0700 (PDT) Received: from localhost ([::1]:60801 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJlN-00016i-Ac for importer@patchew.org; Fri, 22 Jun 2018 06:57:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45923) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fWJPz-0000oF-KN for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fWJPx-0003XE-E9 for qemu-devel@nongnu.org; Fri, 22 Jun 2018 06:35:51 -0400 Received: from ozlabs.org ([203.11.71.1]:57401) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fWJPw-0003VG-U9; Fri, 22 Jun 2018 06:35:49 -0400 Received: by ozlabs.org (Postfix, from userid 1007) id 41Bw2L12fQz9sBj; Fri, 22 Jun 2018 20:35:35 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gibson.dropbear.id.au; s=201602; t=1529663738; bh=P/kr59FPH5rB6ywxNXcevVlGV+feZLLJV+bnC51zdVA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=D7zFTVYsYzoPQJRHOVOd2/mMoSILu99zSI3mIp+CQ2gRStXq8Ar4vwbeK2i838h0n kXDy403U/92Ly0UFIZw9iJTvMBh858NMzHQnZ36uDHvA18VXL2UFCEj48BXpgfXJw+ kWgHyWEi2BaAjwQUDwER2pPE1g1mIDiGS82Sc0t4= From: David Gibson To: peter.maydell@linaro.org Date: Fri, 22 Jun 2018 20:35:28 +1000 Message-Id: <20180622103528.28598-26-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180622103528.28598-1-david@gibson.dropbear.id.au> References: <20180622103528.28598-1-david@gibson.dropbear.id.au> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 203.11.71.1 Subject: [Qemu-devel] [PULL 25/25] mac_newworld: always enable disable_direct_reg3_writes for ADB machines 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, aik@ozlabs.ru, Mark Cave-Ayland , qemu-devel@nongnu.org, agraf@suse.de, 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) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Mark Cave-Ayland Commit 84051eb400 "adb: add property to disable direct reg 3 writes" added a workaround for MacOS 9 incorrectly setting the mouse address during boot of PMU machines. Further testing has shown that since fb6649f172 "adb: fix read reg 3 byte ordering" this can still sometimes happen with the CUDA mac99 machine, so let's enable this workaround for all New World machines using ADB for no= w. Signed-off-by: Mark Cave-Ayland 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 ff715ffffd..2b13fcdde5 100644 --- a/hw/ppc/mac_newworld.c +++ b/hw/ppc/mac_newworld.c @@ -407,11 +407,11 @@ static void ppc_core99_init(MachineState *machine) =20 adb_bus =3D qdev_get_child_bus(dev, "adb.0"); dev =3D qdev_create(adb_bus, TYPE_ADB_KEYBOARD); - qdev_prop_set_bit(dev, "disable-direct-reg3-writes", has_pmu); + qdev_prop_set_bit(dev, "disable-direct-reg3-writes", true); qdev_init_nofail(dev); =20 dev =3D qdev_create(adb_bus, TYPE_ADB_MOUSE); - qdev_prop_set_bit(dev, "disable-direct-reg3-writes", has_pmu); + qdev_prop_set_bit(dev, "disable-direct-reg3-writes", true); qdev_init_nofail(dev); } =20 --=20 2.17.1