ID32_ALLOC(9F)          Kernel Functions for Drivers          ID32_ALLOC(9F)
NAME
       id32_alloc, id32_free, id32_lookup - 32-bit driver ID management
       routines
SYNOPSIS
       #include <sys/ddi.h>
       #include <sys/id32.h>       
uint32_t id32_alloc(
void *ptr, 
int flag);       
void id32_free(
uint32_t token);       
void *id32_lookup(
uint32_t token);
INTERFACE LEVEL
       illumos architecture specific (illumos DDI).
PARAMETERS
       ptr                any valid 32- or 64-bit pointer       
flag                determines whether caller can sleep for memory (see                
kmem_alloc(9F) for a description)
DESCRIPTION
       These routines were originally developed so that device drivers could
       manage 64-bit pointers on devices that save space only for 32-bit
       pointers.
       Many device drivers need to pass a 32-bit value to the hardware when
       attempting I/O.  Later, when that I/O completes, the only way the
       driver has to identify the request that generated that I/O is via a
       "token". When the I/O is initiated, the driver passes this token to
       the hardware. When the I/O completes the hardware passes back this
       32-bit token.
       Before illumos supported 64-bit pointers, device drivers just passed
       a raw 32-bit pointer to the hardware. When pointers grew to be 64
       bits this was no longer possible. The 
id32_*() routines were created
       to help drivers translate between 64-bit pointers and a 32-bit token.
       Given a 32- or 64-bit pointer, the routine 
id32_alloc() allocates a
       32-bit token, returning 0 if 
KM_NOSLEEP was specified and memory
       could not be allocated. The allocated token is passed back to       
id32_lookup() to obtain the original 32- or 64-bit pointer.
       The routine 
id32_free() is used to free an allocated token. Once       
id32_free() is called, the supplied token is no longer valid.
       Note that these routines have some degree of error checking. This is
       done so that an invalid token passed to 
id32_lookup() will not be
       accepted as valid. When 
id32_lookup() detects an invalid token it
       returns NULL.  Calling routines should check for this return value so
       that they do not try to dereference a NULL pointer.
CONTEXT
       These functions can be called from user or interrupt context. The
       routine 
id32_alloc() should not be called from interrupt context when
       the 
KM_SLEEP flag is passed in. All other routines can be called from
       interrupt or kernel context.
SEE ALSO
       kmem_alloc(9F)       Writing Device Drivers                              December 12, 2001               ID32_ALLOC(9F)