|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] ARM: GICv3: copy Dom0 GICv3 reg property from host DT
Hi,
Thanks for the patch.
On Tue, Jan 30, 2018 at 3:05 PM, Andre Przywara <andre.przywara@xxxxxxx> wrote:
> At the moment we re-generate the Dom0 GICv3 DT node, by creating the
> "reg" property from scratch using our previously parsed and
> translated(!) host addresses. However we then write the *absolute*
> addresses into the new node, not considering possible "range" mappings
> in any of the GIC's parent nodes. So whenever one of the parents has a
> non-empty ranges property, Dom0 will wrongly translate the addresses.
> Properly incorporating the ranges properties sounds tedious, so let's
> just copy the first part of the reg property instead (as we do for GICv2),
> since the addresses for Dom0 are identical to those from the hardware.
>
> The mainline kernel DT for the Espressobin board with an Marvell 3720 SoC
> has the GIC in such an translated bus, so this patch allows this board
> to boot properly (after adding support for the SoC's UART).
>
> Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
> ---
> xen/arch/arm/gic-v3.c | 29 +++++++++++------------------
> 1 file changed, 11 insertions(+), 18 deletions(-)
>
> diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
> index a0d290b55c..6b17abd0a1 100644
> --- a/xen/arch/arm/gic-v3.c
> +++ b/xen/arch/arm/gic-v3.c
> @@ -1147,10 +1147,9 @@ static int gicv3_make_hwdom_dt_node(const struct
> domain *d,
> const struct dt_device_node *gic,
> void *fdt)
> {
> - const void *compatible = NULL;
> - uint32_t len;
> - __be32 *new_cells, *tmp;
> - int i, res = 0;
> + const void *compatible, *hw_reg;
> + uint32_t len, new_len;
> + int res;
>
> compatible = dt_get_property(gic, "compatible", &len);
> if ( !compatible )
> @@ -1173,27 +1172,21 @@ static int gicv3_make_hwdom_dt_node(const struct
> domain *d,
> if ( res )
> return res;
>
> - len = dt_cells_to_size(dt_n_addr_cells(gic) + dt_n_size_cells(gic));
> + new_len = dt_cells_to_size(dt_n_addr_cells(gic) + dt_n_size_cells(gic));
> /*
> * GIC has two memory regions: Distributor + rdist regions
> * CPU interface and virtual cpu interfaces accessesed as System
> registers
> * So cells are created only for Distributor and rdist regions
> */
> - len = len * (d->arch.vgic.nr_regions + 1);
> - new_cells = xzalloc_bytes(len);
> - if ( new_cells == NULL )
> - return -FDT_ERR_XEN(ENOMEM);
> -
> - tmp = new_cells;
> -
> - dt_set_range(&tmp, gic, d->arch.vgic.dbase, SZ_64K);
> + new_len = new_len * (d->arch.vgic.nr_regions + 1);
>
> - for ( i = 0; i < d->arch.vgic.nr_regions; i++ )
> - dt_set_range(&tmp, gic, d->arch.vgic.rdist_regions[i].base,
> - d->arch.vgic.rdist_regions[i].size);
> + hw_reg = dt_get_property(gic, "reg", &len);
> + if ( !hw_reg )
> + return -FDT_ERR_XEN(ENOENT);
> + if ( new_len > len )
> + return -FDT_ERR_XEN(ERANGE);
>
> - res = fdt_property(fdt, "reg", new_cells, len);
> - xfree(new_cells);
> + res = fdt_property(fdt, "reg", hw_reg, new_len);
> if ( res )
> return res;
>
> --
> 2.14.1
>
Tested on Espresso bin:
Tested-by: Amit Singh Tomar <amittomer25@xxxxxxxxx>
Thanks
-Amit
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |