]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: Set ID_{AA64PFR0,PFR1}_EL1.GIC when GICv3 is configured
authorMarc Zyngier <maz@kernel.org>
Thu, 30 Oct 2025 12:27:06 +0000 (12:27 +0000)
committerMarc Zyngier <maz@kernel.org>
Sat, 8 Nov 2025 11:17:28 +0000 (11:17 +0000)
Drive the idreg fields indicating the presence of GICv3 directly from
the vgic code. This avoids having to do any sort of runtime clearing
of the idreg.

Fixes: 5cb57a1aff755 ("KVM: arm64: Zero ID_AA64PFR0_EL1.GIC when no GICv3 is presented to the guest")
Reviewed-by: Oliver Upton <oupton@kernel.org>
Link: https://patch.msgid.link/20251030122707.2033690-3-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/vgic/vgic-init.c

index 1796b1a22a72a1f7b351f1518c76d62ef3954017..ca411cce41409d3edf52be54707b52f3f5a879a3 100644 (file)
@@ -71,6 +71,7 @@ static int vgic_allocate_private_irqs_locked(struct kvm_vcpu *vcpu, u32 type);
 int kvm_vgic_create(struct kvm *kvm, u32 type)
 {
        struct kvm_vcpu *vcpu;
+       u64 aa64pfr0, pfr1;
        unsigned long i;
        int ret;
 
@@ -161,10 +162,19 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
 
        kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF;
 
-       if (type == KVM_DEV_TYPE_ARM_VGIC_V2)
+       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;
+
+       if (type == KVM_DEV_TYPE_ARM_VGIC_V2) {
                kvm->arch.vgic.vgic_cpu_base = VGIC_ADDR_UNDEF;
-       else
+       } else {
                INIT_LIST_HEAD(&kvm->arch.vgic.rd_regions);
+               aa64pfr0 |= SYS_FIELD_PREP_ENUM(ID_AA64PFR0_EL1, GIC, IMP);
+               pfr1 |= SYS_FIELD_PREP_ENUM(ID_PFR1_EL1, GIC, GICv3);
+       }
+
+       kvm_set_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1, aa64pfr0);
+       kvm_set_vm_id_reg(kvm, SYS_ID_PFR1_EL1, pfr1);
 
        if (type == KVM_DEV_TYPE_ARM_VGIC_V3)
                kvm->arch.vgic.nassgicap = system_supports_direct_sgis();