[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 06/15] xen/arm: vgic-v3: Set stride during domain initialization
On Thu, 2015-01-29 at 18:25 +0000, Julien Grall wrote: > The stride may not be set if the hardware GIC is using the default > layout. It happens on the Foundation model. > > On GICv3, the default stride is 2 * 64K. Therefore it's possible to avoid > checking at every redistributor MMIO access if the stride is not set. Can this defaulting not be pulled further to the initialisation of gicv3.rdist_stride? > This is only happening for DOM0, Please say instead "Because domU uses a static stride configuration this only happens for dom0..." or similar (i.e. include the reason why domU is excluded) > so we can move this code in > gicv_v3_init. Take the opportunity to move the stride setting a bit ealier "earlier". > because the loop to set regions will require the stride. > > Also, use 2 * 64K rather than 128K and explain the reason. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> > > --- > I wasn't not sure where to move this code. I find very confusion the > splitting between vgic and gicv. Maybe we should introduce a > hwdom_gicv_init and giccc_map callbacks. Then move most of the > initialization in the vgic one. > > Changes in v2: > - Patch added > --- > xen/arch/arm/gic-v3.c | 11 ++++++++++- > xen/arch/arm/vgic-v3.c | 6 +----- > 2 files changed, 11 insertions(+), 6 deletions(-) > > diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c > index 47452ca..7b33ff7 100644 > --- a/xen/arch/arm/gic-v3.c > +++ b/xen/arch/arm/gic-v3.c > @@ -897,12 +897,21 @@ static int gicv_v3_init(struct domain *d) > { > d->arch.vgic.dbase = gicv3.dbase; > d->arch.vgic.dbase_size = gicv3.dbase_size; > + > + d->arch.vgic.rdist_stride = gicv3.rdist_stride; > + /* > + * If the stride is not set, the default stride for GICv3 is 2 * 64K: > + * - first 64k page for Control and Physical LPIs > + * - second 64k page for Control and Generation of SGIs > + */ > + if ( !d->arch.vgic.rdist_stride ) > + d->arch.vgic.rdist_stride = 2 * SZ_64K; > + > for ( i = 0; i < gicv3.rdist_count; i++ ) > { > d->arch.vgic.rbase[i] = gicv3.rdist_regions[i].base; > d->arch.vgic.rbase_size[i] = gicv3.rdist_regions[i].size; > } > - d->arch.vgic.rdist_stride = gicv3.rdist_stride; > d->arch.vgic.rdist_count = gicv3.rdist_count; > } > else > diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c > index 2c14717..db6b514 100644 > --- a/xen/arch/arm/vgic-v3.c > +++ b/xen/arch/arm/vgic-v3.c > @@ -625,11 +625,7 @@ static int vgic_v3_rdistr_mmio_read(struct vcpu *v, > mmio_info_t *info) Why not the write case too? > > perfc_incr(vgicr_reads); > > - if ( v->domain->arch.vgic.rdist_stride != 0 ) > - offset = info->gpa & (v->domain->arch.vgic.rdist_stride - 1); > - else > - /* If stride is not set. Default 128K */ > - offset = info->gpa & (SZ_128K - 1); > + offset = info->gpa & (v->domain->arch.vgic.rdist_stride - 1); > > if ( offset < SZ_64K ) > return __vgic_v3_rdistr_rd_mmio_read(v, info, offset); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |