aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@arm.com>2014-06-03 03:33:10 -0400
committerChristoffer Dall <christoffer.dall@linaro.org>2015-01-20 12:25:25 -0500
commit59892136c40d6735e627dcea6a056380dfd6721d (patch)
tree1e6f37ba718a4e6d57d6b202fc611f09f7525718
parent4429fc64b90368e9bc93f933ea8b011d8db3a2f2 (diff)
arm/arm64: KVM: pass down user space provided GIC type into vGIC code
With the introduction of a second emulated GIC model we need to let userspace specify the GIC model to use for each VM. Pass the userspace provided value down into the vGIC code and store it there to differentiate later. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Acked-by: Christoffer Dall <christoffer.dall@linaro.org> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
-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 = {