1
2
3
4
5#ifndef _ASM_ARCH_IRQ_H
6#define _ASM_ARCH_IRQ_H
7
8#include <arch/sv_addr_ag.h>
9
10#define NR_IRQS 32
11
12
13
14#define FIRST_IRQ 0
15
16#define SOME_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, some)
17#define NMI_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, nmi)
18#define TIMER0_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, timer0)
19#define TIMER1_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, timer1)
20
21
22#define NETWORK_STATUS_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, network)
23
24#define SERIAL_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, serial)
25#define PA_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, pa)
26
27#define EXTDMA0_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, ext_dma0)
28#define EXTDMA1_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, ext_dma1)
29
30
31
32#define DMA0_TX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma0)
33#define DMA1_RX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma1)
34#define NETWORK_DMA_TX_IRQ_NBR DMA0_TX_IRQ_NBR
35#define NETWORK_DMA_RX_IRQ_NBR DMA1_RX_IRQ_NBR
36
37
38#define DMA2_TX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma2)
39#define DMA3_RX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma3)
40#define SER2_DMA_TX_IRQ_NBR DMA2_TX_IRQ_NBR
41#define SER2_DMA_RX_IRQ_NBR DMA3_RX_IRQ_NBR
42
43
44#define DMA4_TX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma4)
45#define DMA5_RX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma5)
46#define SER3_DMA_TX_IRQ_NBR DMA4_TX_IRQ_NBR
47#define SER3_DMA_RX_IRQ_NBR DMA5_RX_IRQ_NBR
48
49
50#define DMA6_TX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma6)
51#define DMA7_RX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma7)
52#define SER0_DMA_TX_IRQ_NBR DMA6_TX_IRQ_NBR
53#define SER0_DMA_RX_IRQ_NBR DMA7_RX_IRQ_NBR
54#define MEM2MEM_DMA_TX_IRQ_NBR DMA6_TX_IRQ_NBR
55#define MEM2MEM_DMA_RX_IRQ_NBR DMA7_RX_IRQ_NBR
56
57
58#define DMA8_TX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma8)
59#define DMA9_RX_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, dma9)
60#define SER1_DMA_TX_IRQ_NBR DMA8_TX_IRQ_NBR
61#define SER1_DMA_RX_IRQ_NBR DMA9_RX_IRQ_NBR
62#define USB_DMA_TX_IRQ_NBR DMA8_TX_IRQ_NBR
63#define USB_DMA_RX_IRQ_NBR DMA9_RX_IRQ_NBR
64
65
66#define USB_HC_IRQ_NBR IO_BITNR(R_VECT_MASK_RD, usb)
67
68
69
70typedef void (*irqvectptr)(void);
71
72struct etrax_interrupt_vector {
73 irqvectptr v[256];
74};
75
76extern struct etrax_interrupt_vector *etrax_irv;
77void set_int_vector(int n, irqvectptr addr);
78void set_break_vector(int n, irqvectptr addr);
79
80#define __STR(x) #x
81#define STR(x) __STR(x)
82
83
84
85#define SAVE_ALL \
86 "move $irp,[$sp=$sp-16]\n\t" \
87 "push $srp\n\t" \
88 "push $dccr\n\t" \
89 "push $mof\n\t" \
90 "di\n\t" \
91 "subq 14*4,$sp\n\t" \
92 "movem $r13,[$sp]\n\t" \
93 "push $r10\n\t" \
94 "clear.d [$sp=$sp-4]\n\t"
95
96
97
98
99#define BLOCK_IRQ(mask,nr) \
100 "move.d " #mask ",$r0\n\t" \
101 "move.d $r0,[0xb00000d8]\n\t"
102
103#define UNBLOCK_IRQ(mask) \
104 "move.d " #mask ",$r0\n\t" \
105 "move.d $r0,[0xb00000dc]\n\t"
106
107#define IRQ_NAME2(nr) nr##_interrupt(void)
108#define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr)
109#define sIRQ_NAME(nr) IRQ_NAME2(sIRQ##nr)
110#define BAD_IRQ_NAME(nr) IRQ_NAME2(bad_IRQ##nr)
111
112
113
114
115
116
117
118
119
120#define BUILD_IRQ(nr,mask) \
121void IRQ_NAME(nr); \
122__asm__ ( \
123 ".text\n\t" \
124 "IRQ" #nr "_interrupt:\n\t" \
125 SAVE_ALL \
126 BLOCK_IRQ(mask,nr) \
127 "moveq "#nr",$r10\n\t" \
128 "move.d $sp,$r11\n\t" \
129 "jsr do_IRQ\n\t" \
130 UNBLOCK_IRQ(mask) \
131 "moveq 0,$r9\n\t" \
132 "jump ret_from_intr\n\t");
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149#define BUILD_TIMER_IRQ(nr,mask) \
150void IRQ_NAME(nr); \
151__asm__ ( \
152 ".text\n\t" \
153 "IRQ" #nr "_interrupt:\n\t" \
154 SAVE_ALL \
155 "moveq "#nr",$r10\n\t" \
156 "move.d $sp,$r11\n\t" \
157 "jsr do_IRQ\n\t" \
158 "moveq 0,$r9\n\t" \
159 "jump ret_from_intr\n\t");
160
161#endif
162