[SPARC64]: Fetch cpu mid properly on sun4v.
If there is a "cpuid" property, use that. Else suck it out of the top bits of the "reg" property. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
5fe91cf625
Коммит
4cce4b7cc5
|
@ -29,13 +29,30 @@ DEFINE_SPINLOCK(ns87303_lock);
|
||||||
extern void cpu_probe(void);
|
extern void cpu_probe(void);
|
||||||
extern void central_probe(void);
|
extern void central_probe(void);
|
||||||
|
|
||||||
static char *cpu_mid_prop(void)
|
static const char *cpu_mid_prop(void)
|
||||||
{
|
{
|
||||||
if (tlb_type == spitfire)
|
if (tlb_type == spitfire)
|
||||||
return "upa-portid";
|
return "upa-portid";
|
||||||
return "portid";
|
return "portid";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_cpu_mid(int prom_node)
|
||||||
|
{
|
||||||
|
if (tlb_type == hypervisor) {
|
||||||
|
struct linux_prom64_registers reg;
|
||||||
|
|
||||||
|
if (prom_getproplen(prom_node, "cpuid") == 4)
|
||||||
|
return prom_getintdefault(prom_node, "cpuid", 0);
|
||||||
|
|
||||||
|
prom_getproperty(prom_node, "reg", (char *) ®, sizeof(reg));
|
||||||
|
return (reg.phys_addr >> 32) & 0x0fffffffUL;
|
||||||
|
} else {
|
||||||
|
const char *prop_name = cpu_mid_prop();
|
||||||
|
|
||||||
|
return prom_getintdefault(prom_node, prop_name, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int check_cpu_node(int nd, int *cur_inst,
|
static int check_cpu_node(int nd, int *cur_inst,
|
||||||
int (*compare)(int, int, void *), void *compare_arg,
|
int (*compare)(int, int, void *), void *compare_arg,
|
||||||
int *prom_node, int *mid)
|
int *prom_node, int *mid)
|
||||||
|
@ -50,7 +67,7 @@ static int check_cpu_node(int nd, int *cur_inst,
|
||||||
if (prom_node)
|
if (prom_node)
|
||||||
*prom_node = nd;
|
*prom_node = nd;
|
||||||
if (mid)
|
if (mid)
|
||||||
*mid = prom_getintdefault(nd, cpu_mid_prop(), 0);
|
*mid = get_cpu_mid(nd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +122,7 @@ static int cpu_mid_compare(int nd, int instance, void *_arg)
|
||||||
int desired_mid = (int) (long) _arg;
|
int desired_mid = (int) (long) _arg;
|
||||||
int this_mid;
|
int this_mid;
|
||||||
|
|
||||||
this_mid = prom_getintdefault(nd, cpu_mid_prop(), 0);
|
this_mid = get_cpu_mid(nd);
|
||||||
if (this_mid == desired_mid)
|
if (this_mid == desired_mid)
|
||||||
return 0;
|
return 0;
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче