[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen: get GIC addresses from DT
On Fri, 2012-11-30 at 12:08 +0000, Stefano Stabellini wrote: > On Thu, 29 Nov 2012, Ian Campbell wrote: > > On Fri, 2012-11-23 at 15:21 +0000, Stefano Stabellini wrote: > > > Get the address of the GIC distributor, cpu, virtual and virtual cpu > > > interfaces registers from device tree. > > > > > > > > > Note: I couldn't completely get rid of GIC_BASE_ADDRESS, GIC_DR_OFFSET > > > and friends because we are using them from mode_switch.S, that is > > > executed before device tree has been parsed. But at least mode_switch.S > > > is known to contain vexpress specific code anyway. > > > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > > > > I've a few comments on mostly pre-existing things which I happened to > > notice while reviewing this: > > > > > diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c > > > index 0c6fab9..8efbeb3 100644 > > > --- a/xen/arch/arm/gic.c > > > +++ b/xen/arch/arm/gic.c > > > @@ -34,9 +35,9 @@ > > > /* Access to the GIC Distributor registers through the fixmap */ > > > #define GICD ((volatile uint32_t *) FIXMAP_ADDR(FIXMAP_GICD)) > > > > There's an implicit assumption here that the GICD is correctly aligned > > -- I suspect it really ought to be handled like the others... but... > > > > > #define GICC ((volatile uint32_t *) (FIXMAP_ADDR(FIXMAP_GICC1) \ > > > - + (GIC_CR_OFFSET & 0xfff))) > > > + + ((uint32_t) gic.cbase & 0xfff))) > > > #define GICH ((volatile uint32_t *) (FIXMAP_ADDR(FIXMAP_GICH) \ > > > - + (GIC_HR_OFFSET & 0xfff))) > > > + + ((uint32_t) gic.hbase & 0xfff))) > > > > ... is there actually any chance of these being non-page aligned? > > I couldn't find any specific references to interface alignment in the > GIC documentation, but I strongly doubt they can be non-page aligned. > I think we should just add a check to see if they are page aligned, > aborting if they are not. Agreed. > > Also now that these are dynamic perhaps an actual variable initialised > > at start of day would be better than a #define? > > After all the virtual addresses for gicd, gicc and gich are always going > to be the same, no matter what the their physical address is. > I don't think is worth turning the #define into variables. Right, with the above change this is indeed pointless. > > > --- > > arm: add few checks to gic_init > > Check for: > - uninitialized GIC interface addresses; > - non-page aligned GIC interface addresses. > > Return in both cases with an error message. > Also remove the code from GICH and GICC to handle non-page aligned > interfaces. > > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > > diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c > index 8efbeb3..301d223 100644 > --- a/xen/arch/arm/gic.c > +++ b/xen/arch/arm/gic.c > @@ -34,10 +34,8 @@ > > /* Access to the GIC Distributor registers through the fixmap */ > #define GICD ((volatile uint32_t *) FIXMAP_ADDR(FIXMAP_GICD)) > -#define GICC ((volatile uint32_t *) (FIXMAP_ADDR(FIXMAP_GICC1) \ > - + ((uint32_t) gic.cbase & 0xfff))) > -#define GICH ((volatile uint32_t *) (FIXMAP_ADDR(FIXMAP_GICH) \ > - + ((uint32_t) gic.hbase & 0xfff))) > +#define GICC ((volatile uint32_t *) FIXMAP_ADDR(FIXMAP_GICC1)) > +#define GICH ((volatile uint32_t *) FIXMAP_ADDR(FIXMAP_GICH)) > static void gic_restore_pending_irqs(struct vcpu *v); > > /* Global state */ > @@ -308,6 +306,23 @@ static void __cpuinit gic_hyp_disable(void) > /* Set up the GIC */ > void __init gic_init(void) > { > + if ( !early_info.gic.gic_dist_addr || > + !early_info.gic.gic_cpu_addr || > + !early_info.gic.gic_hyp_addr || > + !early_info.gic.gic_vcpu_addr ) This indent is pretty odd. Better to align the "!"s I think. Also you appear to have hard tabs in here (perhaps that is the problem) > + { > + printk("error: incorrect physical address of the GIC > interfaces.\n"); Incorrect isn't quite right, they are missing. >From a debugging PoV it might be worth checking GICD and GICC (which are common) from GICH and GICV (which we might plausibly expect to be missing on occasion) and/or print out the actual values. > + return; > + } > + if ( (early_info.gic.gic_dist_addr & ((1 << PAGE_SHIFT) - 1)) || > + (early_info.gic.gic_cpu_addr & ((1 << PAGE_SHIFT) - 1)) > || > + (early_info.gic.gic_hyp_addr & ((1 << PAGE_SHIFT) - 1)) > || > + (early_info.gic.gic_vcpu_addr & ((1 << PAGE_SHIFT) - > 1)) ) Alignment (and hard tabs) again. > + { > + printk("error: GIC interfaces not page aligned.\n"); > + return; > + } > + > gic.dbase = early_info.gic.gic_dist_addr; > gic.cbase = early_info.gic.gic_cpu_addr; > gic.hbase = early_info.gic.gic_hyp_addr; > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |