1*a7240d1eSMichael Clark /* 2*a7240d1eSMichael Clark * SiFive U series machine interface 3*a7240d1eSMichael Clark * 4*a7240d1eSMichael Clark * Copyright (c) 2017 SiFive, Inc. 5*a7240d1eSMichael Clark * 6*a7240d1eSMichael Clark * This program is free software; you can redistribute it and/or modify it 7*a7240d1eSMichael Clark * under the terms and conditions of the GNU General Public License, 8*a7240d1eSMichael Clark * version 2 or later, as published by the Free Software Foundation. 9*a7240d1eSMichael Clark * 10*a7240d1eSMichael Clark * This program is distributed in the hope it will be useful, but WITHOUT 11*a7240d1eSMichael Clark * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12*a7240d1eSMichael Clark * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13*a7240d1eSMichael Clark * more details. 14*a7240d1eSMichael Clark * 15*a7240d1eSMichael Clark * You should have received a copy of the GNU General Public License along with 16*a7240d1eSMichael Clark * this program. If not, see <http://www.gnu.org/licenses/>. 17*a7240d1eSMichael Clark */ 18*a7240d1eSMichael Clark 19*a7240d1eSMichael Clark #ifndef HW_SIFIVE_U_H 20*a7240d1eSMichael Clark #define HW_SIFIVE_U_H 21*a7240d1eSMichael Clark 22*a7240d1eSMichael Clark #define TYPE_SIFIVE_U "riscv.sifive_u" 23*a7240d1eSMichael Clark 24*a7240d1eSMichael Clark #define SIFIVE_U(obj) \ 25*a7240d1eSMichael Clark OBJECT_CHECK(SiFiveUState, (obj), TYPE_SIFIVE_U) 26*a7240d1eSMichael Clark 27*a7240d1eSMichael Clark typedef struct SiFiveUState { 28*a7240d1eSMichael Clark /*< private >*/ 29*a7240d1eSMichael Clark SysBusDevice parent_obj; 30*a7240d1eSMichael Clark 31*a7240d1eSMichael Clark /*< public >*/ 32*a7240d1eSMichael Clark RISCVHartArrayState soc; 33*a7240d1eSMichael Clark DeviceState *plic; 34*a7240d1eSMichael Clark void *fdt; 35*a7240d1eSMichael Clark int fdt_size; 36*a7240d1eSMichael Clark } SiFiveUState; 37*a7240d1eSMichael Clark 38*a7240d1eSMichael Clark enum { 39*a7240d1eSMichael Clark SIFIVE_U_DEBUG, 40*a7240d1eSMichael Clark SIFIVE_U_MROM, 41*a7240d1eSMichael Clark SIFIVE_U_CLINT, 42*a7240d1eSMichael Clark SIFIVE_U_PLIC, 43*a7240d1eSMichael Clark SIFIVE_U_UART0, 44*a7240d1eSMichael Clark SIFIVE_U_UART1, 45*a7240d1eSMichael Clark SIFIVE_U_DRAM 46*a7240d1eSMichael Clark }; 47*a7240d1eSMichael Clark 48*a7240d1eSMichael Clark enum { 49*a7240d1eSMichael Clark SIFIVE_U_UART0_IRQ = 3, 50*a7240d1eSMichael Clark SIFIVE_U_UART1_IRQ = 4 51*a7240d1eSMichael Clark }; 52*a7240d1eSMichael Clark 53*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_HART_CONFIG "MS" 54*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_NUM_SOURCES 127 55*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_NUM_PRIORITIES 7 56*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_PRIORITY_BASE 0x0 57*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_PENDING_BASE 0x1000 58*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_ENABLE_BASE 0x2000 59*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_ENABLE_STRIDE 0x80 60*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_CONTEXT_BASE 0x200000 61*a7240d1eSMichael Clark #define SIFIVE_U_PLIC_CONTEXT_STRIDE 0x1000 62*a7240d1eSMichael Clark 63*a7240d1eSMichael Clark #if defined(TARGET_RISCV32) 64*a7240d1eSMichael Clark #define SIFIVE_U_CPU TYPE_RISCV_CPU_SIFIVE_U34 65*a7240d1eSMichael Clark #elif defined(TARGET_RISCV64) 66*a7240d1eSMichael Clark #define SIFIVE_U_CPU TYPE_RISCV_CPU_SIFIVE_U54 67*a7240d1eSMichael Clark #endif 68*a7240d1eSMichael Clark 69*a7240d1eSMichael Clark #endif 70