[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] xen/arm: Fix PLATFORM_QUIRK_GIC_64K_STRIDE
Hi Ian, On 07/09/2014 12:54 PM, Ian Campbell wrote: > The patch "xen/arm: use ioremap to map gic-v2 registers" handled this > quirk by mapping a 64K+1 page region, but the code continued to > assume that GICC_DIR was at offset 0x1000 from the start of the > mapping. I should have reviewed closer this patch, good catch! > Fix this by mapping both pages of the GICC space independently and > adjusting the accessor function to use the correct page. > > Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > Cc: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> > Cc: Pranavkumar Sawargaonkar <pranavkumar@xxxxxxxxxx> > Cc: Anup Patel <anup.patel@xxxxxxxxxx> > --- > xen/arch/arm/gic-v2.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c > index 3820be5..6cee883 100644 > --- a/xen/arch/arm/gic-v2.c > +++ b/xen/arch/arm/gic-v2.c > @@ -65,7 +65,7 @@ static struct { > paddr_t dbase; /* Address of distributor registers */ > void __iomem * map_dbase; /* IO mapped Address of distributor registers > */ > paddr_t cbase; /* Address of CPU interface registers */ > - void __iomem * map_cbase; /* IO mapped Address of CPU interface > registers */ > + void __iomem * map_cbase[2]; /* IO mapped Address of CPU interface > registers */ > paddr_t hbase; /* Address of virtual interface registers */ > void __iomem * map_hbase; /* IO Address of virtual interface registers */ > paddr_t vbase; /* Address of virtual cpu interface registers > */ > @@ -100,12 +100,16 @@ static inline uint32_t readl_gicd(int offset) > > static inline void writel_gicc(uint32_t val, int offset) > { > - writel_relaxed(val, gicv2.map_cbase + offset); > + int page = offset >> PAGE_SHIFT; unsigned int? > + offset &= ~PAGE_MASK; > + writel_relaxed(val, gicv2.map_cbase[page] + offset); > } > > static inline uint32_t readl_gicc(int offset) > { > - return readl_relaxed(gicv2.map_cbase + offset); > + int page = offset >> PAGE_SHIFT; same here. > + offset &= ~PAGE_MASK; > + return readl_relaxed(gicv2.map_cbase[page] + offset); > } > > static inline void writel_gich(uint32_t val, int offset) > @@ -665,10 +669,13 @@ static int __init gicv2_init(struct dt_device_node > *node, const void *data) > if ( !gicv2.map_dbase ) > panic("GICv2: Failed to ioremap for GIC distributor\n"); > > + gicv2.map_cbase[0] = ioremap_nocache(gicv2.cbase, PAGE_SIZE); > + > if ( platform_has_quirk(PLATFORM_QUIRK_GIC_64K_STRIDE) ) > - gicv2.map_cbase = ioremap_nocache(gicv2.cbase, PAGE_SIZE * 0x10); > + gicv2.map_cbase[1] = ioremap_nocache(gicv2.cbase + PAGE_SIZE * 0x10, > + PAGE_SIZE); > else > - gicv2.map_cbase = ioremap_nocache(gicv2.cbase, PAGE_SIZE * 2); > + gicv2.map_cbase[1] = ioremap_nocache(gicv2.cbase + PAGE_SIZE, > PAGE_SIZE); > > if ( !gicv2.map_cbase ) This test is now wrong. You have to check both map_cbase[0] and map_cbase[1]. > panic("GICv2: Failed to ioremap for GIC CPU interface\n"); Regards, -- Julien Grall _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |