diff options
-rw-r--r-- | arch/arm/kvm/arm.c | 2 | ||||
-rw-r--r-- | include/kvm/arm_vgic.h | 7 | ||||
-rw-r--r-- | virt/kvm/arm/vgic.c | 15 |
3 files changed, 19 insertions, 5 deletions
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index a7b94ecba0d8..3a51ffca75e3 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
@@ -851,7 +851,7 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
851 | switch (ioctl) { | 851 | switch (ioctl) { |
852 | case KVM_CREATE_IRQCHIP: { | 852 | case KVM_CREATE_IRQCHIP: { |
853 | if (vgic_present) | 853 | if (vgic_present) |
854 | return kvm_vgic_create(kvm); | 854 | return kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); |
855 | else | 855 | else |
856 | return -ENXIO; | 856 | return -ENXIO; |
857 | } | 857 | } |
diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h index ac4888dc86bc..525ce4228495 100644 --- a/include/kvm/arm_vgic.h +++ b/include/kvm/arm_vgic.h | |||
@@ -140,6 +140,9 @@ struct vgic_dist { | |||
140 | bool in_kernel; | 140 | bool in_kernel; |
141 | bool ready; | 141 | bool ready; |
142 | 142 | ||
143 | /* vGIC model the kernel emulates for the guest (GICv2 or GICv3) */ | ||
144 | u32 vgic_model; | ||
145 | |||
143 | int nr_cpus; | 146 | int nr_cpus; |
144 | int nr_irqs; | 147 | int nr_irqs; |
145 | 148 | ||
@@ -275,7 +278,7 @@ struct kvm_exit_mmio; | |||
275 | int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write); | 278 | int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write); |
276 | int kvm_vgic_hyp_init(void); | 279 | int kvm_vgic_hyp_init(void); |
277 | int kvm_vgic_map_resources(struct kvm *kvm); | 280 | int kvm_vgic_map_resources(struct kvm *kvm); |
278 | int kvm_vgic_create(struct kvm *kvm); | 281 | int kvm_vgic_create(struct kvm *kvm, u32 type); |
279 | void kvm_vgic_destroy(struct kvm *kvm); | 282 | void kvm_vgic_destroy(struct kvm *kvm); |
280 | void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu); | 283 | void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu); |
281 | void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu); | 284 | void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu); |
@@ -327,7 +330,7 @@ static inline int kvm_vgic_map_resources(struct kvm *kvm) | |||
327 | return 0; | 330 | return 0; |
328 | } | 331 | } |
329 | 332 | ||
330 | static inline int kvm_vgic_create(struct kvm *kvm) | 333 | static inline int kvm_vgic_create(struct kvm *kvm, u32 type) |
331 | { | 334 | { |
332 | return 0; | 335 | return 0; |
333 | } | 336 | } |
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c index c84f53dfcd62..283038e98d53 100644 --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c | |||
@@ -1698,6 +1698,16 @@ int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int irq_num, | |||
1698 | int vcpu_id; | 1698 | int vcpu_id; |
1699 | 1699 | ||
1700 | if (unlikely(!vgic_initialized(kvm))) { | 1700 | if (unlikely(!vgic_initialized(kvm))) { |
1701 | /* | ||
1702 | * We only provide the automatic initialization of the VGIC | ||
1703 | * for the legacy case of a GICv2. Any other type must | ||
1704 | * be explicitly initialized once setup with the respective | ||
1705 | * KVM device call. | ||
1706 | */ | ||
1707 | if (kvm->arch.vgic.vgic_model != KVM_DEV_TYPE_ARM_VGIC_V2) { | ||
1708 | ret = -EBUSY; | ||
1709 | goto out; | ||
1710 | } | ||
1701 | mutex_lock(&kvm->lock); | 1711 | mutex_lock(&kvm->lock); |
1702 | ret = vgic_init(kvm); | 1712 | ret = vgic_init(kvm); |
1703 | mutex_unlock(&kvm->lock); | 1713 | mutex_unlock(&kvm->lock); |
@@ -1935,7 +1945,7 @@ out: | |||
1935 | return ret; | 1945 | return ret; |
1936 | } | 1946 | } |
1937 | 1947 | ||
1938 | int kvm_vgic_create(struct kvm *kvm) | 1948 | int kvm_vgic_create(struct kvm *kvm, u32 type) |
1939 | { | 1949 | { |
1940 | int i, vcpu_lock_idx = -1, ret; | 1950 | int i, vcpu_lock_idx = -1, ret; |
1941 | struct kvm_vcpu *vcpu; | 1951 | struct kvm_vcpu *vcpu; |
@@ -1967,6 +1977,7 @@ int kvm_vgic_create(struct kvm *kvm) | |||
1967 | 1977 | ||
1968 | spin_lock_init(&kvm->arch.vgic.lock); | 1978 | spin_lock_init(&kvm->arch.vgic.lock); |
1969 | kvm->arch.vgic.in_kernel = true; | 1979 | kvm->arch.vgic.in_kernel = true; |
1980 | kvm->arch.vgic.vgic_model = type; | ||
1970 | kvm->arch.vgic.vctrl_base = vgic->vctrl_base; | 1981 | kvm->arch.vgic.vctrl_base = vgic->vctrl_base; |
1971 | kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF; | 1982 | kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF; |
1972 | kvm->arch.vgic.vgic_cpu_base = VGIC_ADDR_UNDEF; | 1983 | kvm->arch.vgic.vgic_cpu_base = VGIC_ADDR_UNDEF; |
@@ -2404,7 +2415,7 @@ static void vgic_destroy(struct kvm_device *dev) | |||
2404 | 2415 | ||
2405 | static int vgic_create(struct kvm_device *dev, u32 type) | 2416 | static int vgic_create(struct kvm_device *dev, u32 type) |
2406 | { | 2417 | { |
2407 | return kvm_vgic_create(dev->kvm); | 2418 | return kvm_vgic_create(dev->kvm, type); |
2408 | } | 2419 | } |
2409 | 2420 | ||
2410 | static struct kvm_device_ops kvm_arm_vgic_v2_ops = { | 2421 | static struct kvm_device_ops kvm_arm_vgic_v2_ops = { |