Changeset View
Changeset View
Standalone View
Standalone View
sys/x86/isa/atpic.c
Show First 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | |||||
inthand_t | inthand_t | ||||
IDTVEC(atpic_intr0), IDTVEC(atpic_intr1), IDTVEC(atpic_intr2), | IDTVEC(atpic_intr0), IDTVEC(atpic_intr1), IDTVEC(atpic_intr2), | ||||
IDTVEC(atpic_intr3), IDTVEC(atpic_intr4), IDTVEC(atpic_intr5), | IDTVEC(atpic_intr3), IDTVEC(atpic_intr4), IDTVEC(atpic_intr5), | ||||
IDTVEC(atpic_intr6), IDTVEC(atpic_intr7), IDTVEC(atpic_intr8), | IDTVEC(atpic_intr6), IDTVEC(atpic_intr7), IDTVEC(atpic_intr8), | ||||
IDTVEC(atpic_intr9), IDTVEC(atpic_intr10), IDTVEC(atpic_intr11), | IDTVEC(atpic_intr9), IDTVEC(atpic_intr10), IDTVEC(atpic_intr11), | ||||
IDTVEC(atpic_intr12), IDTVEC(atpic_intr13), IDTVEC(atpic_intr14), | IDTVEC(atpic_intr12), IDTVEC(atpic_intr13), IDTVEC(atpic_intr14), | ||||
IDTVEC(atpic_intr15); | IDTVEC(atpic_intr15); | ||||
/* XXXKIB i386 uses stubs until pti comes */ | |||||
inthand_t | |||||
IDTVEC(atpic_intr0_pti), IDTVEC(atpic_intr1_pti), | |||||
IDTVEC(atpic_intr2_pti), IDTVEC(atpic_intr3_pti), | |||||
IDTVEC(atpic_intr4_pti), IDTVEC(atpic_intr5_pti), | |||||
IDTVEC(atpic_intr6_pti), IDTVEC(atpic_intr7_pti), | |||||
IDTVEC(atpic_intr8_pti), IDTVEC(atpic_intr9_pti), | |||||
IDTVEC(atpic_intr10_pti), IDTVEC(atpic_intr11_pti), | |||||
IDTVEC(atpic_intr12_pti), IDTVEC(atpic_intr13_pti), | |||||
IDTVEC(atpic_intr14_pti), IDTVEC(atpic_intr15_pti); | |||||
#define IRQ(ap, ai) ((ap)->at_irqbase + (ai)->at_irq) | #define IRQ(ap, ai) ((ap)->at_irqbase + (ai)->at_irq) | ||||
#define ATPIC(io, base, eoi, imenptr) \ | #define ATPIC(io, base, eoi, imenptr) \ | ||||
{ { atpic_enable_source, atpic_disable_source, (eoi), \ | { { atpic_enable_source, atpic_disable_source, (eoi), \ | ||||
atpic_enable_intr, atpic_disable_intr, atpic_vector, \ | atpic_enable_intr, atpic_disable_intr, atpic_vector, \ | ||||
atpic_source_pending, NULL, atpic_resume, atpic_config_intr,\ | atpic_source_pending, NULL, atpic_resume, atpic_config_intr,\ | ||||
atpic_assign_cpu }, (io), (base), IDT_IO_INTS + (base), \ | atpic_assign_cpu }, (io), (base), IDT_IO_INTS + (base), \ | ||||
(imenptr) } | (imenptr) } | ||||
#define INTSRC(irq) \ | #define INTSRC(irq) \ | ||||
{ { &atpics[(irq) / 8].at_pic }, IDTVEC(atpic_intr ## irq ), \ | { { &atpics[(irq) / 8].at_pic }, IDTVEC(atpic_intr ## irq ), \ | ||||
(irq) % 8 } | IDTVEC(atpic_intr ## irq ## _pti, (irq) % 8 } | ||||
struct atpic { | struct atpic { | ||||
struct pic at_pic; | struct pic at_pic; | ||||
int at_ioaddr; | int at_ioaddr; | ||||
int at_irqbase; | int at_irqbase; | ||||
uint8_t at_intbase; | uint8_t at_intbase; | ||||
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; | 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_count; | ||||
u_long at_straycount; | u_long at_straycount; | ||||
}; | }; | ||||
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); | ||||
▲ Show 20 Lines • Show All 287 Lines • ▼ Show 20 Lines | atpic_startup(void) | ||||
/* 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_count = &ai->at_count; | ||||
ai->at_intsrc.is_straycount = &ai->at_straycount; | 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, ai->at_intr, SDT_ATPIC, SEL_KPL, GSEL_ATPIC); | ai->at_irq, pti ? ai->at_intr_pti : ai->at_intr, SDT_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 | ||||
* edge triggered and that everything else is level triggered. | * edge triggered and that everything else is level triggered. | ||||
* We only use the trigger information to reprogram the ELCR if | * We only use the trigger information to reprogram the ELCR if | ||||
* we have one and as an optimization to avoid masking edge | * we have one and as an optimization to avoid masking edge | ||||
▲ Show 20 Lines • Show All 174 Lines • Show Last 20 Lines |