DDI Interrupt Functions
The Solaris OS provides a framework for registering and unregistering interrupts and provides
support for Message Signaled Interrupts (MSIs). Interrupt management interfaces enable you to manipulate
priorities, capabilities, and interrupt masking, and to obtain pending information.
Interrupt Capability Functions
Use the following functions to obtain interrupt information:
- ddi_intr_get_navail(9F)
Returns the number of interrupts available for a specified hardware device and interrupt type.
- ddi_intr_get_nintrs(9F)
Returns the number of interrupts that the device supports for the specified interrupt type.
- ddi_intr_get_supported_types(9F)
Returns the hardware interrupt types that are supported by both the device and the host.
- ddi_intr_get_cap(9F)
Returns interrupt capability flags for the specified interrupt.
Interrupt Initialization and Destruction Functions
Use the following functions to create and remove interrupts:
- ddi_intr_alloc(9F)
Allocates system resources and interrupt vectors for the specified type of interrupt.
- ddi_intr_free(9F)
Releases the system resources and interrupt vectors for a specified interrupt handle.
- ddi_intr_set_cap(9F)
Sets the capability of the specified interrupt through the use of the DDI_INTR_FLAG_LEVEL and DDI_INTR_FLAG_EDGE flags.
- ddi_intr_add_handler(9F)
Adds an interrupt handler.
- ddi_intr_dup_handler(9F)
Use with MSI-X only. Copies an address and data pair for an allocated interrupt vector to an unused interrupt vector on the same device.
- ddi_intr_remove_handler(9F)
Removes the specified interrupt handler.
- ddi_intr_enable(9F)
Enables the specified interrupt.
- ddi_intr_disable(9F)
Disables the specified interrupt.
- ddi_intr_block_enable(9F)
Use with MSI only. Enables the specified range of interrupts.
- ddi_intr_block_disable(9F)
Use with MSI only. Disables the specified range of interrupts.
- ddi_intr_set_mask(9F)
Sets an interrupt mask if the specified interrupt is enabled.
- ddi_intr_clr_mask(9F)
Clears an interrupt mask if the specified interrupt is enabled.
- ddi_intr_get_pending(9F)
Reads the interrupt pending bit if such a bit is supported by either the host bridge or the device.
Priority Management Functions
Use the following functions to obtain and set priority information:
- ddi_intr_get_pri(9F)
Returns the current software priority setting for the specified interrupt.
- ddi_intr_set_pri(9F)
Sets the interrupt priority level for the specified interrupt.
- ddi_intr_get_hilevel_pri(9F)
Returns the minimum priority level for a high-level interrupt.
Soft Interrupt Functions
Use the following functions to manipulate soft interrupts and soft interrupt handlers:
- ddi_intr_add_softint(9F)
Adds a soft interrupt handler.
- ddi_intr_trigger_softint(9F)
Triggers the specified soft interrupt.
- ddi_intr_remove_softint(9F)
Removes the specified soft interrupt handler.
- ddi_intr_get_softint_pri(9F)
Returns the soft interrupt priority for the specified interrupt.
- ddi_intr_set_softint_pri(9F)
Changes the relative soft interrupt priority for the specified soft interrupt.
Interrupt Function Examples
This section provides examples for performing the following tasks:
Example 8-1 Changing Soft Interrupt Priority
Use the ddi_intr_set_softint_pri(9F) function to change the soft interrupt priority to 9.
if (ddi_intr_set_softint_pri(mydev->mydev_softint_hdl, 9) != DDI_SUCCESS)
cmn_err (CE_WARN, "ddi_intr_set_softint_pri failed");
Example 8-2 Checking for Pending Interrupts
Use the ddi_intr_get_pending(9F) function to check whether an interrupt is pending.
if (ddi_intr_get_pending(mydevp->htable[0], &pending) != DDI_SUCCESS)
cmn_err(CE_WARN, "ddi_intr_get_pending() failed");
else if (pending)
cmn_err(CE_NOTE, "ddi_intr_get_pending(): Interrupt pending");
Example 8-3 Setting Interrupt Masks
Use the ddi_intr_set_mask(9F) function to set interrupt masking to prevent the device from
receiving interrupts.
if ((ddi_intr_set_mask(mydevp->htable[0]) != DDI_SUCCESS))
cmn_err(CE_WARN, "ddi_intr_set_mask() failed");
Example 8-4 Clearing Interrupt Masks
Use the ddi_intr_clr_mask(9F) function to clear interrupt masking. The ddi_intr_clr_mask(9F) function fails
if the specified interrupt is not enabled. If the ddi_intr_clr_mask(9F) function succeeds, the
device starts generating interrupts.
if (ddi_intr_clr_mask(mydevp->htable[0]) != DDI_SUCCESS)
cmn_err(CE_WARN, "ddi_intr_clr_mask() failed");