Lines Matching refs:link

50 ACPI_SERIAL_DECL(pci_link, "ACPI PCI link");
56 * An ACPI PCI link device may contain multiple links. Each link has its
57 * own ACPI resource. _PRT entries specify which link is being used via
86 struct link;
91 struct link *pl_links;
95 struct link {
209 struct link *link;
238 link = &req->sc->pl_links[req->link_index];
239 link->l_res_index = req->res_index;
240 link->l_crs_type = res->Type;
247 * when the link hasn't been programmed.
251 link->l_irq = res->Data.Irq.Interrupts[0];
253 link->l_irq = res->Data.ExtendedIrq.Interrupts[0];
256 * An IRQ of zero means that the link isn't routed.
258 if (link->l_irq == 0)
259 link->l_irq = PCI_INVALID_IRQ;
275 struct link *link;
314 link = &req->sc->pl_links[req->link_index];
315 if (link->l_res_index == -1) {
318 link->l_res_index = req->res_index;
327 tmp = &link->l_prs_template;
339 link->l_num_irqs =
344 link->l_num_irqs = res->Data.Irq.InterruptCount;
347 if (link->l_num_irqs == 0)
352 * valid IRQs are ISA IRQs, then mark this link as
355 link->l_isa_irq = true;
356 link->l_irqs = malloc(sizeof(int) * link->l_num_irqs,
358 for (i = 0; i < link->l_num_irqs; i++) {
360 link->l_irqs[i] = ext_irqs[i];
362 link->l_isa_irq = false;
364 link->l_irqs[i] = irqs[i];
366 link->l_isa_irq = false;
374 if (!req->sc->pl_crs_bad && !link->l_isa_irq &&
375 link->l_crs_type == ACPI_RESOURCE_TYPE_IRQ)
391 link_valid_irq(struct link *link, int irq)
402 for (i = 0; i < link->l_num_irqs; i++)
403 if (link->l_irqs[i] == irq)
410 if (link->l_isa_irq && AcpiGbl_FADT.SciInterrupt == irq &&
421 struct link *link;
432 link = &sc->pl_links[i];
434 link->l_irq, link->l_routed ? 'Y' : 'N',
435 link->l_references);
436 if (link->l_num_irqs == 0)
438 else for (j = 0; j < link->l_num_irqs; j++)
439 printf(" %d", link->l_irqs[j]);
459 * a link array to allocate. On some systems, _CRS is broken,
485 sc->pl_links = malloc(sizeof(struct link) * sc->pl_num_links,
546 * Try to disable this link. If successful, set the current IRQ to
547 * zero and flags to indicate this link is not routed. If we can't
620 * Find the link structure that corresponds to the resource index passed in
623 static struct link *
641 struct link *link;
662 link = acpi_pci_link_lookup(dev, index);
663 if (link == NULL) {
668 link->l_references++;
669 if (link->l_routed)
670 pci_link_interrupt_weights[link->l_irq]++;
674 * (8259As). Thus, if this link is routed via an ISA IRQ, go
675 * look to see if the BIOS routed an IRQ for this link at the
677 * this link and add that IRQ to our list of known-good IRQs.
678 * This provides a good work-around for link devices whose _CRS
683 * If this link is not routed via an ISA IRQ (because we are using
687 if (!link->l_isa_irq) {
700 if (!link_valid_irq(link, bios_irq)) {
703 } else if (!PCI_INTERRUPT_VALID(link->l_bios_irq)) {
704 link->l_bios_irq = bios_irq;
707 if (bios_irq != link->l_initial_irq &&
708 PCI_INTERRUPT_VALID(link->l_initial_irq))
711 bios_irq, link->l_initial_irq);
712 } else if (bios_irq != link->l_bios_irq)
716 link->l_bios_irq);
725 struct link *link;
743 /* Fill in IRQ resources via link structures. */
744 link = sc->pl_links;
774 if (PCI_INTERRUPT_VALID(link->l_irq)) {
775 KASSERT(link->l_irq < NUM_ISA_INTERRUPTS,
777 __func__, link->l_irq));
778 res->Data.Irq.Interrupts[0] = link->l_irq;
781 link++;
787 if (PCI_INTERRUPT_VALID(link->l_irq))
789 link->l_irq;
792 link++;
811 struct link *link;
816 link = sc->pl_links;
818 /* Add a new IRQ resource from each link. */
819 link = &sc->pl_links[i];
820 if (link->l_prs_template.Type == ACPI_RESOURCE_TYPE_IRQ) {
822 bcopy(&link->l_prs_template, &newres,
825 if (PCI_INTERRUPT_VALID(link->l_irq)) {
826 KASSERT(link->l_irq < NUM_ISA_INTERRUPTS,
828 __func__, link->l_irq));
829 newres.Data.Irq.Interrupts[0] = link->l_irq;
834 bcopy(&link->l_prs_template, &newres,
837 if (PCI_INTERRUPT_VALID(link->l_irq))
839 link->l_irq;
867 struct link *link;
892 link = sc->pl_links;
906 * weights if this link has a valid IRQ and was
909 if (!link->l_routed &&
910 PCI_INTERRUPT_VALID(link->l_irq)) {
911 link->l_routed = true;
913 pci_link_interrupt_weights[link->l_irq] +=
914 link->l_references;
916 link++;
936 * If all of our links are routed, then restore the link via _SRS,
937 * otherwise, disable the link via _DIS.
959 * Pick an IRQ to use for this unrouted link.
962 acpi_pci_link_choose_irq(device_t dev, struct link *link)
968 KASSERT(!link->l_routed, ("%s: link already routed", __func__));
969 KASSERT(!PCI_INTERRUPT_VALID(link->l_irq),
970 ("%s: link already has an IRQ", __func__));
976 "hw.pci.link.%s.%d.irq", link_name, link->l_res_index);
978 if (!link_valid_irq(link, i))
985 "hw.pci.link.%s.irq", link_name);
987 if (!link_valid_irq(link, i))
997 * says it routed over what _CRS says the link thinks is routed.
999 if (PCI_INTERRUPT_VALID(link->l_bios_irq))
1000 return (link->l_bios_irq);
1006 if (PCI_INTERRUPT_VALID(link->l_initial_irq))
1007 return (link->l_initial_irq);
1016 for (i = 0; i < link->l_num_irqs; i++) {
1017 pos_irq = link->l_irqs[i];
1032 if (link->l_isa_irq) {
1053 struct link *link;
1059 link = acpi_pci_link_lookup(dev, index);
1060 if (link == NULL)
1064 * If this link device is already routed to an interrupt, just return
1067 if (link->l_routed) {
1068 KASSERT(PCI_INTERRUPT_VALID(link->l_irq),
1069 ("%s: link is routed but has an invalid IRQ", __func__));
1071 return (link->l_irq);
1075 if (!PCI_INTERRUPT_VALID(link->l_irq)) {
1076 link->l_irq = acpi_pci_link_choose_irq(dev, link);
1082 if (PCI_INTERRUPT_VALID(link->l_irq)) {
1084 if (!link->l_routed)
1085 link->l_irq = PCI_INVALID_IRQ;
1090 return (link->l_irq);