aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm
diff options
context:
space:
mode:
authorChristoffer Dall <christoffer.dall@arm.com>2018-07-16 09:06:19 -0400
committerMarc Zyngier <marc.zyngier@arm.com>2018-07-21 11:02:21 -0400
commitaa075b0f30b53e397fd4d4162ebf4a3a236b9206 (patch)
tree7b8aee3c4dcde15178d6ecec6e0aba17cdd84193 /virt/kvm
parenta2dca217dae29c4ff6420e8c78d56b3f61ae0797 (diff)
KVM: arm/arm64: vgic: Keep track of implementation revision
As we are about to tweak implementation aspects of the VGIC emulation, while still preserving some level of backwards compatibility support, add a field to keep track of the implementation revision field which is reported to the VM and to userspace. Reviewed-by: Andrew Jones <drjones@redhat.com> Signed-off-by: Christoffer Dall <christoffer.dall@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'virt/kvm')
-rw-r--r--virt/kvm/arm/vgic/vgic-init.c1
-rw-r--r--virt/kvm/arm/vgic/vgic-mmio-v2.c6
-rw-r--r--virt/kvm/arm/vgic/vgic-mmio-v3.c6
3 files changed, 9 insertions, 4 deletions
diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c
index b71417913741..8b6fc45c42fe 100644
--- a/virt/kvm/arm/vgic/vgic-init.c
+++ b/virt/kvm/arm/vgic/vgic-init.c
@@ -298,6 +298,7 @@ int vgic_init(struct kvm *kvm)
298 298
299 vgic_debug_init(kvm); 299 vgic_debug_init(kvm);
300 300
301 dist->implementation_rev = 0;
301 dist->initialized = true; 302 dist->initialized = true;
302 303
303out: 304out:
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v2.c b/virt/kvm/arm/vgic/vgic-mmio-v2.c
index af44e569373a..f0c5351805b6 100644
--- a/virt/kvm/arm/vgic/vgic-mmio-v2.c
+++ b/virt/kvm/arm/vgic/vgic-mmio-v2.c
@@ -25,19 +25,21 @@
25static unsigned long vgic_mmio_read_v2_misc(struct kvm_vcpu *vcpu, 25static unsigned long vgic_mmio_read_v2_misc(struct kvm_vcpu *vcpu,
26 gpa_t addr, unsigned int len) 26 gpa_t addr, unsigned int len)
27{ 27{
28 struct vgic_dist *vgic = &vcpu->kvm->arch.vgic;
28 u32 value; 29 u32 value;
29 30
30 switch (addr & 0x0c) { 31 switch (addr & 0x0c) {
31 case GIC_DIST_CTRL: 32 case GIC_DIST_CTRL:
32 value = vcpu->kvm->arch.vgic.enabled ? GICD_ENABLE : 0; 33 value = vgic->enabled ? GICD_ENABLE : 0;
33 break; 34 break;
34 case GIC_DIST_CTR: 35 case GIC_DIST_CTR:
35 value = vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS; 36 value = vgic->nr_spis + VGIC_NR_PRIVATE_IRQS;
36 value = (value >> 5) - 1; 37 value = (value >> 5) - 1;
37 value |= (atomic_read(&vcpu->kvm->online_vcpus) - 1) << 5; 38 value |= (atomic_read(&vcpu->kvm->online_vcpus) - 1) << 5;
38 break; 39 break;
39 case GIC_DIST_IIDR: 40 case GIC_DIST_IIDR:
40 value = (PRODUCT_ID_KVM << GICD_IIDR_PRODUCT_ID_SHIFT) | 41 value = (PRODUCT_ID_KVM << GICD_IIDR_PRODUCT_ID_SHIFT) |
42 (vgic->implementation_rev << GICD_IIDR_REVISION_SHIFT) |
41 (IMPLEMENTER_ARM << GICD_IIDR_IMPLEMENTER_SHIFT); 43 (IMPLEMENTER_ARM << GICD_IIDR_IMPLEMENTER_SHIFT);
42 break; 44 break;
43 default: 45 default:
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c
index c03f42409b98..ebe10a015bfb 100644
--- a/virt/kvm/arm/vgic/vgic-mmio-v3.c
+++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c
@@ -62,16 +62,17 @@ bool vgic_supports_direct_msis(struct kvm *kvm)
62static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu, 62static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu,
63 gpa_t addr, unsigned int len) 63 gpa_t addr, unsigned int len)
64{ 64{
65 struct vgic_dist *vgic = &vcpu->kvm->arch.vgic;
65 u32 value = 0; 66 u32 value = 0;
66 67
67 switch (addr & 0x0c) { 68 switch (addr & 0x0c) {
68 case GICD_CTLR: 69 case GICD_CTLR:
69 if (vcpu->kvm->arch.vgic.enabled) 70 if (vgic->enabled)
70 value |= GICD_CTLR_ENABLE_SS_G1; 71 value |= GICD_CTLR_ENABLE_SS_G1;
71 value |= GICD_CTLR_ARE_NS | GICD_CTLR_DS; 72 value |= GICD_CTLR_ARE_NS | GICD_CTLR_DS;
72 break; 73 break;
73 case GICD_TYPER: 74 case GICD_TYPER:
74 value = vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS; 75 value = vgic->nr_spis + VGIC_NR_PRIVATE_IRQS;
75 value = (value >> 5) - 1; 76 value = (value >> 5) - 1;
76 if (vgic_has_its(vcpu->kvm)) { 77 if (vgic_has_its(vcpu->kvm)) {
77 value |= (INTERRUPT_ID_BITS_ITS - 1) << 19; 78 value |= (INTERRUPT_ID_BITS_ITS - 1) << 19;
@@ -82,6 +83,7 @@ static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu,
82 break; 83 break;
83 case GICD_IIDR: 84 case GICD_IIDR:
84 value = (PRODUCT_ID_KVM << GICD_IIDR_PRODUCT_ID_SHIFT) | 85 value = (PRODUCT_ID_KVM << GICD_IIDR_PRODUCT_ID_SHIFT) |
86 (vgic->implementation_rev << GICD_IIDR_REVISION_SHIFT) |
85 (IMPLEMENTER_ARM << GICD_IIDR_IMPLEMENTER_SHIFT); 87 (IMPLEMENTER_ARM << GICD_IIDR_IMPLEMENTER_SHIFT);
86 break; 88 break;
87 default: 89 default: