Interrupt storm
John Baldwin
jhb at FreeBSD.org
Tue Apr 5 08:11:41 PDT 2005
On Saturday 02 April 2005 04:41 pm, Antoine Brodin wrote:
> Nate Lawson <nate at root.org> wrote:
> > I'm a little confused. I don't know of anyone that has problems with
> > the 6-current PCI irq code that works on 5-stable (which is what your
> > cvs command updates it to).
> >
> > Do either of you have a problem with irq routing on 6-current that works
> > on 5-stable? Please send details if so.
>
> Hi,
>
> I have this problem too, but since it's on a desktop I didn't really
> care about acpi.
>
> Here are some details:
>
> current with pci irq code from 23-Nov-2004 dmesg:
> http://bsd.miki.eu.org/~antoine/current+oldacpi.dmesg
>
> current with current pci irq code dmesg:
> http://bsd.miki.eu.org/~antoine/current+acpi.dmesg
> (there are timeouts and interrupt storms)
>
> acpi tables and asl:
> http://bsd.miki.eu.org/~antoine/acpidump
So the differences in actual IRQ assignments look like this:
13c13
< pcib1: slot 4 INTA routed to irq 5 via \\_SB_.PCI0.LNK2
---
> pcib1: slot 4 INTA routed to irq 9 via \\_SB_.PCI0.LNK2
15,16c15,16
< pcib1: slot 7 INTA is already routed to irq 12
< pcib1: slot 10 INTA routed to irq 11 via \\_SB_.PCI0.LNK1
---
> pcib1: slot 7 INTA routed to irq 12 via \\_SB_.PCI0.LNK4
> pcib1: slot 10 INTA routed to irq 12 via \\_SB_.PCI0.LNK1
That is, LNK2 is routed to 9 rather than 5 and LNK1 is routed to 12 rather
than 11.
I'm not sure why it does this unless somehow the wrong device_t is getting
associated with a handle.
> grep 'LNK[12]' current+acpi.dmesg
pci_link10: <ACPI PCI Link LNK1> irq 11 on acpi0
pci_link11: <ACPI PCI Link LNK2> irq 5 on acpi0
pcib1: matched entry for 1.4.INTA (src \\_SB_.PCI0.LNK2:0)
pcib1: slot 4 INTA routed to irq 9 via \\_SB_.PCI0.LNK2
pcib1: matched entry for 1.10.INTA (src \\_SB_.PCI0.LNK1:0)
pcib1: slot 10 INTA routed to irq 12 via \\_SB_.PCI0.LNK1
Can you apply this patch and provide a non-verbose dmesg?
--- //depot/vendor/freebsd/src/sys/dev/acpica/acpi_pci_link.c 2005/01/18
20:21:25
+++ //depot/user/jhb/acpipci/dev/acpica/acpi_pci_link.c 2005/04/05 15:07:33
@@ -913,15 +914,20 @@
* If we have a valid BIOS IRQ, use that. We trust what the BIOS
* says it routed over what _CRS says the link thinks is routed.
*/
- if (PCI_INTERRUPT_VALID(link->l_bios_irq))
+ if (PCI_INTERRUPT_VALID(link->l_bios_irq)) {
+ device_printf(dev, "Using BIOS IRQ %d\n", link->l_bios_irq);
return (link->l_bios_irq);
+ }
/*
* If we don't have a BIOS IRQ but do have a valid IRQ from _CRS,
* then use that.
*/
- if (PCI_INTERRUPT_VALID(link->l_initial_irq))
+ if (PCI_INTERRUPT_VALID(link->l_initial_irq)) {
+ device_printf(dev, "Using initial IRQ %d\n",
+ link->l_initial_irq);
return (link->l_initial_irq);
+ }
/*
* Ok, we have no useful hints, so we have to pick from the
@@ -955,7 +961,7 @@
}
}
- if (bootverbose) {
+ if (bootverbose || 1) {
if (PCI_INTERRUPT_VALID(best_irq))
device_printf(dev, "Picked IRQ %u with weight %d\n",
best_irq, best_weight);
@@ -969,6 +975,9 @@
{
struct link *link;
+ device_printf(dev, "Routing index %d\n", index);
+ device_printf(dev, "My handle maps to %s\n",
+ acpi_name(acpi_get_handle(dev));
ACPI_SERIAL_BEGIN(pci_link);
link = acpi_pci_link_lookup(dev, index);
if (link == NULL)
@@ -982,6 +991,7 @@
KASSERT(PCI_INTERRUPT_VALID(link->l_irq),
("%s: link is routed but has an invalid IRQ", __func__));
ACPI_SERIAL_END(pci_link);
+ device_printf(dev, "Already routed to %d\n", link->l_irq);
return (link->l_irq);
}
--- //depot/vendor/freebsd/src/sys/dev/acpica/acpi_pcib.c 2005/03/08 17:25:15
+++ //depot/user/jhb/acpipci/dev/acpica/acpi_pcib.c 2005/04/05 15:09:09
@@ -225,7 +225,7 @@
}
prt = pr.pr_entry;
- if (bootverbose) {
+ if (bootverbose || 1) {
device_printf(pcib, "matched entry for %d.%d.INT%c",
pci_get_bus(dev), pci_get_slot(dev), 'A' + pin);
if (prt->Source != NULL && prt->Source[0] != '\0')
@@ -259,7 +259,7 @@
interrupt = acpi_pci_link_route_interrupt(acpi_get_device(lnkdev),
prt->SourceIndex);
- if (bootverbose && PCI_INTERRUPT_VALID(interrupt))
+ if (/* bootverbose &&*/ PCI_INTERRUPT_VALID(interrupt))
device_printf(pcib, "slot %d INT%c routed to irq %d via %s\n",
pci_get_slot(dev), 'A' + pin, interrupt, acpi_name(lnkdev));
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the freebsd-current
mailing list