Deleted Added
full compact
gt_pci.c (194082) gt_pci.c (202035)
1/* $NetBSD: gt_pci.c,v 1.4 2003/07/15 00:24:54 lukem Exp $ */
2
3/*-
4 * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 *

--- 26 unchanged lines hidden (view full) ---

35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38/*
39 * PCI configuration support for gt I/O Processor chip.
40 */
41
42#include <sys/cdefs.h>
1/* $NetBSD: gt_pci.c,v 1.4 2003/07/15 00:24:54 lukem Exp $ */
2
3/*-
4 * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 *

--- 26 unchanged lines hidden (view full) ---

35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38/*
39 * PCI configuration support for gt I/O Processor chip.
40 */
41
42#include <sys/cdefs.h>
43__FBSDID("$FreeBSD: head/sys/mips/malta/gt_pci.c 194082 2009-06-12 22:49:35Z jmallett $");
43__FBSDID("$FreeBSD: head/sys/mips/malta/gt_pci.c 202035 2010-01-10 20:06:14Z imp $");
44
45#include <sys/param.h>
46#include <sys/systm.h>
47
48#include <sys/bus.h>
49#include <sys/interrupt.h>
50#include <sys/malloc.h>
51#include <sys/kernel.h>

--- 34 unchanged lines hidden (view full) ---

86#define PIC_OCW3 0
87
88#define OCW2_SELECT 0
89#define OCW2_ILS(x) ((x) << 0) /* interrupt level select */
90
91#define OCW3_POLL_IRQ(x) ((x) & 0x7f)
92#define OCW3_POLL_PENDING (1U << 7)
93
44
45#include <sys/param.h>
46#include <sys/systm.h>
47
48#include <sys/bus.h>
49#include <sys/interrupt.h>
50#include <sys/malloc.h>
51#include <sys/kernel.h>

--- 34 unchanged lines hidden (view full) ---

86#define PIC_OCW3 0
87
88#define OCW2_SELECT 0
89#define OCW2_ILS(x) ((x) << 0) /* interrupt level select */
90
91#define OCW3_POLL_IRQ(x) ((x) & 0x7f)
92#define OCW3_POLL_PENDING (1U << 7)
93
94struct gt_pci_softc;
95
96struct gt_pci_intr_cookie {
97 int irq;
98 struct gt_pci_softc *sc;
99};
100
94struct gt_pci_softc {
95 device_t sc_dev;
96 bus_space_tag_t sc_st;
101struct gt_pci_softc {
102 device_t sc_dev;
103 bus_space_tag_t sc_st;
97 bus_space_tag_t sc_pciio;
98 bus_space_tag_t sc_pcimem;
99 bus_space_handle_t sc_ioh_icu1;
100 bus_space_handle_t sc_ioh_icu2;
101 bus_space_handle_t sc_ioh_elcr;
102
103 int sc_busno;
104 struct rman sc_mem_rman;
105 struct rman sc_io_rman;
106 struct rman sc_irq_rman;
107 uint32_t sc_mem;
108 uint32_t sc_io;
109
110 struct resource *sc_irq;
111 struct intr_event *sc_eventstab[ICU_LEN];
104 bus_space_handle_t sc_ioh_icu1;
105 bus_space_handle_t sc_ioh_icu2;
106 bus_space_handle_t sc_ioh_elcr;
107
108 int sc_busno;
109 struct rman sc_mem_rman;
110 struct rman sc_io_rman;
111 struct rman sc_irq_rman;
112 uint32_t sc_mem;
113 uint32_t sc_io;
114
115 struct resource *sc_irq;
116 struct intr_event *sc_eventstab[ICU_LEN];
117 struct gt_pci_intr_cookie sc_intr_cookies[ICU_LEN];
112 uint16_t sc_imask;
113 uint16_t sc_elcr;
114
115 uint16_t sc_reserved;
116
117 void *sc_ih;
118};
119
118 uint16_t sc_imask;
119 uint16_t sc_elcr;
120
121 uint16_t sc_reserved;
122
123 void *sc_ih;
124};
125
126static void gt_pci_set_icus(struct gt_pci_softc *);
127static int gt_pci_intr(void *v);
128static int gt_pci_probe(device_t);
129static int gt_pci_attach(device_t);
130static int gt_pci_activate_resource(device_t, device_t, int, int,
131 struct resource *);
132static int gt_pci_setup_intr(device_t, device_t, struct resource *,
133 int, driver_filter_t *, driver_intr_t *, void *, void **);
134static int gt_pci_teardown_intr(device_t, device_t, struct resource *, void*);
135static int gt_pci_maxslots(device_t );
136static int gt_pci_conf_setup(struct gt_pci_softc *, int, int, int, int,
137 uint32_t *);
138static uint32_t gt_pci_read_config(device_t, u_int, u_int, u_int, u_int, int);
139static void gt_pci_write_config(device_t, u_int, u_int, u_int, u_int,
140 uint32_t, int);
141static int gt_pci_route_interrupt(device_t pcib, device_t dev, int pin);
142static struct resource * gt_pci_alloc_resource(device_t, device_t, int,
143 int *, u_long, u_long, u_long, u_int);
144
120static void
145static void
146gt_pci_mask_irq(void *source)
147{
148 struct gt_pci_intr_cookie *cookie = source;
149 struct gt_pci_softc *sc = cookie->sc;
150 int irq = cookie->irq;
151
152 sc->sc_imask |= (1 << irq);
153 sc->sc_elcr |= (1 << irq);
154
155 gt_pci_set_icus(sc);
156}
157
158static void
159gt_pci_unmask_irq(void *source)
160{
161 struct gt_pci_intr_cookie *cookie = source;
162 struct gt_pci_softc *sc = cookie->sc;
163 int irq = cookie->irq;
164
165 /* Enable it, set trigger mode. */
166 sc->sc_imask &= ~(1 << irq);
167 sc->sc_elcr &= ~(1 << irq);
168
169 gt_pci_set_icus(sc);
170}
171
172static void
121gt_pci_set_icus(struct gt_pci_softc *sc)
122{
123 /* Enable the cascade IRQ (2) if 8-15 is enabled. */
124 if ((sc->sc_imask & 0xff00) != 0xff00)
125 sc->sc_imask &= ~(1U << 2);
126 else
127 sc->sc_imask |= (1U << 2);
128
173gt_pci_set_icus(struct gt_pci_softc *sc)
174{
175 /* Enable the cascade IRQ (2) if 8-15 is enabled. */
176 if ((sc->sc_imask & 0xff00) != 0xff00)
177 sc->sc_imask &= ~(1U << 2);
178 else
179 sc->sc_imask |= (1U << 2);
180
129 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, PIC_OCW1,
181 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, PIC_OCW1,
130 sc->sc_imask & 0xff);
182 sc->sc_imask & 0xff);
131 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, PIC_OCW1,
183 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, PIC_OCW1,
132 (sc->sc_imask >> 8) & 0xff);
133
184 (sc->sc_imask >> 8) & 0xff);
185
134 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_elcr, 0,
186 bus_space_write_1(sc->sc_st, sc->sc_ioh_elcr, 0,
135 sc->sc_elcr & 0xff);
187 sc->sc_elcr & 0xff);
136 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_elcr, 1,
188 bus_space_write_1(sc->sc_st, sc->sc_ioh_elcr, 1,
137 (sc->sc_elcr >> 8) & 0xff);
138}
139
140static int
141gt_pci_intr(void *v)
142{
143 struct gt_pci_softc *sc = v;
144 struct intr_event *event;
145 int irq;
146
147 for (;;) {
189 (sc->sc_elcr >> 8) & 0xff);
190}
191
192static int
193gt_pci_intr(void *v)
194{
195 struct gt_pci_softc *sc = v;
196 struct intr_event *event;
197 int irq;
198
199 for (;;) {
148 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, PIC_OCW3,
200 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, PIC_OCW3,
149 OCW3_SEL | OCW3_P);
201 OCW3_SEL | OCW3_P);
150 irq = bus_space_read_1(sc->sc_pciio, sc->sc_ioh_icu1, PIC_OCW3);
202 irq = bus_space_read_1(sc->sc_st, sc->sc_ioh_icu1, PIC_OCW3);
151 if ((irq & OCW3_POLL_PENDING) == 0)
152 {
153 return FILTER_HANDLED;
154 }
155
156 irq = OCW3_POLL_IRQ(irq);
157
158 if (irq == 2) {
203 if ((irq & OCW3_POLL_PENDING) == 0)
204 {
205 return FILTER_HANDLED;
206 }
207
208 irq = OCW3_POLL_IRQ(irq);
209
210 if (irq == 2) {
159 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2,
211 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2,
160 PIC_OCW3, OCW3_SEL | OCW3_P);
212 PIC_OCW3, OCW3_SEL | OCW3_P);
161 irq = bus_space_read_1(sc->sc_pciio, sc->sc_ioh_icu2,
213 irq = bus_space_read_1(sc->sc_st, sc->sc_ioh_icu2,
162 PIC_OCW3);
163 if (irq & OCW3_POLL_PENDING)
164 irq = OCW3_POLL_IRQ(irq) + 8;
165 else
166 irq = 2;
167 }
168
169 event = sc->sc_eventstab[irq];
170
171 if (!event || TAILQ_EMPTY(&event->ie_handlers))
172 continue;
173
174 /* TODO: frame instead of NULL? */
175 intr_event_handle(event, NULL);
176 /* XXX: Log stray IRQs */
177
178 /* Send a specific EOI to the 8259. */
179 if (irq > 7) {
214 PIC_OCW3);
215 if (irq & OCW3_POLL_PENDING)
216 irq = OCW3_POLL_IRQ(irq) + 8;
217 else
218 irq = 2;
219 }
220
221 event = sc->sc_eventstab[irq];
222
223 if (!event || TAILQ_EMPTY(&event->ie_handlers))
224 continue;
225
226 /* TODO: frame instead of NULL? */
227 intr_event_handle(event, NULL);
228 /* XXX: Log stray IRQs */
229
230 /* Send a specific EOI to the 8259. */
231 if (irq > 7) {
180 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2,
232 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2,
181 PIC_OCW2, OCW2_SELECT | OCW2_EOI | OCW2_SL |
182 OCW2_ILS(irq & 7));
183 irq = 2;
184 }
185
233 PIC_OCW2, OCW2_SELECT | OCW2_EOI | OCW2_SL |
234 OCW2_ILS(irq & 7));
235 irq = 2;
236 }
237
186 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, PIC_OCW2,
238 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, PIC_OCW2,
187 OCW2_SELECT | OCW2_EOI | OCW2_SL | OCW2_ILS(irq));
188 }
189
190 return FILTER_HANDLED;
191}
192
193static int
194gt_pci_probe(device_t dev)

--- 8 unchanged lines hidden (view full) ---

203
204 uint32_t busno;
205 struct gt_pci_softc *sc = device_get_softc(dev);
206 int rid;
207
208 busno = 0;
209 sc->sc_dev = dev;
210 sc->sc_busno = busno;
239 OCW2_SELECT | OCW2_EOI | OCW2_SL | OCW2_ILS(irq));
240 }
241
242 return FILTER_HANDLED;
243}
244
245static int
246gt_pci_probe(device_t dev)

--- 8 unchanged lines hidden (view full) ---

255
256 uint32_t busno;
257 struct gt_pci_softc *sc = device_get_softc(dev);
258 int rid;
259
260 busno = 0;
261 sc->sc_dev = dev;
262 sc->sc_busno = busno;
211 sc->sc_pciio = MIPS_BUS_SPACE_IO;
212 sc->sc_pcimem = MIPS_BUS_SPACE_MEM;
263 sc->sc_st = mips_bus_space_generic;
213
214 /* Use KSEG1 to access IO ports for it is uncached */
215 sc->sc_io = MIPS_PHYS_TO_KSEG1(MALTA_PCI0_IO_BASE);
216 sc->sc_io_rman.rm_type = RMAN_ARRAY;
217 sc->sc_io_rman.rm_descr = "GT64120 PCI I/O Ports";
218 if (rman_init(&sc->sc_io_rman) != 0 ||
219 rman_manage_region(&sc->sc_io_rman, 0, 0xffff) != 0) {
220 panic("gt_pci_attach: failed to set up I/O rman");

--- 13 unchanged lines hidden (view full) ---

234 if (rman_init(&sc->sc_irq_rman) != 0 ||
235 rman_manage_region(&sc->sc_irq_rman, 1, 31) != 0)
236 panic("gt_pci_attach: failed to set up IRQ rman");
237
238 /*
239 * Map the PIC/ELCR registers.
240 */
241#if 0
264
265 /* Use KSEG1 to access IO ports for it is uncached */
266 sc->sc_io = MIPS_PHYS_TO_KSEG1(MALTA_PCI0_IO_BASE);
267 sc->sc_io_rman.rm_type = RMAN_ARRAY;
268 sc->sc_io_rman.rm_descr = "GT64120 PCI I/O Ports";
269 if (rman_init(&sc->sc_io_rman) != 0 ||
270 rman_manage_region(&sc->sc_io_rman, 0, 0xffff) != 0) {
271 panic("gt_pci_attach: failed to set up I/O rman");

--- 13 unchanged lines hidden (view full) ---

285 if (rman_init(&sc->sc_irq_rman) != 0 ||
286 rman_manage_region(&sc->sc_irq_rman, 1, 31) != 0)
287 panic("gt_pci_attach: failed to set up IRQ rman");
288
289 /*
290 * Map the PIC/ELCR registers.
291 */
292#if 0
242 if (bus_space_map(sc->sc_pciio, 0x4d0, 2, 0, &sc->sc_ioh_elcr) != 0)
293 if (bus_space_map(sc->sc_st, 0x4d0, 2, 0, &sc->sc_ioh_elcr) != 0)
243 device_printf(dev, "unable to map ELCR registers\n");
294 device_printf(dev, "unable to map ELCR registers\n");
244 if (bus_space_map(sc->sc_pciio, IO_ICU1, 2, 0, &sc->sc_ioh_icu1) != 0)
295 if (bus_space_map(sc->sc_st, IO_ICU1, 2, 0, &sc->sc_ioh_icu1) != 0)
245 device_printf(dev, "unable to map ICU1 registers\n");
296 device_printf(dev, "unable to map ICU1 registers\n");
246 if (bus_space_map(sc->sc_pciio, IO_ICU2, 2, 0, &sc->sc_ioh_icu2) != 0)
297 if (bus_space_map(sc->sc_st, IO_ICU2, 2, 0, &sc->sc_ioh_icu2) != 0)
247 device_printf(dev, "unable to map ICU2 registers\n");
248#else
249 sc->sc_ioh_elcr = sc->sc_io + 0x4d0;
250 sc->sc_ioh_icu1 = sc->sc_io + IO_ICU1;
251 sc->sc_ioh_icu2 = sc->sc_io + IO_ICU2;
252#endif
253
254
255 /* All interrupts default to "masked off". */
256 sc->sc_imask = 0xffff;
257
258 /* All interrupts default to edge-triggered. */
259 sc->sc_elcr = 0;
260
261 /*
262 * Initialize the 8259s.
263 */
264 /* reset, program device, 4 bytes */
298 device_printf(dev, "unable to map ICU2 registers\n");
299#else
300 sc->sc_ioh_elcr = sc->sc_io + 0x4d0;
301 sc->sc_ioh_icu1 = sc->sc_io + IO_ICU1;
302 sc->sc_ioh_icu2 = sc->sc_io + IO_ICU2;
303#endif
304
305
306 /* All interrupts default to "masked off". */
307 sc->sc_imask = 0xffff;
308
309 /* All interrupts default to edge-triggered. */
310 sc->sc_elcr = 0;
311
312 /*
313 * Initialize the 8259s.
314 */
315 /* reset, program device, 4 bytes */
265 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 0,
316 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0,
266 ICW1_RESET | ICW1_IC4);
267 /*
268 * XXX: values from NetBSD's <dev/ic/i8259reg.h>
269 */
317 ICW1_RESET | ICW1_IC4);
318 /*
319 * XXX: values from NetBSD's <dev/ic/i8259reg.h>
320 */
270 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1,
321 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
271 0/*XXX*/);
322 0/*XXX*/);
272 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1,
323 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
273 1 << 2);
324 1 << 2);
274 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1,
325 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
275 ICW4_8086);
276
277 /* mask all interrupts */
326 ICW4_8086);
327
328 /* mask all interrupts */
278 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 0,
329 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 0,
279 sc->sc_imask & 0xff);
280
281 /* enable special mask mode */
330 sc->sc_imask & 0xff);
331
332 /* enable special mask mode */
282 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1,
333 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
283 OCW3_SEL | OCW3_ESMM | OCW3_SMM);
284
285 /* read IRR by default */
334 OCW3_SEL | OCW3_ESMM | OCW3_SMM);
335
336 /* read IRR by default */
286 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu1, 1,
337 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu1, 1,
287 OCW3_SEL | OCW3_RR);
288
289 /* reset, program device, 4 bytes */
338 OCW3_SEL | OCW3_RR);
339
340 /* reset, program device, 4 bytes */
290 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 0,
341 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0,
291 ICW1_RESET | ICW1_IC4);
342 ICW1_RESET | ICW1_IC4);
292 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1,
343 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
293 0/*XXX*/);
344 0/*XXX*/);
294 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1,
345 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
295 1 << 2);
346 1 << 2);
296 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1,
347 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
297 ICW4_8086);
298
299 /* mask all interrupts */
348 ICW4_8086);
349
350 /* mask all interrupts */
300 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 0,
351 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 0,
301 sc->sc_imask & 0xff);
302
303 /* enable special mask mode */
352 sc->sc_imask & 0xff);
353
354 /* enable special mask mode */
304 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1,
355 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
305 OCW3_SEL | OCW3_ESMM | OCW3_SMM);
306
307 /* read IRR by default */
356 OCW3_SEL | OCW3_ESMM | OCW3_SMM);
357
358 /* read IRR by default */
308 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_icu2, 1,
359 bus_space_write_1(sc->sc_st, sc->sc_ioh_icu2, 1,
309 OCW3_SEL | OCW3_RR);
310
311 /*
312 * Default all interrupts to edge-triggered.
313 */
360 OCW3_SEL | OCW3_RR);
361
362 /*
363 * Default all interrupts to edge-triggered.
364 */
314 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_elcr, 0,
365 bus_space_write_1(sc->sc_st, sc->sc_ioh_elcr, 0,
315 sc->sc_elcr & 0xff);
366 sc->sc_elcr & 0xff);
316 bus_space_write_1(sc->sc_pciio, sc->sc_ioh_elcr, 1,
367 bus_space_write_1(sc->sc_st, sc->sc_ioh_elcr, 1,
317 (sc->sc_elcr >> 8) & 0xff);
318
319 /*
320 * Some ISA interrupts are reserved for devices that
321 * we know are hard-wired to certain IRQs.
322 */
323 sc->sc_reserved =
324 (1U << 0) | /* timer */

--- 240 unchanged lines hidden (view full) ---

565 bus_space_handle_t bh = 0;
566
567 switch (type) {
568 case SYS_RES_IRQ:
569 rm = &sc->sc_irq_rman;
570 break;
571 case SYS_RES_MEMORY:
572 rm = &sc->sc_mem_rman;
368 (sc->sc_elcr >> 8) & 0xff);
369
370 /*
371 * Some ISA interrupts are reserved for devices that
372 * we know are hard-wired to certain IRQs.
373 */
374 sc->sc_reserved =
375 (1U << 0) | /* timer */

--- 240 unchanged lines hidden (view full) ---

616 bus_space_handle_t bh = 0;
617
618 switch (type) {
619 case SYS_RES_IRQ:
620 rm = &sc->sc_irq_rman;
621 break;
622 case SYS_RES_MEMORY:
623 rm = &sc->sc_mem_rman;
573 bt = sc->sc_pcimem;
624 bt = sc->sc_st;
574 bh = sc->sc_mem;
575 break;
576 case SYS_RES_IOPORT:
577 rm = &sc->sc_io_rman;
625 bh = sc->sc_mem;
626 break;
627 case SYS_RES_IOPORT:
628 rm = &sc->sc_io_rman;
578 bt = sc->sc_pciio;
629 bt = sc->sc_st;
579 bh = sc->sc_io;
580 break;
581 default:
582 return (NULL);
583 }
584
585 rv = rman_reserve_resource(rm, start, end, count, flags, child);
586 if (rv == NULL)

--- 40 unchanged lines hidden (view full) ---

627 struct intr_event *event;
628 int irq, error;
629
630 irq = rman_get_start(ires);
631 if (irq >= ICU_LEN || irq == 2)
632 panic("%s: bad irq or type", __func__);
633
634 event = sc->sc_eventstab[irq];
630 bh = sc->sc_io;
631 break;
632 default:
633 return (NULL);
634 }
635
636 rv = rman_reserve_resource(rm, start, end, count, flags, child);
637 if (rv == NULL)

--- 40 unchanged lines hidden (view full) ---

678 struct intr_event *event;
679 int irq, error;
680
681 irq = rman_get_start(ires);
682 if (irq >= ICU_LEN || irq == 2)
683 panic("%s: bad irq or type", __func__);
684
685 event = sc->sc_eventstab[irq];
686 sc->sc_intr_cookies[irq].irq = irq;
687 sc->sc_intr_cookies[irq].sc = sc;
635 if (event == NULL) {
688 if (event == NULL) {
636 error = intr_event_create(&event, (void *)irq, 0, irq,
637 (mask_fn)mips_mask_irq, (mask_fn)mips_unmask_irq,
638 (mask_fn)mips_unmask_irq, NULL, "gt_pci intr%d:", irq);
689 error = intr_event_create(&event,
690 (void *)&sc->sc_intr_cookies[irq], 0, irq,
691 gt_pci_mask_irq, gt_pci_unmask_irq,
692 NULL, NULL, "gt_pci intr%d:", irq);
639 if (error)
640 return 0;
641 sc->sc_eventstab[irq] = event;
642 }
643
644 intr_event_add_handler(event, device_get_nameunit(child), filt,
645 handler, arg, intr_priority(flags), flags, cookiep);
646
693 if (error)
694 return 0;
695 sc->sc_eventstab[irq] = event;
696 }
697
698 intr_event_add_handler(event, device_get_nameunit(child), filt,
699 handler, arg, intr_priority(flags), flags, cookiep);
700
647 /* Enable it, set trigger mode. */
648 sc->sc_imask &= ~(1 << irq);
649 sc->sc_elcr &= ~(1 << irq);
650
651 gt_pci_set_icus(sc);
652
701 gt_pci_unmask_irq((void *)&sc->sc_intr_cookies[irq]);
653 return 0;
654}
655
656static int
657gt_pci_teardown_intr(device_t dev, device_t child, struct resource *res,
658 void *cookie)
659{
702 return 0;
703}
704
705static int
706gt_pci_teardown_intr(device_t dev, device_t child, struct resource *res,
707 void *cookie)
708{
709 struct gt_pci_softc *sc = device_get_softc(dev);
710 int irq;
711
712 irq = rman_get_start(res);
713 gt_pci_mask_irq((void *)&sc->sc_intr_cookies[irq]);
714
660 return (intr_event_remove_handler(cookie));
661}
662
663static device_method_t gt_pci_methods[] = {
664 /* Device interface */
665 DEVMETHOD(device_probe, gt_pci_probe),
666 DEVMETHOD(device_attach, gt_pci_attach),
667 DEVMETHOD(device_shutdown, bus_generic_shutdown),

--- 32 unchanged lines hidden ---
715 return (intr_event_remove_handler(cookie));
716}
717
718static device_method_t gt_pci_methods[] = {
719 /* Device interface */
720 DEVMETHOD(device_probe, gt_pci_probe),
721 DEVMETHOD(device_attach, gt_pci_attach),
722 DEVMETHOD(device_shutdown, bus_generic_shutdown),

--- 32 unchanged lines hidden ---