| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 07:23:31 +02:00
										 |  |  | #include "hw/riscv/riscv_hart.h"
 | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:02 -07:00
										 |  |  | #include "hw/riscv/sifive_cpu.h"
 | 
					
						
							| 
									
										
										
										
											2020-09-03 18:40:15 +08:00
										 |  |  | #include "hw/gpio/sifive_gpio.h"
 | 
					
						
							| 
									
										
										
										
											2022-09-22 09:52:32 +02:00
										 |  |  | #include "hw/boards.h"
 | 
					
						
							| 
									
										
										
										
											2019-02-12 18:38:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-03 16:54:02 -07:00
										 |  |  | #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 { | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  |     /*< private >*/ | 
					
						
							| 
									
										
										
										
											2020-06-09 14:23:35 +02:00
										 |  |  |     DeviceState parent_obj; | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*< public >*/ | 
					
						
							| 
									
										
										
										
											2018-05-03 16:54:02 -07:00
										 |  |  |     RISCVHartArrayState cpus; | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  |     DeviceState *plic; | 
					
						
							| 
									
										
										
										
											2019-02-12 18:38:39 +01:00
										 |  |  |     SIFIVEGPIOState gpio; | 
					
						
							| 
									
										
										
										
											2019-06-14 04:58:41 -07:00
										 |  |  |     MemoryRegion xip_mem; | 
					
						
							|  |  |  |     MemoryRegion mask_rom; | 
					
						
							| 
									
										
										
										
											2018-05-03 16:54:02 -07:00
										 |  |  | } SiFiveESoCState; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct SiFiveEState { | 
					
						
							|  |  |  |     /*< private >*/ | 
					
						
							| 
									
										
										
										
											2022-09-22 09:52:32 +02:00
										 |  |  |     MachineState parent_obj; | 
					
						
							| 
									
										
										
										
											2018-05-03 16:54:02 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*< public >*/ | 
					
						
							|  |  |  |     SiFiveESoCState soc; | 
					
						
							| 
									
										
										
										
											2020-05-13 10:42:46 -07:00
										 |  |  |     bool revb; | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | } SiFiveEState; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-13 10:37:08 -07:00
										 |  |  | #define TYPE_RISCV_E_MACHINE MACHINE_TYPE_NAME("sifive_e")
 | 
					
						
							|  |  |  | #define RISCV_E_MACHINE(obj) \
 | 
					
						
							|  |  |  |     OBJECT_CHECK(SiFiveEState, (obj), TYPE_RISCV_E_MACHINE) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | enum { | 
					
						
							| 
									
										
										
										
											2020-09-11 13:34:46 -04:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							| 
									
										
										
										
											2019-02-12 18:38:39 +01:00
										 |  |  |     SIFIVE_E_UART0_IRQ  = 3, | 
					
						
							|  |  |  |     SIFIVE_E_UART1_IRQ  = 4, | 
					
						
							|  |  |  |     SIFIVE_E_GPIO0_IRQ0 = 8 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SIFIVE_E_PLIC_HART_CONFIG "M"
 | 
					
						
							|  |  |  | #define SIFIVE_E_PLIC_NUM_SOURCES 127
 | 
					
						
							|  |  |  | #define SIFIVE_E_PLIC_NUM_PRIORITIES 7
 | 
					
						
							| 
									
										
										
										
											2019-04-04 18:15:23 +00:00
										 |  |  | #define SIFIVE_E_PLIC_PRIORITY_BASE 0x04
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | #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
 |