From d66881a2aa11307353b197f47e610692e7bd1875 Mon Sep 17 00:00:00 2001 From: "Bjoern B. Brandenburg" Date: Thu, 23 Apr 2009 15:02:28 -0400 Subject: sparc64: provide smp_send_pull_timers() implementation --- arch/sparc64/kernel/smp.c | 21 +++++++++++++++++++++ arch/sparc64/kernel/ttable.S | 5 +++++ arch/sparc64/mm/ultra.S | 5 +++++ include/asm-sparc64/pil.h | 1 + 4 files changed, 32 insertions(+) diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c index cd2bc7e289..ebfaaf499c 100644 --- a/arch/sparc64/kernel/smp.c +++ b/arch/sparc64/kernel/smp.c @@ -46,6 +46,8 @@ #include #include +#include + extern void calibrate_delay(void); int sparc64_multi_core __read_mostly; @@ -903,6 +905,7 @@ extern unsigned long xcall_flush_tlb_kernel_range; extern unsigned long xcall_report_regs; extern unsigned long xcall_receive_signal; extern unsigned long xcall_new_mmu_context_version; +extern unsigned long xcall_pull_timers; #ifdef DCACHE_ALIASING_POSSIBLE extern unsigned long xcall_flush_dcache_page_cheetah; @@ -1417,6 +1420,24 @@ void smp_send_reschedule(int cpu) smp_receive_signal(cpu); } +void smp_send_pull_timers(int cpu) +{ + cpumask_t mask = cpumask_of_cpu(cpu); + + if (cpu_online(cpu)) + smp_cross_call_masked(&xcall_pull_timers, 0, 0, 0, mask); +} + +void hrtimer_pull(void); + +void smp_pull_timers_client(int irq, struct pt_regs *regs) +{ + clear_softint(1 << irq); + TRACE("pull timers interrupt\n"); + hrtimer_pull(); +} + + /* This is a nop because we capture all other cpus * anyways when making the PROM active. */ diff --git a/arch/sparc64/kernel/ttable.S b/arch/sparc64/kernel/ttable.S index 7575aa371d..65a23d3b9d 100644 --- a/arch/sparc64/kernel/ttable.S +++ b/arch/sparc64/kernel/ttable.S @@ -58,7 +58,12 @@ tl0_irq3: BTRAP(0x43) tl0_irq4: BTRAP(0x44) #endif tl0_irq5: TRAP_IRQ(handler_irq, 5) +#ifdef CONFIG_SMP +tl0_irq6: TRAP_IRQ(smp_pull_timers_client, 6) +tl0_irq7: BTRAP(0x47) BTRAP(0x48) BTRAP(0x49) +#else tl0_irq6: BTRAP(0x46) BTRAP(0x47) BTRAP(0x48) BTRAP(0x49) +#endif tl0_irq10: BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d) tl0_irq14: TRAP_IRQ(timer_interrupt, 14) tl0_irq15: TRAP_IRQ(handler_irq, 15) diff --git a/arch/sparc64/mm/ultra.S b/arch/sparc64/mm/ultra.S index 2865c105b6..3f158cf42c 100644 --- a/arch/sparc64/mm/ultra.S +++ b/arch/sparc64/mm/ultra.S @@ -678,6 +678,11 @@ xcall_new_mmu_context_version: wr %g0, (1 << PIL_SMP_CTX_NEW_VERSION), %set_softint retry + .globl xcall_pull_timers +xcall_pull_timers: + wr %g0, (1 << PIL_SMP_PULL_TIMERS), %set_softint + retry + #endif /* CONFIG_SMP */ diff --git a/include/asm-sparc64/pil.h b/include/asm-sparc64/pil.h index 72927749ae..5b36432668 100644 --- a/include/asm-sparc64/pil.h +++ b/include/asm-sparc64/pil.h @@ -18,6 +18,7 @@ #define PIL_SMP_CAPTURE 3 #define PIL_SMP_CTX_NEW_VERSION 4 #define PIL_DEVICE_IRQ 5 +#define PIL_SMP_PULL_TIMERS 6 #ifndef __ASSEMBLY__ #define PIL_RESERVED(PIL) ((PIL) == PIL_SMP_CALL_FUNC || \ -- cgit v1.2.2