hw/arm/iotkit: Rename IoTKit to ARMSSE
The Arm IoTKit was effectively the forerunner of a series of subsystems for embedded SoCs, named the SSE-050, SSE-100 and SSE-200: https://developer.arm.com/products/system-design/subsystems These are generally quite similar, though later iterations have extra devices that earlier ones do not. We want to add a model of the SSE-200, which means refactoring the IoTKit code into an abstract base class and subclasses (using the same design that the bcm283x SoC and Aspeed SoC family implementations do). As a first step, rename the IoTKit struct and QOM macros to ARMSSE, which is what we're going to name the base class. We temporarily retain TYPE_IOTKIT to avoid changing the code that instantiates a TYPE_IOTKIT device here and then changing it back again when it is re-introduced as a subclass. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20190121185118.18550-5-peter.maydell@linaro.org
This commit is contained in:
parent
66647809f5
commit
93dbd10347
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Arm IoT Kit
|
* Arm SSE (Subsystems for Embedded): IoTKit
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018 Linaro Limited
|
* Copyright (c) 2018 Linaro Limited
|
||||||
* Written by Peter Maydell
|
* Written by Peter Maydell
|
||||||
@ -24,7 +24,7 @@
|
|||||||
/* Create an alias region of @size bytes starting at @base
|
/* Create an alias region of @size bytes starting at @base
|
||||||
* which mirrors the memory starting at @orig.
|
* which mirrors the memory starting at @orig.
|
||||||
*/
|
*/
|
||||||
static void make_alias(IoTKit *s, MemoryRegion *mr, const char *name,
|
static void make_alias(ARMSSE *s, MemoryRegion *mr, const char *name,
|
||||||
hwaddr base, hwaddr size, hwaddr orig)
|
hwaddr base, hwaddr size, hwaddr orig)
|
||||||
{
|
{
|
||||||
memory_region_init_alias(mr, NULL, name, &s->container, orig, size);
|
memory_region_init_alias(mr, NULL, name, &s->container, orig, size);
|
||||||
@ -41,18 +41,18 @@ static void irq_status_forwarder(void *opaque, int n, int level)
|
|||||||
|
|
||||||
static void nsccfg_handler(void *opaque, int n, int level)
|
static void nsccfg_handler(void *opaque, int n, int level)
|
||||||
{
|
{
|
||||||
IoTKit *s = IOTKIT(opaque);
|
ARMSSE *s = ARMSSE(opaque);
|
||||||
|
|
||||||
s->nsccfg = level;
|
s->nsccfg = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iotkit_forward_ppc(IoTKit *s, const char *ppcname, int ppcnum)
|
static void iotkit_forward_ppc(ARMSSE *s, const char *ppcname, int ppcnum)
|
||||||
{
|
{
|
||||||
/* Each of the 4 AHB and 4 APB PPCs that might be present in a
|
/* Each of the 4 AHB and 4 APB PPCs that might be present in a
|
||||||
* system using the IoTKit has a collection of control lines which
|
* system using the ARMSSE has a collection of control lines which
|
||||||
* are provided by the security controller and which we want to
|
* are provided by the security controller and which we want to
|
||||||
* expose as control lines on the IoTKit device itself, so the
|
* expose as control lines on the ARMSSE device itself, so the
|
||||||
* code using the IoTKit can wire them up to the PPCs.
|
* code using the ARMSSE can wire them up to the PPCs.
|
||||||
*/
|
*/
|
||||||
SplitIRQ *splitter = &s->ppc_irq_splitter[ppcnum];
|
SplitIRQ *splitter = &s->ppc_irq_splitter[ppcnum];
|
||||||
DeviceState *iotkitdev = DEVICE(s);
|
DeviceState *iotkitdev = DEVICE(s);
|
||||||
@ -91,7 +91,7 @@ static void iotkit_forward_ppc(IoTKit *s, const char *ppcname, int ppcnum)
|
|||||||
g_free(name);
|
g_free(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iotkit_forward_sec_resp_cfg(IoTKit *s)
|
static void iotkit_forward_sec_resp_cfg(ARMSSE *s)
|
||||||
{
|
{
|
||||||
/* Forward the 3rd output from the splitter device as a
|
/* Forward the 3rd output from the splitter device as a
|
||||||
* named GPIO output of the iotkit object.
|
* named GPIO output of the iotkit object.
|
||||||
@ -107,7 +107,7 @@ static void iotkit_forward_sec_resp_cfg(IoTKit *s)
|
|||||||
|
|
||||||
static void iotkit_init(Object *obj)
|
static void iotkit_init(Object *obj)
|
||||||
{
|
{
|
||||||
IoTKit *s = IOTKIT(obj);
|
ARMSSE *s = ARMSSE(obj);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memory_region_init(&s->container, obj, "iotkit-container", UINT64_MAX);
|
memory_region_init(&s->container, obj, "iotkit-container", UINT64_MAX);
|
||||||
@ -175,20 +175,20 @@ static void iotkit_init(Object *obj)
|
|||||||
|
|
||||||
static void iotkit_exp_irq(void *opaque, int n, int level)
|
static void iotkit_exp_irq(void *opaque, int n, int level)
|
||||||
{
|
{
|
||||||
IoTKit *s = IOTKIT(opaque);
|
ARMSSE *s = ARMSSE(opaque);
|
||||||
|
|
||||||
qemu_set_irq(s->exp_irqs[n], level);
|
qemu_set_irq(s->exp_irqs[n], level);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iotkit_mpcexp_status(void *opaque, int n, int level)
|
static void iotkit_mpcexp_status(void *opaque, int n, int level)
|
||||||
{
|
{
|
||||||
IoTKit *s = IOTKIT(opaque);
|
ARMSSE *s = ARMSSE(opaque);
|
||||||
qemu_set_irq(s->mpcexp_status_in[n], level);
|
qemu_set_irq(s->mpcexp_status_in[n], level);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iotkit_realize(DeviceState *dev, Error **errp)
|
static void iotkit_realize(DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
IoTKit *s = IOTKIT(dev);
|
ARMSSE *s = ARMSSE(dev);
|
||||||
int i;
|
int i;
|
||||||
MemoryRegion *mr;
|
MemoryRegion *mr;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
@ -215,9 +215,9 @@ static void iotkit_realize(DeviceState *dev, Error **errp)
|
|||||||
* devices exist in both address spaces but with hard-wired security
|
* devices exist in both address spaces but with hard-wired security
|
||||||
* permissions that will cause the CPU to fault for non-secure accesses.
|
* permissions that will cause the CPU to fault for non-secure accesses.
|
||||||
*
|
*
|
||||||
* The IoTKit has an IDAU (Implementation Defined Access Unit),
|
* The ARMSSE has an IDAU (Implementation Defined Access Unit),
|
||||||
* which specifies hard-wired security permissions for different
|
* which specifies hard-wired security permissions for different
|
||||||
* areas of the physical address space. For the IoTKit IDAU, the
|
* areas of the physical address space. For the ARMSSE IDAU, the
|
||||||
* top 4 bits of the physical address are the IDAU region ID, and
|
* top 4 bits of the physical address are the IDAU region ID, and
|
||||||
* if bit 28 (ie the lowest bit of the ID) is 0 then this is an NS
|
* if bit 28 (ie the lowest bit of the ID) is 0 then this is an NS
|
||||||
* region, otherwise it is an S region.
|
* region, otherwise it is an S region.
|
||||||
@ -239,7 +239,7 @@ static void iotkit_realize(DeviceState *dev, Error **errp)
|
|||||||
* 0x20000000..0x2007ffff 32KB FPGA block RAM
|
* 0x20000000..0x2007ffff 32KB FPGA block RAM
|
||||||
* 0x30000000..0x3fffffff alias of 0x20000000..0x2fffffff
|
* 0x30000000..0x3fffffff alias of 0x20000000..0x2fffffff
|
||||||
* 0x40000000..0x4000ffff base peripheral region 1
|
* 0x40000000..0x4000ffff base peripheral region 1
|
||||||
* 0x40010000..0x4001ffff CPU peripherals (none for IoTKit)
|
* 0x40010000..0x4001ffff CPU peripherals (none for ARMSSE)
|
||||||
* 0x40020000..0x4002ffff system control element peripherals
|
* 0x40020000..0x4002ffff system control element peripherals
|
||||||
* 0x40080000..0x400fffff base peripheral region 2
|
* 0x40080000..0x400fffff base peripheral region 2
|
||||||
* 0x50000000..0x5fffffff alias of 0x40000000..0x4fffffff
|
* 0x50000000..0x5fffffff alias of 0x40000000..0x4fffffff
|
||||||
@ -306,8 +306,8 @@ static void iotkit_realize(DeviceState *dev, Error **errp)
|
|||||||
qdev_connect_gpio_out_named(dev_secctl, "nsc_cfg", 0, s->nsc_cfg_in);
|
qdev_connect_gpio_out_named(dev_secctl, "nsc_cfg", 0, s->nsc_cfg_in);
|
||||||
|
|
||||||
/* The sec_resp_cfg output from the security controller must be split into
|
/* The sec_resp_cfg output from the security controller must be split into
|
||||||
* multiple lines, one for each of the PPCs within the IoTKit and one
|
* multiple lines, one for each of the PPCs within the ARMSSE and one
|
||||||
* that will be an output from the IoTKit to the system.
|
* that will be an output from the ARMSSE to the system.
|
||||||
*/
|
*/
|
||||||
object_property_set_int(OBJECT(&s->sec_resp_splitter), 3,
|
object_property_set_int(OBJECT(&s->sec_resp_splitter), 3,
|
||||||
"num-lines", &err);
|
"num-lines", &err);
|
||||||
@ -475,7 +475,7 @@ static void iotkit_realize(DeviceState *dev, Error **errp)
|
|||||||
|
|
||||||
/* 0x40010000 .. 0x4001ffff: private CPU region: unused in IoTKit */
|
/* 0x40010000 .. 0x4001ffff: private CPU region: unused in IoTKit */
|
||||||
|
|
||||||
/* 0x40020000 .. 0x4002ffff : IoTKit system control peripheral region */
|
/* 0x40020000 .. 0x4002ffff : ARMSSE system control peripheral region */
|
||||||
/* Devices behind APB PPC1:
|
/* Devices behind APB PPC1:
|
||||||
* 0x4002f000: S32K timer
|
* 0x4002f000: S32K timer
|
||||||
*/
|
*/
|
||||||
@ -558,7 +558,7 @@ static void iotkit_realize(DeviceState *dev, Error **errp)
|
|||||||
qdev_get_gpio_in(DEVICE(&s->nmi_orgate), 0));
|
qdev_get_gpio_in(DEVICE(&s->nmi_orgate), 0));
|
||||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->s32kwatchdog), 0, 0x5002e000);
|
sysbus_mmio_map(SYS_BUS_DEVICE(&s->s32kwatchdog), 0, 0x5002e000);
|
||||||
|
|
||||||
/* 0x40080000 .. 0x4008ffff : IoTKit second Base peripheral region */
|
/* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
|
||||||
|
|
||||||
qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
|
qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
|
||||||
object_property_set_bool(OBJECT(&s->nswatchdog), true, "realized", &err);
|
object_property_set_bool(OBJECT(&s->nswatchdog), true, "realized", &err);
|
||||||
@ -678,7 +678,7 @@ static void iotkit_realize(DeviceState *dev, Error **errp)
|
|||||||
* Expose our container region to the board model; this corresponds
|
* Expose our container region to the board model; this corresponds
|
||||||
* to the AHB Slave Expansion ports which allow bus master devices
|
* to the AHB Slave Expansion ports which allow bus master devices
|
||||||
* (eg DMA controllers) in the board model to make transactions into
|
* (eg DMA controllers) in the board model to make transactions into
|
||||||
* devices in the IoTKit.
|
* devices in the ARMSSE.
|
||||||
*/
|
*/
|
||||||
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->container);
|
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->container);
|
||||||
|
|
||||||
@ -688,11 +688,12 @@ static void iotkit_realize(DeviceState *dev, Error **errp)
|
|||||||
static void iotkit_idau_check(IDAUInterface *ii, uint32_t address,
|
static void iotkit_idau_check(IDAUInterface *ii, uint32_t address,
|
||||||
int *iregion, bool *exempt, bool *ns, bool *nsc)
|
int *iregion, bool *exempt, bool *ns, bool *nsc)
|
||||||
{
|
{
|
||||||
/* For IoTKit systems the IDAU responses are simple logical functions
|
/*
|
||||||
|
* For ARMSSE systems the IDAU responses are simple logical functions
|
||||||
* of the address bits. The NSC attribute is guest-adjustable via the
|
* of the address bits. The NSC attribute is guest-adjustable via the
|
||||||
* NSCCFG register in the security controller.
|
* NSCCFG register in the security controller.
|
||||||
*/
|
*/
|
||||||
IoTKit *s = IOTKIT(ii);
|
ARMSSE *s = ARMSSE(ii);
|
||||||
int region = extract32(address, 28, 4);
|
int region = extract32(address, 28, 4);
|
||||||
|
|
||||||
*ns = !(region & 1);
|
*ns = !(region & 1);
|
||||||
@ -707,22 +708,22 @@ static const VMStateDescription iotkit_vmstate = {
|
|||||||
.version_id = 1,
|
.version_id = 1,
|
||||||
.minimum_version_id = 1,
|
.minimum_version_id = 1,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_UINT32(nsccfg, IoTKit),
|
VMSTATE_UINT32(nsccfg, ARMSSE),
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property iotkit_properties[] = {
|
static Property iotkit_properties[] = {
|
||||||
DEFINE_PROP_LINK("memory", IoTKit, board_memory, TYPE_MEMORY_REGION,
|
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
|
||||||
MemoryRegion *),
|
MemoryRegion *),
|
||||||
DEFINE_PROP_UINT32("EXP_NUMIRQ", IoTKit, exp_numirq, 64),
|
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
|
||||||
DEFINE_PROP_UINT32("MAINCLK", IoTKit, mainclk_frq, 0),
|
DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
|
||||||
DEFINE_PROP_END_OF_LIST()
|
DEFINE_PROP_END_OF_LIST()
|
||||||
};
|
};
|
||||||
|
|
||||||
static void iotkit_reset(DeviceState *dev)
|
static void iotkit_reset(DeviceState *dev)
|
||||||
{
|
{
|
||||||
IoTKit *s = IOTKIT(dev);
|
ARMSSE *s = ARMSSE(dev);
|
||||||
|
|
||||||
s->nsccfg = 0;
|
s->nsccfg = 0;
|
||||||
}
|
}
|
||||||
@ -740,9 +741,9 @@ static void iotkit_class_init(ObjectClass *klass, void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo iotkit_info = {
|
static const TypeInfo iotkit_info = {
|
||||||
.name = TYPE_IOTKIT,
|
.name = TYPE_ARMSSE,
|
||||||
.parent = TYPE_SYS_BUS_DEVICE,
|
.parent = TYPE_SYS_BUS_DEVICE,
|
||||||
.instance_size = sizeof(IoTKit),
|
.instance_size = sizeof(ARMSSE),
|
||||||
.instance_init = iotkit_init,
|
.instance_init = iotkit_init,
|
||||||
.class_init = iotkit_class_init,
|
.class_init = iotkit_class_init,
|
||||||
.interfaces = (InterfaceInfo[]) {
|
.interfaces = (InterfaceInfo[]) {
|
||||||
|
@ -66,7 +66,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
MachineState parent;
|
MachineState parent;
|
||||||
|
|
||||||
IoTKit iotkit;
|
ARMSSE iotkit;
|
||||||
MemoryRegion psram;
|
MemoryRegion psram;
|
||||||
MemoryRegion ssram[3];
|
MemoryRegion ssram[3];
|
||||||
MemoryRegion ssram1_m;
|
MemoryRegion ssram1_m;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* ARM IoT Kit
|
* ARM SSE (Subsystems for Embedded): IoTKit
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018 Linaro Limited
|
* Copyright (c) 2018 Linaro Limited
|
||||||
* Written by Peter Maydell
|
* Written by Peter Maydell
|
||||||
@ -9,7 +9,10 @@
|
|||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* This is a model of the Arm IoT Kit which is documented in
|
/*
|
||||||
|
* This is a model of the Arm "Subsystems for Embedded" family of
|
||||||
|
* hardware, which include the IoT Kit and the SSE-050, SSE-100 and
|
||||||
|
* SSE-200. Currently we model only the Arm IoT Kit which is documented in
|
||||||
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html
|
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html
|
||||||
* It contains:
|
* It contains:
|
||||||
* a Cortex-M33
|
* a Cortex-M33
|
||||||
@ -71,8 +74,15 @@
|
|||||||
#include "hw/or-irq.h"
|
#include "hw/or-irq.h"
|
||||||
#include "hw/core/split-irq.h"
|
#include "hw/core/split-irq.h"
|
||||||
|
|
||||||
#define TYPE_IOTKIT "iotkit"
|
#define TYPE_ARMSSE "iotkit"
|
||||||
#define IOTKIT(obj) OBJECT_CHECK(IoTKit, (obj), TYPE_IOTKIT)
|
#define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For the moment TYPE_IOTKIT is a synonym for TYPE_ARMSSE (and the
|
||||||
|
* latter's underlying name is left as "iotkit"); in a later
|
||||||
|
* commit it will become a subclass of TYPE_ARMSSE.
|
||||||
|
*/
|
||||||
|
#define TYPE_IOTKIT TYPE_ARMSSE
|
||||||
|
|
||||||
/* We have an IRQ splitter and an OR gate input for each external PPC
|
/* We have an IRQ splitter and an OR gate input for each external PPC
|
||||||
* and the 2 internal PPCs
|
* and the 2 internal PPCs
|
||||||
@ -80,7 +90,7 @@
|
|||||||
#define NUM_EXTERNAL_PPCS (IOTS_NUM_AHB_EXP_PPC + IOTS_NUM_APB_EXP_PPC)
|
#define NUM_EXTERNAL_PPCS (IOTS_NUM_AHB_EXP_PPC + IOTS_NUM_APB_EXP_PPC)
|
||||||
#define NUM_PPCS (NUM_EXTERNAL_PPCS + 2)
|
#define NUM_PPCS (NUM_EXTERNAL_PPCS + 2)
|
||||||
|
|
||||||
typedef struct IoTKit {
|
typedef struct ARMSSE {
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
SysBusDevice parent_obj;
|
SysBusDevice parent_obj;
|
||||||
|
|
||||||
@ -131,6 +141,6 @@ typedef struct IoTKit {
|
|||||||
MemoryRegion *board_memory;
|
MemoryRegion *board_memory;
|
||||||
uint32_t exp_numirq;
|
uint32_t exp_numirq;
|
||||||
uint32_t mainclk_frq;
|
uint32_t mainclk_frq;
|
||||||
} IoTKit;
|
} ARMSSE;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user