[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
On 30/01/18 19:04, Stefano Stabellini wrote: > On Tue, 30 Jan 2018, Andre Przywara 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> > > There is one code style issue below, but I'll fix it on commit. Argh, indeed, Julien found this as well. Thanks for the smooth handling! Cheers, Andre. > Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > >> --- >> 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 >> _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |