[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



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).

> +    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++;

> +
> +            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.

> +            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.

Regards,

-- 
Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.