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 Drivers

NOTES


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)

tribblix@gmail.com :: GitHub :: Privacy