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