[PATCH v2 13/36] KVM: arm64: gic: Set vgic_model before initing private IRQs
Sascha Bischoff
Sascha.Bischoff at arm.com
Thu Jan 8 05:39:05 PST 2026
On Wed, 2026-01-07 at 11:24 +0000, Jonathan Cameron wrote:
> On Fri, 19 Dec 2025 15:52:40 +0000
> Sascha Bischoff <Sascha.Bischoff at arm.com> wrote:
>
> > Different GIC types require the private IRQs to be initialised
> > differently. GICv5 is the culprit as it supports both a different
> > number of private IRQs, and all of these are PPIs (there are no
> > SGIs). Moreover, as GICv5 uses the top bits of the interrupt ID to
> > encode the type, the intid also needs to computed differently.
> >
> > Up until now, the GIC model has been set after initialising the
> > private IRQs for a VCPU. Move this earlier to ensure that the GIC
> > model is available when configuring the private IRQs.
> Hi Sascha,
>
> Good to mention you are moving a bit more than just the type
> initialization.
Done.
> One question on whether it makes sense to move
> vgic_dist_base inline.
It doesn't. It is an artifact left over from prising out the PPI
support from the rest of the GICv5 support (coming soon), and actually
I'm sure that it is not needed there anymore so have dropped it.
>
> >
> > Signed-off-by: Sascha Bischoff <sascha.bischoff at arm.com>
> > ---
> > arch/arm64/kvm/vgic/vgic-init.c | 12 ++++++------
> > 1 file changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/arch/arm64/kvm/vgic/vgic-init.c
> > b/arch/arm64/kvm/vgic/vgic-init.c
> > index c602f24bab1bb..bcc2c79f7833c 100644
> > --- a/arch/arm64/kvm/vgic/vgic-init.c
> > +++ b/arch/arm64/kvm/vgic/vgic-init.c
> > @@ -140,6 +140,12 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
> > goto out_unlock;
> > }
> >
> > + kvm->arch.vgic.in_kernel = true;
> > + kvm->arch.vgic.vgic_model = type;
> > + kvm->arch.vgic.implementation_rev =
> > KVM_VGIC_IMP_REV_LATEST;
>
> Moving these looks fine.
>
> > +
> > + kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF;
>
> Does this need to move?
>
I've reverted this line of the change.
Thanks,
Sascha
> > The rest of the *base =
> stuff is still where this code originally came from.
> Might well be necessary but I'd expect a little in the patch
> description on why.
>
> > +
> > kvm_for_each_vcpu(i, vcpu, kvm) {
> > ret = vgic_allocate_private_irqs_locked(vcpu,
> > type);
> > if (ret)
> > @@ -156,12 +162,6 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
> > goto out_unlock;
> > }
> >
> > - kvm->arch.vgic.in_kernel = true;
> > - kvm->arch.vgic.vgic_model = type;
> > - kvm->arch.vgic.implementation_rev =
> > KVM_VGIC_IMP_REV_LATEST;
> > -
> > - kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF;
> > -
> > aa64pfr0 = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1) &
> > ~ID_AA64PFR0_EL1_GIC;
> > pfr1 = kvm_read_vm_id_reg(kvm, SYS_ID_PFR1_EL1) &
> > ~ID_PFR1_EL1_GIC;
> >
>
More information about the linux-arm-kernel
mailing list