From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567633375; cv=none; d=zoho.com; s=zohoarc; b=DjPMx8MmB7VVoffx+EWNABY1rv8Silr2qzwscFCf6HiufMzkznknlPDe8kL/zASrAbivWfD75Z2t1LGbqqotpP9GbNZdEBfIdcA1/0lS324Vg2JeUWeLcNGWp5FUQz6xaMrXx1h8Av2UslJVOMLqwNRS16HlCV6Tuj1ozw9vj2E= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567633375; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=HQtnWNrP8D72LbEgXfy17eyXRyD3NwnFC8A9XXKTA4A=; b=Bes91Djpx8JwD78HRd5FmA4CjsNVCs1VTYIThprjHQRvzlH2rlXIsITEllbxzBidgnjfzNqyQPZ+mgYyw1+4fmlJlGnvwsN+ZXZsaR1L8U1J84Y734ddJaGlvKiZA4hcv5RTpWLuVG9dNEXUDFM1A5FbOW+kwU+87SzCo0CSanQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567633375204639.8169084807203; Wed, 4 Sep 2019 14:42:55 -0700 (PDT) Received: from localhost ([::1]:40424 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5d3F-0001hm-7b for importer@patchew.org; Wed, 04 Sep 2019 17:42:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53295) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cBZ-00089y-HB for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cBU-0000iH-W6 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:23 -0400 Received: from 1.mo177.mail-out.ovh.net ([178.33.107.143]:56754) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cBU-0000hf-IK for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:20 -0400 Received: from player691.ha.ovh.net (unknown [10.109.159.136]) by mo177.mail-out.ovh.net (Postfix) with ESMTP id 0EA751097C2 for ; Wed, 4 Sep 2019 22:47:18 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 405CB98B27AC; Wed, 4 Sep 2019 20:47:12 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:45 +0200 Message-Id: <20190904204659.13878-2-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2510193846439807761 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 178.33.107.143 Subject: [Qemu-devel] [RFC PATCH 01/15] hw: aspeed_scu: Add AST2600 support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Joel Stanley AST2600 has extra registers. Increase the number of regs of the model and introduce a new field in the class to customize the MemoryRegion operations depending on the SoC model. Signed-off-by: Joel Stanley [clg: - improved commit log ] - reworked mode integration into new objet class ] Signed-off-by: C=C3=A9dric Le Goater --- include/hw/misc/aspeed_scu.h | 7 +- hw/misc/aspeed_scu.c | 184 ++++++++++++++++++++++++++++++++++- 2 files changed, 185 insertions(+), 6 deletions(-) diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h index 239e94fe2c47..1d7f7ffc1598 100644 --- a/include/hw/misc/aspeed_scu.h +++ b/include/hw/misc/aspeed_scu.h @@ -17,8 +17,10 @@ #define ASPEED_SCU(obj) OBJECT_CHECK(AspeedSCUState, (obj), TYPE_ASPEED_SC= U) #define TYPE_ASPEED_2400_SCU TYPE_ASPEED_SCU "-ast2400" #define TYPE_ASPEED_2500_SCU TYPE_ASPEED_SCU "-ast2500" +#define TYPE_ASPEED_2600_SCU TYPE_ASPEED_SCU "-ast2600" =20 #define ASPEED_SCU_NR_REGS (0x1A8 >> 2) +#define ASPEED_AST2600_SCU_NR_REGS (0xE20 >> 2) =20 typedef struct AspeedSCUState { /*< private >*/ @@ -27,7 +29,7 @@ typedef struct AspeedSCUState { /*< public >*/ MemoryRegion iomem; =20 - uint32_t regs[ASPEED_SCU_NR_REGS]; + uint32_t regs[ASPEED_AST2600_SCU_NR_REGS]; uint32_t silicon_rev; uint32_t hw_strap1; uint32_t hw_strap2; @@ -38,6 +40,7 @@ typedef struct AspeedSCUState { #define AST2400_A1_SILICON_REV 0x02010303U #define AST2500_A0_SILICON_REV 0x04000303U #define AST2500_A1_SILICON_REV 0x04010303U +#define AST2600_A0_SILICON_REV 0x05000303U =20 #define ASPEED_IS_AST2500(si_rev) ((((si_rev) >> 24) & 0xff) =3D=3D 0x= 04) =20 @@ -54,6 +57,8 @@ typedef struct AspeedSCUClass { const uint32_t *resets; uint32_t (*calc_hpll)(AspeedSCUState *s, uint32_t hpll_reg); uint32_t apb_divider; + uint32_t nr_regs; + const MemoryRegionOps *ops; } AspeedSCUClass; =20 #define ASPEED_SCU_PROT_KEY 0x1688A8A8 diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c index 620b25c20476..4190adab8220 100644 --- a/hw/misc/aspeed_scu.c +++ b/hw/misc/aspeed_scu.c @@ -88,6 +88,33 @@ #define BMC_REV TO_REG(0x19C) #define BMC_DEV_ID TO_REG(0x1A4) =20 +#define AST2600_PROT_KEY TO_REG(0x00) +#define AST2600_SILICON_REV TO_REG(0x04) +#define AST2600_SILICON_REV2 TO_REG(0x14) +#define AST2600_SYS_RST_CTRL TO_REG(0x40) +#define AST2600_SYS_RST_CTRL_CLR TO_REG(0x44) +#define AST2600_SYS_RST_CTRL2 TO_REG(0x50) +#define AST2600_SYS_RST_CTRL2_CLR TO_REG(0x54) +#define AST2600_CLK_STOP_CTRL TO_REG(0x80) +#define AST2600_CLK_STOP_CTRL_CLR TO_REG(0x84) +#define AST2600_CLK_STOP_CTRL2 TO_REG(0x90) +#define AST2600_CLK_STOP_CTR2L_CLR TO_REG(0x94) +#define AST2600_MPLL_EXT TO_REG(0x224) +#define AST2600_EPLL_EXT TO_REG(0x244) +#define AST2600_CLK_SEL TO_REG(0x300) +#define AST2600_CLK_SEL2 TO_REG(0x304) +#define AST2600_CLK_SEL3 TO_REG(0x310) +#define AST2600_HW_STRAP1 TO_REG(0x500) +#define AST2600_HW_STRAP1_CLR TO_REG(0x504) +#define AST2600_HW_STRAP1_PROT TO_REG(0x508) +#define AST2600_HW_STRAP2 TO_REG(0x510) +#define AST2600_HW_STRAP2_CLR TO_REG(0x514) +#define AST2600_HW_STRAP2_PROT TO_REG(0x518) +#define AST2600_RNG_CTRL TO_REG(0x524) +#define AST2600_RNG_DATA TO_REG(0x540) + +#define AST2600_CLK TO_REG(0x40) + #define SCU_IO_REGION_SIZE 0x1000 =20 static const uint32_t ast2400_a0_resets[ASPEED_SCU_NR_REGS] =3D { @@ -178,7 +205,7 @@ static uint64_t aspeed_scu_read(void *opaque, hwaddr of= fset, unsigned size) AspeedSCUState *s =3D ASPEED_SCU(opaque); int reg =3D TO_REG(offset); =20 - if (reg >=3D ARRAY_SIZE(s->regs)) { + if (reg >=3D ASPEED_SCU_NR_REGS) { qemu_log_mask(LOG_GUEST_ERROR, "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "= \n", __func__, offset); @@ -208,7 +235,7 @@ static void aspeed_scu_write(void *opaque, hwaddr offse= t, uint64_t data, AspeedSCUState *s =3D ASPEED_SCU(opaque); int reg =3D TO_REG(offset); =20 - if (reg >=3D ARRAY_SIZE(s->regs)) { + if (reg >=3D ASPEED_SCU_NR_REGS) { qemu_log_mask(LOG_GUEST_ERROR, "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx = "\n", __func__, offset); @@ -346,7 +373,7 @@ static void aspeed_scu_reset(DeviceState *dev) AspeedSCUState *s =3D ASPEED_SCU(dev); AspeedSCUClass *asc =3D ASPEED_SCU_GET_CLASS(dev); =20 - memcpy(s->regs, asc->resets, sizeof(s->regs)); + memcpy(s->regs, asc->resets, asc->nr_regs * 4); s->regs[SILICON_REV] =3D s->silicon_rev; s->regs[HW_STRAP1] =3D s->hw_strap1; s->regs[HW_STRAP2] =3D s->hw_strap2; @@ -358,6 +385,7 @@ static uint32_t aspeed_silicon_revs[] =3D { AST2400_A1_SILICON_REV, AST2500_A0_SILICON_REV, AST2500_A1_SILICON_REV, + AST2600_A0_SILICON_REV, }; =20 bool is_supported_silicon_rev(uint32_t silicon_rev) @@ -377,6 +405,7 @@ static void aspeed_scu_realize(DeviceState *dev, Error = **errp) { SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); AspeedSCUState *s =3D ASPEED_SCU(dev); + AspeedSCUClass *asc =3D ASPEED_SCU_GET_CLASS(dev); =20 if (!is_supported_silicon_rev(s->silicon_rev)) { error_setg(errp, "Unknown silicon revision: 0x%" PRIx32, @@ -384,7 +413,7 @@ static void aspeed_scu_realize(DeviceState *dev, Error = **errp) return; } =20 - memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_scu_ops, s, + memory_region_init_io(&s->iomem, OBJECT(s), asc->ops, s, TYPE_ASPEED_SCU, SCU_IO_REGION_SIZE); =20 sysbus_init_mmio(sbd, &s->iomem); @@ -395,7 +424,7 @@ static const VMStateDescription vmstate_aspeed_scu =3D { .version_id =3D 1, .minimum_version_id =3D 1, .fields =3D (VMStateField[]) { - VMSTATE_UINT32_ARRAY(regs, AspeedSCUState, ASPEED_SCU_NR_REGS), + VMSTATE_UINT32_ARRAY(regs, AspeedSCUState, ASPEED_AST2600_SCU_NR_R= EGS), VMSTATE_END_OF_LIST() } }; @@ -436,6 +465,8 @@ static void aspeed_2400_scu_class_init(ObjectClass *kla= ss, void *data) asc->resets =3D ast2400_a0_resets; asc->calc_hpll =3D aspeed_2400_scu_calc_hpll; asc->apb_divider =3D 2; + asc->nr_regs =3D ASPEED_SCU_NR_REGS; + asc->ops =3D &aspeed_scu_ops; } =20 static const TypeInfo aspeed_2400_scu_info =3D { @@ -454,6 +485,8 @@ static void aspeed_2500_scu_class_init(ObjectClass *kla= ss, void *data) asc->resets =3D ast2500_a1_resets; asc->calc_hpll =3D aspeed_2500_scu_calc_hpll; asc->apb_divider =3D 4; + asc->nr_regs =3D ASPEED_SCU_NR_REGS; + asc->ops =3D &aspeed_scu_ops; } =20 static const TypeInfo aspeed_2500_scu_info =3D { @@ -463,11 +496,152 @@ static const TypeInfo aspeed_2500_scu_info =3D { .class_init =3D aspeed_2500_scu_class_init, }; =20 +static uint64_t aspeed_ast2600_scu_read(void *opaque, hwaddr offset, + unsigned size) +{ + AspeedSCUState *s =3D ASPEED_SCU(opaque); + int reg =3D TO_REG(offset); + + if (reg >=3D ASPEED_AST2600_SCU_NR_REGS) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "= \n", + __func__, offset); + return 0; + } + + switch (reg) { + case AST2600_EPLL_EXT: + case AST2600_MPLL_EXT: + /* PLLs are always "locked" */ + return s->regs[reg] | BIT(31); + case AST2600_RNG_DATA: + /* + * On hardware, RNG_DATA works regardless of the state of the + * enable bit in RNG_CTRL + * + * TODO: Check this is true for ast2600 + */ + s->regs[AST2600_RNG_DATA] =3D aspeed_scu_get_random(); + break; + } + + return s->regs[reg]; +} + +static void aspeed_ast2600_scu_write(void *opaque, hwaddr offset, uint64_t= data, + unsigned size) +{ + AspeedSCUState *s =3D ASPEED_SCU(opaque); + int reg =3D TO_REG(offset); + + if (reg >=3D ASPEED_AST2600_SCU_NR_REGS) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx = "\n", + __func__, offset); + return; + } + + if (reg > PROT_KEY && !s->regs[PROT_KEY]) { + qemu_log_mask(LOG_GUEST_ERROR, "%s: SCU is locked!\n", __func__); + } + + trace_aspeed_scu_write(offset, size, data); + + switch (reg) { + case AST2600_PROT_KEY: + s->regs[reg] =3D (data =3D=3D ASPEED_SCU_PROT_KEY) ? 1 : 0; + return; + case AST2600_HW_STRAP1: + case AST2600_HW_STRAP2: + if (s->regs[reg + 2]) { + return; + } + /* fall through */ + case AST2600_SYS_RST_CTRL: + case AST2600_SYS_RST_CTRL2: + /* W1S (Write 1 to set) registers */ + s->regs[reg] |=3D data; + return; + case AST2600_SYS_RST_CTRL_CLR: + case AST2600_SYS_RST_CTRL2_CLR: + case AST2600_HW_STRAP1_CLR: + case AST2600_HW_STRAP2_CLR: + /* W1C (Write 1 to clear) registers */ + s->regs[reg] &=3D ~data; + return; + + case AST2600_RNG_DATA: + case AST2600_SILICON_REV: + case AST2600_SILICON_REV2: + /* Add read only registers here */ + qemu_log_mask(LOG_GUEST_ERROR, + "%s: Write to read-only offset 0x%" HWADDR_PRIx "\n", + __func__, offset); + return; + } + + s->regs[reg] =3D data; +} + +static const MemoryRegionOps aspeed_ast2600_scu_ops =3D { + .read =3D aspeed_ast2600_scu_read, + .write =3D aspeed_ast2600_scu_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, + .valid.unaligned =3D false, +}; + +static const uint32_t ast2600_a0_resets[ASPEED_AST2600_SCU_NR_REGS] =3D { + [AST2600_SILICON_REV] =3D AST2600_SILICON_REV, + [AST2600_SILICON_REV2] =3D AST2600_SILICON_REV, + [AST2600_SYS_RST_CTRL] =3D 0xF7CFFEDC | 0x100, + [AST2600_SYS_RST_CTRL2] =3D 0xFFFFFFFC, + [AST2600_CLK_STOP_CTRL] =3D 0xEFF43E8B, + [AST2600_CLK_STOP_CTRL2] =3D 0xFFF0FFF0, +}; + +static void aspeed_ast2600_scu_reset(DeviceState *dev) +{ + AspeedSCUState *s =3D ASPEED_SCU(dev); + AspeedSCUClass *asc =3D ASPEED_SCU_GET_CLASS(dev); + + memcpy(s->regs, asc->resets, asc->nr_regs * 4); + + s->regs[AST2600_SILICON_REV] =3D s->silicon_rev; + s->regs[AST2600_SILICON_REV2] =3D s->silicon_rev; + s->regs[AST2600_HW_STRAP1] =3D s->hw_strap1; + s->regs[AST2600_HW_STRAP2] =3D s->hw_strap2; + s->regs[PROT_KEY] =3D s->hw_prot_key; +} + +static void aspeed_2600_scu_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSCUClass *asc =3D ASPEED_SCU_CLASS(klass); + + dc->desc =3D "ASPEED 2600 System Control Unit"; + dc->reset =3D aspeed_ast2600_scu_reset; + asc->resets =3D ast2600_a0_resets; + asc->calc_hpll =3D aspeed_2500_scu_calc_hpll; + asc->apb_divider =3D 4; + asc->nr_regs =3D ASPEED_AST2600_SCU_NR_REGS; + asc->ops =3D &aspeed_ast2600_scu_ops; +} + +static const TypeInfo aspeed_2600_scu_info =3D { + .name =3D TYPE_ASPEED_2600_SCU, + .parent =3D TYPE_ASPEED_SCU, + .instance_size =3D sizeof(AspeedSCUState), + .class_init =3D aspeed_2600_scu_class_init, +}; + static void aspeed_scu_register_types(void) { type_register_static(&aspeed_scu_info); type_register_static(&aspeed_2400_scu_info); type_register_static(&aspeed_2500_scu_info); + type_register_static(&aspeed_2600_scu_info); } =20 type_init(aspeed_scu_register_types); --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567632410; cv=none; d=zoho.com; s=zohoarc; b=ncNstJvD2Ev4XonKA+y58bIsZ9v7TSE/upe93Qo4JCxF22NP/EiqIe29qfERMX7KeYaJPPwLdHjewIW2r5mFm2fCsD2W777B6aHIhjXZJZAsOvV6grvrKiQshxomW5VJbSnvdX14XK4erBOX6NSHEMnxWbo+iTbEzC4b+LAh/aw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567632410; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=gqqZjn9YQ2Qn5K/MpM9mhWTeohCnMWIgP1AqQG9tV2M=; b=Fzm8+GJp37WgkJE3MRG/sp0plY7AiGj03V6XgdhyPn2VNxSHKvpA92iaM/ztF1Fobx5BX3+Oxs0M/TZyzrobzCc+6MK42s2STc6JU8eaxg+UrND7uLTuO5lFnUDHahMEYAzXsLN2QMRDxeTgFytmIOEXb8ATK9jRGFq3HJqzukA= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567632410321210.7059585913529; Wed, 4 Sep 2019 14:26:50 -0700 (PDT) Received: from localhost ([::1]:40152 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cng-0000Dm-MT for importer@patchew.org; Wed, 04 Sep 2019 17:26:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53322) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cBd-0008EJ-53 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cBb-0000lS-KF for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:29 -0400 Received: from 15.mo6.mail-out.ovh.net ([188.165.39.161]:56049) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cBb-0000kY-Cx for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:27 -0400 Received: from player691.ha.ovh.net (unknown [10.109.143.246]) by mo6.mail-out.ovh.net (Postfix) with ESMTP id A5AE71DE909 for ; Wed, 4 Sep 2019 22:47:25 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id E83EE98B27DC; Wed, 4 Sep 2019 20:47:18 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:46 +0200 Message-Id: <20190904204659.13878-3-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2512164171111303953 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 188.165.39.161 Subject: [Qemu-devel] [RFC PATCH 02/15] aspeed/timer: Introduce an object class per SoC X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" It prepares ground for register differences between SoCs. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/timer/aspeed_timer.h | 15 +++++ hw/arm/aspeed_soc.c | 3 +- hw/timer/aspeed_timer.c | 107 ++++++++++++++++++++++++++++---- 3 files changed, 113 insertions(+), 12 deletions(-) diff --git a/include/hw/timer/aspeed_timer.h b/include/hw/timer/aspeed_time= r.h index 1fb949e16710..a791fee276f4 100644 --- a/include/hw/timer/aspeed_timer.h +++ b/include/hw/timer/aspeed_timer.h @@ -28,6 +28,9 @@ #define ASPEED_TIMER(obj) \ OBJECT_CHECK(AspeedTimerCtrlState, (obj), TYPE_ASPEED_TIMER); #define TYPE_ASPEED_TIMER "aspeed.timer" +#define TYPE_ASPEED_2400_TIMER TYPE_ASPEED_TIMER "-ast2400" +#define TYPE_ASPEED_2500_TIMER TYPE_ASPEED_TIMER "-ast2500" + #define ASPEED_TIMER_NR_TIMERS 8 =20 typedef struct AspeedTimer { @@ -60,4 +63,16 @@ typedef struct AspeedTimerCtrlState { AspeedSCUState *scu; } AspeedTimerCtrlState; =20 +#define ASPEED_TIMER_CLASS(klass) \ + OBJECT_CLASS_CHECK(AspeedTimerClass, (klass), TYPE_ASPEED_TIMER) +#define ASPEED_TIMER_GET_CLASS(obj) \ + OBJECT_GET_CLASS(AspeedTimerClass, (obj), TYPE_ASPEED_TIMER) + +typedef struct AspeedTimerClass { + SysBusDeviceClass parent_class; + + uint64_t (*read)(AspeedTimerCtrlState *s, hwaddr offset); + void (*write)(AspeedTimerCtrlState *s, hwaddr offset, uint64_t value); +} AspeedTimerClass; + #endif /* ASPEED_TIMER_H */ diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index c3821a562733..26e03486f9b7 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -182,8 +182,9 @@ static void aspeed_soc_init(Object *obj) sysbus_init_child_obj(obj, "rtc", OBJECT(&s->rtc), sizeof(s->rtc), TYPE_ASPEED_RTC); =20 + snprintf(typename, sizeof(typename), "aspeed.timer-%s", socname); sysbus_init_child_obj(obj, "timerctrl", OBJECT(&s->timerctrl), - sizeof(s->timerctrl), TYPE_ASPEED_TIMER); + sizeof(s->timerctrl), typename); object_property_add_const_link(OBJECT(&s->timerctrl), "scu", OBJECT(&s->scu), &error_abort); =20 diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c index 2bda826882d9..c78bc1bd2d25 100644 --- a/hw/timer/aspeed_timer.c +++ b/hw/timer/aspeed_timer.c @@ -253,13 +253,8 @@ static uint64_t aspeed_timer_read(void *opaque, hwaddr= offset, unsigned size) case 0x40 ... 0x8c: /* Timers 5 - 8 */ value =3D aspeed_timer_get_value(&s->timers[(offset >> 4) - 1], re= g); break; - /* Illegal */ - case 0x38: - case 0x3C: default: - qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", - __func__, offset); - value =3D 0; + value =3D ASPEED_TIMER_GET_CLASS(s)->read(s, offset); break; } trace_aspeed_timer_read(offset, size, value); @@ -453,12 +448,8 @@ static void aspeed_timer_write(void *opaque, hwaddr of= fset, uint64_t value, case 0x40 ... 0x8c: aspeed_timer_set_value(s, (offset >> TIMER_NR_REGS) - 1, reg, tv); break; - /* Illegal */ - case 0x38: - case 0x3C: default: - qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", - __func__, offset); + ASPEED_TIMER_GET_CLASS(s)->write(s, offset, value); break; } } @@ -472,6 +463,64 @@ static const MemoryRegionOps aspeed_timer_ops =3D { .valid.unaligned =3D false, }; =20 +static uint64_t aspeed_2400_timer_read(AspeedTimerCtrlState *s, hwaddr off= set) +{ + uint64_t value; + + switch (offset) { + case 0x38: + case 0x3C: + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", + __func__, offset); + value =3D 0; + break; + } + return value; +} + +static void aspeed_2400_timer_write(AspeedTimerCtrlState *s, hwaddr offset, + uint64_t value) +{ + switch (offset) { + case 0x38: + case 0x3C: + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", + __func__, offset); + break; + } +} + +static uint64_t aspeed_2500_timer_read(AspeedTimerCtrlState *s, hwaddr off= set) +{ + uint64_t value; + + switch (offset) { + case 0x38: + case 0x3C: + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", + __func__, offset); + value =3D 0; + break; + } + return value; +} + +static void aspeed_2500_timer_write(AspeedTimerCtrlState *s, hwaddr offset, + uint64_t value) +{ + switch (offset) { + case 0x38: + case 0x3C: + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", + __func__, offset); + break; + } +} + static void aspeed_init_one_timer(AspeedTimerCtrlState *s, uint8_t id) { AspeedTimer *t =3D &s->timers[id]; @@ -570,11 +619,47 @@ static const TypeInfo aspeed_timer_info =3D { .parent =3D TYPE_SYS_BUS_DEVICE, .instance_size =3D sizeof(AspeedTimerCtrlState), .class_init =3D timer_class_init, + .class_size =3D sizeof(AspeedTimerClass), + .abstract =3D true, +}; + +static void aspeed_2400_timer_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedTimerClass *awc =3D ASPEED_TIMER_CLASS(klass); + + dc->desc =3D "ASPEED 2400 Timer"; + awc->read =3D aspeed_2400_timer_read; + awc->write =3D aspeed_2400_timer_write; +} + +static const TypeInfo aspeed_2400_timer_info =3D { + .name =3D TYPE_ASPEED_2400_TIMER, + .parent =3D TYPE_ASPEED_TIMER, + .class_init =3D aspeed_2400_timer_class_init, +}; + +static void aspeed_2500_timer_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedTimerClass *awc =3D ASPEED_TIMER_CLASS(klass); + + dc->desc =3D "ASPEED 2500 Timer"; + awc->read =3D aspeed_2500_timer_read; + awc->write =3D aspeed_2500_timer_write; +} + +static const TypeInfo aspeed_2500_timer_info =3D { + .name =3D TYPE_ASPEED_2500_TIMER, + .parent =3D TYPE_ASPEED_TIMER, + .class_init =3D aspeed_2500_timer_class_init, }; =20 static void aspeed_timer_register_types(void) { type_register_static(&aspeed_timer_info); + type_register_static(&aspeed_2400_timer_info); + type_register_static(&aspeed_2500_timer_info); } =20 type_init(aspeed_timer_register_types) --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567632593; cv=none; d=zoho.com; s=zohoarc; b=ngkx9lCjkixjx/5DSOvGiThf86d70Ms66NJFj7BxKjGojQhyDU5o+4y9jZv9KeEnUsQjXIoOI9V5yUTcG4EGS8ZypJmGF0QhZkpCVVe6Gj37JVvQOw86kqmftitkimYtxRGg6VYveFxbz+An0W7D3Sm2i5TNXQvjjPY8p1+lZhI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567632593; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=8KJnY2++RFxrp0v6CSeygKQ70Fv7FDt+DJT2VlKCOi8=; b=idtg8h+4q6lPeDNimeG8eGeahE1h/JHgZMyaUWRIOXGclDaHmv0ERl4O3pOq/rUh1VeCDK3+rnmTQ/vJdqSWLXkqFSCR/4ZtahD+nEsl/hs+VIZLiNZPUdgJ9b7p8bBvBhOS4Lbq1opFQE+e2SUWg4a8B0ZfKq7aut2WL0ZslHw= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567632593419787.6244033465463; Wed, 4 Sep 2019 14:29:53 -0700 (PDT) Received: from localhost ([::1]:40208 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cqd-0003nS-Nh for importer@patchew.org; Wed, 04 Sep 2019 17:29:51 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53347) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cBj-0008ND-63 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cBh-0000q3-Tg for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:35 -0400 Received: from 3.mo7.mail-out.ovh.net ([46.105.34.113]:59746) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cBh-0000ow-M9 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:33 -0400 Received: from player691.ha.ovh.net (unknown [10.109.160.230]) by mo7.mail-out.ovh.net (Postfix) with ESMTP id 30EC31305D1 for ; Wed, 4 Sep 2019 22:47:32 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 763CD98B27EF; Wed, 4 Sep 2019 20:47:25 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:47 +0200 Message-Id: <20190904204659.13878-4-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2513853021181676305 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.105.34.113 Subject: [Qemu-devel] [RFC PATCH 03/15] aspeed/timer: Add support for control register 3 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The AST2500 timer has a third control register that is used to implement a set-to-clear feature for the main control register. This models the behaviour expected by the AST2500 while maintaining the same behaviour for the AST2400. Based on previous work from Joel Stanley. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/timer/aspeed_timer.h | 1 + hw/timer/aspeed_timer.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/hw/timer/aspeed_timer.h b/include/hw/timer/aspeed_time= r.h index a791fee276f4..1e0288ebc49f 100644 --- a/include/hw/timer/aspeed_timer.h +++ b/include/hw/timer/aspeed_timer.h @@ -58,6 +58,7 @@ typedef struct AspeedTimerCtrlState { =20 uint32_t ctrl; uint32_t ctrl2; + uint32_t ctrl3; AspeedTimer timers[ASPEED_TIMER_NR_TIMERS]; =20 AspeedSCUState *scu; diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c index c78bc1bd2d25..d70e78a0293e 100644 --- a/hw/timer/aspeed_timer.c +++ b/hw/timer/aspeed_timer.c @@ -498,6 +498,8 @@ static uint64_t aspeed_2500_timer_read(AspeedTimerCtrlS= tate *s, hwaddr offset) =20 switch (offset) { case 0x38: + value =3D s->ctrl3 & BIT(0); + break; case 0x3C: default: qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", @@ -511,9 +513,24 @@ static uint64_t aspeed_2500_timer_read(AspeedTimerCtrl= State *s, hwaddr offset) static void aspeed_2500_timer_write(AspeedTimerCtrlState *s, hwaddr offset, uint64_t value) { + const uint32_t tv =3D (uint32_t)(value & 0xFFFFFFFF); + uint8_t command; + switch (offset) { case 0x38: + command =3D (value >> 1) & 0xFF; + if (command =3D=3D 0xAE) { + s->ctrl3 =3D 0x1; + } else if (command =3D=3D 0xEA) { + s->ctrl3 =3D 0x0; + } + break; case 0x3C: + if (s->ctrl3 & BIT(0)) { + aspeed_timer_set_ctrl(s, s->ctrl & ~tv); + } + break; + default: qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", __func__, offset); @@ -574,6 +591,7 @@ static void aspeed_timer_reset(DeviceState *dev) } s->ctrl =3D 0; s->ctrl2 =3D 0; + s->ctrl3 =3D 0; } =20 static const VMStateDescription vmstate_aspeed_timer =3D { @@ -597,6 +615,7 @@ static const VMStateDescription vmstate_aspeed_timer_st= ate =3D { .fields =3D (VMStateField[]) { VMSTATE_UINT32(ctrl, AspeedTimerCtrlState), VMSTATE_UINT32(ctrl2, AspeedTimerCtrlState), + VMSTATE_UINT32(ctrl3, AspeedTimerCtrlState), VMSTATE_STRUCT_ARRAY(timers, AspeedTimerCtrlState, ASPEED_TIMER_NR_TIMERS, 1, vmstate_aspeed_tim= er, AspeedTimer), --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567633600; cv=none; d=zoho.com; s=zohoarc; b=ltfvjMKZHOo1tEqJwz6bpT5sT3L0fiiO3kth5uJu3VvMgh9wTKqTiRVLFgZ9PmgUU+WHCOulV+QFEYGm46NAd2LdV1FWaJvVYy1IQsyjH6eeZw0EMlCUbvkVJnKY5EHRVRR3b+NCpLW7Zw+dnhN9VZH1xPE13nR9r1Gq9PsMrJM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567633600; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=avmPL7sK4lGFPkjK267VEB1h7bzmgVSsQTljA+/FeJU=; b=IwWO5JaEsk5GOnG2Mb8nTo7ipowrZtALuGB2rwX6rDwocBoAkTkrViXEapPcu4Wy0JYhYUKlxeOGwV3AAYYvpseaQ5umCIyUnVmLhwnOTy483fbKVOTVzd7IqLbZ9WlfME6GsgE7UZbbtR+7jBmHViR6R5dvvRScBBK9YMdKSuY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567633600192339.05090163953196; Wed, 4 Sep 2019 14:46:40 -0700 (PDT) Received: from localhost ([::1]:40488 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5d6r-00067p-PX for importer@patchew.org; Wed, 04 Sep 2019 17:46:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53392) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cBr-00006Q-39 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cBp-00013h-CJ for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:42 -0400 Received: from 8.mo177.mail-out.ovh.net ([46.105.61.98]:43057) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cBp-0000z0-47 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:41 -0400 Received: from player691.ha.ovh.net (unknown [10.109.160.23]) by mo177.mail-out.ovh.net (Postfix) with ESMTP id 10CD21097D3 for ; Wed, 4 Sep 2019 22:47:39 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 0BF9698B2814; Wed, 4 Sep 2019 20:47:32 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:48 +0200 Message-Id: <20190904204659.13878-5-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2516104820903217937 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.105.61.98 Subject: [Qemu-devel] [RFC PATCH 04/15] aspeed/timer: Add support for AST2600 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The AST2600 timer has a third control register that is used to implement a set-to-clear feature for the main control register. On the AST2600, it is not configurable via 0x38 (control register 3) as it is on the AST2500. Based on previous work from Joel Stanley. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/timer/aspeed_timer.h | 1 + hw/timer/aspeed_timer.c | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/include/hw/timer/aspeed_timer.h b/include/hw/timer/aspeed_time= r.h index 1e0288ebc49f..69b1377af01e 100644 --- a/include/hw/timer/aspeed_timer.h +++ b/include/hw/timer/aspeed_timer.h @@ -30,6 +30,7 @@ #define TYPE_ASPEED_TIMER "aspeed.timer" #define TYPE_ASPEED_2400_TIMER TYPE_ASPEED_TIMER "-ast2400" #define TYPE_ASPEED_2500_TIMER TYPE_ASPEED_TIMER "-ast2500" +#define TYPE_ASPEED_2600_TIMER TYPE_ASPEED_TIMER "-ast2600" =20 #define ASPEED_TIMER_NR_TIMERS 8 =20 diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c index d70e78a0293e..7f73d0c75337 100644 --- a/hw/timer/aspeed_timer.c +++ b/hw/timer/aspeed_timer.c @@ -538,6 +538,40 @@ static void aspeed_2500_timer_write(AspeedTimerCtrlSta= te *s, hwaddr offset, } } =20 +static uint64_t aspeed_2600_timer_read(AspeedTimerCtrlState *s, hwaddr off= set) +{ + uint64_t value; + + switch (offset) { + case 0x38: + case 0x3C: + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", + __func__, offset); + value =3D 0; + break; + } + return value; +} + +static void aspeed_2600_timer_write(AspeedTimerCtrlState *s, hwaddr offset, + uint64_t value) +{ + const uint32_t tv =3D (uint32_t)(value & 0xFFFFFFFF); + + switch (offset) { + case 0x3C: + aspeed_timer_set_ctrl(s, s->ctrl & ~tv); + break; + + case 0x38: + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\= n", + __func__, offset); + break; + } +} + static void aspeed_init_one_timer(AspeedTimerCtrlState *s, uint8_t id) { AspeedTimer *t =3D &s->timers[id]; @@ -674,11 +708,28 @@ static const TypeInfo aspeed_2500_timer_info =3D { .class_init =3D aspeed_2500_timer_class_init, }; =20 +static void aspeed_2600_timer_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedTimerClass *awc =3D ASPEED_TIMER_CLASS(klass); + + dc->desc =3D "ASPEED 2600 Timer"; + awc->read =3D aspeed_2600_timer_read; + awc->write =3D aspeed_2600_timer_write; +} + +static const TypeInfo aspeed_2600_timer_info =3D { + .name =3D TYPE_ASPEED_2600_TIMER, + .parent =3D TYPE_ASPEED_TIMER, + .class_init =3D aspeed_2600_timer_class_init, +}; + static void aspeed_timer_register_types(void) { type_register_static(&aspeed_timer_info); type_register_static(&aspeed_2400_timer_info); type_register_static(&aspeed_2500_timer_info); + type_register_static(&aspeed_2600_timer_info); } =20 type_init(aspeed_timer_register_types) --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567633819; cv=none; d=zoho.com; s=zohoarc; b=b5Nx3GkVfbj6KetEMUMstF4CjJjuHclqxogeJ/Ke8CqYzCOT9cwnkCY9Rl+bMoq57jI8Yodw+R7JuzCbn9VQ0vsqmiUjq8JOIyRpfNonD8kVK+Ev4g5OW0cEm4hh3XSEn7AyTRgiv5zGLCsvopgkf3H4nsbLlC0Q6TDI6AslHLo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567633819; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=EI7xaN9I+u16ilCKXW1A5jVYOy9VpKRXgYyotyIjhAU=; b=MKmh5BUZJvGH+o9/ATg/O5A72CpO7iP0kSrhdkv3eXsc/EFDpr5L45vvurUQnTLvIGCjO8zsigJx+5lB9Mtc67CQfpkSvUmAw7yNLcjlJgHZDd2r2ezoWVeeJgDuioLnO6A5Aow1WJMq9DalKPlr5MHup1OSYjVE6eC3pjQlep4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567633819070242.52398038323986; Wed, 4 Sep 2019 14:50:19 -0700 (PDT) Received: from localhost ([::1]:40510 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5dAN-0000Q8-MW for importer@patchew.org; Wed, 04 Sep 2019 17:50:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53414) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cBw-0000EF-IB for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cBv-0001C5-53 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:48 -0400 Received: from 11.mo7.mail-out.ovh.net ([87.98.173.157]:52808) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cBu-0001Ap-SV for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:47 -0400 Received: from player691.ha.ovh.net (unknown [10.108.54.36]) by mo7.mail-out.ovh.net (Postfix) with ESMTP id 86560130AAC for ; Wed, 4 Sep 2019 22:47:45 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 1555398B282E; Wed, 4 Sep 2019 20:47:39 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:49 +0200 Message-Id: <20190904204659.13878-6-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2517793669831625489 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 87.98.173.157 Subject: [Qemu-devel] [RFC PATCH 05/15] aspeed/timer: Add support for IRQ status register on the AST2600 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The AST2600 timer replaces control register 2 with a interrupt status register. It is set by hardware when an IRQ occurs and cleared by software. Based on previous work from Joel Stanley. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/timer/aspeed_timer.h | 1 + hw/timer/aspeed_timer.c | 32 ++++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/include/hw/timer/aspeed_timer.h b/include/hw/timer/aspeed_time= r.h index 69b1377af01e..948329893c0b 100644 --- a/include/hw/timer/aspeed_timer.h +++ b/include/hw/timer/aspeed_timer.h @@ -60,6 +60,7 @@ typedef struct AspeedTimerCtrlState { uint32_t ctrl; uint32_t ctrl2; uint32_t ctrl3; + uint32_t irq_sts; AspeedTimer timers[ASPEED_TIMER_NR_TIMERS]; =20 AspeedSCUState *scu; diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c index 7f73d0c75337..dbf8143f0457 100644 --- a/hw/timer/aspeed_timer.c +++ b/hw/timer/aspeed_timer.c @@ -160,7 +160,9 @@ static uint64_t calculate_next(struct AspeedTimer *t) timer_del(&t->timer); =20 if (timer_overflow_interrupt(t)) { + AspeedTimerCtrlState *s =3D timer_to_ctrl(t); t->level =3D !t->level; + s->irq_sts |=3D BIT(t->id); qemu_set_irq(t->irq, t->level); } =20 @@ -199,7 +201,9 @@ static void aspeed_timer_expire(void *opaque) } =20 if (interrupt) { + AspeedTimerCtrlState *s =3D timer_to_ctrl(t); t->level =3D !t->level; + s->irq_sts |=3D BIT(t->id); qemu_set_irq(t->irq, t->level); } =20 @@ -244,9 +248,6 @@ static uint64_t aspeed_timer_read(void *opaque, hwaddr = offset, unsigned size) case 0x30: /* Control Register */ value =3D s->ctrl; break; - case 0x34: /* Control Register 2 */ - value =3D s->ctrl2; - break; case 0x00 ... 0x2c: /* Timers 1 - 4 */ value =3D aspeed_timer_get_value(&s->timers[(offset >> 4)], reg); break; @@ -438,9 +439,6 @@ static void aspeed_timer_write(void *opaque, hwaddr off= set, uint64_t value, case 0x30: aspeed_timer_set_ctrl(s, tv); break; - case 0x34: - aspeed_timer_set_ctrl2(s, tv); - break; /* Timer Registers */ case 0x00 ... 0x2c: aspeed_timer_set_value(s, (offset >> TIMER_NR_REGS), reg, tv); @@ -468,6 +466,9 @@ static uint64_t aspeed_2400_timer_read(AspeedTimerCtrlS= tate *s, hwaddr offset) uint64_t value; =20 switch (offset) { + case 0x34: + value =3D s->ctrl2; + break; case 0x38: case 0x3C: default: @@ -482,7 +483,12 @@ static uint64_t aspeed_2400_timer_read(AspeedTimerCtrl= State *s, hwaddr offset) static void aspeed_2400_timer_write(AspeedTimerCtrlState *s, hwaddr offset, uint64_t value) { + const uint32_t tv =3D (uint32_t)(value & 0xFFFFFFFF); + switch (offset) { + case 0x34: + aspeed_timer_set_ctrl2(s, tv); + break; case 0x38: case 0x3C: default: @@ -497,6 +503,9 @@ static uint64_t aspeed_2500_timer_read(AspeedTimerCtrlS= tate *s, hwaddr offset) uint64_t value; =20 switch (offset) { + case 0x34: + value =3D s->ctrl2; + break; case 0x38: value =3D s->ctrl3 & BIT(0); break; @@ -517,6 +526,9 @@ static void aspeed_2500_timer_write(AspeedTimerCtrlStat= e *s, hwaddr offset, uint8_t command; =20 switch (offset) { + case 0x34: + aspeed_timer_set_ctrl2(s, tv); + break; case 0x38: command =3D (value >> 1) & 0xFF; if (command =3D=3D 0xAE) { @@ -543,6 +555,9 @@ static uint64_t aspeed_2600_timer_read(AspeedTimerCtrlS= tate *s, hwaddr offset) uint64_t value; =20 switch (offset) { + case 0x34: + value =3D s->irq_sts; + break; case 0x38: case 0x3C: default: @@ -560,6 +575,9 @@ static void aspeed_2600_timer_write(AspeedTimerCtrlStat= e *s, hwaddr offset, const uint32_t tv =3D (uint32_t)(value & 0xFFFFFFFF); =20 switch (offset) { + case 0x34: + s->irq_sts &=3D tv; + break; case 0x3C: aspeed_timer_set_ctrl(s, s->ctrl & ~tv); break; @@ -626,6 +644,7 @@ static void aspeed_timer_reset(DeviceState *dev) s->ctrl =3D 0; s->ctrl2 =3D 0; s->ctrl3 =3D 0; + s->irq_sts =3D 0; } =20 static const VMStateDescription vmstate_aspeed_timer =3D { @@ -650,6 +669,7 @@ static const VMStateDescription vmstate_aspeed_timer_st= ate =3D { VMSTATE_UINT32(ctrl, AspeedTimerCtrlState), VMSTATE_UINT32(ctrl2, AspeedTimerCtrlState), VMSTATE_UINT32(ctrl3, AspeedTimerCtrlState), + VMSTATE_UINT32(irq_sts, AspeedTimerCtrlState), VMSTATE_STRUCT_ARRAY(timers, AspeedTimerCtrlState, ASPEED_TIMER_NR_TIMERS, 1, vmstate_aspeed_tim= er, AspeedTimer), --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567632557; cv=none; d=zoho.com; s=zohoarc; b=PEeKvJo/bQ+9K7v57c2Ckgh8ORgMTLmV4j9AVx9GqSQ4BtW1ZgCxv922kmxGJDMyiK8mXhhQyUYdjunbKANb0SPcQzvEwD4VCW+FL8W+YWNoJHDyKubynapib/qgICqZ3bFwTXOe0PkNqJOY/kaHoSAsv7uEOz6QLhKNyx5s0O8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567632557; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=CvlkSulygfy2qzy178jLxVu+i+Kkwf6sLKpejTMjNRI=; b=dmuuviFzEH3AtNgbL7zlBvqGPnO7Bw0V/ca5tnd20Ut4isLCKDV2TanYmr7AoERN0zIif5GUyZZx9zqR+ulGTAEbyjWowJ+9hZMkn1yzmahmX6DzomOIYMmGwgeCJu084iCgWQxWkq3523vRBIcBWQR/PIf1hs69hfhqmAC9rV4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567632557366935.6985895194387; Wed, 4 Sep 2019 14:29:17 -0700 (PDT) Received: from localhost ([::1]:40202 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cq4-0002xP-0q for importer@patchew.org; Wed, 04 Sep 2019 17:29:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53442) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cC3-0000Mq-UD for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cC1-0001Se-Rz for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:55 -0400 Received: from 4.mo68.mail-out.ovh.net ([46.105.59.63]:57114) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cC1-0001MO-KA for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:47:53 -0400 Received: from player691.ha.ovh.net (unknown [10.109.160.226]) by mo68.mail-out.ovh.net (Postfix) with ESMTP id 33C44141684 for ; Wed, 4 Sep 2019 22:47:52 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 80BD398B2845; Wed, 4 Sep 2019 20:47:45 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:50 +0200 Message-Id: <20190904204659.13878-7-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2519763993783274257 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.105.59.63 Subject: [Qemu-devel] [RFC PATCH 06/15] aspeed/sdmc: Introduce an object class per SoC X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Use class handlers and class constants to differentiate the characteristics of the memory controller and remove the 'silicon_rev' property. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/misc/aspeed_sdmc.h | 19 +++- hw/arm/aspeed_soc.c | 5 +- hw/misc/aspeed_sdmc.c | 168 +++++++++++++++++++++------------- 3 files changed, 122 insertions(+), 70 deletions(-) diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h index b3c926acae90..81156320c497 100644 --- a/include/hw/misc/aspeed_sdmc.h +++ b/include/hw/misc/aspeed_sdmc.h @@ -13,6 +13,8 @@ =20 #define TYPE_ASPEED_SDMC "aspeed.sdmc" #define ASPEED_SDMC(obj) OBJECT_CHECK(AspeedSDMCState, (obj), TYPE_ASPEED_= SDMC) +#define TYPE_ASPEED_2400_SDMC TYPE_ASPEED_SDMC "-ast2400" +#define TYPE_ASPEED_2500_SDMC TYPE_ASPEED_SDMC "-ast2500" =20 #define ASPEED_SDMC_NR_REGS (0x174 >> 2) =20 @@ -24,12 +26,21 @@ typedef struct AspeedSDMCState { MemoryRegion iomem; =20 uint32_t regs[ASPEED_SDMC_NR_REGS]; - uint32_t silicon_rev; - uint32_t ram_bits; uint64_t ram_size; uint64_t max_ram_size; - uint32_t fixed_conf; - } AspeedSDMCState; =20 +#define ASPEED_SDMC_CLASS(klass) \ + OBJECT_CLASS_CHECK(AspeedSDMCClass, (klass), TYPE_ASPEED_SDMC) +#define ASPEED_SDMC_GET_CLASS(obj) \ + OBJECT_GET_CLASS(AspeedSDMCClass, (obj), TYPE_ASPEED_SDMC) + +typedef struct AspeedSDMCClass { + SysBusDeviceClass parent_class; + + uint64_t max_ram_size; + uint32_t (*compute_conf)(AspeedSDMCState *s, uint32_t data); + void (*write)(AspeedSDMCState *s, uint32_t reg, uint32_t data); +} AspeedSDMCClass; + #endif /* ASPEED_SDMC_H */ diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 26e03486f9b7..aaf18d3e42f1 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -205,10 +205,9 @@ static void aspeed_soc_init(Object *obj) sizeof(s->spi[i]), typename); } =20 + snprintf(typename, sizeof(typename), "aspeed.sdmc-%s", socname); sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc), - TYPE_ASPEED_SDMC); - qdev_prop_set_uint32(DEVICE(&s->sdmc), "silicon-rev", - sc->info->silicon_rev); + typename); object_property_add_alias(obj, "ram-size", OBJECT(&s->sdmc), "ram-size", &error_abort); object_property_add_alias(obj, "max-ram-size", OBJECT(&s->sdmc), diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c index cb13c63ec848..60c99e773488 100644 --- a/hw/misc/aspeed_sdmc.c +++ b/hw/misc/aspeed_sdmc.c @@ -110,6 +110,7 @@ static void aspeed_sdmc_write(void *opaque, hwaddr addr= , uint64_t data, unsigned int size) { AspeedSDMCState *s =3D ASPEED_SDMC(opaque); + AspeedSDMCClass *asc =3D ASPEED_SDMC_GET_CLASS(s); =20 addr >>=3D 2; =20 @@ -130,41 +131,7 @@ static void aspeed_sdmc_write(void *opaque, hwaddr add= r, uint64_t data, return; } =20 - if (addr =3D=3D R_CONF) { - /* Make sure readonly bits are kept */ - switch (s->silicon_rev) { - case AST2400_A0_SILICON_REV: - case AST2400_A1_SILICON_REV: - data &=3D ~ASPEED_SDMC_READONLY_MASK; - data |=3D s->fixed_conf; - break; - case AST2500_A0_SILICON_REV: - case AST2500_A1_SILICON_REV: - data &=3D ~ASPEED_SDMC_AST2500_READONLY_MASK; - data |=3D s->fixed_conf; - break; - default: - g_assert_not_reached(); - } - } - if (s->silicon_rev =3D=3D AST2500_A0_SILICON_REV || - s->silicon_rev =3D=3D AST2500_A1_SILICON_REV) { - switch (addr) { - case R_STATUS1: - /* Will never return 'busy' */ - data &=3D ~PHY_BUSY_STATE; - break; - case R_ECC_TEST_CTRL: - /* Always done, always happy */ - data |=3D ECC_TEST_FINISHED; - data &=3D ~ECC_TEST_FAIL; - break; - default: - break; - } - } - - s->regs[addr] =3D data; + asc->write(s, addr, data); } =20 static const MemoryRegionOps aspeed_sdmc_ops =3D { @@ -222,44 +189,21 @@ static int ast2500_rambits(AspeedSDMCState *s) static void aspeed_sdmc_reset(DeviceState *dev) { AspeedSDMCState *s =3D ASPEED_SDMC(dev); + AspeedSDMCClass *asc =3D ASPEED_SDMC_GET_CLASS(s); =20 memset(s->regs, 0, sizeof(s->regs)); =20 /* Set ram size bit and defaults values */ - s->regs[R_CONF] =3D s->fixed_conf; + s->regs[R_CONF] =3D asc->compute_conf(s, 0); } =20 static void aspeed_sdmc_realize(DeviceState *dev, Error **errp) { SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); AspeedSDMCState *s =3D ASPEED_SDMC(dev); + AspeedSDMCClass *asc =3D ASPEED_SDMC_GET_CLASS(s); =20 - if (!is_supported_silicon_rev(s->silicon_rev)) { - error_setg(errp, "Unknown silicon revision: 0x%" PRIx32, - s->silicon_rev); - return; - } - - switch (s->silicon_rev) { - case AST2400_A0_SILICON_REV: - case AST2400_A1_SILICON_REV: - s->ram_bits =3D ast2400_rambits(s); - s->max_ram_size =3D 512 << 20; - s->fixed_conf =3D ASPEED_SDMC_VGA_COMPAT | - ASPEED_SDMC_DRAM_SIZE(s->ram_bits); - break; - case AST2500_A0_SILICON_REV: - case AST2500_A1_SILICON_REV: - s->ram_bits =3D ast2500_rambits(s); - s->max_ram_size =3D 1024 << 20; - s->fixed_conf =3D ASPEED_SDMC_HW_VERSION(1) | - ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) | - ASPEED_SDMC_CACHE_INITIAL_DONE | - ASPEED_SDMC_DRAM_SIZE(s->ram_bits); - break; - default: - g_assert_not_reached(); - } + s->max_ram_size =3D asc->max_ram_size; =20 memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s, TYPE_ASPEED_SDMC, 0x1000); @@ -277,7 +221,6 @@ static const VMStateDescription vmstate_aspeed_sdmc =3D= { }; =20 static Property aspeed_sdmc_properties[] =3D { - DEFINE_PROP_UINT32("silicon-rev", AspeedSDMCState, silicon_rev, 0), DEFINE_PROP_UINT64("ram-size", AspeedSDMCState, ram_size, 0), DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0), DEFINE_PROP_END_OF_LIST(), @@ -298,11 +241,110 @@ static const TypeInfo aspeed_sdmc_info =3D { .parent =3D TYPE_SYS_BUS_DEVICE, .instance_size =3D sizeof(AspeedSDMCState), .class_init =3D aspeed_sdmc_class_init, + .class_size =3D sizeof(AspeedSDMCClass), + .abstract =3D true, +}; + +static uint32_t aspeed_2400_sdmc_compute_conf(AspeedSDMCState *s, uint32_t= data) +{ + uint32_t fixed_conf =3D ASPEED_SDMC_VGA_COMPAT | + ASPEED_SDMC_DRAM_SIZE(ast2400_rambits(s)); + + /* Make sure readonly bits are kept */ + data &=3D ~ASPEED_SDMC_READONLY_MASK; + + return data | fixed_conf; +} + +static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg, + uint32_t data) +{ + switch (reg) { + case R_CONF: + data =3D aspeed_2400_sdmc_compute_conf(s, data); + break; + default: + break; + } + + s->regs[reg] =3D data; +} + +static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSDMCClass *asc =3D ASPEED_SDMC_CLASS(klass); + + dc->desc =3D "ASPEED 2400 SDRAM Memory Controller"; + asc->max_ram_size =3D 512 << 20; + asc->compute_conf =3D aspeed_2400_sdmc_compute_conf; + asc->write =3D aspeed_2400_sdmc_write; +} + +static const TypeInfo aspeed_2400_sdmc_info =3D { + .name =3D TYPE_ASPEED_2400_SDMC, + .parent =3D TYPE_ASPEED_SDMC, + .class_init =3D aspeed_2400_sdmc_class_init, +}; + +static uint32_t aspeed_2500_sdmc_compute_conf(AspeedSDMCState *s, uint32_t= data) +{ + uint32_t fixed_conf =3D ASPEED_SDMC_HW_VERSION(1) | + ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) | + ASPEED_SDMC_CACHE_INITIAL_DONE | + ASPEED_SDMC_DRAM_SIZE(ast2500_rambits(s)); + + /* Make sure readonly bits are kept */ + data &=3D ~ASPEED_SDMC_AST2500_READONLY_MASK; + + return data | fixed_conf; +} + +static void aspeed_2500_sdmc_write(AspeedSDMCState *s, uint32_t reg, + uint32_t data) +{ + switch (reg) { + case R_CONF: + data =3D aspeed_2500_sdmc_compute_conf(s, data); + break; + case R_STATUS1: + /* Will never return 'busy' */ + data &=3D ~PHY_BUSY_STATE; + break; + case R_ECC_TEST_CTRL: + /* Always done, always happy */ + data |=3D ECC_TEST_FINISHED; + data &=3D ~ECC_TEST_FAIL; + break; + default: + break; + } + + s->regs[reg] =3D data; +} + +static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSDMCClass *asc =3D ASPEED_SDMC_CLASS(klass); + + dc->desc =3D "ASPEED 2500 SDRAM Memory Controller"; + asc->max_ram_size =3D 1024 << 20; + asc->compute_conf =3D aspeed_2500_sdmc_compute_conf; + asc->write =3D aspeed_2500_sdmc_write; +} + +static const TypeInfo aspeed_2500_sdmc_info =3D { + .name =3D TYPE_ASPEED_2500_SDMC, + .parent =3D TYPE_ASPEED_SDMC, + .class_init =3D aspeed_2500_sdmc_class_init, }; =20 static void aspeed_sdmc_register_types(void) { type_register_static(&aspeed_sdmc_info); + type_register_static(&aspeed_2400_sdmc_info); + type_register_static(&aspeed_2500_sdmc_info); } =20 type_init(aspeed_sdmc_register_types); --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567632842; cv=none; d=zoho.com; s=zohoarc; b=h1C+VkUpRmw2Cg2JGQcVnkjcWiLkWM6UZLYR/Z97e+Gr4FoZNB0y2TVAdkBNSIG5rpbKK60lDvxSB87c+dKSLnoM0FSrNaZMw9wbqjzC9lg2NtaRzWJaZsKTNAwQgPoOXo3E+vJYSe21qxZ+Trij/a/76OpDHwzBmDqZCh3CUOM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567632842; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=GkaTcs7nUmjex66xrLMJyNBTMurOuARGf2oeyyl5K88=; b=PL8+aLkcDRe7a8mWvLsUMkMf0/YrMxbb2/s7c864EZoCrCpNWXrfh46OMgs/4ktNgrYq4LEC6sfwCBMdYSmfG9s6RA0SsZ2lov1E35rXPXbci3mDpojpkrNcniuFJHMQmNLHXCCArmQA4XL6mvuvy0qAhGOUMjCc9jeHunWFDHM= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567632842108349.7939254128536; Wed, 4 Sep 2019 14:34:02 -0700 (PDT) Received: from localhost ([::1]:40262 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cub-0007pY-U9 for importer@patchew.org; Wed, 04 Sep 2019 17:33:57 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53479) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cCB-0000VW-8y for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cC9-0001bx-JU for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:03 -0400 Received: from 5.mo7.mail-out.ovh.net ([178.32.120.239]:49610) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cC9-0001ak-D9 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:01 -0400 Received: from player691.ha.ovh.net (unknown [10.108.35.185]) by mo7.mail-out.ovh.net (Postfix) with ESMTP id 5471012E8EF for ; Wed, 4 Sep 2019 22:47:59 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 351E698B285F; Wed, 4 Sep 2019 20:47:52 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:51 +0200 Message-Id: <20190904204659.13878-8-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2521734316675468049 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 178.32.120.239 Subject: [Qemu-devel] [RFC PATCH 07/15] aspeed/sdmc: Add AST2600 support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Joel Stanley The AST2600 SDMC controller is slightly different from its predecessor (DRAM training). Max memory is now 2G on the AST2600. Signed-off-by: Joel Stanley [clg: - improved commit log ] - reworked mode integration into new objet class ] Signed-off-by: C=C3=A9dric Le Goater --- include/hw/misc/aspeed_sdmc.h | 1 + hw/misc/aspeed_scu.c | 2 + hw/misc/aspeed_sdmc.c | 82 +++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h index 81156320c497..5dbde59fe777 100644 --- a/include/hw/misc/aspeed_sdmc.h +++ b/include/hw/misc/aspeed_sdmc.h @@ -15,6 +15,7 @@ #define ASPEED_SDMC(obj) OBJECT_CHECK(AspeedSDMCState, (obj), TYPE_ASPEED_= SDMC) #define TYPE_ASPEED_2400_SDMC TYPE_ASPEED_SDMC "-ast2400" #define TYPE_ASPEED_2500_SDMC TYPE_ASPEED_SDMC "-ast2500" +#define TYPE_ASPEED_2600_SDMC TYPE_ASPEED_SDMC "-ast2600" =20 #define ASPEED_SDMC_NR_REGS (0x174 >> 2) =20 diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c index 4190adab8220..df76bd58a1bb 100644 --- a/hw/misc/aspeed_scu.c +++ b/hw/misc/aspeed_scu.c @@ -99,6 +99,7 @@ #define AST2600_CLK_STOP_CTRL_CLR TO_REG(0x84) #define AST2600_CLK_STOP_CTRL2 TO_REG(0x90) #define AST2600_CLK_STOP_CTR2L_CLR TO_REG(0x94) +#define AST2600_SDRAM_HANDSHAKE TO_REG(0x100) #define AST2600_MPLL_EXT TO_REG(0x224) #define AST2600_EPLL_EXT TO_REG(0x244) #define AST2600_CLK_SEL TO_REG(0x300) @@ -599,6 +600,7 @@ static const uint32_t ast2600_a0_resets[ASPEED_AST2600_= SCU_NR_REGS] =3D { [AST2600_SYS_RST_CTRL2] =3D 0xFFFFFFFC, [AST2600_CLK_STOP_CTRL] =3D 0xEFF43E8B, [AST2600_CLK_STOP_CTRL2] =3D 0xFFF0FFF0, + [AST2600_SDRAM_HANDSHAKE] =3D 0x00000040, /* SoC completed DRAM ini= t */ }; =20 static void aspeed_ast2600_scu_reset(DeviceState *dev) diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c index 60c99e773488..f3a63a2e01db 100644 --- a/hw/misc/aspeed_sdmc.c +++ b/hw/misc/aspeed_sdmc.c @@ -28,6 +28,7 @@ /* Control/Status Register #1 (ast2500) */ #define R_STATUS1 (0x60 / 4) #define PHY_BUSY_STATE BIT(0) +#define PHY_PLL_LOCK_STATUS BIT(4) =20 #define R_ECC_TEST_CTRL (0x70 / 4) #define ECC_TEST_FINISHED BIT(12) @@ -85,6 +86,11 @@ #define ASPEED_SDMC_AST2500_512MB 0x2 #define ASPEED_SDMC_AST2500_1024MB 0x3 =20 +#define ASPEED_SDMC_AST2600_256MB 0x0 +#define ASPEED_SDMC_AST2600_512MB 0x1 +#define ASPEED_SDMC_AST2600_1024MB 0x2 +#define ASPEED_SDMC_AST2600_2048MB 0x3 + #define ASPEED_SDMC_AST2500_READONLY_MASK \ (ASPEED_SDMC_HW_VERSION(0xf) | ASPEED_SDMC_CACHE_INITIAL_DONE | \ ASPEED_SDMC_AST2500_RESERVED | ASPEED_SDMC_VGA_COMPAT | \ @@ -186,6 +192,28 @@ static int ast2500_rambits(AspeedSDMCState *s) return ASPEED_SDMC_AST2500_512MB; } =20 +static int ast2600_rambits(AspeedSDMCState *s) +{ + switch (s->ram_size >> 20) { + case 256: + return ASPEED_SDMC_AST2600_256MB; + case 512: + return ASPEED_SDMC_AST2600_512MB; + case 1024: + return ASPEED_SDMC_AST2600_1024MB; + case 2048: + return ASPEED_SDMC_AST2600_2048MB; + default: + break; + } + + /* use a common default */ + warn_report("Invalid RAM size 0x%" PRIx64 ". Using default 512M", + s->ram_size); + s->ram_size =3D 512 << 20; + return ASPEED_SDMC_AST2600_512MB; +} + static void aspeed_sdmc_reset(DeviceState *dev) { AspeedSDMCState *s =3D ASPEED_SDMC(dev); @@ -340,11 +368,65 @@ static const TypeInfo aspeed_2500_sdmc_info =3D { .class_init =3D aspeed_2500_sdmc_class_init, }; =20 +static uint32_t aspeed_2600_sdmc_compute_conf(AspeedSDMCState *s, uint32_t= data) +{ + uint32_t fixed_conf =3D ASPEED_SDMC_HW_VERSION(3) | + ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) | + ASPEED_SDMC_DRAM_SIZE(ast2600_rambits(s)); + + /* Make sure readonly bits are kept (use ast2500 mask) */ + data &=3D ~ASPEED_SDMC_AST2500_READONLY_MASK; + + return data | fixed_conf; +} + +static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg, + uint32_t data) +{ + switch (reg) { + case R_CONF: + data =3D aspeed_2600_sdmc_compute_conf(s, data); + break; + case R_STATUS1: + /* Will never return 'busy'. 'lock status' is always set */ + data &=3D ~PHY_BUSY_STATE; + data |=3D PHY_PLL_LOCK_STATUS; + break; + case R_ECC_TEST_CTRL: + /* Always done, always happy */ + data |=3D ECC_TEST_FINISHED; + data &=3D ~ECC_TEST_FAIL; + break; + default: + break; + } + + s->regs[reg] =3D data; +} + +static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedSDMCClass *asc =3D ASPEED_SDMC_CLASS(klass); + + dc->desc =3D "ASPEED 2600 SDRAM Memory Controller"; + asc->max_ram_size =3D 2048 << 20; + asc->compute_conf =3D aspeed_2600_sdmc_compute_conf; + asc->write =3D aspeed_2600_sdmc_write; +} + +static const TypeInfo aspeed_2600_sdmc_info =3D { + .name =3D TYPE_ASPEED_2600_SDMC, + .parent =3D TYPE_ASPEED_SDMC, + .class_init =3D aspeed_2600_sdmc_class_init, +}; + static void aspeed_sdmc_register_types(void) { type_register_static(&aspeed_sdmc_info); type_register_static(&aspeed_2400_sdmc_info); type_register_static(&aspeed_2500_sdmc_info); + type_register_static(&aspeed_2600_sdmc_info); } =20 type_init(aspeed_sdmc_register_types); --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567633572; cv=none; d=zoho.com; s=zohoarc; b=NUJfpJ4v1BID5StOtCQNaaTjx2rkK314A74m7WvkqkhqGaA61CpS44KdFI6EwrMOTdhgDR0zpNG6u2HWzMN/5ry/mfzllzKCMLVJLGAwE8/BrLU7GmS6Iip2JVRuon5tv20wcTi2lchD4X5G8w1prixEhyXyVIgoOi5O79vqw5k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567633572; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=RLfZXcfAf+qX8d4u6fdjmKMW7Dlt9jIWMB+G4EEC0kA=; b=IQ0SINGVkTalzSlXQrNMM6q0uwN9XXlPJNvHTcqldgP9SOzOgePgkgPjS0WgjXFJZFYyJTCVEN4MXuaSAs9vpPHml5ecCBcAGXEGagAaNXg0v4MyOnRpUqLhf424+DVXOaGTVTTnUIam5oql0p9k7FOTj/bBFxgaJntenxbYstI= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567633572179276.6693850035366; Wed, 4 Sep 2019 14:46:12 -0700 (PDT) Received: from localhost ([::1]:40478 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5d6K-0005TA-J7 for importer@patchew.org; Wed, 04 Sep 2019 17:46:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53517) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cCI-0000dW-Am for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cCG-0001fN-Ee for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:10 -0400 Received: from 1.mo179.mail-out.ovh.net ([178.33.111.220]:45700) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cCG-0001ex-8S for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:08 -0400 Received: from player691.ha.ovh.net (unknown [10.109.159.90]) by mo179.mail-out.ovh.net (Postfix) with ESMTP id C9B131408D2 for ; Wed, 4 Sep 2019 22:48:06 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 4F5B098B286B; Wed, 4 Sep 2019 20:47:59 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:52 +0200 Message-Id: <20190904204659.13878-9-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2523704641194855185 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 178.33.111.220 Subject: [Qemu-devel] [RFC PATCH 08/15] watchdog/aspeed: Introduce an object class per SoC X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" It cleanups the current models for the Aspeed AST2400 and AST2500 SoCs and prepares ground for future SoCs. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/watchdog/wdt_aspeed.h | 18 ++++- hw/arm/aspeed_soc.c | 9 ++- hw/watchdog/wdt_aspeed.c | 122 ++++++++++++++++--------------- 3 files changed, 86 insertions(+), 63 deletions(-) diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_asp= eed.h index 8c5691ce2047..796342764e2e 100644 --- a/include/hw/watchdog/wdt_aspeed.h +++ b/include/hw/watchdog/wdt_aspeed.h @@ -16,6 +16,8 @@ #define TYPE_ASPEED_WDT "aspeed.wdt" #define ASPEED_WDT(obj) \ OBJECT_CHECK(AspeedWDTState, (obj), TYPE_ASPEED_WDT) +#define TYPE_ASPEED_2400_WDT TYPE_ASPEED_WDT "-ast2400" +#define TYPE_ASPEED_2500_WDT TYPE_ASPEED_WDT "-ast2500" =20 #define ASPEED_WDT_REGS_MAX (0x20 / 4) =20 @@ -30,8 +32,20 @@ typedef struct AspeedWDTState { =20 AspeedSCUState *scu; uint32_t pclk_freq; - uint32_t silicon_rev; - uint32_t ext_pulse_width_mask; } AspeedWDTState; =20 +#define ASPEED_WDT_CLASS(klass) \ + OBJECT_CLASS_CHECK(AspeedWDTClass, (klass), TYPE_ASPEED_WDT) +#define ASPEED_WDT_GET_CLASS(obj) \ + OBJECT_GET_CLASS(AspeedWDTClass, (obj), TYPE_ASPEED_WDT) + +typedef struct AspeedWDTClass { + SysBusDeviceClass parent_class; + + uint32_t offset; + uint32_t ext_pulse_width_mask; + uint32_t reset_ctrl_reg; + void (*reset_pulse)(AspeedWDTState *s, uint32_t property); +} AspeedWDTClass; + #endif /* WDT_ASPEED_H */ diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index aaf18d3e42f1..5c5fcb810944 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -214,10 +214,9 @@ static void aspeed_soc_init(Object *obj) "max-ram-size", &error_abort); =20 for (i =3D 0; i < sc->info->wdts_num; i++) { + snprintf(typename, sizeof(typename), "aspeed.wdt-%s", socname); sysbus_init_child_obj(obj, "wdt[*]", OBJECT(&s->wdt[i]), - sizeof(s->wdt[i]), TYPE_ASPEED_WDT); - qdev_prop_set_uint32(DEVICE(&s->wdt[i]), "silicon-rev", - sc->info->silicon_rev); + sizeof(s->wdt[i]), typename); object_property_add_const_link(OBJECT(&s->wdt[i]), "scu", OBJECT(&s->scu), &error_abort); } @@ -384,13 +383,15 @@ static void aspeed_soc_realize(DeviceState *dev, Erro= r **errp) =20 /* Watch dog */ for (i =3D 0; i < sc->info->wdts_num; i++) { + AspeedWDTClass *awc =3D ASPEED_WDT_GET_CLASS(&s->wdt[i]); + object_property_set_bool(OBJECT(&s->wdt[i]), true, "realized", &er= r); if (err) { error_propagate(errp, err); return; } sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0, - sc->info->memmap[ASPEED_WDT] + i * 0x20); + sc->info->memmap[ASPEED_WDT] + i * awc->offset); } =20 /* Net */ diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c index 9b932134172c..9e241b7c8da4 100644 --- a/hw/watchdog/wdt_aspeed.c +++ b/hw/watchdog/wdt_aspeed.c @@ -54,21 +54,6 @@ static bool aspeed_wdt_is_enabled(const AspeedWDTState *= s) return s->regs[WDT_CTRL] & WDT_CTRL_ENABLE; } =20 -static bool is_ast2500(const AspeedWDTState *s) -{ - switch (s->silicon_rev) { - case AST2500_A0_SILICON_REV: - case AST2500_A1_SILICON_REV: - return true; - case AST2400_A0_SILICON_REV: - case AST2400_A1_SILICON_REV: - default: - break; - } - - return false; -} - static uint64_t aspeed_wdt_read(void *opaque, hwaddr offset, unsigned size) { AspeedWDTState *s =3D ASPEED_WDT(opaque); @@ -124,6 +109,7 @@ static void aspeed_wdt_write(void *opaque, hwaddr offse= t, uint64_t data, unsigned size) { AspeedWDTState *s =3D ASPEED_WDT(opaque); + AspeedWDTClass *awc =3D ASPEED_WDT_GET_CLASS(s); bool enable =3D data & WDT_CTRL_ENABLE; =20 offset >>=3D 2; @@ -153,24 +139,13 @@ static void aspeed_wdt_write(void *opaque, hwaddr off= set, uint64_t data, } break; case WDT_RESET_WIDTH: - { - uint32_t property =3D data & WDT_POLARITY_MASK; - - if (property && is_ast2500(s)) { - if (property =3D=3D WDT_ACTIVE_HIGH_MAGIC) { - s->regs[WDT_RESET_WIDTH] |=3D WDT_RESET_WIDTH_ACTIVE_HIGH; - } else if (property =3D=3D WDT_ACTIVE_LOW_MAGIC) { - s->regs[WDT_RESET_WIDTH] &=3D ~WDT_RESET_WIDTH_ACTIVE_HIGH; - } else if (property =3D=3D WDT_PUSH_PULL_MAGIC) { - s->regs[WDT_RESET_WIDTH] |=3D WDT_RESET_WIDTH_PUSH_PULL; - } else if (property =3D=3D WDT_OPEN_DRAIN_MAGIC) { - s->regs[WDT_RESET_WIDTH] &=3D ~WDT_RESET_WIDTH_PUSH_PULL; - } + if (awc->reset_pulse) { + awc->reset_pulse(s, data & WDT_POLARITY_MASK); } - s->regs[WDT_RESET_WIDTH] &=3D ~s->ext_pulse_width_mask; - s->regs[WDT_RESET_WIDTH] |=3D data & s->ext_pulse_width_mask; + s->regs[WDT_RESET_WIDTH] &=3D ~awc->ext_pulse_width_mask; + s->regs[WDT_RESET_WIDTH] |=3D data & awc->ext_pulse_width_mask; break; - } + case WDT_TIMEOUT_STATUS: case WDT_TIMEOUT_CLEAR: qemu_log_mask(LOG_UNIMP, @@ -226,9 +201,10 @@ static void aspeed_wdt_reset(DeviceState *dev) static void aspeed_wdt_timer_expired(void *dev) { AspeedWDTState *s =3D ASPEED_WDT(dev); + uint32_t reset_ctrl_reg =3D ASPEED_WDT_GET_CLASS(s)->reset_ctrl_reg; =20 /* Do not reset on SDRAM controller reset */ - if (s->scu->regs[SCU_RESET_CONTROL1] & SCU_RESET_SDRAM) { + if (s->scu->regs[reset_ctrl_reg] & SCU_RESET_SDRAM) { timer_del(s->timer); s->regs[WDT_CTRL] =3D 0; return; @@ -256,25 +232,6 @@ static void aspeed_wdt_realize(DeviceState *dev, Error= **errp) } s->scu =3D ASPEED_SCU(obj); =20 - if (!is_supported_silicon_rev(s->silicon_rev)) { - error_setg(errp, "Unknown silicon revision: 0x%" PRIx32, - s->silicon_rev); - return; - } - - switch (s->silicon_rev) { - case AST2400_A0_SILICON_REV: - case AST2400_A1_SILICON_REV: - s->ext_pulse_width_mask =3D 0xff; - break; - case AST2500_A0_SILICON_REV: - case AST2500_A1_SILICON_REV: - s->ext_pulse_width_mask =3D 0xfffff; - break; - default: - g_assert_not_reached(); - } - s->timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, aspeed_wdt_timer_expired= , dev); =20 /* FIXME: This setting should be derived from the SCU hw strapping @@ -287,20 +244,15 @@ static void aspeed_wdt_realize(DeviceState *dev, Erro= r **errp) sysbus_init_mmio(sbd, &s->iomem); } =20 -static Property aspeed_wdt_properties[] =3D { - DEFINE_PROP_UINT32("silicon-rev", AspeedWDTState, silicon_rev, 0), - DEFINE_PROP_END_OF_LIST(), -}; - static void aspeed_wdt_class_init(ObjectClass *klass, void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); =20 + dc->desc =3D "ASPEED Watchdog Controller"; dc->realize =3D aspeed_wdt_realize; dc->reset =3D aspeed_wdt_reset; set_bit(DEVICE_CATEGORY_MISC, dc->categories); dc->vmsd =3D &vmstate_aspeed_wdt; - dc->props =3D aspeed_wdt_properties; } =20 static const TypeInfo aspeed_wdt_info =3D { @@ -308,12 +260,68 @@ static const TypeInfo aspeed_wdt_info =3D { .name =3D TYPE_ASPEED_WDT, .instance_size =3D sizeof(AspeedWDTState), .class_init =3D aspeed_wdt_class_init, + .class_size =3D sizeof(AspeedWDTClass), + .abstract =3D true, +}; + +static void aspeed_2400_wdt_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedWDTClass *awc =3D ASPEED_WDT_CLASS(klass); + + dc->desc =3D "ASPEED 2400 Watchdog Controller"; + awc->offset =3D 0x20; + awc->ext_pulse_width_mask =3D 0xff; + awc->reset_ctrl_reg =3D SCU_RESET_CONTROL1; +} + +static const TypeInfo aspeed_2400_wdt_info =3D { + .name =3D TYPE_ASPEED_2400_WDT, + .parent =3D TYPE_ASPEED_WDT, + .instance_size =3D sizeof(AspeedWDTState), + .class_init =3D aspeed_2400_wdt_class_init, +}; + +static void aspeed_2500_wdt_reset_pulse(AspeedWDTState *s, uint32_t proper= ty) +{ + if (property) { + if (property =3D=3D WDT_ACTIVE_HIGH_MAGIC) { + s->regs[WDT_RESET_WIDTH] |=3D WDT_RESET_WIDTH_ACTIVE_HIGH; + } else if (property =3D=3D WDT_ACTIVE_LOW_MAGIC) { + s->regs[WDT_RESET_WIDTH] &=3D ~WDT_RESET_WIDTH_ACTIVE_HIGH; + } else if (property =3D=3D WDT_PUSH_PULL_MAGIC) { + s->regs[WDT_RESET_WIDTH] |=3D WDT_RESET_WIDTH_PUSH_PULL; + } else if (property =3D=3D WDT_OPEN_DRAIN_MAGIC) { + s->regs[WDT_RESET_WIDTH] &=3D ~WDT_RESET_WIDTH_PUSH_PULL; + } + } +} + +static void aspeed_2500_wdt_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedWDTClass *awc =3D ASPEED_WDT_CLASS(klass); + + dc->desc =3D "ASPEED 2500 Watchdog Controller"; + awc->offset =3D 0x20; + awc->ext_pulse_width_mask =3D 0xfffff; + awc->reset_ctrl_reg =3D SCU_RESET_CONTROL1; + awc->reset_pulse =3D aspeed_2500_wdt_reset_pulse; +} + +static const TypeInfo aspeed_2500_wdt_info =3D { + .name =3D TYPE_ASPEED_2500_WDT, + .parent =3D TYPE_ASPEED_WDT, + .instance_size =3D sizeof(AspeedWDTState), + .class_init =3D aspeed_2500_wdt_class_init, }; =20 static void wdt_aspeed_register_types(void) { watchdog_add_model(&model); type_register_static(&aspeed_wdt_info); + type_register_static(&aspeed_2400_wdt_info); + type_register_static(&aspeed_2500_wdt_info); } =20 type_init(wdt_aspeed_register_types) --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567633947; cv=none; d=zoho.com; s=zohoarc; b=WWhSs+uQvbXdlposF+Lk9IOsC+iZeJJgwvbD3mq8h2pOVSwxvhBtPHZ8K22Wy7nSLzMk/gxaO8eHY6kV4iKN4FX7Izw2lYOEFvP9w5SP3lov32xgMPbx/4ffTA5A1egXS5najisvAEsjTW4Mm8ACwwFhUZCKR05iC0lq9QbyWlc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567633947; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=dBASQ8pq6Y0dk1ibQvTzKgWM71NWA3vrPlV4KeVAP0E=; b=M6VmBnQ03m6Ow9OeS8Mc3DuX0YoyqUGLUsi2uEQSszw/mwj8jx8AkrC75Gz3CKw9RSIHcSyWOfedH7/PiVnUXFrCnzrHFmy6LJ/Omh/x+jkVBJGmk/jp8rmBx6bLMUE+L6qWF3quF5H8lowKtW2R8L1gc4eEk7MIpeeWf05BKus= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567633947175878.769446256551; Wed, 4 Sep 2019 14:52:27 -0700 (PDT) Received: from localhost ([::1]:40554 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5dCK-0002q6-FO for importer@patchew.org; Wed, 04 Sep 2019 17:52:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53565) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cCO-0000kB-3x for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cCM-0001j8-S9 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:15 -0400 Received: from 2.mo2.mail-out.ovh.net ([188.165.53.149]:33973) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cCM-0001iQ-M2 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:14 -0400 Received: from player691.ha.ovh.net (unknown [10.109.159.224]) by mo2.mail-out.ovh.net (Postfix) with ESMTP id 53A671AB3A5 for ; Wed, 4 Sep 2019 22:48:13 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id A2E0998B289E; Wed, 4 Sep 2019 20:48:06 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:53 +0200 Message-Id: <20190904204659.13878-10-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2525674966197504785 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 188.165.53.149 Subject: [Qemu-devel] [RFC PATCH 09/15] hw: wdt_aspeed: Add AST2600 support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Joel Stanley The AST2600 has four watchdogs, and they each have a 0x40 of registers. When running as part of an ast2600 system we must check a different offset for the system reset control register in the SCU. Signed-off-by: Joel Stanley [clg: - reworked mode integration into new objet class ] Signed-off-by: C=C3=A9dric Le Goater --- include/hw/arm/aspeed_soc.h | 2 +- include/hw/watchdog/wdt_aspeed.h | 1 + hw/watchdog/wdt_aspeed.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index ba5bbb53e1a1..b427f2668a8a 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -27,7 +27,7 @@ #include "hw/sd/aspeed_sdhci.h" =20 #define ASPEED_SPIS_NUM 2 -#define ASPEED_WDTS_NUM 3 +#define ASPEED_WDTS_NUM 4 #define ASPEED_CPUS_NUM 2 #define ASPEED_MACS_NUM 2 =20 diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_asp= eed.h index 796342764e2e..dfedd7662dd1 100644 --- a/include/hw/watchdog/wdt_aspeed.h +++ b/include/hw/watchdog/wdt_aspeed.h @@ -18,6 +18,7 @@ OBJECT_CHECK(AspeedWDTState, (obj), TYPE_ASPEED_WDT) #define TYPE_ASPEED_2400_WDT TYPE_ASPEED_WDT "-ast2400" #define TYPE_ASPEED_2500_WDT TYPE_ASPEED_WDT "-ast2500" +#define TYPE_ASPEED_2600_WDT TYPE_ASPEED_WDT "-ast2600" =20 #define ASPEED_WDT_REGS_MAX (0x20 / 4) =20 diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c index 9e241b7c8da4..6870dcf0c107 100644 --- a/hw/watchdog/wdt_aspeed.c +++ b/hw/watchdog/wdt_aspeed.c @@ -40,12 +40,14 @@ #define WDT_DRIVE_TYPE_MASK (0xFF << 24) #define WDT_PUSH_PULL_MAGIC (0xA8 << 24) #define WDT_OPEN_DRAIN_MAGIC (0x8A << 24) +#define WDT_RESET_MASK1 (0x1c / 4) =20 #define WDT_TIMEOUT_STATUS (0x10 / 4) #define WDT_TIMEOUT_CLEAR (0x14 / 4) =20 #define WDT_RESTART_MAGIC 0x4755 =20 +#define AST2600_SCU_RESET_CONTROL1 (0x40 / 4) #define SCU_RESET_CONTROL1 (0x04 / 4) #define SCU_RESET_SDRAM BIT(0) =20 @@ -74,6 +76,8 @@ static uint64_t aspeed_wdt_read(void *opaque, hwaddr offs= et, unsigned size) return s->regs[WDT_CTRL]; case WDT_RESET_WIDTH: return s->regs[WDT_RESET_WIDTH]; + case WDT_RESET_MASK1: + return s->regs[WDT_RESET_MASK1]; case WDT_TIMEOUT_STATUS: case WDT_TIMEOUT_CLEAR: qemu_log_mask(LOG_UNIMP, @@ -146,6 +150,11 @@ static void aspeed_wdt_write(void *opaque, hwaddr offs= et, uint64_t data, s->regs[WDT_RESET_WIDTH] |=3D data & awc->ext_pulse_width_mask; break; =20 + case WDT_RESET_MASK1: + /* TODO: implement */ + s->regs[WDT_RESET_MASK1] =3D data; + break; + case WDT_TIMEOUT_STATUS: case WDT_TIMEOUT_CLEAR: qemu_log_mask(LOG_UNIMP, @@ -316,12 +325,32 @@ static const TypeInfo aspeed_2500_wdt_info =3D { .class_init =3D aspeed_2500_wdt_class_init, }; =20 +static void aspeed_2600_wdt_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + AspeedWDTClass *awc =3D ASPEED_WDT_CLASS(klass); + + dc->desc =3D "ASPEED 2600 Watchdog Controller"; + awc->offset =3D 0x40; + awc->ext_pulse_width_mask =3D 0xfffff; /* TODO */ + awc->reset_ctrl_reg =3D AST2600_SCU_RESET_CONTROL1; + awc->reset_pulse =3D aspeed_2500_wdt_reset_pulse; +} + +static const TypeInfo aspeed_2600_wdt_info =3D { + .name =3D TYPE_ASPEED_2600_WDT, + .parent =3D TYPE_ASPEED_WDT, + .instance_size =3D sizeof(AspeedWDTState), + .class_init =3D aspeed_2600_wdt_class_init, +}; + static void wdt_aspeed_register_types(void) { watchdog_add_model(&model); type_register_static(&aspeed_wdt_info); type_register_static(&aspeed_2400_wdt_info); type_register_static(&aspeed_2500_wdt_info); + type_register_static(&aspeed_2600_wdt_info); } =20 type_init(wdt_aspeed_register_types) --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567632838; cv=none; d=zoho.com; s=zohoarc; b=LyFaO4t8o5vPxhl0q1DpvGU5uI1BB7V0OY6t19nORVWwSJVeCGk3KQDvEL0B7Rr896b1Rj8uJSPPrI1TB3dsceWpmDrsz9M/oBeTA1F9JNjMA8a3S+dPsNB7Wxg25yOJopML4NA2LOjzc1U4Tua/nEU0pbljCP7hZGTdh0XQXh8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567632838; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=jKxs9q0ZYkEz7fn8s/Plm2HUR5RsuktFFUOU1jGLVsA=; b=SiV6zhfs8HJn32Zdy9OtRXNV1mOpCBw5NkemYLogS8HKmnb+omwe/7KufgSU3HO/AdsXQUf0d0u0BzlHdwQr/1a3riT51g1uGLAiNK66Xsare2YODMmTmAuucsG9DqUnn4DjGmm9Sb73XG1O1GkirFp3tTs8x5y7yAWZ9Rv3zTE= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567632838759536.889858731548; Wed, 4 Sep 2019 14:33:58 -0700 (PDT) Received: from localhost ([::1]:40260 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cua-0007jd-QD for importer@patchew.org; Wed, 04 Sep 2019 17:33:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53631) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cCV-0000t8-Ic for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cCT-0001mz-NM for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:23 -0400 Received: from 1.mo177.mail-out.ovh.net ([178.33.107.143]:33985) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cCT-0001mK-GS for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:21 -0400 Received: from player691.ha.ovh.net (unknown [10.109.143.24]) by mo177.mail-out.ovh.net (Postfix) with ESMTP id E4D8B109720 for ; Wed, 4 Sep 2019 22:48:19 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 4AD2C98B28F4; Wed, 4 Sep 2019 20:48:13 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:54 +0200 Message-Id: <20190904204659.13878-11-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2527363817981578001 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 178.33.107.143 Subject: [Qemu-devel] [RFC PATCH 10/15] aspeed/smc: Add support for the AST2600 SoC X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The AST2600 SoC SMC controller is a SPI only controller now and has a few extensions which we will need to take into account when SW requires it. - 4BYTE mode - HCLK divider has changed (SPI Training) - CE0-2 Read Timing Compensation registers This is enough to support u-boot. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/ssi/aspeed_smc.h | 2 + hw/ssi/aspeed_smc.c | 129 +++++++++++++++++++++++++++++++++--- 2 files changed, 123 insertions(+), 8 deletions(-) diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h index 5176ff6bf95f..84f268de3091 100644 --- a/include/hw/ssi/aspeed_smc.h +++ b/include/hw/ssi/aspeed_smc.h @@ -49,6 +49,8 @@ typedef struct AspeedSMCController { hwaddr dma_flash_mask; hwaddr dma_dram_mask; uint32_t nregs; + uint32_t (*segment_to_reg)(const AspeedSegments *seg); + void (*reg_to_segment)(uint32_t reg, AspeedSegments *seg); } AspeedSMCController; =20 typedef struct AspeedSMCFlash { diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c index 9ffc7e01179a..1be53b5e53ac 100644 --- a/hw/ssi/aspeed_smc.c +++ b/hw/ssi/aspeed_smc.c @@ -54,10 +54,8 @@ =20 /* CE Control Register */ #define R_CE_CTRL (0x04 / 4) -#define CTRL_EXTENDED4 4 /* 32 bit addressing for SPI */ -#define CTRL_EXTENDED3 3 /* 32 bit addressing for SPI */ -#define CTRL_EXTENDED2 2 /* 32 bit addressing for SPI */ -#define CTRL_EXTENDED1 1 /* 32 bit addressing for SPI */ + +#define CTRL_4B_AUTOREAD 4 /* 4B address Auto-Read command selectio= n */ #define CTRL_EXTENDED0 0 /* 32 bit addressing for SPI */ =20 /* Interrupt Control and Status Register */ @@ -71,8 +69,11 @@ =20 /* CEx Control Register */ #define R_CTRL0 (0x10 / 4) +#define CTRL_IO_QPI (1 << 31) +#define CTRL_IO_QUAD_DATA (1 << 30) #define CTRL_IO_DUAL_DATA (1 << 29) #define CTRL_IO_DUAL_ADDR_DATA (1 << 28) /* Includes dummies */ +#define CTRL_IO_QUAD_ADDR_DATA (1 << 28) /* Includes dummies */ #define CTRL_CMD_SHIFT 16 #define CTRL_CMD_MASK 0xff #define CTRL_DUMMY_HIGH_SHIFT 14 @@ -84,7 +85,7 @@ #define CTRL_DUMMY_LOW_SHIFT 6 /* 2 bits [7:6] */ #define CTRL_CE_STOP_ACTIVE (1 << 2) #define CTRL_CMD_MODE_MASK 0x3 -#define CTRL_READMODE 0x0 +#define CTRL_READMODE 0x0 /* AST2600: 4BYTE READ */ #define CTRL_FREADMODE 0x1 #define CTRL_WRITEMODE 0x2 #define CTRL_USERMODE 0x3 @@ -135,8 +136,11 @@ =20 /* Misc Control Register #2 */ #define R_TIMINGS (0x94 / 4) +#define R_CE0_READ_TIMING (0x94 / 4) +#define R_CE1_READ_TIMING (0x98 / 4) +#define R_CE2_READ_TIMING (0x9C / 4) =20 -/* SPI controller registers and bits */ +/* AST2400 SPI1 controller registers and bits */ #define R_SPI_CONF (0x00 / 4) #define SPI_CONF_ENABLE_W0 0 #define R_SPI_CTRL0 (0x4 / 4) @@ -212,6 +216,36 @@ static const AspeedSegments aspeed_segments_ast2500_sp= i2[] =3D { { 0x3A000000, 96 * 1024 * 1024 }, /* end address is readonly */ }; =20 +/* + * AST2600 definitions + */ +#define ASPEED26_SOC_FMC_FLASH_BASE 0x20000000 +#define ASPEED26_SOC_SPI_FLASH_BASE 0x30000000 +#define ASPEED26_SOC_SPI2_FLASH_BASE 0x50000000 + +static const AspeedSegments aspeed_segments_ast2600_fmc[] =3D { + { 0x20000000, 128 * 1024 * 1024 }, /* start address is readonly */ + { 0x0, 0 }, /* disabled */ + { 0x0, 0 }, /* disabled */ +}; + +static const AspeedSegments aspeed_segments_ast2600_spi1[] =3D { + { 0x30000000, 128 * 1024 * 1024 }, /* start address is readonly */ + { 0x0, 0 }, /* disabled */ +}; + +static const AspeedSegments aspeed_segments_ast2600_spi2[] =3D { + { 0x50000000, 128 * 1024 * 1024 }, /* start address is readonly */ + { 0x0, 0 }, /* disabled */ + { 0x0, 0 }, /* disabled */ +}; + +static uint32_t aspeed_smc_segment_to_reg(const AspeedSegments *seg); +static void aspeed_smc_reg_to_segment(uint32_t reg, AspeedSegments *seg); + +static uint32_t aspeed_2600_smc_segment_to_reg(const AspeedSegments *seg); +static void aspeed_2600_smc_reg_to_segment(uint32_t reg, AspeedSegments *s= eg); + static const AspeedSMCController controllers[] =3D { { .name =3D "aspeed.smc-ast2400", @@ -226,6 +260,8 @@ static const AspeedSMCController controllers[] =3D { .flash_window_size =3D 0x6000000, .has_dma =3D false, .nregs =3D ASPEED_SMC_R_SMC_MAX, + .segment_to_reg =3D aspeed_smc_segment_to_reg, + .reg_to_segment =3D aspeed_smc_reg_to_segment, }, { .name =3D "aspeed.fmc-ast2400", .r_conf =3D R_CONF, @@ -241,6 +277,8 @@ static const AspeedSMCController controllers[] =3D { .dma_flash_mask =3D 0x0FFFFFFC, .dma_dram_mask =3D 0x1FFFFFFC, .nregs =3D ASPEED_SMC_R_MAX, + .segment_to_reg =3D aspeed_smc_segment_to_reg, + .reg_to_segment =3D aspeed_smc_reg_to_segment, }, { .name =3D "aspeed.spi1-ast2400", .r_conf =3D R_SPI_CONF, @@ -254,6 +292,8 @@ static const AspeedSMCController controllers[] =3D { .flash_window_size =3D 0x10000000, .has_dma =3D false, .nregs =3D ASPEED_SMC_R_SPI_MAX, + .segment_to_reg =3D aspeed_smc_segment_to_reg, + .reg_to_segment =3D aspeed_smc_reg_to_segment, }, { .name =3D "aspeed.fmc-ast2500", .r_conf =3D R_CONF, @@ -269,6 +309,8 @@ static const AspeedSMCController controllers[] =3D { .dma_flash_mask =3D 0x0FFFFFFC, .dma_dram_mask =3D 0x3FFFFFFC, .nregs =3D ASPEED_SMC_R_MAX, + .segment_to_reg =3D aspeed_smc_segment_to_reg, + .reg_to_segment =3D aspeed_smc_reg_to_segment, }, { .name =3D "aspeed.spi1-ast2500", .r_conf =3D R_CONF, @@ -282,6 +324,8 @@ static const AspeedSMCController controllers[] =3D { .flash_window_size =3D 0x8000000, .has_dma =3D false, .nregs =3D ASPEED_SMC_R_MAX, + .segment_to_reg =3D aspeed_smc_segment_to_reg, + .reg_to_segment =3D aspeed_smc_reg_to_segment, }, { .name =3D "aspeed.spi2-ast2500", .r_conf =3D R_CONF, @@ -295,6 +339,53 @@ static const AspeedSMCController controllers[] =3D { .flash_window_size =3D 0x8000000, .has_dma =3D false, .nregs =3D ASPEED_SMC_R_MAX, + .segment_to_reg =3D aspeed_smc_segment_to_reg, + .reg_to_segment =3D aspeed_smc_reg_to_segment, + }, { + .name =3D "aspeed.fmc-ast2600", + .r_conf =3D R_CONF, + .r_ce_ctrl =3D R_CE_CTRL, + .r_ctrl0 =3D R_CTRL0, + .r_timings =3D R_TIMINGS, + .conf_enable_w0 =3D CONF_ENABLE_W0, + .max_slaves =3D 3, + .segments =3D aspeed_segments_ast2600_fmc, + .flash_window_base =3D ASPEED26_SOC_FMC_FLASH_BASE, + .flash_window_size =3D 0x10000000, + .has_dma =3D true, + .nregs =3D ASPEED_SMC_R_MAX, + .segment_to_reg =3D aspeed_2600_smc_segment_to_reg, + .reg_to_segment =3D aspeed_2600_smc_reg_to_segment, + }, { + .name =3D "aspeed.spi1-ast2600", + .r_conf =3D R_CONF, + .r_ce_ctrl =3D R_CE_CTRL, + .r_ctrl0 =3D R_CTRL0, + .r_timings =3D R_TIMINGS, + .conf_enable_w0 =3D CONF_ENABLE_W0, + .max_slaves =3D 2, + .segments =3D aspeed_segments_ast2600_spi1, + .flash_window_base =3D ASPEED26_SOC_SPI_FLASH_BASE, + .flash_window_size =3D 0x10000000, + .has_dma =3D false, + .nregs =3D ASPEED_SMC_R_MAX, + .segment_to_reg =3D aspeed_2600_smc_segment_to_reg, + .reg_to_segment =3D aspeed_2600_smc_reg_to_segment, + }, { + .name =3D "aspeed.spi2-ast2600", + .r_conf =3D R_CONF, + .r_ce_ctrl =3D R_CE_CTRL, + .r_ctrl0 =3D R_CTRL0, + .r_timings =3D R_TIMINGS, + .conf_enable_w0 =3D CONF_ENABLE_W0, + .max_slaves =3D 3, + .segments =3D aspeed_segments_ast2600_spi2, + .flash_window_base =3D ASPEED26_SOC_SPI2_FLASH_BASE, + .flash_window_size =3D 0x10000000, + .has_dma =3D false, + .nregs =3D ASPEED_SMC_R_MAX, + .segment_to_reg =3D aspeed_2600_smc_segment_to_reg, + .reg_to_segment =3D aspeed_2600_smc_reg_to_segment, }, }; =20 @@ -307,7 +398,7 @@ static const AspeedSMCController controllers[] =3D { * | end | start | 0 | 0 | * */ -static inline uint32_t aspeed_smc_segment_to_reg(const AspeedSegments *seg) +static uint32_t aspeed_smc_segment_to_reg(const AspeedSegments *seg) { uint32_t reg =3D 0; reg |=3D ((seg->addr >> 23) & SEG_START_MASK) << SEG_START_SHIFT; @@ -315,12 +406,34 @@ static inline uint32_t aspeed_smc_segment_to_reg(cons= t AspeedSegments *seg) return reg; } =20 -static inline void aspeed_smc_reg_to_segment(uint32_t reg, AspeedSegments = *seg) +static void aspeed_smc_reg_to_segment(uint32_t reg, AspeedSegments *seg) { seg->addr =3D ((reg >> SEG_START_SHIFT) & SEG_START_MASK) << 23; seg->size =3D (((reg >> SEG_END_SHIFT) & SEG_END_MASK) << 23) - seg->a= ddr; } =20 +/* + * AST2600 uses a 1MB unit + */ +static uint32_t aspeed_2600_smc_segment_to_reg(const AspeedSegments *seg) +{ + uint32_t reg =3D 0; + + /* Disabled segments have a nil register */ + if (!seg->addr) { + return 0; + } + reg |=3D (seg->addr >> 20) & 0xffff; + reg |=3D (((seg->addr + seg->size) >> 20) & 0xffff) << 16; + return reg; +} + +static void aspeed_2600_smc_reg_to_segment(uint32_t reg, AspeedSegments *s= eg) +{ + seg->addr =3D (reg & 0xffff) << 20; + seg->size =3D (((reg >> 16) & 0xffff) << 20) - seg->addr; +} + static bool aspeed_smc_flash_overlap(const AspeedSMCState *s, const AspeedSegments *new, int cs) --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567633786; cv=none; d=zoho.com; s=zohoarc; b=l3SwAuCX39/3PJCd5WJFRZeC6jUY7eozngaWAeGuiYg+pKZZ2xC2Z0La2oRuFF1qPIbfUU25Oj/g6oVp8PUvW2oPymX1rglgHK6hK4t2s/wTJjl66AZBsoST0vr88+jZnZ6aZqKjw528Sy1XVlojPezN0JYr/JFiy2Xhv7UH/q8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567633786; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=FHxGs+AAr6Ckwi0TUqFCD6k52ZjVeQzEo1EqhyRuTrc=; b=gQzB84UgrPwDVZfYHhEBVzikOVFJNY2tOgg6N807PkKqWu5iPzrhsen74f4ixzkMAuc0u6nMzry1GPrElE8e+tKCJ0y/abWbXb63+k12y2oJGKOJ+WN9v6SY5kHnTIFEiUFzA8aRqU9gQ1/STQdDH394HjmunnHuBqcj9KFTKmQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567633786688505.6729754759076; Wed, 4 Sep 2019 14:49:46 -0700 (PDT) Received: from localhost ([::1]:40504 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5d9t-00004r-2D for importer@patchew.org; Wed, 04 Sep 2019 17:49:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53716) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cCh-000170-Eu for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cCc-0001s5-62 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:35 -0400 Received: from 4.mo5.mail-out.ovh.net ([178.33.111.247]:44628) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cCb-0001rE-U8 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:30 -0400 Received: from player691.ha.ovh.net (unknown [10.108.35.197]) by mo5.mail-out.ovh.net (Postfix) with ESMTP id 6A8C624BDC4 for ; Wed, 4 Sep 2019 22:48:28 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id E8FDD98B2917; Wed, 4 Sep 2019 20:48:19 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:55 +0200 Message-Id: <20190904204659.13878-12-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2529897094435146513 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 178.33.111.247 Subject: [Qemu-devel] [RFC PATCH 11/15] hw/gpio: Add in AST2600 specific implementation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , qemu-devel@nongnu.org, qemu-arm@nongnu.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , Rashmica Gupta , Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Rashmica Gupta The AST2600 has the same sets of 3.6v gpios as the AST2400 plus an addtional two sets of 1.8V gpios. Signed-off-by: Rashmica Gupta Reviewed-by: C=C3=A9dric Le Goater Signed-off-by: C=C3=A9dric Le Goater --- hw/gpio/aspeed_gpio.c | 142 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 5 deletions(-) diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c index 25fbfec3b84e..196e47c26284 100644 --- a/hw/gpio/aspeed_gpio.c +++ b/hw/gpio/aspeed_gpio.c @@ -169,6 +169,48 @@ #define GPIO_3_6V_MEM_SIZE 0x1F0 #define GPIO_3_6V_REG_ARRAY_SIZE (GPIO_3_6V_MEM_SIZE >> 2) =20 +/* AST2600 only - 1.8V gpios */ +/* + * The AST2600 has same 3.6V gpios as the AST2400 (memory offsets 0x0-0x19= 8) + * and addtional 1.8V gpios (memory offsets 0x800-0x9D4). + */ +#define GPIO_1_8V_REG_OFFSET 0x800 +#define GPIO_1_8V_ABCD_DATA_VALUE ((0x800 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_DIRECTION ((0x804 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_INT_ENABLE ((0x808 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_INT_SENS_0 ((0x80C - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_INT_SENS_1 ((0x810 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_INT_SENS_2 ((0x814 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_INT_STATUS ((0x818 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_RESET_TOLERANT ((0x81C - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_DATA_VALUE ((0x820 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_DIRECTION ((0x824 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_INT_ENABLE ((0x828 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_INT_SENS_0 ((0x82C - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_INT_SENS_1 ((0x830 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_INT_SENS_2 ((0x834 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_INT_STATUS ((0x838 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_RESET_TOLERANT ((0x83C - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_DEBOUNCE_1 ((0x840 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_DEBOUNCE_2 ((0x844 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_DEBOUNCE_1 ((0x848 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_DEBOUNCE_2 ((0x84C - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_DEBOUNCE_TIME_1 ((0x850 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_DEBOUNCE_TIME_2 ((0x854 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_DEBOUNCE_TIME_3 ((0x858 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_COMMAND_SRC_0 ((0x860 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_COMMAND_SRC_1 ((0x864 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_COMMAND_SRC_0 ((0x868 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_COMMAND_SRC_1 ((0x86C - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_DATA_READ ((0x8C0 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_DATA_READ ((0x8C4 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_ABCD_INPUT_MASK ((0x9D0 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_E_INPUT_MASK ((0x9D4 - GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_1_8V_MEM_SIZE 0x9D8 +#define GPIO_1_8V_REG_ARRAY_SIZE ((GPIO_1_8V_MEM_SIZE - \ + GPIO_1_8V_REG_OFFSET) >> 2) +#define GPIO_MAX_MEM_SIZE MAX(GPIO_3_6V_MEM_SIZE, GPIO_1_8V_MEM_= SIZE) + static int aspeed_evaluate_irq(GPIOSets *regs, int gpio_prev_high, int gpi= o) { uint32_t falling_edge =3D 0, rising_edge =3D 0; @@ -465,6 +507,39 @@ static const AspeedGPIOReg aspeed_3_6v_gpios[GPIO_3_6V= _REG_ARRAY_SIZE] =3D { [GPIO_AC_INPUT_MASK] =3D { 7, gpio_reg_input_mask }, }; =20 +static const AspeedGPIOReg aspeed_1_8v_gpios[GPIO_1_8V_REG_ARRAY_SIZE] =3D= { + /* 1.8V Set ABCD */ + [GPIO_1_8V_ABCD_DATA_VALUE] =3D {0, gpio_reg_data_value}, + [GPIO_1_8V_ABCD_DIRECTION] =3D {0, gpio_reg_direction}, + [GPIO_1_8V_ABCD_INT_ENABLE] =3D {0, gpio_reg_int_enable}, + [GPIO_1_8V_ABCD_INT_SENS_0] =3D {0, gpio_reg_int_sens_0}, + [GPIO_1_8V_ABCD_INT_SENS_1] =3D {0, gpio_reg_int_sens_1}, + [GPIO_1_8V_ABCD_INT_SENS_2] =3D {0, gpio_reg_int_sens_2}, + [GPIO_1_8V_ABCD_INT_STATUS] =3D {0, gpio_reg_int_status}, + [GPIO_1_8V_ABCD_RESET_TOLERANT] =3D {0, gpio_reg_reset_tolerant}, + [GPIO_1_8V_ABCD_DEBOUNCE_1] =3D {0, gpio_reg_debounce_1}, + [GPIO_1_8V_ABCD_DEBOUNCE_2] =3D {0, gpio_reg_debounce_2}, + [GPIO_1_8V_ABCD_COMMAND_SRC_0] =3D {0, gpio_reg_cmd_source_0}, + [GPIO_1_8V_ABCD_COMMAND_SRC_1] =3D {0, gpio_reg_cmd_source_1}, + [GPIO_1_8V_ABCD_DATA_READ] =3D {0, gpio_reg_data_read}, + [GPIO_1_8V_ABCD_INPUT_MASK] =3D {0, gpio_reg_input_mask}, + /* 1.8V Set E */ + [GPIO_1_8V_E_DATA_VALUE] =3D {1, gpio_reg_data_value}, + [GPIO_1_8V_E_DIRECTION] =3D {1, gpio_reg_direction}, + [GPIO_1_8V_E_INT_ENABLE] =3D {1, gpio_reg_int_enable}, + [GPIO_1_8V_E_INT_SENS_0] =3D {1, gpio_reg_int_sens_0}, + [GPIO_1_8V_E_INT_SENS_1] =3D {1, gpio_reg_int_sens_1}, + [GPIO_1_8V_E_INT_SENS_2] =3D {1, gpio_reg_int_sens_2}, + [GPIO_1_8V_E_INT_STATUS] =3D {1, gpio_reg_int_status}, + [GPIO_1_8V_E_RESET_TOLERANT] =3D {1, gpio_reg_reset_tolerant}, + [GPIO_1_8V_E_DEBOUNCE_1] =3D {1, gpio_reg_debounce_1}, + [GPIO_1_8V_E_DEBOUNCE_2] =3D {1, gpio_reg_debounce_2}, + [GPIO_1_8V_E_COMMAND_SRC_0] =3D {1, gpio_reg_cmd_source_0}, + [GPIO_1_8V_E_COMMAND_SRC_1] =3D {1, gpio_reg_cmd_source_1}, + [GPIO_1_8V_E_DATA_READ] =3D {1, gpio_reg_data_read}, + [GPIO_1_8V_E_INPUT_MASK] =3D {1, gpio_reg_input_mask}, +}; + static uint64_t aspeed_gpio_read(void *opaque, hwaddr offset, uint32_t siz= e) { AspeedGPIOState *s =3D ASPEED_GPIO(opaque); @@ -663,8 +738,11 @@ static void aspeed_gpio_get_pin(Object *obj, Visitor *= v, const char *name, int set_idx, group_idx =3D 0; =20 if (sscanf(name, "gpio%2[A-Z]%1d", group, &pin) !=3D 2) { - error_setg(errp, "%s: error reading %s", __func__, name); - return; + /* 1.8V gpio */ + if (sscanf(name, "gpio%3s%1d", group, &pin) !=3D 2) { + error_setg(errp, "%s: error reading %s", __func__, name); + return; + } } set_idx =3D get_set_idx(s, group, &group_idx); if (set_idx =3D=3D -1) { @@ -692,8 +770,11 @@ static void aspeed_gpio_set_pin(Object *obj, Visitor *= v, const char *name, return; } if (sscanf(name, "gpio%2[A-Z]%1d", group, &pin) !=3D 2) { - error_setg(errp, "%s: error reading %s", __func__, name); - return; + /* 1.8V gpio */ + if (sscanf(name, "gpio%3s%1d", group, &pin) !=3D 2) { + error_setg(errp, "%s: error reading %s", __func__, name); + return; + } } set_idx =3D get_set_idx(s, group, &group_idx); if (set_idx =3D=3D -1) { @@ -726,6 +807,21 @@ static const GPIOSetProperties ast2500_set_props[] =3D= { [7] =3D {0x000000ff, 0x000000ff, {"AC"} }, }; =20 +static GPIOSetProperties ast2600_3_6v_set_props[] =3D { + [0] =3D {0xffffffff, 0xffffffff, {"A", "B", "C", "D"} }, + [1] =3D {0xffffffff, 0xffffffff, {"E", "F", "G", "H"} }, + [2] =3D {0xffffffff, 0xffffffff, {"I", "J", "K", "L"} }, + [3] =3D {0xffffffff, 0xffffffff, {"M", "N", "O", "P"} }, + [4] =3D {0xffffffff, 0xffffffff, {"Q", "R", "S", "T"} }, + [5] =3D {0xffffffff, 0x0000ffff, {"U", "V", "W", "X"} }, + [6] =3D {0xffff0000, 0x0fff0000, {"Y", "Z", "", ""} }, +}; + +static GPIOSetProperties ast2600_1_8v_set_props[] =3D { + [0] =3D {0xffffffff, 0xffffffff, {"18A", "18B", "18C", "18D"} }, + [1] =3D {0x0000000f, 0x0000000f, {"18E"} }, +}; + static const MemoryRegionOps aspeed_gpio_ops =3D { .read =3D aspeed_gpio_read, .write =3D aspeed_gpio_write, @@ -758,7 +854,7 @@ static void aspeed_gpio_realize(DeviceState *dev, Error= **errp) } =20 memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_gpio_ops, s, - TYPE_ASPEED_GPIO, GPIO_3_6V_MEM_SIZE); + TYPE_ASPEED_GPIO, GPIO_MAX_MEM_SIZE); =20 sysbus_init_mmio(sbd, &s->iomem); } @@ -851,6 +947,26 @@ static void aspeed_gpio_2500_class_init(ObjectClass *k= lass, void *data) agc->reg_table =3D aspeed_3_6v_gpios; } =20 +static void aspeed_gpio_ast2600_3_6v_class_init(ObjectClass *klass, void *= data) +{ + AspeedGPIOClass *agc =3D ASPEED_GPIO_CLASS(klass); + + agc->props =3D ast2600_3_6v_set_props; + agc->nr_gpio_pins =3D 208; + agc->nr_gpio_sets =3D 7; + agc->reg_table =3D aspeed_3_6v_gpios; +} + +static void aspeed_gpio_ast2600_1_8v_class_init(ObjectClass *klass, void *= data) +{ + AspeedGPIOClass *agc =3D ASPEED_GPIO_CLASS(klass); + + agc->props =3D ast2600_1_8v_set_props; + agc->nr_gpio_pins =3D 36; + agc->nr_gpio_sets =3D 2; + agc->reg_table =3D aspeed_1_8v_gpios; +} + static const TypeInfo aspeed_gpio_info =3D { .name =3D TYPE_ASPEED_GPIO, .parent =3D TYPE_SYS_BUS_DEVICE, @@ -874,11 +990,27 @@ static const TypeInfo aspeed_gpio_ast2500_info =3D { .instance_init =3D aspeed_gpio_init, }; =20 +static const TypeInfo aspeed_gpio_ast2600_3_6v_info =3D { + .name =3D TYPE_ASPEED_GPIO "-ast2600", + .parent =3D TYPE_ASPEED_GPIO, + .class_init =3D aspeed_gpio_ast2600_3_6v_class_init, + .instance_init =3D aspeed_gpio_init, +}; + +static const TypeInfo aspeed_gpio_ast2600_1_8v_info =3D { + .name =3D TYPE_ASPEED_GPIO "-ast2600-1_8v", + .parent =3D TYPE_ASPEED_GPIO, + .class_init =3D aspeed_gpio_ast2600_1_8v_class_init, + .instance_init =3D aspeed_gpio_init, +}; + static void aspeed_gpio_register_types(void) { type_register_static(&aspeed_gpio_info); type_register_static(&aspeed_gpio_ast2400_info); type_register_static(&aspeed_gpio_ast2500_info); + type_register_static(&aspeed_gpio_ast2600_3_6v_info); + type_register_static(&aspeed_gpio_ast2600_1_8v_info); } =20 type_init(aspeed_gpio_register_types); --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567634088; cv=none; d=zoho.com; s=zohoarc; b=CkmQ+C/tCmtq/gV1RnMi+mTuWmQPszVn/qtktxB2CwPYff8nS0ILA50YseC8jcj5snMT0vej3Oy2kunw3hhiTkc/7eglnQChsnIsO0/z9LB+DXtHUxeCmBrEuacb8JlbUgFmpdG2ipzfp5NINCW0tQeUyuXZl6FsMELjpRTqgTw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567634088; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=LZt4O4Z64s6XHnNBXhr0A5df6Swtld+esn1etKkP7QU=; b=gSxcYoZmwtEMOJ31+hGXEzQ3X7UZ9cOKZKjpj+jzJkb6lUJb5lMfKm84FmK/2D7Uw6CNAWKwbwPp399iOI+aCPvuMxhnV9/vFZoIdw15lejvqgb9wGgTCcf5vZX9L2kDkUImLjMuOlkSqF5uuDzS7jtC+jdgW0BknJvOnfbVQzE= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567634088051317.6921032994635; Wed, 4 Sep 2019 14:54:48 -0700 (PDT) Received: from localhost ([::1]:40584 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5dEk-0005s9-No for importer@patchew.org; Wed, 04 Sep 2019 17:54:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53783) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cCm-0001Ak-3j for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cCj-0001xW-8E for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:39 -0400 Received: from 8.mo1.mail-out.ovh.net ([178.33.110.239]:42806) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cCi-0001wA-NO for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:36 -0400 Received: from player691.ha.ovh.net (unknown [10.109.160.226]) by mo1.mail-out.ovh.net (Postfix) with ESMTP id DFE3818D83A for ; Wed, 4 Sep 2019 22:48:34 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 4955A98B2950; Wed, 4 Sep 2019 20:48:28 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:56 +0200 Message-Id: <20190904204659.13878-13-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2531585941748615953 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 178.33.110.239 Subject: [Qemu-devel] [RFC PATCH 12/15] aspeed: add support for the AST2600 eval board X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Initial definitions for a simple machine using an AST2600 SoC (Cortex CPU). Differences with the AST2400 and the AST2500 SoCs are handled using the ASPEED_IS_AST2600() macro. This is not optimal but it is not too invasive either. We could modify the model to add custom instance_init and realize handlers in the future. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/arm/aspeed_soc.h | 4 + include/hw/misc/aspeed_scu.h | 1 + hw/arm/aspeed.c | 18 ++++ hw/arm/aspeed_soc.c | 189 ++++++++++++++++++++++++++++++++--- 4 files changed, 197 insertions(+), 15 deletions(-) diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index b427f2668a8a..74db48374531 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -12,6 +12,7 @@ #ifndef ASPEED_SOC_H #define ASPEED_SOC_H =20 +#include "hw/cpu/a15mpcore.h" #include "hw/intc/aspeed_vic.h" #include "hw/misc/aspeed_scu.h" #include "hw/misc/aspeed_sdmc.h" @@ -38,6 +39,7 @@ typedef struct AspeedSoCState { /*< public >*/ ARMCPU cpu[ASPEED_CPUS_NUM]; uint32_t num_cpus; + A15MPPrivState a7mpcore; MemoryRegion sram; AspeedVICState vic; AspeedRtcState rtc; @@ -51,6 +53,7 @@ typedef struct AspeedSoCState { AspeedWDTState wdt[ASPEED_WDTS_NUM]; FTGMAC100State ftgmac100[ASPEED_MACS_NUM]; AspeedGPIOState gpio; + AspeedGPIOState gpio_1_8v; AspeedSDHCIState sdhci; } AspeedSoCState; =20 @@ -97,6 +100,7 @@ enum { ASPEED_SRAM, ASPEED_SDHCI, ASPEED_GPIO, + ASPEED_GPIO_1_8V, ASPEED_RTC, ASPEED_TIMER1, ASPEED_TIMER2, diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h index 1d7f7ffc1598..670804e85f28 100644 --- a/include/hw/misc/aspeed_scu.h +++ b/include/hw/misc/aspeed_scu.h @@ -43,6 +43,7 @@ typedef struct AspeedSCUState { #define AST2600_A0_SILICON_REV 0x05000303U =20 #define ASPEED_IS_AST2500(si_rev) ((((si_rev) >> 24) & 0xff) =3D=3D 0x= 04) +#define ASPEED_IS_AST2600(si_rev) ((((si_rev) >> 24) & 0xff) =3D=3D 0x= 05) =20 extern bool is_supported_silicon_rev(uint32_t silicon_rev); =20 diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c index 03cc0952e8f3..f4f1dd29b011 100644 --- a/hw/arm/aspeed.c +++ b/hw/arm/aspeed.c @@ -88,6 +88,9 @@ struct AspeedBoardState { /* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */ #define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1 =20 +/* AST2600 evb hardware value: (QEMU prototype) */ +#define AST2600_EVB_HW_STRAP1 AST2500_EVB_HW_STRAP1 + /* * The max ram region is for firmwares that scan the address space * with load/store to guess how much RAM the SoC has. @@ -294,6 +297,12 @@ static void ast2500_evb_i2c_init(AspeedBoardState *bmc) i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", = 0x32); } =20 +static void ast2600_evb_i2c_init(AspeedBoardState *bmc) +{ + /* Start with some devices on our I2C busses */ + ast2500_evb_i2c_init(bmc); +} + static void romulus_bmc_i2c_init(AspeedBoardState *bmc) { AspeedSoCState *soc =3D &bmc->soc; @@ -441,6 +450,15 @@ static const AspeedBoardConfig aspeed_boards[] =3D { .num_cs =3D 2, .i2c_init =3D witherspoon_bmc_i2c_init, .ram =3D 512 * MiB, + }, { + .name =3D MACHINE_TYPE_NAME("ast2600-evb"), + .desc =3D "Aspeed AST2600 EVB (Cortex A7)", + .soc_name =3D "ast2600-a0", + .hw_strap1 =3D AST2600_EVB_HW_STRAP1, + .fmc_model =3D "mx25l25635e", + .spi_model =3D "mx25l25635e", + .num_cs =3D 1, + .i2c_init =3D ast2600_evb_i2c_init, }, }; =20 diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 5c5fcb810944..80d7f206004c 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -81,6 +81,38 @@ static const hwaddr aspeed_soc_ast2500_memmap[] =3D { [ASPEED_SDRAM] =3D 0x80000000, }; =20 +static const hwaddr aspeed_soc_ast2600_memmap[] =3D { + [ASPEED_SRAM] =3D 0x10000000, + /* 0x16000000 0x17FFFFFF : AHB BUS do LPC Bus bridge */ + [ASPEED_IOMEM] =3D 0x1E600000, + [ASPEED_PWM] =3D 0x1E610000, + [ASPEED_FMC] =3D 0x1E620000, + [ASPEED_SPI1] =3D 0x1E630000, + [ASPEED_SPI2] =3D 0x1E641000, + [ASPEED_ETH1] =3D 0x1E660000, + [ASPEED_ETH2] =3D 0x1E680000, + [ASPEED_VIC] =3D 0x1E6C0000, + [ASPEED_SDMC] =3D 0x1E6E0000, + [ASPEED_SCU] =3D 0x1E6E2000, + [ASPEED_XDMA] =3D 0x1E6E7000, + [ASPEED_ADC] =3D 0x1E6E9000, + [ASPEED_SDHCI] =3D 0x1E740000, + [ASPEED_GPIO] =3D 0x1E780000, + [ASPEED_GPIO_1_8V] =3D 0x1E780800, + [ASPEED_RTC] =3D 0x1E781000, + [ASPEED_TIMER1] =3D 0x1E782000, + [ASPEED_WDT] =3D 0x1E785000, + [ASPEED_LPC] =3D 0x1E789000, + [ASPEED_IBT] =3D 0x1E789140, + [ASPEED_I2C] =3D 0x1E78A000, + [ASPEED_UART1] =3D 0x1E783000, + [ASPEED_UART5] =3D 0x1E784000, + [ASPEED_VUART] =3D 0x1E787000, + [ASPEED_SDRAM] =3D 0x80000000, +}; + +#define ASPEED_A7MPCORE_ADDR 0x40460000 + static const int aspeed_soc_ast2400_irqmap[] =3D { [ASPEED_UART1] =3D 9, [ASPEED_UART2] =3D 32, @@ -115,6 +147,41 @@ static const int aspeed_soc_ast2400_irqmap[] =3D { =20 #define aspeed_soc_ast2500_irqmap aspeed_soc_ast2400_irqmap =20 +#define ASPEED_SOC_AST2600_MAX_IRQ 128 + +static const int aspeed_soc_ast2600_irqmap[] =3D { + [ASPEED_UART1] =3D 47, + [ASPEED_UART2] =3D 48, + [ASPEED_UART3] =3D 49, + [ASPEED_UART4] =3D 50, + [ASPEED_UART5] =3D 8, + [ASPEED_VUART] =3D 8, + [ASPEED_FMC] =3D 39, + [ASPEED_SDMC] =3D 0, + [ASPEED_SCU] =3D 12, + [ASPEED_XDMA] =3D 6, + [ASPEED_ADC] =3D 46, + [ASPEED_SDHCI] =3D 43, + [ASPEED_GPIO] =3D 40, + [ASPEED_GPIO_1_8V] =3D 11, + [ASPEED_RTC] =3D 13, + [ASPEED_TIMER1] =3D 16, + [ASPEED_TIMER2] =3D 17, + [ASPEED_TIMER3] =3D 18, + [ASPEED_TIMER4] =3D 19, + [ASPEED_TIMER5] =3D 20, + [ASPEED_TIMER6] =3D 21, + [ASPEED_TIMER7] =3D 22, + [ASPEED_TIMER8] =3D 23, + [ASPEED_WDT] =3D 24, + [ASPEED_PWM] =3D 44, + [ASPEED_LPC] =3D 35, + [ASPEED_IBT] =3D 35, /* LPC */ + [ASPEED_I2C] =3D 110, /* 110 -> 125 */ + [ASPEED_ETH1] =3D 2, + [ASPEED_ETH2] =3D 3, +}; + static const AspeedSoCInfo aspeed_socs[] =3D { { .name =3D "ast2400-a1", @@ -136,14 +203,26 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .irqmap =3D aspeed_soc_ast2500_irqmap, .memmap =3D aspeed_soc_ast2500_memmap, .num_cpus =3D 1, + }, { + .name =3D "ast2600-a0", + .cpu_type =3D ARM_CPU_TYPE_NAME("cortex-a7"), + .silicon_rev =3D AST2600_A0_SILICON_REV, + .sram_size =3D 0x10000, + .spis_num =3D 2, + .wdts_num =3D 4, + .irqmap =3D aspeed_soc_ast2600_irqmap, + .memmap =3D aspeed_soc_ast2600_memmap, + .num_cpus =3D 2, }, }; =20 static qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int ctrl) { AspeedSoCClass *sc =3D ASPEED_SOC_GET_CLASS(s); + DeviceState *intc =3D ASPEED_IS_AST2600(sc->info->silicon_rev) ? + DEVICE(&s->a7mpcore) : DEVICE(&s->vic); =20 - return qdev_get_gpio_in(DEVICE(&s->vic), sc->info->irqmap[ctrl]); + return qdev_get_gpio_in(intc, sc->info->irqmap[ctrl]); } =20 static void aspeed_soc_init(Object *obj) @@ -176,8 +255,13 @@ static void aspeed_soc_init(Object *obj) object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu), "hw-prot-key", &error_abort); =20 - sysbus_init_child_obj(obj, "vic", OBJECT(&s->vic), sizeof(s->vic), - TYPE_ASPEED_VIC); + if (ASPEED_IS_AST2600(sc->info->silicon_rev)) { + sysbus_init_child_obj(obj, "a7mpcore", &s->a7mpcore, + sizeof(s->a7mpcore), TYPE_A15MPCORE_PRIV); + } else { + sysbus_init_child_obj(obj, "vic", OBJECT(&s->vic), sizeof(s->vic), + TYPE_ASPEED_VIC); + } =20 sysbus_init_child_obj(obj, "rtc", OBJECT(&s->rtc), sizeof(s->rtc), TYPE_ASPEED_RTC); @@ -233,6 +317,12 @@ static void aspeed_soc_init(Object *obj) sysbus_init_child_obj(obj, "gpio", OBJECT(&s->gpio), sizeof(s->gpio), typename); =20 + if (ASPEED_IS_AST2600(sc->info->silicon_rev)) { + snprintf(typename, sizeof(typename), "aspeed.gpio-%s-1_8v", socnam= e); + sysbus_init_child_obj(obj, "gpio_1_8v", OBJECT(&s->gpio_1_8v), + sizeof(s->gpio_1_8v), typename); + } + sysbus_init_child_obj(obj, "sdc", OBJECT(&s->sdhci), sizeof(s->sdhci), TYPE_ASPEED_SDHCI); =20 @@ -243,6 +333,16 @@ static void aspeed_soc_init(Object *obj) } } =20 +/* + * ASPEED ast2600 has 0xf as cluster ID + * + * http://infocenter.arm.com/help/index.jsp?topic=3D/com.arm.doc.ddi0388e/= CIHEBGFG.html + */ +static uint64_t aspeed_calc_affinity(int cpu) +{ + return (0xf << ARM_AFF1_SHIFT) | cpu; +} + static void aspeed_soc_realize(DeviceState *dev, Error **errp) { int i; @@ -262,6 +362,23 @@ static void aspeed_soc_realize(DeviceState *dev, Error= **errp) =20 /* CPU */ for (i =3D 0; i < s->num_cpus; i++) { + if (ASPEED_IS_AST2600(sc->info->silicon_rev)) { + object_property_set_int(OBJECT(&s->cpu[i]), QEMU_PSCI_CONDUIT_= SMC, + "psci-conduit", &error_abort); + if (s->num_cpus > 1) { + object_property_set_int(OBJECT(&s->cpu[i]), + ASPEED_A7MPCORE_ADDR, + "reset-cbar", &error_abort); + } + object_property_set_int(OBJECT(&s->cpu[i]), aspeed_calc_affini= ty(i), + "mp-affinity", &error_abort); + + /* + * TODO: the secondary CPUs are started and a boot helper + * is needed when using -kernel + */ + } + object_property_set_bool(OBJECT(&s->cpu[i]), true, "realized", &er= r); if (err) { error_propagate(errp, err); @@ -269,6 +386,48 @@ static void aspeed_soc_realize(DeviceState *dev, Error= **errp) } } =20 + /* A7MPCORE */ + if (ASPEED_IS_AST2600(sc->info->silicon_rev)) { + qemu_irq irq; + + object_property_set_int(OBJECT(&s->a7mpcore), s->num_cpus, "num-cp= u", + &error_abort); + object_property_set_int(OBJECT(&s->a7mpcore), + ASPEED_SOC_AST2600_MAX_IRQ + GIC_INTERNAL, + "num-irq", &error_abort); + + object_property_set_bool(OBJECT(&s->a7mpcore), true, "realized", + &error_abort); + sysbus_mmio_map(SYS_BUS_DEVICE(&s->a7mpcore), 0, ASPEED_A7MPCORE_A= DDR); + + for (i =3D 0; i < s->num_cpus; i++) { + SysBusDevice *sbd =3D SYS_BUS_DEVICE(&s->a7mpcore); + DeviceState *d =3D DEVICE(qemu_get_cpu(i)); + + irq =3D qdev_get_gpio_in(d, ARM_CPU_IRQ); + sysbus_connect_irq(sbd, i, irq); + irq =3D qdev_get_gpio_in(d, ARM_CPU_FIQ); + sysbus_connect_irq(sbd, i + s->num_cpus, irq); + irq =3D qdev_get_gpio_in(d, ARM_CPU_VIRQ); + sysbus_connect_irq(sbd, i + 2 * s->num_cpus, irq); + irq =3D qdev_get_gpio_in(d, ARM_CPU_VFIQ); + sysbus_connect_irq(sbd, i + 3 * s->num_cpus, irq); + } + } else { + /* VIC */ + object_property_set_bool(OBJECT(&s->vic), true, "realized", &err); + if (err) { + error_propagate(errp, err); + return; + } + sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, + sc->info->memmap[ASPEED_VIC]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 0, + qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ)); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1, + qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ)); + } + /* SRAM */ memory_region_init_ram(&s->sram, OBJECT(dev), "aspeed.sram", sc->info->sram_size, &err); @@ -287,18 +446,6 @@ static void aspeed_soc_realize(DeviceState *dev, Error= **errp) } sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->info->memmap[ASPEED_SC= U]); =20 - /* VIC */ - object_property_set_bool(OBJECT(&s->vic), true, "realized", &err); - if (err) { - error_propagate(errp, err); - return; - } - sysbus_mmio_map(SYS_BUS_DEVICE(&s->vic), 0, sc->info->memmap[ASPEED_VI= C]); - sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 0, - qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ)); - sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1, - qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ)); - /* RTC */ object_property_set_bool(OBJECT(&s->rtc), true, "realized", &err); if (err) { @@ -433,6 +580,18 @@ static void aspeed_soc_realize(DeviceState *dev, Error= **errp) sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0, aspeed_soc_get_irq(s, ASPEED_GPIO)); =20 + if (ASPEED_IS_AST2600(sc->info->silicon_rev)) { + object_property_set_bool(OBJECT(&s->gpio_1_8v), true, "realized", = &err); + if (err) { + error_propagate(errp, err); + return; + } + sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio_1_8v), 0, + sc->info->memmap[ASPEED_GPIO_1_8V]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio_1_8v), 0, + aspeed_soc_get_irq(s, ASPEED_GPIO_1_8V)); + } + /* SDHCI */ object_property_set_bool(OBJECT(&s->sdhci), true, "realized", &err); if (err) { --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567633932; cv=none; d=zoho.com; s=zohoarc; b=WShkZEk91dUprclboGqg8aepnUBbkY6h4OPFR/98UBsjuq038Aydmu3kFUge7+6V2ejWVo4P4YvUpaShkbGaL6cCjhNuBgsTgp7iNYE+hRyaR+u3SLoG85wiTeFh4bNkKMkrTOkXWf272ujIjittKBKHZacKTZPb8WuaNj2vKD8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567633932; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=80DGmK8yJaQDQ6SpsfBax7lLCFFcXGwSSG2hC3ZeePY=; b=hTSrLjbM5SGn0w0kT5D/S6euzJj8//bt6zRvHWfSf6587FKTrRobPbUnVcuhpRr1mCFCeInNXUhebnhmkxQjmw73SKnI7EfU4dvj9nCbm1Yv1q0y2mEuQyc7Vq6fY8e8hzRB0frQxf3DUtT0+Ww+U04afmoO44Eq49WQCqGA9Bg= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567633932050975.4008085033709; Wed, 4 Sep 2019 14:52:12 -0700 (PDT) Received: from localhost ([::1]:40552 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5dCE-0002il-KP for importer@patchew.org; Wed, 04 Sep 2019 17:52:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53833) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cCu-0001Dm-Bh for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cCt-00023E-27 for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:48 -0400 Received: from 7.mo7.mail-out.ovh.net ([46.105.43.131]:45247) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cCr-00020n-UH for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:46 -0400 Received: from player691.ha.ovh.net (unknown [10.108.54.36]) by mo7.mail-out.ovh.net (Postfix) with ESMTP id 0F36D130B4B for ; Wed, 4 Sep 2019 22:48:42 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id D498398B2998; Wed, 4 Sep 2019 20:48:34 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:57 +0200 Message-Id: <20190904204659.13878-14-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2533556269348457233 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.105.43.131 Subject: [Qemu-devel] [RFC PATCH 13/15] aspeed: Parameterise number of MACs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Joel Stanley To support the ast2600's four MACs allow SoCs to specify the number they have, and create that many. Signed-off-by: Joel Stanley Signed-off-by: C=C3=A9dric Le Goater --- include/hw/arm/aspeed_soc.h | 5 ++++- hw/arm/aspeed_soc.c | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index 74db48374531..30b67a09f13c 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -30,7 +30,7 @@ #define ASPEED_SPIS_NUM 2 #define ASPEED_WDTS_NUM 4 #define ASPEED_CPUS_NUM 2 -#define ASPEED_MACS_NUM 2 +#define ASPEED_MACS_NUM 4 =20 typedef struct AspeedSoCState { /*< private >*/ @@ -67,6 +67,7 @@ typedef struct AspeedSoCInfo { uint64_t sram_size; int spis_num; int wdts_num; + int macs_num; const int *irqmap; const hwaddr *memmap; uint32_t num_cpus; @@ -117,6 +118,8 @@ enum { ASPEED_I2C, ASPEED_ETH1, ASPEED_ETH2, + ASPEED_ETH3, + ASPEED_ETH4, ASPEED_SDRAM, ASPEED_XDMA, }; diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 80d7f206004c..8069de8d5a36 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -90,7 +90,9 @@ static const hwaddr aspeed_soc_ast2600_memmap[] =3D { [ASPEED_SPI1] =3D 0x1E630000, [ASPEED_SPI2] =3D 0x1E641000, [ASPEED_ETH1] =3D 0x1E660000, + [ASPEED_ETH3] =3D 0x1E670000, [ASPEED_ETH2] =3D 0x1E680000, + [ASPEED_ETH4] =3D 0x1E690000, [ASPEED_VIC] =3D 0x1E6C0000, [ASPEED_SDMC] =3D 0x1E6E0000, [ASPEED_SCU] =3D 0x1E6E2000, @@ -190,6 +192,7 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .sram_size =3D 0x8000, .spis_num =3D 1, .wdts_num =3D 2, + .macs_num =3D 2, .irqmap =3D aspeed_soc_ast2400_irqmap, .memmap =3D aspeed_soc_ast2400_memmap, .num_cpus =3D 1, @@ -200,6 +203,7 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .sram_size =3D 0x9000, .spis_num =3D 2, .wdts_num =3D 3, + .macs_num =3D 2, .irqmap =3D aspeed_soc_ast2500_irqmap, .memmap =3D aspeed_soc_ast2500_memmap, .num_cpus =3D 1, @@ -210,6 +214,7 @@ static const AspeedSoCInfo aspeed_socs[] =3D { .sram_size =3D 0x10000, .spis_num =3D 2, .wdts_num =3D 4, + .macs_num =3D 4, .irqmap =3D aspeed_soc_ast2600_irqmap, .memmap =3D aspeed_soc_ast2600_memmap, .num_cpus =3D 2, @@ -305,7 +310,7 @@ static void aspeed_soc_init(Object *obj) OBJECT(&s->scu), &error_abort); } =20 - for (i =3D 0; i < ASPEED_MACS_NUM; i++) { + for (i =3D 0; i < sc->info->macs_num; i++) { sysbus_init_child_obj(obj, "ftgmac100[*]", OBJECT(&s->ftgmac100[i]= ), sizeof(s->ftgmac100[i]), TYPE_FTGMAC100); } --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567634068; cv=none; d=zoho.com; s=zohoarc; b=Ss1kl7TNmmYPtORmf0yJ+s4EgD/DJNr6zZPl7CAzoQ/evgUX5xyXem8KULMl1ipj3de2N7e8IZGe5K/UmteobY0IeD6oB961hjF4pOOYFGSBeu+WrB2Ret/TNCLMqI0wXHQzXXHmm8t2npL/IHNRpi/manIL70RVxlKWywquFTE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567634068; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=64SYxC4DAJluD7/trrMMeg9wpUggJtHSmYyooF6y34A=; b=iDUjBIU1z0iaMadoI8MVJOFrqQKUXhL+xX1j9pHEMc4tKr4buhVjCndL5jgBWvCoeF+p+YuzsYTYIJ2zDN7DeK2Xx+4AYtgg99CD7w8cN4G9NraK6uvNZmNdaxBzQmppm0MGjXH9Qpt6xqXjsE0etwSPXMDKq36LWQCdV0Yhxtc= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567634068109945.518703365063; Wed, 4 Sep 2019 14:54:28 -0700 (PDT) Received: from localhost ([::1]:40582 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5dEQ-0005SE-PV for importer@patchew.org; Wed, 04 Sep 2019 17:54:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53922) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cCy-0001GA-Gt for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cCw-00026K-TF for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:52 -0400 Received: from 20.mo5.mail-out.ovh.net ([91.121.55.239]:40134) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cCw-00024j-8F for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:50 -0400 Received: from player691.ha.ovh.net (unknown [10.108.54.36]) by mo5.mail-out.ovh.net (Postfix) with ESMTP id 9303C24A244 for ; Wed, 4 Sep 2019 22:48:48 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id 09A7998B29E0; Wed, 4 Sep 2019 20:48:42 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:58 +0200 Message-Id: <20190904204659.13878-15-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2535526593377962769 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 91.121.55.239 Subject: [Qemu-devel] [RFC PATCH 14/15] aspeed: add support for the Aspeed MII controller of the AST2600 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The AST2600 SoC has an extra controller to set the PHY registers. Signed-off-by: C=C3=A9dric Le Goater --- include/hw/arm/aspeed_soc.h | 5 ++ include/hw/net/ftgmac100.h | 17 ++++ hw/arm/aspeed_soc.c | 25 ++++++ hw/net/ftgmac100.c | 162 ++++++++++++++++++++++++++++++++++++ 4 files changed, 209 insertions(+) diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index 30b67a09f13c..9e06a6ad4fbd 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -52,6 +52,7 @@ typedef struct AspeedSoCState { AspeedSDMCState sdmc; AspeedWDTState wdt[ASPEED_WDTS_NUM]; FTGMAC100State ftgmac100[ASPEED_MACS_NUM]; + AspeedMiiState mii[ASPEED_MACS_NUM]; AspeedGPIOState gpio; AspeedGPIOState gpio_1_8v; AspeedSDHCIState sdhci; @@ -120,6 +121,10 @@ enum { ASPEED_ETH2, ASPEED_ETH3, ASPEED_ETH4, + ASPEED_MII1, + ASPEED_MII2, + ASPEED_MII3, + ASPEED_MII4, ASPEED_SDRAM, ASPEED_XDMA, }; diff --git a/include/hw/net/ftgmac100.h b/include/hw/net/ftgmac100.h index 94cfe0533297..ab37e7b2b8ae 100644 --- a/include/hw/net/ftgmac100.h +++ b/include/hw/net/ftgmac100.h @@ -66,4 +66,21 @@ typedef struct FTGMAC100State { uint32_t rxdes0_edorr; } FTGMAC100State; =20 +#define TYPE_ASPEED_MII "aspeed-mmi" +#define ASPEED_MII(obj) OBJECT_CHECK(AspeedMiiState, (obj), TYPE_ASPEED_MI= I) + +/* + * AST2600 MII controller + */ +typedef struct AspeedMiiState { + /*< private >*/ + SysBusDevice parent_obj; + + FTGMAC100State *nic; + + MemoryRegion iomem; + uint32_t phycr; + uint32_t phydata; +} AspeedMiiState; + #endif diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index 8069de8d5a36..c3f99849b7f0 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -89,6 +89,10 @@ static const hwaddr aspeed_soc_ast2600_memmap[] =3D { [ASPEED_FMC] =3D 0x1E620000, [ASPEED_SPI1] =3D 0x1E630000, [ASPEED_SPI2] =3D 0x1E641000, + [ASPEED_MII1] =3D 0x1E650000, + [ASPEED_MII2] =3D 0x1E650008, + [ASPEED_MII3] =3D 0x1E650010, + [ASPEED_MII4] =3D 0x1E650018, [ASPEED_ETH1] =3D 0x1E660000, [ASPEED_ETH3] =3D 0x1E670000, [ASPEED_ETH2] =3D 0x1E680000, @@ -313,6 +317,14 @@ static void aspeed_soc_init(Object *obj) for (i =3D 0; i < sc->info->macs_num; i++) { sysbus_init_child_obj(obj, "ftgmac100[*]", OBJECT(&s->ftgmac100[i]= ), sizeof(s->ftgmac100[i]), TYPE_FTGMAC100); + + if (ASPEED_IS_AST2600(sc->info->silicon_rev)) { + sysbus_init_child_obj(obj, "mii[*]", &s->mii[i], sizeof(s->mii= [i]), + TYPE_ASPEED_MII); + object_property_add_const_link(OBJECT(&s->mii[i]), "nic", + OBJECT(&s->ftgmac100[i]), + &error_abort); + } } =20 sysbus_init_child_obj(obj, "xdma", OBJECT(&s->xdma), sizeof(s->xdma), @@ -562,6 +574,19 @@ static void aspeed_soc_realize(DeviceState *dev, Error= **errp) sc->info->memmap[ASPEED_ETH1 + i]); sysbus_connect_irq(SYS_BUS_DEVICE(&s->ftgmac100[i]), 0, aspeed_soc_get_irq(s, ASPEED_ETH1 + i)); + + + if (ASPEED_IS_AST2600(sc->info->silicon_rev)) { + object_property_set_bool(OBJECT(&s->mii[i]), true, "realized", + &err); + if (err) { + error_propagate(errp, err); + return; + } + + sysbus_mmio_map(SYS_BUS_DEVICE(&s->mii[i]), 0, + sc->info->memmap[ASPEED_MII1 + i]); + } } =20 /* XDMA */ diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c index 04c78e85170b..eb8b441461a1 100644 --- a/hw/net/ftgmac100.c +++ b/hw/net/ftgmac100.c @@ -15,6 +15,7 @@ #include "hw/irq.h" #include "hw/net/ftgmac100.h" #include "sysemu/dma.h" +#include "qapi/error.h" #include "qemu/log.h" #include "qemu/module.h" #include "net/checksum.h" @@ -1087,9 +1088,170 @@ static const TypeInfo ftgmac100_info =3D { .class_init =3D ftgmac100_class_init, }; =20 +/* + * AST2600 MII controller + */ +#define ASPEED_MII_PHYCR_FIRE BIT(31) +#define ASPEED_MII_PHYCR_ST_22 BIT(28) +#define ASPEED_MII_PHYCR_OP(x) ((x) & (ASPEED_MII_PHYCR_OP_WRITE | \ + ASPEED_MII_PHYCR_OP_READ)) +#define ASPEED_MII_PHYCR_OP_WRITE BIT(26) +#define ASPEED_MII_PHYCR_OP_READ BIT(27) +#define ASPEED_MII_PHYCR_DATA(x) (x & 0xffff) +#define ASPEED_MII_PHYCR_PHY(x) (((x) >> 21) & 0x1f) +#define ASPEED_MII_PHYCR_REG(x) (((x) >> 16) & 0x1f) + +#define ASPEED_MII_PHYDATA_IDLE BIT(16) + +static void aspeed_mii_transition(AspeedMiiState *s, bool fire) +{ + if (fire) { + s->phycr |=3D ASPEED_MII_PHYCR_FIRE; + s->phydata &=3D ~ASPEED_MII_PHYDATA_IDLE; + } else { + s->phycr &=3D ~ASPEED_MII_PHYCR_FIRE; + s->phydata |=3D ASPEED_MII_PHYDATA_IDLE; + } +} + +static void aspeed_mii_do_phy_ctl(AspeedMiiState *s) +{ + uint8_t reg; + uint16_t data; + + if (!(s->phycr & ASPEED_MII_PHYCR_ST_22)) { + aspeed_mii_transition(s, !ASPEED_MII_PHYCR_FIRE); + qemu_log_mask(LOG_UNIMP, "%s: unsupported ST code\n", __func__); + return; + } + + /* Nothing to do */ + if (!(s->phycr & ASPEED_MII_PHYCR_FIRE)) { + return; + } + + reg =3D ASPEED_MII_PHYCR_REG(s->phycr); + data =3D ASPEED_MII_PHYCR_DATA(s->phycr); + + switch (ASPEED_MII_PHYCR_OP(s->phycr)) { + case ASPEED_MII_PHYCR_OP_WRITE: + do_phy_write(s->nic, reg, data); + break; + case ASPEED_MII_PHYCR_OP_READ: + s->phydata =3D (s->phydata & ~0xffff) | do_phy_read(s->nic, reg); + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid OP code %08x\n", + __func__, s->phycr); + } + + aspeed_mii_transition(s, !ASPEED_MII_PHYCR_FIRE); +} + +static uint64_t aspeed_mii_read(void *opaque, hwaddr addr, unsigned size) +{ + AspeedMiiState *s =3D ASPEED_MII(opaque); + + switch (addr) { + case 0x0: + return s->phycr; + case 0x4: + return s->phydata; + default: + g_assert_not_reached(); + } +} + +static void aspeed_mii_write(void *opaque, hwaddr addr, + uint64_t value, unsigned size) +{ + AspeedMiiState *s =3D ASPEED_MII(opaque); + + switch (addr) { + case 0x0: + s->phycr =3D value & ~(s->phycr & ASPEED_MII_PHYCR_FIRE); + break; + case 0x4: + s->phydata =3D value & ~(0xffff | ASPEED_MII_PHYDATA_IDLE); + break; + default: + g_assert_not_reached(); + } + + aspeed_mii_transition(s, !!(s->phycr & ASPEED_MII_PHYCR_FIRE)); + aspeed_mii_do_phy_ctl(s); +} + +static const MemoryRegionOps aspeed_mii_ops =3D { + .read =3D aspeed_mii_read, + .write =3D aspeed_mii_write, + .valid.min_access_size =3D 4, + .valid.max_access_size =3D 4, + .endianness =3D DEVICE_LITTLE_ENDIAN, +}; + +static void aspeed_mii_reset(DeviceState *dev) +{ + AspeedMiiState *s =3D ASPEED_MII(dev); + + s->phycr =3D 0; + s->phydata =3D 0; + + aspeed_mii_transition(s, !!(s->phycr & ASPEED_MII_PHYCR_FIRE)); +}; + +static void aspeed_mii_realize(DeviceState *dev, Error **errp) +{ + AspeedMiiState *s =3D ASPEED_MII(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + Object *obj; + Error *local_err =3D NULL; + + obj =3D object_property_get_link(OBJECT(dev), "nic", &local_err); + if (!obj) { + error_propagate(errp, local_err); + error_prepend(errp, "required link 'nic' not found: "); + return; + } + + s->nic =3D FTGMAC100(obj); + + memory_region_init_io(&s->iomem, OBJECT(dev), &aspeed_mii_ops, s, + TYPE_ASPEED_MII, 0x8); + sysbus_init_mmio(sbd, &s->iomem); +} + +static const VMStateDescription vmstate_aspeed_mii =3D { + .name =3D TYPE_ASPEED_MII, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(phycr, FTGMAC100State), + VMSTATE_UINT32(phydata, FTGMAC100State), + VMSTATE_END_OF_LIST() + } +}; +static void aspeed_mii_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->vmsd =3D &vmstate_aspeed_mii; + dc->reset =3D aspeed_mii_reset; + dc->realize =3D aspeed_mii_realize; + dc->desc =3D "Aspeed MII controller"; +} + +static const TypeInfo aspeed_mii_info =3D { + .name =3D TYPE_ASPEED_MII, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(AspeedMiiState), + .class_init =3D aspeed_mii_class_init, +}; + static void ftgmac100_register_types(void) { type_register_static(&ftgmac100_info); + type_register_static(&aspeed_mii_info); } =20 type_init(ftgmac100_register_types) --=20 2.21.0 From nobody Mon Apr 29 11:20:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1567633029; cv=none; d=zoho.com; s=zohoarc; b=ALoixMIrMzDrWWSx2OUGFnxbpg4Tv7WfuPzN0Kl4M5Tn0Q1FV7u95rggH3k4yR7M5qtH6tXEfqVgdeWFUnWWXZ4Hc6ZJPh4WTXyzTWx8kW+oWNbsV3wdDKcwpIterMwrmuZJAQu7lpUQuzyK7W27OdIDfQQkJ8sFQ4W1BdWPJ48= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1567633029; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=AQ2W/wn5zzSquA+AEb7r6H1Zqtx7Tq0Ndz2XW/gYuWc=; b=C1NVVgrioyTMhp+UnSGhKbbWhGPfFc+r8dIpjEzonC4Mo6uyIhEZN7cqRJpYSqsVTIR8REJbQqcLcr8G9J8BBoICmn6wk2xrAe/icp2Ic44Bt2B/U5JPvNqJy6Gc2H8VAlgcClRbljtnfx/GrZTUiYoIXPj92g0U34g/UpZbONk= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1567633029848261.2289780888626; Wed, 4 Sep 2019 14:37:09 -0700 (PDT) Received: from localhost ([::1]:40308 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cxg-00034E-8g for importer@patchew.org; Wed, 04 Sep 2019 17:37:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53986) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i5cD4-0001MB-NH for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i5cD3-0002AY-DZ for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:58 -0400 Received: from 1.mo173.mail-out.ovh.net ([178.33.111.180]:60614) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1i5cD3-00029t-7q for qemu-devel@nongnu.org; Wed, 04 Sep 2019 16:48:57 -0400 Received: from player691.ha.ovh.net (unknown [10.109.146.53]) by mo173.mail-out.ovh.net (Postfix) with ESMTP id 5E4B4117E70 for ; Wed, 4 Sep 2019 22:48:56 +0200 (CEST) Received: from kaod.org (lfbn-1-2240-157.w90-76.abo.wanadoo.fr [90.76.60.157]) (Authenticated sender: clg@kaod.org) by player691.ha.ovh.net (Postfix) with ESMTPSA id CCAF698B2A19; Wed, 4 Sep 2019 20:48:49 +0000 (UTC) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: Peter Maydell Date: Wed, 4 Sep 2019 22:46:59 +0200 Message-Id: <20190904204659.13878-16-clg@kaod.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190904204659.13878-1-clg@kaod.org> References: <20190904204659.13878-1-clg@kaod.org> MIME-Version: 1.0 X-Ovh-Tracer-Id: 2537778391939910417 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgeduvddrudejhedgudehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 178.33.111.180 Subject: [Qemu-devel] [RFC PATCH 15/15] aspeed/soc: Add ASPEED Video stub X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Jeffery , =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-arm@nongnu.org, qemu-devel@nongnu.org, Joel Stanley Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Joel Stanley Signed-off-by: Joel Stanley Signed-off-by: C=C3=A9dric Le Goater --- include/hw/arm/aspeed_soc.h | 1 + hw/arm/aspeed_soc.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h index 9e06a6ad4fbd..ef5b93e5e9cf 100644 --- a/include/hw/arm/aspeed_soc.h +++ b/include/hw/arm/aspeed_soc.h @@ -99,6 +99,7 @@ enum { ASPEED_SDMC, ASPEED_SCU, ASPEED_ADC, + ASPEED_VIDEO, ASPEED_SRAM, ASPEED_SDHCI, ASPEED_GPIO, diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c index c3f99849b7f0..b9da49e16f2d 100644 --- a/hw/arm/aspeed_soc.c +++ b/hw/arm/aspeed_soc.c @@ -102,6 +102,7 @@ static const hwaddr aspeed_soc_ast2600_memmap[] =3D { [ASPEED_SCU] =3D 0x1E6E2000, [ASPEED_XDMA] =3D 0x1E6E7000, [ASPEED_ADC] =3D 0x1E6E9000, + [ASPEED_VIDEO] =3D 0x1E700000, [ASPEED_SDHCI] =3D 0x1E740000, [ASPEED_GPIO] =3D 0x1E780000, [ASPEED_GPIO_1_8V] =3D 0x1E780800, @@ -371,6 +372,10 @@ static void aspeed_soc_realize(DeviceState *dev, Error= **errp) create_unimplemented_device("aspeed_soc.io", sc->info->memmap[ASPEED_I= OMEM], ASPEED_SOC_IOMEM_SIZE); =20 + /* Video engine stub */ + create_unimplemented_device("aspeed.video", sc->info->memmap[ASPEED_VI= DEO], + 0x1000); + if (s->num_cpus > sc->info->num_cpus) { warn_report("%s: invalid number of CPUs %d, using default %d", sc->info->name, s->num_cpus, sc->info->num_cpus); --=20 2.21.0