1740dafc0SNiek Linnenbank /* 2740dafc0SNiek Linnenbank * Allwinner H3 System on Chip emulation 3740dafc0SNiek Linnenbank * 4740dafc0SNiek Linnenbank * Copyright (C) 2019 Niek Linnenbank <nieklinnenbank@gmail.com> 5740dafc0SNiek Linnenbank * 6740dafc0SNiek Linnenbank * This program is free software: you can redistribute it and/or modify 7740dafc0SNiek Linnenbank * it under the terms of the GNU General Public License as published by 8740dafc0SNiek Linnenbank * the Free Software Foundation, either version 2 of the License, or 9740dafc0SNiek Linnenbank * (at your option) any later version. 10740dafc0SNiek Linnenbank * 11740dafc0SNiek Linnenbank * This program is distributed in the hope that it will be useful, 12740dafc0SNiek Linnenbank * but WITHOUT ANY WARRANTY; without even the implied warranty of 13740dafc0SNiek Linnenbank * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14740dafc0SNiek Linnenbank * GNU General Public License for more details. 15740dafc0SNiek Linnenbank * 16740dafc0SNiek Linnenbank * You should have received a copy of the GNU General Public License 17740dafc0SNiek Linnenbank * along with this program. If not, see <http://www.gnu.org/licenses/>. 18740dafc0SNiek Linnenbank */ 19740dafc0SNiek Linnenbank 20740dafc0SNiek Linnenbank /* 21740dafc0SNiek Linnenbank * The Allwinner H3 is a System on Chip containing four ARM Cortex A7 22740dafc0SNiek Linnenbank * processor cores. Features and specifications include DDR2/DDR3 memory, 23740dafc0SNiek Linnenbank * SD/MMC storage cards, 10/100/1000Mbit Ethernet, USB 2.0, HDMI and 24740dafc0SNiek Linnenbank * various I/O modules. 25740dafc0SNiek Linnenbank * 26740dafc0SNiek Linnenbank * This implementation is based on the following datasheet: 27740dafc0SNiek Linnenbank * 28740dafc0SNiek Linnenbank * https://linux-sunxi.org/File:Allwinner_H3_Datasheet_V1.2.pdf 29740dafc0SNiek Linnenbank * 30740dafc0SNiek Linnenbank * The latest datasheet and more info can be found on the Linux Sunxi wiki: 31740dafc0SNiek Linnenbank * 32740dafc0SNiek Linnenbank * https://linux-sunxi.org/H3 33740dafc0SNiek Linnenbank */ 34740dafc0SNiek Linnenbank 35740dafc0SNiek Linnenbank #ifndef HW_ARM_ALLWINNER_H3_H 36740dafc0SNiek Linnenbank #define HW_ARM_ALLWINNER_H3_H 37740dafc0SNiek Linnenbank 38740dafc0SNiek Linnenbank #include "qom/object.h" 39740dafc0SNiek Linnenbank #include "hw/arm/boot.h" 40740dafc0SNiek Linnenbank #include "hw/timer/allwinner-a10-pit.h" 41740dafc0SNiek Linnenbank #include "hw/intc/arm_gic.h" 42fef06c8bSNiek Linnenbank #include "hw/misc/allwinner-h3-ccu.h" 43d26af5deSNiek Linnenbank #include "hw/misc/allwinner-cpucfg.h" 447e83c9ddSNiek Linnenbank #include "hw/misc/allwinner-h3-sysctrl.h" 456556617cSNiek Linnenbank #include "hw/misc/allwinner-sid.h" 4682e48382SNiek Linnenbank #include "hw/sd/allwinner-sdhost.h" 47*29d08975SNiek Linnenbank #include "hw/net/allwinner-sun8i-emac.h" 48740dafc0SNiek Linnenbank #include "target/arm/cpu.h" 49740dafc0SNiek Linnenbank 50740dafc0SNiek Linnenbank /** 51740dafc0SNiek Linnenbank * Allwinner H3 device list 52740dafc0SNiek Linnenbank * 53740dafc0SNiek Linnenbank * This enumeration is can be used refer to a particular device in the 54740dafc0SNiek Linnenbank * Allwinner H3 SoC. For example, the physical memory base address for 55740dafc0SNiek Linnenbank * each device can be found in the AwH3State object in the memmap member 56740dafc0SNiek Linnenbank * using the device enum value as index. 57740dafc0SNiek Linnenbank * 58740dafc0SNiek Linnenbank * @see AwH3State 59740dafc0SNiek Linnenbank */ 60740dafc0SNiek Linnenbank enum { 61740dafc0SNiek Linnenbank AW_H3_SRAM_A1, 62740dafc0SNiek Linnenbank AW_H3_SRAM_A2, 63740dafc0SNiek Linnenbank AW_H3_SRAM_C, 647e83c9ddSNiek Linnenbank AW_H3_SYSCTRL, 6582e48382SNiek Linnenbank AW_H3_MMC0, 666556617cSNiek Linnenbank AW_H3_SID, 672e4dfe80SNiek Linnenbank AW_H3_EHCI0, 682e4dfe80SNiek Linnenbank AW_H3_OHCI0, 692e4dfe80SNiek Linnenbank AW_H3_EHCI1, 702e4dfe80SNiek Linnenbank AW_H3_OHCI1, 712e4dfe80SNiek Linnenbank AW_H3_EHCI2, 722e4dfe80SNiek Linnenbank AW_H3_OHCI2, 732e4dfe80SNiek Linnenbank AW_H3_EHCI3, 742e4dfe80SNiek Linnenbank AW_H3_OHCI3, 75fef06c8bSNiek Linnenbank AW_H3_CCU, 76740dafc0SNiek Linnenbank AW_H3_PIT, 77740dafc0SNiek Linnenbank AW_H3_UART0, 78740dafc0SNiek Linnenbank AW_H3_UART1, 79740dafc0SNiek Linnenbank AW_H3_UART2, 80740dafc0SNiek Linnenbank AW_H3_UART3, 81*29d08975SNiek Linnenbank AW_H3_EMAC, 82740dafc0SNiek Linnenbank AW_H3_GIC_DIST, 83740dafc0SNiek Linnenbank AW_H3_GIC_CPU, 84740dafc0SNiek Linnenbank AW_H3_GIC_HYP, 85740dafc0SNiek Linnenbank AW_H3_GIC_VCPU, 86d26af5deSNiek Linnenbank AW_H3_CPUCFG, 87740dafc0SNiek Linnenbank AW_H3_SDRAM 88740dafc0SNiek Linnenbank }; 89740dafc0SNiek Linnenbank 90740dafc0SNiek Linnenbank /** Total number of CPU cores in the H3 SoC */ 91740dafc0SNiek Linnenbank #define AW_H3_NUM_CPUS (4) 92740dafc0SNiek Linnenbank 93740dafc0SNiek Linnenbank /** 94740dafc0SNiek Linnenbank * Allwinner H3 object model 95740dafc0SNiek Linnenbank * @{ 96740dafc0SNiek Linnenbank */ 97740dafc0SNiek Linnenbank 98740dafc0SNiek Linnenbank /** Object type for the Allwinner H3 SoC */ 99740dafc0SNiek Linnenbank #define TYPE_AW_H3 "allwinner-h3" 100740dafc0SNiek Linnenbank 101740dafc0SNiek Linnenbank /** Convert input object to Allwinner H3 state object */ 102740dafc0SNiek Linnenbank #define AW_H3(obj) OBJECT_CHECK(AwH3State, (obj), TYPE_AW_H3) 103740dafc0SNiek Linnenbank 104740dafc0SNiek Linnenbank /** @} */ 105740dafc0SNiek Linnenbank 106740dafc0SNiek Linnenbank /** 107740dafc0SNiek Linnenbank * Allwinner H3 object 108740dafc0SNiek Linnenbank * 109740dafc0SNiek Linnenbank * This struct contains the state of all the devices 110740dafc0SNiek Linnenbank * which are currently emulated by the H3 SoC code. 111740dafc0SNiek Linnenbank */ 112740dafc0SNiek Linnenbank typedef struct AwH3State { 113740dafc0SNiek Linnenbank /*< private >*/ 114740dafc0SNiek Linnenbank DeviceState parent_obj; 115740dafc0SNiek Linnenbank /*< public >*/ 116740dafc0SNiek Linnenbank 117740dafc0SNiek Linnenbank ARMCPU cpus[AW_H3_NUM_CPUS]; 118740dafc0SNiek Linnenbank const hwaddr *memmap; 119740dafc0SNiek Linnenbank AwA10PITState timer; 120fef06c8bSNiek Linnenbank AwH3ClockCtlState ccu; 121d26af5deSNiek Linnenbank AwCpuCfgState cpucfg; 1227e83c9ddSNiek Linnenbank AwH3SysCtrlState sysctrl; 1236556617cSNiek Linnenbank AwSidState sid; 12482e48382SNiek Linnenbank AwSdHostState mmc0; 125*29d08975SNiek Linnenbank AwSun8iEmacState emac; 126740dafc0SNiek Linnenbank GICState gic; 127740dafc0SNiek Linnenbank MemoryRegion sram_a1; 128740dafc0SNiek Linnenbank MemoryRegion sram_a2; 129740dafc0SNiek Linnenbank MemoryRegion sram_c; 130740dafc0SNiek Linnenbank } AwH3State; 131740dafc0SNiek Linnenbank 132740dafc0SNiek Linnenbank #endif /* HW_ARM_ALLWINNER_H3_H */ 133