diff options
author | Kanoj Sarcar <kanoj@engr.sgi.com> | 2000-04-17 15:54:31 +0000 |
---|---|---|
committer | Kanoj Sarcar <kanoj@engr.sgi.com> | 2000-04-17 15:54:31 +0000 |
commit | 0414d77d4b2ac65f2ed6be694821bbff6453ad5a (patch) | |
tree | 3d51eeca750ed28e2aa26c8efc4e1d598dfe2a4a /arch/mips64/sgi-ip27/ip27-irq.c | |
parent | 716ec6321bcc060b053d8c27325ba84377259d9f (diff) |
Intercpu interrupt changes: add in dedicated intr levels for reschedule
and call function interrupts (tlbflush for later).
Diffstat (limited to 'arch/mips64/sgi-ip27/ip27-irq.c')
-rw-r--r-- | arch/mips64/sgi-ip27/ip27-irq.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/arch/mips64/sgi-ip27/ip27-irq.c b/arch/mips64/sgi-ip27/ip27-irq.c index d58e0c6c9..2e91e9bf7 100644 --- a/arch/mips64/sgi-ip27/ip27-irq.c +++ b/arch/mips64/sgi-ip27/ip27-irq.c @@ -198,9 +198,11 @@ static unsigned int bridge_startup(unsigned int irq) case IOC3_ETH_INT: pin = 2; break; case SCSI1_INT: pin = 1; break; case SCSI0_INT: pin = 0; break; - case SWLEVEL_TO_IRQ(CPU_ACTION_A): - case SWLEVEL_TO_IRQ(CPU_ACTION_B): - return; + case CPU_RESCHED_A_IRQ: + case CPU_RESCHED_B_IRQ: + case CPU_CALL_A_IRQ: + case CPU_CALL_B_IRQ: + return 0; default: panic("bridge_startup: whoops? %d\n", irq); } @@ -258,6 +260,11 @@ static unsigned int bridge_shutdown(unsigned int irq) case IOC3_ETH_INT: pin = 2; break; case SCSI1_INT: pin = 1; break; case SCSI0_INT: pin = 0; break; + case CPU_RESCHED_A_IRQ: + case CPU_RESCHED_B_IRQ: + case CPU_CALL_A_IRQ: + case CPU_CALL_B_IRQ: + return 0; default: panic("bridge_startup: whoops?"); } @@ -677,18 +684,28 @@ int intr_disconnect_level(cpuid_t cpu, int bit) } +void handle_resched_intr(int irq, void *dev_id, struct pt_regs *regs) +{ + /* Nothing, the return from intr will work for us */ +} + void handle_cpuintr(int irq, void *dev_id, struct pt_regs *regs) { - printk("HANDLE_CPUINTR: cpu%d irq%d\n", smp_processor_id(), irq); } void install_cpuintr(cpuid_t cpu) { - int intr_bit = CPU_ACTION_A + cputoslice(cpu); + int irq; + extern void smp_call_function_interrupt(void); - intr_connect_level(cpu, intr_bit); - if (request_irq(SWLEVEL_TO_IRQ(intr_bit), handle_cpuintr, 0, - "intercpu", 0)) + irq = CPU_RESCHED_A_IRQ + cputoslice(cpu); + intr_connect_level(cpu, IRQ_TO_SWLEVEL(irq)); + if (request_irq(irq, handle_resched_intr, SA_SHIRQ, "resched", 0)) + panic("intercpu intr unconnectible\n"); + irq = CPU_CALL_A_IRQ + cputoslice(cpu); + intr_connect_level(cpu, IRQ_TO_SWLEVEL(irq)); + if (request_irq(irq, smp_call_function_interrupt, SA_SHIRQ, + "callfunc", 0)) panic("intercpu intr unconnectible\n"); } |