Commit 1928254c authored by Xianglai Li's avatar Xianglai Li Committed by Huacai Chen
Browse files

LoongArch: KVM: Add irqfd support



Enable the KVM_IRQ_ROUTING/KVM_IRQCHIP/KVM_MSI configuration items,
add the KVM_CAP_IRQCHIP capability, and implement the query interface
of the in-kernel irqchip.

Signed-off-by: default avatarXianglai Li <lixianglai@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent d206d951
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include <asm/kvm_pch_pic.h>
#include <asm/loongarch.h>

#define __KVM_HAVE_ARCH_INTC_INITIALIZED

/* Loongarch KVM register ids */
#define KVM_GET_IOC_CSR_IDX(id)		((id & KVM_CSR_IDX_MASK) >> LOONGARCH_REG_SHIFT)
#define KVM_GET_IOC_CPUCFG_IDX(id)	((id & KVM_CPUCFG_IDX_MASK) >> LOONGARCH_REG_SHIFT)
+2 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@

#include <linux/types.h>

#define __KVM_HAVE_IRQ_LINE

/*
 * KVM LoongArch specific structures and definitions.
 *
+4 −1
Original line number Diff line number Diff line
@@ -21,13 +21,16 @@ config KVM
	tristate "Kernel-based Virtual Machine (KVM) support"
	depends on AS_HAS_LVZ_EXTENSION
	select HAVE_KVM_DIRTY_RING_ACQ_REL
	select HAVE_KVM_IRQ_ROUTING
	select HAVE_KVM_IRQCHIP
	select HAVE_KVM_MSI
	select HAVE_KVM_READONLY_MEM
	select HAVE_KVM_VCPU_ASYNC_IOCTL
	select KVM_COMMON
	select KVM_GENERIC_DIRTYLOG_READ_PROTECT
	select KVM_GENERIC_HARDWARE_ENABLING
	select KVM_GENERIC_MMU_NOTIFIER
	select KVM_MMIO
	select HAVE_KVM_READONLY_MEM
	select KVM_XFER_TO_GUEST_WORK
	select SCHED_INFO
	help
+1 −0
Original line number Diff line number Diff line
@@ -21,5 +21,6 @@ kvm-y += vm.o
kvm-y += intc/ipi.o
kvm-y += intc/eiointc.o
kvm-y += intc/pch_pic.o
kvm-y += irqfd.o

CFLAGS_exit.o	+= $(call cc-option,-Wno-override-init,)
+27 −0
Original line number Diff line number Diff line
@@ -443,8 +443,31 @@ static int kvm_pch_pic_set_attr(struct kvm_device *dev,
	}
}

static int kvm_setup_default_irq_routing(struct kvm *kvm)
{
	int i, ret;
	u32 nr = KVM_IRQCHIP_NUM_PINS;
	struct kvm_irq_routing_entry *entries;

	entries = kcalloc(nr, sizeof(*entries), GFP_KERNEL);
	if (!entries)
		return -ENOMEM;

	for (i = 0; i < nr; i++) {
		entries[i].gsi = i;
		entries[i].type = KVM_IRQ_ROUTING_IRQCHIP;
		entries[i].u.irqchip.irqchip = 0;
		entries[i].u.irqchip.pin = i;
	}
	ret = kvm_set_irq_routing(kvm, entries, nr, 0);
	kfree(entries);

	return ret;
}

static int kvm_pch_pic_create(struct kvm_device *dev, u32 type)
{
	int ret;
	struct kvm *kvm = dev->kvm;
	struct loongarch_pch_pic *s;

@@ -452,6 +475,10 @@ static int kvm_pch_pic_create(struct kvm_device *dev, u32 type)
	if (kvm->arch.pch_pic)
		return -EINVAL;

	ret = kvm_setup_default_irq_routing(kvm);
	if (ret)
		return -ENOMEM;

	s = kzalloc(sizeof(struct loongarch_pch_pic), GFP_KERNEL);
	if (!s)
		return -ENOMEM;
Loading