From nobody Sat Nov 8 10:41:10 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1550149834860682.3923338961746; Thu, 14 Feb 2019 05:10:34 -0800 (PST) Received: from localhost ([127.0.0.1]:48352 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1guGmZ-0001FA-OJ for importer@patchew.org; Thu, 14 Feb 2019 08:10:27 -0500 Received: from eggs.gnu.org ([209.51.188.92]:49748) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1guGeN-0002vd-KB for qemu-devel@nongnu.org; Thu, 14 Feb 2019 08:02:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1guGUe-000723-Hv for qemu-devel@nongnu.org; Thu, 14 Feb 2019 07:51:58 -0500 Received: from mail-wm1-x333.google.com ([2a00:1450:4864:20::333]:37877) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1guGUe-0006dE-6T for qemu-devel@nongnu.org; Thu, 14 Feb 2019 07:51:56 -0500 Received: by mail-wm1-x333.google.com with SMTP id x10so5926348wmg.2 for ; Thu, 14 Feb 2019 04:51:22 -0800 (PST) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id j3sm1488073wmb.39.2019.02.14.04.51.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 Feb 2019 04:51:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Cmk9snjFVJivgWjfslWczIKV+LYGTGnCXg+808OCaPc=; b=pwjEot2G4mDp5+2iW28i7Yv7SsC4jJynE6iVdbEo1j5O6VBAx3BbcTAN2Q11Dn7+nd SnxSF782kJIcjiIaUNZYB3ZajyD4v6sUDzG52IusTqocbK4b32LXwFXugXgue2G+rxWX Xg4XpKOQt9gHOB/HEFOcrBFyEaRNK5IwRTJhfL6O4EiEs3pLYi07OSkfMRsDkValZr9e j3vEXoCXtF3idgXUfIdn2QaRvU0xQtD7kCIcwSD4CuOk48Y/Fv+FFzvxoF7ErstXYLo5 YSnsNW9iDo93tBtqoiczARpm9wNs9uKxG9PFatHpess7oQhX2JCiyYrr3XSk398f1R9s auKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Cmk9snjFVJivgWjfslWczIKV+LYGTGnCXg+808OCaPc=; b=mOuj+4m4YEcGPq344LDegrjpt9+QsF4/o298keAoUYRbCtDBjp7bRqQqZ0UROlSAGx IyWTONt0qynLl/qaHP7AI/K5Ur0aYW7TFlmdqqr/Ghqqnr0ndMJPDkQBxva4S549FOLX L8WAxKM10RGF0yFUpHUPacQM88y5cPGbaxlc6rVv1137dSF1xKuZatGYWLQW6Gz3gHLL vsAIerOBWBAxLBJgXucRuS1O8CBHaoge85uhkLWvDzxMss0yYLep6GLoqG2FmsSRSU84 cAnAP5QKjrDtbhhPqTsvMXWalX1AJaRipXN5proXTGtNczycGd2QWgrgLfHHfYiLMcvO 8rMQ== X-Gm-Message-State: AHQUAubZGBVjk9wCFWsTeUp3rnFH+nMgS2w++6MQZLDqIzZDDjuviXrR ga9LAKKWRh9QyQCBIDsJXTxdUQ== X-Google-Smtp-Source: AHgI3IaEKhgTxXMPAzP0wOVIo/br5gZ53SSyCs/uC/fbu3Zxz0lMjd8qggShroPuxDSlqB0fVes1uw== X-Received: by 2002:a7b:cb9a:: with SMTP id m26mr2770572wmi.68.1550148680940; Thu, 14 Feb 2019 04:51:20 -0800 (PST) From: Peter Maydell To: qemu-arm@nongnu.org, qemu-devel@nongnu.org Date: Thu, 14 Feb 2019 12:51:03 +0000 Message-Id: <20190214125107.22178-11-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190214125107.22178-1-peter.maydell@linaro.org> References: <20190214125107.22178-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::333 Subject: [Qemu-devel] [PATCH 10/14] hw/arm/musca.c: Implement models of the Musca-A and -B1 boards X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: patches@linaro.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" The Musca-A and Musca-B1 development boards are based on the SSE-200 subsystem for embedded. Implement an initial skeleton model of these boards, which are similar but not identical. This commit creates the board model with the SSE and the IRQ splitters to wire IRQs up to its two CPUs. As yet there are no devices and no memory: these will be added later. Signed-off-by: Peter Maydell Reviewed-by: Richard Henderson --- hw/arm/Makefile.objs | 1 + hw/arm/musca.c | 197 ++++++++++++++++++++++++++++++++ MAINTAINERS | 6 + default-configs/arm-softmmu.mak | 1 + 4 files changed, 205 insertions(+) create mode 100644 hw/arm/musca.c diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs index fa40e8d6412..fa57c7c7704 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -35,6 +35,7 @@ obj-$(CONFIG_ASPEED_SOC) +=3D aspeed_soc.o aspeed.o obj-$(CONFIG_MPS2) +=3D mps2.o obj-$(CONFIG_MPS2) +=3D mps2-tz.o obj-$(CONFIG_MSF2) +=3D msf2-soc.o msf2-som.o +obj-$(CONFIG_MUSCA) +=3D musca.o obj-$(CONFIG_ARMSSE) +=3D armsse.o obj-$(CONFIG_FSL_IMX7) +=3D fsl-imx7.o mcimx7d-sabre.o obj-$(CONFIG_ARM_SMMUV3) +=3D smmu-common.o smmuv3.o diff --git a/hw/arm/musca.c b/hw/arm/musca.c new file mode 100644 index 00000000000..cc624c7d160 --- /dev/null +++ b/hw/arm/musca.c @@ -0,0 +1,197 @@ +/* + * Arm Musca-B1 test chip board emulation + * + * Copyright (c) 2019 Linaro Limited + * Written by Peter Maydell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 or + * (at your option) any later version. + */ + +/* + * The Musca boards are a reference implementation of a system using + * the SSE-200 subsystem for embedded: + * https://developer.arm.com/products/system-design/development-boards/iot= -test-chips-and-boards/musca-a-test-chip-board + * https://developer.arm.com/products/system-design/development-boards/iot= -test-chips-and-boards/musca-b-test-chip-board + * We model the A and B1 variants of this board, as described in the TRMs: + * http://infocenter.arm.com/help/topic/com.arm.doc.101107_0000_00_en/inde= x.html + * http://infocenter.arm.com/help/topic/com.arm.doc.101312_0000_00_en/inde= x.html + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qapi/error.h" +#include "exec/address-spaces.h" +#include "hw/arm/arm.h" +#include "hw/arm/armsse.h" +#include "hw/boards.h" +#include "hw/core/split-irq.h" + +#define MUSCA_NUMIRQ_MAX 96 + +typedef enum MuscaType { + MUSCA_A, + MUSCA_B1, +} MuscaType; + +typedef struct { + MachineClass parent; + MuscaType type; + uint32_t init_svtor; + int sram_addr_width; + int num_irqs; +} MuscaMachineClass; + +typedef struct { + MachineState parent; + + ARMSSE sse; + SplitIRQ cpu_irq_splitter[MUSCA_NUMIRQ_MAX]; +} MuscaMachineState; + +#define TYPE_MUSCA_MACHINE "musca" +#define TYPE_MUSCA_A_MACHINE MACHINE_TYPE_NAME("musca-a") +#define TYPE_MUSCA_B1_MACHINE MACHINE_TYPE_NAME("musca-b1") + +#define MUSCA_MACHINE(obj) \ + OBJECT_CHECK(MuscaMachineState, obj, TYPE_MUSCA_MACHINE) +#define MUSCA_MACHINE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(MuscaMachineClass, obj, TYPE_MUSCA_MACHINE) +#define MUSCA_MACHINE_CLASS(klass) \ + OBJECT_CLASS_CHECK(MuscaMachineClass, klass, TYPE_MUSCA_MACHINE) + +/* + * Main SYSCLK frequency in Hz + * TODO this should really be different for the two cores, but we + * don't model that in our SSE-200 model yet. + */ +#define SYSCLK_FRQ 40000000 + +static void musca_init(MachineState *machine) +{ + MuscaMachineState *mms =3D MUSCA_MACHINE(machine); + MuscaMachineClass *mmc =3D MUSCA_MACHINE_GET_CLASS(mms); + MachineClass *mc =3D MACHINE_GET_CLASS(machine); + MemoryRegion *system_memory =3D get_system_memory(); + DeviceState *ssedev; + int i; + + assert(mmc->num_irqs <=3D MUSCA_NUMIRQ_MAX); + + if (strcmp(machine->cpu_type, mc->default_cpu_type) !=3D 0) { + error_report("This board can only be used with CPU %s", + mc->default_cpu_type); + exit(1); + } + + sysbus_init_child_obj(OBJECT(machine), "sse-200", &mms->sse, + sizeof(mms->sse), TYPE_SSE200); + ssedev =3D DEVICE(&mms->sse); + object_property_set_link(OBJECT(&mms->sse), OBJECT(system_memory), + "memory", &error_fatal); + qdev_prop_set_uint32(ssedev, "EXP_NUMIRQ", mmc->num_irqs); + qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor); + qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width); + qdev_prop_set_uint32(ssedev, "MAINCLK", SYSCLK_FRQ); + object_property_set_bool(OBJECT(&mms->sse), true, "realized", + &error_fatal); + + /* + * We need to create splitters to feed the IRQ inputs + * for each CPU in the SSE-200 from each device in the board. + */ + for (i =3D 0; i < mmc->num_irqs; i++) { + char *name =3D g_strdup_printf("musca-irq-splitter%d", i); + SplitIRQ *splitter =3D &mms->cpu_irq_splitter[i]; + + object_initialize_child(OBJECT(machine), name, + splitter, sizeof(*splitter), + TYPE_SPLIT_IRQ, &error_fatal, NULL); + g_free(name); + + object_property_set_int(OBJECT(splitter), 2, "num-lines", + &error_fatal); + object_property_set_bool(OBJECT(splitter), true, "realized", + &error_fatal); + qdev_connect_gpio_out(DEVICE(splitter), 0, + qdev_get_gpio_in_named(ssedev, "EXP_IRQ", i)= ); + qdev_connect_gpio_out(DEVICE(splitter), 1, + qdev_get_gpio_in_named(ssedev, + "EXP_CPU1_IRQ", i)); + } + + armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, 0x200= 0000); +} + +static void musca_class_init(ObjectClass *oc, void *data) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + + mc->default_cpus =3D 2; + mc->min_cpus =3D mc->default_cpus; + mc->max_cpus =3D mc->default_cpus; + mc->default_cpu_type =3D ARM_CPU_TYPE_NAME("cortex-m33"); + mc->init =3D musca_init; +} + +static void musca_a_class_init(ObjectClass *oc, void *data) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + MuscaMachineClass *mmc =3D MUSCA_MACHINE_CLASS(oc); + + mc->desc =3D "ARM Musca-A board (dual Cortex-M33)"; + mmc->type =3D MUSCA_A; + mmc->init_svtor =3D 0x10200000; + mmc->sram_addr_width =3D 15; + mmc->num_irqs =3D 64; +} + +static void musca_b1_class_init(ObjectClass *oc, void *data) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + MuscaMachineClass *mmc =3D MUSCA_MACHINE_CLASS(oc); + + mc->desc =3D "ARM Musca-B1 board (dual Cortex-M33)"; + mmc->type =3D MUSCA_B1; + /* + * This matches the DAPlink firmware which boots from QSPI. There + * is also a firmware blob which boots from the eFlash, which + * uses init_svtor =3D 0x1A000000. QEMU doesn't currently support that, + * though we could in theory expose a machine property on the command + * line to allow the user to request eFlash boot. + */ + mmc->init_svtor =3D 0x10000000; + mmc->sram_addr_width =3D 17; + mmc->num_irqs =3D 96; +} + +static const TypeInfo musca_info =3D { + .name =3D TYPE_MUSCA_MACHINE, + .parent =3D TYPE_MACHINE, + .abstract =3D true, + .instance_size =3D sizeof(MuscaMachineState), + .class_size =3D sizeof(MuscaMachineClass), + .class_init =3D musca_class_init, +}; + +static const TypeInfo musca_a_info =3D { + .name =3D TYPE_MUSCA_A_MACHINE, + .parent =3D TYPE_MUSCA_MACHINE, + .class_init =3D musca_a_class_init, +}; + +static const TypeInfo musca_b1_info =3D { + .name =3D TYPE_MUSCA_B1_MACHINE, + .parent =3D TYPE_MUSCA_MACHINE, + .class_init =3D musca_b1_class_init, +}; + +static void musca_machine_init(void) +{ + type_register_static(&musca_info); + type_register_static(&musca_a_info); + type_register_static(&musca_b1_info); +} + +type_init(musca_machine_init); diff --git a/MAINTAINERS b/MAINTAINERS index 85d4b4c9f7c..9b5042b883a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -636,6 +636,12 @@ F: include/hw/misc/iotkit-sysinfo.h F: hw/misc/armsse-cpuid.c F: include/hw/misc/armsse-cpuid.h =20 +Musca +M: Peter Maydell +L: qemu-arm@nongnu.org +S: Maintained +F: hw/arm/musca.c + Musicpal M: Jan Kiszka M: Peter Maydell diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.= mak index 734ca721e9e..87ad2674946 100644 --- a/default-configs/arm-softmmu.mak +++ b/default-configs/arm-softmmu.mak @@ -89,6 +89,7 @@ CONFIG_TUSB6010=3Dy CONFIG_IMX=3Dy CONFIG_MAINSTONE=3Dy CONFIG_MPS2=3Dy +CONFIG_MUSCA=3Dy CONFIG_NSERIES=3Dy CONFIG_RASPI=3Dy CONFIG_REALVIEW=3Dy --=20 2.20.1