aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2010-07-09 01:31:28 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2010-07-09 02:11:17 -0400
commit89c81797d4a0779a957f4ea1f0c676cda203615b (patch)
tree1c1e175ea4dd2c8aeb1816a7e6e39062e24ae860 /arch
parente8775d4aa17d70d123814e68a6a51bbea50e5c16 (diff)
powerpc/book3e: Hookup doorbells exceptions on 64-bit Book3E
Note that critical doorbells are an unimplemented stub just like other critical or machine check handlers, since we haven't done support for "levelled" exceptions yet. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/kernel/Makefile1
-rw-r--r--arch/powerpc/kernel/exceptions-64e.S21
-rw-r--r--arch/powerpc/kernel/irq.c7
3 files changed, 25 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index 01006040f59e..8a33318fa46b 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -68,6 +68,7 @@ obj64-$(CONFIG_HIBERNATION) += swsusp_asm64.o
68obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o 68obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o
69obj-$(CONFIG_44x) += cpu_setup_44x.o 69obj-$(CONFIG_44x) += cpu_setup_44x.o
70obj-$(CONFIG_FSL_BOOKE) += cpu_setup_fsl_booke.o dbell.o 70obj-$(CONFIG_FSL_BOOKE) += cpu_setup_fsl_booke.o dbell.o
71obj-$(CONFIG_PPC_BOOK3E_64) += dbell.o
71 72
72extra-y := head_$(CONFIG_WORD_SIZE).o 73extra-y := head_$(CONFIG_WORD_SIZE).o
73extra-$(CONFIG_PPC_BOOK3E_32) := head_new_booke.o 74extra-$(CONFIG_PPC_BOOK3E_32) := head_new_booke.o
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 24dcc0ecf246..a42637c3a72d 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -246,11 +246,9 @@ interrupt_base_book3e: /* fake trap */
246 EXCEPTION_STUB(0x1a0, watchdog) /* 0x09f0 */ 246 EXCEPTION_STUB(0x1a0, watchdog) /* 0x09f0 */
247 EXCEPTION_STUB(0x1c0, data_tlb_miss) 247 EXCEPTION_STUB(0x1c0, data_tlb_miss)
248 EXCEPTION_STUB(0x1e0, instruction_tlb_miss) 248 EXCEPTION_STUB(0x1e0, instruction_tlb_miss)
249 EXCEPTION_STUB(0x280, doorbell)
250 EXCEPTION_STUB(0x2a0, doorbell_crit)
249 251
250#if 0
251 EXCEPTION_STUB(0x280, processor_doorbell)
252 EXCEPTION_STUB(0x220, processor_doorbell_crit)
253#endif
254 .globl interrupt_end_book3e 252 .globl interrupt_end_book3e
255interrupt_end_book3e: 253interrupt_end_book3e:
256 254
@@ -428,6 +426,19 @@ interrupt_end_book3e:
428kernel_dbg_exc: 426kernel_dbg_exc:
429 b . /* NYI */ 427 b . /* NYI */
430 428
429/* Doorbell interrupt */
430 MASKABLE_EXCEPTION(0x2070, doorbell, .doorbell_exception, ACK_NONE)
431
432/* Doorbell critical Interrupt */
433 START_EXCEPTION(doorbell_crit);
434 CRIT_EXCEPTION_PROLOG(0x2080, PROLOG_ADDITION_NONE)
435// EXCEPTION_COMMON(0x2080, PACA_EXCRIT, INTS_DISABLE_ALL)
436// bl special_reg_save_crit
437// addi r3,r1,STACK_FRAME_OVERHEAD
438// bl .doorbell_critical_exception
439// b ret_from_crit_except
440 b .
441
431 442
432/* 443/*
433 * An interrupt came in while soft-disabled; clear EE in SRR1, 444 * An interrupt came in while soft-disabled; clear EE in SRR1,
@@ -563,6 +574,8 @@ BAD_STACK_TRAMPOLINE(0xd00)
563BAD_STACK_TRAMPOLINE(0xe00) 574BAD_STACK_TRAMPOLINE(0xe00)
564BAD_STACK_TRAMPOLINE(0xf00) 575BAD_STACK_TRAMPOLINE(0xf00)
565BAD_STACK_TRAMPOLINE(0xf20) 576BAD_STACK_TRAMPOLINE(0xf20)
577BAD_STACK_TRAMPOLINE(0x2070)
578BAD_STACK_TRAMPOLINE(0x2080)
566 579
567 .globl bad_stack_book3e 580 .globl bad_stack_book3e
568bad_stack_book3e: 581bad_stack_book3e:
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index fa6f38525801..2f6dc7faf6de 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -64,6 +64,8 @@
64#include <asm/ptrace.h> 64#include <asm/ptrace.h>
65#include <asm/machdep.h> 65#include <asm/machdep.h>
66#include <asm/udbg.h> 66#include <asm/udbg.h>
67#include <asm/dbell.h>
68
67#ifdef CONFIG_PPC64 69#ifdef CONFIG_PPC64
68#include <asm/paca.h> 70#include <asm/paca.h>
69#include <asm/firmware.h> 71#include <asm/firmware.h>
@@ -153,6 +155,11 @@ notrace void raw_local_irq_restore(unsigned long en)
153 if (get_hard_enabled()) 155 if (get_hard_enabled())
154 return; 156 return;
155 157
158#if defined(CONFIG_BOOKE) && defined(CONFIG_SMP)
159 /* Check for pending doorbell interrupts on SMP */
160 doorbell_exception(NULL);
161#endif
162
156 /* 163 /*
157 * Need to hard-enable interrupts here. Since currently disabled, 164 * Need to hard-enable interrupts here. Since currently disabled,
158 * no need to take further asm precautions against preemption; but 165 * no need to take further asm precautions against preemption; but