void apic_set_redir(struct ioapic_softc *sc, int pin, int idt_vec, struct cpu_info *ci) { u_int32_t redlo; u_int32_t redhi = 0; int delmode; struct ioapic_pin *pp; struct mp_intr_map *map; pp = &sc->sc_pins[pin]; map = pp->ip_map; redlo = (map == NULL) ? IOAPIC_REDLO_MASK : map->redir; delmode = (redlo & IOAPIC_REDLO_DEL_MASK) >> IOAPIC_REDLO_DEL_SHIFT; /* XXX magic numbers */ if ((delmode != 0) && (delmode != 1)) ; else if (pp->ip_type == IST_NONE) { redlo |= IOAPIC_REDLO_MASK; } else { redlo |= (idt_vec & 0xff); redlo &= ~IOAPIC_REDLO_DEL_MASK; redlo |= (IOAPIC_REDLO_DEL_FIXED << IOAPIC_REDLO_DEL_SHIFT); redlo &= ~IOAPIC_REDLO_DSTMOD; /* * Destination: BSP CPU * * XXX will want to distribute interrupts across cpu's * eventually. most likely, we'll want to vector each * interrupt to a specific CPU and load-balance across * cpu's. but there's no point in doing that until after * most interrupts run without the kernel lock. */ redhi |= (ci->ci_apicid << IOAPIC_REDHI_DEST_SHIFT); /* XXX derive this bit from BIOS info */ if (pp->ip_type == IST_LEVEL) redlo |= IOAPIC_REDLO_LEVEL; else redlo &= ~IOAPIC_REDLO_LEVEL; if (map != NULL && ((map->flags & 3) == MPS_INTPO_DEF)) { if (pp->ip_type == IST_LEVEL) redlo |= IOAPIC_REDLO_ACTLO; else redlo &= ~IOAPIC_REDLO_ACTLO; } } /* Do atomic write */ ioapic_write(sc, IOAPIC_REDLO(pin), IOAPIC_REDLO_MASK); ioapic_write(sc, IOAPIC_REDHI(pin), redhi); ioapic_write(sc, IOAPIC_REDLO(pin), redlo); if (mp_verbose) ioapic_print_redir(sc, "int", pin); }
void ioapic_hwmask(struct pic *pic, int pin) { u_int32_t redlo; struct ioapic_softc *sc = (struct ioapic_softc *)pic; u_long flags; if (ioapic_cold) return; flags = ioapic_lock(sc); redlo = ioapic_read_ul(sc, IOAPIC_REDLO(pin)); redlo |= IOAPIC_REDLO_MASK; ioapic_write_ul(sc, IOAPIC_REDLO(pin), redlo); ioapic_unlock(sc, flags); }
void ioapic_print_redir(struct ioapic_softc *sc, char *why, int pin) { u_int32_t redirlo = ioapic_read(sc, IOAPIC_REDLO(pin)); u_int32_t redirhi = ioapic_read(sc, IOAPIC_REDHI(pin)); apic_format_redir(sc->sc_pic.pic_name, why, pin, redirhi, redirlo); }