[PATCH 29/32] irqchip/gic-v5: Check if impl is virt capable

Sascha Bischoff Sascha.Bischoff at arm.com
Wed Dec 17 12:46:22 PST 2025


On Tue, 2025-12-16 at 16:40 +0100, Lorenzo Pieralisi wrote:
> On Fri, Dec 12, 2025 at 03:22:45PM +0000, Sascha Bischoff wrote:
> > Now that there is support for creating a GICv5-based guest with
> > KVM,
> 
> The only comment I have is - as discussed, this patch is not really
> dependent on GICv5 KVM support - ie, if IRS_IDR0.VIRT == b0 there
> isn't
> a chance GIC v3 legacy support is implemented either, maybe it is
> worth
> clarifying that.

I've now explicitly called that out.

> Otherwise LGTM:
> 
> Reviewed-by: Lorenzo Pieralisi <lpieralisi at kernel.org>

Done, thanks!

Sascha

> 
> > check that the hardware itself supports virtualisation, skipping
> > the
> > setting of struct gic_kvm_info if not.
> > 
> > Signed-off-by: Sascha Bischoff <sascha.bischoff at arm.com>
> > ---
> >  drivers/irqchip/irq-gic-v5-irs.c   | 4 ++++
> >  drivers/irqchip/irq-gic-v5.c       | 5 +++++
> >  include/linux/irqchip/arm-gic-v5.h | 4 ++++
> >  3 files changed, 13 insertions(+)
> 
> 
> > 
> > diff --git a/drivers/irqchip/irq-gic-v5-irs.c
> > b/drivers/irqchip/irq-gic-v5-irs.c
> > index ce2732d649a3e..eebf9f219ac8c 100644
> > --- a/drivers/irqchip/irq-gic-v5-irs.c
> > +++ b/drivers/irqchip/irq-gic-v5-irs.c
> > @@ -744,6 +744,10 @@ static int __init gicv5_irs_init(struct
> > device_node *node)
> >  	 */
> >  	if (list_empty(&irs_nodes)) {
> >  
> > +		idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR0);
> > +		gicv5_global_data.virt_capable =
> > +			!!FIELD_GET(GICV5_IRS_IDR0_VIRT, idr);
> > +
> >  		idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR1);
> >  		irs_setup_pri_bits(idr);
> >  
> > diff --git a/drivers/irqchip/irq-gic-v5.c b/drivers/irqchip/irq-
> > gic-v5.c
> > index 41ef286c4d781..f5b17a2557aa1 100644
> > --- a/drivers/irqchip/irq-gic-v5.c
> > +++ b/drivers/irqchip/irq-gic-v5.c
> > @@ -1064,6 +1064,11 @@ static struct gic_kvm_info gic_v5_kvm_info
> > __initdata;
> >  
> >  static void __init gic_of_setup_kvm_info(struct device_node *node)
> >  {
> > +	if (!gicv5_global_data.virt_capable) {
> > +		pr_info("GIC implementation is not virtualization
> > capable\n");
> > +		return;
> > +	}
> > +
> >  	gic_v5_kvm_info.type = GIC_V5;
> >  
> >  	/* GIC Virtual CPU interface maintenance interrupt */
> > diff --git a/include/linux/irqchip/arm-gic-v5.h
> > b/include/linux/irqchip/arm-gic-v5.h
> > index 9607b36f021ee..36f4c0e8ef8e9 100644
> > --- a/include/linux/irqchip/arm-gic-v5.h
> > +++ b/include/linux/irqchip/arm-gic-v5.h
> > @@ -45,6 +45,7 @@
> >  /*
> >   * IRS registers and tables structures
> >   */
> > +#define GICV5_IRS_IDR0			0x0000
> >  #define GICV5_IRS_IDR1			0x0004
> >  #define GICV5_IRS_IDR2			0x0008
> >  #define GICV5_IRS_IDR5			0x0014
> > @@ -65,6 +66,8 @@
> >  #define GICV5_IRS_IST_STATUSR		0x0194
> >  #define GICV5_IRS_MAP_L2_ISTR		0x01c0
> >  
> > +#define GICV5_IRS_IDR0_VIRT		BIT(6)
> > +
> >  #define GICV5_IRS_IDR1_PRIORITY_BITS	GENMASK(22, 20)
> >  #define GICV5_IRS_IDR1_IAFFID_BITS	GENMASK(19, 16)
> >  
> > @@ -280,6 +283,7 @@ struct gicv5_chip_data {
> >  	u8			cpuif_pri_bits;
> >  	u8			cpuif_id_bits;
> >  	u8			irs_pri_bits;
> > +	bool			virt_capable;
> >  	struct {
> >  		__le64 *l1ist_addr;
> >  		u32 l2_size;
> > -- 
> > 2.34.1



More information about the linux-arm-kernel mailing list