static void eb164_intr_init() { /* * Enable ISA-PCI cascade interrupt. */ eb164_intr_enable(4); }
void pci_eb164_pickintr(struct cia_config *ccp) { bus_space_tag_t iot = &ccp->cc_iot; pci_chipset_tag_t pc = &ccp->cc_pc; char *cp; int i; pc->pc_intr_v = ccp; pc->pc_intr_map = dec_eb164_intr_map; pc->pc_intr_string = dec_eb164_intr_string; pc->pc_intr_evcnt = dec_eb164_intr_evcnt; pc->pc_intr_establish = dec_eb164_intr_establish; pc->pc_intr_disestablish = dec_eb164_intr_disestablish; pc->pc_pciide_compat_intr_establish = dec_eb164_pciide_compat_intr_establish; eb164_intrgate_iot = iot; if (bus_space_map(eb164_intrgate_iot, 0x804, 3, 0, &eb164_intrgate_ioh) != 0) panic("pci_eb164_pickintr: couldn't map interrupt PLD"); for (i = 0; i < EB164_MAX_IRQ; i++) eb164_intr_disable(i); #define PCI_EB164_IRQ_STR 8 eb164_pci_intr = alpha_shared_intr_alloc(EB164_MAX_IRQ, PCI_EB164_IRQ_STR); for (i = 0; i < EB164_MAX_IRQ; i++) { /* * Systems with a Pyxis seem to have problems with * stray interrupts, so just ignore them. Sigh, * I hate buggy hardware. */ alpha_shared_intr_set_maxstrays(eb164_pci_intr, i, (ccp->cc_flags & CCF_ISPYXIS) ? 0 : PCI_STRAY_MAX); cp = alpha_shared_intr_string(eb164_pci_intr, i); snprintf(cp, PCI_EB164_IRQ_STR, "irq %d", i); evcnt_attach_dynamic(alpha_shared_intr_evcnt( eb164_pci_intr, i), EVCNT_TYPE_INTR, NULL, "eb164", cp); } #if NSIO sio_intr_setup(pc, iot); eb164_intr_enable(EB164_SIO_IRQ); #endif }
void * dec_eb164_intr_establish(void *ccv, pci_intr_handle_t ih, int level, int (*func)(void *), void *arg) { #if 0 struct cia_config *ccp = ccv; #endif void *cookie; if (ih > EB164_MAX_IRQ) panic("dec_eb164_intr_establish: bogus eb164 IRQ 0x%lx", ih); cookie = alpha_shared_intr_establish(eb164_pci_intr, ih, IST_LEVEL, level, func, arg, "eb164 irq"); if (cookie != NULL && alpha_shared_intr_firstactive(eb164_pci_intr, ih)) { scb_set(0x900 + SCB_IDXTOVEC(ih), eb164_iointr, NULL, level); eb164_intr_enable(ih); } return (cookie); }