On Mon, Jul 31, 2017 at 06:26:17PM +0100, Marc Zyngier wrote: > Add a new has_gicv4 field in the global VGIC state that indicates > whether the HW is GICv4 capable, as a per-VM predicate indicating > if there is a possibility for a VM to support direct injection > (the above being true and the VM having an ITS). > > Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> > --- > include/kvm/arm_vgic.h | 3 +++ > virt/kvm/arm/vgic/vgic-mmio-v3.c | 5 +++++ > virt/kvm/arm/vgic/vgic.h | 2 ++ > 3 files changed, 10 insertions(+) > > diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h > index ee8587c8c715..84694b42373a 100644 > --- a/include/kvm/arm_vgic.h > +++ b/include/kvm/arm_vgic.h > @@ -73,6 +73,9 @@ struct vgic_global { > /* Only needed for the legacy KVM_CREATE_IRQCHIP */ > bool can_emulate_gicv2; > > + /* Does have GICv4? */ nit: questionable comment, how about /* Hardware has GICv4? */ or /* Do we have GICv4? */ > + bool has_gicv4; > + > /* GIC system register CPU interface */ > struct static_key_false gicv3_cpuif; > > diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c > index 714fa3933546..74109ca75cc0 100644 > --- a/virt/kvm/arm/vgic/vgic-mmio-v3.c > +++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c > @@ -54,6 +54,11 @@ bool vgic_has_its(struct kvm *kvm) > return dist->has_its; > } > > +bool vgic_is_v4_capable(struct kvm *kvm) > +{ > + return kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm); > +} > + uber nit: the naming here is a bit funny, because we won't be presenting a GICv4 GIC to the guest, so I'd prefer something like vgic_supports_direct_msis() or something like that, but this is obviously not a deal breaker. > static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu, > gpa_t addr, unsigned int len) > { > diff --git a/virt/kvm/arm/vgic/vgic.h b/virt/kvm/arm/vgic/vgic.h > index 3002b72d938b..90f6436a11aa 100644 > --- a/virt/kvm/arm/vgic/vgic.h > +++ b/virt/kvm/arm/vgic/vgic.h > @@ -229,4 +229,6 @@ int vgic_its_resolve_lpi(struct kvm *kvm, struct vgic_its *its, > u32 devid, u32 eventid, struct vgic_irq **irq); > struct vgic_its *vgic_msi_to_its(struct kvm *kvm, struct kvm_msi *msi); > > +bool vgic_is_v4_capable(struct kvm *kvm); > + > #endif > -- > 2.11.0 > Thanks, -Christoffer