4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
25 #ifndef _SYS_DEVINFO_IMPL_H
26 #define _SYS_DEVINFO_IMPL_H
28 #include <sys/ddi_impldefs.h>
31 * This file is separate from libdevinfo.h because the devinfo driver
32 * needs to know about the stuff. Library consumer should not care
33 * about stuff defined here.
35 * The only exception is di_priv_data (consolidation private) and
43 /* ioctl commands for devinfo driver */
45 #define DIIOC (0xdf<<8)
46 #define DIIOC_MASK (0xffff00ff)
49 * Any combination of the following ORed together will take a snapshot
50 * of the device configuration data.
52 #define DINFOSUBTREE (DIIOC | 0x01) /* include subtree */
53 #define DINFOMINOR (DIIOC | 0x02) /* include minor data */
54 #define DINFOPROP (DIIOC | 0x04) /* include properties */
55 #define DINFOPATH (DIIOC | 0x08) /* include i/o pathing information */
58 #define DINFOPRIVDATA (DIIOC | 0x10) /* include private data */
59 #define DINFOFORCE (DIIOC | 0x20) /* force load all drivers */
60 #define DINFOCACHE (DIIOC | 0x100000) /* use cached data */
61 #define DINFOCLEANUP (DIIOC | 0x200000) /* cleanup /etc/devices files */
63 /* new public flag for the layered drivers framework */
64 #define DINFOLYR (DIIOC | 0x40) /* get device layering information */
66 /* new public flag for the hotplug framework */
67 #define DINFOHP (DIIOC | 0x400000) /* include hotplug information */
70 * Straight ioctl commands, not bitwise operation
72 #define DINFOUSRLD (DIIOC | 0x80) /* copy snapshot to usrland */
73 #define DINFOLODRV (DIIOC | 0x81) /* force load a driver */
74 #define DINFOIDENT (DIIOC | 0x82) /* identify the driver */
77 * ioctl for taking a snapshot a single node and all nodes
79 #define DINFOCPYONE DIIOC
80 #define DINFOCPYALL (DINFOSUBTREE | DINFOPROP | DINFOMINOR)
82 #define DI_MAGIC 0xdfdf /* magic number returned by DINFOIDENT */
84 /* driver ops encoding */
86 #define DI_BUS_OPS 0x1
88 #define DI_STREAM_OPS 0x4
90 /* property list enumeration */
92 #define DI_PROP_DRV_LIST 0
93 #define DI_PROP_SYS_LIST 1
94 #define DI_PROP_GLB_LIST 2
95 #define DI_PROP_HW_LIST 3
99 #define MAX_TREE_DEPTH 64
100 #define MAX_PTR_IN_PRV 5
101 #define DI_SNAPSHOT_VERSION_0 0 /* reserved */
102 #define DI_SNAPSHOT_VERSION_1 1 /* reserved */
103 #define DI_SNAPSHOT_VERSION_2 2 /* reserved */
104 #define DI_SNAPSHOT_VERSION DI_SNAPSHOT_VERSION_2 /* current version */
105 #define DI_PRIVDATA_VERSION_0 10 /* Start from 10 so caller must set */
106 #define DI_BIG_ENDIAN 0 /* reserved */
107 #define DI_LITTLE_ENDIAN 1 /* reserved */
109 #define DI_CACHE_MAGIC 0xdfcac6ed /* magic # for cache */
110 #define DI_CACHE_PERMS (0444)
111 #define DI_CACHE_SNAPSHOT_FLAGS \
112 (DINFOFORCE|DINFOSUBTREE|DINFOMINOR|DINFOPROP|DINFOPATH)
114 #define DI_NODE(addr) ((struct di_node *)((void *)(addr)))
115 #define DI_MINOR(addr) ((struct di_minor *)((void *)(addr)))
116 #define DI_PROP(addr) ((struct di_prop *)((void *)(addr)))
117 #define DI_PATH(addr) ((struct di_path *)((void *)(addr)))
118 #define DI_PATHPROP(addr) ((struct di_path_prop *)((void *)(addr)))
119 #define DI_ALL(addr) ((struct di_all *)((void *)(addr)))
120 #define DI_DEVNM(addr) ((struct di_devnm *)((void *)(addr)))
121 #define DI_LINK(addr) ((struct di_link *)((void *)(addr)))
122 #define DI_LNODE(addr) ((struct di_lnode *)((void *)(addr)))
123 #define DI_PRIV_FORMAT(addr) ((struct di_priv_format *)((void *)(addr)))
124 #define DI_HP(addr) ((struct di_hp *)((void *)(addr)))
125 #define DI_ALIAS(addr) ((struct di_alias *)((void *)(addr)))
128 * multipath component definitions: Follows the registered component of
131 #define MULTIPATH_COMPONENT_NONE 0
132 #define MULTIPATH_COMPONENT_VHCI 0x1
133 #define MULTIPATH_COMPONENT_PHCI 0x2
134 #define MULTIPATH_COMPONENT_CLIENT 0x4
136 typedef int32_t di_off_t
;
139 * devinfo driver snapshot data structure
142 int version
; /* snapshot version, reserved */
143 int cache_magic
; /* magic number for cached snapshot */
144 int pd_version
; /* private data format version */
145 int endianness
; /* reserved for future use */
146 int generation
; /* reserved for future use */
147 uint32_t cache_checksum
; /* snapshot checksum */
148 uint64_t snapshot_time
; /* snapshot timestamp */
149 di_off_t top_devinfo
; /* actual top devinfo in snapshot */
150 di_off_t top_vhci_devinfo
;
152 di_off_t ppdata_format
; /* parent priv data format array */
153 di_off_t dpdata_format
; /* driver priv data format array */
154 di_off_t aliases
; /* offset to alias tree */
155 int n_ppdata
; /* size of ppdata_format array */
156 int n_dpdata
; /* size of pddata_format array */
157 int devcnt
; /* size of devnames array */
158 uint_t command
; /* same as in di_init() */
159 uint_t map_size
; /* size of the snapshot */
160 char req_path
[MAXPATHLEN
]; /* path to requested root */
161 char root_path
[1]; /* path to actual snapshot root */
166 di_off_t global_prop
;
167 di_off_t head
; /* head of per instance list */
168 int flags
; /* driver attachment info */
169 int instance
; /* next instance to assign */
170 uint_t ops
; /* bit-encoded driver ops */
179 int spec_type
; /* block or char access type */
180 di_off_t src_lnode
; /* src di_lnode */
181 di_off_t tgt_lnode
; /* tgt di_lnode */
182 di_off_t src_link_next
; /* next src di_link /w same di_lnode */
183 di_off_t tgt_link_next
; /* next tgt di_link /w same di_lnode */
184 di_off_t src_node_next
; /* next src di_link /w same di_node */
185 di_off_t tgt_node_next
; /* next tgt di_link /w same di_node */
186 uint64_t user_private_data
;
193 * public information describing a link endpoint
195 major_t dev_major
; /* dev_t can be 64-bit */
196 minor_t dev_minor
; /* dev_t can be 64-bit */
197 di_off_t node
; /* offset of di_node */
200 * di_link ptr to links comming into this node
201 * (this lnode is the target of these di_links)
206 * di_link ptr to links going out of this node
207 * (this lnode is the source of these di_links)
212 * di_lnode pointer to the next lnode associated with the
217 uint64_t user_private_data
;
220 struct di_node
{ /* useful info to export for each tree node */
222 * offset to di_node structures
224 di_off_t self
; /* make it self addressable */
225 di_off_t parent
; /* offset of parent node */
226 di_off_t child
; /* offset of child node */
227 di_off_t sibling
; /* offset of sibling */
228 di_off_t next
; /* next node on per-instance list */
230 * offset to char strings of current node
232 di_off_t node_name
; /* offset of device node name */
233 di_off_t address
; /* offset of address part of name */
234 di_off_t bind_name
; /* offset of binding name */
235 di_off_t compat_names
; /* offset of compatible names */
237 * offset to property lists, private data, etc.
244 di_off_t parent_data
;
245 di_off_t driver_data
;
246 di_off_t multipath_client
;
247 di_off_t multipath_phci
;
248 di_off_t devid
; /* registered device id */
249 di_off_t pm_info
; /* RESERVED FOR FUTURE USE */
253 int compat_length
; /* size of compatible name list */
254 int drv_major
; /* for indexing into devnames array */
256 * value attributes of current node
258 int instance
; /* instance number */
259 int nodeid
; /* node id */
260 ddi_node_class_t node_class
; /* node class */
261 int attributes
; /* node attributes */
262 uint_t state
; /* hotplugging device state */
263 ddi_node_state_t node_state
; /* devinfo state */
265 di_off_t lnodes
; /* lnodes associated with this di_node */
269 uint32_t di_pad1
; /* 4 byte padding for 32bit x86 app. */
270 uint64_t user_private_data
;
272 * offset to link vhci/phci nodes.
277 uint32_t multipath_component
; /* stores MDI_COMPONENT_* value. */
282 uint32_t di_pad2
; /* 4 byte padding for 32bit x86 app. */
284 * offset to hotplug nodes.
290 * chain of ddi_minor_data structure
293 di_off_t self
; /* make it self addressable */
294 di_off_t next
; /* next one in the chain */
295 di_off_t name
; /* name of node */
296 di_off_t node_type
; /* block, byte, serial, network */
297 ddi_minor_type type
; /* data type */
298 major_t dev_major
; /* dev_t can be 64-bit */
300 int spec_type
; /* block or char */
301 unsigned int mdclass
; /* no longer used, may be removed */
302 di_off_t node
; /* address of di_node */
303 uint64_t user_private_data
;
307 DI_PATH_STATE_UNKNOWN
,
308 DI_PATH_STATE_OFFLINE
,
309 DI_PATH_STATE_STANDBY
,
310 DI_PATH_STATE_ONLINE
,
315 * multipathing information structures
318 di_off_t self
; /* make it self addressable */
319 di_off_t path_c_link
; /* next pathinfo via client linkage */
320 di_off_t path_p_link
; /* next pathinfo via phci linkage */
321 di_off_t path_client
; /* reference to client node */
322 di_off_t path_phci
; /* reference to phci node */
323 di_off_t path_prop
; /* property list */
324 di_off_t path_addr
; /* path addressing information */
325 di_path_state_t path_state
; /* path state */
326 uint_t path_snap_state
; /* describes valid fields */
327 int path_instance
; /* path instance */
328 uint64_t user_private_data
;
329 uint_t path_flags
; /* path flags */
333 * chain of hotplug information structures
336 di_off_t self
; /* make it self addressable */
337 di_off_t next
; /* next one in chain */
338 di_off_t hp_name
; /* name of hotplug connection */
339 int hp_connection
; /* connection number */
340 int hp_depends_on
; /* connection number depended upon */
341 int hp_state
; /* current hotplug state */
342 int hp_type
; /* connection type: PCI, ... */
343 di_off_t hp_type_str
; /* description of connection type */
344 uint32_t hp_last_change
; /* timestamp of last change */
345 di_off_t hp_child
; /* child device node */
349 * Flags for snap_state
351 #define DI_PATH_SNAP_NOCLIENT 0x01 /* client endpt not in snapshot */
352 #define DI_PATH_SNAP_NOPHCI 0x02 /* phci endpt not in snapshot */
353 #define DI_PATH_SNAP_ENDPTS 0x04 /* Endpoints have been postprocessed */
355 #define DI_PATH_SNAP_NOCLINK 0x10 /* client linkage not in snapshot */
356 #define DI_PATH_SNAP_NOPLINK 0x20 /* phci linkage not in snapshot */
357 #define DI_PATH_SNAP_LINKS 0x40 /* linkages have been postprocessed */
360 * Flags for path_flags
362 #define DI_PATH_FLAGS_DEVICE_REMOVED 0x01 /* peer of DI_DEVICE_REMOVED */
367 struct di_path_prop
{
368 di_off_t self
; /* make it self addressable */
369 di_off_t prop_next
; /* next property linkage */
370 di_off_t prop_name
; /* property name */
371 di_off_t prop_data
; /* property data */
372 int prop_type
; /* property data type */
373 int prop_len
; /* prop length in bytes */
377 * Now the properties.
380 di_off_t self
; /* make it self addressable */
382 di_off_t prop_name
; /* Property name */
383 di_off_t prop_data
; /* property data */
384 major_t dev_major
; /* dev_t can be 64 bit */
386 int prop_flags
; /* mark prop value types & more */
387 int prop_len
; /* prop len in bytes (boolean if 0) */
388 int prop_list
; /* which list (DI_PROP_SYS_LIST), etc */
392 * Private data stuff for supporting prtconf.
393 * Allows one level of indirection of fixed sized obj or obj array.
394 * The array size may be an int member of the array.
397 struct di_priv_format
{
398 char drv_name
[MAXPATHLEN
]; /* name of parent drv for ppdata */
399 size_t bytes
; /* size in bytes of this struct */
400 struct { /* ptrs to dereference */
401 int size
; /* size of object assoc. this ptr */
402 int offset
; /* location of pointer within struct */
403 int len_offset
; /* offset to var. containing the len */
404 } ptr
[MAX_PTR_IN_PRV
];
407 struct di_priv_data
{
411 struct di_priv_format
*parent
;
412 struct di_priv_format
*driver
;
417 * structure for saving alias information
420 di_off_t self
; /* make it self addressable */
421 di_off_t curroff
; /* offset to curr dip's snapshot */
422 di_off_t next
; /* next alias */
423 char alias
[1]; /* alias path */
427 * structure passed in from ioctl
430 char root_path
[MAXPATHLEN
];
431 struct di_priv_data priv
;
438 #endif /* _SYS_DEVINFO_IMPL_H */