DDI_PROP_CREATE(9F) Kernel Functions for Drivers DDI_PROP_CREATE(9F)


NAME


ddi_prop_create, ddi_prop_modify, ddi_prop_remove, ddi_prop_remove_all,
ddi_prop_undefine - create, remove, or modify properties for leaf device
drivers

SYNOPSIS


#include <sys/conf.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>

int ddi_prop_create(dev_t dev, dev_info_t *dip, int flags,
char *name, caddr_t valuep, int length);


int ddi_prop_undefine(dev_t dev, dev_info_t *dip, int flags,
char *name);


int ddi_prop_modify(dev_t dev, dev_info_t *dip, int flags,
char *name, caddr_t valuep, int length);


int ddi_prop_remove(dev_t dev, dev_info_t *dip, char *name);


void ddi_prop_remove_all(dev_info_t *dip);


INTERFACE LEVEL


illumos DDI specific (illumos DDI). The ddi_prop_create() and
ddi_prop_modify() functions are obsolete. Use ddi_prop_update(9F) instead
of these functions.

PARAMETERS


ddi_prop_create()

dev
dev_t of the device.


dip
dev_info_t pointer of the device.


flags
flag modifiers. The only possible flag value is
DDI_PROP_CANSLEEP: Memory allocation may sleep.


name
name of property.


valuep
pointer to property value.


length
property length.


ddi_prop_undefine()

dev
dev_t of the device.


dip
dev_info_t pointer of the device.


flags
flag modifiers. The only possible flag value is
DDI_PROP_CANSLEEP: Memory allocation may sleep.


name
name of property.


ddi_prop_modify()

dev
dev_t of the device.


dip
dev_info_t pointer of the device.


flags
flag modifiers. The only possible flag value is
DDI_PROP_CANSLEEP: Memory allocation may sleep.


name
name of property.


valuep
pointer to property value.


length
property length.


ddi_prop_remove()

dev
dev_t of the device.


dip
dev_info_t pointer of the device.


name
name of property.


ddi_prop_remove_all()

dip
dev_info_t pointer of the device.


DESCRIPTION


Device drivers have the ability to create and manage their own properties
as well as gain access to properties that the system creates on behalf of
the driver. A driver uses ddi_getproplen(9F) to query whether or not a
specific property exists.


Property creation is done by creating a new property definition in the
driver's property list associated with dip.


Property definitions are stacked; they are added to the beginning of the
driver's property list when created. Thus, when searched for, the most
recent matching property definition will be found and its value will be
return to the caller.


The individual functions are described as follows:

ddi_prop_create()
ddi_prop_create() adds a property to the
device's property list. If the property is not
associated with any particular dev but is
associated with the physical device itself, then
the argument dev should be the special device
DDI_DEV_T_NONE. If you do not have a dev for
your device (for example during attach(9E)
time), you can create one using makedevice(9F)
with a major number of DDI_MAJOR_T_UNKNOWN.
ddi_prop_create() will then make the correct dev
for your device.

For boolean properties, you must set length to
0. For all other properties, the length argument
must be set to the number of bytes used by the
data structure representing the property being
created.

Note that creating a property involves
allocating memory for the property list, the
property name and the property value. If flags
does not contain DDI_PROP_CANSLEEP,
ddi_prop_create() returns DDI_PROP_NO_MEMORY on
memory allocation failure or DDI_PROP_SUCCESS if
the allocation succeeded. If DDI_PROP_CANSLEEP
was set, the caller may sleep until memory
becomes available.


ddi_prop_undefine()
ddi_prop_undefine() is a special case of
property creation where the value of the
property is set to undefined. This property has
the effect of terminating a property search at
the current devinfo node, rather than allowing
the search to proceed up to ancestor devinfo
nodes. However, ddi_prop_undefine() will not
terminate a search when the ddi_prop_get_int(9F)
or ddi_prop_lookup(9F) routines are used for
lookup of 64-bit property value. See
ddi_prop_op(9F).

Note that undefining properties does involve
memory allocation, and therefore, is subject to
the same memory allocation constraints as
ddi_prop_create().


ddi_prop_modify()
ddi_prop_modify() modifies the length and the
value of a property. If ddi_prop_modify() finds
the property in the driver's property list,
allocates memory for the property value and
returns DDI_PROP_SUCCESS. If the property was
not found, the function returns
DDI_PROP_NOT_FOUND.

Note that modifying properties does involve
memory allocation, and therefore, is subject to
the same memory allocation constraints as
ddi_prop_create().


ddi_prop_remove()
ddi_prop_remove() unlinks a property from the
device's property list. If ddi_prop_remove()
finds the property (an exact match of both name
and dev), it unlinks the property, frees its
memory, and returns DDI_PROP_SUCCESS, otherwise,
it returns DDI_PROP_NOT_FOUND.


ddi_prop_remove_all()
ddi_prop_remove_all() removes the properties of
all the dev_t's associated with the dip. It is
called before unloading a driver.


RETURN VALUES


The ddi_prop_create() function returns the following values:

DDI_PROP_SUCCESS
On success.


DDI_PROP_NO_MEMORY
On memory allocation failure.


DDI_PROP_INVAL_ARG
If an attempt is made to create a property with dev
equal to DDI_DEV_T_ANY or if name is NULL or name
is the NULL string.


The ddi_prop_undefine() function returns the following values:

DDI_PROP_SUCCESS
On success.


DDI_PROP_NO_MEMORY
On memory allocation failure.


DDI_PROP_INVAL_ARG
If an attempt is made to create a property with dev
DDI_DEV_T_ANY or if name is NULL or name is the
NULL string.


The ddi_prop_modify() function returns the following values:

DDI_PROP_SUCCESS
On success.


DDI_PROP_NO_MEMORY
On memory allocation failure.


DDI_PROP_INVAL_ARG
If an attempt is made to create a property with dev
equal to DDI_DEV_T_ANY or if name is NULL or name
is the NULL string.


DDI_PROP_NOT_FOUND
On property search failure.


The ddi_prop_remove() function returns the following values:

DDI_PROP_SUCCESS
On success.


DDI_PROP_INVAL_ARG
If an attempt is made to create a property with dev
equal to DDI_DEV_T_ANY or if name is NULL or name
is the NULL string.


DDI_PROP_NOT_FOUND
On property search failure.


CONTEXT


If DDI_PROP_CANSLEEP is set, these functions can cannot be called from
interrupt context. Otherwise, they can be called from user, interrupt, or
kernel context.

EXAMPLES


Example 1: Creating a Property




The following example creates a property called nblocks for each
partition on a disk.


int propval = 8192;

for (minor = 0; minor < 8; minor ++) {
(void) ddi_prop_create(makedevice(DDI_MAJOR_T_UNKNOWN, minor),
dev, DDI_PROP_CANSLEEP, "nblocks", (caddr_t) &propval,
sizeof (int));
...
}


ATTRIBUTES


See attributes(7) for a description of the following attributes:


+----------------+-----------------------+
|ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+----------------+-----------------------+
|Stability Level | ddi_prop_create() and |
| | ddi_prop_modify() are |
| | Obsolete |
+----------------+-----------------------+

SEE ALSO


driver.conf(5), attributes(7), attach(9E), ddi_getproplen(9F),
ddi_prop_op(9F), ddi_prop_update(9F), makedevice(9F)


Writing Device Drivers


June 20, 2021 DDI_PROP_CREATE(9F)