aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/kernel/smp.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-03-08 19:09:19 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 04:14:24 -0500
commit8935dced547afbf37d0fcfcac9a3556494e53104 (patch)
tree0ae802875c73e99b86e4f90be6e953ec0c528dea /arch/sparc64/kernel/smp.c
parent17b0e199a10184d8c5bbbd79a4cee993bb1fb257 (diff)
[SPARC64]: Add SMT scheduling support for Niagara.
The mapping is a simple "(cpuid >> 2) == core" for now. Later we'll add more sophisticated code that will walk the sun4v machine description and figure this out from there. We should also add core mappings for jaguar and panther processors. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/smp.c')
-rw-r--r--arch/sparc64/kernel/smp.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index cf56128097c8..373a701c90a5 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -47,6 +47,8 @@ static unsigned char boot_cpu_id;
47 47
48cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE; 48cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE;
49cpumask_t phys_cpu_present_map __read_mostly = CPU_MASK_NONE; 49cpumask_t phys_cpu_present_map __read_mostly = CPU_MASK_NONE;
50cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly =
51 { [0 ... NR_CPUS-1] = CPU_MASK_NONE };
50static cpumask_t smp_commenced_mask; 52static cpumask_t smp_commenced_mask;
51static cpumask_t cpu_callout_map; 53static cpumask_t cpu_callout_map;
52 54
@@ -1291,6 +1293,8 @@ int setup_profiling_timer(unsigned int multiplier)
1291/* Constrain the number of cpus to max_cpus. */ 1293/* Constrain the number of cpus to max_cpus. */
1292void __init smp_prepare_cpus(unsigned int max_cpus) 1294void __init smp_prepare_cpus(unsigned int max_cpus)
1293{ 1295{
1296 int i;
1297
1294 if (num_possible_cpus() > max_cpus) { 1298 if (num_possible_cpus() > max_cpus) {
1295 int instance, mid; 1299 int instance, mid;
1296 1300
@@ -1305,6 +1309,20 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
1305 } 1309 }
1306 } 1310 }
1307 1311
1312 for_each_cpu(i) {
1313 if (tlb_type == hypervisor) {
1314 int j;
1315
1316 /* XXX get this mapping from machine description */
1317 for_each_cpu(j) {
1318 if ((j >> 2) == (i >> 2))
1319 cpu_set(j, cpu_sibling_map[i]);
1320 }
1321 } else {
1322 cpu_set(i, cpu_sibling_map[i]);
1323 }
1324 }
1325
1308 smp_store_cpu_info(boot_cpu_id); 1326 smp_store_cpu_info(boot_cpu_id);
1309} 1327}
1310 1328