/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. */ #ifndef _SYS_DEVINFO_IMPL_H #define _SYS_DEVINFO_IMPL_H #include /* * This file is separate from libdevinfo.h because the devinfo driver * needs to know about the stuff. Library consumer should not care * about stuff defined here. * * The only exception is di_priv_data (consolidation private) and * DINFO* ioctls. */ #ifdef __cplusplus extern "C" { #endif /* ioctl commands for devinfo driver */ #define DIIOC (0xdf<<8) #define DIIOC_MASK (0xffff00ff) /* * Any combination of the following ORed together will take a snapshot * of the device configuration data. */ #define DINFOSUBTREE (DIIOC | 0x01) /* include subtree */ #define DINFOMINOR (DIIOC | 0x02) /* include minor data */ #define DINFOPROP (DIIOC | 0x04) /* include properties */ #define DINFOPATH (DIIOC | 0x08) /* include i/o pathing information */ /* private bits */ #define DINFOPRIVDATA (DIIOC | 0x10) /* include private data */ #define DINFOFORCE (DIIOC | 0x20) /* force load all drivers */ #define DINFOCACHE (DIIOC | 0x100000) /* use cached data */ #define DINFOCLEANUP (DIIOC | 0x200000) /* cleanup /etc/devices files */ /* new public flag for the layered drivers framework */ #define DINFOLYR (DIIOC | 0x40) /* get device layering information */ /* new public flag for the hotplug framework */ #define DINFOHP (DIIOC | 0x400000) /* include hotplug information */ /* * Straight ioctl commands, not bitwise operation */ #define DINFOUSRLD (DIIOC | 0x80) /* copy snapshot to usrland */ #define DINFOLODRV (DIIOC | 0x81) /* force load a driver */ #define DINFOIDENT (DIIOC | 0x82) /* identify the driver */ /* * ioctl for taking a snapshot a single node and all nodes */ #define DINFOCPYONE DIIOC #define DINFOCPYALL (DINFOSUBTREE | DINFOPROP | DINFOMINOR) #define DI_MAGIC 0xdfdf /* magic number returned by DINFOIDENT */ /* driver ops encoding */ #define DI_BUS_OPS 0x1 #define DI_CB_OPS 0x2 #define DI_STREAM_OPS 0x4 /* property list enumeration */ #define DI_PROP_DRV_LIST 0 #define DI_PROP_SYS_LIST 1 #define DI_PROP_GLB_LIST 2 #define DI_PROP_HW_LIST 3 /* misc parameters */ #define MAX_TREE_DEPTH 64 #define MAX_PTR_IN_PRV 5 #define DI_SNAPSHOT_VERSION_0 0 /* reserved */ #define DI_SNAPSHOT_VERSION_1 1 /* reserved */ #define DI_SNAPSHOT_VERSION_2 2 /* reserved */ #define DI_SNAPSHOT_VERSION DI_SNAPSHOT_VERSION_2 /* current version */ #define DI_PRIVDATA_VERSION_0 10 /* Start from 10 so caller must set */ #define DI_BIG_ENDIAN 0 /* reserved */ #define DI_LITTLE_ENDIAN 1 /* reserved */ #define DI_CACHE_MAGIC 0xdfcac6ed /* magic # for cache */ #define DI_CACHE_PERMS (0444) #define DI_CACHE_SNAPSHOT_FLAGS \ (DINFOFORCE|DINFOSUBTREE|DINFOMINOR|DINFOPROP|DINFOPATH) #define DI_NODE(addr) ((struct di_node *)((void *)(addr))) #define DI_MINOR(addr) ((struct di_minor *)((void *)(addr))) #define DI_PROP(addr) ((struct di_prop *)((void *)(addr))) #define DI_PATH(addr) ((struct di_path *)((void *)(addr))) #define DI_PATHPROP(addr) ((struct di_path_prop *)((void *)(addr))) #define DI_ALL(addr) ((struct di_all *)((void *)(addr))) #define DI_DEVNM(addr) ((struct di_devnm *)((void *)(addr))) #define DI_LINK(addr) ((struct di_link *)((void *)(addr))) #define DI_LNODE(addr) ((struct di_lnode *)((void *)(addr))) #define DI_PRIV_FORMAT(addr) ((struct di_priv_format *)((void *)(addr))) #define DI_HP(addr) ((struct di_hp *)((void *)(addr))) #define DI_ALIAS(addr) ((struct di_alias *)((void *)(addr))) /* * multipath component definitions: Follows the registered component of * the mpxio system. */ #define MULTIPATH_COMPONENT_NONE 0 #define MULTIPATH_COMPONENT_VHCI 0x1 #define MULTIPATH_COMPONENT_PHCI 0x2 #define MULTIPATH_COMPONENT_CLIENT 0x4 typedef int32_t di_off_t; /* * devinfo driver snapshot data structure */ struct di_all { int version; /* snapshot version, reserved */ int cache_magic; /* magic number for cached snapshot */ int pd_version; /* private data format version */ int endianness; /* reserved for future use */ int generation; /* reserved for future use */ uint32_t cache_checksum; /* snapshot checksum */ uint64_t snapshot_time; /* snapshot timestamp */ di_off_t top_devinfo; /* actual top devinfo in snapshot */ di_off_t top_vhci_devinfo; di_off_t devnames; di_off_t ppdata_format; /* parent priv data format array */ di_off_t dpdata_format; /* driver priv data format array */ di_off_t aliases; /* offset to alias tree */ int n_ppdata; /* size of ppdata_format array */ int n_dpdata; /* size of pddata_format array */ int devcnt; /* size of devnames array */ uint_t command; /* same as in di_init() */ uint_t map_size; /* size of the snapshot */ char req_path[MAXPATHLEN]; /* path to requested root */ char root_path[1]; /* path to actual snapshot root */ }; struct di_devnm { di_off_t name; di_off_t global_prop; di_off_t head; /* head of per instance list */ int flags; /* driver attachment info */ int instance; /* next instance to assign */ uint_t ops; /* bit-encoded driver ops */ }; struct di_lnode; struct di_link { di_off_t self; int count; int spec_type; /* block or char access type */ di_off_t src_lnode; /* src di_lnode */ di_off_t tgt_lnode; /* tgt di_lnode */ di_off_t src_link_next; /* next src di_link /w same di_lnode */ di_off_t tgt_link_next; /* next tgt di_link /w same di_lnode */ di_off_t src_node_next; /* next src di_link /w same di_node */ di_off_t tgt_node_next; /* next tgt di_link /w same di_node */ uint64_t user_private_data; }; struct di_lnode { di_off_t self; /* * public information describing a link endpoint */ major_t dev_major; /* dev_t can be 64-bit */ minor_t dev_minor; /* dev_t can be 64-bit */ di_off_t node; /* offset of di_node */ /* * di_link ptr to links comming into this node * (this lnode is the target of these di_links) */ di_off_t link_in; /* * di_link ptr to links going out of this node * (this lnode is the source of these di_links) */ di_off_t link_out; /* * di_lnode pointer to the next lnode associated with the * same di_node */ di_off_t node_next; uint64_t user_private_data; }; struct di_node { /* useful info to export for each tree node */ /* * offset to di_node structures */ di_off_t self; /* make it self addressable */ di_off_t parent; /* offset of parent node */ di_off_t child; /* offset of child node */ di_off_t sibling; /* offset of sibling */ di_off_t next; /* next node on per-instance list */ /* * offset to char strings of current node */ di_off_t node_name; /* offset of device node name */ di_off_t address; /* offset of address part of name */ di_off_t bind_name; /* offset of binding name */ di_off_t compat_names; /* offset of compatible names */ /* * offset to property lists, private data, etc. */ di_off_t minor_data; di_off_t drv_prop; di_off_t sys_prop; di_off_t glob_prop; di_off_t hw_prop; di_off_t parent_data; di_off_t driver_data; di_off_t multipath_client; di_off_t multipath_phci; di_off_t devid; /* registered device id */ di_off_t pm_info; /* RESERVED FOR FUTURE USE */ /* * misc values */ int compat_length; /* size of compatible name list */ int drv_major; /* for indexing into devnames array */ /* * value attributes of current node */ int instance; /* instance number */ int nodeid; /* node id */ ddi_node_class_t node_class; /* node class */ int attributes; /* node attributes */ uint_t state; /* hotplugging device state */ ddi_node_state_t node_state; /* devinfo state */ di_off_t lnodes; /* lnodes associated with this di_node */ di_off_t tgt_links; di_off_t src_links; uint32_t di_pad1; /* 4 byte padding for 32bit x86 app. */ uint64_t user_private_data; /* * offset to link vhci/phci nodes. */ di_off_t next_vhci; di_off_t top_phci; di_off_t next_phci; uint32_t multipath_component; /* stores MDI_COMPONENT_* value. */ /* * devi_flags field */ uint32_t flags; uint32_t di_pad2; /* 4 byte padding for 32bit x86 app. */ /* * offset to hotplug nodes. */ di_off_t hp_data; }; /* * chain of ddi_minor_data structure */ struct di_minor { di_off_t self; /* make it self addressable */ di_off_t next; /* next one in the chain */ di_off_t name; /* name of node */ di_off_t node_type; /* block, byte, serial, network */ ddi_minor_type type; /* data type */ major_t dev_major; /* dev_t can be 64-bit */ minor_t dev_minor; int spec_type; /* block or char */ unsigned int mdclass; /* no longer used, may be removed */ di_off_t node; /* address of di_node */ uint64_t user_private_data; }; typedef enum { DI_PATH_STATE_UNKNOWN, DI_PATH_STATE_OFFLINE, DI_PATH_STATE_STANDBY, DI_PATH_STATE_ONLINE, DI_PATH_STATE_FAULT } di_path_state_t; /* * multipathing information structures */ struct di_path { di_off_t self; /* make it self addressable */ di_off_t path_c_link; /* next pathinfo via client linkage */ di_off_t path_p_link; /* next pathinfo via phci linkage */ di_off_t path_client; /* reference to client node */ di_off_t path_phci; /* reference to phci node */ di_off_t path_prop; /* property list */ di_off_t path_addr; /* path addressing information */ di_path_state_t path_state; /* path state */ uint_t path_snap_state; /* describes valid fields */ int path_instance; /* path instance */ uint64_t user_private_data; uint_t path_flags; /* path flags */ }; /* * chain of hotplug information structures */ struct di_hp { di_off_t self; /* make it self addressable */ di_off_t next; /* next one in chain */ di_off_t hp_name; /* name of hotplug connection */ int hp_connection; /* connection number */ int hp_depends_on; /* connection number depended upon */ int hp_state; /* current hotplug state */ int hp_type; /* connection type: PCI, ... */ di_off_t hp_type_str; /* description of connection type */ uint32_t hp_last_change; /* timestamp of last change */ di_off_t hp_child; /* child device node */ }; /* * Flags for snap_state */ #define DI_PATH_SNAP_NOCLIENT 0x01 /* client endpt not in snapshot */ #define DI_PATH_SNAP_NOPHCI 0x02 /* phci endpt not in snapshot */ #define DI_PATH_SNAP_ENDPTS 0x04 /* Endpoints have been postprocessed */ #define DI_PATH_SNAP_NOCLINK 0x10 /* client linkage not in snapshot */ #define DI_PATH_SNAP_NOPLINK 0x20 /* phci linkage not in snapshot */ #define DI_PATH_SNAP_LINKS 0x40 /* linkages have been postprocessed */ /* * Flags for path_flags */ #define DI_PATH_FLAGS_DEVICE_REMOVED 0x01 /* peer of DI_DEVICE_REMOVED */ /* * path properties */ struct di_path_prop { di_off_t self; /* make it self addressable */ di_off_t prop_next; /* next property linkage */ di_off_t prop_name; /* property name */ di_off_t prop_data; /* property data */ int prop_type; /* property data type */ int prop_len; /* prop length in bytes */ }; /* * Now the properties. */ struct di_prop { di_off_t self; /* make it self addressable */ di_off_t next; di_off_t prop_name; /* Property name */ di_off_t prop_data; /* property data */ major_t dev_major; /* dev_t can be 64 bit */ minor_t dev_minor; int prop_flags; /* mark prop value types & more */ int prop_len; /* prop len in bytes (boolean if 0) */ int prop_list; /* which list (DI_PROP_SYS_LIST), etc */ }; /* * Private data stuff for supporting prtconf. * Allows one level of indirection of fixed sized obj or obj array. * The array size may be an int member of the array. */ struct di_priv_format { char drv_name[MAXPATHLEN]; /* name of parent drv for ppdata */ size_t bytes; /* size in bytes of this struct */ struct { /* ptrs to dereference */ int size; /* size of object assoc. this ptr */ int offset; /* location of pointer within struct */ int len_offset; /* offset to var. containing the len */ } ptr[MAX_PTR_IN_PRV]; }; struct di_priv_data { int version; int n_parent; int n_driver; struct di_priv_format *parent; struct di_priv_format *driver; }; /* * structure for saving alias information */ struct di_alias { di_off_t self; /* make it self addressable */ di_off_t curroff; /* offset to curr dip's snapshot */ di_off_t next; /* next alias */ char alias[1]; /* alias path */ }; /* * structure passed in from ioctl */ struct dinfo_io { char root_path[MAXPATHLEN]; struct di_priv_data priv; }; #ifdef __cplusplus } #endif #endif /* _SYS_DEVINFO_IMPL_H */