Interrupt Trigger

There are two types of trigger mechanisms, level-triggered interrupts and edge-triggered interrupts.

All ISA and VDEVICE interrupts are edge-triggered. PCI/PCIX and PCI-E buses define two types of interrupts, Level Signalled Interrupts (LSI) and Message Signalled Interrupts (MSI). LSIs are level-triggered, and MSIs are edge-triggered. PCI/PCIX device drivers in AIX® must handle only level-triggered interrupts even though edge-triggered interrupts using MSIs are supported by PCIX. Similarly, even though PCI-E supports LSI interrupts, all PCI-E interrupts are MSIs only in AIX, and are therefore edge-triggered. Consequently, all PCI-E device drivers for AIX are required to handle only edge-triggered interrupts.

A key difference between the edge-triggered and level-triggered interrupts is interrupt sharing. Level-triggered interrupts can be shared. Edge-triggered interrupts cannot be shared. Because they cannot be shared, edge-triggered interrupt handlers should pass the INTR_EDGE flag on the i_init() kernel service.

Another difference between the edge-triggered and level-triggered interrupts is in issuing the End of Interrupt (EOI). For level-triggered interrupts, the AIX kernel issues the EOI. For ISA edge-triggered interrupts, the AIX kernel also issues EOI. However, for the VDEVICE and PCI-E edge-triggered interrupts, the device driver must issue the EOI before returning from the interrupt handler. The VDEVICE and PCI-E drivers can use the i_eoi() kernel service to accomplish this.
Note: During the processing of i_eoi(), there is a brief period of time in which a newly arrived interrupt could also be issued an EOI. Therefore, it is necessary to check for additional work between a call to i_eoi() and the return from the interrupt handler.