[PATCH v2 23/36] KVM: arm64: gic-v5: Support GICv5 interrupts with KVM_IRQ_LINE
Jonathan Cameron
jonathan.cameron at huawei.com
Wed Jan 7 07:29:05 PST 2026
On Fri, 19 Dec 2025 15:52:43 +0000
Sascha Bischoff <Sascha.Bischoff at arm.com> wrote:
> Interrupts under GICv5 look quite different to those from older Arm
> GICs. Specifically, the type is encoded in the top bits of the
> interrupt ID.
>
> Extend KVM_IRQ_LINE to cope with GICv5 PPIs and SPIs. The requires
> subtly changing the KVM_IRQ_LINE API for GICv5 guests. For older Arm
> GICs, PPIs had to be in the range of 16-31, and SPIs had to be
> 32-1019, but this no longer holds true for GICv5. Instead, for a GICv5
> guest support PPIs in the range of 0-127, and SPIs in the range
> 0-65535. The documentation is updated accordingly.
>
> The SPI range doesn't cover the full SPI range that a GICv5 system can
> potentially cope with (GICv5 provides up to 24-bits of SPI ID space,
> and we only have 16 bits to work with in KVM_IRQ_LINE). However, 65k
> SPIs is more than would be reasonably expected on systems for years to
> come.
>
> Note: As the GICv5 KVM implementation currently doesn't support
> injecting SPIs attempts to do so will fail. This restruction will
restriction
In general, worth spell checking the lot. (something I always
forget to do for my own series!)
> lifted as the GICv5 KVM support evolves.
>
> Co-authored-by: Timothy Hayes <timothy.hayes at arm.com>
> Signed-off-by: Timothy Hayes <timothy.hayes at arm.com>
> Signed-off-by: Sascha Bischoff <sascha.bischoff at arm.com>
One passing comment inline. Perhaps there isn't a suitable place to put
vgic_is_v5() though. I haven't checked.
Reviewed-by: Jonathan Cameron <jonathan.cameron at huawei.com>
> ---
> Documentation/virt/kvm/api.rst | 6 ++++--
> arch/arm64/kvm/arm.c | 21 ++++++++++++++++++---
> arch/arm64/kvm/vgic/vgic.c | 4 ++++
> 3 files changed, 26 insertions(+), 5 deletions(-)
>
> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> index 94f8d13ab3b58..4448e8a5fc076 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -45,6 +45,8 @@
> #include <kvm/arm_pmu.h>
> #include <kvm/arm_psci.h>
>
> +#include <linux/irqchip/arm-gic-v5.h>
> +
> #include "sys_regs.h"
>
> static enum kvm_mode kvm_mode = KVM_MODE_DEFAULT;
> @@ -1430,16 +1432,29 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level,
> if (!vcpu)
> return -EINVAL;
>
> - if (irq_num < VGIC_NR_SGIS || irq_num >= VGIC_NR_PRIVATE_IRQS)
> + if (kvm->arch.vgic.vgic_model == KVM_DEV_TYPE_ARM_VGIC_V5) {
Maybe it's worth moving the vgic_is_v5() helper to somewhere that makes it useable
here?
> + if (irq_num >= VGIC_V5_NR_PRIVATE_IRQS)
> + return -EINVAL;
> +
> + /* Build a GICv5-style IntID here */
> + irq_num |= FIELD_PREP(GICV5_HWIRQ_TYPE, GICV5_HWIRQ_TYPE_PPI);
> + } else if (irq_num < VGIC_NR_SGIS ||
> + irq_num >= VGIC_NR_PRIVATE_IRQS) {
> return -EINVAL;
> + }
>
> return kvm_vgic_inject_irq(kvm, vcpu, irq_num, level, NULL);
More information about the linux-arm-kernel
mailing list