Re: Interrupt storm

From: Nate Lawson <nate_at_root.org>
Date: Thu, 07 Apr 2005 10:43:15 -0700
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
> _at__at_ -621,14 +622,16 _at__at_
>  		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
Received on Thu Apr 07 2005 - 15:43:17 UTC

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