From nobody Wed May  7 20:44:57 2025
Delivered-To: importer@patchew.org
Authentication-Results: mx.zohomail.com;
	dkim=pass;
	spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as
 permitted sender)
  smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org;
	dmarc=pass(p=none dis=none)  header.from=linaro.org
ARC-Seal: i=1; a=rsa-sha256; t=1614968778; cv=none;
	d=zohomail.com; s=zohoarc;
	b=SuqsSa4D2rnT/mKGfjSputwO1Kbuvk0yM3G3bQh1F46RdhbZ8KwQNM0AWbmGENXCj7BBe6hoqWug96eukJN+lm8NL/Dh8B9TZC+BEoTYArjbFmnHrm7eccReJE7hGO6rMOvzXHUZowsTIaJNQYKUG3ZamPafIfnfsuZW7RiRD+E=
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com;
 s=zohoarc;
	t=1614968778;
 h=Content-Transfer-Encoding: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;
	bh=zN+8aIt/w5r/Xv2DEI+FzEndZfrlw2WjLwXrcd/0mHs=;
	b=Vc1M2SxnOuudiSZ1zl0t8MHTKHpwGzVDwfi8RX/caKSNV0w/hfeHJi5gnHRAsrXjTw4O8nxD/LMkemA8Nt2iVXWcumDVcc1bIsuu9VLsGqoirvU7YmNH8wKhlFumbCAtfQyomEqivZIkmNfUIhgDocpurdNHIpF5iLRV/F4j1sY=
ARC-Authentication-Results: i=1; mx.zohomail.com;
	dkim=pass;
	spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as
 permitted sender)
  smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org;
	dmarc=pass header.from=<peter.maydell@linaro.org> (p=none dis=none)
 header.from=<peter.maydell@linaro.org>
Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org>
Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by
 mx.zohomail.com
	with SMTPS id 161496877844817.400159068161884;
 Fri, 5 Mar 2021 10:26:18 -0800 (PST)
Received: from localhost ([::1]:50990 helo=lists1p.gnu.org)
	by lists.gnu.org with esmtp (Exim 4.90_1)
	(envelope-from <qemu-devel-bounces+importer=patchew.org@nongnu.org>)
	id 1lIF9V-0004XU-B4
	for importer@patchew.org; Fri, 05 Mar 2021 13:26:17 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:38616)
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <peter.maydell@linaro.org>)
 id 1lIE3s-0007PT-1b
 for qemu-devel@nongnu.org; Fri, 05 Mar 2021 12:16:32 -0500
Received: from mail-wm1-x343.google.com ([2a00:1450:4864:20::343]:33683)
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <peter.maydell@linaro.org>)
 id 1lIE3M-0007jk-Ey
 for qemu-devel@nongnu.org; Fri, 05 Mar 2021 12:16:23 -0500
Received: by mail-wm1-x343.google.com with SMTP id
 w203-20020a1c49d40000b029010c706d0642so6357983wma.0
 for <qemu-devel@nongnu.org>; Fri, 05 Mar 2021 09:15:49 -0800 (PST)
Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148])
 by smtp.gmail.com with ESMTPSA id m132sm5942357wmf.45.2021.03.05.09.15.47
 for <qemu-devel@nongnu.org>
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Fri, 05 Mar 2021 09:15:48 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google;
 h=from:to:subject:date:message-id:in-reply-to:references:mime-version
 :content-transfer-encoding;
 bh=zN+8aIt/w5r/Xv2DEI+FzEndZfrlw2WjLwXrcd/0mHs=;
 b=gB3tXhm8xtDkNCqo+2gCjPCdzqVcDozlVCLjv5i95LsAfbM7D4wmDZIdSlpQhqjd0e
 LQLxli+t+N0yS7rp2ER/8S/6vJRIln2TlXq3O5twyXvz9vYmCRvpEI1KCGuLG5yd7gk2
 g3ZvhtrL9GxY5GCKsleCrn0t4XCNcc5sd/um0y9DNfDEmLa2zbr69gFN93KMWSKhP5Cj
 dmdVe24nO6w6tXYdJ3dOzMmhmY+615IjTJJFvDQCPA3DzHk19OaZufpa4fJCb3tJCysp
 OsjBSiHE1eD5LYhdNX+9ihnaHRhhbjw0MxhjvPa8P2nkGQIF70R6oPIv3S3mf2ZMGhl1
 /zTw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to
 :references:mime-version:content-transfer-encoding;
 bh=zN+8aIt/w5r/Xv2DEI+FzEndZfrlw2WjLwXrcd/0mHs=;
 b=KtYyskznOj07vWjLXHlimY4m+ql53ip6WIF2hh0HAQoCtKu+tCHzxX4VuorX3Cx2QR
 SKj93bKS1S2j4X//KX4T02GQtwoJmueAa900dWFqyh3R4sLWnjIbXYfpq3YfG7hD5gpp
 6+tgEXMb1G9pagy7U2MD6sUWn49pj/80v+qIBk2+jbPc8aKWdGZgryMXVYkZGZRojiWT
 msRcU6+eHxLgeTWA6OUfGmjzgU0B1dtI9/aE54vHJ09ap8bnvAYk1WEvfE0Jdkh85AKJ
 cFe1nmjF4lyfna4ZSgzhzj2YuQihcFQMP2UsFYYYUkSf1HKvJrjvP1YkFhjd79CSs3LF
 O1SA==
X-Gm-Message-State: AOAM533oloywsdG1DTrF93gAnP3UFS77dNLctFNyKc5nSco62MncvD9V
 f+4PYDdbhqyGqKE1blQl9ZeKEpcouO8Uzg==
X-Google-Smtp-Source: 
 ABdhPJwA8MNx3vh1ZD7TGR8q5MH9lchR6pmYc5fB7f2rTchWELBvhHkZIqIssd7PnX29/aEJjaCdYA==
X-Received: by 2002:a1c:1bc7:: with SMTP id
 b190mr9941619wmb.115.1614964548429;
 Fri, 05 Mar 2021 09:15:48 -0800 (PST)
From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PULL 45/49] hw/arm/mps2-tz: Add new mps3-an524 board
Date: Fri,  5 Mar 2021 17:15:11 +0000
Message-Id: <20210305171515.1038-46-peter.maydell@linaro.org>
X-Mailer: git-send-email 2.20.1
In-Reply-To: <20210305171515.1038-1-peter.maydell@linaro.org>
References: <20210305171515.1038-1-peter.maydell@linaro.org>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Received-SPF: pass (zohomail.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;
Received-SPF: pass client-ip=2a00:1450:4864:20::343;
 envelope-from=peter.maydell@linaro.org; helo=mail-wm1-x343.google.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,
 RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-BeenThere: qemu-devel@nongnu.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: <qemu-devel.nongnu.org>
List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>,
 <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>
List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel>
List-Post: <mailto:qemu-devel@nongnu.org>
List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help>
List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>,
 <mailto:qemu-devel-request@nongnu.org?subject=subscribe>
Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org
Sender: "Qemu-devel" <qemu-devel-bounces+importer=patchew.org@nongnu.org>
X-ZohoMail-DKIM: pass (identity @linaro.org)
Content-Type: text/plain; charset="utf-8"

Add support for the mps3-an524 board; this is an SSE-200 based FPGA
image, like the existing mps2-an521.  It has a usefully larger amount
of RAM, and a PL031 RTC, as well as some more minor differences.

In real hardware this image runs on a newer generation of the FPGA
board, the MPS3 rather than the older MPS2.  Architecturally the two
boards are similar, so we implement the MPS3 boards in the mps2-tz.c
file as variations of the existing MPS2 boards.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20210215115138.20465-21-peter.maydell@linaro.org
---
 hw/arm/mps2-tz.c | 139 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 135 insertions(+), 4 deletions(-)

diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
index 4dfd9a3aa52..baeb684d9d0 100644
--- a/hw/arm/mps2-tz.c
+++ b/hw/arm/mps2-tz.c
@@ -16,6 +16,7 @@
  * This source file covers the following FPGA images, for TrustZone cores:
  *  "mps2-an505" -- Cortex-M33 as documented in ARM Application Note AN505
  *  "mps2-an521" -- Dual Cortex-M33 as documented in Application Note AN521
+ *  "mps2-an524" -- Dual Cortex-M33 as documented in Application Note AN524
  *
  * Links to the TRM for the board itself and to the various Application
  * Notes which document the FPGA images can be found here:
@@ -27,11 +28,13 @@
  * http://infocenter.arm.com/help/topic/com.arm.doc.dai0505b/index.html
  * Application Note AN521:
  * http://infocenter.arm.com/help/topic/com.arm.doc.dai0521c/index.html
+ * Application Note AN524:
+ * https://developer.arm.com/documentation/dai0524/latest/
  *
  * The AN505 defers to the Cortex-M33 processor ARMv8M IoT Kit FVP User Gu=
ide
  * (ARM ECM0601256) for the details of some of the device layout:
  *   http://infocenter.arm.com/help/index.jsp?topic=3D/com.arm.doc.ecm0601=
256/index.html
- * Similarly, the AN521 uses the SSE-200, and the SSE-200 TRM defines
+ * Similarly, the AN521 and AN524 use the SSE-200, and the SSE-200 TRM def=
ines
  * most of the device layout:
  *  http://infocenter.arm.com/help/topic/com.arm.doc.101104_0100_00_en/cor=
elink_sse200_subsystem_for_embedded_technical_reference_manual_101104_0100_=
00_en.pdf
  *
@@ -65,12 +68,13 @@
 #include "hw/qdev-clock.h"
 #include "qom/object.h"
=20
-#define MPS2TZ_NUMIRQ_MAX 92
+#define MPS2TZ_NUMIRQ_MAX 95
 #define MPS2TZ_RAM_MAX 4
=20
 typedef enum MPS2TZFPGAType {
     FPGA_AN505,
     FPGA_AN521,
+    FPGA_AN524,
 } MPS2TZFPGAType;
=20
 /*
@@ -121,13 +125,15 @@ struct MPS2TZMachineState {
     TZPPC ppc[5];
     TZMPC mpc[3];
     PL022State spi[5];
-    ArmSbconI2CState i2c[4];
+    ArmSbconI2CState i2c[5];
     UnimplementedDeviceState i2s_audio;
     UnimplementedDeviceState gpio[4];
     UnimplementedDeviceState gfx;
+    UnimplementedDeviceState cldc;
+    UnimplementedDeviceState rtc;
     PL080State dma[4];
     TZMSC msc[4];
-    CMSDKAPBUART uart[5];
+    CMSDKAPBUART uart[6];
     SplitIRQ sec_resp_splitter;
     qemu_or_irq uart_irq_orgate;
     DeviceState *lan9118;
@@ -139,6 +145,7 @@ struct MPS2TZMachineState {
 #define TYPE_MPS2TZ_MACHINE "mps2tz"
 #define TYPE_MPS2TZ_AN505_MACHINE MACHINE_TYPE_NAME("mps2-an505")
 #define TYPE_MPS2TZ_AN521_MACHINE MACHINE_TYPE_NAME("mps2-an521")
+#define TYPE_MPS3TZ_AN524_MACHINE MACHINE_TYPE_NAME("mps3-an524")
=20
 OBJECT_DECLARE_TYPE(MPS2TZMachineState, MPS2TZMachineClass, MPS2TZ_MACHINE)
=20
@@ -151,6 +158,15 @@ static const uint32_t an505_oscclk[] =3D {
     25000000,
 };
=20
+static const uint32_t an524_oscclk[] =3D {
+    24000000,
+    32000000,
+    50000000,
+    50000000,
+    24576000,
+    23750000,
+};
+
 static const RAMInfo an505_raminfo[] =3D { {
         .name =3D "ssram-0",
         .base =3D 0x00000000,
@@ -188,6 +204,37 @@ static const RAMInfo an505_raminfo[] =3D { {
     },
 };
=20
+static const RAMInfo an524_raminfo[] =3D { {
+        .name =3D "bram",
+        .base =3D 0x00000000,
+        .size =3D 512 * KiB,
+        .mpc =3D 0,
+        .mrindex =3D 0,
+    }, {
+        .name =3D "sram",
+        .base =3D 0x20000000,
+        .size =3D 32 * 4 * KiB,
+        .mpc =3D 1,
+        .mrindex =3D 1,
+    }, {
+        /* We don't model QSPI flash yet; for now expose it as simple ROM =
*/
+        .name =3D "QSPI",
+        .base =3D 0x28000000,
+        .size =3D 8 * MiB,
+        .mpc =3D 1,
+        .mrindex =3D 2,
+        .flags =3D IS_ROM,
+    }, {
+        .name =3D "DDR",
+        .base =3D 0x60000000,
+        .size =3D 2 * GiB,
+        .mpc =3D 2,
+        .mrindex =3D -1,
+    }, {
+        .name =3D NULL,
+    },
+};
+
 static const RAMInfo *find_raminfo_for_mpc(MPS2TZMachineState *mms, int mp=
c)
 {
     MPS2TZMachineClass *mmc =3D MPS2TZ_MACHINE_GET_CLASS(mms);
@@ -717,12 +764,66 @@ static void mps2tz_common_init(MachineState *machine)
         },
     };
=20
+    const PPCInfo an524_ppcs[] =3D { {
+            .name =3D "apb_ppcexp0",
+            .ports =3D {
+                { "bram-mpc", make_mpc, &mms->mpc[0], 0x58007000, 0x1000 },
+                { "qspi-mpc", make_mpc, &mms->mpc[1], 0x58008000, 0x1000 },
+                { "ddr-mpc", make_mpc, &mms->mpc[2], 0x58009000, 0x1000 },
+            },
+        }, {
+            .name =3D "apb_ppcexp1",
+            .ports =3D {
+                { "i2c0", make_i2c, &mms->i2c[0], 0x41200000, 0x1000 },
+                { "i2c1", make_i2c, &mms->i2c[1], 0x41201000, 0x1000 },
+                { "spi0", make_spi, &mms->spi[0], 0x41202000, 0x1000, { 52=
 } },
+                { "spi1", make_spi, &mms->spi[1], 0x41203000, 0x1000, { 53=
 } },
+                { "spi2", make_spi, &mms->spi[2], 0x41204000, 0x1000, { 54=
 } },
+                { "i2c2", make_i2c, &mms->i2c[2], 0x41205000, 0x1000 },
+                { "i2c3", make_i2c, &mms->i2c[3], 0x41206000, 0x1000 },
+                { /* port 7 reserved */ },
+                { "i2c4", make_i2c, &mms->i2c[4], 0x41208000, 0x1000 },
+            },
+        }, {
+            .name =3D "apb_ppcexp2",
+            .ports =3D {
+                { "scc", make_scc, &mms->scc, 0x41300000, 0x1000 },
+                { "i2s-audio", make_unimp_dev, &mms->i2s_audio,
+                  0x41301000, 0x1000 },
+                { "fpgaio", make_fpgaio, &mms->fpgaio, 0x41302000, 0x1000 =
},
+                { "uart0", make_uart, &mms->uart[0], 0x41303000, 0x1000, {=
 32, 33, 42 } },
+                { "uart1", make_uart, &mms->uart[1], 0x41304000, 0x1000, {=
 34, 35, 43 } },
+                { "uart2", make_uart, &mms->uart[2], 0x41305000, 0x1000, {=
 36, 37, 44 } },
+                { "uart3", make_uart, &mms->uart[3], 0x41306000, 0x1000, {=
 38, 39, 45 } },
+                { "uart4", make_uart, &mms->uart[4], 0x41307000, 0x1000, {=
 40, 41, 46 } },
+                { "uart5", make_uart, &mms->uart[5], 0x41308000, 0x1000, {=
 124, 125, 126 } },
+
+                { /* port 9 reserved */ },
+                { "clcd", make_unimp_dev, &mms->cldc, 0x4130a000, 0x1000 },
+                { "rtc", make_unimp_dev, &mms->rtc, 0x4130b000, 0x1000 },
+            },
+        }, {
+            .name =3D "ahb_ppcexp0",
+            .ports =3D {
+                { "gpio0", make_unimp_dev, &mms->gpio[0], 0x41100000, 0x10=
00 },
+                { "gpio1", make_unimp_dev, &mms->gpio[1], 0x41101000, 0x10=
00 },
+                { "gpio2", make_unimp_dev, &mms->gpio[2], 0x41102000, 0x10=
00 },
+                { "gpio3", make_unimp_dev, &mms->gpio[3], 0x41103000, 0x10=
00 },
+                { "eth", make_eth_dev, NULL, 0x41400000, 0x100000, { 48 } =
},
+            },
+        },
+    };
+
     switch (mmc->fpga_type) {
     case FPGA_AN505:
     case FPGA_AN521:
         ppcs =3D an505_ppcs;
         num_ppcs =3D ARRAY_SIZE(an505_ppcs);
         break;
+    case FPGA_AN524:
+        ppcs =3D an524_ppcs;
+        num_ppcs =3D ARRAY_SIZE(an524_ppcs);
+        break;
     default:
         g_assert_not_reached();
     }
@@ -900,6 +1001,29 @@ static void mps2tz_an521_class_init(ObjectClass *oc, =
void *data)
     mps2tz_set_default_ram_info(mmc);
 }
=20
+static void mps3tz_an524_class_init(ObjectClass *oc, void *data)
+{
+    MachineClass *mc =3D MACHINE_CLASS(oc);
+    MPS2TZMachineClass *mmc =3D MPS2TZ_MACHINE_CLASS(oc);
+
+    mc->desc =3D "ARM MPS3 with AN524 FPGA image for dual Cortex-M33";
+    mc->default_cpus =3D 2;
+    mc->min_cpus =3D mc->default_cpus;
+    mc->max_cpus =3D mc->default_cpus;
+    mmc->fpga_type =3D FPGA_AN524;
+    mc->default_cpu_type =3D ARM_CPU_TYPE_NAME("cortex-m33");
+    mmc->scc_id =3D 0x41045240;
+    mmc->sysclk_frq =3D 32 * 1000 * 1000; /* 32MHz */
+    mmc->oscclk =3D an524_oscclk;
+    mmc->len_oscclk =3D ARRAY_SIZE(an524_oscclk);
+    mmc->fpgaio_num_leds =3D 10;
+    mmc->fpgaio_has_switches =3D true;
+    mmc->numirq =3D 95;
+    mmc->raminfo =3D an524_raminfo;
+    mmc->armsse_type =3D TYPE_SSE200;
+    mps2tz_set_default_ram_info(mmc);
+}
+
 static const TypeInfo mps2tz_info =3D {
     .name =3D TYPE_MPS2TZ_MACHINE,
     .parent =3D TYPE_MACHINE,
@@ -925,11 +1049,18 @@ static const TypeInfo mps2tz_an521_info =3D {
     .class_init =3D mps2tz_an521_class_init,
 };
=20
+static const TypeInfo mps3tz_an524_info =3D {
+    .name =3D TYPE_MPS3TZ_AN524_MACHINE,
+    .parent =3D TYPE_MPS2TZ_MACHINE,
+    .class_init =3D mps3tz_an524_class_init,
+};
+
 static void mps2tz_machine_init(void)
 {
     type_register_static(&mps2tz_info);
     type_register_static(&mps2tz_an505_info);
     type_register_static(&mps2tz_an521_info);
+    type_register_static(&mps3tz_an524_info);
 }
=20
 type_init(mps2tz_machine_init);
--=20
2.20.1