Lines Matching refs:pci_link
55 struct pci_link { struct
56 TAILQ_ENTRY(pci_link) pl_links;
65 struct pci_link **pci_link_ptr; argument
84 static int pci_pir_choose_irq(struct pci_link *pci_link, int irqmask);
88 static struct pci_link *pci_pir_find_link(uint8_t link_id);
95 static int pci_pir_valid_irq(struct pci_link *pci_link, int irq);
103 static TAILQ_HEAD(, pci_link) pci_links;
166 static struct pci_link *
169 struct pci_link *pci_link; in pci_pir_find_link() local
171 TAILQ_FOREACH(pci_link, &pci_links, pl_links) { in pci_pir_find_link()
172 if (pci_link->pl_id == link_id) in pci_pir_find_link()
173 return (pci_link); in pci_pir_find_link()
198 pci_pir_valid_irq(struct pci_link *pci_link, int irq) in pci_pir_valid_irq() argument
203 return (pci_link->pl_irqmask & (1 << irq)); in pci_pir_valid_irq()
231 struct pci_link *pci_link; in pci_pir_create_links() local
233 pci_link = pci_pir_find_link(intpin->link); in pci_pir_create_links()
234 if (pci_link != NULL) { in pci_pir_create_links()
235 pci_link->pl_references++; in pci_pir_create_links()
236 if (intpin->irqs != pci_link->pl_irqmask) { in pci_pir_create_links()
242 pci_link->pl_id); in pci_pir_create_links()
243 pci_link->pl_irqmask &= intpin->irqs; in pci_pir_create_links()
246 pci_link = malloc(sizeof(struct pci_link), M_PIR, M_WAITOK); in pci_pir_create_links()
247 pci_link->pl_id = intpin->link; in pci_pir_create_links()
248 pci_link->pl_irqmask = intpin->irqs; in pci_pir_create_links()
249 pci_link->pl_irq = PCI_INVALID_IRQ; in pci_pir_create_links()
250 pci_link->pl_references = 1; in pci_pir_create_links()
251 pci_link->pl_routed = 0; in pci_pir_create_links()
252 TAILQ_INSERT_TAIL(&pci_links, pci_link, pl_links); in pci_pir_create_links()
310 struct pci_link *pci_link; in pci_pir_initial_irqs() local
314 pci_link = pci_pir_find_link(intpin->link); in pci_pir_initial_irqs()
316 if (irq == PCI_INVALID_IRQ || irq == pci_link->pl_irq) in pci_pir_initial_irqs()
324 pci_link->pl_id); in pci_pir_initial_irqs()
332 if (pci_link->pl_irq == PCI_INVALID_IRQ) { in pci_pir_initial_irqs()
333 if (!pci_pir_valid_irq(pci_link, irq)) in pci_pir_initial_irqs()
337 pci_link->pl_id); in pci_pir_initial_irqs()
338 pci_link->pl_irq = irq; in pci_pir_initial_irqs()
339 pci_link->pl_routed = 1; in pci_pir_initial_irqs()
352 if (!pci_pir_valid_irq(pci_link, irq)) { in pci_pir_initial_irqs()
356 pci_link->pl_id); in pci_pir_initial_irqs()
357 } else if (!pci_pir_valid_irq(pci_link, pci_link->pl_irq)) { in pci_pir_initial_irqs()
361 pci_link->pl_id, pci_link->pl_irq); in pci_pir_initial_irqs()
362 pci_link->pl_irq = irq; in pci_pir_initial_irqs()
363 pci_link->pl_routed = 1; in pci_pir_initial_irqs()
368 pci_link->pl_id, pci_link->pl_irq); in pci_pir_initial_irqs()
381 struct pci_link *pci_link; in pci_pir_parse() local
414 TAILQ_FOREACH(pci_link, &pci_links, pl_links) { in pci_pir_parse()
416 "hw.pci.link.%#x.irq", pci_link->pl_id); in pci_pir_parse()
422 !pci_pir_valid_irq(pci_link, irq) && bootverbose) in pci_pir_parse()
425 irq, pci_link->pl_id); in pci_pir_parse()
426 pci_link->pl_routed = 0; in pci_pir_parse()
427 pci_link->pl_irq = irq; in pci_pir_parse()
439 TAILQ_FOREACH(pci_link, &pci_links, pl_links) { in pci_pir_parse()
440 if (!PCI_INTERRUPT_VALID(pci_link->pl_irq)) in pci_pir_parse()
442 pir_bios_irqs |= 1 << pci_link->pl_irq; in pci_pir_parse()
443 pir_interrupt_weight[pci_link->pl_irq] += in pci_pir_parse()
444 pci_link->pl_references; in pci_pir_parse()
488 struct pci_link *pci_link; in pci_pir_route_interrupt() local
495 pci_link = NULL; in pci_pir_route_interrupt()
499 lookup.pci_link_ptr = &pci_link; in pci_pir_route_interrupt()
501 if (pci_link == NULL) { in pci_pir_route_interrupt()
516 if (!PCI_INTERRUPT_VALID(pci_link->pl_irq)) { in pci_pir_route_interrupt()
517 if (pci_link->pl_irqmask != 0 && powerof2(pci_link->pl_irqmask)) in pci_pir_route_interrupt()
518 irq = ffs(pci_link->pl_irqmask) - 1; in pci_pir_route_interrupt()
520 irq = pci_pir_choose_irq(pci_link, in pci_pir_route_interrupt()
523 irq = pci_pir_choose_irq(pci_link, pir_bios_irqs); in pci_pir_route_interrupt()
525 irq = pci_pir_choose_irq(pci_link, in pci_pir_route_interrupt()
534 pci_link->pl_irq = irq; in pci_pir_route_interrupt()
538 if (!pci_link->pl_routed) { in pci_pir_route_interrupt()
540 pci_link->pl_irq); in pci_pir_route_interrupt()
543 if (error && !powerof2(pci_link->pl_irqmask)) { in pci_pir_route_interrupt()
547 pci_link->pl_routed = 1; in pci_pir_route_interrupt()
551 BUS_CONFIG_INTR(pir_device, pci_link->pl_irq, in pci_pir_route_interrupt()
556 pin - 1 + 'A', pci_link->pl_irq); in pci_pir_route_interrupt()
557 return (pci_link->pl_irq); in pci_pir_route_interrupt()
565 pci_pir_choose_irq(struct pci_link *pci_link, int irqmask) in pci_pir_choose_irq() argument
570 realmask = pci_link->pl_irqmask & irqmask; in pci_pir_choose_irq()
585 pci_link->pl_id); in pci_pir_choose_irq()
618 struct pci_link *pci_link; in pci_pir_dump_links() local
621 TAILQ_FOREACH(pci_link, &pci_links, pl_links) { in pci_pir_dump_links()
622 printf("%#4x %3d %c %3d ", pci_link->pl_id, in pci_pir_dump_links()
623 pci_link->pl_irq, pci_link->pl_routed ? 'Y' : 'N', in pci_pir_dump_links()
624 pci_link->pl_references); in pci_pir_dump_links()
625 pci_print_irqmask(pci_link->pl_irqmask); in pci_pir_dump_links()
689 struct pci_link *pci_link; in pir_resume() local
693 TAILQ_FOREACH(pci_link, &pci_links, pl_links) { in pir_resume()
694 if (!PCI_INTERRUPT_VALID(pci_link->pl_irq)) { in pir_resume()
695 KASSERT(!pci_link->pl_routed, in pir_resume()
697 pci_link->pl_id)); in pir_resume()
700 if (pci_link->pl_routed) { in pir_resume()
702 pd.link = pci_link->pl_id; in pir_resume()
706 pci_link->pl_id)); in pir_resume()
711 pci_link->pl_id, pci_link->pl_irq); in pir_resume()
713 pci_link->pl_irq); in pir_resume()
717 pci_link->pl_id); in pir_resume()