| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2018-03-05 19:24:08 +13:00
										 |  |  |  * QEMU RISC-V VirtIO machine interface | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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/>.
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-05 19:20:53 +13:00
										 |  |  | #ifndef HW_RISCV_VIRT_H
 | 
					
						
							|  |  |  | #define HW_RISCV_VIRT_H
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 07:23:31 +02:00
										 |  |  | #include "hw/riscv/riscv_hart.h"
 | 
					
						
							|  |  |  | #include "hw/sysbus.h"
 | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:25 -07:00
										 |  |  | #include "hw/block/flash.h"
 | 
					
						
							| 
									
										
										
										
											2020-09-03 16:43:22 -04:00
										 |  |  | #include "qom/object.h"
 | 
					
						
							| 
									
										
										
										
											2019-08-12 07:23:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:26 +05:30
										 |  |  | #define VIRT_CPUS_MAX_BITS             9
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:24 +05:30
										 |  |  | #define VIRT_CPUS_MAX                  (1 << VIRT_CPUS_MAX_BITS)
 | 
					
						
							|  |  |  | #define VIRT_SOCKETS_MAX_BITS          2
 | 
					
						
							|  |  |  | #define VIRT_SOCKETS_MAX               (1 << VIRT_SOCKETS_MAX_BITS)
 | 
					
						
							| 
									
										
											  
											
												hw/riscv: virt: Allow creating multiple NUMA sockets
We extend RISC-V virt machine to allow creating a multi-socket
machine. Each RISC-V virt machine socket is a NUMA node having
a set of HARTs, a memory instance, a CLINT instance, and a PLIC
instance. Other devices are shared between all sockets. We also
update the generated device tree accordingly.
By default, NUMA multi-socket support is disabled for RISC-V virt
machine. To enable it, users can use "-numa" command-line options
of QEMU.
Example1: For two NUMA nodes with 2 CPUs each, append following
to command-line options: "-smp 4 -numa node -numa node"
Example2: For two NUMA nodes with 1 and 3 CPUs, append following
to command-line options:
"-smp 4 -numa node -numa node -numa cpu,node-id=0,core-id=0 \
-numa cpu,node-id=1,core-id=1 -numa cpu,node-id=1,core-id=2 \
-numa cpu,node-id=1,core-id=3"
The maximum number of sockets in a RISC-V virt machine is 8
but this limit can be changed in future.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Message-Id: <20200616032229.766089-6-anup.patel@wdc.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
											
										 
											2020-05-15 14:58:50 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:22 -07:00
										 |  |  | #define TYPE_RISCV_VIRT_MACHINE MACHINE_TYPE_NAME("virt")
 | 
					
						
							| 
									
										
										
										
											2020-09-03 16:43:22 -04:00
										 |  |  | typedef struct RISCVVirtState RISCVVirtState; | 
					
						
							| 
									
										
										
										
											2020-08-31 17:07:33 -04:00
										 |  |  | DECLARE_INSTANCE_CHECKER(RISCVVirtState, RISCV_VIRT_MACHINE, | 
					
						
							|  |  |  |                          TYPE_RISCV_VIRT_MACHINE) | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  | typedef enum RISCVVirtAIAType { | 
					
						
							|  |  |  |     VIRT_AIA_TYPE_NONE = 0, | 
					
						
							|  |  |  |     VIRT_AIA_TYPE_APLIC, | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:24 +05:30
										 |  |  |     VIRT_AIA_TYPE_APLIC_IMSIC, | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  | } RISCVVirtAIAType; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-03 16:43:22 -04:00
										 |  |  | struct RISCVVirtState { | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  |     /*< private >*/ | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:22 -07:00
										 |  |  |     MachineState parent; | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /*< public >*/ | 
					
						
							| 
									
										
										
										
											2022-04-28 09:41:41 +10:00
										 |  |  |     Notifier machine_done; | 
					
						
							| 
									
										
										
										
											2022-04-28 09:41:43 +10:00
										 |  |  |     DeviceState *platform_bus_dev; | 
					
						
							| 
									
										
											  
											
												hw/riscv: virt: Allow creating multiple NUMA sockets
We extend RISC-V virt machine to allow creating a multi-socket
machine. Each RISC-V virt machine socket is a NUMA node having
a set of HARTs, a memory instance, a CLINT instance, and a PLIC
instance. Other devices are shared between all sockets. We also
update the generated device tree accordingly.
By default, NUMA multi-socket support is disabled for RISC-V virt
machine. To enable it, users can use "-numa" command-line options
of QEMU.
Example1: For two NUMA nodes with 2 CPUs each, append following
to command-line options: "-smp 4 -numa node -numa node"
Example2: For two NUMA nodes with 1 and 3 CPUs, append following
to command-line options:
"-smp 4 -numa node -numa node -numa cpu,node-id=0,core-id=0 \
-numa cpu,node-id=1,core-id=1 -numa cpu,node-id=1,core-id=2 \
-numa cpu,node-id=1,core-id=3"
The maximum number of sockets in a RISC-V virt machine is 8
but this limit can be changed in future.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Message-Id: <20200616032229.766089-6-anup.patel@wdc.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
											
										 
											2020-05-15 14:58:50 +05:30
										 |  |  |     RISCVHartArrayState soc[VIRT_SOCKETS_MAX]; | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  |     DeviceState *irqchip[VIRT_SOCKETS_MAX]; | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:25 -07:00
										 |  |  |     PFlashCFI01 *flash[2]; | 
					
						
							| 
									
										
										
										
											2021-03-19 10:50:40 +11:00
										 |  |  |     FWCfgState *fw_cfg; | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  |     int fdt_size; | 
					
						
							| 
									
										
										
										
											2021-08-31 16:36:03 +05:30
										 |  |  |     bool have_aclint; | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  |     RISCVVirtAIAType aia_type; | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:24 +05:30
										 |  |  |     int aia_guests; | 
					
						
							| 
									
										
										
										
											2020-09-03 16:43:22 -04:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  |     VIRT_DEBUG, | 
					
						
							|  |  |  |     VIRT_MROM, | 
					
						
							|  |  |  |     VIRT_TEST, | 
					
						
							| 
									
										
										
										
											2019-11-06 11:56:43 +00:00
										 |  |  |     VIRT_RTC, | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  |     VIRT_CLINT, | 
					
						
							| 
									
										
										
										
											2021-08-31 16:36:03 +05:30
										 |  |  |     VIRT_ACLINT_SSWI, | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  |     VIRT_PLIC, | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  |     VIRT_APLIC_M, | 
					
						
							|  |  |  |     VIRT_APLIC_S, | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  |     VIRT_UART0, | 
					
						
							|  |  |  |     VIRT_VIRTIO, | 
					
						
							| 
									
										
										
										
											2021-03-19 10:50:40 +11:00
										 |  |  |     VIRT_FW_CFG, | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:24 +05:30
										 |  |  |     VIRT_IMSIC_M, | 
					
						
							|  |  |  |     VIRT_IMSIC_S, | 
					
						
							| 
									
										
										
										
											2019-10-08 16:32:25 -07:00
										 |  |  |     VIRT_FLASH, | 
					
						
							| 
									
										
										
										
											2018-12-11 22:37:36 +00:00
										 |  |  |     VIRT_DRAM, | 
					
						
							|  |  |  |     VIRT_PCIE_MMIO, | 
					
						
							|  |  |  |     VIRT_PCIE_PIO, | 
					
						
							| 
									
										
										
										
											2022-04-28 09:41:43 +10:00
										 |  |  |     VIRT_PLATFORM_BUS, | 
					
						
							| 
									
										
										
										
											2018-12-11 22:37:36 +00:00
										 |  |  |     VIRT_PCIE_ECAM | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  |     UART0_IRQ = 10, | 
					
						
							| 
									
										
										
										
											2019-11-06 11:56:43 +00:00
										 |  |  |     RTC_IRQ = 11, | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  |     VIRTIO_IRQ = 1, /* 1 to 8 */ | 
					
						
							|  |  |  |     VIRTIO_COUNT = 8, | 
					
						
							| 
									
										
										
										
											2018-12-11 22:37:36 +00:00
										 |  |  |     PCIE_IRQ = 0x20, /* 32 to 35 */ | 
					
						
							| 
									
										
										
										
											2022-04-28 09:41:43 +10:00
										 |  |  |     VIRT_PLATFORM_BUS_IRQ = 64, /* 64 to 96 */ | 
					
						
							|  |  |  |     VIRTIO_NDEV = 96 /* Arbitrary maximum number of interrupts */ | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-28 09:41:43 +10:00
										 |  |  | #define VIRT_PLATFORM_BUS_NUM_IRQS 32
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:24 +05:30
										 |  |  | #define VIRT_IRQCHIP_IPI_MSI 1
 | 
					
						
							|  |  |  | #define VIRT_IRQCHIP_NUM_MSIS 255
 | 
					
						
							|  |  |  | #define VIRT_IRQCHIP_NUM_SOURCES VIRTIO_NDEV
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  | #define VIRT_IRQCHIP_NUM_PRIO_BITS 3
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:24 +05:30
										 |  |  | #define VIRT_IRQCHIP_MAX_GUESTS_BITS 3
 | 
					
						
							|  |  |  | #define VIRT_IRQCHIP_MAX_GUESTS ((1U << VIRT_IRQCHIP_MAX_GUESTS_BITS) - 1U)
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-04 18:15:23 +00:00
										 |  |  | #define VIRT_PLIC_PRIORITY_BASE 0x04
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | #define VIRT_PLIC_PENDING_BASE 0x1000
 | 
					
						
							|  |  |  | #define VIRT_PLIC_ENABLE_BASE 0x2000
 | 
					
						
							|  |  |  | #define VIRT_PLIC_ENABLE_STRIDE 0x80
 | 
					
						
							|  |  |  | #define VIRT_PLIC_CONTEXT_BASE 0x200000
 | 
					
						
							|  |  |  | #define VIRT_PLIC_CONTEXT_STRIDE 0x1000
 | 
					
						
							| 
									
										
											  
											
												hw/riscv: virt: Allow creating multiple NUMA sockets
We extend RISC-V virt machine to allow creating a multi-socket
machine. Each RISC-V virt machine socket is a NUMA node having
a set of HARTs, a memory instance, a CLINT instance, and a PLIC
instance. Other devices are shared between all sockets. We also
update the generated device tree accordingly.
By default, NUMA multi-socket support is disabled for RISC-V virt
machine. To enable it, users can use "-numa" command-line options
of QEMU.
Example1: For two NUMA nodes with 2 CPUs each, append following
to command-line options: "-smp 4 -numa node -numa node"
Example2: For two NUMA nodes with 1 and 3 CPUs, append following
to command-line options:
"-smp 4 -numa node -numa node -numa cpu,node-id=0,core-id=0 \
-numa cpu,node-id=1,core-id=1 -numa cpu,node-id=1,core-id=2 \
-numa cpu,node-id=1,core-id=3"
The maximum number of sockets in a RISC-V virt machine is 8
but this limit can be changed in future.
Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
Message-Id: <20200616032229.766089-6-anup.patel@wdc.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
											
										 
											2020-05-15 14:58:50 +05:30
										 |  |  | #define VIRT_PLIC_SIZE(__num_context) \
 | 
					
						
							|  |  |  |     (VIRT_PLIC_CONTEXT_BASE + (__num_context) * VIRT_PLIC_CONTEXT_STRIDE) | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-11 22:37:36 +00:00
										 |  |  | #define FDT_PCI_ADDR_CELLS    3
 | 
					
						
							|  |  |  | #define FDT_PCI_INT_CELLS     1
 | 
					
						
							| 
									
										
										
										
											2022-08-10 19:46:10 +01:00
										 |  |  | #define FDT_PLIC_ADDR_CELLS   0
 | 
					
						
							| 
									
										
										
										
											2018-12-11 22:37:36 +00:00
										 |  |  | #define FDT_PLIC_INT_CELLS    1
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  | #define FDT_APLIC_INT_CELLS   2
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:24 +05:30
										 |  |  | #define FDT_IMSIC_INT_CELLS   0
 | 
					
						
							| 
									
										
										
										
											2022-02-20 14:25:22 +05:30
										 |  |  | #define FDT_MAX_INT_CELLS     2
 | 
					
						
							|  |  |  | #define FDT_MAX_INT_MAP_WIDTH (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + \
 | 
					
						
							|  |  |  |                                  1 + FDT_MAX_INT_CELLS) | 
					
						
							|  |  |  | #define FDT_PLIC_INT_MAP_WIDTH  (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + \
 | 
					
						
							|  |  |  |                                  1 + FDT_PLIC_INT_CELLS) | 
					
						
							|  |  |  | #define FDT_APLIC_INT_MAP_WIDTH (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + \
 | 
					
						
							|  |  |  |                                  1 + FDT_APLIC_INT_CELLS) | 
					
						
							| 
									
										
										
										
											2018-12-11 22:37:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-03 01:31:13 +13:00
										 |  |  | #endif
 |