pci_link
ACPI_SERIAL_BEGIN(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_ASSERT(pci_link);
ACPI_SERIAL_ASSERT(pci_link);
ACPI_SERIAL_ASSERT(pci_link);
ACPI_SERIAL_ASSERT(pci_link);
ACPI_SERIAL_BEGIN(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_DECL(pci_link, "ACPI PCI link");
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_ASSERT(pci_link);
ACPI_SERIAL_BEGIN(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_END(pci_link);
ACPI_SERIAL_ASSERT(pci_link);
ACPI_SERIAL_ASSERT(pci_link);
ACPI_SERIAL_BEGIN(pci_link);
ACPI_SERIAL_END(pci_link);
static TAILQ_HEAD(, pci_link) pci_links;
static struct pci_link *
struct pci_link *pci_link;
TAILQ_FOREACH(pci_link, &pci_links, pl_links) {
if (pci_link->pl_id == link_id)
return (pci_link);
pci_pir_valid_irq(struct pci_link *pci_link, int irq)
return (pci_link->pl_irqmask & (1 << irq));
struct pci_link *pci_link;
pci_link = pci_pir_find_link(intpin->link);
if (pci_link != NULL) {
pci_link->pl_references++;
if (intpin->irqs != pci_link->pl_irqmask) {
pci_link->pl_id);
pci_link->pl_irqmask &= intpin->irqs;
pci_link = malloc(sizeof(struct pci_link), M_PIR, M_WAITOK);
pci_link->pl_id = intpin->link;
pci_link->pl_irqmask = intpin->irqs;
pci_link->pl_irq = PCI_INVALID_IRQ;
pci_link->pl_references = 1;
pci_link->pl_routed = 0;
TAILQ_INSERT_TAIL(&pci_links, pci_link, pl_links);
struct pci_link *pci_link;
pci_link = pci_pir_find_link(intpin->link);
if (irq == PCI_INVALID_IRQ || irq == pci_link->pl_irq)
pci_link->pl_id);
if (pci_link->pl_irq == PCI_INVALID_IRQ) {
if (!pci_pir_valid_irq(pci_link, irq))
pci_link->pl_id);
pci_link->pl_irq = irq;
pci_link->pl_routed = 1;
if (!pci_pir_valid_irq(pci_link, irq)) {
pci_link->pl_id);
} else if (!pci_pir_valid_irq(pci_link, pci_link->pl_irq)) {
pci_link->pl_id, pci_link->pl_irq);
pci_link->pl_irq = irq;
pci_link->pl_routed = 1;
pci_link->pl_id, pci_link->pl_irq);
struct pci_link *pci_link;
TAILQ_FOREACH(pci_link, &pci_links, pl_links) {
"hw.pci.link.%#x.irq", pci_link->pl_id);
!pci_pir_valid_irq(pci_link, irq) && bootverbose)
irq, pci_link->pl_id);
pci_link->pl_routed = 0;
pci_link->pl_irq = irq;
TAILQ_FOREACH(pci_link, &pci_links, pl_links) {
if (!PCI_INTERRUPT_VALID(pci_link->pl_irq))
pir_bios_irqs |= 1 << pci_link->pl_irq;
pir_interrupt_weight[pci_link->pl_irq] +=
pci_link->pl_references;
struct pci_link *pci_link;
pci_link = NULL;
lookup.pci_link_ptr = &pci_link;
if (pci_link == NULL) {
if (!PCI_INTERRUPT_VALID(pci_link->pl_irq)) {
if (pci_link->pl_irqmask != 0 && powerof2(pci_link->pl_irqmask))
irq = ffs(pci_link->pl_irqmask) - 1;
irq = pci_pir_choose_irq(pci_link,
irq = pci_pir_choose_irq(pci_link, pir_bios_irqs);
irq = pci_pir_choose_irq(pci_link,
pci_link->pl_irq = irq;
if (!pci_link->pl_routed) {
pci_link->pl_irq);
if (error && !powerof2(pci_link->pl_irqmask)) {
pci_link->pl_routed = 1;
BUS_CONFIG_INTR(pir_device, pci_link->pl_irq,
pin - 1 + 'A', pci_link->pl_irq);
return (pci_link->pl_irq);
TAILQ_ENTRY(pci_link) pl_links;
pci_pir_choose_irq(struct pci_link *pci_link, int irqmask)
realmask = pci_link->pl_irqmask & irqmask;
pci_link->pl_id);
struct pci_link *pci_link;
TAILQ_FOREACH(pci_link, &pci_links, pl_links) {
printf("%#4x %3d %c %3d ", pci_link->pl_id,
pci_link->pl_irq, pci_link->pl_routed ? 'Y' : 'N',
pci_link->pl_references);
pci_print_irqmask(pci_link->pl_irqmask);
struct pci_link **pci_link_ptr;
struct pci_link *pci_link;
TAILQ_FOREACH(pci_link, &pci_links, pl_links) {
if (!PCI_INTERRUPT_VALID(pci_link->pl_irq)) {
KASSERT(!pci_link->pl_routed,
pci_link->pl_id));
if (pci_link->pl_routed) {
pd.link = pci_link->pl_id;
pci_link->pl_id));
pci_link->pl_id, pci_link->pl_irq);
pci_link->pl_irq);
pci_link->pl_id);
static int pci_pir_choose_irq(struct pci_link *pci_link, int irqmask);
static struct pci_link *pci_pir_find_link(uint8_t link_id);
static int pci_pir_valid_irq(struct pci_link *pci_link, int irq);