[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v1 10/10] xen/arm: GICv3 device tree parsing
From: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> GICv3 supports system register access to GIC cpu interface. So no need to read device tree for cpu interface. GICv3 adds Re-distributor region and redistributor stride which are parsed. Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx> --- xen/arch/arm/domain_build.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 5ca2f15..c88c5ae 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -532,6 +532,8 @@ static int make_gic_node(const struct domain *d, void *fdt, u32 len; __be32 *new_cells, *tmp; int res = 0; + int hw_type = GIC_VERSION_V2; + u32 rd_stride = 0; /* * Xen currently supports only a single GIC. Discard any secondary @@ -545,6 +547,8 @@ static int make_gic_node(const struct domain *d, void *fdt, DPRINT("Create gic node\n"); + hw_type = gic_hw_version(); + compatible = dt_get_property(gic, "compatible", &len); if ( !compatible ) { @@ -552,6 +556,12 @@ static int make_gic_node(const struct domain *d, void *fdt, return -FDT_ERR_XEN(ENOENT); } + if (hw_type == GIC_VERSION_V3) + { + res = dt_property_read_u32(gic, "redistributor-stride", &rd_stride); + if ( !res ) + rd_stride = 0; + } res = fdt_begin_node(fdt, "interrupt-controller"); if ( res ) return res; @@ -569,6 +579,13 @@ static int make_gic_node(const struct domain *d, void *fdt, if ( res ) return res; + if (hw_type == GIC_VERSION_V3) + { + res = fdt_property_cell(fdt, "redistributor-stride", rd_stride); + if ( res ) + return res; + DPRINT(" gicv3 rd stride 0x%x\n", rd_stride); + } len = dt_cells_to_size(dt_n_addr_cells(node) + dt_n_size_cells(node)); len *= 2; /* GIC has two memory regions: Distributor + CPU interface */ new_cells = xzalloc_bytes(len); @@ -576,14 +593,26 @@ static int make_gic_node(const struct domain *d, void *fdt, return -FDT_ERR_XEN(ENOMEM); tmp = new_cells; - DPRINT(" Set Distributor Base 0x%"PRIpaddr"-0x%"PRIpaddr"\n", - d->arch.vgic.dbase, d->arch.vgic.dbase + PAGE_SIZE - 1); - dt_set_range(&tmp, node, d->arch.vgic.dbase, PAGE_SIZE); + if (hw_type == GIC_VERSION_V3) + { + DPRINT(" Set Distributor Base 0x%"PRIpaddr"-0x%"PRIpaddr"\n", + d->arch.vgic.dbase, d->arch.vgic.dbase + d->arch.vgic.dbase_size - 1); + dt_set_range(&tmp, node, d->arch.vgic.dbase, d->arch.vgic.dbase_size); - DPRINT(" Set Cpu Base 0x%"PRIpaddr"-0x%"PRIpaddr"\n", - d->arch.vgic.cbase, d->arch.vgic.cbase + (PAGE_SIZE * 2) - 1); - dt_set_range(&tmp, node, d->arch.vgic.cbase, PAGE_SIZE * 2); + DPRINT(" Set Re-distributor Base 0x%"PRIpaddr"-0x%"PRIpaddr"\n", + d->arch.vgic.cbase, d->arch.vgic.rbase + d->arch.vgic.rbase_size - 1); + dt_set_range(&tmp, node, d->arch.vgic.rbase, d->arch.vgic.rbase_size); + } + else + { + DPRINT(" Set Distributor Base 0x%"PRIpaddr"-0x%"PRIpaddr"\n", + d->arch.vgic.dbase, d->arch.vgic.dbase + PAGE_SIZE - 1); + dt_set_range(&tmp, node, d->arch.vgic.dbase, PAGE_SIZE); + DPRINT(" Set Cpu Base 0x%"PRIpaddr"-0x%"PRIpaddr"\n", + d->arch.vgic.cbase, d->arch.vgic.cbase + (PAGE_SIZE * 2) - 1); + dt_set_range(&tmp, node, d->arch.vgic.cbase, PAGE_SIZE * 2); + } res = fdt_property(fdt, "reg", new_cells, len); xfree(new_cells); -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |