Commit ea2f83a7 authored by Andre Przywara's avatar Andre Przywara Committed by Christoffer Dall

arm/arm64: KVM: move kvm_register_device_ops() into vGIC probing

Currently we unconditionally register the GICv2 emulation device
during the host's KVM initialization. Since with GICv3 support we
may end up with only v2 or only v3 or both supported, we move the
registration into the GIC probing function, where we will later know
which combination is valid.
Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
Acked-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
parent b26e5fda
...@@ -1051,6 +1051,7 @@ void kvm_unregister_device_ops(u32 type); ...@@ -1051,6 +1051,7 @@ void kvm_unregister_device_ops(u32 type);
extern struct kvm_device_ops kvm_mpic_ops; extern struct kvm_device_ops kvm_mpic_ops;
extern struct kvm_device_ops kvm_xics_ops; extern struct kvm_device_ops kvm_xics_ops;
extern struct kvm_device_ops kvm_arm_vgic_v2_ops;
#ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT #ifdef CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT
......
...@@ -229,6 +229,8 @@ int vgic_v2_probe(struct device_node *vgic_node, ...@@ -229,6 +229,8 @@ int vgic_v2_probe(struct device_node *vgic_node,
goto out_unmap; goto out_unmap;
} }
kvm_register_device_ops(&kvm_arm_vgic_v2_ops, KVM_DEV_TYPE_ARM_VGIC_V2);
vgic->vcpu_base = vcpu_res.start; vgic->vcpu_base = vcpu_res.start;
kvm_info("%s@%llx IRQ%d\n", vgic_node->name, kvm_info("%s@%llx IRQ%d\n", vgic_node->name,
......
...@@ -230,6 +230,7 @@ int vgic_v3_probe(struct device_node *vgic_node, ...@@ -230,6 +230,7 @@ int vgic_v3_probe(struct device_node *vgic_node,
ret = -ENXIO; ret = -ENXIO;
goto out; goto out;
} }
kvm_register_device_ops(&kvm_arm_vgic_v2_ops, KVM_DEV_TYPE_ARM_VGIC_V2);
vgic->vcpu_base = vcpu_res.start; vgic->vcpu_base = vcpu_res.start;
vgic->vctrl_base = NULL; vgic->vctrl_base = NULL;
......
...@@ -2564,7 +2564,7 @@ static int vgic_create(struct kvm_device *dev, u32 type) ...@@ -2564,7 +2564,7 @@ static int vgic_create(struct kvm_device *dev, u32 type)
return kvm_vgic_create(dev->kvm, type); return kvm_vgic_create(dev->kvm, type);
} }
static struct kvm_device_ops kvm_arm_vgic_v2_ops = { struct kvm_device_ops kvm_arm_vgic_v2_ops = {
.name = "kvm-arm-vgic", .name = "kvm-arm-vgic",
.create = vgic_create, .create = vgic_create,
.destroy = vgic_destroy, .destroy = vgic_destroy,
...@@ -2643,8 +2643,7 @@ int kvm_vgic_hyp_init(void) ...@@ -2643,8 +2643,7 @@ int kvm_vgic_hyp_init(void)
on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1); on_each_cpu(vgic_init_maintenance_interrupt, NULL, 1);
return kvm_register_device_ops(&kvm_arm_vgic_v2_ops, return 0;
KVM_DEV_TYPE_ARM_VGIC_V2);
out_free_irq: out_free_irq:
free_percpu_irq(vgic->maint_irq, kvm_get_running_vcpus()); free_percpu_irq(vgic->maint_irq, kvm_get_running_vcpus());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment