DDI_INTR_ALLOC(9F)      Kernel Functions for Drivers      DDI_INTR_ALLOC(9F)
NAME
       ddi_intr_alloc, ddi_intr_free - allocate or free interrupts for a
       given interrupt type
SYNOPSIS
       #include <sys/types.h>
       #include <sys/conf.h>
       #include <sys/ddi.h>
       #include <sys/sunddi.h>       
int ddi_intr_alloc(
dev_info_t *dip, 
ddi_intr_handle_t *h_array, 
int type,            
int inum, 
int count, 
int *actualp, 
int behavior);       
int ddi_intr_free(
ddi_intr_handle_t h);
INTERFACE LEVEL
       illumos DDI specific (illumos DDI).
PARAMETERS
       ddi_intr_alloc()       dip                   Pointer to the 
dev_info structure       
h_array                   Pointer to an array of DDI interrupt handles       
type                   Interrupt type       
inum                   Interrupt number       
count                   Number of interrupts requested. The 
count should not
                   exceed the total number of interrupts supported by the
                   device, as returned by a call to 
ddi_intr_get_nintrs(9F).       
actualp                   Pointer to the number of interrupts actually allocated       
behavior                   Flag to determine the allocation algorithm       
ddi_intr_free()       h            DDI interrupt handle
DESCRIPTION
       The 
ddi_intr_alloc() function allocates interrupts of the interrupt
       type given by the 
type argument beginning at the interrupt number       
inum.  If 
ddi_intr_alloc() allocates any interrupts, it returns the
       actual number of interrupts allocated in the integer pointed to by
       the 
actualp argument and returns the number of interrupt handles in
       the interrupt handle array pointed to by the 
h_array argument.
       Specific interrupts are always specified by the combination of
       interrupt 
type and 
inum. For legacy devices, 
inum refers to the nth
       interrupt, typically as defined by the devices 
interrupts property.
       For PCI fixed interrupts, 
inum refers to the interrupt number. The       
inum is the relative interrupt vector number, from 
0 to 
31 for MSI,
       from 
0 to 
2047 for MSI-X. The first interrupt vector is 
0. The last
       relative vector is 
31 for MSI or 
2047 for MSI-X.
       The 
h_array must be pre-allocated by the caller as a 
count sized
       array of ddi_intr_handle_t's.
       If MSI interrupts are being allocated, the 
count argument passed
       should be a number between 
1 and 
32, specified as a power of two. If       
count is not specified as a power of two, the error 
DDI_EINVAL is
       returned.
       The behavior flag controls the interrupt allocation algorithm. It
       takes one of two input values: 
DDI_INTR_ALLOC_NORMAL or       
DDI_INTR_ALLOC_STRICT.  If the 
count value used is greater than       
NINTRs, then the call fails with 
DDI_EINVAL unconditionally. When set
       to 
DDI_INTR_ALLOC_STRICT, the call succeeds if and only if 
count       interrupts are allocated.  Otherwise, the call fails, and the number
       of available interrupts is returned in 
actualp. When set to       
DDI_INTR_ALLOC_NORMAL, the call succeeds if at least one interrupt is
       allocated, and the number of allocated interrupts is returned in
       actualp.
       The handle for each allocated interrupt, if any, is returned in the
       array of handles given by the 
h_array argument.
       The 
ddi_intr_free() function releases the system resources and
       interrupt vectors associated with the ddi_intr_handle_t 
h, including
       any resources associated with the handle 
h itself. Once freed, the
       handle 
h should not be used in any further calls.
       The 
ddi_intr_free() function should be called once for each handle in
       the handle array.
RETURN VALUES
       The 
ddi_intr_alloc() and 
ddi_intr_free() functions return:       
DDI_SUCCESS                            On success.       
DDI_EAGAIN                            Not enough interrupt resources.       
DDI_EINVAL                            On encountering invalid input parameters.       
DDI_INTR_NOTFOUND                            On failure to find the interrupt.       
DDI_FAILURE                            On any implementation specific failure.
CONTEXT
       The 
ddi_intr_alloc() and 
ddi_intr_free() functions can be called from
       kernel non-interrupt context.
ATTRIBUTES
       See 
attributes(7) for descriptions of the following attributes:
       +--------------------+-----------------+
       |  ATTRIBUTE TYPE    | ATTRIBUTE VALUE |
       +--------------------+-----------------+
       |Interface Stability | Committed       |
       +--------------------+-----------------+
SEE ALSO
       attributes(7), 
ddi_intr_add_handler(9F), 
ddi_intr_block_enable(9F),       
ddi_intr_disable(9F), 
ddi_intr_enable(9F), 
ddi_intr_get_cap(9F),       
ddi_intr_get_nintrs(9F), 
ddi_intr_get_pri(9F),       
ddi_intr_get_supported_types(9F), 
ddi_intr_remove_handler(9F)       Writing Device DriversNOTES
       Consumers of these interfaces should verify that the return value is
       not equal to 
DDI_SUCCESS. Incomplete checking for failure codes could
       result in inconsistent behavior among platforms.
       If a device driver that uses 
MSI and 
MSI-X interrupts resets the
       device, the device might reset its configuration space modifications.
       Such a reset could cause a device driver to lose any 
MSI and 
MSI-X       interrupt usage settings that have been applied.
                               April 23, 2008             DDI_INTR_ALLOC(9F)