]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: gic-v5: Introduce kvm_arm_vgic_v5_ops and register them
authorSascha Bischoff <Sascha.Bischoff@arm.com>
Thu, 19 Mar 2026 15:58:48 +0000 (15:58 +0000)
committerMarc Zyngier <maz@kernel.org>
Thu, 19 Mar 2026 18:21:29 +0000 (18:21 +0000)
Only the KVM_DEV_ARM_VGIC_GRP_CTRL->KVM_DEV_ARM_VGIC_CTRL_INIT op is
currently supported. All other ops are stubbed out.

Co-authored-by: Timothy Hayes <timothy.hayes@arm.com>
Signed-off-by: Timothy Hayes <timothy.hayes@arm.com>
Signed-off-by: Sascha Bischoff <sascha.bischoff@arm.com>
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
Link: https://patch.msgid.link/20260319154937.3619520-36-sascha.bischoff@arm.com
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/vgic/vgic-kvm-device.c
include/linux/kvm_host.h

index b12ba99a423e52469c265915a29cfc7446c78cb3..772da54c1518bbdfbd4bddd007a41821f2ef973b 100644 (file)
@@ -336,6 +336,10 @@ int kvm_register_vgic_device(unsigned long type)
                        break;
                ret = kvm_vgic_register_its_device();
                break;
+       case KVM_DEV_TYPE_ARM_VGIC_V5:
+               ret = kvm_register_device_ops(&kvm_arm_vgic_v5_ops,
+                                             KVM_DEV_TYPE_ARM_VGIC_V5);
+               break;
        }
 
        return ret;
@@ -715,3 +719,73 @@ struct kvm_device_ops kvm_arm_vgic_v3_ops = {
        .get_attr = vgic_v3_get_attr,
        .has_attr = vgic_v3_has_attr,
 };
+
+static int vgic_v5_set_attr(struct kvm_device *dev,
+                           struct kvm_device_attr *attr)
+{
+       switch (attr->group) {
+       case KVM_DEV_ARM_VGIC_GRP_ADDR:
+       case KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS:
+       case KVM_DEV_ARM_VGIC_GRP_NR_IRQS:
+               return -ENXIO;
+       case KVM_DEV_ARM_VGIC_GRP_CTRL:
+               switch (attr->attr) {
+               case KVM_DEV_ARM_VGIC_CTRL_INIT:
+                       return vgic_set_common_attr(dev, attr);
+               default:
+                       return -ENXIO;
+               }
+       default:
+               return -ENXIO;
+       }
+
+}
+
+static int vgic_v5_get_attr(struct kvm_device *dev,
+                           struct kvm_device_attr *attr)
+{
+       switch (attr->group) {
+       case KVM_DEV_ARM_VGIC_GRP_ADDR:
+       case KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS:
+       case KVM_DEV_ARM_VGIC_GRP_NR_IRQS:
+               return -ENXIO;
+       case KVM_DEV_ARM_VGIC_GRP_CTRL:
+               switch (attr->attr) {
+               case KVM_DEV_ARM_VGIC_CTRL_INIT:
+                       return vgic_get_common_attr(dev, attr);
+               default:
+                       return -ENXIO;
+               }
+       default:
+               return -ENXIO;
+       }
+}
+
+static int vgic_v5_has_attr(struct kvm_device *dev,
+                           struct kvm_device_attr *attr)
+{
+       switch (attr->group) {
+       case KVM_DEV_ARM_VGIC_GRP_ADDR:
+       case KVM_DEV_ARM_VGIC_GRP_CPU_SYSREGS:
+       case KVM_DEV_ARM_VGIC_GRP_NR_IRQS:
+               return -ENXIO;
+       case KVM_DEV_ARM_VGIC_GRP_CTRL:
+               switch (attr->attr) {
+               case KVM_DEV_ARM_VGIC_CTRL_INIT:
+                       return 0;
+               default:
+                       return -ENXIO;
+               }
+       default:
+               return -ENXIO;
+       }
+}
+
+struct kvm_device_ops kvm_arm_vgic_v5_ops = {
+       .name = "kvm-arm-vgic-v5",
+       .create = vgic_create,
+       .destroy = vgic_destroy,
+       .set_attr = vgic_v5_set_attr,
+       .get_attr = vgic_v5_get_attr,
+       .has_attr = vgic_v5_has_attr,
+};
index 6b76e7a6f4c2244e5f1686f191895876649f27a9..779d9ed85cbfd7cc5f1c3c799eca198b8ba6df16 100644 (file)
@@ -2366,6 +2366,7 @@ void kvm_unregister_device_ops(u32 type);
 extern struct kvm_device_ops kvm_mpic_ops;
 extern struct kvm_device_ops kvm_arm_vgic_v2_ops;
 extern struct kvm_device_ops kvm_arm_vgic_v3_ops;
+extern struct kvm_device_ops kvm_arm_vgic_v5_ops;
 
 #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT