|  | /* | 
|  | * SiFive E series machine interface | 
|  | * | 
|  | * Copyright (c) 2017 SiFive, Inc. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify it | 
|  | * under the terms and conditions of the GNU General Public License, | 
|  | * version 2 or later, as published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope it will be useful, but WITHOUT | 
|  | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|  | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|  | * more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License along with | 
|  | * this program.  If not, see <http://www.gnu.org/licenses/>. | 
|  | */ | 
|  |  | 
|  | #ifndef HW_SIFIVE_E_H | 
|  | #define HW_SIFIVE_E_H | 
|  |  | 
|  | #include "hw/riscv/riscv_hart.h" | 
|  | #include "hw/riscv/sifive_cpu.h" | 
|  | #include "hw/gpio/sifive_gpio.h" | 
|  | #include "hw/misc/sifive_e_aon.h" | 
|  | #include "hw/boards.h" | 
|  |  | 
|  | #define TYPE_RISCV_E_SOC "riscv.sifive.e.soc" | 
|  | #define RISCV_E_SOC(obj) \ | 
|  | OBJECT_CHECK(SiFiveESoCState, (obj), TYPE_RISCV_E_SOC) | 
|  |  | 
|  | typedef struct SiFiveESoCState { | 
|  | /*< private >*/ | 
|  | DeviceState parent_obj; | 
|  |  | 
|  | /*< public >*/ | 
|  | RISCVHartArrayState cpus; | 
|  | DeviceState *plic; | 
|  | SiFiveEAONState aon; | 
|  | SIFIVEGPIOState gpio; | 
|  | MemoryRegion xip_mem; | 
|  | MemoryRegion mask_rom; | 
|  | } SiFiveESoCState; | 
|  |  | 
|  | typedef struct SiFiveEState { | 
|  | /*< private >*/ | 
|  | MachineState parent_obj; | 
|  |  | 
|  | /*< public >*/ | 
|  | SiFiveESoCState soc; | 
|  | bool revb; | 
|  | } SiFiveEState; | 
|  |  | 
|  | #define TYPE_RISCV_E_MACHINE MACHINE_TYPE_NAME("sifive_e") | 
|  | #define RISCV_E_MACHINE(obj) \ | 
|  | OBJECT_CHECK(SiFiveEState, (obj), TYPE_RISCV_E_MACHINE) | 
|  |  | 
|  | enum { | 
|  | SIFIVE_E_DEV_DEBUG, | 
|  | SIFIVE_E_DEV_MROM, | 
|  | SIFIVE_E_DEV_OTP, | 
|  | SIFIVE_E_DEV_CLINT, | 
|  | SIFIVE_E_DEV_PLIC, | 
|  | SIFIVE_E_DEV_AON, | 
|  | SIFIVE_E_DEV_PRCI, | 
|  | SIFIVE_E_DEV_OTP_CTRL, | 
|  | SIFIVE_E_DEV_GPIO0, | 
|  | SIFIVE_E_DEV_UART0, | 
|  | SIFIVE_E_DEV_QSPI0, | 
|  | SIFIVE_E_DEV_PWM0, | 
|  | SIFIVE_E_DEV_UART1, | 
|  | SIFIVE_E_DEV_QSPI1, | 
|  | SIFIVE_E_DEV_PWM1, | 
|  | SIFIVE_E_DEV_QSPI2, | 
|  | SIFIVE_E_DEV_PWM2, | 
|  | SIFIVE_E_DEV_XIP, | 
|  | SIFIVE_E_DEV_DTIM | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | SIFIVE_E_AON_WDT_IRQ  = 1, | 
|  | SIFIVE_E_UART0_IRQ    = 3, | 
|  | SIFIVE_E_UART1_IRQ    = 4, | 
|  | SIFIVE_E_GPIO0_IRQ0   = 8 | 
|  | }; | 
|  |  | 
|  | #define SIFIVE_E_PLIC_HART_CONFIG "M" | 
|  | /* | 
|  | * Freedom E310 G002 and G003 supports 52 interrupt sources while | 
|  | * Freedom E310 G000 supports 51 interrupt sources. We use the value | 
|  | * of G002 and G003, so it is 53 (including interrupt source 0). | 
|  | */ | 
|  | #define SIFIVE_E_PLIC_NUM_SOURCES 53 | 
|  | #define SIFIVE_E_PLIC_NUM_PRIORITIES 7 | 
|  | #define SIFIVE_E_PLIC_PRIORITY_BASE 0x00 | 
|  | #define SIFIVE_E_PLIC_PENDING_BASE 0x1000 | 
|  | #define SIFIVE_E_PLIC_ENABLE_BASE 0x2000 | 
|  | #define SIFIVE_E_PLIC_ENABLE_STRIDE 0x80 | 
|  | #define SIFIVE_E_PLIC_CONTEXT_BASE 0x200000 | 
|  | #define SIFIVE_E_PLIC_CONTEXT_STRIDE 0x1000 | 
|  |  | 
|  | #endif |