| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * SiFive U 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_U_H
 | 
					
						
							|  |  |  | #define HW_SIFIVE_U_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-01 09:39:11 +08:00
										 |  |  | #include "hw/dma/sifive_pdma.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-26 13:59:08 -07:00
										 |  |  | #include "hw/net/cadence_gem.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"
 | 
					
						
							| 
									
										
										
										
											2020-09-03 18:40:14 +08:00
										 |  |  | #include "hw/misc/sifive_u_otp.h"
 | 
					
						
							| 
									
										
										
										
											2020-09-03 18:40:13 +08:00
										 |  |  | #include "hw/misc/sifive_u_prci.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-26 13:59:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-26 11:15:24 -07:00
										 |  |  | #define TYPE_RISCV_U_SOC "riscv.sifive.u.soc"
 | 
					
						
							|  |  |  | #define RISCV_U_SOC(obj) \
 | 
					
						
							|  |  |  |     OBJECT_CHECK(SiFiveUSoCState, (obj), TYPE_RISCV_U_SOC) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct SiFiveUSoCState { | 
					
						
							| 
									
										
										
										
											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 >*/ | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:06 -07:00
										 |  |  |     CPUClusterState e_cluster; | 
					
						
							|  |  |  |     CPUClusterState u_cluster; | 
					
						
							|  |  |  |     RISCVHartArrayState e_cpus; | 
					
						
							|  |  |  |     RISCVHartArrayState u_cpus; | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  |     DeviceState *plic; | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:10 -07:00
										 |  |  |     SiFiveUPRCIState prci; | 
					
						
							| 
									
										
										
										
											2020-06-08 07:17:36 -07:00
										 |  |  |     SIFIVEGPIOState gpio; | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:16 -07:00
										 |  |  |     SiFiveUOTPState otp; | 
					
						
							| 
									
										
										
										
											2020-09-01 09:39:11 +08:00
										 |  |  |     SiFivePDMAState dma; | 
					
						
							| 
									
										
										
										
											2018-04-26 13:59:08 -07:00
										 |  |  |     CadenceGEMState gem; | 
					
						
							| 
									
										
										
										
											2020-03-02 15:08:51 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     uint32_t serial; | 
					
						
							| 
									
										
										
										
											2020-10-13 17:17:25 -07:00
										 |  |  |     char *cpu_type; | 
					
						
							| 
									
										
										
										
											2018-04-26 11:15:24 -07:00
										 |  |  | } SiFiveUSoCState; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:14 -07:00
										 |  |  | #define TYPE_RISCV_U_MACHINE MACHINE_TYPE_NAME("sifive_u")
 | 
					
						
							|  |  |  | #define RISCV_U_MACHINE(obj) \
 | 
					
						
							|  |  |  |     OBJECT_CHECK(SiFiveUState, (obj), TYPE_RISCV_U_MACHINE) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-26 11:15:24 -07:00
										 |  |  | typedef struct SiFiveUState { | 
					
						
							|  |  |  |     /*< private >*/ | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:14 -07:00
										 |  |  |     MachineState parent_obj; | 
					
						
							| 
									
										
										
										
											2018-04-26 11:15:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*< public >*/ | 
					
						
							|  |  |  |     SiFiveUSoCState soc; | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:14 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  |     void *fdt; | 
					
						
							|  |  |  |     int fdt_size; | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:18 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool start_in_flash; | 
					
						
							| 
									
										
										
										
											2020-06-08 07:17:40 -07:00
										 |  |  |     uint32_t msel; | 
					
						
							| 
									
										
										
										
											2019-11-16 07:08:50 -08:00
										 |  |  |     uint32_t serial; | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | } SiFiveUState; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							| 
									
										
										
										
											2020-09-11 13:34:47 -04:00
										 |  |  |     SIFIVE_U_DEV_DEBUG, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_MROM, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_CLINT, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_L2CC, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_PDMA, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_L2LIM, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_PLIC, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_PRCI, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_UART0, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_UART1, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_GPIO, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_OTP, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_DMC, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_FLASH0, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_DRAM, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_GEM, | 
					
						
							|  |  |  |     SIFIVE_U_DEV_GEM_MGMT | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							| 
									
										
										
										
											2020-07-19 23:49:08 -07:00
										 |  |  |     SIFIVE_U_L2CC_IRQ0 = 1, | 
					
						
							|  |  |  |     SIFIVE_U_L2CC_IRQ1 = 2, | 
					
						
							|  |  |  |     SIFIVE_U_L2CC_IRQ2 = 3, | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:12 -07:00
										 |  |  |     SIFIVE_U_UART0_IRQ = 4, | 
					
						
							|  |  |  |     SIFIVE_U_UART1_IRQ = 5, | 
					
						
							| 
									
										
										
										
											2020-06-08 07:17:36 -07:00
										 |  |  |     SIFIVE_U_GPIO_IRQ0 = 7, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ1 = 8, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ2 = 9, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ3 = 10, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ4 = 11, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ5 = 12, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ6 = 13, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ7 = 14, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ8 = 15, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ9 = 16, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ10 = 17, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ11 = 18, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ12 = 19, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ13 = 20, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ14 = 21, | 
					
						
							|  |  |  |     SIFIVE_U_GPIO_IRQ15 = 22, | 
					
						
							| 
									
										
										
										
											2020-09-01 09:39:11 +08:00
										 |  |  |     SIFIVE_U_PDMA_IRQ0 = 23, | 
					
						
							|  |  |  |     SIFIVE_U_PDMA_IRQ1 = 24, | 
					
						
							|  |  |  |     SIFIVE_U_PDMA_IRQ2 = 25, | 
					
						
							|  |  |  |     SIFIVE_U_PDMA_IRQ3 = 26, | 
					
						
							|  |  |  |     SIFIVE_U_PDMA_IRQ4 = 27, | 
					
						
							|  |  |  |     SIFIVE_U_PDMA_IRQ5 = 28, | 
					
						
							|  |  |  |     SIFIVE_U_PDMA_IRQ6 = 29, | 
					
						
							|  |  |  |     SIFIVE_U_PDMA_IRQ7 = 30, | 
					
						
							| 
									
										
										
										
											2018-04-26 13:59:08 -07:00
										 |  |  |     SIFIVE_U_GEM_IRQ = 0x35 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-03 14:30:07 +13:00
										 |  |  | enum { | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:09 -07:00
										 |  |  |     SIFIVE_U_HFCLK_FREQ = 33333333, | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:18 -07:00
										 |  |  |     SIFIVE_U_RTCCLK_FREQ = 1000000 | 
					
						
							| 
									
										
										
										
											2018-03-03 14:30:07 +13:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-15 17:50:39 -07:00
										 |  |  | enum { | 
					
						
							|  |  |  |     MSEL_MEMMAP_QSPI0_FLASH = 1, | 
					
						
							|  |  |  |     MSEL_L2LIM_QSPI0_FLASH = 6, | 
					
						
							|  |  |  |     MSEL_L2LIM_QSPI2_SD = 11 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:05 -07:00
										 |  |  | #define SIFIVE_U_MANAGEMENT_CPU_COUNT   1
 | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:06 -07:00
										 |  |  | #define SIFIVE_U_COMPUTE_CPU_COUNT      4
 | 
					
						
							| 
									
										
										
										
											2019-09-06 09:20:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | #define SIFIVE_U_PLIC_HART_CONFIG "MS"
 | 
					
						
							| 
									
										
										
										
											2019-04-04 18:15:23 +00:00
										 |  |  | #define SIFIVE_U_PLIC_NUM_SOURCES 54
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | #define SIFIVE_U_PLIC_NUM_PRIORITIES 7
 | 
					
						
							| 
									
										
										
										
											2019-04-04 18:15:23 +00:00
										 |  |  | #define SIFIVE_U_PLIC_PRIORITY_BASE 0x04
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:14 +13:00
										 |  |  | #define SIFIVE_U_PLIC_PENDING_BASE 0x1000
 | 
					
						
							|  |  |  | #define SIFIVE_U_PLIC_ENABLE_BASE 0x2000
 | 
					
						
							|  |  |  | #define SIFIVE_U_PLIC_ENABLE_STRIDE 0x80
 | 
					
						
							|  |  |  | #define SIFIVE_U_PLIC_CONTEXT_BASE 0x200000
 | 
					
						
							|  |  |  | #define SIFIVE_U_PLIC_CONTEXT_STRIDE 0x1000
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 |