aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm
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 /virt/kvm
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>
Diffstat (limited to 'virt/kvm')
-rw-r--r--virt/kvm/arm/vgic.c15
1 files changed, 13 insertions, 2 deletions
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 = {