void mp_cfg_eisa_intr(const struct mpbios_int *entry, u_int32_t *redir) { int mpspo = (entry->int_flags >> MPS_INTPO_SHIFT) & MPS_INTPO_MASK; int mpstrig = (entry->int_flags >> MPS_INTTR_SHIFT) & MPS_INTTR_MASK; *redir &= ~IOAPIC_REDLO_DEL_MASK; switch (mpspo) { case MPS_INTPO_DEF: case MPS_INTPO_ACTHI: *redir &= ~IOAPIC_REDLO_ACTLO; break; case MPS_INTPO_ACTLO: *redir |= IOAPIC_REDLO_ACTLO; break; default: panic("unknown MPS interrupt polarity %d", mpspo); } if (entry->int_type != MPS_INTTYPE_INT) { mp_cfg_special_intr(entry, redir); return; } *redir |= (IOAPIC_REDLO_DEL_LOPRI<<IOAPIC_REDLO_DEL_SHIFT); switch (mpstrig) { case MPS_INTTR_LEVEL: *redir |= IOAPIC_REDLO_LEVEL; break; case MPS_INTTR_EDGE: *redir &= ~IOAPIC_REDLO_LEVEL; break; case MPS_INTTR_DEF: /* * Set "default" setting based on ELCR value snagged * earlier. */ if (mp_busses[entry->src_bus_id].mb_data & (1<<entry->src_bus_irq)) { *redir |= IOAPIC_REDLO_LEVEL; } else { *redir &= ~IOAPIC_REDLO_LEVEL; } break; default: panic("unknown MPS interrupt trigger %d", mpstrig); } }
void mp_cfg_isa_intr(const struct mpbios_int *entry, u_int32_t *redir) { int mpspo = (entry->int_flags >> MPS_INTPO_SHIFT) & MPS_INTPO_MASK; int mpstrig = (entry->int_flags >> MPS_INTTR_SHIFT) & MPS_INTTR_MASK; *redir &= ~IOAPIC_REDLO_DEL_MASK; switch (mpspo) { case MPS_INTPO_DEF: case MPS_INTPO_ACTHI: *redir &= ~IOAPIC_REDLO_ACTLO; break; case MPS_INTPO_ACTLO: *redir |= IOAPIC_REDLO_ACTLO; break; default: panic("unknown MPS interrupt polarity %d", mpspo); } if (entry->int_type != MPS_INTTYPE_INT) { mp_cfg_special_intr(entry, redir); return; } *redir |= (IOAPIC_REDLO_DEL_LOPRI << IOAPIC_REDLO_DEL_SHIFT); switch (mpstrig) { case MPS_INTTR_LEVEL: *redir |= IOAPIC_REDLO_LEVEL; break; case MPS_INTTR_DEF: case MPS_INTTR_EDGE: *redir &= ~IOAPIC_REDLO_LEVEL; break; default: panic("unknown MPS interrupt trigger %d", mpstrig); } }
static void mp_cfg_pci_intr(const struct mpbios_int *entry, uint32_t *redir) { int mpspo = entry->int_flags & 0x03; /* XXX magic */ int mpstrig = (entry->int_flags >> 2) & 0x03; /* XXX magic */ *redir &= ~IOAPIC_REDLO_DEL_MASK; switch (mpspo) { case MPS_INTPO_ACTHI: *redir &= ~IOAPIC_REDLO_ACTLO; break; case MPS_INTPO_DEF: case MPS_INTPO_ACTLO: *redir |= IOAPIC_REDLO_ACTLO; break; default: panic("unknown MPS interrupt polarity %d", mpspo); } if (entry->int_type != MPS_INTTYPE_INT) { mp_cfg_special_intr(entry, redir); return; } *redir |= (IOAPIC_REDLO_DEL_FIXED<<IOAPIC_REDLO_DEL_SHIFT); switch (mpstrig) { case MPS_INTTR_DEF: case MPS_INTTR_LEVEL: *redir |= IOAPIC_REDLO_LEVEL; break; case MPS_INTTR_EDGE: *redir &= ~IOAPIC_REDLO_LEVEL; break; default: panic("unknown MPS interrupt trigger %d", mpstrig); } }