Changes in kernel/arch/ia64/src/smp/smp.c [d99c1d2:e5c1186] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/src/smp/smp.c
rd99c1d2 re5c1186 33 33 */ 34 34 35 #include <arch.h>36 #include <arch/drivers/ski.h>37 #include <arch/drivers/it.h>38 #include <arch/interrupt.h>39 #include <arch/barrier.h>40 #include <arch/asm.h>41 #include <arch/register.h>42 #include <typedefs.h>43 #include <arch/context.h>44 #include <arch/stack.h>45 #include <arch/mm/page.h>46 #include <mm/as.h>47 #include <config.h>48 #include <userspace.h>49 #include <console/console.h>50 #include <proc/uarg.h>51 #include <syscall/syscall.h>52 #include <ddi/irq.h>53 #include <ddi/device.h>54 #include <arch/bootinfo.h>55 35 #include <smp/smp.h> 56 36 #include <smp/ipi.h> 57 #include <arch/atomic.h>58 #include <panic.h>59 #include <print.h>60 37 61 38 #ifdef CONFIG_SMP 62 39 63 extern char cpu_by_id_eid_list[256][256]; 64 65 static void sapic_init(void) 40 void ipi_broadcast_arch(int ipi) 66 41 { 67 bootinfo->sapic = (unative_t *)(PA2KA((unative_t)(bootinfo->sapic)) |68 FW_OFFSET);69 }70 71 static void ipi_broadcast_arch_all(int ipi)72 {73 int id, eid;74 int myid, myeid;75 76 myid = ia64_get_cpu_id();77 myeid = ia64_get_cpu_eid();78 79 for (id = 0; id < 256; id++)80 for (eid = 0; eid < 256; eid++)81 if ((id != myid) || (eid != myeid))82 ipi_send_ipi(id, eid, ipi);83 }84 85 void ipi_broadcast_arch(int ipi )86 {87 int id, eid;88 int myid, myeid;89 90 myid = ia64_get_cpu_id();91 myeid = ia64_get_cpu_eid();92 93 for (id = 0; id < 256; id++)94 for (eid = 0; eid < 256; eid++)95 if ((id != myid) || (eid != myeid))96 if (cpu_by_id_eid_list[id][eid])97 ipi_send_ipi(id, eid, ipi);98 42 } 99 43 100 44 void smp_init(void) 101 45 { 102 if (!bootinfo->hello_configured)103 return;104 105 /*106 * If we have not got system prepared by hello, we are not able to start107 * AP's. This means we are running on a simulator.108 */109 110 sapic_init();111 ipi_broadcast_arch_all(bootinfo->wakeup_intno);112 volatile long long brk;113 for (brk = 0; brk < 100LL * 1024LL * 1024LL; brk++)114 ; /* wait a while before CPUs starts */115 116 config.cpu_count = 0;117 int id, eid;118 119 for (id = 0; id < 256; id++)120 for (eid = 0; eid < 256; eid++)121 if (cpu_by_id_eid_list[id][eid] == 1) {122 config.cpu_count++;123 cpu_by_id_eid_list[id][eid] = 2;124 }125 46 } 126 47 127 48 void kmp(void *arg __attribute__((unused))) 128 49 { 129 int id, eid;130 int myid, myeid;131 132 myid = ia64_get_cpu_id();133 myeid = ia64_get_cpu_eid();134 135 for (id = 0; id < 256; id++)136 for (eid = 0; eid < 256; eid++)137 if ((id != myid) || (eid != myeid))138 if (cpu_by_id_eid_list[id][eid] != 0) {139 if (cpu_by_id_eid_list[id][eid] == 1) {140 printf("Found Late CPU ID:%d "141 "EDI:%d Not added to "142 "system!!!\n", id, eid);143 continue;144 }145 cpu_by_id_eid_list[id][eid] = 3;146 /*147 * There may be just one AP being148 * initialized at the time. After149 * it comes completely up, it is150 * supposed to wake us up.151 */152 if (waitq_sleep_timeout(153 &ap_completion_wq, 1000000,154 SYNCH_FLAGS_NONE) ==155 ESYNCH_TIMEOUT) {156 printf("%s: waiting for cpu "157 "ID:%d EID:%d timed out\n",158 __FUNCTION__, id, eid);159 }160 }161 50 } 162 51
Note:
See TracChangeset
for help on using the changeset viewer.