On Tuesday, August 20, 2013 10:30:05 AM Sudeep KarkadaNagesha wrote:
> From: Sudeep KarkadaNagesha <sudeep.karkadanage...@arm.com>
> 
> Currently different drivers requiring to access cpu device node are
> parsing the device tree themselves. Since the ordering in the DT need
> not match the logical cpu ordering, the parsing logic needs to consider
> that. However, this has resulted in lots of code duplication and in some
> cases even incorrect logic.
> 
> It's better to consolidate them by adding support for getting cpu
> device node for a given logical cpu index in DT core library. However
> logical to physical index mapping can be architecture specific.
> 
> PowerPC has it's own implementation to get the cpu node for a given
> logical index.
> 
> This patch refactors the current implementation of of_get_cpu_node.
> This in preparation to move the implementation to DT core library.
> It separates out the logical to physical mapping so that a default
> matching of the physical id to the logical cpu index can be added
> when moved to common code. Architecture specific code can override it.
> 
> Cc: Rob Herring <rob.herr...@calxeda.com>
> Cc: Grant Likely <grant.lik...@linaro.org>
> Cc: Benjamin Herrenschmidt <b...@kernel.crashing.org>
> Signed-off-by: Sudeep KarkadaNagesha <sudeep.karkadanage...@arm.com>

This needs an ACK from Ben to go anywhere.

Thanks,
Rafael


> ---
>  arch/powerpc/kernel/prom.c | 76 
> ++++++++++++++++++++++++++++------------------
>  1 file changed, 47 insertions(+), 29 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
> index eb23ac9..f7b8c0b 100644
> --- a/arch/powerpc/kernel/prom.c
> +++ b/arch/powerpc/kernel/prom.c
> @@ -865,45 +865,63 @@ static int __init prom_reconfig_setup(void)
>  __initcall(prom_reconfig_setup);
>  #endif
>  
> +bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
> +{
> +     return (int)phys_id == get_hard_smp_processor_id(cpu);
> +}
> +
> +static bool __of_find_n_match_cpu_property(struct device_node *cpun,
> +                     const char *prop_name, int cpu, unsigned int *thread)
> +{
> +     const __be32 *cell;
> +     int ac, prop_len, tid;
> +     u64 hwid;
> +
> +     ac = of_n_addr_cells(cpun);
> +     cell = of_get_property(cpun, prop_name, &prop_len);
> +     if (!cell)
> +             return false;
> +     prop_len /= sizeof(*cell);
> +     for (tid = 0; tid < prop_len; tid++) {
> +             hwid = of_read_number(cell, ac);
> +             if (arch_match_cpu_phys_id(cpu, hwid)) {
> +                     if (thread)
> +                             *thread = tid;
> +                     return true;
> +             }
> +             cell += ac;
> +     }
> +     return false;
> +}
> +
>  /* Find the device node for a given logical cpu number, also returns the cpu
>   * local thread number (index in ibm,interrupt-server#s) if relevant and
>   * asked for (non NULL)
>   */
>  struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
>  {
> -     int hardid;
> -     struct device_node *np;
> +     struct device_node *cpun, *cpus;
>  
> -     hardid = get_hard_smp_processor_id(cpu);
> +     cpus = of_find_node_by_path("/cpus");
> +     if (!cpus) {
> +             pr_warn("Missing cpus node, bailing out\n");
> +             return NULL;
> +     }
>  
> -     for_each_node_by_type(np, "cpu") {
> -             const u32 *intserv;
> -             unsigned int plen, t;
> +     for_each_child_of_node(cpus, cpun) {
> +             if (of_node_cmp(cpun->type, "cpu"))
> +                     continue;
>  
> -             /* Check for ibm,ppc-interrupt-server#s. If it doesn't exist
> -              * fallback to "reg" property and assume no threads
> +             /* Check for non-standard "ibm,ppc-interrupt-server#s" property
> +              * for thread ids on PowerPC. If it doesn't exist fallback to
> +              * standard "reg" property.
>                */
> -             intserv = of_get_property(np, "ibm,ppc-interrupt-server#s",
> -                             &plen);
> -             if (intserv == NULL) {
> -                     const u32 *reg = of_get_property(np, "reg", NULL);
> -                     if (reg == NULL)
> -                             continue;
> -                     if (*reg == hardid) {
> -                             if (thread)
> -                                     *thread = 0;
> -                             return np;
> -                     }
> -             } else {
> -                     plen /= sizeof(u32);
> -                     for (t = 0; t < plen; t++) {
> -                             if (hardid == intserv[t]) {
> -                                     if (thread)
> -                                             *thread = t;
> -                                     return np;
> -                             }
> -                     }
> -             }
> +             if (__of_find_n_match_cpu_property(cpun,
> +                             "ibm,ppc-interrupt-server#s", cpu, thread))
> +                     return cpun;
> +
> +             if (__of_find_n_match_cpu_property(cpun, "reg", cpu, thread))
> +                     return cpun;
>       }
>       return NULL;
>  }
> 
-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to