Still IRQ routing problems with bridged devices.

John Baldwin jhb at
Fri Jan 2 13:30:51 PST 2004

On 02-Jan-2004 Bernd Walter wrote:
> On Fri, Jan 02, 2004 at 02:19:53PM -0500, John Baldwin wrote:
>> On 01-Jan-2004 Bernd Walter wrote:
>> > On Thu, Jan 01, 2004 at 10:12:23AM -0700, M. Warner Losh wrote:
>> >> In message: <20040101155100.GF11668 at>
>> >>             Bernd Walter <ticso at> writes:
>> >> : On Wed, Dec 31, 2003 at 10:22:30PM -0700, M. Warner Losh wrote:
>> >> : > In message: <20040101013224.GC11668 at>
>> >> : >             Bernd Walter <ticso at> writes:
>> >> : > : The board is an old Asus T2P4 with 3 bridged cards and $PIR table.
>> >> : > : All IRQs behind bridges get bogusly IRQ4 instead of the right ones.
>> >> : > : Is this only a problem on some boards or do we have a general irq
>> >> : > : routing problem with bridges?
>> >> : > 
>> >> : > It is a problem with some bridges and PCI BIOS interrupt routing.
>> >> : 
>> >> : The intline registers are correct - that's what used to run since years.
>> >> : What has the kind of bridge to do with it?
>> >> 
>> >> just what the code does :-)
>> > 
>> > But bridges are handled generic so why would only some bridges show
>> > this problem?
>> > The bridges are 21050 types btw.
>> Sounds like a BIOS bug.  If a bridge isn't listed in the $PIR, we
>> use the barber-pole swizzle to route across it.  However, that is
> It can't know about my bridges because all of them are on cards and
> they wouldn't won't fit with just 7 entries.

Ok, if they are on cards, that is correct.

>> technically only defined for bridges on add-in cards.  The only
>> way we can tell if a bridge is on an add-in card is if it is not
>> listed either in ACPI's namespace with a _PRT or it is not listed
>> in the $PIR.  Part of teh problem is that we shouldn't be using
> It's not that simple.
> The chips behind the bridges are layed out to all use INTA on the
> primary bus, but INTA is correctly routed for non-bridged cards.
> I have no clue about $PIR and therefor have no idea where irq4 comes
> from - any pointer to $PIR documents are welcome.

Erm, according to the PCI spec, the devices behind the bridges on the
add-in cards will swizzle their interrupts.  Thus, device 8.0 will
use INTA on the add-in card's connect, 9.0 will use INTB for its
INTA, etc.  We use the $PIR to then figure out what IRQ to use for
INT[ABCD] on that slot as appropriate.  Thus, it would work something
like this:

 1) device 1.8.0 wants to route INTA so it asks the bridge for the IRQ
 2) the bridges translates that into INTA on itself, and asks its parent
    for a route to INTA at its slot (say 0.2.0).
 3) the host bridge lookes up 0.2.0 INTA in the $PIR, chooses an IRQ from
    the possible list (defaults to just using first IRQ) and returns it.
    This step should be skipping IRQ 4 adn using IRQ 10 or 11 instead

For device 1.9.0, the bridge translates that into 0.2.0 INTB.  Hope that
makes sense.


John Baldwin <jhb at>  <><
"Power Users Use the Power to Serve!"  -

More information about the freebsd-current mailing list