diff options
-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; |