[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH v3 07/12] arch/arm: create device tree nodes for hwdom cpufreq cpu driver
This patch copies all cpu@xxxxxx@N nodes (from input device tree) with properties to /hypervisor/pcpus node (device tree for hwdom). Thus we can give all information about all physical CPUs in the pcpus node. Driver in hwdom should parse /hypervisor/pcpus path instead of the /cpus path in the device tree. Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@xxxxxxxxxxxxxxx> --- xen/arch/arm/domain_build.c | 67 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 2db0236..2186514 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -326,6 +326,69 @@ static int make_memory_node(const struct domain *d, return res; } +#ifdef HAS_CPUFREQ +static int fdt_copy_phys_cpus_nodes(void *fdt) +{ + int res; + const struct dt_device_node *cpus = dt_find_node_by_path("/cpus"); + const struct dt_device_node *npcpu; + const struct dt_property *pp; + char *node_name; + + if ( !cpus ) + { + dprintk(XENLOG_ERR, "Missing /cpus node in the device tree?\n"); + return -ENOENT; + } + + /* + * create pcpus node and copy to it + * original cpu@xxxxxx@N nodes with its properties. + * This is needed for the cpufreq cpu driver in Dom0 + */ + DPRINT("Create pcpus node\n"); + + res = fdt_begin_node(fdt, "pcpus"); + if ( res ) + return res; + + dt_for_each_child_node( cpus, npcpu ) + { + if ( dt_device_type_is_equal(npcpu, "cpu") ) + { + node_name = strrchr(dt_node_full_name(npcpu), '/'); + node_name++; + + ASSERT(node_name && *node_name); + + DPRINT("Copy %s node to the pcpus\n", node_name); + + res = fdt_begin_node(fdt, node_name); + if ( res ) + return res; + + dt_for_each_property_node( npcpu, pp ) + { + if ( pp->length ) + { + res = fdt_property(fdt, pp->name, pp->value, + pp->length); + if ( res ) + return res; + } + } + + res = fdt_end_node(fdt); + if ( res ) + return res; + } + } + + res = fdt_end_node(fdt); + return res; +} +#endif /* HAS_CPUFREQ */ + static int make_hypervisor_node(struct domain *d, void *fdt, const struct dt_device_node *parent) { @@ -386,6 +449,10 @@ static int make_hypervisor_node(struct domain *d, if ( res ) return res; + #ifdef HAS_CPUFREQ + fdt_copy_phys_cpus_nodes(fdt); + #endif + res = fdt_end_node(fdt); return res; -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |