diff options
-rw-r--r-- | virt/kvm/arm/vgic/vgic-init.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c index bdbc297d06fb..e621b5d45b27 100644 --- a/virt/kvm/arm/vgic/vgic-init.c +++ b/virt/kvm/arm/vgic/vgic-init.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/cpu.h> | 8 | #include <linux/cpu.h> |
9 | #include <linux/kvm_host.h> | 9 | #include <linux/kvm_host.h> |
10 | #include <kvm/arm_vgic.h> | 10 | #include <kvm/arm_vgic.h> |
11 | #include <asm/kvm_emulate.h> | ||
11 | #include <asm/kvm_mmu.h> | 12 | #include <asm/kvm_mmu.h> |
12 | #include "vgic.h" | 13 | #include "vgic.h" |
13 | 14 | ||
@@ -164,12 +165,18 @@ static int kvm_vgic_dist_init(struct kvm *kvm, unsigned int nr_spis) | |||
164 | irq->vcpu = NULL; | 165 | irq->vcpu = NULL; |
165 | irq->target_vcpu = vcpu0; | 166 | irq->target_vcpu = vcpu0; |
166 | kref_init(&irq->refcount); | 167 | kref_init(&irq->refcount); |
167 | if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V2) { | 168 | switch (dist->vgic_model) { |
169 | case KVM_DEV_TYPE_ARM_VGIC_V2: | ||
168 | irq->targets = 0; | 170 | irq->targets = 0; |
169 | irq->group = 0; | 171 | irq->group = 0; |
170 | } else { | 172 | break; |
173 | case KVM_DEV_TYPE_ARM_VGIC_V3: | ||
171 | irq->mpidr = 0; | 174 | irq->mpidr = 0; |
172 | irq->group = 1; | 175 | irq->group = 1; |
176 | break; | ||
177 | default: | ||
178 | kfree(dist->spis); | ||
179 | return -EINVAL; | ||
173 | } | 180 | } |
174 | } | 181 | } |
175 | return 0; | 182 | return 0; |
@@ -209,7 +216,6 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) | |||
209 | irq->intid = i; | 216 | irq->intid = i; |
210 | irq->vcpu = NULL; | 217 | irq->vcpu = NULL; |
211 | irq->target_vcpu = vcpu; | 218 | irq->target_vcpu = vcpu; |
212 | irq->targets = 1U << vcpu->vcpu_id; | ||
213 | kref_init(&irq->refcount); | 219 | kref_init(&irq->refcount); |
214 | if (vgic_irq_is_sgi(i)) { | 220 | if (vgic_irq_is_sgi(i)) { |
215 | /* SGIs */ | 221 | /* SGIs */ |
@@ -219,11 +225,6 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) | |||
219 | /* PPIs */ | 225 | /* PPIs */ |
220 | irq->config = VGIC_CONFIG_LEVEL; | 226 | irq->config = VGIC_CONFIG_LEVEL; |
221 | } | 227 | } |
222 | |||
223 | if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) | ||
224 | irq->group = 1; | ||
225 | else | ||
226 | irq->group = 0; | ||
227 | } | 228 | } |
228 | 229 | ||
229 | if (!irqchip_in_kernel(vcpu->kvm)) | 230 | if (!irqchip_in_kernel(vcpu->kvm)) |
@@ -286,10 +287,19 @@ int vgic_init(struct kvm *kvm) | |||
286 | 287 | ||
287 | for (i = 0; i < VGIC_NR_PRIVATE_IRQS; i++) { | 288 | for (i = 0; i < VGIC_NR_PRIVATE_IRQS; i++) { |
288 | struct vgic_irq *irq = &vgic_cpu->private_irqs[i]; | 289 | struct vgic_irq *irq = &vgic_cpu->private_irqs[i]; |
289 | if (dist->vgic_model == KVM_DEV_TYPE_ARM_VGIC_V3) | 290 | switch (dist->vgic_model) { |
291 | case KVM_DEV_TYPE_ARM_VGIC_V3: | ||
290 | irq->group = 1; | 292 | irq->group = 1; |
291 | else | 293 | irq->mpidr = kvm_vcpu_get_mpidr_aff(vcpu); |
294 | break; | ||
295 | case KVM_DEV_TYPE_ARM_VGIC_V2: | ||
292 | irq->group = 0; | 296 | irq->group = 0; |
297 | irq->targets = 1U << idx; | ||
298 | break; | ||
299 | default: | ||
300 | ret = -EINVAL; | ||
301 | goto out; | ||
302 | } | ||
293 | } | 303 | } |
294 | } | 304 | } |
295 | 305 | ||