Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/smp/smp.c

    re5c1186 rd99c1d2  
    3333 */
    3434
     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>
    3555#include <smp/smp.h>
    3656#include <smp/ipi.h>
     57#include <arch/atomic.h>
     58#include <panic.h>
     59#include <print.h>
    3760
    3861#ifdef CONFIG_SMP
    3962
    40 void ipi_broadcast_arch(int ipi)
     63extern char cpu_by_id_eid_list[256][256];
     64
     65static void sapic_init(void)
    4166{
     67        bootinfo->sapic = (unative_t *)(PA2KA((unative_t)(bootinfo->sapic)) |
     68            FW_OFFSET);
     69}
     70
     71static 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
     85void 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);
    4298}
    4399
    44100void smp_init(void)
    45101{
     102        if (!bootinfo->hello_configured)
     103                return;
     104       
     105        /*
     106         * If we have not got system prepared by hello, we are not able to start
     107         * 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                        }
    46125}
    47126
    48127void kmp(void *arg __attribute__((unused)))
    49128{
     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 being
     148                                         * initialized at the time. After
     149                                         * it comes completely up, it is
     150                                         * 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                                }
    50161}
    51162
Note: See TracChangeset for help on using the changeset viewer.