From 18c67d29c91d64274212b33cd5db006db553abf9 Mon Sep 17 00:00:00 2001 From: Julien Grall Date: Mon, 14 Sep 2015 16:32:24 +0100 Subject: [PATCH] xen/arm: gic-v3: Allow Xen to run on hardware supporting GICv4 GICv4 is an extension of GICv3 (see 1.1 in ARM IHI 0069A) which means that the GICv3 driver can run normally on GICv4 hardware. The GICv4-only features currently won't be used. Reported-by: Andre Przywara Signed-off-by: Julien Grall Acked-by: Ian Campbell --- xen/arch/arm/gic-v3.c | 4 ++-- xen/include/asm-arm/gic_v3_defs.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c index 4d623bfcf6..1e3c19b13b 100644 --- a/xen/arch/arm/gic-v3.c +++ b/xen/arch/arm/gic-v3.c @@ -640,7 +640,7 @@ static int __init gicv3_populate_rdist(void) void __iomem *ptr = gicv3.rdist_regions[i].map_base; reg = readl_relaxed(ptr + GICR_PIDR2) & GIC_PIDR2_ARCH_MASK; - if ( reg != GIC_PIDR2_ARCH_GICv3 ) + if ( reg != GIC_PIDR2_ARCH_GICv3 && reg != GIC_PIDR2_ARCH_GICv4 ) { dprintk(XENLOG_ERR, "GICv3: No redistributor present @%"PRIpaddr"\n", @@ -1194,7 +1194,7 @@ static int __init gicv3_init(void) panic("GICv3: Failed to ioremap for GIC distributor\n"); reg = readl_relaxed(GICD + GICD_PIDR2) & GIC_PIDR2_ARCH_MASK; - if ( reg != GIC_PIDR2_ARCH_GICv3 ) + if ( reg != GIC_PIDR2_ARCH_GICv3 && reg != GIC_PIDR2_ARCH_GICv4 ) panic("GICv3: no distributor detected\n"); if ( !dt_property_read_u32(node, "#redistributor-regions", diff --git a/xen/include/asm-arm/gic_v3_defs.h b/xen/include/asm-arm/gic_v3_defs.h index b0ac6ff55b..c6d73df4a8 100644 --- a/xen/include/asm-arm/gic_v3_defs.h +++ b/xen/include/asm-arm/gic_v3_defs.h @@ -43,6 +43,7 @@ /* Common between GICD_PIDR2 and GICR_PIDR2 */ #define GIC_PIDR2_ARCH_MASK (0xf0) #define GIC_PIDR2_ARCH_GICv3 (0x30) +#define GIC_PIDR2_ARCH_GICv4 (0x40) #define GICC_SRE_EL2_SRE (1UL << 0) #define GICC_SRE_EL2_DFB (1UL << 1) -- 2.30.2