Skip site navigation (1)Skip section navigation (2)
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>