Date: Thu, 19 Feb 2004 10:43:26 -0800 (PST) From: Nate Lawson <nate@root.org> To: John Baldwin <jhb@FreeBSD.org> Cc: cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/i386/pci pci_pir.c Message-ID: <20040219104132.G41856@root.org> In-Reply-To: <20040218224027.4992016A4DA@hub.freebsd.org> References: <20040218224027.4992016A4DA@hub.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 18 Feb 2004, John Baldwin wrote: > Modified files: > sys/i386/pci pci_pir.c > Log: > Rework the $PIR (aka PCIBIOS) PCI interrupt routing code and split it off > into its own file: > - All of the $PIR interrupt routing is now done in a link-centric fashion. > When a host-PCI bridge that uses the $PIR attaches, it calls pir_parse() > to parse the table. This scans for link devices and merges all the masks > for each link device from the table entries. It then looks at the intline > register of PCI devices connected to a link to figure out if the BIOS has > routed this link and if so to which IRQ. > - The IRQ for any given link can be overridden via a hint like so: > 'hw.pci.link.0x62.irq=10' Any IRQ set in this matter is treated as if it > were set that way by the BIOS. > - We only call the BIOS to route each link device once. > - When a PCI device wants to route an interrupt, we look it up in the $PIR > to find the associated link. If the link is routed, we simply return the > IRQ it is using. If it is not routed, we have to pick one. This uses a > different algorithm from the old code. First off, when we try to pick > an interrupt from a mask of possible interrupts, we try to pick the one > that is least loaded as far as PCI devices. We maintain this weight based > on the number of devices attached to each link device. When choosing an > IRQ, we first attempt to route using any PCI only interrupts (the old > code did this as well). If that doesn't work, we try to use the list of > IRQs that the BIOS has used. This is a new step that the new code didn't > do and avoids using IRQ 3 or 4 for every virgin interrupt routing. If > none of the IRQs that the BIOS used worked, then we fall back to trying > anything. > - The fallback mask for !PC98 was fixed to include IRQ 3 and not allow IRQ > 2. > - We don't use the $PIR to route interrupts on a PCI-PCI bridge unless it > has already been used to route on at least one Host-PCI bridge. This > helps to avoid mixing and matching x86 firmware PCI interrupt routing > methods (which is a Bad Thing(tm)). > > Silence on: current@ > > Revision Changes Path > 1.109 +447 -611 src/sys/i386/pci/pci_pir.c This is great! Care to look at cleaning up the ACPI _PRT routing? I believe it prefers 3-4 initially for many common BIOSen too. -Nate
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040219104132.G41856>