/* * PCI Interrupt handling */ int octeon_pcibus_pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp) { #if 0 struct octeon_pcibus_softc *sc = pa->pa_pc->pc_intr_v; #endif int bus, dev, fn, pin; *ihp = (pci_intr_handle_t)-1; if (pa->pa_intrpin == 0) /* no interrupt needed */ return 1; #ifdef DIAGNOSTIC if (pa->pa_intrpin > 4) { printf("%s: bad interrupt pin %d\n", __func__, pa->pa_intrpin); return 1; } #endif pci_decompose_tag(pa->pa_pc, pa->pa_tag, &bus, &dev, &fn); if (pa->pa_bridgetag) { pin = PPB_INTERRUPT_SWIZZLE(pa->pa_rawintrpin, dev); *ihp = pa->pa_bridgeih[pin - 1]; } else { if (bus == 0) *ihp = octeon_pcibus_intr_map(dev, fn, pa->pa_intrpin); if (*ihp == (pci_intr_handle_t)-1) return 1; } return 0; }
int dec_alphabook1_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp) { pcitag_t bustag = pa->pa_intrtag; int buspin, device; #ifdef notyet if (pa->pa_bridgetag) { buspin = PPB_INTERRUPT_SWIZZLE(pa->pa_rawintrpin, pa->pa_device); if (pa->pa_bridgeih[buspin - 1] == 0) return 1; *ihp = pa->pa_bridgeih[buspin - 1]; return 0; } #endif buspin = pa->pa_intrpin; pci_decompose_tag(pa->pa_pc, bustag, NULL, &device, NULL); /* * There are only two interrupting PCI devices on the AlphaBook: * the SCSI and PCMCIA controllers. The other PCI device is the * SIO, and there are no option slots available. * * NOTE! Apparently, there was a later AlphaBook which uses * a different interrupt scheme, and has a built-in Tulip Ethernet * interface! We do not handle that here! */ switch (device) { case 6: /* NCR SCSI */ *ihp = 14; return 0; case 8: /* Cirrus CL-PD6729 */ *ihp = 15; return 0; default: return 1; } }
int pci_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp) { int pin = pa->pa_rawintrpin; int line = pa->pa_intrline; #if NIOAPIC > 0 struct mp_intr_map *mip; int bus, dev, func; #endif if (pin == 0) { /* No IRQ used. */ goto bad; } if (pin > PCI_INTERRUPT_PIN_MAX) { printf("pci_intr_map: bad interrupt pin %d\n", pin); goto bad; } ihp->tag = pa->pa_tag; ihp->line = line; ihp->pin = pin; #if NIOAPIC > 0 pci_decompose_tag(pa->pa_pc, pa->pa_tag, &bus, &dev, &func); if (mp_busses != NULL) { int mpspec_pin = (dev << 2) | (pin - 1); if (bus < mp_nbusses) { for (mip = mp_busses[bus].mb_intrs; mip != NULL; mip = mip->next) { if (&mp_busses[bus] == mp_isa_bus || &mp_busses[bus] == mp_eisa_bus) continue; if (mip->bus_pin == mpspec_pin) { ihp->line = mip->ioapic_ih | line; return 0; } } } if (pa->pa_bridgetag) { int swizpin = PPB_INTERRUPT_SWIZZLE(pin, dev); if (pa->pa_bridgeih[swizpin - 1].line != -1) { ihp->line = pa->pa_bridgeih[swizpin - 1].line; ihp->line |= line; return 0; } } /* * No explicit PCI mapping found. This is not fatal, * we'll try the ISA (or possibly EISA) mappings next. */ } #endif /* * Section 6.2.4, `Miscellaneous Functions', says that 255 means * `unknown' or `no connection' on a PC. We assume that a device with * `no connection' either doesn't have an interrupt (in which case the * pin number should be 0, and would have been noticed above), or * wasn't configured by the BIOS (in which case we punt, since there's * no real way we can know how the interrupt lines are mapped in the * hardware). * * XXX * Since IRQ 0 is only used by the clock, and we can't actually be sure * that the BIOS did its job, we also recognize that as meaning that * the BIOS has not configured the device. */ if (line == 0 || line == X86_PCI_INTERRUPT_LINE_NO_CONNECTION) goto bad; if (line >= NUM_LEGACY_IRQS) { printf("pci_intr_map: bad interrupt line %d\n", line); goto bad; } if (line == 2) { printf("pci_intr_map: changed line 2 to line 9\n"); line = 9; } #if NIOAPIC > 0 if (mp_busses != NULL) { if (mip == NULL && mp_isa_bus) { for (mip = mp_isa_bus->mb_intrs; mip != NULL; mip = mip->next) { if (mip->bus_pin == line) { ihp->line = mip->ioapic_ih | line; return 0; } } } #if NEISA > 0 if (mip == NULL && mp_eisa_bus) { for (mip = mp_eisa_bus->mb_intrs; mip != NULL; mip = mip->next) { if (mip->bus_pin == line) { ihp->line = mip->ioapic_ih | line; return 0; } } } #endif if (mip == NULL) { printf("pci_intr_map: " "bus %d dev %d func %d pin %d; line %d\n", bus, dev, func, pin, line); printf("pci_intr_map: no MP mapping found\n"); } } #endif return 0; bad: ihp->line = -1; return 1; }