powerpc/book3e: Hookup doorbells exceptions on 64-bit Book3E
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 9 Jul 2010 05:31:28 +0000 (15:31 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 9 Jul 2010 06:11:17 +0000 (16:11 +1000)
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>
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/exceptions-64e.S
arch/powerpc/kernel/irq.c

index 0100604..8a33318 100644 (file)
@@ -68,6 +68,7 @@ obj64-$(CONFIG_HIBERNATION)   += swsusp_asm64.o
 obj-$(CONFIG_MODULES)          += module.o module_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_44x)              += cpu_setup_44x.o
 obj-$(CONFIG_FSL_BOOKE)                += cpu_setup_fsl_booke.o dbell.o
+obj-$(CONFIG_PPC_BOOK3E_64)    += dbell.o
 
 extra-y                                := head_$(CONFIG_WORD_SIZE).o
 extra-$(CONFIG_PPC_BOOK3E_32)  := head_new_booke.o
index 24dcc0e..a42637c 100644 (file)
@@ -246,11 +246,9 @@ interrupt_base_book3e:                                     /* fake trap */
        EXCEPTION_STUB(0x1a0, watchdog)                 /* 0x09f0 */
        EXCEPTION_STUB(0x1c0, data_tlb_miss)
        EXCEPTION_STUB(0x1e0, instruction_tlb_miss)
+       EXCEPTION_STUB(0x280, doorbell)
+       EXCEPTION_STUB(0x2a0, doorbell_crit)
 
-#if 0
-       EXCEPTION_STUB(0x280, processor_doorbell)
-       EXCEPTION_STUB(0x220, processor_doorbell_crit)
-#endif
        .globl interrupt_end_book3e
 interrupt_end_book3e:
 
@@ -428,6 +426,19 @@ interrupt_end_book3e:
 kernel_dbg_exc:
        b       .       /* NYI */
 
+/* Doorbell interrupt */
+       MASKABLE_EXCEPTION(0x2070, doorbell, .doorbell_exception, ACK_NONE)
+
+/* Doorbell critical Interrupt */
+       START_EXCEPTION(doorbell_crit);
+       CRIT_EXCEPTION_PROLOG(0x2080, PROLOG_ADDITION_NONE)
+//     EXCEPTION_COMMON(0x2080, PACA_EXCRIT, INTS_DISABLE_ALL)
+//     bl      special_reg_save_crit
+//     addi    r3,r1,STACK_FRAME_OVERHEAD
+//     bl      .doorbell_critical_exception
+//     b       ret_from_crit_except
+       b       .
+
 
 /*
  * An interrupt came in while soft-disabled; clear EE in SRR1,
@@ -563,6 +574,8 @@ BAD_STACK_TRAMPOLINE(0xd00)
 BAD_STACK_TRAMPOLINE(0xe00)
 BAD_STACK_TRAMPOLINE(0xf00)
 BAD_STACK_TRAMPOLINE(0xf20)
+BAD_STACK_TRAMPOLINE(0x2070)
+BAD_STACK_TRAMPOLINE(0x2080)
 
        .globl  bad_stack_book3e
 bad_stack_book3e:
index fa6f385..2f6dc7f 100644 (file)
@@ -64,6 +64,8 @@
 #include <asm/ptrace.h>
 #include <asm/machdep.h>
 #include <asm/udbg.h>
+#include <asm/dbell.h>
+
 #ifdef CONFIG_PPC64
 #include <asm/paca.h>
 #include <asm/firmware.h>
@@ -153,6 +155,11 @@ notrace void raw_local_irq_restore(unsigned long en)
        if (get_hard_enabled())
                return;
 
+#if defined(CONFIG_BOOKE) && defined(CONFIG_SMP)
+       /* Check for pending doorbell interrupts on SMP */
+       doorbell_exception(NULL);
+#endif
+
        /*
         * Need to hard-enable interrupts here.  Since currently disabled,
         * no need to take further asm precautions against preemption; but