Date: Tue, 5 Apr 2005 11:10:35 -0400 From: John Baldwin <jhb@FreeBSD.org> To: freebsd-current@FreeBSD.org Cc: Antoine Brodin <antoine.brodin@laposte.net> Subject: Re: Interrupt storm Message-ID: <200504051110.35735.jhb@FreeBSD.org> In-Reply-To: <20050402234142.440b3449.antoine.brodin@laposte.net> References: <b37cb09705032911295ce15f84@mail.gmail.com> <424EF205.6010202@root.org> <20050402234142.440b3449.antoine.brodin@laposte.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Saturday 02 April 2005 04:41 pm, Antoine Brodin wrote: > Nate Lawson <nate@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@FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" = http://www.FreeBSD.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200504051110.35735.jhb>