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)