source: rtems/c/src/lib/libbsp/sparc/shared/irq/irq-shared.c @ e1b53274

4.115
Last change on this file since e1b53274 was e1b53274, checked in by Daniel Hellstrom <daniel@…>, on 10/31/13 at 14:23:19

LEON3_MP ISR: shared-IRQ setup overwrite SMP/MP ISR trap handler

Basically the shared-irq handler overwrite the SMP/MP traphandler
previously initialized with set_vector(). That caused IPIs to enter
BSP spurious handler.

  • Property mode set to 100644
File size: 2.0 KB
Line 
1#include <rtems.h>
2#include <bsp.h>
3#include <bsp/irq-generic.h>
4
5static inline void bsp_dispatch_irq(int irq)
6{
7       bsp_interrupt_handler_entry *e =
8               &bsp_interrupt_handler_table[bsp_interrupt_handler_index(irq)];
9
10       while (e != NULL) {
11               (*e->handler)(e->arg);
12               e = e->next;
13       }
14}
15
16/* Called directly from IRQ trap handler TRAP[0x10..0x1F] = IRQ[0..15] */
17static void BSP_ISR_handler(rtems_vector_number vector)
18{
19       int irq = vector - 0x10;
20
21       /* Let BSP fixup and/or handle incomming IRQ */
22       irq = bsp_irq_fixup(irq);
23
24       bsp_dispatch_irq(irq);
25}
26
27/* Initialize interrupts */
28void BSP_shared_interrupt_init(void)
29{
30       rtems_vector_number vector;
31       rtems_isr_entry previous_isr;
32       int i;
33
34       for (i=0; i <= BSP_INTERRUPT_VECTOR_MAX_STD; i++) {
35#if defined(RTEMS_SMP) || defined(RTEMS_MULTIPROCESSING)
36               /* Don't install IRQ handler on IPI interrupt */
37               if (i == LEON3_MP_IRQ)
38                       continue;
39#endif
40               vector = SPARC_ASYNCHRONOUS_TRAP(i) + 0x10;
41               rtems_interrupt_catch(BSP_ISR_handler, vector, &previous_isr);
42       }
43
44       /* Initalize interrupt support */
45       bsp_interrupt_initialize();
46}
47
48/* Callback from bsp_interrupt_initialize() */
49rtems_status_code bsp_interrupt_facility_initialize(void)
50{
51       return RTEMS_SUCCESSFUL;
52}
53
54rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
55{
56       BSP_Unmask_interrupt((int)vector);
57
58       return RTEMS_SUCCESSFUL;
59}
60
61rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
62{
63       BSP_Mask_interrupt((int)vector);
64
65       return RTEMS_SUCCESSFUL;
66}
67
68void BSP_shared_interrupt_mask(int irq)
69{
70       BSP_Mask_interrupt(irq);
71}
72
73void BSP_shared_interrupt_unmask(int irq)
74{
75       BSP_Unmask_interrupt(irq);
76}
77
78void BSP_shared_interrupt_clear(int irq)
79{
80       /* We don't have to interrupt lock here, because the register is only
81        * written and self clearing
82        */
83       BSP_Clear_interrupt(irq);
84}
Note: See TracBrowser for help on using the repository browser.