#ifndef _SYS_AUTOCONF_H
#define _SYS_AUTOCONF_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/dditypes.h>
#include <sys/devops.h>
#include <sys/mutex.h>
#include <sys/thread.h>
#include <sys/obpdefs.h>
#include <sys/systm.h>
#include <sys/hwconf.h>
struct devnames {
char *dn_name;
int dn_flags;
struct par_list *dn_pl;
kmutex_t dn_lock;
dev_info_t *dn_head;
int dn_instance;
void *dn_inlist;
ddi_prop_list_t *dn_global_prop_ptr;
kcondvar_t dn_wait;
kthread_id_t dn_busy_thread;
struct mperm *dn_mperm;
struct mperm *dn_mperm_wild;
struct mperm *dn_mperm_clone;
int dn_pinstance;
};
#define DN_CONF_PARSED 0x0001
#define DN_DRIVER_BUSY 0x0002
#define DN_DRIVER_INACTIVE 0x0004
#define DN_DRIVER_HELD 0x0020
#define DN_TAKEN_GETUDEV 0x0040
#define DN_DRIVER_REMOVED 0x0080
#define DN_FORCE_ATTACH 0x0100
#define DN_LEAF_DRIVER 0x0200
#define DN_NETWORK_DRIVER 0x0400
#define DN_NO_AUTODETACH 0x0800
#define DN_GLDV3_DRIVER 0x1000
#define DN_PHCI_DRIVER 0x2000
#define DN_OPEN_RETURNS_EINTR 0x4000
#define DN_SCSI_SIZE_CLEAN 0x8000
#define DN_NETWORK_PHYSDRIVER 0x10000
#define DN_DEVID_REGISTRANT 0x20000
#ifdef _KERNEL
#define DDI_AUDIT 0x0001
#define DDI_DEBUG 0x0002
#define DDI_MTCONFIG 0x0004
#define DDI_DEBUG_BOOTMOD 0x0008
#define DDI_DEBUG_COMPAT 0x0010
#define LDI_DBG_OPENCLOSE 0x0020
#define LDI_DBG_ALLOCFREE 0x0040
#define LDI_DBG_STREAMS 0x0080
#define LDI_DBG_EVENTCB 0x0100
#define DDI_INTR_API 0x0200
#define DDI_INTR_IMPL 0x0400
#define DDI_INTR_NEXUS 0x0800
#define DDI_DBG_RETIRE 0x1000
#define DDI_DBG_RTR_VRBOSE 0x2000
#define DDI_DBG_RTR_TRACE 0x4000
#define LDI_EV_DEBUG 0x8000
#define LDI_EV_TRACE 0x10000
#define DDI_INTR_IRM 0x20000
#define DDI_HP_API 0x40000
#define DDI_HP_IMPL 0x80000
#define DDI_HP_NEXUS 0x100000
#define DDI_MP_DEBUG 0x200000
extern int ddidebug;
#ifdef DEBUG
#define NDI_CONFIG_DEBUG(args) if (ddidebug & DDI_DEBUG) cmn_err args
#define BMDPRINTF(args) if (ddidebug & DDI_DEBUG_BOOTMOD) printf args
#define DCOMPATPRINTF(args) if (ddidebug & DDI_DEBUG_COMPAT) cmn_err args
#define LDI_OPENCLOSE(args) if (ddidebug & LDI_DBG_OPENCLOSE) cmn_err args
#define LDI_ALLOCFREE(args) if (ddidebug & LDI_DBG_ALLOCFREE) cmn_err args
#define LDI_STREAMS_LNK(args) if (ddidebug & LDI_DBG_STREAMS) cmn_err args
#define LDI_EVENTCB(args) if (ddidebug & LDI_DBG_EVENTCB) cmn_err args
#define DDI_INTR_APIDBG(args) if (ddidebug & DDI_INTR_API) cmn_err args
#define DDI_INTR_IMPLDBG(args) if (ddidebug & DDI_INTR_IMPL) cmn_err args
#define DDI_INTR_NEXDBG(args) if (ddidebug & DDI_INTR_NEXUS) cmn_err args
#define RIO_DEBUG(args) if (ddidebug & DDI_DBG_RETIRE) cmn_err args
#define RIO_VERBOSE(args) if (ddidebug & DDI_DBG_RTR_VRBOSE) cmn_err args
#define RIO_TRACE(args) if (ddidebug & DDI_DBG_RTR_TRACE) cmn_err args
#define LDI_EVDBG(args) if (ddidebug & LDI_EV_DEBUG) cmn_err args
#define LDI_EVTRC(args) if (ddidebug & LDI_EV_TRACE) cmn_err args
#define DDI_INTR_IRMDBG(args) if (ddidebug & DDI_INTR_IRM) cmn_err args
#define DDI_HP_APIDBG(args) if (ddidebug & DDI_HP_API) cmn_err args
#define DDI_HP_IMPLDBG(args) if (ddidebug & DDI_HP_IMPL) cmn_err args
#define DDI_HP_NEXDBG(args) if (ddidebug & DDI_HP_NEXUS) cmn_err args
#else
#define NDI_CONFIG_DEBUG(args)
#define BMDPRINTF(args)
#define DCOMPATPRINTF(args)
#define LDI_OPENCLOSE(args)
#define LDI_ALLOCFREE(args)
#define LDI_STREAMS_LNK(args)
#define LDI_EVENTCB(args)
#define DDI_INTR_APIDBG(args)
#define DDI_INTR_IMPLDBG(args)
#define DDI_INTR_NEXDBG(args)
#define RIO_DEBUG(args) if (ddidebug & DDI_DBG_RETIRE) cmn_err args
#define RIO_VERBOSE(args) if (ddidebug & DDI_DBG_RTR_VRBOSE) cmn_err args
#define RIO_TRACE(args) if (ddidebug & DDI_DBG_RTR_TRACE) cmn_err args
#define LDI_EVDBG(args) if (ddidebug & LDI_EV_DEBUG) cmn_err args
#define LDI_EVTRC(args) if (ddidebug & LDI_EV_TRACE) cmn_err args
#define DDI_INTR_IRMDBG(args)
#define DDI_HP_APIDBG(args)
#define DDI_HP_IMPLDBG(args)
#define DDI_HP_NEXDBG(args)
#endif
#define DDI_MP_DBG(args) if (ddidebug & DDI_MP_DEBUG) cmn_err args
#define DDI_STACK_DEPTH 14
typedef struct devinfo_audit {
dev_info_t *da_devinfo;
hrtime_t da_timestamp;
kthread_id_t da_thread;
struct devinfo_audit *da_lastlog;
ddi_node_state_t da_node_state;
int da_device_state;
int da_depth;
pc_t da_stack[DDI_STACK_DEPTH];
} devinfo_audit_t;
typedef struct {
kmutex_t dh_lock;
int dh_max;
int dh_curr;
int dh_hits;
devinfo_audit_t dh_entry[1];
} devinfo_log_header_t;
struct di_cache {
uint32_t cache_valid;
kmutex_t cache_lock;
void *cache_data;
size_t cache_size;
};
extern struct di_cache di_cache;
extern int di_cache_debug;
extern volatile ulong_t devtree_gen;
#define PSEUDO_PATH "/"DEVI_PSEUDO_NEXNAME
#define CLONE_PATH PSEUDO_PATH"/clone@0"
#define DI_CACHE_FILE "/etc/devices/snapshot_cache"
#define DI_CACHE_TEMP DI_CACHE_FILE".tmp"
extern dev_info_t *options_dip;
extern dev_info_t *pseudo_dip;
extern dev_info_t *clone_dip;
extern major_t clone_major;
extern major_t mm_major;
extern major_t nulldriver_major;
extern struct devnames *devnamesp;
extern struct devnames orphanlist;
extern struct dev_ops nodev_ops, mod_nodev_ops;
extern krwlock_t devinfo_tree_lock;
#define LOCK_DEV_OPS(lp) mutex_enter((lp))
#define UNLOCK_DEV_OPS(lp) mutex_exit((lp))
#define INCR_DEV_OPS_REF(opsp) (opsp)->devo_refcnt++
#define DECR_DEV_OPS_REF(opsp) (opsp)->devo_refcnt--
#define CB_DRV_INSTALLED(opsp) ((opsp) != &nodev_ops && \
(opsp) != &mod_nodev_ops)
#define DRV_UNLOADABLE(opsp) ((opsp)->devo_refcnt == 0)
#define DEV_OPS_HELD(opsp) ((opsp)->devo_refcnt > 0)
#define NEXUS_DRV(opsp) ((opsp)->devo_bus_ops != NULL)
#define NETWORK_DRV(maj) (devnamesp[(maj)].dn_flags & DN_NETWORK_DRIVER)
#define GLDV3_DRV(maj) (devnamesp[(maj)].dn_flags & DN_GLDV3_DRIVER)
#define NETWORK_PHYSDRV(maj) \
(devnamesp[(maj)].dn_flags & DN_NETWORK_PHYSDRIVER)
extern void impl_rem_dev_props(dev_info_t *);
extern void add_class(char *, char *);
extern int make_mbind(char *, int, char *, struct bind **);
extern void delete_mbind(const char *, struct bind **);
extern void purge_mbind(int, struct bind **);
extern void configure(void);
#if defined(__sparc)
extern void setcputype(void);
#endif
extern void devtree_freeze(void);
extern void reset_leaves(void);
extern void quiesce_devices(dev_info_t *, void *);
extern void setup_ddi(void);
extern void setup_ddi_poststartup(void);
extern void impl_ddi_callback_init(void);
extern void impl_fix_props(dev_info_t *, dev_info_t *, char *, int, caddr_t);
extern int impl_check_cpu(dev_info_t *);
extern int check_status(int, char *, dev_info_t *);
extern int exclude_settrap(int);
extern int exclude_level(int);
extern major_t path_to_major(char *);
extern void i_ddi_node_cache_init(void);
extern dev_info_t *i_ddi_alloc_node(dev_info_t *, const char *, pnode_t, int,
ddi_prop_t *, int);
extern void i_ddi_forceattach_drivers(void);
extern int i_ddi_io_initialized(void);
extern dev_info_t *i_ddi_create_branch(dev_info_t *, int);
extern void i_ddi_add_devimap(dev_info_t *dip);
extern void i_ddi_di_cache_invalidate(void);
extern void i_ddi_di_cache_free(struct di_cache *cache);
#define DS_RECONFIG 0x01
#define DS_SYSAVAIL 0x02
extern int i_ddi_sysavail(void);
extern int i_ddi_reconfig(void);
extern void i_ddi_set_sysavail(void);
extern void i_ddi_set_reconfig(void);
extern int e_ddi_retire_device(char *path, char **cons_array);
extern int e_ddi_unretire_device(char *path);
extern int e_ddi_mark_retiring(dev_info_t *dip, void *arg);
extern int e_ddi_retire_notify(dev_info_t *dip, void *arg);
extern int e_ddi_retire_finalize(dev_info_t *dip, void *arg);
extern void e_ddi_degrade_finalize(dev_info_t *dip);
extern void e_ddi_undegrade_finalize(dev_info_t *dip);
extern int check_driver_quiesce(dev_info_t *dip, void *arg);
#endif
#ifdef __cplusplus
}
#endif
#endif