Re: Interrupt storm

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Fri, 8 Apr 2005 15:29:29 -0400
On Friday 08 April 2005 08:10 am, Antoine Brodin wrote:
> John Baldwin <jhb_at_FreeBSD.org> wrote:
> > Yes, I am.  However, what this is doing is going and looking to see if
> > the BIOS has programmed a valid IRQ into any of the devices routed by
> > this IRQ, and if so, we (currently) trust what the BIOS says over what
> > the link claims as far as what the best IRQ to use is.  If the BIOS is
> > just confused but the BIOS IRQ is still valid in _PRS then the fact that
> > we always do an _SRS means we are still ok.  The real problem here is
> > that for this machine, calling _DIS seems to permanently break the link
> > devices.  I think we'll have to add a quirk to disable calling _DIS.  I
> > wonder if Linux already has such a quirk for this box or if they are more
> > selective about how and when they call _DIS.
>
> Hi,
>
> I was wondering why ACPI pci link code from RELENG_5 worked (it called
> _DIS too) and I noticed this in my dmesg:
> - pci_link[0-14] are attached
> - then pci0, pcib0 and other devices are attached
> - then pci_link[15-31] are attached
> - then other devices are attached
>
> I thought that perhaps the problem was that _DIS was called after
> devices had already been attached and had allocated an irq.
>
> So I tried this patch:
>
> %%%
> Index: acpi_pci_link.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/dev/acpica/acpi_pci_link.c,v
> retrieving revision 1.44
> diff -u -p -r1.44 acpi_pci_link.c
> --- acpi_pci_link.c     18 Jan 2005 20:18:46 -0000      1.44
> +++ acpi_pci_link.c     8 Apr 2005 11:19:29 -0000
> _at__at_ -511,7 +511,8 _at__at_ acpi_pci_link_attach(device_t dev)
>  	 * run _DIS (i.e., the method doesn't exist), assume the initial
>  	 * IRQ was routed by the BIOS. */
> -	if (ACPI_SUCCESS(AcpiEvaluateObject(acpi_get_handle(dev), "_DIS", NULL,
> +	if (device_get_unit(dev) <= 14 &&
> +	    ACPI_SUCCESS(AcpiEvaluateObject(acpi_get_handle(dev), "_DIS", NULL,
>  	    NULL)))
>  		for (i = 0; i < sc->pl_num_links; i++)
>  			sc->pl_links[i].l_irq = PCI_INVALID_IRQ;
> %%%
>
> With this patch, sk0 uses irq9 but everything works fine (no timeouts,
> no interrupt storms).
> I don't know if my idea is totally silly or not ...
> Perhaps the pci links should be all attached before other devices are
> attached ?

I think your other link devices are meant to be used in APIC mode (note their 
names start with 'A') and thus I think they are aliases for the other link 
devices.  So when I turn off the alias, I turn off the non-APIC mode one as 
well.  Working BIOSen handle this by having the same link device change its 
behavior (different _PRS return values) depending on the PIC mode.  It's not 
easy to determine if a link is just not used (for example, if no card is 
plugged into a slot with a dedicated link) or if it's an alias.  I think 
having two ACPI devices alias to the same hardware is a bug in the BIOS 
though.  Perhaps your BIOS vendor can be convinced to fix this.  Can you see 
if Linux has the same problem btw?

-- 
John Baldwin <jhb_at_FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org
Received on Fri Apr 08 2005 - 17:42:31 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:31 UTC