Lines Matching +full:slave +full:- +full:mode

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
29 * PIC driver for the 8259A Master and Slave PICs in PC/AT machines.
67 #define SLAVE 1
69 #define IMEN_MASK(ai) (IRQ_MASK((ai)->at_irq))
93 #define IRQ(ap, ai) ((ap)->at_irqbase + (ai)->at_irq)
153 static void i8259_init(struct atpic *pic, int slave);
185 KASSERT(isrc->is_pic == &atpics[MASTER].at_pic,
193 * The data sheet says no auto-EOI on slave, but it sometimes works.
200 KASSERT(isrc->is_pic == &atpics[SLAVE].at_pic,
203 outb(atpics[SLAVE].at_ioaddr, OCW2_EOI);
221 * use mixed mode. The "accidental" use could otherwise occur on
226 * IRQ0 via mixed mode, but now we don't use mixed mode at all.
228 * To avoid the slave not register sources after the master
242 intr_register_source(&ai->at_intsrc);
250 struct atpic *ap = (struct atpic *)isrc->is_pic;
253 if (ap->at_imen & IMEN_MASK(ai)) {
254 ap->at_imen &= ~IMEN_MASK(ai);
255 outb(ap->at_ioaddr + ICU_IMR_OFFSET, ap->at_imen);
264 struct atpic *ap = (struct atpic *)isrc->is_pic;
267 if (ai->at_trigger != INTR_TRIGGER_EDGE) {
268 ap->at_imen |= IMEN_MASK(ai);
269 outb(ap->at_ioaddr + ICU_IMR_OFFSET, ap->at_imen);
278 if (isrc->is_pic == &atpics[MASTER].at_pic)
321 struct atpic *ap = (struct atpic *)isrc->is_pic;
330 struct atpic *ap = (struct atpic *)isrc->is_pic;
332 return (inb(ap->at_ioaddr) & IMEN_MASK(ai));
340 i8259_init(ap, ap == &atpics[SLAVE]);
341 if (ap == &atpics[SLAVE] && elcr_found)
368 if (ai->at_trigger == trig)
396 ai->at_trigger = trig;
413 i8259_init(struct atpic *pic, int slave)
419 outb(pic->at_ioaddr, ICW1_RESET | ICW1_IC4);
420 imr_addr = pic->at_ioaddr + ICU_IMR_OFFSET;
423 outb(imr_addr, pic->at_intbase);
426 * Setup slave links. For the master pic, indicate what line
427 * the slave is configured on. For the slave indicate
430 if (slave)
435 /* Set mode. */
436 if (slave)
442 outb(imr_addr, pic->at_imen);
445 outb(pic->at_ioaddr, OCW3_SEL | OCW3_RR);
447 /* OCW2_L1 sets priority order to 3-7, 0-2 (com2 first). */
448 if (!slave)
449 outb(pic->at_ioaddr, OCW2_R | OCW2_SL | OCW2_L1);
462 i8259_init(&atpics[SLAVE], 1);
465 /* Install low-level interrupt handlers for all of our IRQs. */
469 ai->at_intsrc.is_count = &ai->at_count;
470 ai->at_intsrc.is_straycount = &ai->at_straycount;
471 setidt(((struct atpic *)ai->at_intsrc.is_pic)->at_intbase +
472 ai->at_irq, pti ? ai->at_intr_pti : ai->at_intr, SDT_ATPIC,
489 ai->at_trigger = elcr_read_trigger(i);
498 ai->at_trigger = INTR_TRIGGER_EDGE;
501 ai->at_trigger = INTR_TRIGGER_LEVEL;
540 if (isrc->is_event == NULL && (vector == 7 || vector == 15)) {
547 port = ((struct atpic *)isrc->is_pic)->at_ioaddr;