docs/how-to-build.md: use proper markup for directory names
[unleashed/tickless.git] / include / sys / devinfo_impl.h
blob22ef3c3f2e96d845dd16e5ab2dbf874976680240
1 /*
2 * CDDL HEADER START
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]
19 * CDDL HEADER END
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
36 * DINFO* ioctls.
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
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 */
57 /* private bits */
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
87 #define DI_CB_OPS 0x2
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
97 /* misc parameters */
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
129 * the mpxio system.
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
141 struct di_all {
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;
151 di_off_t devnames;
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 */
164 struct di_devnm {
165 di_off_t name;
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 */
174 struct di_lnode;
176 struct di_link {
177 di_off_t self;
178 int count;
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;
189 struct di_lnode {
190 di_off_t self;
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)
203 di_off_t link_in;
206 * di_link ptr to links going out of this node
207 * (this lnode is the source of these di_links)
209 di_off_t link_out;
212 * di_lnode pointer to the next lnode associated with the
213 * same di_node
215 di_off_t node_next;
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.
239 di_off_t minor_data;
240 di_off_t drv_prop;
241 di_off_t sys_prop;
242 di_off_t glob_prop;
243 di_off_t hw_prop;
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 */
251 * misc values
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 */
266 di_off_t tgt_links;
267 di_off_t src_links;
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.
274 di_off_t next_vhci;
275 di_off_t top_phci;
276 di_off_t next_phci;
277 uint32_t multipath_component; /* stores MDI_COMPONENT_* value. */
279 * devi_flags field
281 uint32_t flags;
282 uint32_t di_pad2; /* 4 byte padding for 32bit x86 app. */
284 * offset to hotplug nodes.
286 di_off_t hp_data;
290 * chain of ddi_minor_data structure
292 struct di_minor {
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 */
299 minor_t dev_minor;
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;
306 typedef enum {
307 DI_PATH_STATE_UNKNOWN,
308 DI_PATH_STATE_OFFLINE,
309 DI_PATH_STATE_STANDBY,
310 DI_PATH_STATE_ONLINE,
311 DI_PATH_STATE_FAULT
312 } di_path_state_t;
315 * multipathing information structures
317 struct di_path {
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
335 struct di_hp {
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 */
365 * path properties
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.
379 struct di_prop {
380 di_off_t self; /* make it self addressable */
381 di_off_t next;
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 */
385 minor_t dev_minor;
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 {
408 int version;
409 int n_parent;
410 int n_driver;
411 struct di_priv_format *parent;
412 struct di_priv_format *driver;
417 * structure for saving alias information
419 struct di_alias {
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
429 struct dinfo_io {
430 char root_path[MAXPATHLEN];
431 struct di_priv_data priv;
434 #ifdef __cplusplus
436 #endif
438 #endif /* _SYS_DEVINFO_IMPL_H */