[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 22/22] xen/arm: gic-v3: Add support of vGICv2 when available
On Fri, 2015-05-08 at 14:29 +0100, Julien Grall wrote: > * Modify the GICv3 driver to recognize a such device. I wasn't able > to find a register which tell if GICv2 is supported on GICv3. The only > way to find it seems to check if the DT node provides GICC and GICV. I think that's the way... > * Disable access to ICC_SRE_EL1 to guest using vGICv2 > > * The LR is slightly different for vGICv2. The interrupt is always > injected with group0. > > * Add a comment explaining why Group1 is used for vGICv3. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> > --- > xen/arch/arm/gic-v3.c | 58 > ++++++++++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 53 insertions(+), 5 deletions(-) > > diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c > index 329d6ca..8533ae5 100644 > --- a/xen/arch/arm/gic-v3.c > +++ b/xen/arch/arm/gic-v3.c > @@ -237,15 +237,14 @@ static void gicv3_ich_write_lr(int lr, uint64_t val) > } > > /* > - * System Register Enable (SRE). Enable to access CPU & Virtual > - * interface registers as system registers in EL2 > + * System Register Enable (SRE). What was wrong with the comment (apart from the grammar). It was incomplete but I think you are removing the code which wasn't described, while removing the comment which describes the remaining behaviour. > */ > static void gicv3_enable_sre(void) > { > uint32_t val; > > val = READ_SYSREG32(ICC_SRE_EL2); > - val |= GICC_SRE_EL2_SRE | GICC_SRE_EL2_ENEL1; > + val |= GICC_SRE_EL2_SRE; > > WRITE_SYSREG32(val, ICC_SRE_EL2); > isb(); > @@ -373,6 +372,20 @@ static void gicv3_save_state(struct vcpu *v) > > static void gicv3_restore_state(const struct vcpu *v) > { > + uint32_t val; > + > + val = READ_SYSREG32(ICC_SRE_EL2); > + /* > + * Don't give access to system registers when the guest is using > + * GICv2 > + */ > + if ( v->domain->arch.vgic.version == GIC_V2 ) > + val &= ~GICC_SRE_EL2_ENEL1; > + else > + val |= GICC_SRE_EL2_ENEL1; > + WRITE_SYSREG32(val, ICC_SRE_EL2); Perhaps save/restore v->arch.gic.v3.sre_el2 rather than reading and recalculating each time? Then you just need to set sre_el2 appropriately during domain init. > @@ -1107,6 +1127,32 @@ static int __init cmp_rdist(const void *a, const void > *b) > return ( l->base < r->base) ? -1 : 0; > } > > +/* If the GICv3 supports GICv2, initialize it */ > +static void __init gicv3_init_v2(const struct dt_device_node *node) > +{ > + int res; > + > + /* > + * For GICv3 supporting GICv2, GICC and GICV base address will be > + * provided. > + */ > + > + res = dt_device_get_address(node, 1 + gicv3_info.nr_rdist_regions, > + &gicv3_info.cbase, NULL); > + if ( res ) > + return; > + > + res = dt_device_get_address(node, 1 + gicv3_info.nr_rdist_regions + 2, > + &gicv3_info.vbase, NULL); > + if ( res ) > + return; > + > + printk("GICv3 compatible with GICv2 cbase %#"PRIpaddr" vbase > %#"PRIpaddr"\n", > + gicv3_info.cbase, gicv3_info.vbase); > + > + gicv3_info.vgic_versions |= GIC_V2; So I think this is a second type of compat, right? After this we support: Guests using GICv2, via vgic-v2.c Guests using GICv3, via vgic-v3.c But also: Guests using GICv2, via vgic-v3.c, i.e. vgicv3 in compat mode. Is that right? Is it intended? _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |