Now that there is support for GICv5 SPIs in KVM, update vgic_irqfd_set_irq() to handle GICv5 SPIs. This allows their state to be injected via that interface. Signed-off-by: Sascha Bischoff --- arch/arm64/kvm/vgic/vgic-irqfd.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-irqfd.c b/arch/arm64/kvm/vgic/vgic-irqfd.c index b9b86e3a6c862..3b9ebd8e367be 100644 --- a/arch/arm64/kvm/vgic/vgic-irqfd.c +++ b/arch/arm64/kvm/vgic/vgic-irqfd.c @@ -9,6 +9,8 @@ #include #include "vgic.h" +#include + /* * vgic_irqfd_set_irq: inject the IRQ corresponding to the * irqchip routing entry @@ -19,7 +21,12 @@ static int vgic_irqfd_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm *kvm, int irq_source_id, int level, bool line_status) { - unsigned int spi_id = e->irqchip.pin + VGIC_NR_PRIVATE_IRQS; + unsigned int spi_id; + + if (kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V5) + spi_id = vgic_v5_make_spi(e->irqchip.pin & GICV5_HWIRQ_ID); + else + spi_id = e->irqchip.pin + VGIC_NR_PRIVATE_IRQS; if (!vgic_valid_spi(kvm, spi_id)) return -EINVAL; @@ -39,6 +46,8 @@ int kvm_set_routing_entry(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, const struct kvm_irq_routing_entry *ue) { + unsigned int nr_pins = vgic_is_v5(kvm) ? kvm->arch.vgic.nr_spis : + KVM_IRQCHIP_NUM_PINS; int r = -EINVAL; switch (ue->type) { @@ -46,7 +55,7 @@ int kvm_set_routing_entry(struct kvm *kvm, e->set = vgic_irqfd_set_irq; e->irqchip.irqchip = ue->u.irqchip.irqchip; e->irqchip.pin = ue->u.irqchip.pin; - if ((e->irqchip.pin >= KVM_IRQCHIP_NUM_PINS) || + if ((e->irqchip.pin >= nr_pins) || (e->irqchip.irqchip >= KVM_NR_IRQCHIPS)) goto out; break; -- 2.34.1