aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/kvm/arm.c2
-rw-r--r--include/kvm/arm_vgic.h7
-rw-r--r--virt/kvm/arm/vgic.c15
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;
275int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write); 278int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write);
276int kvm_vgic_hyp_init(void); 279int kvm_vgic_hyp_init(void);
277int kvm_vgic_map_resources(struct kvm *kvm); 280int kvm_vgic_map_resources(struct kvm *kvm);
278int kvm_vgic_create(struct kvm *kvm); 281int kvm_vgic_create(struct kvm *kvm, u32 type);
279void kvm_vgic_destroy(struct kvm *kvm); 282void kvm_vgic_destroy(struct kvm *kvm);
280void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu); 283void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu);
281void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu); 284void 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
330static inline int kvm_vgic_create(struct kvm *kvm) 333static 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
1938int kvm_vgic_create(struct kvm *kvm) 1948int 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
2405static int vgic_create(struct kvm_device *dev, u32 type) 2416static 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
2410static struct kvm_device_ops kvm_arm_vgic_v2_ops = { 2421static struct kvm_device_ops kvm_arm_vgic_v2_ops = {