|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 6/8] xen/arm: gic: Check the size of the CPU and vCPU interface retrieved from DT
On Tue, 2015-09-22 at 18:47 +0100, Julien Grall wrote:
> The size of the CPU interface will used in a follow-up patch to map the
> region in Xen memory.
>
> Based on GICv2 spec, the CPU interface should at least be 8KB, although
> most of the platform we are supporting use the GICv1 size (i.e 4KB) in
^incorrectly
(to avoid implying they actually have a GICv1)
> their DT. Only warn and update the size to avoid any breakage on these
> platforms.
>
> Furthermore, Xen is relying on the Virtual CPU interface been at least
"relying on the fact that the..."
> 8KB. As in reality the Virtual CPU interface match the CPU interface,
"matches"
> check that the 2 interfaces have the same size. Also only warn, to avoid
> any breakage with buggy DT.
>
> For GICv3, only allow GICv2 compatibility when the Virtual CPU interface
> and CPU interface are 8KB.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
> ---
> Cc: Zoltan Kiss <zoltan.kiss@xxxxxxxxxx>
>
> I haven't done any change in the gic-hip04 driver. I will let the
> maintainers doing it if they feel it's necessary.
Speaking of which, wasn't their going to be a new comaintainer at one point
(mid.gname.org/<554B5C71.3020007@xxxxxxxxxx>)
> @@ -641,7 +643,31 @@ static int __init gicv2_init(void)
> panic("GICv2: Cannot find the maintenance IRQ");
> gicv2_info.maintenance_irq = res;
>
> - /* TODO: Add check on distributor, cpu size */
> + /* TODO: Add check on distributor */
> +
> + /*
> + * The GICv2 CPU interface should at least be 8KB. Although, most of the
> DT
> + * doesn't correctly set it and use the GICv1 CPU interface size (i.e
> 4KB).
> + * Warn and then fixup.
> + */
> + if ( csize < SZ_8K )
What do you think of checking for exactly SZ_4K (the only actually used
incorrect value) and still being picky about other sizes <8K?
> + {
> + printk(XENLOG_WARNING "GICv2: WARNING: "
> + "The CPU interface size is wrong: %#"PRIx64
> + " expected %#x\n",
> + csize, SZ_8K);
> + csize = SZ_8K;
> + }
> +
> + /*
> + * Check if the CPU interface and virtual CPU interface have the
> + * same size.
> + */
> + if ( csize != vbase )
> + printk(XENLOG_WARNING "GICv2: WARNING: "
> + "The size of the CPU interface (%#"PRIpaddr") and the
> vCPU"
> + " interface (%#"PRIpaddr") doesn't match\n",
"don't match" or "do not match".
In general we should prefer not to split string literally in the middle of
sentences, so grep still works. I think we can tolerate the long lines in
such cases.
> + csize, vsize);
>
> printk("GICv2 initialization:\n"
> " gic_dist_addr=%"PRIpaddr"\n"
> diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
> index 957e491..4c58baf 100644
> --- a/xen/arch/arm/gic-v3.c
> +++ b/xen/arch/arm/gic-v3.c
> @@ -1143,22 +1143,38 @@ static void __init gicv3_init_v2(const struct
> dt_device_node *node,
> paddr_t dbase)
> {
> int res;
> - paddr_t cbase, vbase;
> + paddr_t cbase, csize;
> + paddr_t vbase, vsize;
>
> /*
> * For GICv3 supporting GICv2, GICC and GICV base address will be
> * provided.
> */
> res = dt_device_get_address(node, 1 + gicv3.rdist_count,
> - &cbase, NULL);
> + &cbase, &csize);
> if ( res )
> return;
>
> res = dt_device_get_address(node, 1 + gicv3.rdist_count + 2,
> - &vbase, NULL);
> + &vbase, &vsize);
> if ( res )
> return;
>
> + /*
> + * Only allow support of GICv2 compatible when the CPU interface
> + * and virtual CPU interface are 8KB
> + * XXX: Handle other size?
Any size >= 8KB ought to be ok, no?
We could clamp to 8KB if we were worried about what is in the rest.
> + */
> + if ( csize != SZ_8K && vsize != SZ_8K )
> + {
> + printk(XENLOG_WARNING
> + "GICv3: WARNING: Don't enable support of GICv2.\n"
"Not enabling support for GICv2 compat mode"
> + "The size of the CPU interface (%#"PRIpaddr") and the
> vCPU"
> + " interface (%#"PRIpaddr") should be 8KB.\n",
"should both be" ?
> + csize, vsize);
> + return;
> + }
> +
> printk("GICv3 compatible with GICv2 cbase %#"PRIpaddr" vbase
> %#"PRIpaddr"\n",
> cbase, vbase);
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |