Manpages

NAME

libdevinfo − library of device information functions

SYNOPSIS

cc [flag ...] file ...-ldevinfo [library ...]
#include <libdevinfo.h>

DESCRIPTION

The libdevinfo library contains a set of interfaces for accessing device configuration data.

Device configuration data is organized as a tree of device nodes, defined as di_node_t in the libdevinfo interfaces. Each di_node_t represents a physical or logical (pseudo) device. Three types of data are associated with device nodes:

data defined for all device nodes (attributes)

properties specific to each device

minor node data

All device nodes have a set of common attributes, such as a node name, an instance number, and a driver binding name. Common device node attributes are accessed by calling interfaces listed on the di_binding_name(3DEVINFO) man page. Each device node also has a physical path, which is accessed by calling di_devfs_path(3DEVINFO).

Properties provide device specific information for device configuration and usage. Properties may be defined by software (di_prop_t) or by firmware (di_prom_prop_t). One way to access each di_prop_t is to make successive calls to di_prop_next(3DEVINFO) until DI_PROP_NIL is returned. For each di_prop_t, use interfaces on the di_prop_bytes(3DEVINFO) man page to obtain property names and values. Another way to access these properties is to call di_prop_lookup_bytes(3DEVINFO) to find the value of a property with a given name. Accessing a di_prom_prop_t is similar to accessing a di_prop_t, except that the interface names start with di_prom_prop and additional calls to di_prom_init(3DEVINFO) and di_prom_fini(3DEVINFO) are required.

Minor nodes contain information exported by the device for creating special files for the device. Each device node has 0 or more minor nodes associated with it. A list minor nodes (di_minor_t) may be obtained by making successive calls to di_minor_next(3DEVINFO) until DI_MINOR_NIL is returned. For each minor node, di_minor_devt(3DEVINFO) and related interfaces are called to get minor node data.

Using libdevinfo involves three steps:

Creating a snapshot of the device tree

Traversing the device tree to get information of interest

Destroying the snapshot of the device tree

A snapshot of the device tree is created by calling di_init(3DEVINFO) and destroyed by calling di_fini(3DEVINFO). An application can specify the data to be included in the snapshot (full or partial tree, include or exclude properties and minor nodes) and get a handle to the root of the device tree. See di_init(3DEVINFO) for details. The application then traverses the device tree in the snapshot to obtain device configuration data.

The device tree is normally traversed through parent-child-sibling linkage. Each device node contains references to its parent, its next sibling, and the first of its children. Given the di_node_t returned from di_init(3DEVINFO), one can find all children by first calling di_child_node(3DEVINFO), followed by successive calls to di_sibling_node(3DEVINFO), until DI_NODE_NIL is returned. By following this procedure recursively, an application can visit all device nodes contained in the snapshot. Two interfaces, di_walk_node(3DEVINFO) and di_walk_minor(3DEVINFO), are provided to facilitate device tree traversal. The di_walk_node(3DEVINFO) interface visits all device nodes and executes a user-supplied callback function for each node visited. The di_walk_minor(3DEVINFO) does the same for each minor node in the device tree.

An alternative way to traverse the device tree is through the per-driver device node linkage. Device nodes contain a reference to the next device node bound to the same driver. Given the di_node_t returned from di_init(3DEVINFO), an application can find all device nodes bound to a driver by first calling di_drv_first_node(3DEVINFO), followed by successive calls to di_drv_next_node(3DEVINFO) until DI_NODE_NIL is returned. Note that traversing the per-driver device node list works only when the snapshot includes all device nodes.

See libdevinfo(3LIB) for a complete list of libdevinfo interfaces. See di_init(3DEVINFO) for examples of libdevinfo usage. See Writing Device Drivers for details of Solaris device configuration.

EXAMPLES

Example 1: Information Accessible Through libdevinfo Interfaces

The following example illustrates the kind of information accessible through libdevinfo interfaces for a device node representing a hard disk (sd2):

Attributes
node name: sd
instance: 2
physical path: /sbus@1f,0/espdma@e,8400000/esp@e,8800000/sd@2,0

Properties
target=2
lun=0

Minor nodes
(disk partition /dev/dsk/c0t2d0s0)
name: a
dev_t: 0x0080010 (32/16)
spectype: IF_BLK (block special)
(disk partition /dev/rdsk/c0t2d0s2)
name: c,raw
dev_t: 0x0080012 (32/18)
spectype: IF_CHR (character special)

ATTRIBUTES

See attributes(5) for descriptions of the following attributes:

Image /var/www/mancx/application/src/../www/___/img/man3/man3/libdevinfo1.png

SEE ALSO

devlinks(1M), prtconf(1M), di_binding_name(3DEVINFO), di_child_node(3DEVINFO), di_devfs_path(3DEVINFO), di_drv_first_node(3DEVINFO), di_drv_next_node(3DEVINFO), di_fini(3DEVINFO), di_init(3DEVINFO), di_minor_devt(3DEVINFO), di_minor_next(3DEVINFO), di_prom_fini(3DEVINFO), di_prom_init(3DEVINFO), di_prop_bytes(3DEVINFO), di_prop_lookup_bytes(3DEVINFO), di_prop_next(3DEVINFO), di_sibling_node(3DEVINFO), di_walk_minor(3DEVINFO), di_walk_node(3DEVINFO), libdevinfo(3LIB), attributes(5)

Writing Device Drivers