diff options
author | Kanoj Sarcar <kanoj@engr.sgi.com> | 2000-04-01 01:54:46 +0000 |
---|---|---|
committer | Kanoj Sarcar <kanoj@engr.sgi.com> | 2000-04-01 01:54:46 +0000 |
commit | d49f62d0497bc81a70b1c2e01ddec71d8ea93c30 (patch) | |
tree | f44aa76d2fadd1356ebb9f13850b4b14e702010c /arch/mips64 | |
parent | 5e0a97c26457260b7a95383fae0fc2cf2f98237d (diff) |
Rudimentary sendintr() routine to send intrs to other cpus. This needs to
pull in defines from intr.h/intr_public.h. Also, need to store percpu
information regarding cpu slice # for cpu, hardware nasid and compact
node id.
Diffstat (limited to 'arch/mips64')
-rw-r--r-- | arch/mips64/kernel/smp.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/arch/mips64/kernel/smp.c b/arch/mips64/kernel/smp.c index d72e97904..d4365c647 100644 --- a/arch/mips64/kernel/smp.c +++ b/arch/mips64/kernel/smp.c @@ -1,3 +1,4 @@ +#include <linux/config.h> #include <linux/init.h> #include <linux/spinlock.h> #include <linux/threads.h> @@ -10,6 +11,42 @@ #include <asm/system.h> #include <asm/hardirq.h> +#ifdef CONFIG_SGI_IP27 + +#include <asm/sn/arch.h> +#include <asm/sn/intr.h> +#include <asm/sn/addrs.h> +#include <asm/sn/agent.h> + +#define DOACTION 0xab + +static void sendintr(int destid, unsigned char status) +{ + int level; + +#if (CPUS_PER_NODE == 2) + /* + * CPU slice A gets level CPU_ACTION_A + * CPU slice B gets level CPU_ACTION_B + */ + if (status == DOACTION) + level = CPU_ACTION_A + cputoslice(destid); + else /* DOTLBACTION */ + level = N_INTPEND_BITS + TLB_INTR_A + cputoslice(destid); + + /* + * Convert the compact hub number to the NASID to get the correct + * part of the address space. Then set the interrupt bit associated + * with the CPU we want to send the interrupt to. + */ + REMOTE_HUB_SEND_INTR(COMPACT_TO_NASID_NODEID(cputocnode(destid)), level); +#else + << Bomb! Must redefine this for more than 2 CPUS. >> +#endif +} + +#endif /* CONFIG_SGI_IP27 */ + /* The 'big kernel lock' */ spinlock_t kernel_flag = SPIN_LOCK_UNLOCKED; int smp_threads_ready = 0; /* Not used */ |