Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/isa/atpic.c
Show First 20 Lines • Show All 125 Lines • ▼ Show 20 Lines | struct atpic { | ||||
uint8_t at_imen; | uint8_t at_imen; | ||||
}; | }; | ||||
struct atpic_intsrc { | struct atpic_intsrc { | ||||
struct intsrc at_intsrc; | struct intsrc at_intsrc; | ||||
inthand_t *at_intr, *at_intr_pti; | inthand_t *at_intr, *at_intr_pti; | ||||
int at_irq; /* Relative to PIC base. */ | int at_irq; /* Relative to PIC base. */ | ||||
enum intr_trigger at_trigger; | enum intr_trigger at_trigger; | ||||
u_long at_count; | |||||
u_long at_straycount; | |||||
}; | }; | ||||
static void atpic_register_sources(struct pic *pic); | static void atpic_register_sources(struct pic *pic); | ||||
static void atpic_enable_source(struct intsrc *isrc); | static void atpic_enable_source(struct intsrc *isrc); | ||||
static void atpic_disable_source(struct intsrc *isrc, int eoi); | static void atpic_disable_source(struct intsrc *isrc, int eoi); | ||||
static void atpic_eoi_master(struct intsrc *isrc); | static void atpic_eoi_master(struct intsrc *isrc); | ||||
static void atpic_eoi_slave(struct intsrc *isrc); | static void atpic_eoi_slave(struct intsrc *isrc); | ||||
static void atpic_enable_intr(struct intsrc *isrc); | static void atpic_enable_intr(struct intsrc *isrc); | ||||
▲ Show 20 Lines • Show All 315 Lines • ▼ Show 20 Lines | atpic_startup(void) | ||||
i8259_init(&atpics[MASTER], 0); | i8259_init(&atpics[MASTER], 0); | ||||
i8259_init(&atpics[SLAVE], 1); | i8259_init(&atpics[SLAVE], 1); | ||||
atpic_enable_source((struct intsrc *)&atintrs[ICU_SLAVEID]); | atpic_enable_source((struct intsrc *)&atintrs[ICU_SLAVEID]); | ||||
/* Install low-level interrupt handlers for all of our IRQs. */ | /* Install low-level interrupt handlers for all of our IRQs. */ | ||||
for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) { | for (i = 0, ai = atintrs; i < NUM_ISA_IRQS; i++, ai++) { | ||||
if (i == ICU_SLAVEID) | if (i == ICU_SLAVEID) | ||||
continue; | continue; | ||||
ai->at_intsrc.is_count = &ai->at_count; | |||||
ai->at_intsrc.is_straycount = &ai->at_straycount; | |||||
setidt(((struct atpic *)ai->at_intsrc.is_pic)->at_intbase + | setidt(((struct atpic *)ai->at_intsrc.is_pic)->at_intbase + | ||||
ai->at_irq, pti ? ai->at_intr_pti : ai->at_intr, SDT_ATPIC, | ai->at_irq, pti ? ai->at_intr_pti : ai->at_intr, SDT_ATPIC, | ||||
SEL_KPL, GSEL_ATPIC); | SEL_KPL, GSEL_ATPIC); | ||||
} | } | ||||
/* | /* | ||||
* Look for an ELCR. If we find one, update the trigger modes. | * Look for an ELCR. If we find one, update the trigger modes. | ||||
* If we don't find one, assume that IRQs 0, 1, 2, and 13 are | * If we don't find one, assume that IRQs 0, 1, 2, and 13 are | ||||
▲ Show 20 Lines • Show All 144 Lines • Show Last 20 Lines |