|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 15/15] xen/arm: gic-v3: Add support of vGICv2 when available
On Fri, 2015-06-26 at 10:34 +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.
>
> * 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>
>
> ---
> I haven't address the request from Ian to not use the R/M/W idiom.
> Most of the usage of the idiom are for EL2 registers (i.e registers
> used by the hypervisor). They can be modified at any time by Xen,
> and not specific to the running domain. We would have to progate the
> change to each domain if we don't use the R/W/M.
>
> ICC_SRE_EL2 falls under the same umbrella. It would be preferable to
> stay with the same model as today i.e:
> - *_EL1: straight save/restore
> - *_EL2: R/M/W to necessary field
I suppose I can live with this.
>
> Changes in v2:
> - Use vgic_v2_hw_setup to notify that GICv3 supports GICv2
> - Revert changes in comment
> ---
> xen/arch/arm/gic-v3.c | 55
> ++++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 52 insertions(+), 3 deletions(-)
>
> diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
> index 337fbb9..876a56b 100644
> --- a/xen/arch/arm/gic-v3.c
> +++ b/xen/arch/arm/gic-v3.c
> @@ -247,7 +247,7 @@ 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();
> @@ -375,6 +375,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
I suppose we can assume that v4, v5 etc will want to expose these (i.e.
the condition needn't be inverted to be don't give when not using v3)
> + */
> + 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);
> + isb();
Is the isb strictly needed? I suppose we are already using rather too
many, perhaps a more complete audit is in order.
> +
> WRITE_SYSREG32(v->arch.gic.v3.sre_el1, ICC_SRE_EL1);
> WRITE_SYSREG32(v->arch.gic.v3.vmcr, ICH_VMCR_EL2);
> restore_aprn_regs(&v->arch.gic);
> @@ -866,13 +880,20 @@ static void gicv3_disable_interface(void)
> static void gicv3_update_lr(int lr, const struct pending_irq *p,
> unsigned int state)
> {
> - uint64_t grp = GICH_LR_GRP1;
> uint64_t val = 0;
>
> BUG_ON(lr >= gicv3_info.nr_lrs);
> BUG_ON(lr < 0);
>
> - val = (((uint64_t)state & 0x3) << GICH_LR_STATE_SHIFT) | grp;
> + val = (((uint64_t)state & 0x3) << GICH_LR_STATE_SHIFT);
> +
> + /*
> + * When the guest is GICv3, all guest IRQs are Group 1, as Group0
> + * would result in a FIQ in the guest, which it wouldn't expect
Unless the guest actually asked for a FIQ (not sure how that works).
Anyway, I don't think you need to support that case here...
> + */
> + if ( current->domain->arch.vgic.version == GIC_V3 )
> + val |= GICH_LR_GRP1;
> +
> val |= ((uint64_t)p->priority & 0xff) << GICH_LR_PRIORITY_SHIFT;
> val |= ((uint64_t)p->irq & GICH_LR_VIRTUAL_MASK) <<
> GICH_LR_VIRTUAL_SHIFT;
>
> @@ -1119,6 +1140,33 @@ 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,
> + paddr_t dbase)
> +{
> + int res;
> + paddr_t cbase, vbase;
> +
> + /*
> + * For GICv3 supporting GICv2, GICC and GICV base address will be
> + * provided.
I wonder how one specifies without GICC, given that GICH comes after
it... Oh well!
Despite all the comments I don't think there are any blockers:
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |