diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-07-09 01:31:28 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2010-07-09 02:11:17 -0400 |
commit | 89c81797d4a0779a957f4ea1f0c676cda203615b (patch) | |
tree | 1c1e175ea4dd2c8aeb1816a7e6e39062e24ae860 /arch | |
parent | e8775d4aa17d70d123814e68a6a51bbea50e5c16 (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/Makefile | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/exceptions-64e.S | 21 | ||||
-rw-r--r-- | arch/powerpc/kernel/irq.c | 7 |
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 | |||
68 | obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o | 68 | obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o |
69 | obj-$(CONFIG_44x) += cpu_setup_44x.o | 69 | obj-$(CONFIG_44x) += cpu_setup_44x.o |
70 | obj-$(CONFIG_FSL_BOOKE) += cpu_setup_fsl_booke.o dbell.o | 70 | obj-$(CONFIG_FSL_BOOKE) += cpu_setup_fsl_booke.o dbell.o |
71 | obj-$(CONFIG_PPC_BOOK3E_64) += dbell.o | ||
71 | 72 | ||
72 | extra-y := head_$(CONFIG_WORD_SIZE).o | 73 | extra-y := head_$(CONFIG_WORD_SIZE).o |
73 | extra-$(CONFIG_PPC_BOOK3E_32) := head_new_booke.o | 74 | extra-$(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 |
255 | interrupt_end_book3e: | 253 | interrupt_end_book3e: |
256 | 254 | ||
@@ -428,6 +426,19 @@ interrupt_end_book3e: | |||
428 | kernel_dbg_exc: | 426 | kernel_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) | |||
563 | BAD_STACK_TRAMPOLINE(0xe00) | 574 | BAD_STACK_TRAMPOLINE(0xe00) |
564 | BAD_STACK_TRAMPOLINE(0xf00) | 575 | BAD_STACK_TRAMPOLINE(0xf00) |
565 | BAD_STACK_TRAMPOLINE(0xf20) | 576 | BAD_STACK_TRAMPOLINE(0xf20) |
577 | BAD_STACK_TRAMPOLINE(0x2070) | ||
578 | BAD_STACK_TRAMPOLINE(0x2080) | ||
566 | 579 | ||
567 | .globl bad_stack_book3e | 580 | .globl bad_stack_book3e |
568 | bad_stack_book3e: | 581 | bad_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 |