e19e0dac95365e65144449bc2b2e1d2e7e5df347
[openwrt/staging/dedeckeh.git] / target / linux / brcm2708 / patches-3.18 / 0090-bcm2709-Simplify-and-strip-down-IRQ-handler.patch
1 From 1ef33cbb3347c38f563de1c7df7d103f8b7d23ca Mon Sep 17 00:00:00 2001
2 From: popcornmix <popcornmix@gmail.com>
3 Date: Fri, 20 Jun 2014 17:19:27 +0100
4 Subject: [PATCH 090/114] bcm2709: Simplify and strip down IRQ handler
5
6 ---
7 arch/arm/include/asm/entry-macro-multi.S | 2 +
8 arch/arm/mach-bcm2709/include/mach/entry-macro.S | 169 +++++++++++------------
9 2 files changed, 85 insertions(+), 86 deletions(-)
10
11 diff --git a/arch/arm/include/asm/entry-macro-multi.S b/arch/arm/include/asm/entry-macro-multi.S
12 index 469a2b3..9c0a7eb 100644
13 --- a/arch/arm/include/asm/entry-macro-multi.S
14 +++ b/arch/arm/include/asm/entry-macro-multi.S
15 @@ -1,5 +1,6 @@
16 #include <asm/assembler.h>
17
18 +#ifndef CONFIG_ARCH_BCM2709
19 /*
20 * Interrupt handling. Preserves r7, r8, r9
21 */
22 @@ -28,6 +29,7 @@
23 #endif
24 9997:
25 .endm
26 +#endif
27
28 .macro arch_irq_handler, symbol_name
29 .align 5
30 diff --git a/arch/arm/mach-bcm2709/include/mach/entry-macro.S b/arch/arm/mach-bcm2709/include/mach/entry-macro.S
31 index d08591b..101d9f1 100644
32 --- a/arch/arm/mach-bcm2709/include/mach/entry-macro.S
33 +++ b/arch/arm/mach-bcm2709/include/mach/entry-macro.S
34 @@ -22,102 +22,99 @@
35 #include <mach/hardware.h>
36 #include <mach/irqs.h>
37
38 - .macro disable_fiq
39 - .endm
40 + .macro arch_ret_to_user, tmp1, tmp2
41 + .endm
42
43 - .macro get_irqnr_preamble, base, tmp
44 - ldr \base, =IO_ADDRESS(ARMCTRL_IC_BASE)
45 - .endm
46 + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
47
48 - .macro arch_ret_to_user, tmp1, tmp2
49 - .endm
50 + /* get core number */
51 + mrc p15, 0, \base, c0, c0, 5
52 + ubfx \base, \base, #0, #2
53
54 - .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
55 - /* get core number */
56 - mrc p15, 0, \tmp, c0, c0, 5
57 - ubfx \tmp, \tmp, #0, #2
58 + /* get core's local interrupt controller */
59 + ldr \irqstat, = __io_address(ARM_LOCAL_IRQ_PENDING0) @ local interrupt source
60 + add \irqstat, \irqstat, \base, lsl #2
61 + ldr \tmp, [\irqstat]
62
63 - /* get core's local interrupt controller */
64 - ldr \irqstat, = __io_address(ARM_LOCAL_IRQ_PENDING0) @ local interrupt source
65 - add \irqstat, \irqstat, \tmp, lsl #2
66 - ldr \tmp, [\irqstat]
67 - /* ignore gpu interrupt */
68 - bic \tmp, #0x100
69 - /* ignore mailbox interrupts */
70 - bics \tmp, #0xf0
71 - beq 1005f
72 + /* test for mailbox0 (IPI) interrupt */
73 + tst \tmp, #0x10
74 + beq 1030f
75
76 - @ For non-zero x, LSB(x) = 31 - CLZ(x^(x-1))
77 - @ N.B. CLZ is an ARM5 instruction.
78 - mov \irqnr, #(ARM_IRQ_LOCAL_BASE + 31)
79 - sub \irqstat, \tmp, #1
80 - eor \irqstat, \irqstat, \tmp
81 - clz \tmp, \irqstat
82 - sub \irqnr, \tmp
83 - b 1020f
84 -1005:
85 - /* get core number */
86 - mrc p15, 0, \tmp, c0, c0, 5
87 - ubfx \tmp, \tmp, #0, #2
88 + /* get core's mailbox interrupt control */
89 + ldr \irqstat, = __io_address(ARM_LOCAL_MAILBOX0_CLR0) @ mbox_clr
90 + add \irqstat, \irqstat, \base, lsl #4
91 + ldr \tmp, [\irqstat]
92 + clz \tmp, \tmp
93 + rsb \irqnr, \tmp, #31
94 + mov \tmp, #1
95 + lsl \tmp, \irqnr
96 + str \tmp, [\irqstat] @ clear interrupt source
97 + dsb
98 + mov r1, sp
99 + adr lr, BSYM(1b)
100 + b do_IPI
101
102 - cmp \tmp, #1
103 - beq 1020f
104 - cmp \tmp, #2
105 - beq 1020f
106 - cmp \tmp, #3
107 - beq 1020f
108 +1030:
109 + /* check gpu interrupt */
110 + tst \tmp, #0x100
111 + beq 1040f
112
113 - /* get masked status */
114 - ldr \irqstat, [\base, #(ARM_IRQ_PEND0 - ARMCTRL_IC_BASE)]
115 - mov \irqnr, #(ARM_IRQ0_BASE + 31)
116 - and \tmp, \irqstat, #0x300 @ save bits 8 and 9
117 - /* clear bits 8 and 9, and test */
118 - bics \irqstat, \irqstat, #0x300
119 - bne 1010f
120 + ldr \base, =IO_ADDRESS(ARMCTRL_IC_BASE)
121 + /* get masked status */
122 + ldr \irqstat, [\base, #(ARM_IRQ_PEND0 - ARMCTRL_IC_BASE)]
123 + mov \irqnr, #(ARM_IRQ0_BASE + 31)
124 + and \tmp, \irqstat, #0x300 @ save bits 8 and 9
125 + /* clear bits 8 and 9, and test */
126 + bics \irqstat, \irqstat, #0x300
127 + bne 1010f
128
129 - tst \tmp, #0x100
130 - ldrne \irqstat, [\base, #(ARM_IRQ_PEND1 - ARMCTRL_IC_BASE)]
131 - movne \irqnr, #(ARM_IRQ1_BASE + 31)
132 - @ Mask out the interrupts also present in PEND0 - see SW-5809
133 - bicne \irqstat, #((1<<7) | (1<<9) | (1<<10))
134 - bicne \irqstat, #((1<<18) | (1<<19))
135 - bne 1010f
136 -
137 - tst \tmp, #0x200
138 - ldrne \irqstat, [\base, #(ARM_IRQ_PEND2 - ARMCTRL_IC_BASE)]
139 - movne \irqnr, #(ARM_IRQ2_BASE + 31)
140 - @ Mask out the interrupts also present in PEND0 - see SW-5809
141 - bicne \irqstat, #((1<<21) | (1<<22) | (1<<23) | (1<<24) | (1<<25))
142 - bicne \irqstat, #((1<<30))
143 - beq 1020f
144 + tst \tmp, #0x100
145 + ldrne \irqstat, [\base, #(ARM_IRQ_PEND1 - ARMCTRL_IC_BASE)]
146 + movne \irqnr, #(ARM_IRQ1_BASE + 31)
147 + @ Mask out the interrupts also present in PEND0 - see SW-5809
148 + bicne \irqstat, #((1<<7) | (1<<9) | (1<<10))
149 + bicne \irqstat, #((1<<18) | (1<<19))
150 + bne 1010f
151
152 + tst \tmp, #0x200
153 + ldrne \irqstat, [\base, #(ARM_IRQ_PEND2 - ARMCTRL_IC_BASE)]
154 + movne \irqnr, #(ARM_IRQ2_BASE + 31)
155 + @ Mask out the interrupts also present in PEND0 - see SW-5809
156 + bicne \irqstat, #((1<<21) | (1<<22) | (1<<23) | (1<<24) | (1<<25))
157 + bicne \irqstat, #((1<<30))
158 + beq 1020f
159 1010:
160 - @ For non-zero x, LSB(x) = 31 - CLZ(x^(x-1))
161 - @ N.B. CLZ is an ARM5 instruction.
162 - sub \tmp, \irqstat, #1
163 - eor \irqstat, \irqstat, \tmp
164 - clz \tmp, \irqstat
165 - sub \irqnr, \tmp
166 + @ For non-zero x, LSB(x) = 31 - CLZ(x^(x-1))
167 + sub \tmp, \irqstat, #1
168 + eor \irqstat, \irqstat, \tmp
169 + clz \tmp, \irqstat
170 + sub \irqnr, \tmp
171 + b 1050f
172 +1040:
173 + cmp \tmp, #0
174 + beq 1020f
175
176 -1020: @ EQ will be set if no irqs pending
177 + /* handle local (e.g. timer) interrupts */
178 + @ For non-zero x, LSB(x) = 31 - CLZ(x^(x-1))
179 + mov \irqnr, #(ARM_IRQ_LOCAL_BASE + 31)
180 + sub \irqstat, \tmp, #1
181 + eor \irqstat, \irqstat, \tmp
182 + clz \tmp, \irqstat
183 + sub \irqnr, \tmp
184 +1050:
185 + mov r1, sp
186 + @
187 + @ routine called with r0 = irq number, r1 = struct pt_regs *
188 + @
189 + adr lr, BSYM(1b)
190 + b asm_do_IRQ
191
192 - .endm
193 +1020: @ EQ will be set if no irqs pending
194 + .endm
195
196 - .macro test_for_ipi, irqnr, irqstat, base, tmp
197 - /* get core number */
198 - mrc p15, 0, \tmp, c0, c0, 5
199 - ubfx \tmp, \tmp, #0, #2
200 - /* get core's mailbox interrupt control */
201 - ldr \irqstat, = __io_address(ARM_LOCAL_MAILBOX0_CLR0) @ mbox_clr
202 - add \irqstat, \irqstat, \tmp, lsl #4
203 - ldr \tmp, [\irqstat]
204 - cmp \tmp, #0
205 - beq 1030f
206 - clz \tmp, \tmp
207 - rsb \irqnr, \tmp, #31
208 - mov \tmp, #1
209 - lsl \tmp, \irqnr
210 - str \tmp, [\irqstat] @ clear interrupt source
211 - dsb
212 -1030: @ EQ will be set if no irqs pending
213 - .endm
214 +/*
215 + * Interrupt handling. Preserves r7, r8, r9
216 + */
217 + .macro arch_irq_handler_default
218 +1: get_irqnr_and_base r0, r2, r6, lr
219 + .endm
220 --
221 1.8.3.2
222