of: Make cpu node handling more portable.
Use for_each_node_by_type() to iterate all cpu nodes in the system. Provide and overridable function arch_find_n_match_cpu_physical_id, which sees if the given device node matches 'cpu' and if so sets '*thread' when non-NULL to the cpu thread number within the core. The default implementation behaves the same as the existing code. Add a sparc64 implementation. Signed-off-by: David S. Miller <davem@davemloft.net> Tested-by: Sudeep KarkadaNagesha <Sudeep.KarkadaNagesha@arm.com> Signed-off-by: Grant Likely <grant.likely@linaro.org>
This commit is contained in:

committed by
Grant Likely

parent
444c91e572
commit
d1cb9d1af0
@@ -373,6 +373,59 @@ static const char *get_mid_prop(void)
|
||||
return (tlb_type == spitfire ? "upa-portid" : "portid");
|
||||
}
|
||||
|
||||
bool arch_find_n_match_cpu_physical_id(struct device_node *cpun,
|
||||
int cpu, unsigned int *thread)
|
||||
{
|
||||
const char *mid_prop = get_mid_prop();
|
||||
int this_cpu_id;
|
||||
|
||||
/* On hypervisor based platforms we interrogate the 'reg'
|
||||
* property. On everything else we look for a 'upa-portis',
|
||||
* 'portid', or 'cpuid' property.
|
||||
*/
|
||||
|
||||
if (tlb_type == hypervisor) {
|
||||
struct property *prop = of_find_property(cpun, "reg", NULL);
|
||||
u32 *regs;
|
||||
|
||||
if (!prop) {
|
||||
pr_warn("CPU node missing reg property\n");
|
||||
return false;
|
||||
}
|
||||
regs = prop->value;
|
||||
this_cpu_id = regs[0] & 0x0fffffff;
|
||||
} else {
|
||||
this_cpu_id = of_getintprop_default(cpun, mid_prop, -1);
|
||||
|
||||
if (this_cpu_id < 0) {
|
||||
mid_prop = "cpuid";
|
||||
this_cpu_id = of_getintprop_default(cpun, mid_prop, -1);
|
||||
}
|
||||
if (this_cpu_id < 0) {
|
||||
pr_warn("CPU node missing cpu ID property\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (this_cpu_id == cpu) {
|
||||
if (thread) {
|
||||
int proc_id = cpu_data(cpu).proc_id;
|
||||
|
||||
/* On sparc64, the cpu thread information is obtained
|
||||
* either from OBP or the machine description. We've
|
||||
* actually probed this information already long before
|
||||
* this interface gets called so instead of interrogating
|
||||
* both the OF node and the MDESC again, just use what
|
||||
* we discovered already.
|
||||
*/
|
||||
if (proc_id < 0)
|
||||
proc_id = 0;
|
||||
*thread = proc_id;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void *of_iterate_over_cpus(void *(*func)(struct device_node *, int, int), int arg)
|
||||
{
|
||||
struct device_node *dp;
|
||||
|
Reference in New Issue
Block a user