1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#include <linux/module.h>
37#include <linux/init.h>
38#include <linux/kernel.h>
39
40#include <linux/mm.h>
41#include <linux/sched.h>
42#include <linux/kernel_stat.h>
43#include <linux/bootmem.h>
44#include <linux/notifier.h>
45#include <linux/cpu.h>
46#include <linux/percpu.h>
47#include <linux/nmi.h>
48
49#include <linux/delay.h>
50#include <linux/mc146818rtc.h>
51#include <asm/tlbflush.h>
52#include <asm/desc.h>
53#include <asm/arch_hooks.h>
54#include <asm/nmi.h>
55
56#include <mach_apic.h>
57#include <mach_wakecpu.h>
58#include <smpboot_hooks.h>
59#include <asm/vmi.h>
60#include <asm/mtrr.h>
61
62
63static int __devinitdata smp_b_stepping;
64
65
66int smp_num_siblings = 1;
67EXPORT_SYMBOL(smp_num_siblings);
68
69
70int cpu_llc_id[NR_CPUS] __cpuinitdata = {[0 ... NR_CPUS-1] = BAD_APICID};
71
72
73cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly;
74EXPORT_SYMBOL(cpu_sibling_map);
75
76
77cpumask_t cpu_core_map[NR_CPUS] __read_mostly;
78EXPORT_SYMBOL(cpu_core_map);
79
80
81cpumask_t cpu_online_map __read_mostly;
82EXPORT_SYMBOL(cpu_online_map);
83
84cpumask_t cpu_callin_map;
85cpumask_t cpu_callout_map;
86EXPORT_SYMBOL(cpu_callout_map);
87cpumask_t cpu_possible_map;
88EXPORT_SYMBOL(cpu_possible_map);
89static cpumask_t smp_commenced_mask;
90
91
92struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
93EXPORT_SYMBOL(cpu_data);
94
95u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly =
96 { [0 ... NR_CPUS-1] = 0xff };
97EXPORT_SYMBOL(x86_cpu_to_apicid);
98
99u8 apicid_2_node[MAX_APICID];
100
101
102
103
104
105extern unsigned char trampoline_data [];
106extern unsigned char trampoline_end [];
107static unsigned char *trampoline_base;
108static int trampoline_exec;
109
110static void map_cpu_to_logical_apicid(void);
111
112
113DEFINE_PER_CPU(int, cpu_state) = { 0 };
114
115
116
117
118
119
120
121static unsigned long __devinit setup_trampoline(void)
122{
123 memcpy(trampoline_base, trampoline_data, trampoline_end - trampoline_data);
124 return virt_to_phys(trampoline_base);
125}
126
127
128
129
130
131void __init smp_alloc_memory(void)
132{
133 trampoline_base = (void *) alloc_bootmem_low_pages(PAGE_SIZE);
134
135
136
137
138 if (__pa(trampoline_base) >= 0x9F000)
139 BUG();
140
141
142
143 trampoline_exec = set_kernel_exec((unsigned long)trampoline_base, 1);
144}
145
146
147
148
149
150
151static void __cpuinit smp_store_cpu_info(int id)
152{
153 struct cpuinfo_x86 *c = cpu_data + id;
154
155 *c = boot_cpu_data;
156 if (id!=0)
157 identify_secondary_cpu(c);
158
159
160
161 if (c->x86_vendor == X86_VENDOR_INTEL &&
162 c->x86 == 5 &&
163 c->x86_mask >= 1 && c->x86_mask <= 4 &&
164 c->x86_model <= 3)
165
166
167
168 smp_b_stepping = 1;
169
170
171
172
173
174 if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) {
175
176 if (num_possible_cpus() == 1)
177 goto valid_k7;
178
179
180 if ((c->x86_model==6) && ((c->x86_mask==0) || (c->x86_mask==1)))
181 goto valid_k7;
182
183
184 if ((c->x86_model==7) && (c->x86_mask==0))
185 goto valid_k7;
186
187
188
189
190
191
192
193 if (((c->x86_model==6) && (c->x86_mask>=2)) ||
194 ((c->x86_model==7) && (c->x86_mask>=1)) ||
195 (c->x86_model> 7))
196 if (cpu_has_mp)
197 goto valid_k7;
198
199
200 add_taint(TAINT_UNSAFE_SMP);
201 }
202
203valid_k7:
204 ;
205}
206
207extern void calibrate_delay(void);
208
209static atomic_t init_deasserted;
210
211static void __cpuinit smp_callin(void)
212{
213 int cpuid, phys_id;
214 unsigned long timeout;
215
216
217
218
219
220
221
222 wait_for_init_deassert(&init_deasserted);
223
224
225
226
227 phys_id = GET_APIC_ID(apic_read(APIC_ID));
228 cpuid = smp_processor_id();
229 if (cpu_isset(cpuid, cpu_callin_map)) {
230 printk("huh, phys CPU#%d, CPU#%d already present??\n",
231 phys_id, cpuid);
232 BUG();
233 }
234 Dprintk("CPU#%d (phys ID: %d) waiting for CALLOUT\n", cpuid, phys_id);
235
236
237
238
239
240
241
242
243
244
245
246
247 timeout = jiffies + 2*HZ;
248 while (time_before(jiffies, timeout)) {
249
250
251
252 if (cpu_isset(cpuid, cpu_callout_map))
253 break;
254 rep_nop();
255 }
256
257 if (!time_before(jiffies, timeout)) {
258 printk("BUG: CPU%d started up but did not get a callout!\n",
259 cpuid);
260 BUG();
261 }
262
263
264
265
266
267
268
269
270 Dprintk("CALLIN, before setup_local_APIC().\n");
271 smp_callin_clear_local_apic();
272 setup_local_APIC();
273 map_cpu_to_logical_apicid();
274
275
276
277
278 calibrate_delay();
279 Dprintk("Stack at about %p\n",&cpuid);
280
281
282
283
284 smp_store_cpu_info(cpuid);
285
286
287
288
289 cpu_set(cpuid, cpu_callin_map);
290}
291
292static int cpucount;
293
294
295cpumask_t cpu_coregroup_map(int cpu)
296{
297 struct cpuinfo_x86 *c = cpu_data + cpu;
298
299
300
301
302 if (sched_mc_power_savings || sched_smt_power_savings)
303 return cpu_core_map[cpu];
304 else
305 return c->llc_shared_map;
306}
307
308
309static cpumask_t cpu_sibling_setup_map;
310
311static inline void
312set_cpu_sibling_map(int cpu)
313{
314 int i;
315 struct cpuinfo_x86 *c = cpu_data;
316
317 cpu_set(cpu, cpu_sibling_setup_map);
318
319 if (smp_num_siblings > 1) {
320 for_each_cpu_mask(i, cpu_sibling_setup_map) {
321 if (c[cpu].phys_proc_id == c[i].phys_proc_id &&
322 c[cpu].cpu_core_id == c[i].cpu_core_id) {
323 cpu_set(i, cpu_sibling_map[cpu]);
324 cpu_set(cpu, cpu_sibling_map[i]);
325 cpu_set(i, cpu_core_map[cpu]);
326 cpu_set(cpu, cpu_core_map[i]);
327 cpu_set(i, c[cpu].llc_shared_map);
328 cpu_set(cpu, c[i].llc_shared_map);
329 }
330 }
331 } else {
332 cpu_set(cpu, cpu_sibling_map[cpu]);
333 }
334
335 cpu_set(cpu, c[cpu].llc_shared_map);
336
337 if (current_cpu_data.x86_max_cores == 1) {
338 cpu_core_map[cpu] = cpu_sibling_map[cpu];
339 c[cpu].booted_cores = 1;
340 return;
341 }
342
343 for_each_cpu_mask(i, cpu_sibling_setup_map) {
344 if (cpu_llc_id[cpu] != BAD_APICID &&
345 cpu_llc_id[cpu] == cpu_llc_id[i]) {
346 cpu_set(i, c[cpu].llc_shared_map);
347 cpu_set(cpu, c[i].llc_shared_map);
348 }
349 if (c[cpu].phys_proc_id == c[i].phys_proc_id) {
350 cpu_set(i, cpu_core_map[cpu]);
351 cpu_set(cpu, cpu_core_map[i]);
352
353
354
355 if (cpus_weight(cpu_sibling_map[cpu]) == 1) {
356
357
358
359
360 if (first_cpu(cpu_sibling_map[i]) == i)
361 c[cpu].booted_cores++;
362
363
364
365
366 if (i != cpu)
367 c[i].booted_cores++;
368 } else if (i != cpu && !c[cpu].booted_cores)
369 c[cpu].booted_cores = c[i].booted_cores;
370 }
371 }
372}
373
374
375
376
377static void __cpuinit start_secondary(void *unused)
378{
379
380
381
382
383
384#ifdef CONFIG_VMI
385 vmi_bringup();
386#endif
387 cpu_init();
388 preempt_disable();
389 smp_callin();
390 while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
391 rep_nop();
392
393
394
395 check_tsc_sync_target();
396
397 setup_secondary_clock();
398 if (nmi_watchdog == NMI_IO_APIC) {
399 disable_8259A_irq(0);
400 enable_NMI_through_LVT0(NULL);
401 enable_8259A_irq(0);
402 }
403
404
405
406
407 local_flush_tlb();
408
409
410 set_cpu_sibling_map(raw_smp_processor_id());
411 wmb();
412
413
414
415
416
417
418
419
420
421 lock_ipi_call_lock();
422 cpu_set(smp_processor_id(), cpu_online_map);
423 unlock_ipi_call_lock();
424 per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
425
426
427 local_irq_enable();
428
429 wmb();
430 cpu_idle();
431}
432
433
434
435
436
437
438
439void __devinit initialize_secondary(void)
440{
441
442
443
444
445
446 asm volatile(
447 "movl %0,%%esp\n\t"
448 "jmp *%1"
449 :
450 :"m" (current->thread.esp),"m" (current->thread.eip));
451}
452
453
454extern struct {
455 void * esp;
456 unsigned short ss;
457} stack_start;
458
459#ifdef CONFIG_NUMA
460
461
462cpumask_t node_2_cpu_mask[MAX_NUMNODES] __read_mostly =
463 { [0 ... MAX_NUMNODES-1] = CPU_MASK_NONE };
464EXPORT_SYMBOL(node_2_cpu_mask);
465
466int cpu_2_node[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = 0 };
467EXPORT_SYMBOL(cpu_2_node);
468
469
470static inline void map_cpu_to_node(int cpu, int node)
471{
472 printk("Mapping cpu %d to node %d\n", cpu, node);
473 cpu_set(cpu, node_2_cpu_mask[node]);
474 cpu_2_node[cpu] = node;
475}
476
477
478static inline void unmap_cpu_to_node(int cpu)
479{
480 int node;
481
482 printk("Unmapping cpu %d from all nodes\n", cpu);
483 for (node = 0; node < MAX_NUMNODES; node ++)
484 cpu_clear(cpu, node_2_cpu_mask[node]);
485 cpu_2_node[cpu] = 0;
486}
487#else
488
489#define map_cpu_to_node(cpu, node) ({})
490#define unmap_cpu_to_node(cpu) ({})
491
492#endif
493
494u8 cpu_2_logical_apicid[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
495
496static void map_cpu_to_logical_apicid(void)
497{
498 int cpu = smp_processor_id();
499 int apicid = logical_smp_processor_id();
500 int node = apicid_to_node(apicid);
501
502 if (!node_online(node))
503 node = first_online_node;
504
505 cpu_2_logical_apicid[cpu] = apicid;
506 map_cpu_to_node(cpu, node);
507}
508
509static void unmap_cpu_to_logical_apicid(int cpu)
510{
511 cpu_2_logical_apicid[cpu] = BAD_APICID;
512 unmap_cpu_to_node(cpu);
513}
514
515static inline void __inquire_remote_apic(int apicid)
516{
517 int i, regs[] = { APIC_ID >> 4, APIC_LVR >> 4, APIC_SPIV >> 4 };
518 char *names[] = { "ID", "VERSION", "SPIV" };
519 int timeout;
520 unsigned long status;
521
522 printk("Inquiring remote APIC #%d...\n", apicid);
523
524 for (i = 0; i < ARRAY_SIZE(regs); i++) {
525 printk("... APIC #%d %s: ", apicid, names[i]);
526
527
528
529
530 status = safe_apic_wait_icr_idle();
531 if (status)
532 printk("a previous APIC delivery may have failed\n");
533
534 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(apicid));
535 apic_write_around(APIC_ICR, APIC_DM_REMRD | regs[i]);
536
537 timeout = 0;
538 do {
539 udelay(100);
540 status = apic_read(APIC_ICR) & APIC_ICR_RR_MASK;
541 } while (status == APIC_ICR_RR_INPROG && timeout++ < 1000);
542
543 switch (status) {
544 case APIC_ICR_RR_VALID:
545 status = apic_read(APIC_RRR);
546 printk("%lx\n", status);
547 break;
548 default:
549 printk("failed\n");
550 }
551 }
552}
553
554#ifdef WAKE_SECONDARY_VIA_NMI
555
556
557
558
559
560static int __devinit
561wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
562{
563 unsigned long send_status, accept_status = 0;
564 int maxlvt;
565
566
567 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(logical_apicid));
568
569
570
571 apic_write_around(APIC_ICR, APIC_DM_NMI | APIC_DEST_LOGICAL);
572
573 Dprintk("Waiting for send to finish...\n");
574 send_status = safe_apic_wait_icr_idle();
575
576
577
578
579 udelay(200);
580
581
582
583 maxlvt = lapic_get_maxlvt();
584 if (maxlvt > 3) {
585 apic_read_around(APIC_SPIV);
586 apic_write(APIC_ESR, 0);
587 }
588 accept_status = (apic_read(APIC_ESR) & 0xEF);
589 Dprintk("NMI sent.\n");
590
591 if (send_status)
592 printk("APIC never delivered???\n");
593 if (accept_status)
594 printk("APIC delivery error (%lx).\n", accept_status);
595
596 return (send_status | accept_status);
597}
598#endif
599
600#ifdef WAKE_SECONDARY_VIA_INIT
601static int __devinit
602wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
603{
604 unsigned long send_status, accept_status = 0;
605 int maxlvt, num_starts, j;
606
607
608
609
610 if (APIC_INTEGRATED(apic_version[phys_apicid])) {
611 apic_read_around(APIC_SPIV);
612 apic_write(APIC_ESR, 0);
613 apic_read(APIC_ESR);
614 }
615
616 Dprintk("Asserting INIT.\n");
617
618
619
620
621 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(phys_apicid));
622
623
624
625
626 apic_write_around(APIC_ICR, APIC_INT_LEVELTRIG | APIC_INT_ASSERT
627 | APIC_DM_INIT);
628
629 Dprintk("Waiting for send to finish...\n");
630 send_status = safe_apic_wait_icr_idle();
631
632 mdelay(10);
633
634 Dprintk("Deasserting INIT.\n");
635
636
637 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(phys_apicid));
638
639
640 apic_write_around(APIC_ICR, APIC_INT_LEVELTRIG | APIC_DM_INIT);
641
642 Dprintk("Waiting for send to finish...\n");
643 send_status = safe_apic_wait_icr_idle();
644
645 atomic_set(&init_deasserted, 1);
646
647
648
649
650
651
652
653 if (APIC_INTEGRATED(apic_version[phys_apicid]))
654 num_starts = 2;
655 else
656 num_starts = 0;
657
658
659
660
661
662 startup_ipi_hook(phys_apicid, (unsigned long) start_secondary,
663 (unsigned long) stack_start.esp);
664
665
666
667
668 Dprintk("#startup loops: %d.\n", num_starts);
669
670 maxlvt = lapic_get_maxlvt();
671
672 for (j = 1; j <= num_starts; j++) {
673 Dprintk("Sending STARTUP #%d.\n",j);
674 apic_read_around(APIC_SPIV);
675 apic_write(APIC_ESR, 0);
676 apic_read(APIC_ESR);
677 Dprintk("After apic_write.\n");
678
679
680
681
682
683
684 apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(phys_apicid));
685
686
687
688 apic_write_around(APIC_ICR, APIC_DM_STARTUP
689 | (start_eip >> 12));
690
691
692
693
694 udelay(300);
695
696 Dprintk("Startup point 1.\n");
697
698 Dprintk("Waiting for send to finish...\n");
699 send_status = safe_apic_wait_icr_idle();
700
701
702
703
704 udelay(200);
705
706
707
708 if (maxlvt > 3) {
709 apic_read_around(APIC_SPIV);
710 apic_write(APIC_ESR, 0);
711 }
712 accept_status = (apic_read(APIC_ESR) & 0xEF);
713 if (send_status || accept_status)
714 break;
715 }
716 Dprintk("After Startup.\n");
717
718 if (send_status)
719 printk("APIC never delivered???\n");
720 if (accept_status)
721 printk("APIC delivery error (%lx).\n", accept_status);
722
723 return (send_status | accept_status);
724}
725#endif
726
727extern cpumask_t cpu_initialized;
728static inline int alloc_cpu_id(void)
729{
730 cpumask_t tmp_map;
731 int cpu;
732 cpus_complement(tmp_map, cpu_present_map);
733 cpu = first_cpu(tmp_map);
734 if (cpu >= NR_CPUS)
735 return -ENODEV;
736 return cpu;
737}
738
739#ifdef CONFIG_HOTPLUG_CPU
740static struct task_struct * __devinitdata cpu_idle_tasks[NR_CPUS];
741static inline struct task_struct * alloc_idle_task(int cpu)
742{
743 struct task_struct *idle;
744
745 if ((idle = cpu_idle_tasks[cpu]) != NULL) {
746
747
748
749 idle->thread.esp = (unsigned long)task_pt_regs(idle);
750 init_idle(idle, cpu);
751 return idle;
752 }
753 idle = fork_idle(cpu);
754
755 if (!IS_ERR(idle))
756 cpu_idle_tasks[cpu] = idle;
757 return idle;
758}
759#else
760#define alloc_idle_task(cpu) fork_idle(cpu)
761#endif
762
763static int __cpuinit do_boot_cpu(int apicid, int cpu)
764
765
766
767
768
769{
770 struct task_struct *idle;
771 unsigned long boot_error;
772 int timeout;
773 unsigned long start_eip;
774 unsigned short nmi_high = 0, nmi_low = 0;
775
776
777
778
779
780 mtrr_save_state();
781
782
783
784
785
786 idle = alloc_idle_task(cpu);
787 if (IS_ERR(idle))
788 panic("failed fork for CPU %d", cpu);
789
790 init_gdt(cpu);
791 per_cpu(current_task, cpu) = idle;
792 early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu);
793
794 idle->thread.eip = (unsigned long) start_secondary;
795
796 start_eip = setup_trampoline();
797
798 ++cpucount;
799 alternatives_smp_switch(1);
800
801
802 printk("Booting processor %d/%d eip %lx\n", cpu, apicid, start_eip);
803
804 stack_start.esp = (void *) idle->thread.esp;
805
806 irq_ctx_init(cpu);
807
808 x86_cpu_to_apicid[cpu] = apicid;
809
810
811
812
813
814 atomic_set(&init_deasserted, 0);
815
816 Dprintk("Setting warm reset code and vector.\n");
817
818 store_NMI_vector(&nmi_high, &nmi_low);
819
820 smpboot_setup_warm_reset_vector(start_eip);
821
822
823
824
825 boot_error = wakeup_secondary_cpu(apicid, start_eip);
826
827 if (!boot_error) {
828
829
830
831 Dprintk("Before Callout %d.\n", cpu);
832 cpu_set(cpu, cpu_callout_map);
833 Dprintk("After Callout %d.\n", cpu);
834
835
836
837
838 for (timeout = 0; timeout < 50000; timeout++) {
839 if (cpu_isset(cpu, cpu_callin_map))
840 break;
841 udelay(100);
842 }
843
844 if (cpu_isset(cpu, cpu_callin_map)) {
845
846 Dprintk("OK.\n");
847 printk("CPU%d: ", cpu);
848 print_cpu_info(&cpu_data[cpu]);
849 Dprintk("CPU has booted.\n");
850 } else {
851 boot_error= 1;
852 if (*((volatile unsigned char *)trampoline_base)
853 == 0xA5)
854
855 printk("Stuck ??\n");
856 else
857
858 printk("Not responding.\n");
859 inquire_remote_apic(apicid);
860 }
861 }
862
863 if (boot_error) {
864
865 unmap_cpu_to_logical_apicid(cpu);
866 cpu_clear(cpu, cpu_callout_map);
867 cpu_clear(cpu, cpu_initialized);
868 cpucount--;
869 } else {
870 x86_cpu_to_apicid[cpu] = apicid;
871 cpu_set(cpu, cpu_present_map);
872 }
873
874
875 *((volatile unsigned long *)trampoline_base) = 0;
876
877 return boot_error;
878}
879
880#ifdef CONFIG_HOTPLUG_CPU
881void cpu_exit_clear(void)
882{
883 int cpu = raw_smp_processor_id();
884
885 idle_task_exit();
886
887 cpucount --;
888 cpu_uninit();
889 irq_ctx_exit(cpu);
890
891 cpu_clear(cpu, cpu_callout_map);
892 cpu_clear(cpu, cpu_callin_map);
893
894 cpu_clear(cpu, smp_commenced_mask);
895 unmap_cpu_to_logical_apicid(cpu);
896}
897
898struct warm_boot_cpu_info {
899 struct completion *complete;
900 struct work_struct task;
901 int apicid;
902 int cpu;
903};
904
905static void __cpuinit do_warm_boot_cpu(struct work_struct *work)
906{
907 struct warm_boot_cpu_info *info =
908 container_of(work, struct warm_boot_cpu_info, task);
909 do_boot_cpu(info->apicid, info->cpu);
910 complete(info->complete);
911}
912
913static int __cpuinit __smp_prepare_cpu(int cpu)
914{
915 DECLARE_COMPLETION_ONSTACK(done);
916 struct warm_boot_cpu_info info;
917 int apicid, ret;
918
919 apicid = x86_cpu_to_apicid[cpu];
920 if (apicid == BAD_APICID) {
921 ret = -ENODEV;
922 goto exit;
923 }
924
925 info.complete = &done;
926 info.apicid = apicid;
927 info.cpu = cpu;
928 INIT_WORK(&info.task, do_warm_boot_cpu);
929
930
931 clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
932 min_t(unsigned long, KERNEL_PGD_PTRS, USER_PGD_PTRS));
933 flush_tlb_all();
934 schedule_work(&info.task);
935 wait_for_completion(&done);
936
937 zap_low_mappings();
938 ret = 0;
939exit:
940 return ret;
941}
942#endif
943
944static void smp_tune_scheduling(void)
945{
946 if (cpu_khz) {
947
948 long cachesize = boot_cpu_data.x86_cache_size;
949
950 if (cachesize > 0)
951 max_cache_size = cachesize * 1024;
952 }
953}
954
955
956
957
958
959static int boot_cpu_logical_apicid;
960
961void *xquad_portio;
962#ifdef CONFIG_X86_NUMAQ
963EXPORT_SYMBOL(xquad_portio);
964#endif
965
966static void __init smp_boot_cpus(unsigned int max_cpus)
967{
968 int apicid, cpu, bit, kicked;
969 unsigned long bogosum = 0;
970
971
972
973
974 smp_store_cpu_info(0);
975 printk("CPU%d: ", 0);
976 print_cpu_info(&cpu_data[0]);
977
978 boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
979 boot_cpu_logical_apicid = logical_smp_processor_id();
980 x86_cpu_to_apicid[0] = boot_cpu_physical_apicid;
981
982 current_thread_info()->cpu = 0;
983 smp_tune_scheduling();
984
985 set_cpu_sibling_map(0);
986
987
988
989
990
991 if (!smp_found_config && !acpi_lapic) {
992 printk(KERN_NOTICE "SMP motherboard not detected.\n");
993 smpboot_clear_io_apic_irqs();
994 phys_cpu_present_map = physid_mask_of_physid(0);
995 if (APIC_init_uniprocessor())
996 printk(KERN_NOTICE "Local APIC not detected."
997 " Using dummy APIC emulation.\n");
998 map_cpu_to_logical_apicid();
999 cpu_set(0, cpu_sibling_map[0]);
1000 cpu_set(0, cpu_core_map[0]);
1001 return;
1002 }
1003
1004
1005
1006
1007
1008
1009 if (!check_phys_apicid_present(boot_cpu_physical_apicid)) {
1010 printk("weird, boot CPU (#%d) not listed by the BIOS.\n",
1011 boot_cpu_physical_apicid);
1012 physid_set(hard_smp_processor_id(), phys_cpu_present_map);
1013 }
1014
1015
1016
1017
1018 if (APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid]) && !cpu_has_apic) {
1019 printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",
1020 boot_cpu_physical_apicid);
1021 printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n");
1022 smpboot_clear_io_apic_irqs();
1023 phys_cpu_present_map = physid_mask_of_physid(0);
1024 cpu_set(0, cpu_sibling_map[0]);
1025 cpu_set(0, cpu_core_map[0]);
1026 return;
1027 }
1028
1029 verify_local_APIC();
1030
1031
1032
1033
1034 if (!max_cpus) {
1035 smp_found_config = 0;
1036 printk(KERN_INFO "SMP mode deactivated, forcing use of dummy APIC emulation.\n");
1037 smpboot_clear_io_apic_irqs();
1038 phys_cpu_present_map = physid_mask_of_physid(0);
1039 cpu_set(0, cpu_sibling_map[0]);
1040 cpu_set(0, cpu_core_map[0]);
1041 return;
1042 }
1043
1044 connect_bsp_APIC();
1045 setup_local_APIC();
1046 map_cpu_to_logical_apicid();
1047
1048
1049 setup_portio_remap();
1050
1051
1052
1053
1054
1055
1056
1057
1058 Dprintk("CPU present map: %lx\n", physids_coerce(phys_cpu_present_map));
1059
1060 kicked = 1;
1061 for (bit = 0; kicked < NR_CPUS && bit < MAX_APICS; bit++) {
1062 apicid = cpu_present_to_apicid(bit);
1063
1064
1065
1066 if ((apicid == boot_cpu_apicid) || (apicid == BAD_APICID))
1067 continue;
1068
1069 if (!check_apicid_present(bit))
1070 continue;
1071 if (max_cpus <= cpucount+1)
1072 continue;
1073
1074 if (((cpu = alloc_cpu_id()) <= 0) || do_boot_cpu(apicid, cpu))
1075 printk("CPU #%d not responding - cannot use it.\n",
1076 apicid);
1077 else
1078 ++kicked;
1079 }
1080
1081
1082
1083
1084 smpboot_restore_warm_reset_vector();
1085
1086
1087
1088
1089 Dprintk("Before bogomips.\n");
1090 for (cpu = 0; cpu < NR_CPUS; cpu++)
1091 if (cpu_isset(cpu, cpu_callout_map))
1092 bogosum += cpu_data[cpu].loops_per_jiffy;
1093 printk(KERN_INFO
1094 "Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
1095 cpucount+1,
1096 bogosum/(500000/HZ),
1097 (bogosum/(5000/HZ))%100);
1098
1099 Dprintk("Before bogocount - setting activated=1.\n");
1100
1101 if (smp_b_stepping)
1102 printk(KERN_WARNING "WARNING: SMP operation may be unreliable with B stepping processors.\n");
1103
1104
1105
1106
1107
1108 if (tainted & TAINT_UNSAFE_SMP) {
1109 if (cpucount)
1110 printk (KERN_INFO "WARNING: This combination of AMD processors is not suitable for SMP.\n");
1111 else
1112 tainted &= ~TAINT_UNSAFE_SMP;
1113 }
1114
1115 Dprintk("Boot done.\n");
1116
1117
1118
1119
1120
1121 for (cpu = 0; cpu < NR_CPUS; cpu++) {
1122 cpus_clear(cpu_sibling_map[cpu]);
1123 cpus_clear(cpu_core_map[cpu]);
1124 }
1125
1126 cpu_set(0, cpu_sibling_map[0]);
1127 cpu_set(0, cpu_core_map[0]);
1128
1129 smpboot_setup_io_apic();
1130
1131 setup_boot_clock();
1132}
1133
1134
1135
1136void __init native_smp_prepare_cpus(unsigned int max_cpus)
1137{
1138 smp_commenced_mask = cpumask_of_cpu(0);
1139 cpu_callin_map = cpumask_of_cpu(0);
1140 mb();
1141 smp_boot_cpus(max_cpus);
1142}
1143
1144void __init native_smp_prepare_boot_cpu(void)
1145{
1146 unsigned int cpu = smp_processor_id();
1147
1148 init_gdt(cpu);
1149 switch_to_new_gdt();
1150
1151 cpu_set(cpu, cpu_online_map);
1152 cpu_set(cpu, cpu_callout_map);
1153 cpu_set(cpu, cpu_present_map);
1154 cpu_set(cpu, cpu_possible_map);
1155 __get_cpu_var(cpu_state) = CPU_ONLINE;
1156}
1157
1158#ifdef CONFIG_HOTPLUG_CPU
1159static void
1160remove_siblinginfo(int cpu)
1161{
1162 int sibling;
1163 struct cpuinfo_x86 *c = cpu_data;
1164
1165 for_each_cpu_mask(sibling, cpu_core_map[cpu]) {
1166 cpu_clear(cpu, cpu_core_map[sibling]);
1167
1168
1169
1170 if (cpus_weight(cpu_sibling_map[cpu]) == 1)
1171 c[sibling].booted_cores--;
1172 }
1173
1174 for_each_cpu_mask(sibling, cpu_sibling_map[cpu])
1175 cpu_clear(cpu, cpu_sibling_map[sibling]);
1176 cpus_clear(cpu_sibling_map[cpu]);
1177 cpus_clear(cpu_core_map[cpu]);
1178 c[cpu].phys_proc_id = 0;
1179 c[cpu].cpu_core_id = 0;
1180 cpu_clear(cpu, cpu_sibling_setup_map);
1181}
1182
1183int __cpu_disable(void)
1184{
1185 cpumask_t map = cpu_online_map;
1186 int cpu = smp_processor_id();
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196 if (cpu == 0)
1197 return -EBUSY;
1198 if (nmi_watchdog == NMI_LOCAL_APIC)
1199 stop_apic_nmi_watchdog(NULL);
1200 clear_local_APIC();
1201
1202 local_irq_enable();
1203 mdelay(1);
1204 local_irq_disable();
1205
1206 remove_siblinginfo(cpu);
1207
1208 cpu_clear(cpu, map);
1209 fixup_irqs(map);
1210
1211 cpu_clear(cpu, cpu_online_map);
1212 return 0;
1213}
1214
1215void __cpu_die(unsigned int cpu)
1216{
1217
1218 unsigned int i;
1219
1220 for (i = 0; i < 10; i++) {
1221
1222 if (per_cpu(cpu_state, cpu) == CPU_DEAD) {
1223 printk ("CPU %d is now offline\n", cpu);
1224 if (1 == num_online_cpus())
1225 alternatives_smp_switch(0);
1226 return;
1227 }
1228 msleep(100);
1229 }
1230 printk(KERN_ERR "CPU %u didn't die...\n", cpu);
1231}
1232#else
1233int __cpu_disable(void)
1234{
1235 return -ENOSYS;
1236}
1237
1238void __cpu_die(unsigned int cpu)
1239{
1240
1241 BUG();
1242}
1243#endif
1244
1245int __cpuinit native_cpu_up(unsigned int cpu)
1246{
1247 unsigned long flags;
1248#ifdef CONFIG_HOTPLUG_CPU
1249 int ret = 0;
1250
1251
1252
1253
1254
1255
1256
1257 if (!cpu_isset(cpu, cpu_callin_map))
1258 ret = __smp_prepare_cpu(cpu);
1259
1260 if (ret)
1261 return -EIO;
1262#endif
1263
1264
1265 if (!cpu_isset(cpu, cpu_callin_map)) {
1266 printk(KERN_DEBUG "skipping cpu%d, didn't come online\n", cpu);
1267 return -EIO;
1268 }
1269
1270 per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
1271
1272 cpu_set(cpu, smp_commenced_mask);
1273
1274
1275
1276
1277
1278 local_irq_save(flags);
1279 check_tsc_sync_source(cpu);
1280 local_irq_restore(flags);
1281
1282 while (!cpu_isset(cpu, cpu_online_map)) {
1283 cpu_relax();
1284 touch_nmi_watchdog();
1285 }
1286
1287 return 0;
1288}
1289
1290void __init native_smp_cpus_done(unsigned int max_cpus)
1291{
1292#ifdef CONFIG_X86_IO_APIC
1293 setup_ioapic_dest();
1294#endif
1295 zap_low_mappings();
1296#ifndef CONFIG_HOTPLUG_CPU
1297
1298
1299
1300 set_kernel_exec((unsigned long)trampoline_base, trampoline_exec);
1301#endif
1302}
1303
1304void __init smp_intr_init(void)
1305{
1306
1307
1308
1309
1310 set_intr_gate(FIRST_DEVICE_VECTOR, interrupt[0]);
1311
1312
1313
1314
1315
1316 set_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt);
1317
1318
1319 set_intr_gate(INVALIDATE_TLB_VECTOR, invalidate_interrupt);
1320
1321
1322 set_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt);
1323}
1324
1325
1326
1327
1328
1329static int __init parse_maxcpus(char *arg)
1330{
1331 extern unsigned int maxcpus;
1332
1333 maxcpus = simple_strtoul(arg, NULL, 0);
1334 return 0;
1335}
1336early_param("maxcpus", parse_maxcpus);
1337