----- Forwarded message from Gleb Natapov <g...@redhat.com> ----- From: Gleb Natapov <g...@redhat.com> To: Kevin O'Connor <ke...@koconnor.net> Date: Sun, 13 Dec 2009 17:07:48 +0200 Subject: Re: [...@virtutech.com: [coreboot] Seabios: PCI interrupt routing question]
On Thu, Dec 10, 2009 at 08:55:11AM -0500, Kevin O'Connor wrote: > FYI. > > ----- Forwarded message from Magnus Christensson <m...@virtutech.com> ----- > > From: Magnus Christensson <m...@virtutech.com> > To: coreb...@coreboot.org > Date: Fri, 27 Nov 2009 09:13:02 +0100 > Subject: [coreboot] Seabios: PCI interrupt routing question > > Hi, > > I have a question about the PCI INTx pin interrupt routing in Seabios. > > Specifically, what does the pci_slot_get_pirq function do? It looks like > it assigns different interrupt numbers to devices depending on their > device number. > This function implement the same logic as pci_swizzle_interrupt_pin() in Linux kernel. This logic defines how PCI bridge connects INTx of each devices behind it to system board interrupt line and it is part of PCI spec (page 30 of PCI3.0 spec). Note that the function return pin, not interrupt line. To get interrupt line we look into pci_irqs[] array. > But the interrupt routing in the southbridge maps a given INTx to the same > interrupt number regardless of the device number (that mapping is > initialized by the code with the "activate irq remapping in PIIX" comment). > > To me, this looks like the INTERRUPT_LINE would be set to a value that > does not match the actual interrupt routing (if (dev & 3) != 0). > The code is correct if QEMU does interrupt swizzling on PIIX3 chipset level. The code in incorrect if QEMU doesn't. Swizzling like this is done by PCI-to-PCI bridges according to PCI spec, root bridge doesn't do it AFAIK, so code looks suspicious, but not because of the reason stated above. -- Gleb. ----- End forwarded message -----