|
@@ -66,7 +66,12 @@ static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu,
|
|
|
case GICD_TYPER:
|
|
|
value = vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS;
|
|
|
value = (value >> 5) - 1;
|
|
|
- value |= (INTERRUPT_ID_BITS_SPIS - 1) << 19;
|
|
|
+ if (vgic_has_its(vcpu->kvm)) {
|
|
|
+ value |= (INTERRUPT_ID_BITS_ITS - 1) << 19;
|
|
|
+ value |= GICD_TYPER_LPIS;
|
|
|
+ } else {
|
|
|
+ value |= (INTERRUPT_ID_BITS_SPIS - 1) << 19;
|
|
|
+ }
|
|
|
break;
|
|
|
case GICD_IIDR:
|
|
|
value = (PRODUCT_ID_KVM << 24) | (IMPLEMENTER_ARM << 0);
|
|
@@ -163,9 +168,8 @@ static void vgic_mmio_write_v3r_ctlr(struct kvm_vcpu *vcpu,
|
|
|
|
|
|
vgic_cpu->lpis_enabled = val & GICR_CTLR_ENABLE_LPIS;
|
|
|
|
|
|
- if (!was_enabled && vgic_cpu->lpis_enabled) {
|
|
|
- /* Eventually do something */
|
|
|
- }
|
|
|
+ if (!was_enabled && vgic_cpu->lpis_enabled)
|
|
|
+ vgic_enable_lpis(vcpu);
|
|
|
}
|
|
|
|
|
|
static unsigned long vgic_mmio_read_v3r_typer(struct kvm_vcpu *vcpu,
|
|
@@ -179,6 +183,8 @@ static unsigned long vgic_mmio_read_v3r_typer(struct kvm_vcpu *vcpu,
|
|
|
value |= ((target_vcpu_id & 0xffff) << 8);
|
|
|
if (target_vcpu_id == atomic_read(&vcpu->kvm->online_vcpus) - 1)
|
|
|
value |= GICR_TYPER_LAST;
|
|
|
+ if (vgic_has_its(vcpu->kvm))
|
|
|
+ value |= GICR_TYPER_PLPIS;
|
|
|
|
|
|
return extract_bytes(value, addr & 7, len);
|
|
|
}
|