DDI_PROP_OP(9F)         Kernel Functions for Drivers         DDI_PROP_OP(9F)
NAME
       ddi_prop_op, ddi_getprop, ddi_getlongprop, ddi_getlongprop_buf,
       ddi_getproplen - get property information for leaf device drivers
SYNOPSIS
       #include <sys/types.h>
       #include <sys/ddi.h>
       #include <sys/sunddi.h>       
int ddi_prop_op(
dev_t dev, 
dev_info_t *dip, 
ddi_prop_op_t prop_op,            
int flags, 
char *name, 
caddr_t valuep, 
int *lengthp);       
int ddi_getprop(
dev_t dev, 
dev_info_t *dip, 
int flags, 
char *name,             
int defvalue);       
int ddi_getlongprop(
dev_t dev, 
dev_info_t *dip, 
int flags, 
char *name,             
caddr_t valuep, 
int *lengthp);       
int ddi_getlongprop_buf(
dev_t dev, 
dev_info_t *dip, 
int flags, 
char *name,            
caddr_t valuep, 
int *lengthp);       
int ddi_getproplen(
dev_t dev, 
dev_info_t *dip, 
int flags, 
char *name,             
int *lengthp);
INTERFACE LEVEL
       illumos DDI specific (illumos DDI). The 
ddi_getlongprop(),       
ddi_getlongprop_buf(), 
ddi_getprop(), and 
ddi_getproplen() functions
       are obsolete. Use 
ddi_prop_lookup(9F) instead of 
ddi_getlongprop(),       
ddi_getlongprop_buf(), and 
ddi_getproplen(). Use 
ddi_prop_get_int(9F)       instead of 
ddi_getprop()PARAMETERS
       dev                   Device number associated with property or 
DDI_DEV_T_ANY                   as the 
wildcard device number.       
dip                   Pointer to a device info node.       
prop_op                   Property operator.       
flags                   Possible flag values are some combination of:                   
DDI_PROP_DONTPASS                                        do not pass request to parent device
                                        information node if property not
                                        found                   
DDI_PROP_CANSLEEP                                        the routine may sleep while
                                        allocating memory                   
DDI_PROP_NOTPROM                                        do not look at PROM properties
                                        (ignored on architectures that do
                                        not support PROM properties)       
name                   String containing the name of the property.       
valuep                   If 
prop_op is 
PROP_LEN_AND_VAL_BUF, this should be a
                   pointer to the users buffer. If 
prop_op is                   
PROP_LEN_AND_VAL_ALLOC, this should be the 
address of a
                   pointer.       
lengthp                   On exit, 
*lengthp will contain the property length. If                   
prop_op is 
PROP_LEN_AND_VAL_BUF then before calling                   
ddi_prop_op(), 
lengthp should point to an 
int that
                   contains the length of callers buffer.       
defvalue                   The value that 
ddi_getprop() returns if the property is
                   not found.
DESCRIPTION
       The 
ddi_prop_op() function gets arbitrary-size properties for leaf
       devices. The routine searches the device's property list. If it does
       not find the property at the device level, it examines the 
flags       argument, and if 
DDI_PROP_DONTPASS is set, then 
ddi_prop_op() returns       
DDI_PROP_NOT_FOUND. Otherwise, it passes the request to the next
       level of the device info tree. If it does find the property, but the
       property has been explicitly undefined, it returns       
DDI_PROP_UNDEFINED. Otherwise it returns either the property length,
       or both the length and value of the property to the caller via the       
valuep and 
lengthp pointers, depending on the value of 
prop_op, as
       described below, and returns 
DDI_PROP_SUCCESS. If a property cannot
       be found at all, 
DDI_PROP_NOT_FOUND is returned.
       Usually, the 
dev argument should be set to the actual device number
       that this property applies to.  However, if the 
dev argument is       
DDI_DEV_T_ANY, the 
wildcard dev, then 
ddi_prop_op() will match the
       request based on 
name only (regardless of the actual 
dev the property
       was created with). This property/dev match is done according to the
       property search order which is to first search software properties
       created by the driver in 
last-in, first-out (LIFO) order, next search
       software properties created by the 
system in LIFO order, then search
       PROM properties if they exist in the system architecture.
       Property operations are specified by the 
prop_op argument. If 
prop_op       is 
PROP_LEN, then 
ddi_prop_op() just sets the callers length,       
*lengthp, to the property length and returns the value       
DDI_PROP_SUCCESS to the caller. The 
valuep argument is not used in
       this case.  Property lengths are 
0 for boolean properties,       
sizeof(int) for integer properties, and size in bytes for long
       (variable size) properties.
       If 
prop_op is 
PROP_LEN_AND_VAL_BUF, then 
valuep should be a pointer
       to a user-supplied buffer whose length should be given in 
*lengthp by
       the caller.  If the requested property exists, 
ddi_prop_op() first
       sets 
*lengthp to the property length.  It then examines the size of
       the buffer supplied by the caller, and if it is large enough, copies
       the property value into that buffer, and returns 
DDI_PROP_SUCCESS. If
       the named property exists but the buffer supplied is too small to
       hold it, it returns 
DDI_PROP_BUF_TOO_SMALL.       If 
prop_op is 
PROP_LEN_AND_VAL_ALLOC, and the property is found,       
ddi_prop_op() sets 
*lengthp to the property length. It then attempts
       to allocate a buffer to return to the caller using the 
kmem_alloc(9F)       routine, so that memory can be later recycled using 
kmem_free(9F).
       The driver is expected to call 
kmem_free() with the returned address
       and size when it is done using the allocated buffer. If the
       allocation is successful, it sets 
*valuep to point to the allocated
       buffer, copies the property value into the buffer and returns       
DDI_PROP_SUCCESS. Otherwise, it returns 
DDI_PROP_NO_MEMORY. Note that
       the 
flags argument may affect the behavior of memory allocation in       
ddi_prop_op(). In particular, if 
DDI_PROP_CANSLEEP is set, then the
       routine will wait until memory is available to copy the requested
       property.
       The 
ddi_getprop() function returns boolean and integer-size
       properties.  It is a convenience wrapper for 
ddi_prop_op() with       
prop_op set to 
PROP_LEN_AND_VAL_BUF, and the buffer is provided by
       the wrapper. By convention, this function returns a 
1 for boolean
       (zero-length) properties.
       The 
ddi_getlongprop() function returns arbitrary-size properties. It
       is a convenience wrapper for 
ddi_prop_op() with 
prop_op set to       
PROP_LEN_AND_VAL_ALLOC, so that the routine will allocate space to
       hold the buffer that will be returned to the caller via 
*valuep.
       The 
ddi_getlongprop_buf() function returns arbitrary-size properties.
       It is a convenience wrapper for 
ddi_prop_op() with 
prop_op set to       
PROP_LEN_AND_VAL_BUF so the user must supply a buffer.
       The 
ddi_getproplen() function returns the length of a given property.
       It is a convenience wrapper for 
ddi_prop_op() with 
prop_op set to       
PROP_LEN.
RETURN VALUES
       The 
ddi_prop_op(), 
ddi_getlongprop(), 
ddi_getlongprop_buf(), and       
ddi_getproplen() functions return:       
DDI_PROP_SUCCESS                                 Property found and returned.       
DDI_PROP_NOT_FOUND                                 Property not found.       
DDI_PROP_UNDEFINED                                 Property already explicitly undefined.       
DDI_PROP_NO_MEMORY                                 Property found, but unable to allocate
                                 memory. 
lengthp points to the correct
                                 property length.       
DDI_PROP_BUF_TOO_SMALL                                 Property found, but the supplied buffer is
                                 too small. 
lengthp points to the correct
                                 property length.
       The 
ddi_getprop() function returns:
       The value of the property or the value passed into the routine as       
defvalue if the property is not found. By convention, the value of
       zero length properties (boolean properties) are returned as the
       integer value 1.
CONTEXT
       These functions can be called from user, interrupt, or kernel
       context, provided 
DDI_PROP_CANSLEEP is not set; if it is set, they
       cannot be called from interrupt context.
ATTRIBUTES
       See 
attributes(7) for a description of the following attributes:
       +----------------+------------------------+
       |ATTRIBUTE TYPE  |    ATTRIBUTE VALUE     |
       +----------------+------------------------+
       |Stability Level | 
ddi_getlongprop(),     |
       |                | 
ddi_getlongprop_buf(), |
       |                | 
ddi_getprop(), and     |
       |                | 
ddi_getproplen()       |
       |                | functions are Obsolete |
       +----------------+------------------------+
SEE ALSO
       attributes(7), 
ddi_prop_create(9F), 
ddi_prop_get_int(9F),       
ddi_prop_lookup(9F), 
kmem_alloc(9F), 
kmem_free(9F)       Writing Device Drivers                              January 16, 2006               DDI_PROP_OP(9F)