在2024年9月10日九月 下午1:18,Xianglai Li写道:
> Add macro definitions needed for interrupt controller kvm emulation.
Hi Xianglai and other LoongArch folks,
As I can see your recent works had enabled IOCSR to be treated like a address
space, should we migrate IOCSR stuff to iofd/eventfd infra?
Thanks
- Jiaxun
>
> Signed-off-by: Xianglai Li <lixiang...@loongson.cn>
> ---
> Cc: Paolo Bonzini <pbonz...@redhat.com>
> Cc: Song Gao <gaos...@loongson.cn>
> Cc: Jiaxun Yang <jiaxun.y...@flygoat.com>
> Cc: Huacai Chen <chenhua...@kernel.org>
> Cc: "Michael S. Tsirkin" <m...@redhat.com>
> Cc: Cornelia Huck <coh...@redhat.com>
> Cc: k...@vger.kernel.org
> Cc: Bibo Mao <maob...@loongson.cn>
> Cc: Xianglai Li <lixiang...@loongson.cn>
>
> include/hw/intc/loongarch_extioi.h | 38 ++++++++++++++++--
> include/hw/intc/loongarch_ipi.h | 15 +++++++
> include/hw/intc/loongarch_pch_pic.h | 58 +++++++++++++++++++++++++--
> include/hw/intc/loongson_ipi.h | 1 -
> include/hw/intc/loongson_ipi_common.h | 2 +
> include/hw/loongarch/virt.h | 15 +++++++
> linux-headers/asm-loongarch/kvm.h | 18 +++++++++
> linux-headers/linux/kvm.h | 6 +++
> 8 files changed, 146 insertions(+), 7 deletions(-)
>
> diff --git a/include/hw/intc/loongarch_extioi.h
> b/include/hw/intc/loongarch_extioi.h
> index 626a37dfa1..97f6aa4d60 100644
> --- a/include/hw/intc/loongarch_extioi.h
> +++ b/include/hw/intc/loongarch_extioi.h
> @@ -15,7 +15,7 @@
> #define EXTIOI_IRQS (256)
> #define EXTIOI_IRQS_BITMAP_SIZE (256 / 8)
> /* irq from EXTIOI is routed to no more than 4 cpus */
> -#define EXTIOI_CPUS (4)
> +#define EXTIOI_CPUS (256)
> /* map to ipnum per 32 irqs */
> #define EXTIOI_IRQS_IPMAP_SIZE (256 / 32)
> #define EXTIOI_IRQS_COREMAP_SIZE 256
> @@ -36,7 +36,7 @@
> #define EXTIOI_ISR_START (0x700 - APIC_OFFSET)
> #define EXTIOI_ISR_END (0x720 - APIC_OFFSET)
> #define EXTIOI_COREISR_START (0x800 - APIC_OFFSET)
> -#define EXTIOI_COREISR_END (0xB20 - APIC_OFFSET)
> +#define EXTIOI_COREISR_END (0x820 - APIC_OFFSET)
> #define EXTIOI_COREMAP_START (0xC00 - APIC_OFFSET)
> #define EXTIOI_COREMAP_END (0xD00 - APIC_OFFSET)
> #define EXTIOI_SIZE 0x800
> @@ -64,7 +64,8 @@ typedef struct ExtIOICore {
> qemu_irq parent_irq[LS3A_INTC_IP];
> } ExtIOICore;
>
> -#define TYPE_LOONGARCH_EXTIOI "loongarch.extioi"
> +#define TYPE_LOONGARCH_EXTIOI "loongarch-extioi"
> +#define TYPE_KVM_LOONGARCH_EXTIOI "loongarch-kvm-extioi"
> OBJECT_DECLARE_SIMPLE_TYPE(LoongArchExtIOI, LOONGARCH_EXTIOI)
> struct LoongArchExtIOI {
> SysBusDevice parent_obj;
> @@ -86,4 +87,35 @@ struct LoongArchExtIOI {
> MemoryRegion extioi_system_mem;
> MemoryRegion virt_extend;
> };
> +
> +struct KVMLoongArchExtIOI {
> + SysBusDevice parent_obj;
> + uint32_t num_cpu;
> + uint32_t features;
> + uint32_t status;
> +
> + /* hardware state */
> + uint32_t nodetype[EXTIOI_IRQS_NODETYPE_COUNT / 2];
> + uint32_t bounce[EXTIOI_IRQS_GROUP_COUNT];
> + uint32_t isr[EXTIOI_IRQS / 32];
> + uint32_t coreisr[EXTIOI_CPUS][EXTIOI_IRQS_GROUP_COUNT];
> + uint32_t enable[EXTIOI_IRQS / 32];
> + uint32_t ipmap[EXTIOI_IRQS_IPMAP_SIZE / 4];
> + uint32_t coremap[EXTIOI_IRQS / 4];
> + uint8_t sw_coremap[EXTIOI_IRQS];
> +};
> +typedef struct KVMLoongArchExtIOI KVMLoongArchExtIOI;
> +DECLARE_INSTANCE_CHECKER(KVMLoongArchExtIOI, KVM_LOONGARCH_EXTIOI,
> + TYPE_KVM_LOONGARCH_EXTIOI)
> +
> +struct KVMLoongArchExtIOIClass {
> + SysBusDeviceClass parent_class;
> + DeviceRealize parent_realize;
> +
> + bool is_created;
> + int dev_fd;
> +};
> +typedef struct KVMLoongArchExtIOIClass KVMLoongArchExtIOIClass;
> +DECLARE_CLASS_CHECKERS(KVMLoongArchExtIOIClass, KVM_LOONGARCH_EXTIOI,
> + TYPE_KVM_LOONGARCH_EXTIOI)
> #endif /* LOONGARCH_EXTIOI_H */
> diff --git a/include/hw/intc/loongarch_ipi.h b/include/hw/intc/loongarch_ipi.h
> index 276b3040a3..64ebbdcba6 100644
> --- a/include/hw/intc/loongarch_ipi.h
> +++ b/include/hw/intc/loongarch_ipi.h
> @@ -22,4 +22,19 @@ struct LoongarchIPIClass {
> LoongsonIPICommonClass parent_class;
> };
>
> +#define TYPE_KVM_LOONGARCH_IPI "kvm_loongarch_ipi"
> +
> +OBJECT_DECLARE_TYPE(KVMLoongarchIPIState,
> + KVMLoongArchIPIClass, KVM_LOONGARCH_IPI)
> +
> +struct KVMLoongarchIPIState {
> + LoongsonIPICommonState parent_obj;
> + int dev_fd;
> +};
> +
> +struct KVMLoongArchIPIClass {
> + LoongsonIPICommonClass parent_class;
> + DeviceRealize parent_realize;
> + DeviceUnrealize parent_unrealize;
> +};
> #endif
> diff --git a/include/hw/intc/loongarch_pch_pic.h
> b/include/hw/intc/loongarch_pch_pic.h
> index d5437e88f2..bbde9e6de9 100644
> --- a/include/hw/intc/loongarch_pch_pic.h
> +++ b/include/hw/intc/loongarch_pch_pic.h
> @@ -5,9 +5,13 @@
> * Copyright (c) 2021 Loongson Technology Corporation Limited
> */
>
> +#ifndef LOONGARCH_PCH_PIC_H
> +#define LOONGARCH_PCH_PIC_H
> +
> #include "hw/sysbus.h"
>
> -#define TYPE_LOONGARCH_PCH_PIC "loongarch_pch_pic"
> +#define TYPE_LOONGARCH_PCH_PIC "loongarch_pch_pic"
> +#define TYPE_KVM_LOONGARCH_PCH_PIC "loongarch_kvm_pch_pic"
> #define PCH_PIC_NAME(name) TYPE_LOONGARCH_PCH_PIC#name
> OBJECT_DECLARE_SIMPLE_TYPE(LoongArchPCHPIC, LOONGARCH_PCH_PIC)
>
> @@ -28,15 +32,26 @@ OBJECT_DECLARE_SIMPLE_TYPE(LoongArchPCHPIC,
> LOONGARCH_PCH_PIC)
> #define PCH_PIC_AUTO_CTRL0_HI 0xc4
> #define PCH_PIC_AUTO_CTRL1_LO 0xe0
> #define PCH_PIC_AUTO_CTRL1_HI 0xe4
> -#define PCH_PIC_ROUTE_ENTRY_OFFSET 0x100
> +#define PCH_PIC_ROUTE_ENTRY_START 0x100
> #define PCH_PIC_ROUTE_ENTRY_END 0x13f
> -#define PCH_PIC_HTMSI_VEC_OFFSET 0x200
> +#define PCH_PIC_HTMSI_VEC_START 0x200
> #define PCH_PIC_HTMSI_VEC_END 0x23f
> #define PCH_PIC_INT_STATUS_LO 0x3a0
> #define PCH_PIC_INT_STATUS_HI 0x3a4
> #define PCH_PIC_INT_POL_LO 0x3e0
> #define PCH_PIC_INT_POL_HI 0x3e4
>
> +#define PCH_PIC_INT_ID_START PCH_PIC_INT_ID_LO
> +#define PCH_PIC_MASK_START PCH_PIC_INT_MASK_LO
> +#define PCH_PIC_HTMSI_EN_START PCH_PIC_HTMSI_EN_LO
> +#define PCH_PIC_EDGE_START PCH_PIC_INT_EDGE_LO
> +#define PCH_PIC_CLEAR_START PCH_PIC_INT_CLEAR_LO
> +#define PCH_PIC_AUTO_CTRL0_START PCH_PIC_AUTO_CTRL0_LO
> +#define PCH_PIC_AUTO_CTRL1_START PCH_PIC_AUTO_CTRL1_LO
> +#define PCH_PIC_INT_IRR_START 0x380
> +#define PCH_PIC_INT_ISR_START PCH_PIC_INT_STATUS_LO
> +#define PCH_PIC_POLARITY_START PCH_PIC_INT_POL_LO
> +
> #define STATUS_LO_START 0
> #define STATUS_HI_START 0x4
> #define POL_LO_START 0x40
> @@ -67,3 +82,40 @@ struct LoongArchPCHPIC {
> MemoryRegion iomem8;
> unsigned int irq_num;
> };
> +
> +struct KVMLoongArchPCHPIC {
> + SysBusDevice parent_obj;
> + uint64_t int_mask; /*0x020 interrupt mask register*/
> + uint64_t htmsi_en; /*0x040 1=msi*/
> + uint64_t intedge; /*0x060 edge=1 level =0*/
> + uint64_t intclr; /*0x080 for clean edge int,set 1 clean,set 0 is noused*/
> + uint64_t auto_crtl0; /*0x0c0*/
> + uint64_t auto_crtl1; /*0x0e0*/
> + uint64_t last_intirr; /* edge detection */
> + uint64_t intirr; /* 0x380 interrupt request register */
> + uint64_t intisr; /* 0x3a0 interrupt service register */
> + /*
> + * 0x3e0 interrupt level polarity selection
> + * register 0 for high level trigger
> + */
> + uint64_t int_polarity;
> +
> + uint8_t route_entry[64]; /*0x100 - 0x138*/
> + uint8_t htmsi_vector[64]; /*0x200 - 0x238*/
> +};
> +typedef struct KVMLoongArchPCHPIC KVMLoongArchPCHPIC;
> +DECLARE_INSTANCE_CHECKER(KVMLoongArchPCHPIC, KVM_LOONGARCH_PCH_PIC,
> + TYPE_KVM_LOONGARCH_PCH_PIC)
> +
> +struct KVMLoongArchPCHPICClass {
> + SysBusDeviceClass parent_class;
> + DeviceRealize parent_realize;
> +
> + bool is_created;
> + int dev_fd;
> +};
> +typedef struct KVMLoongArchPCHPICClass KVMLoongArchPCHPICClass;
> +DECLARE_CLASS_CHECKERS(KVMLoongArchPCHPICClass, KVM_LOONGARCH_PCH_PIC,
> + TYPE_KVM_LOONGARCH_PCH_PIC)
> +
> +#endif /* LOONGARCH_PCH_PIC_H */
> diff --git a/include/hw/intc/loongson_ipi.h b/include/hw/intc/loongson_ipi.h
> index 4e517cc8dc..57e0d94e2b 100644
> --- a/include/hw/intc/loongson_ipi.h
> +++ b/include/hw/intc/loongson_ipi.h
> @@ -27,5 +27,4 @@ struct LoongsonIPIState {
>
> MemoryRegion *ipi_mmio_mem;
> };
> -
> #endif
> diff --git a/include/hw/intc/loongson_ipi_common.h
> b/include/hw/intc/loongson_ipi_common.h
> index df9d9c5168..adba8ffd49 100644
> --- a/include/hw/intc/loongson_ipi_common.h
> +++ b/include/hw/intc/loongson_ipi_common.h
> @@ -45,6 +45,8 @@ struct LoongsonIPICommonClass {
> DeviceUnrealize parent_unrealize;
> AddressSpace *(*get_iocsr_as)(CPUState *cpu);
> CPUState *(*cpu_by_arch_id)(int64_t id);
> + void (*pre_save)(LoongsonIPICommonState *s);
> + void (*post_load)(LoongsonIPICommonState *s, int version_id);
> };
>
> MemTxResult loongson_ipi_core_readl(void *opaque, hwaddr addr, uint64_t
> *data,
> diff --git a/include/hw/loongarch/virt.h b/include/hw/loongarch/virt.h
> index c373e48f27..c1769fc20c 100644
> --- a/include/hw/loongarch/virt.h
> +++ b/include/hw/loongarch/virt.h
> @@ -36,6 +36,21 @@
>
> #define FDT_BASE 0x100000
>
> +/* KVM_IRQ_LINE irq field index values */
> +#define KVM_LOONGARCH_IRQ_TYPE_SHIFT 24
> +#define KVM_LOONGARCH_IRQ_TYPE_MASK 0xff
> +#define KVM_LOONGARCH_IRQ_VCPU_SHIFT 16
> +#define KVM_LOONGARCH_IRQ_VCPU_MASK 0xff
> +#define KVM_LOONGARCH_IRQ_NUM_SHIFT 0
> +#define KVM_LOONGARCH_IRQ_NUM_MASK 0xffff
> +
> +/* irq_type field */
> +#define KVM_LOONGARCH_IRQ_TYPE_CPU_IP 0
> +#define KVM_LOONGARCH_IRQ_TYPE_CPU_IO 1
> +#define KVM_LOONGARCH_IRQ_TYPE_HT 2
> +#define KVM_LOONGARCH_IRQ_TYPE_MSI 3
> +#define KVM_LOONGARCH_IRQ_TYPE_IOAPIC 4
> +
> struct LoongArchVirtMachineState {
> /*< private >*/
> MachineState parent_obj;
> diff --git a/linux-headers/asm-loongarch/kvm.h
> b/linux-headers/asm-loongarch/kvm.h
> index f9abef3823..e102d500a3 100644
> --- a/linux-headers/asm-loongarch/kvm.h
> +++ b/linux-headers/asm-loongarch/kvm.h
> @@ -108,4 +108,22 @@ struct kvm_iocsr_entry {
> #define KVM_IRQCHIP_NUM_PINS 64
> #define KVM_MAX_CORES 256
>
> +#define KVM_DEV_LOONGARCH_IPI_GRP_REGS 0x40000001
> +
> +#define KVM_DEV_LOONGARCH_EXTIOI_GRP_REGS 0x40000002
> +
> +#define KVM_DEV_LOONGARCH_EXTIOI_GRP_SW_STATUS 0x40000003
> +#define KVM_DEV_LOONGARCH_EXTIOI_SW_STATUS_NUM_CPU 0x0
> +#define KVM_DEV_LOONGARCH_EXTIOI_SW_STATUS_FEATURE 0x1
> +#define KVM_DEV_LOONGARCH_EXTIOI_SW_STATUS_STATE 0x2
> +
> +#define KVM_DEV_LOONGARCH_EXTIOI_GRP_CTRL 0x40000004
> +#define KVM_DEV_LOONGARCH_EXTIOI_CTRL_INIT_NUM_CPU 0x0
> +#define KVM_DEV_LOONGARCH_EXTIOI_CTRL_INIT_FEATURE 0x1
> +#define KVM_DEV_LOONGARCH_EXTIOI_CTRL_LOAD_FINISHED 0x3
> +
> +#define KVM_DEV_LOONGARCH_PCH_PIC_GRP_REGS 0x40000005
> +#define KVM_DEV_LOONGARCH_PCH_PIC_GRP_CTRL 0x40000006
> +#define KVM_DEV_LOONGARCH_PCH_PIC_CTRL_INIT 0
> +
> #endif /* __UAPI_ASM_LOONGARCH_KVM_H */
> diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
> index c93876ca0b..cd2aed735c 100644
> --- a/linux-headers/linux/kvm.h
> +++ b/linux-headers/linux/kvm.h
> @@ -1138,6 +1138,12 @@ enum kvm_device_type {
> #define KVM_DEV_TYPE_ARM_PV_TIME KVM_DEV_TYPE_ARM_PV_TIME
> KVM_DEV_TYPE_RISCV_AIA,
> #define KVM_DEV_TYPE_RISCV_AIA KVM_DEV_TYPE_RISCV_AIA
> + KVM_DEV_TYPE_LOONGARCH_PCH_PIC,
> +#define KVM_DEV_TYPE_LOONGARCH_PCH_PIC KVM_DEV_TYPE_LOONGARCH_PCH_PIC
> + KVM_DEV_TYPE_LOONGARCH_IPI,
> +#define KVM_DEV_TYPE_LOONGARCH_IPI KVM_DEV_TYPE_LOONGARCH_IPI
> + KVM_DEV_TYPE_LOONGARCH_EXTIOI,
> +#define KVM_DEV_TYPE_LOONGARCH_EXTIOI KVM_DEV_TYPE_LOONGARCH_EXTIOI
> KVM_DEV_TYPE_MAX,
> };
>
> --
> 2.39.1
--
- Jiaxun