mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 08:43:55 -06:00
hw/riscv: virt: Add optional AIA IMSIC support to virt machine
We extend virt machine to emulate both AIA IMSIC and AIA APLIC devices only when "aia=aplic-imsic" parameter is passed along with machine name in the QEMU command-line. The AIA IMSIC is only a per-HART MSI controller so we use AIA APLIC in MSI-mode to forward all wired interrupts as MSIs to the AIA IMSIC. We also provide "aia-guests=<xyz>" parameter which can be used to specify number of VS-level AIA IMSIC Guests MMIO pages for each HART. Signed-off-by: Anup Patel <anup.patel@wdc.com> Signed-off-by: Anup Patel <anup@brainfault.org> Acked-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20220220085526.808674-4-anup@brainfault.org> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
9746e583fe
commit
28d8c28120
3 changed files with 373 additions and 84 deletions
|
@ -24,8 +24,10 @@
|
|||
#include "hw/block/flash.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define VIRT_CPUS_MAX 32
|
||||
#define VIRT_SOCKETS_MAX 8
|
||||
#define VIRT_CPUS_MAX_BITS 3
|
||||
#define VIRT_CPUS_MAX (1 << VIRT_CPUS_MAX_BITS)
|
||||
#define VIRT_SOCKETS_MAX_BITS 2
|
||||
#define VIRT_SOCKETS_MAX (1 << VIRT_SOCKETS_MAX_BITS)
|
||||
|
||||
#define TYPE_RISCV_VIRT_MACHINE MACHINE_TYPE_NAME("virt")
|
||||
typedef struct RISCVVirtState RISCVVirtState;
|
||||
|
@ -35,6 +37,7 @@ DECLARE_INSTANCE_CHECKER(RISCVVirtState, RISCV_VIRT_MACHINE,
|
|||
typedef enum RISCVVirtAIAType {
|
||||
VIRT_AIA_TYPE_NONE = 0,
|
||||
VIRT_AIA_TYPE_APLIC,
|
||||
VIRT_AIA_TYPE_APLIC_IMSIC,
|
||||
} RISCVVirtAIAType;
|
||||
|
||||
struct RISCVVirtState {
|
||||
|
@ -50,6 +53,7 @@ struct RISCVVirtState {
|
|||
int fdt_size;
|
||||
bool have_aclint;
|
||||
RISCVVirtAIAType aia_type;
|
||||
int aia_guests;
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -65,6 +69,8 @@ enum {
|
|||
VIRT_UART0,
|
||||
VIRT_VIRTIO,
|
||||
VIRT_FW_CFG,
|
||||
VIRT_IMSIC_M,
|
||||
VIRT_IMSIC_S,
|
||||
VIRT_FLASH,
|
||||
VIRT_DRAM,
|
||||
VIRT_PCIE_MMIO,
|
||||
|
@ -81,8 +87,12 @@ enum {
|
|||
VIRTIO_NDEV = 0x35 /* Arbitrary maximum number of interrupts */
|
||||
};
|
||||
|
||||
#define VIRT_IRQCHIP_NUM_SOURCES 127
|
||||
#define VIRT_IRQCHIP_IPI_MSI 1
|
||||
#define VIRT_IRQCHIP_NUM_MSIS 255
|
||||
#define VIRT_IRQCHIP_NUM_SOURCES VIRTIO_NDEV
|
||||
#define VIRT_IRQCHIP_NUM_PRIO_BITS 3
|
||||
#define VIRT_IRQCHIP_MAX_GUESTS_BITS 3
|
||||
#define VIRT_IRQCHIP_MAX_GUESTS ((1U << VIRT_IRQCHIP_MAX_GUESTS_BITS) - 1U)
|
||||
|
||||
#define VIRT_PLIC_PRIORITY_BASE 0x04
|
||||
#define VIRT_PLIC_PENDING_BASE 0x1000
|
||||
|
@ -97,6 +107,7 @@ enum {
|
|||
#define FDT_PCI_INT_CELLS 1
|
||||
#define FDT_PLIC_INT_CELLS 1
|
||||
#define FDT_APLIC_INT_CELLS 2
|
||||
#define FDT_IMSIC_INT_CELLS 0
|
||||
#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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue