aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/kernel/devices.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-02-09 23:46:22 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 04:12:09 -0500
commit4cce4b7cc56abc3d7b269d09224b8297aad15138 (patch)
tree69e0f38ef8e9be4328d0098dee1a86a665f8dad7 /arch/sparc64/kernel/devices.c
parent5fe91cf6254c8f23d90efb5fc11fff57dd5ab8dd (diff)
[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>
Diffstat (limited to 'arch/sparc64/kernel/devices.c')
-rw-r--r--arch/sparc64/kernel/devices.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/arch/sparc64/kernel/devices.c b/arch/sparc64/kernel/devices.c
index df9a1ca8fd77..ac11d872ef74 100644
--- a/arch/sparc64/kernel/devices.c
+++ b/arch/sparc64/kernel/devices.c
@@ -29,13 +29,30 @@ DEFINE_SPINLOCK(ns87303_lock);
29extern void cpu_probe(void); 29extern void cpu_probe(void);
30extern void central_probe(void); 30extern void central_probe(void);
31 31
32static char *cpu_mid_prop(void) 32static const char *cpu_mid_prop(void)
33{ 33{
34 if (tlb_type == spitfire) 34 if (tlb_type == spitfire)
35 return "upa-portid"; 35 return "upa-portid";
36 return "portid"; 36 return "portid";
37} 37}
38 38
39static int get_cpu_mid(int prom_node)
40{
41 if (tlb_type == hypervisor) {
42 struct linux_prom64_registers reg;
43
44 if (prom_getproplen(prom_node, "cpuid") == 4)
45 return prom_getintdefault(prom_node, "cpuid", 0);
46
47 prom_getproperty(prom_node, "reg", (char *) &reg, sizeof(reg));
48 return (reg.phys_addr >> 32) & 0x0fffffffUL;
49 } else {
50 const char *prop_name = cpu_mid_prop();
51
52 return prom_getintdefault(prom_node, prop_name, 0);
53 }
54}
55
39static int check_cpu_node(int nd, int *cur_inst, 56static int check_cpu_node(int nd, int *cur_inst,
40 int (*compare)(int, int, void *), void *compare_arg, 57 int (*compare)(int, int, void *), void *compare_arg,
41 int *prom_node, int *mid) 58 int *prom_node, int *mid)
@@ -50,7 +67,7 @@ static int check_cpu_node(int nd, int *cur_inst,
50 if (prom_node) 67 if (prom_node)
51 *prom_node = nd; 68 *prom_node = nd;
52 if (mid) 69 if (mid)
53 *mid = prom_getintdefault(nd, cpu_mid_prop(), 0); 70 *mid = get_cpu_mid(nd);
54 return 0; 71 return 0;
55 } 72 }
56 73
@@ -105,7 +122,7 @@ static int cpu_mid_compare(int nd, int instance, void *_arg)
105 int desired_mid = (int) (long) _arg; 122 int desired_mid = (int) (long) _arg;
106 int this_mid; 123 int this_mid;
107 124
108 this_mid = prom_getintdefault(nd, cpu_mid_prop(), 0); 125 this_mid = get_cpu_mid(nd);
109 if (this_mid == desired_mid) 126 if (this_mid == desired_mid)
110 return 0; 127 return 0;
111 return -ENODEV; 128 return -ENODEV;