| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: bcm2835_intr.c,v 1.3 2013/01/08 12:15:42 skrll Exp $ */ | | 1 | /* $NetBSD: bcm2835_intr.c,v 1.4 2014/09/07 15:28:05 skrll Exp $ */ |
2 | | | 2 | |
3 | /*- | | 3 | /*- |
4 | * Copyright (c) 2012 The NetBSD Foundation, Inc. | | 4 | * Copyright (c) 2012 The NetBSD Foundation, Inc. |
5 | * All rights reserved. | | 5 | * All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software contributed to The NetBSD Foundation | | 7 | * This code is derived from software contributed to The NetBSD Foundation |
8 | * by Nick Hudson | | 8 | * by Nick Hudson |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -20,27 +20,27 @@ | | | @@ -20,27 +20,27 @@ |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
29 | * POSSIBILITY OF SUCH DAMAGE. | | 29 | * POSSIBILITY OF SUCH DAMAGE. |
30 | */ | | 30 | */ |
31 | | | 31 | |
32 | #include <sys/cdefs.h> | | 32 | #include <sys/cdefs.h> |
33 | __KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.3 2013/01/08 12:15:42 skrll Exp $"); | | 33 | __KERNEL_RCSID(0, "$NetBSD: bcm2835_intr.c,v 1.4 2014/09/07 15:28:05 skrll Exp $"); |
34 | | | 34 | |
35 | #define _INTR_PRIVATE | | 35 | #define _INTR_PRIVATE |
36 | | | 36 | |
37 | #include <sys/param.h> | | 37 | #include <sys/param.h> |
38 | #include <sys/proc.h> | | 38 | #include <sys/proc.h> |
39 | #include <sys/device.h> | | 39 | #include <sys/device.h> |
40 | | | 40 | |
41 | #include <machine/intr.h> | | 41 | #include <machine/intr.h> |
42 | #include <sys/bus.h> | | 42 | #include <sys/bus.h> |
43 | | | 43 | |
44 | #include <arm/pic/picvar.h> | | 44 | #include <arm/pic/picvar.h> |
45 | | | 45 | |
46 | #include <arm/broadcom/bcm_amba.h> | | 46 | #include <arm/broadcom/bcm_amba.h> |
| @@ -85,30 +85,30 @@ struct bcm2835icu_softc *bcmicu_sc; | | | @@ -85,30 +85,30 @@ struct bcm2835icu_softc *bcmicu_sc; |
85 | #define write_bcm2835reg(o, v) \ | | 85 | #define write_bcm2835reg(o, v) \ |
86 | bus_space_write_4(bcmicu_sc->sc_iot, bcmicu_sc->sc_ioh, (o), (v)) | | 86 | bus_space_write_4(bcmicu_sc->sc_iot, bcmicu_sc->sc_ioh, (o), (v)) |
87 | | | 87 | |
88 | | | 88 | |
89 | #define bcm2835_barrier() \ | | 89 | #define bcm2835_barrier() \ |
90 | bus_space_barrier(bcmicu_sc->sc_iot, bcmicu_sc->sc_ioh, 0, \ | | 90 | bus_space_barrier(bcmicu_sc->sc_iot, bcmicu_sc->sc_ioh, 0, \ |
91 | BCM2835_ARMICU_SIZE, BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE) | | 91 | BCM2835_ARMICU_SIZE, BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE) |
92 | | | 92 | |
93 | static const char * const bcm2835_sources[BCM2835_NIRQ] = { | | 93 | static const char * const bcm2835_sources[BCM2835_NIRQ] = { |
94 | "(unused 0)", "(unused 1)", "(unused 2)", "timer3", | | 94 | "(unused 0)", "(unused 1)", "(unused 2)", "timer3", |
95 | "(unused 4)", "(unused 5)", "(unused 6)", "jpeg", | | 95 | "(unused 4)", "(unused 5)", "(unused 6)", "jpeg", |
96 | "(unused 8)", "usb", "(unused 10)", "(unused 11)", | | 96 | "(unused 8)", "usb", "(unused 10)", "(unused 11)", |
97 | "(unused 12)", "(unused 13)", "(unused 14)", "(unused 15)", | | 97 | "(unused 12)", "(unused 13)", "(unused 14)", "(unused 15)", |
98 | "(unused 16)", "(unused 17)", "dma2", "dma3", | | 98 | "dma0", "dma1", "dma2", "dma3", |
99 | "(unused 20)", "(unused 21)", "(unused 22)", "(unused 23)", | | 99 | "dma4", "dma5", "dma6", "dma7", |
100 | "(unused 24)", "(unused 25)", "(unused 26)", "(unused 27)", | | 100 | "dma8", "dma9", "dma10", "dma11", |
101 | "(unused 28)", "aux", "(unused 30)", "(unused 31)", | | 101 | "dma12", "aux", "(unused 30)", "(unused 31)", |
102 | "(unused 32)", "(unused 33)", "(unused 34)", "(unused 35)", | | 102 | "(unused 32)", "(unused 33)", "(unused 34)", "(unused 35)", |
103 | "(unused 36)", "(unused 37)", "(unused 38)", "(unused 39)", | | 103 | "(unused 36)", "(unused 37)", "(unused 38)", "(unused 39)", |
104 | "(unused 40)", "(unused 41)", "(unused 42)", "i2c spl slv", | | 104 | "(unused 40)", "(unused 41)", "(unused 42)", "i2c spl slv", |
105 | "(unused 44)", "pwa0", "pwa1", "(unused 47)", | | 105 | "(unused 44)", "pwa0", "pwa1", "(unused 47)", |
106 | "smi", "gpio[0]", "gpio[1]", "gpio[2]", | | 106 | "smi", "gpio[0]", "gpio[1]", "gpio[2]", |
107 | "gpio[3]", "i2c", "spi", "pcm", | | 107 | "gpio[3]", "i2c", "spi", "pcm", |
108 | "sdio", "uart", "(unused 58)", "(unused 59)", | | 108 | "sdio", "uart", "(unused 58)", "(unused 59)", |
109 | "(unused 60)", "(unused 61)", "emmc", "(unused 63)", | | 109 | "(unused 60)", "(unused 61)", "emmc", "(unused 63)", |
110 | "Timer", "Mailbox", "Doorbell0", "Doorbell1", | | 110 | "Timer", "Mailbox", "Doorbell0", "Doorbell1", |
111 | "GPU0 Halted", "GPU1 Halted", "Illegal #1", "Illegal #0" | | 111 | "GPU0 Halted", "GPU1 Halted", "Illegal #1", "Illegal #0" |
112 | }; | | 112 | }; |
113 | | | 113 | |
114 | #define BCM2835_INTBIT_PENDING1 __BIT(8) | | 114 | #define BCM2835_INTBIT_PENDING1 __BIT(8) |
| @@ -162,27 +162,26 @@ bcm2835_irq_handler(void *frame) | | | @@ -162,27 +162,26 @@ bcm2835_irq_handler(void *frame) |
162 | | | 162 | |
163 | ci->ci_data.cpu_nintr++; | | 163 | ci->ci_data.cpu_nintr++; |
164 | | | 164 | |
165 | bcm2835_barrier(); | | 165 | bcm2835_barrier(); |
166 | ipl_mask = bcm2835_pic_find_pending_irqs(&bcm2835_pic); | | 166 | ipl_mask = bcm2835_pic_find_pending_irqs(&bcm2835_pic); |
167 | | | 167 | |
168 | /* | | 168 | /* |
169 | * Record the pending_ipls and deliver them if we can. | | 169 | * Record the pending_ipls and deliver them if we can. |
170 | */ | | 170 | */ |
171 | if ((ipl_mask & ~oldipl_mask) > oldipl_mask) | | 171 | if ((ipl_mask & ~oldipl_mask) > oldipl_mask) |
172 | pic_do_pending_ints(I32_bit, oldipl, frame); | | 172 | pic_do_pending_ints(I32_bit, oldipl, frame); |
173 | } | | 173 | } |
174 | | | 174 | |
175 | | | | |
176 | static void | | 175 | static void |
177 | bcm2835_pic_unblock_irqs(struct pic_softc *pic, size_t irqbase, | | 176 | bcm2835_pic_unblock_irqs(struct pic_softc *pic, size_t irqbase, |
178 | uint32_t irq_mask) | | 177 | uint32_t irq_mask) |
179 | { | | 178 | { |
180 | | | 179 | |
181 | write_bcm2835reg(BCM2835_INTC_ENABLEBASE + (irqbase >> 3), irq_mask); | | 180 | write_bcm2835reg(BCM2835_INTC_ENABLEBASE + (irqbase >> 3), irq_mask); |
182 | bcm2835_barrier(); | | 181 | bcm2835_barrier(); |
183 | } | | 182 | } |
184 | | | 183 | |
185 | static void | | 184 | static void |
186 | bcm2835_pic_block_irqs(struct pic_softc *pic, size_t irqbase, | | 185 | bcm2835_pic_block_irqs(struct pic_softc *pic, size_t irqbase, |
187 | uint32_t irq_mask) | | 186 | uint32_t irq_mask) |
188 | { | | 187 | { |