1*6eee5d24SPeter Maydell /* 2*6eee5d24SPeter Maydell * ARM SSE (Subsystems for Embedded): IoTKit 3*6eee5d24SPeter Maydell * 4*6eee5d24SPeter Maydell * Copyright (c) 2018 Linaro Limited 5*6eee5d24SPeter Maydell * Written by Peter Maydell 6*6eee5d24SPeter Maydell * 7*6eee5d24SPeter Maydell * This program is free software; you can redistribute it and/or modify 8*6eee5d24SPeter Maydell * it under the terms of the GNU General Public License version 2 or 9*6eee5d24SPeter Maydell * (at your option) any later version. 10*6eee5d24SPeter Maydell */ 11*6eee5d24SPeter Maydell 12*6eee5d24SPeter Maydell /* 13*6eee5d24SPeter Maydell * This is a model of the Arm "Subsystems for Embedded" family of 14*6eee5d24SPeter Maydell * hardware, which include the IoT Kit and the SSE-050, SSE-100 and 15*6eee5d24SPeter Maydell * SSE-200. Currently we model only the Arm IoT Kit which is documented in 16*6eee5d24SPeter Maydell * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ecm0601256/index.html 17*6eee5d24SPeter Maydell * It contains: 18*6eee5d24SPeter Maydell * a Cortex-M33 19*6eee5d24SPeter Maydell * the IDAU 20*6eee5d24SPeter Maydell * some timers and watchdogs 21*6eee5d24SPeter Maydell * two peripheral protection controllers 22*6eee5d24SPeter Maydell * a memory protection controller 23*6eee5d24SPeter Maydell * a security controller 24*6eee5d24SPeter Maydell * a bus fabric which arranges that some parts of the address 25*6eee5d24SPeter Maydell * space are secure and non-secure aliases of each other 26*6eee5d24SPeter Maydell * 27*6eee5d24SPeter Maydell * QEMU interface: 28*6eee5d24SPeter Maydell * + QOM property "memory" is a MemoryRegion containing the devices provided 29*6eee5d24SPeter Maydell * by the board model. 30*6eee5d24SPeter Maydell * + QOM property "MAINCLK" is the frequency of the main system clock 31*6eee5d24SPeter Maydell * + QOM property "EXP_NUMIRQ" sets the number of expansion interrupts 32*6eee5d24SPeter Maydell * + Named GPIO inputs "EXP_IRQ" 0..n are the expansion interrupts, which 33*6eee5d24SPeter Maydell * are wired to the NVIC lines 32 .. n+32 34*6eee5d24SPeter Maydell * + sysbus MMIO region 0 is the "AHB Slave Expansion" which allows 35*6eee5d24SPeter Maydell * bus master devices in the board model to make transactions into 36*6eee5d24SPeter Maydell * all the devices and memory areas in the IoTKit 37*6eee5d24SPeter Maydell * Controlling up to 4 AHB expansion PPBs which a system using the IoTKit 38*6eee5d24SPeter Maydell * might provide: 39*6eee5d24SPeter Maydell * + named GPIO outputs apb_ppcexp{0,1,2,3}_nonsec[0..15] 40*6eee5d24SPeter Maydell * + named GPIO outputs apb_ppcexp{0,1,2,3}_ap[0..15] 41*6eee5d24SPeter Maydell * + named GPIO outputs apb_ppcexp{0,1,2,3}_irq_enable 42*6eee5d24SPeter Maydell * + named GPIO outputs apb_ppcexp{0,1,2,3}_irq_clear 43*6eee5d24SPeter Maydell * + named GPIO inputs apb_ppcexp{0,1,2,3}_irq_status 44*6eee5d24SPeter Maydell * Controlling each of the 4 expansion AHB PPCs which a system using the IoTKit 45*6eee5d24SPeter Maydell * might provide: 46*6eee5d24SPeter Maydell * + named GPIO outputs ahb_ppcexp{0,1,2,3}_nonsec[0..15] 47*6eee5d24SPeter Maydell * + named GPIO outputs ahb_ppcexp{0,1,2,3}_ap[0..15] 48*6eee5d24SPeter Maydell * + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_enable 49*6eee5d24SPeter Maydell * + named GPIO outputs ahb_ppcexp{0,1,2,3}_irq_clear 50*6eee5d24SPeter Maydell * + named GPIO inputs ahb_ppcexp{0,1,2,3}_irq_status 51*6eee5d24SPeter Maydell * Controlling each of the 16 expansion MPCs which a system using the IoTKit 52*6eee5d24SPeter Maydell * might provide: 53*6eee5d24SPeter Maydell * + named GPIO inputs mpcexp_status[0..15] 54*6eee5d24SPeter Maydell * Controlling each of the 16 expansion MSCs which a system using the IoTKit 55*6eee5d24SPeter Maydell * might provide: 56*6eee5d24SPeter Maydell * + named GPIO inputs mscexp_status[0..15] 57*6eee5d24SPeter Maydell * + named GPIO outputs mscexp_clear[0..15] 58*6eee5d24SPeter Maydell * + named GPIO outputs mscexp_ns[0..15] 59*6eee5d24SPeter Maydell */ 60*6eee5d24SPeter Maydell 61*6eee5d24SPeter Maydell #ifndef ARMSSE_H 62*6eee5d24SPeter Maydell #define ARMSSE_H 63*6eee5d24SPeter Maydell 64*6eee5d24SPeter Maydell #include "hw/sysbus.h" 65*6eee5d24SPeter Maydell #include "hw/arm/armv7m.h" 66*6eee5d24SPeter Maydell #include "hw/misc/iotkit-secctl.h" 67*6eee5d24SPeter Maydell #include "hw/misc/tz-ppc.h" 68*6eee5d24SPeter Maydell #include "hw/misc/tz-mpc.h" 69*6eee5d24SPeter Maydell #include "hw/timer/cmsdk-apb-timer.h" 70*6eee5d24SPeter Maydell #include "hw/timer/cmsdk-apb-dualtimer.h" 71*6eee5d24SPeter Maydell #include "hw/watchdog/cmsdk-apb-watchdog.h" 72*6eee5d24SPeter Maydell #include "hw/misc/iotkit-sysctl.h" 73*6eee5d24SPeter Maydell #include "hw/misc/iotkit-sysinfo.h" 74*6eee5d24SPeter Maydell #include "hw/or-irq.h" 75*6eee5d24SPeter Maydell #include "hw/core/split-irq.h" 76*6eee5d24SPeter Maydell 77*6eee5d24SPeter Maydell #define TYPE_ARMSSE "arm-sse" 78*6eee5d24SPeter Maydell #define ARMSSE(obj) OBJECT_CHECK(ARMSSE, (obj), TYPE_ARMSSE) 79*6eee5d24SPeter Maydell 80*6eee5d24SPeter Maydell /* 81*6eee5d24SPeter Maydell * These type names are for specific IoTKit subsystems; other than 82*6eee5d24SPeter Maydell * instantiating them, code using these devices should always handle 83*6eee5d24SPeter Maydell * them via the ARMSSE base class, so they have no IOTKIT() etc macros. 84*6eee5d24SPeter Maydell */ 85*6eee5d24SPeter Maydell #define TYPE_IOTKIT "iotkit" 86*6eee5d24SPeter Maydell 87*6eee5d24SPeter Maydell /* We have an IRQ splitter and an OR gate input for each external PPC 88*6eee5d24SPeter Maydell * and the 2 internal PPCs 89*6eee5d24SPeter Maydell */ 90*6eee5d24SPeter Maydell #define NUM_EXTERNAL_PPCS (IOTS_NUM_AHB_EXP_PPC + IOTS_NUM_APB_EXP_PPC) 91*6eee5d24SPeter Maydell #define NUM_PPCS (NUM_EXTERNAL_PPCS + 2) 92*6eee5d24SPeter Maydell 93*6eee5d24SPeter Maydell typedef struct ARMSSE { 94*6eee5d24SPeter Maydell /*< private >*/ 95*6eee5d24SPeter Maydell SysBusDevice parent_obj; 96*6eee5d24SPeter Maydell 97*6eee5d24SPeter Maydell /*< public >*/ 98*6eee5d24SPeter Maydell ARMv7MState armv7m; 99*6eee5d24SPeter Maydell IoTKitSecCtl secctl; 100*6eee5d24SPeter Maydell TZPPC apb_ppc0; 101*6eee5d24SPeter Maydell TZPPC apb_ppc1; 102*6eee5d24SPeter Maydell TZMPC mpc; 103*6eee5d24SPeter Maydell CMSDKAPBTIMER timer0; 104*6eee5d24SPeter Maydell CMSDKAPBTIMER timer1; 105*6eee5d24SPeter Maydell CMSDKAPBTIMER s32ktimer; 106*6eee5d24SPeter Maydell qemu_or_irq ppc_irq_orgate; 107*6eee5d24SPeter Maydell SplitIRQ sec_resp_splitter; 108*6eee5d24SPeter Maydell SplitIRQ ppc_irq_splitter[NUM_PPCS]; 109*6eee5d24SPeter Maydell SplitIRQ mpc_irq_splitter[IOTS_NUM_EXP_MPC + IOTS_NUM_MPC]; 110*6eee5d24SPeter Maydell qemu_or_irq mpc_irq_orgate; 111*6eee5d24SPeter Maydell qemu_or_irq nmi_orgate; 112*6eee5d24SPeter Maydell 113*6eee5d24SPeter Maydell CMSDKAPBDualTimer dualtimer; 114*6eee5d24SPeter Maydell 115*6eee5d24SPeter Maydell CMSDKAPBWatchdog s32kwatchdog; 116*6eee5d24SPeter Maydell CMSDKAPBWatchdog nswatchdog; 117*6eee5d24SPeter Maydell CMSDKAPBWatchdog swatchdog; 118*6eee5d24SPeter Maydell 119*6eee5d24SPeter Maydell IoTKitSysCtl sysctl; 120*6eee5d24SPeter Maydell IoTKitSysCtl sysinfo; 121*6eee5d24SPeter Maydell 122*6eee5d24SPeter Maydell MemoryRegion container; 123*6eee5d24SPeter Maydell MemoryRegion alias1; 124*6eee5d24SPeter Maydell MemoryRegion alias2; 125*6eee5d24SPeter Maydell MemoryRegion alias3; 126*6eee5d24SPeter Maydell MemoryRegion sram0; 127*6eee5d24SPeter Maydell 128*6eee5d24SPeter Maydell qemu_irq *exp_irqs; 129*6eee5d24SPeter Maydell qemu_irq ppc0_irq; 130*6eee5d24SPeter Maydell qemu_irq ppc1_irq; 131*6eee5d24SPeter Maydell qemu_irq sec_resp_cfg; 132*6eee5d24SPeter Maydell qemu_irq sec_resp_cfg_in; 133*6eee5d24SPeter Maydell qemu_irq nsc_cfg_in; 134*6eee5d24SPeter Maydell 135*6eee5d24SPeter Maydell qemu_irq irq_status_in[NUM_EXTERNAL_PPCS]; 136*6eee5d24SPeter Maydell qemu_irq mpcexp_status_in[IOTS_NUM_EXP_MPC]; 137*6eee5d24SPeter Maydell 138*6eee5d24SPeter Maydell uint32_t nsccfg; 139*6eee5d24SPeter Maydell 140*6eee5d24SPeter Maydell /* Properties */ 141*6eee5d24SPeter Maydell MemoryRegion *board_memory; 142*6eee5d24SPeter Maydell uint32_t exp_numirq; 143*6eee5d24SPeter Maydell uint32_t mainclk_frq; 144*6eee5d24SPeter Maydell } ARMSSE; 145*6eee5d24SPeter Maydell 146*6eee5d24SPeter Maydell typedef struct ARMSSEInfo ARMSSEInfo; 147*6eee5d24SPeter Maydell 148*6eee5d24SPeter Maydell typedef struct ARMSSEClass { 149*6eee5d24SPeter Maydell DeviceClass parent_class; 150*6eee5d24SPeter Maydell const ARMSSEInfo *info; 151*6eee5d24SPeter Maydell } ARMSSEClass; 152*6eee5d24SPeter Maydell 153*6eee5d24SPeter Maydell #define ARMSSE_CLASS(klass) \ 154*6eee5d24SPeter Maydell OBJECT_CLASS_CHECK(ARMSSEClass, (klass), TYPE_ARMSSE) 155*6eee5d24SPeter Maydell #define ARMSSE_GET_CLASS(obj) \ 156*6eee5d24SPeter Maydell OBJECT_GET_CLASS(ARMSSEClass, (obj), TYPE_ARMSSE) 157*6eee5d24SPeter Maydell 158*6eee5d24SPeter Maydell #endif 159