Lines Matching +full:frame +full:- +full:master

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
29 * PIC driver for the 8259A Master and Slave PICs in PC/AT machines.
47 #include <machine/frame.h>
66 #define MASTER 0 macro
69 #define IMEN_MASK(ai) (IRQ_MASK((ai)->at_irq))
93 #define IRQ(ap, ai) ((ap)->at_irqbase + (ai)->at_irq)
185 KASSERT(isrc->is_pic == &atpics[MASTER].at_pic, in _atpic_eoi_master()
188 outb(atpics[MASTER].at_ioaddr, OCW2_EOI); in _atpic_eoi_master()
193 * The data sheet says no auto-EOI on slave, but it sometimes works.
200 KASSERT(isrc->is_pic == &atpics[SLAVE].at_pic, in _atpic_eoi_slave()
205 outb(atpics[MASTER].at_ioaddr, OCW2_EOI); in _atpic_eoi_slave()
228 * To avoid the slave not register sources after the master in atpic_register_sources()
230 * called on the master. in atpic_register_sources()
232 if (ap != &atpics[MASTER]) in atpic_register_sources()
242 intr_register_source(&ai->at_intsrc); in atpic_register_sources()
250 struct atpic *ap = (struct atpic *)isrc->is_pic; in atpic_enable_source()
253 if (ap->at_imen & IMEN_MASK(ai)) { in atpic_enable_source()
254 ap->at_imen &= ~IMEN_MASK(ai); in atpic_enable_source()
255 outb(ap->at_ioaddr + ICU_IMR_OFFSET, ap->at_imen); in atpic_enable_source()
264 struct atpic *ap = (struct atpic *)isrc->is_pic; in atpic_disable_source()
267 if (ai->at_trigger != INTR_TRIGGER_EDGE) { in atpic_disable_source()
268 ap->at_imen |= IMEN_MASK(ai); in atpic_disable_source()
269 outb(ap->at_ioaddr + ICU_IMR_OFFSET, ap->at_imen); in atpic_disable_source()
278 if (isrc->is_pic == &atpics[MASTER].at_pic) in atpic_disable_source()
321 struct atpic *ap = (struct atpic *)isrc->is_pic; in atpic_vector()
330 struct atpic *ap = (struct atpic *)isrc->is_pic; in atpic_source_pending()
332 return (inb(ap->at_ioaddr) & IMEN_MASK(ai)); in atpic_source_pending()
368 if (ai->at_trigger == trig) in atpic_config_intr()
396 ai->at_trigger = trig; in atpic_config_intr()
419 outb(pic->at_ioaddr, ICW1_RESET | ICW1_IC4); in i8259_init()
420 imr_addr = pic->at_ioaddr + ICU_IMR_OFFSET; in i8259_init()
423 outb(imr_addr, pic->at_intbase); in i8259_init()
426 * Setup slave links. For the master pic, indicate what line in i8259_init()
428 * which line on the master we are connected to. in i8259_init()
442 outb(imr_addr, pic->at_imen); in i8259_init()
445 outb(pic->at_ioaddr, OCW3_SEL | OCW3_RR); in i8259_init()
447 /* OCW2_L1 sets priority order to 3-7, 0-2 (com2 first). */ in i8259_init()
449 outb(pic->at_ioaddr, OCW2_R | OCW2_SL | OCW2_L1); in i8259_init()
461 i8259_init(&atpics[MASTER], 0); in atpic_startup()
465 /* Install low-level interrupt handlers for all of our IRQs. */ in atpic_startup()
469 ai->at_intsrc.is_count = &ai->at_count; in atpic_startup()
470 ai->at_intsrc.is_straycount = &ai->at_straycount; in atpic_startup()
471 setidt(((struct atpic *)ai->at_intsrc.is_pic)->at_intbase + in atpic_startup()
472 ai->at_irq, pti ? ai->at_intr_pti : ai->at_intr, SDT_ATPIC, in atpic_startup()
489 ai->at_trigger = elcr_read_trigger(i); in atpic_startup()
498 ai->at_trigger = INTR_TRIGGER_EDGE; in atpic_startup()
501 ai->at_trigger = INTR_TRIGGER_LEVEL; in atpic_startup()
525 atpic_handle_intr(u_int vector, struct trapframe *frame) in atpic_handle_intr() argument
529 kasan_mark(frame, sizeof(*frame), sizeof(*frame), 0); in atpic_handle_intr()
530 kmsan_mark(frame, sizeof(*frame), KMSAN_STATE_INITED); in atpic_handle_intr()
540 if (isrc->is_event == NULL && (vector == 7 || vector == 15)) { in atpic_handle_intr()
547 port = ((struct atpic *)isrc->is_pic)->at_ioaddr; in atpic_handle_intr()
556 intr_execute_handlers(isrc, frame); in atpic_handle_intr()