|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH v3 07/12] arch/arm: create device tree nodes for hwdom cpufreq cpu driver
On Thu, Oct 23, 2014 at 6:49 PM, Julien Grall <julien.grall@xxxxxxxxxx> wrote:
> Hi Oleksandr,
>
> On 10/23/2014 04:07 PM, Oleksandr Dmytryshyn wrote:
>> 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");
>
> This new bindings has to be documented somewhere. The best places would
> be in Documentation/devicetree/bindins/arm/xen.txt (see Linux repo).
I'll do this in the next patch-set.
>> + 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);
>
> The first check on node_name is pointless because of the node_name++ above.
>
> I would divide the ASSERT in 2 parts, and do the first check before
> node_name++;
I'll do this in the next patch-set.
>> +
>> + 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;
>> + }
>> + }
>> +
>
> You can use write_properties to replace this loop.
I'll try to do this in the next patch set.
>> + 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);
>
> You forgot to check the return value of the function.
I'll add checking in the next patch-set.
> Regards,
>
> --
> Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |