xref: /qemu/include/hw/riscv/sifive_u.h (revision a7240d1e4aac4cd4542d68f3cc722939550da6af)
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