diff options
| author | Marc Zyngier <marc.zyngier@arm.com> | 2014-07-08 07:09:05 -0400 |
|---|---|---|
| committer | Christoffer Dall <christoffer.dall@linaro.org> | 2014-09-18 21:48:57 -0400 |
| commit | 5fb66da64064d0cb8dcce4cc8bf4cb1b921b13a0 (patch) | |
| tree | 2c7bccc3459029a9c55bd356fcdbe68369bf4acc | |
| parent | c3c918361adcceb816c92b21dd95d2b46fb96a8f (diff) | |
arm/arm64: KVM: vgic: kill VGIC_NR_IRQS
Nuke VGIC_NR_IRQS entierly, now that the distributor instance
contains the number of IRQ allocated to this GIC.
Also add VGIC_NR_IRQS_LEGACY to preserve the current API.
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
| -rw-r--r-- | include/kvm/arm_vgic.h | 6 | ||||
| -rw-r--r-- | virt/kvm/arm/vgic.c | 17 |
2 files changed, 14 insertions, 9 deletions
diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h index 2767f939f47c..aa20d4a7242f 100644 --- a/include/kvm/arm_vgic.h +++ b/include/kvm/arm_vgic.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #include <linux/spinlock.h> | 25 | #include <linux/spinlock.h> |
| 26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
| 27 | 27 | ||
| 28 | #define VGIC_NR_IRQS 256 | 28 | #define VGIC_NR_IRQS_LEGACY 256 |
| 29 | #define VGIC_NR_SGIS 16 | 29 | #define VGIC_NR_SGIS 16 |
| 30 | #define VGIC_NR_PPIS 16 | 30 | #define VGIC_NR_PPIS 16 |
| 31 | #define VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS) | 31 | #define VGIC_NR_PRIVATE_IRQS (VGIC_NR_SGIS + VGIC_NR_PPIS) |
| @@ -39,11 +39,11 @@ | |||
| 39 | #error Invalid number of CPU interfaces | 39 | #error Invalid number of CPU interfaces |
| 40 | #endif | 40 | #endif |
| 41 | 41 | ||
| 42 | #if (VGIC_NR_IRQS & 31) | 42 | #if (VGIC_NR_IRQS_LEGACY & 31) |
| 43 | #error "VGIC_NR_IRQS must be a multiple of 32" | 43 | #error "VGIC_NR_IRQS must be a multiple of 32" |
| 44 | #endif | 44 | #endif |
| 45 | 45 | ||
| 46 | #if (VGIC_NR_IRQS > VGIC_MAX_IRQS) | 46 | #if (VGIC_NR_IRQS_LEGACY > VGIC_MAX_IRQS) |
| 47 | #error "VGIC_NR_IRQS must be <= 1024" | 47 | #error "VGIC_NR_IRQS must be <= 1024" |
| 48 | #endif | 48 | #endif |
| 49 | 49 | ||
diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c index 973eaf7ebe98..725d829ad1d9 100644 --- a/virt/kvm/arm/vgic.c +++ b/virt/kvm/arm/vgic.c | |||
| @@ -439,7 +439,7 @@ static bool handle_mmio_misc(struct kvm_vcpu *vcpu, | |||
| 439 | 439 | ||
| 440 | case 4: /* GICD_TYPER */ | 440 | case 4: /* GICD_TYPER */ |
| 441 | reg = (atomic_read(&vcpu->kvm->online_vcpus) - 1) << 5; | 441 | reg = (atomic_read(&vcpu->kvm->online_vcpus) - 1) << 5; |
| 442 | reg |= (VGIC_NR_IRQS >> 5) - 1; | 442 | reg |= (vcpu->kvm->arch.vgic.nr_irqs >> 5) - 1; |
| 443 | vgic_reg_access(mmio, ®, word_offset, | 443 | vgic_reg_access(mmio, ®, word_offset, |
| 444 | ACCESS_READ_VALUE | ACCESS_WRITE_IGNORED); | 444 | ACCESS_READ_VALUE | ACCESS_WRITE_IGNORED); |
| 445 | break; | 445 | break; |
| @@ -1277,13 +1277,14 @@ static void vgic_retire_disabled_irqs(struct kvm_vcpu *vcpu) | |||
| 1277 | static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) | 1277 | static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) |
| 1278 | { | 1278 | { |
| 1279 | struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; | 1279 | struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; |
| 1280 | struct vgic_dist *dist = &vcpu->kvm->arch.vgic; | ||
| 1280 | struct vgic_lr vlr; | 1281 | struct vgic_lr vlr; |
| 1281 | int lr; | 1282 | int lr; |
| 1282 | 1283 | ||
| 1283 | /* Sanitize the input... */ | 1284 | /* Sanitize the input... */ |
| 1284 | BUG_ON(sgi_source_id & ~7); | 1285 | BUG_ON(sgi_source_id & ~7); |
| 1285 | BUG_ON(sgi_source_id && irq >= VGIC_NR_SGIS); | 1286 | BUG_ON(sgi_source_id && irq >= VGIC_NR_SGIS); |
| 1286 | BUG_ON(irq >= VGIC_NR_IRQS); | 1287 | BUG_ON(irq >= dist->nr_irqs); |
| 1287 | 1288 | ||
| 1288 | kvm_debug("Queue IRQ%d\n", irq); | 1289 | kvm_debug("Queue IRQ%d\n", irq); |
| 1289 | 1290 | ||
| @@ -1515,7 +1516,7 @@ static void __kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu) | |||
| 1515 | 1516 | ||
| 1516 | vlr = vgic_get_lr(vcpu, lr); | 1517 | vlr = vgic_get_lr(vcpu, lr); |
| 1517 | 1518 | ||
| 1518 | BUG_ON(vlr.irq >= VGIC_NR_IRQS); | 1519 | BUG_ON(vlr.irq >= dist->nr_irqs); |
| 1519 | vgic_cpu->vgic_irq_lr_map[vlr.irq] = LR_EMPTY; | 1520 | vgic_cpu->vgic_irq_lr_map[vlr.irq] = LR_EMPTY; |
| 1520 | } | 1521 | } |
| 1521 | 1522 | ||
| @@ -1737,7 +1738,7 @@ int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu) | |||
| 1737 | if (vcpu->vcpu_id >= dist->nr_cpus) | 1738 | if (vcpu->vcpu_id >= dist->nr_cpus) |
| 1738 | return -EBUSY; | 1739 | return -EBUSY; |
| 1739 | 1740 | ||
| 1740 | for (i = 0; i < VGIC_NR_IRQS; i++) { | 1741 | for (i = 0; i < dist->nr_irqs; i++) { |
| 1741 | if (i < VGIC_NR_PPIS) | 1742 | if (i < VGIC_NR_PPIS) |
| 1742 | vgic_bitmap_set_irq_val(&dist->irq_enabled, | 1743 | vgic_bitmap_set_irq_val(&dist->irq_enabled, |
| 1743 | vcpu->vcpu_id, i, 1); | 1744 | vcpu->vcpu_id, i, 1); |
| @@ -1802,7 +1803,11 @@ static int vgic_init_maps(struct kvm *kvm) | |||
| 1802 | int ret, i; | 1803 | int ret, i; |
| 1803 | 1804 | ||
| 1804 | nr_cpus = dist->nr_cpus = KVM_MAX_VCPUS; | 1805 | nr_cpus = dist->nr_cpus = KVM_MAX_VCPUS; |
| 1805 | nr_irqs = dist->nr_irqs = VGIC_NR_IRQS; | 1806 | |
| 1807 | if (!dist->nr_irqs) | ||
| 1808 | dist->nr_irqs = VGIC_NR_IRQS_LEGACY; | ||
| 1809 | |||
| 1810 | nr_irqs = dist->nr_irqs; | ||
| 1806 | 1811 | ||
| 1807 | ret = vgic_init_bitmap(&dist->irq_enabled, nr_cpus, nr_irqs); | 1812 | ret = vgic_init_bitmap(&dist->irq_enabled, nr_cpus, nr_irqs); |
| 1808 | ret |= vgic_init_bitmap(&dist->irq_level, nr_cpus, nr_irqs); | 1813 | ret |= vgic_init_bitmap(&dist->irq_level, nr_cpus, nr_irqs); |
| @@ -1886,7 +1891,7 @@ int kvm_vgic_init(struct kvm *kvm) | |||
| 1886 | goto out; | 1891 | goto out; |
| 1887 | } | 1892 | } |
| 1888 | 1893 | ||
| 1889 | for (i = VGIC_NR_PRIVATE_IRQS; i < VGIC_NR_IRQS; i += 4) | 1894 | for (i = VGIC_NR_PRIVATE_IRQS; i < kvm->arch.vgic.nr_irqs; i += 4) |
| 1890 | vgic_set_target_reg(kvm, 0, i); | 1895 | vgic_set_target_reg(kvm, 0, i); |
| 1891 | 1896 | ||
| 1892 | kvm->arch.vgic.ready = true; | 1897 | kvm->arch.vgic.ready = true; |
