Date: Thu, 07 Apr 2005 10:43:15 -0700 From: Nate Lawson <nate@root.org> To: John Baldwin <jhb@FreeBSD.org> Cc: Antoine Brodin <antoine.brodin@laposte.net> Subject: Re: Interrupt storm Message-ID: <42557133.2070802@root.org> In-Reply-To: <200504051349.13620.jhb@FreeBSD.org> References: <b37cb09705032911295ce15f84@mail.gmail.com> <200504051110.35735.jhb@FreeBSD.org> <20050405185831.2484695e.antoine.brodin@laposte.net> <200504051349.13620.jhb@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
John Baldwin wrote: > Ok, I see the issue now. The problem is that the BIOS sets the IRQ registers > in the PCI devices to values that don't match how the links are programmed > and we tend to trust the BIOS over the links in those cases. Can you tell me > what IRQ sk0 gets if you don't use ACPI? Does it get 5 or 9? If it gets 9, > does it work ok? > > You can try this patch for ACPI. Unfortunately, some BIOSes lie when you ask > a link which IRQ it is routed to, so I'm not sure if this patch can be > committed as is. Nate, do you know if such BIOSen only return no IRQ at all > (0 or 255) when they lie rather than a bogus "valid" IRQ? > > --- //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 17:46:46 > @@ -621,14 +622,16 @@ > device_printf(dev, "BIOS IRQ %u for %d.%d.INT%c is invalid\n", > bios_irq, pcib_get_bus(pcib), slot, pin + 'A'); > } else if (!PCI_INTERRUPT_VALID(link->l_bios_irq)) { > - link->l_bios_irq = bios_irq; > - if (bios_irq < NUM_ISA_INTERRUPTS) > - pci_link_bios_isa_irqs |= (1 << bios_irq); > if (bios_irq != link->l_initial_irq && > PCI_INTERRUPT_VALID(link->l_initial_irq)) > device_printf(dev, > "BIOS IRQ %u does not match initial IRQ %u\n", > bios_irq, link->l_initial_irq); > + else { > + link->l_bios_irq = bios_irq; > + if (bios_irq < NUM_ISA_INTERRUPTS) > + pci_link_bios_isa_irqs |= (1 << bios_irq); > + } > } else if (bios_irq != link->l_bios_irq) > device_printf(dev, > "BIOS IRQ %u for %d.%d.INT%c does not match previous BIOS IRQ %u\n", When link devices are uninitialized by the BIOS, you usually get an invalid IRQ (i.e. 255 or 0). However, there are some cases where you get a valid PCI irq but invalid for this system (i.e. not in the supported ones advertised by _PRS). For instance, you might get a value of 15 for a link that only supports 3,4,5,6,7,9, etc. I think you should be checking _PRS for validity, not just PCI_INTERRUPT_VALID (i.e. !255). Aren't you doing that already? -- Nate
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?42557133.2070802>