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
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(-)
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
16 #include <asm/assembler.h>
18 +#ifndef CONFIG_ARCH_BCM2709
20 * Interrupt handling. Preserves r7, r8, r9
28 .macro arch_irq_handler, symbol_name
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
35 #include <mach/hardware.h>
36 #include <mach/irqs.h>
40 + .macro arch_ret_to_user, tmp1, tmp2
43 - .macro get_irqnr_preamble, base, tmp
44 - ldr \base, =IO_ADDRESS(ARMCTRL_IC_BASE)
46 + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
48 - .macro arch_ret_to_user, tmp1, tmp2
50 + /* get core number */
51 + mrc p15, 0, \base, c0, c0, 5
52 + ubfx \base, \base, #0, #2
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]
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 */
69 - /* ignore mailbox interrupts */
72 + /* test for mailbox0 (IPI) interrupt */
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
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]
93 + rsb \irqnr, \tmp, #31
96 + str \tmp, [\irqstat] @ clear interrupt source
109 + /* check gpu interrupt */
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
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
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))
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))
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))
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))
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
166 + @ For non-zero x, LSB(x) = 31 - CLZ(x^(x-1))
167 + sub \tmp, \irqstat, #1
168 + eor \irqstat, \irqstat, \tmp
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
187 + @ routine called with r0 = irq number, r1 = struct pt_regs *
193 +1020: @ EQ will be set if no irqs pending
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]
207 - rsb \irqnr, \tmp, #31
210 - str \tmp, [\irqstat] @ clear interrupt source
212 -1030: @ EQ will be set if no irqs pending
215 + * Interrupt handling. Preserves r7, r8, r9
217 + .macro arch_irq_handler_default
218 +1: get_irqnr_and_base r0, r2, r6, lr