Home | History | Annotate | Download | only in sys
      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 (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      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.
     12  *
     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]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _SYS_AUTOCONF_H
     27 #define	_SYS_AUTOCONF_H
     28 
     29 #pragma ident	"@(#)autoconf.h	1.59	07/08/09 SMI"
     30 
     31 /* Derived from autoconf.h, SunOS 4.1.1 1.15 */
     32 
     33 #ifdef	__cplusplus
     34 extern "C" {
     35 #endif
     36 
     37 /*
     38  * This defines a parallel structure to the devops list.
     39  */
     40 
     41 #include <sys/dditypes.h>
     42 #include <sys/devops.h>
     43 #include <sys/mutex.h>
     44 #include <sys/thread.h>
     45 #include <sys/obpdefs.h>
     46 #include <sys/systm.h>
     47 
     48 struct devnames {
     49 	char		*dn_name;	/* Name of this driver */
     50 	int		dn_flags;	/* per-driver flags, see below */
     51 	struct par_list	*dn_pl;		/* parent list, for making devinfos */
     52 	kmutex_t	dn_lock;	/* Per driver lock (see below) */
     53 	dev_info_t	*dn_head;	/* Head of instance list */
     54 	int		dn_instance;	/* Next instance no. to assign */
     55 	void		*dn_inlist;	/* instance # nodes for this driver */
     56 	ddi_prop_list_t	*dn_global_prop_ptr; /* per-driver global properties */
     57 	kcondvar_t	dn_wait;	/* for ddi_hold_installed_driver */
     58 	kthread_id_t	dn_busy_thread;	/* for debugging only */
     59 	struct mperm	*dn_mperm;	/* minor permissions */
     60 	struct mperm	*dn_mperm_wild;	/* default minor permission */
     61 	struct mperm	*dn_mperm_clone; /* minor permission, clone use */
     62 };
     63 
     64 /*
     65  * dn_lock is used to protect the driver initialization/loading
     66  * from fini/unloading. It also protects each drivers devops
     67  * reference count, the dn_flags, and the dn_head linked list of
     68  * driver instances. The busy_changing bit is used to avoid
     69  * recursive calls to ddi_hold_installed_driver to hold the
     70  * same driver.
     71  */
     72 
     73 /*
     74  * Defines for dn_flags.
     75  */
     76 #define	DN_CONF_PARSED		0x0001
     77 #define	DN_DRIVER_BUSY		0x0002	/* for ddi_hold_installed_driver */
     78 #define	DN_DRIVER_HELD		0x0020	/* held via ddi_hold_installed_driver */
     79 #define	DN_TAKEN_GETUDEV	0x0040	/* getudev() used this entry */
     80 #define	DN_DRIVER_REMOVED	0x0080	/* driver entry removed */
     81 
     82 #define	DN_FORCE_ATTACH		0x0100	/* DDI_FORCEATTACH prop */
     83 #define	DN_LEAF_DRIVER		0x0200	/* this is a leaf driver */
     84 #define	DN_NETWORK_DRIVER	0x0400	/* network interface driver */
     85 #define	DN_NO_AUTODETACH	0x0800	/* no autodetach */
     86 #define	DN_GLDV3_DRIVER		0x1000	/* gldv3 (Nemo) driver */
     87 #define	DN_PHCI_DRIVER		0x2000	/* pHCI driver */
     88 #define	DN_OPEN_RETURNS_EINTR	0x4000	/* DDI_OPEN_RETURNS_EINTR prop */
     89 
     90 #ifdef _KERNEL
     91 
     92 /*
     93  * Debugging flags and macros
     94  */
     95 #define	DDI_AUDIT		0x0001
     96 #define	DDI_DEBUG		0x0002
     97 #define	DDI_MTCONFIG		0x0004
     98 #define	DDI_DEBUG_BOOTMOD	0x0008	/* module loading to mount root */
     99 #define	DDI_DEBUG_COMPAT	0x0010	/* ddi_hold_install_driver */
    100 #define	LDI_DBG_OPENCLOSE	0x0020	/* ldi open/close info */
    101 #define	LDI_DBG_ALLOCFREE	0x0040	/* ldi ident alloc/free info */
    102 #define	LDI_DBG_STREAMS		0x0080	/* ldi streams link/unlink */
    103 #define	LDI_DBG_EVENTCB		0x0100	/* ldi event callback info */
    104 #define	DDI_INTR_API		0x0200	/* interrupt interface messages  */
    105 #define	DDI_INTR_IMPL		0x0400	/* interrupt implementation msgs */
    106 #define	DDI_INTR_NEXUS		0x0800	/* interrupt messages from nexuses */
    107 #define	DDI_DBG_RETIRE		0x1000	/* Retire related messages */
    108 #define	DDI_DBG_RTR_VRBOSE	0x2000	/* Verbose Retire messages */
    109 #define	DDI_DBG_RTR_TRACE	0x4000	/* Trace Retire messages */
    110 #define	LDI_EV_DEBUG		0x8000  /* LDI events debug messages */
    111 #define	LDI_EV_TRACE		0x10000 /* LDI events trace messages */
    112 
    113 extern int ddidebug;
    114 
    115 #ifdef	DEBUG
    116 #define	NDI_CONFIG_DEBUG(args)	if (ddidebug & DDI_DEBUG) cmn_err args
    117 #define	BMDPRINTF(args)		if (ddidebug & DDI_DEBUG_BOOTMOD) printf args
    118 #define	DCOMPATPRINTF(args)	if (ddidebug & DDI_DEBUG_COMPAT) cmn_err args
    119 #define	LDI_OPENCLOSE(args)	if (ddidebug & LDI_DBG_OPENCLOSE) cmn_err args
    120 #define	LDI_ALLOCFREE(args)	if (ddidebug & LDI_DBG_ALLOCFREE) cmn_err args
    121 #define	LDI_STREAMS_LNK(args)	if (ddidebug & LDI_DBG_STREAMS) cmn_err args
    122 #define	LDI_EVENTCB(args)	if (ddidebug & LDI_DBG_EVENTCB) cmn_err args
    123 #define	DDI_INTR_APIDBG(args)	if (ddidebug & DDI_INTR_API) cmn_err args
    124 #define	DDI_INTR_IMPLDBG(args)	if (ddidebug & DDI_INTR_IMPL) cmn_err args
    125 #define	DDI_INTR_NEXDBG(args)	if (ddidebug & DDI_INTR_NEXUS) cmn_err args
    126 #define	RIO_DEBUG(args)		if (ddidebug & DDI_DBG_RETIRE) cmn_err args
    127 #define	RIO_VERBOSE(args)	if (ddidebug & DDI_DBG_RTR_VRBOSE) cmn_err args
    128 #define	RIO_TRACE(args)		if (ddidebug & DDI_DBG_RTR_TRACE) cmn_err args
    129 #define	LDI_EVDBG(args)		if (ddidebug & LDI_EV_DEBUG) cmn_err args
    130 #define	LDI_EVTRC(args)		if (ddidebug & LDI_EV_TRACE) cmn_err args
    131 #else
    132 #define	NDI_CONFIG_DEBUG(args)
    133 #define	BMDPRINTF(args)
    134 #define	DCOMPATPRINTF(args)
    135 #define	LDI_OPENCLOSE(args)
    136 #define	LDI_ALLOCFREE(args)
    137 #define	LDI_STREAMS_LNK(args)
    138 #define	LDI_EVENTCB(args)
    139 #define	DDI_INTR_APIDBG(args)
    140 #define	DDI_INTR_IMPLDBG(args)
    141 #define	DDI_INTR_NEXDBG(args)
    142 #define	RIO_DEBUG(args)		if (ddidebug & DDI_DBG_RETIRE) cmn_err args
    143 #define	RIO_VERBOSE(args)	if (ddidebug & DDI_DBG_RTR_VRBOSE) cmn_err args
    144 #define	RIO_TRACE(args)		if (ddidebug & DDI_DBG_RTR_TRACE) cmn_err args
    145 #define	LDI_EVDBG(args)		if (ddidebug & LDI_EV_DEBUG) cmn_err args
    146 #define	LDI_EVTRC(args)		if (ddidebug & LDI_EV_TRACE) cmn_err args
    147 #endif
    148 
    149 
    150 /*
    151  * DDI configuration logs
    152  */
    153 #define	DDI_STACK_DEPTH		14
    154 
    155 typedef struct devinfo_audit {
    156 	dev_info_t		*da_devinfo;	/* address of devinfo node */
    157 	hrtime_t		da_timestamp;	/* audit time */
    158 	kthread_id_t		da_thread;	/* thread of transaction */
    159 	struct devinfo_audit	*da_lastlog;	/* last log of state change */
    160 	ddi_node_state_t	da_node_state;	/* devinfo state at log time */
    161 	int			da_device_state;	/* device state */
    162 	int			da_depth;
    163 	pc_t			da_stack[DDI_STACK_DEPTH];
    164 } devinfo_audit_t;
    165 
    166 typedef struct {
    167 	kmutex_t	dh_lock;
    168 	int		dh_max;
    169 	int		dh_curr;
    170 	int		dh_hits;
    171 	devinfo_audit_t	dh_entry[1];
    172 } devinfo_log_header_t;
    173 
    174 struct di_cache {
    175 	uint32_t	cache_valid;	/* no lock needed - field atomic updt */
    176 	kmutex_t	cache_lock;	/* protects fields below */
    177 	void		*cache_data;
    178 	size_t		cache_size;
    179 };
    180 
    181 extern struct di_cache di_cache;
    182 extern int di_cache_debug;
    183 extern volatile ulong_t devtree_gen;
    184 
    185 /*
    186  * Special dev_info nodes
    187  */
    188 #define	PSEUDO_PATH	"/"DEVI_PSEUDO_NEXNAME
    189 #define	CLONE_PATH	PSEUDO_PATH"/clone@0"
    190 
    191 #define	DI_CACHE_FILE	"/etc/devices/snapshot_cache"
    192 #define	DI_CACHE_TEMP	DI_CACHE_FILE".tmp"
    193 
    194 extern dev_info_t *options_dip;
    195 extern dev_info_t *pseudo_dip;
    196 extern dev_info_t *clone_dip;
    197 extern major_t clone_major;
    198 extern major_t mm_major;
    199 
    200 extern struct devnames *devnamesp;
    201 extern struct devnames orphanlist;
    202 
    203 extern struct dev_ops nodev_ops, mod_nodev_ops;
    204 
    205 /*
    206  * Obsolete interface, no longer used, to be removed.
    207  * Retained only for driver compatibility.
    208  */
    209 extern krwlock_t devinfo_tree_lock;		/* obsolete */
    210 
    211 /*
    212  * Acquires dn_lock, as above.
    213  */
    214 #define	LOCK_DEV_OPS(lp)	mutex_enter((lp))
    215 #define	UNLOCK_DEV_OPS(lp)	mutex_exit((lp))
    216 
    217 /*
    218  * Not to be used without obtaining the per-driver lock.
    219  */
    220 #define	INCR_DEV_OPS_REF(opsp)	(opsp)->devo_refcnt++
    221 #define	DECR_DEV_OPS_REF(opsp)	(opsp)->devo_refcnt--
    222 #define	CB_DRV_INSTALLED(opsp)	((opsp) != &nodev_ops && \
    223 				(opsp) != &mod_nodev_ops)
    224 #define	DRV_UNLOADABLE(opsp)	((opsp)->devo_refcnt == 0)
    225 #define	DEV_OPS_HELD(opsp)	((opsp)->devo_refcnt > 0)
    226 #define	NEXUS_DRV(opsp)		((opsp)->devo_bus_ops != NULL)
    227 #define	NETWORK_DRV(major)	(devnamesp[major].dn_flags & DN_NETWORK_DRIVER)
    228 #define	GLDV3_DRV(major)	(devnamesp[major].dn_flags & DN_GLDV3_DRIVER)
    229 
    230 extern void impl_rem_dev_props(dev_info_t *);
    231 extern void add_class(char *, char *);
    232 
    233 struct bind;
    234 extern int make_mbind(char *, int, char *, struct bind **);
    235 extern void delete_mbind(char *, struct bind **);
    236 
    237 extern void configure(void);
    238 #if defined(__sparc)
    239 extern void setcputype(void);
    240 #endif
    241 extern void devtree_freeze(void);
    242 extern void reset_leaves(void);
    243 
    244 extern void setup_ddi(void);
    245 extern void setup_ddi_poststartup(void);
    246 extern void impl_ddi_callback_init(void);
    247 extern void impl_fix_props(dev_info_t *, dev_info_t *, char *, int, caddr_t);
    248 extern int impl_check_cpu(dev_info_t *);
    249 extern int check_status(int, char *, dev_info_t *);
    250 
    251 extern int exclude_settrap(int);
    252 extern int exclude_level(int);
    253 
    254 extern major_t path_to_major(char *);
    255 extern void i_ddi_node_cache_init(void);
    256 extern dev_info_t *i_ddi_alloc_node(dev_info_t *, char *, pnode_t, int,
    257     ddi_prop_t *, int);
    258 extern void i_ddi_forceattach_drivers(void);
    259 extern int i_ddi_io_initialized(void);
    260 extern dev_info_t *i_ddi_create_branch(dev_info_t *, int);
    261 extern void i_ddi_add_devimap(dev_info_t *dip);
    262 extern void i_ddi_di_cache_invalidate(int kmflag);
    263 extern void i_ddi_di_cache_free(struct di_cache *cache);
    264 
    265 /* devname_state - for /dev to denote reconfig and system available */
    266 #define	DS_RECONFIG	0x01		/* reconfig boot */
    267 #define	DS_SYSAVAIL	0x02		/* implicit reconfig enabled */
    268 
    269 extern int i_ddi_sysavail(void);
    270 extern int i_ddi_reconfig(void);
    271 extern void i_ddi_set_sysavail(void);
    272 extern void i_ddi_set_reconfig(void);
    273 
    274 /* I/O retire related */
    275 extern int e_ddi_retire_device(char *path, char **cons_array);
    276 extern int e_ddi_unretire_device(char *path);
    277 extern int e_ddi_mark_retiring(dev_info_t *dip, void *arg);
    278 extern int e_ddi_retire_notify(dev_info_t *dip, void *arg);
    279 extern int e_ddi_retire_finalize(dev_info_t *dip, void *arg);
    280 extern void e_ddi_degrade_finalize(dev_info_t *dip);
    281 extern void e_ddi_undegrade_finalize(dev_info_t *dip);
    282 
    283 #endif /* _KERNEL */
    284 
    285 #ifdef	__cplusplus
    286 }
    287 #endif
    288 
    289 #endif /* _SYS_AUTOCONF_H */
    290