[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 7/7] xen/arm: get the number of cpus from device tree
The system might have fewer cpus than the GIC supports. Changes in v2: - return always at least 1 cpu; - skip nodes with names that don't start with "cpu". Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> --- xen/arch/arm/gic.c | 4 +--- xen/arch/arm/gic.h | 2 +- xen/arch/arm/setup.c | 3 ++- xen/common/device_tree.c | 19 +++++++++++++++++++ xen/include/xen/device_tree.h | 1 + 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 5f06e08..0c6fab9 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -304,7 +304,7 @@ static void __cpuinit gic_hyp_disable(void) } /* Set up the GIC */ -int __init gic_init(void) +void __init gic_init(void) { /* XXX FIXME get this from devicetree */ gic.dbase = GIC_BASE_ADDRESS + GIC_DR_OFFSET; @@ -328,8 +328,6 @@ int __init gic_init(void) gic.lr_mask = 0ULL; spin_unlock(&gic.lock); - - return gic.cpus; } /* Set up the per-CPU parts of the GIC for a secondary CPU */ diff --git a/xen/arch/arm/gic.h b/xen/arch/arm/gic.h index b2e1d7f..1bf1b02 100644 --- a/xen/arch/arm/gic.h +++ b/xen/arch/arm/gic.h @@ -147,7 +147,7 @@ extern int gic_route_irq_to_guest(struct domain *d, unsigned int irq, /* Accept an interrupt from the GIC and dispatch its handler */ extern void gic_interrupt(struct cpu_user_regs *regs, int is_fiq); /* Bring up the interrupt controller, and report # cpus attached */ -extern int gic_init(void); +extern void gic_init(void); /* Bring up a secondary CPU's per-CPU GIC interface */ extern void gic_init_secondary_cpu(void); /* Take down a CPU's per-CPU GIC interface */ diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index a579a56..632e7e3 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -193,6 +193,7 @@ void __init start_xen(unsigned long boot_phys_offset, + (atag_paddr & ((1 << SECOND_SHIFT) - 1)); fdt_size = device_tree_early_init(fdt); + cpus = device_tree_cpus(fdt); cmdline_parse(device_tree_bootargs(fdt)); setup_pagetables(boot_phys_offset, get_xen_paddr()); @@ -203,7 +204,7 @@ void __init start_xen(unsigned long boot_phys_offset, console_init_preirq(); #endif - cpus = gic_init(); + gic_init(); make_cpus_ready(cpus, boot_phys_offset); percpu_init_areas(); diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c index 3d1f0f4..5b6dab9 100644 --- a/xen/common/device_tree.c +++ b/xen/common/device_tree.c @@ -153,6 +153,25 @@ const char *device_tree_bootargs(const void *fdt) return prop->data; } +int device_tree_cpus(const void *fdt) +{ + int node = 0, depth = 1; + int cpus = 0; + + node = fdt_path_offset(fdt, "/cpus/cpu"); + if ( node < 0 ) + return 1; /* we have at least one cpu */ + + while ( node >= 0 && depth >= 0 ) { + if ( strncmp(fdt_get_name(fdt, node, NULL), "cpu", 3) ) + continue; + node = fdt_next_node(fdt, node, &depth); + cpus++; + } + + return cpus > 0 ? cpus : 1; +} + static int dump_node(const void *fdt, int node, const char *name, int depth, u32 address_cells, u32 size_cells, void *data) { diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h index 4d010c0..46bc0f8 100644 --- a/xen/include/xen/device_tree.h +++ b/xen/include/xen/device_tree.h @@ -49,6 +49,7 @@ bool_t device_tree_node_matches(const void *fdt, int node, const char *match); int device_tree_for_each_node(const void *fdt, device_tree_node_func func, void *data); const char *device_tree_bootargs(const void *fdt); +int device_tree_cpus(const void *fdt); void device_tree_dump(const void *fdt); #endif -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |