1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_AUTOCONF_H 28 #define _SYS_AUTOCONF_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 /* Derived from autoconf.h, SunOS 4.1.1 1.15 */ 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 /* 39 * This defines a parallel structure to the devops list. 40 */ 41 42 #include <sys/dditypes.h> 43 #include <sys/devops.h> 44 #include <sys/mutex.h> 45 #include <sys/thread.h> 46 #include <sys/obpdefs.h> 47 #include <sys/systm.h> 48 49 struct devnames { 50 char *dn_name; /* Name of this driver */ 51 int dn_flags; /* per-driver flags, see below */ 52 struct par_list *dn_pl; /* parent list, for making devinfos */ 53 kmutex_t dn_lock; /* Per driver lock (see below) */ 54 dev_info_t *dn_head; /* Head of instance list */ 55 int dn_instance; /* Next instance no. to assign */ 56 void *dn_inlist; /* instance # nodes for this driver */ 57 ddi_prop_list_t *dn_global_prop_ptr; /* per-driver global properties */ 58 kcondvar_t dn_wait; /* for ddi_hold_installed_driver */ 59 kthread_id_t dn_busy_thread; /* for debugging only */ 60 struct mperm *dn_mperm; /* minor permissions */ 61 struct mperm *dn_mperm_wild; /* default minor permission */ 62 struct mperm *dn_mperm_clone; /* minor permission, clone use */ 63 }; 64 65 /* 66 * dn_lock is used to protect the driver initialization/loading 67 * from fini/unloading. It also protects each drivers devops 68 * reference count, the dn_flags, and the dn_head linked list of 69 * driver instances. The busy_changing bit is used to avoid 70 * recursive calls to ddi_hold_installed_driver to hold the 71 * same driver. 72 */ 73 74 /* 75 * Defines for dn_flags. 76 */ 77 #define DN_CONF_PARSED 0x0001 78 #define DN_DRIVER_BUSY 0x0002 /* for ddi_hold_installed_driver */ 79 #define DN_DRIVER_HELD 0x0020 /* held via ddi_hold_installed_driver */ 80 #define DN_TAKEN_GETUDEV 0x0040 /* getudev() used this entry */ 81 #define DN_DRIVER_REMOVED 0x0080 /* driver entry removed */ 82 83 #define DN_FORCE_ATTACH 0x0100 /* ddi-forceattach prop */ 84 #define DN_LEAF_DRIVER 0x0200 /* this is a leaf driver */ 85 #define DN_NETWORK_DRIVER 0x0400 /* network interface driver */ 86 #define DN_NO_AUTODETACH 0x0800 /* no autodetach */ 87 #define DN_GLDV3_DRIVER 0x1000 /* gldv3 (Nemo) driver */ 88 89 #ifdef _KERNEL 90 91 /* 92 * Debugging flags and macros 93 */ 94 #define DDI_AUDIT 0x0001 95 #define DDI_DEBUG 0x0002 96 #define DDI_MTCONFIG 0x0004 97 #define DDI_DEBUG_BOOTMOD 0x0008 /* module loading to mount root */ 98 #define DDI_DEBUG_COMPAT 0x0010 /* ddi_hold_install_driver */ 99 #define LDI_DBG_OPENCLOSE 0x0020 /* ldi open/close info */ 100 #define LDI_DBG_ALLOCFREE 0x0040 /* ldi ident alloc/free info */ 101 #define LDI_DBG_STREAMS 0x0080 /* ldi streams link/unlink */ 102 #define LDI_DBG_EVENTCB 0x0100 /* ldi event callback info */ 103 #define DDI_INTR_API 0x0200 /* interrupt interface messages */ 104 #define DDI_INTR_IMPL 0x0400 /* interrupt implementation msgs */ 105 #define DDI_INTR_NEXUS 0x0800 /* interrupt messages from nexuses */ 106 107 extern int ddidebug; 108 109 #ifdef DEBUG 110 #define NDI_CONFIG_DEBUG(args) if (ddidebug & DDI_DEBUG) cmn_err args 111 #define BMDPRINTF(args) if (ddidebug & DDI_DEBUG_BOOTMOD) printf args 112 #define DCOMPATPRINTF(args) if (ddidebug & DDI_DEBUG_COMPAT) cmn_err args 113 #define LDI_OPENCLOSE(args) if (ddidebug & LDI_DBG_OPENCLOSE) cmn_err args 114 #define LDI_ALLOCFREE(args) if (ddidebug & LDI_DBG_ALLOCFREE) cmn_err args 115 #define LDI_STREAMS_LNK(args) if (ddidebug & LDI_DBG_STREAMS) cmn_err args 116 #define LDI_EVENTCB(args) if (ddidebug & LDI_DBG_EVENTCB) cmn_err args 117 #define DDI_INTR_APIDBG(args) if (ddidebug & DDI_INTR_API) cmn_err args 118 #define DDI_INTR_IMPLDBG(args) if (ddidebug & DDI_INTR_IMPL) cmn_err args 119 #define DDI_INTR_NEXDBG(args) if (ddidebug & DDI_INTR_NEXUS) cmn_err args 120 #else 121 #define NDI_CONFIG_DEBUG(args) 122 #define BMDPRINTF(args) 123 #define DCOMPATPRINTF(args) 124 #define LDI_OPENCLOSE(args) 125 #define LDI_ALLOCFREE(args) 126 #define LDI_STREAMS_LNK(args) 127 #define LDI_EVENTCB(args) 128 #define DDI_INTR_APIDBG(args) 129 #define DDI_INTR_IMPLDBG(args) 130 #define DDI_INTR_NEXDBG(args) 131 #endif 132 133 134 /* 135 * DDI configuration logs 136 */ 137 #define DDI_STACK_DEPTH 14 138 139 typedef struct devinfo_audit { 140 dev_info_t *da_devinfo; /* address of devinfo node */ 141 hrtime_t da_timestamp; /* audit time */ 142 kthread_id_t da_thread; /* thread of transaction */ 143 struct devinfo_audit *da_lastlog; /* last log of state change */ 144 ddi_node_state_t da_node_state; /* devinfo state at log time */ 145 int da_device_state; /* device state */ 146 int da_depth; 147 pc_t da_stack[DDI_STACK_DEPTH]; 148 } devinfo_audit_t; 149 150 typedef struct { 151 kmutex_t dh_lock; 152 int dh_max; 153 int dh_curr; 154 int dh_hits; 155 devinfo_audit_t dh_entry[1]; 156 } devinfo_log_header_t; 157 158 struct di_cache { 159 uint32_t cache_valid; /* no lock needed - field atomic updt */ 160 kmutex_t cache_lock; /* protects fields below */ 161 void *cache_data; 162 size_t cache_size; 163 }; 164 165 extern struct di_cache di_cache; 166 extern int di_cache_debug; 167 168 /* 169 * Special dev_info nodes 170 */ 171 #define PSEUDO_PATH "/"DEVI_PSEUDO_NEXNAME 172 #define CLONE_PATH PSEUDO_PATH"/clone@0" 173 174 #define DI_CACHE_FILE "/etc/devices/snapshot_cache" 175 #define DI_CACHE_TEMP DI_CACHE_FILE".tmp" 176 177 extern dev_info_t *options_dip; 178 extern dev_info_t *pseudo_dip; 179 extern dev_info_t *clone_dip; 180 extern major_t clone_major; 181 extern major_t mm_major; 182 183 extern struct devnames *devnamesp; 184 extern struct devnames orphanlist; 185 186 extern struct dev_ops nodev_ops, mod_nodev_ops; 187 188 /* 189 * Obsolete interface, no longer used, to be removed. 190 * Retained only for driver compatibility. 191 */ 192 extern krwlock_t devinfo_tree_lock; /* obsolete */ 193 194 /* 195 * Acquires dn_lock, as above. 196 */ 197 #define LOCK_DEV_OPS(lp) mutex_enter((lp)) 198 #define UNLOCK_DEV_OPS(lp) mutex_exit((lp)) 199 200 /* 201 * Not to be used without obtaining the per-driver lock. 202 */ 203 #define INCR_DEV_OPS_REF(opsp) (opsp)->devo_refcnt++ 204 #define DECR_DEV_OPS_REF(opsp) (opsp)->devo_refcnt-- 205 #define CB_DRV_INSTALLED(opsp) ((opsp) != &nodev_ops && \ 206 (opsp) != &mod_nodev_ops) 207 #define DRV_UNLOADABLE(opsp) ((opsp)->devo_refcnt == 0) 208 #define DEV_OPS_HELD(opsp) ((opsp)->devo_refcnt > 0) 209 #define NEXUS_DRV(opsp) ((opsp)->devo_bus_ops != NULL) 210 #define NETWORK_DRV(major) (devnamesp[major].dn_flags & DN_NETWORK_DRIVER) 211 #define GLDV3_DRV(major) (devnamesp[major].dn_flags & DN_GLDV3_DRIVER) 212 213 extern void impl_rem_dev_props(dev_info_t *); 214 extern void add_class(char *, char *); 215 216 struct bind; 217 extern int make_mbind(char *, int, char *, struct bind **); 218 extern void delete_mbind(char *, struct bind **); 219 220 extern void configure(void); 221 #if defined(__sparc) 222 extern void setcputype(void); 223 #endif 224 extern void devtree_freeze(void); 225 extern void reset_leaves(void); 226 227 extern void setup_ddi(void); 228 extern void setup_ddi_poststartup(void); 229 extern void impl_ddi_callback_init(void); 230 extern void impl_fix_props(dev_info_t *, dev_info_t *, char *, int, caddr_t); 231 extern int impl_check_cpu(dev_info_t *); 232 extern int check_status(int, char *, dev_info_t *); 233 234 extern int exclude_settrap(int); 235 extern int exclude_level(int); 236 237 extern major_t path_to_major(char *); 238 extern void i_ddi_node_cache_init(void); 239 extern dev_info_t *i_ddi_alloc_node(dev_info_t *, char *, dnode_t, int, 240 ddi_prop_t *, int); 241 extern void i_ddi_forceattach_drivers(void); 242 extern int i_ddi_io_initialized(void); 243 extern dev_info_t *i_ddi_create_branch(dev_info_t *, int); 244 extern void i_ddi_add_devimap(dev_info_t *dip); 245 extern void i_ddi_di_cache_invalidate(int kmflag); 246 extern void i_ddi_di_cache_free(struct di_cache *cache); 247 248 #endif /* _KERNEL */ 249 250 #ifdef __cplusplus 251 } 252 #endif 253 254 #endif /* _SYS_AUTOCONF_H */ 255