|
@@ -1698,6 +1698,16 @@ int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int irq_num,
|
|
|
int vcpu_id;
|
|
|
|
|
|
if (unlikely(!vgic_initialized(kvm))) {
|
|
|
+ /*
|
|
|
+ * We only provide the automatic initialization of the VGIC
|
|
|
+ * for the legacy case of a GICv2. Any other type must
|
|
|
+ * be explicitly initialized once setup with the respective
|
|
|
+ * KVM device call.
|
|
|
+ */
|
|
|
+ if (kvm->arch.vgic.vgic_model != KVM_DEV_TYPE_ARM_VGIC_V2) {
|
|
|
+ ret = -EBUSY;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
mutex_lock(&kvm->lock);
|
|
|
ret = vgic_init(kvm);
|
|
|
mutex_unlock(&kvm->lock);
|
|
@@ -1935,7 +1945,7 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-int kvm_vgic_create(struct kvm *kvm)
|
|
|
+int kvm_vgic_create(struct kvm *kvm, u32 type)
|
|
|
{
|
|
|
int i, vcpu_lock_idx = -1, ret;
|
|
|
struct kvm_vcpu *vcpu;
|
|
@@ -1967,6 +1977,7 @@ int kvm_vgic_create(struct kvm *kvm)
|
|
|
|
|
|
spin_lock_init(&kvm->arch.vgic.lock);
|
|
|
kvm->arch.vgic.in_kernel = true;
|
|
|
+ kvm->arch.vgic.vgic_model = type;
|
|
|
kvm->arch.vgic.vctrl_base = vgic->vctrl_base;
|
|
|
kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF;
|
|
|
kvm->arch.vgic.vgic_cpu_base = VGIC_ADDR_UNDEF;
|
|
@@ -2404,7 +2415,7 @@ static void vgic_destroy(struct kvm_device *dev)
|
|
|
|
|
|
static int vgic_create(struct kvm_device *dev, u32 type)
|
|
|
{
|
|
|
- return kvm_vgic_create(dev->kvm);
|
|
|
+ return kvm_vgic_create(dev->kvm, type);
|
|
|
}
|
|
|
|
|
|
static struct kvm_device_ops kvm_arm_vgic_v2_ops = {
|