can someone explain...[ PCI interrupts]

John Baldwin jhb at freebsd.org
Wed Dec 7 06:06:53 PST 2005


On Wednesday 07 December 2005 02:20 am, Darren Pilgrim wrote:
> From: John Baldwin
>
> > The reason [for masking interrupts] is that PCI interrupts are level
> > triggered, so they won't "shut up" until the ISR has run and pacified
> > the PCI device.
>
> But PCI interrupts can be programmed either level- or edge-triggered, so
> wouldn't programming to edge-triggered interrupts solve the "they won't
> shut up" issue?

No, PCI interrupts are level triggered.  Individual APIC pins can be 
programmed to be edge-triggered, sure.  However, then interrupts stop working 
if 2 devices are sharing a line and one interrupts after the other has 
already interrupted and after the second device's ISR has already run.  In 
this case, the ithread will finish and go back to sleep waiting for an 
interrupt.  However, since the ISR for the second device wasn't run after 
that device asserted its interrupt pin, the second device will keep the pin 
pulled low forever, so there will never be a hi -> low transition that the 
APIC pin would post an interrupt for and that intpin and all attached devices 
are effectively dead.

-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the freebsd-current mailing list