#ifndef _SYS_DDI_IMPLDEFS_H
#define _SYS_DDI_IMPLDEFS_H
#include <sys/types.h>
#include <sys/param.h>
#include <sys/t_lock.h>
#include <sys/ddipropdefs.h>
#include <sys/devops.h>
#include <sys/autoconf.h>
#include <sys/mutex.h>
#include <vm/page.h>
#include <sys/dacf_impl.h>
#include <sys/ndifm.h>
#include <sys/epm.h>
#include <sys/ddidmareq.h>
#include <sys/ddi_intr.h>
#include <sys/ddi_hp.h>
#include <sys/ddi_hp_impl.h>
#include <sys/ddi_isa.h>
#include <sys/id_space.h>
#include <sys/modhash.h>
#include <sys/bitset.h>
#ifdef __cplusplus
extern "C" {
#endif
#define DEVID_COMPATIBILITY ((ddi_devid_t)-1)
typedef enum {
DDI_NC_PROM = 0,
DDI_NC_PSEUDO
} ddi_node_class_t;
typedef enum {
DDI_CB_INTR_ADD,
DDI_CB_INTR_REMOVE
} ddi_cb_action_t;
typedef enum {
DDI_CB_FLAG_INTR = 0x1
} ddi_cb_flags_t;
#define DDI_CB_FLAG_VALID(f) ((f) & DDI_CB_FLAG_INTR)
typedef int (*ddi_cb_func_t)(dev_info_t *dip, ddi_cb_action_t action,
void *cbarg, void *arg1, void *arg2);
typedef struct ddi_cb {
uint64_t cb_flags;
dev_info_t *cb_dip;
ddi_cb_func_t cb_func;
void *cb_arg1;
void *cb_arg2;
} ddi_cb_t;
struct devinfo_audit;
typedef struct devi_port {
union {
struct {
uint32_t type;
uint32_t pad;
} port;
uint64_t type64;
} info;
void *priv_p;
} devi_port_t;
typedef struct devi_bus_priv {
devi_port_t port_up;
devi_port_t port_down;
} devi_bus_priv_t;
#if defined(__x86)
struct iommulib_unit;
typedef struct iommulib_unit *iommulib_handle_t;
struct iommulib_nex;
typedef struct iommulib_nex *iommulib_nexhandle_t;
#endif
typedef uint8_t ndi_flavor_t;
struct ddi_hp_cn_handle;
struct in_node;
struct dev_info {
struct dev_info *devi_parent;
struct dev_info *devi_child;
struct dev_info *devi_sibling;
char *devi_binding_name;
char *devi_addr;
int devi_nodeid;
int devi_instance;
struct dev_ops *devi_ops;
void *devi_parent_data;
void *devi_driver_data;
ddi_prop_t *devi_drv_prop_ptr;
ddi_prop_t *devi_sys_prop_ptr;
struct ddi_minor_data *devi_minor;
struct dev_info *devi_next;
kmutex_t devi_lock;
struct dev_info *devi_bus_map_fault;
void *devi_obsolete;
struct dev_info *devi_bus_dma_allochdl;
struct dev_info *devi_bus_dma_freehdl;
struct dev_info *devi_bus_dma_bindhdl;
struct dev_info *devi_bus_dma_unbindhdl;
struct dev_info *devi_bus_dma_flush;
struct dev_info *devi_bus_dma_win;
struct dev_info *devi_bus_dma_ctl;
struct dev_info *devi_bus_ctl;
ddi_prop_t *devi_hw_prop_ptr;
char *devi_node_name;
char *devi_compat_names;
size_t devi_compat_length;
int (*devi_bus_dma_bindfunc)(dev_info_t *, dev_info_t *,
ddi_dma_handle_t, struct ddi_dma_req *, ddi_dma_cookie_t *,
uint_t *);
int (*devi_bus_dma_unbindfunc)(dev_info_t *, dev_info_t *,
ddi_dma_handle_t);
char *devi_devid_str;
struct pm_info *devi_pm_info;
uint_t devi_pm_flags;
int devi_pm_num_components;
size_t devi_pm_comp_size;
struct pm_component *devi_pm_components;
struct dev_info *devi_pm_ppm;
void *devi_pm_ppm_private;
int devi_pm_dev_thresh;
uint_t devi_pm_kidsupcnt;
struct pm_scan *devi_pm_scan;
uint_t devi_pm_noinvolpm;
uint_t devi_pm_volpmd;
kmutex_t devi_pm_lock;
kmutex_t devi_pm_busy_lock;
uint_t devi_state;
kcondvar_t devi_cv;
int devi_ref;
dacf_rsrvlist_t *devi_dacf_tasks;
ddi_node_class_t devi_node_class;
int devi_node_attributes;
char *devi_device_class;
int devi_mdi_component;
void *devi_mdi_client;
void *devi_mdi_xhci;
ddi_prop_list_t *devi_global_prop_list;
major_t devi_major;
ddi_node_state_t devi_node_state;
uint_t devi_flags;
int devi_circular;
void *devi_busy_thread;
void *devi_taskq;
struct devinfo_audit *devi_audit;
struct i_ddi_fmhdl *devi_fmhdl;
uint_t devi_cpr_flags;
devinfo_intr_t *devi_intr_p;
void *devi_nex_pm;
char *devi_addr_buf;
char *devi_rebinding_name;
kmutex_t devi_ct_lock;
kcondvar_t devi_ct_cv;
int devi_ct_count;
int devi_ct_neg;
list_t devi_ct;
devi_bus_priv_t devi_bus;
struct i_ddi_prop_dyn *devi_prop_dyn_driver;
struct i_ddi_prop_dyn *devi_prop_dyn_parent;
#if defined(__x86)
void *devi_iommu;
iommulib_handle_t devi_iommulib_handle;
iommulib_nexhandle_t devi_iommulib_nex_handle;
#endif
ddi_cb_t *devi_cb_p;
ndi_flavor_t devi_flavor;
ndi_flavor_t devi_flavorv_n;
void **devi_flavorv;
struct ddi_hp_cn_handle *devi_hp_hdlp;
struct in_node *devi_in_node;
char *devi_ev_path;
int devi_ev_instance;
kmutex_t devi_unbind_lock;
list_t devi_unbind_cbs;
};
#define DEVI(dev_info_type) ((struct dev_info *)(dev_info_type))
#define devi_name devi_binding_name
#define DDI_CF1(devi) (DEVI(devi)->devi_addr != NULL)
#define DDI_CF2(devi) (DEVI(devi)->devi_ops != NULL)
#define DDI_DRV_UNLOADED(devi) (DEVI(devi)->devi_ops == &mod_nodev_ops)
#define DEVI_DEVICE_OFFLINE 0x00000001
#define DEVI_DEVICE_DOWN 0x00000002
#define DEVI_DEVICE_DEGRADED 0x00000004
#define DEVI_DEVICE_REMOVED 0x00000008
#define DEVI_BUS_QUIESCED 0x00000100
#define DEVI_BUS_DOWN 0x00000200
#define DEVI_NDI_CONFIG 0x00000400
#define DEVI_S_ATTACHING 0x00010000
#define DEVI_S_DETACHING 0x00020000
#define DEVI_S_ONLINING 0x00040000
#define DEVI_S_OFFLINING 0x00080000
#define DEVI_S_INVOKING_DACF 0x00100000
#define DEVI_S_UNBOUND 0x00200000
#define DEVI_S_REPORT 0x08000000
#define DEVI_S_EVADD 0x10000000
#define DEVI_S_EVREMOVE 0x20000000
#define DEVI_S_NEED_RESET 0x40000000
#define DEVI_IS_DEVICE_OFFLINE(dip) \
((DEVI(dip)->devi_state & DEVI_DEVICE_OFFLINE) == DEVI_DEVICE_OFFLINE)
#define DEVI_SET_DEVICE_ONLINE(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
if (DEVI(dip)->devi_state & DEVI_DEVICE_DEGRADED) { \
mutex_exit(&DEVI(dip)->devi_lock); \
e_ddi_undegrade_finalize(dip); \
mutex_enter(&DEVI(dip)->devi_lock); \
} \
\
DEVI(dip)->devi_state &= ~(DEVI_DEVICE_DOWN | \
DEVI_DEVICE_DEGRADED | DEVI_DEVICE_OFFLINE); \
}
#define DEVI_SET_DEVICE_OFFLINE(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= (DEVI_DEVICE_OFFLINE | DEVI_S_REPORT); \
}
#define DEVI_IS_DEVICE_DOWN(dip) \
((DEVI(dip)->devi_state & DEVI_DEVICE_DOWN) == DEVI_DEVICE_DOWN)
#define DEVI_SET_DEVICE_DOWN(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
ASSERT(!DEVI_IS_DEVICE_OFFLINE(dip)); \
DEVI(dip)->devi_state |= (DEVI_DEVICE_DOWN | DEVI_S_REPORT); \
}
#define DEVI_IS_DEVICE_DEGRADED(dip) \
((DEVI(dip)->devi_state & \
(DEVI_DEVICE_DEGRADED|DEVI_DEVICE_DOWN)) == DEVI_DEVICE_DEGRADED)
#define DEVI_SET_DEVICE_DEGRADED(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
ASSERT(!DEVI_IS_DEVICE_OFFLINE(dip)); \
mutex_exit(&DEVI(dip)->devi_lock); \
e_ddi_degrade_finalize(dip); \
mutex_enter(&DEVI(dip)->devi_lock); \
DEVI(dip)->devi_state |= (DEVI_DEVICE_DEGRADED | DEVI_S_REPORT); \
}
#define DEVI_SET_DEVICE_UP(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
ASSERT(!DEVI_IS_DEVICE_OFFLINE(dip)); \
if (DEVI(dip)->devi_state & DEVI_DEVICE_DEGRADED) { \
mutex_exit(&DEVI(dip)->devi_lock); \
e_ddi_undegrade_finalize(dip); \
mutex_enter(&DEVI(dip)->devi_lock); \
} \
DEVI(dip)->devi_state &= ~(DEVI_DEVICE_DEGRADED | DEVI_DEVICE_DOWN); \
DEVI(dip)->devi_state |= DEVI_S_REPORT; \
}
#define DEVI_IS_DEVICE_REMOVED(dip) \
((DEVI(dip)->devi_state & DEVI_DEVICE_REMOVED) == DEVI_DEVICE_REMOVED)
#define DEVI_SET_DEVICE_REMOVED(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_DEVICE_REMOVED | DEVI_S_REPORT; \
}
#define DEVI_SET_DEVICE_REINSERTED(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_DEVICE_REMOVED; \
DEVI(dip)->devi_state |= DEVI_S_REPORT; \
}
#define DEVI_IS_BUS_QUIESCED(dip) \
((DEVI(dip)->devi_state & DEVI_BUS_QUIESCED) == DEVI_BUS_QUIESCED)
#define DEVI_SET_BUS_ACTIVE(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_BUS_QUIESCED; \
DEVI(dip)->devi_state |= DEVI_S_REPORT; \
}
#define DEVI_SET_BUS_QUIESCE(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= (DEVI_BUS_QUIESCED | DEVI_S_REPORT); \
}
#define DEVI_IS_BUS_DOWN(dip) \
((DEVI(dip)->devi_state & DEVI_BUS_DOWN) == DEVI_BUS_DOWN)
#define DEVI_SET_BUS_UP(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_BUS_DOWN; \
DEVI(dip)->devi_state |= DEVI_S_REPORT; \
}
#define DEVI_SET_BUS_DOWN(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= (DEVI_BUS_DOWN | DEVI_S_REPORT); \
}
#define DEVI_NEED_REPORT(dip) \
((DEVI(dip)->devi_state & DEVI_S_REPORT) == DEVI_S_REPORT)
#define DEVI_SET_REPORT(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_S_REPORT; \
}
#define DEVI_REPORT_DONE(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_REPORT; \
}
#define DEVI_NEED_NDI_CONFIG(dip) \
((DEVI(dip)->devi_state & DEVI_NDI_CONFIG) == DEVI_NDI_CONFIG)
#define DEVI_SET_NDI_CONFIG(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_NDI_CONFIG; \
}
#define DEVI_CLR_NDI_CONFIG(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_NDI_CONFIG; \
}
#define DEVI_IS_ATTACHING(dip) \
((DEVI(dip)->devi_state & DEVI_S_ATTACHING) == DEVI_S_ATTACHING)
#define DEVI_SET_ATTACHING(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_S_ATTACHING; \
}
#define DEVI_CLR_ATTACHING(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_ATTACHING; \
}
#define DEVI_IS_DETACHING(dip) \
((DEVI(dip)->devi_state & DEVI_S_DETACHING) == DEVI_S_DETACHING)
#define DEVI_SET_DETACHING(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_S_DETACHING; \
}
#define DEVI_CLR_DETACHING(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_DETACHING; \
}
#define DEVI_IS_ONLINING(dip) \
((DEVI(dip)->devi_state & DEVI_S_ONLINING) == DEVI_S_ONLINING)
#define DEVI_SET_ONLINING(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_S_ONLINING; \
}
#define DEVI_CLR_ONLINING(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_ONLINING; \
}
#define DEVI_IS_OFFLINING(dip) \
((DEVI(dip)->devi_state & DEVI_S_OFFLINING) == DEVI_S_OFFLINING)
#define DEVI_SET_OFFLINING(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_S_OFFLINING; \
}
#define DEVI_CLR_OFFLINING(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_OFFLINING; \
}
#define DEVI_IS_IN_RECONFIG(dip) \
(DEVI(dip)->devi_state & (DEVI_S_OFFLINING | DEVI_S_ONLINING))
#define DEVI_IS_INVOKING_DACF(dip) \
((DEVI(dip)->devi_state & DEVI_S_INVOKING_DACF) == DEVI_S_INVOKING_DACF)
#define DEVI_SET_INVOKING_DACF(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_S_INVOKING_DACF; \
}
#define DEVI_CLR_INVOKING_DACF(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_INVOKING_DACF; \
}
#define DEVI_EVADD(dip) \
((DEVI(dip)->devi_state & DEVI_S_EVADD) == DEVI_S_EVADD)
#define DEVI_SET_EVADD(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_EVREMOVE; \
DEVI(dip)->devi_state |= DEVI_S_EVADD; \
}
#define DEVI_EVREMOVE(dip) \
((DEVI(dip)->devi_state & DEVI_S_EVREMOVE) == DEVI_S_EVREMOVE)
#define DEVI_SET_EVREMOVE(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_EVADD; \
DEVI(dip)->devi_state |= DEVI_S_EVREMOVE; \
}
#define DEVI_SET_EVUNINIT(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~(DEVI_S_EVADD | DEVI_S_EVREMOVE); \
}
#define DEVI_NEED_RESET(dip) \
((DEVI(dip)->devi_state & DEVI_S_NEED_RESET) == DEVI_S_NEED_RESET)
#define DEVI_SET_NEED_RESET(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state |= DEVI_S_NEED_RESET; \
}
#define DEVI_CLR_NEED_RESET(dip) { \
ASSERT(mutex_owned(&DEVI(dip)->devi_lock)); \
DEVI(dip)->devi_state &= ~DEVI_S_NEED_RESET; \
}
#define DEVI_BUSY 0x00000001
#define DEVI_MADE_CHILDREN 0x00000002
#define DEVI_ATTACHED_CHILDREN 0x00000004
#define DEVI_BRANCH_HELD 0x00000008
#define DEVI_NO_BIND 0x00000010
#define DEVI_CACHED_DEVID 0x00000020
#define DEVI_PHCI_SIGNALS_VHCI 0x00000040
#define DEVI_REBIND 0x00000080
#define DEVI_RETIRED 0x00000100
#define DEVI_RETIRING 0x00000200
#define DEVI_R_CONSTRAINT 0x00000400
#define DEVI_R_BLOCKED 0x00000800
#define DEVI_CT_NOP 0x00001000
#define DEVI_PCI_DEVICE 0x00002000
#define DEVI_BUSY_CHANGING(dip) (DEVI(dip)->devi_flags & DEVI_BUSY)
#define DEVI_BUSY_OWNED(dip) (DEVI_BUSY_CHANGING(dip) && \
((DEVI(dip))->devi_busy_thread == curthread))
#define DEVI_IS_PCI(dip) (DEVI(dip)->devi_flags & DEVI_PCI_DEVICE)
#define DEVI_SET_PCI(dip) (DEVI(dip)->devi_flags |= (DEVI_PCI_DEVICE))
char *i_ddi_devi_class(dev_info_t *);
int i_ddi_set_devi_class(dev_info_t *, const char *, int);
struct regspec {
uint_t regspec_bustype;
uint_t regspec_addr;
uint_t regspec_size;
};
struct regspec64 {
uint64_t regspec_bustype;
uint64_t regspec_addr;
uint64_t regspec_size;
};
struct rangespec {
uint_t rng_cbustype;
uint_t rng_coffset;
uint_t rng_bustype;
uint_t rng_offset;
uint_t rng_size;
};
#ifdef _KERNEL
typedef enum {
DDI_PRE = 0,
DDI_POST = 1
} ddi_pre_post_t;
struct attachspec {
ddi_attach_cmd_t cmd;
ddi_pre_post_t when;
dev_info_t *pdip;
int result;
};
struct detachspec {
ddi_detach_cmd_t cmd;
ddi_pre_post_t when;
dev_info_t *pdip;
int result;
};
#endif
typedef enum {
DDM_MINOR = 0,
DDM_ALIAS,
DDM_DEFAULT,
DDM_INTERNAL_PATH
} ddi_minor_type;
#define DM_NO_FSPERM 0x1
struct devplcy;
struct ddi_minor {
char *name;
dev_t dev;
int spec_type;
int flags;
const char *node_type;
struct devplcy *node_priv;
mode_t priv_mode;
};
#define DDI_PERSISTENT 0x01
#define DDI_AUTO_ASSIGNED_NODEID 0x02
#define DDI_VHCI_NODE 0x04
#define DDI_HIDDEN_NODE 0x08
#define DDI_HOTPLUG_NODE 0x10
#define DEVI_VHCI_NODE(dip) \
(DEVI(dip)->devi_node_attributes & DDI_VHCI_NODE)
struct ddi_minor_data {
struct ddi_minor_data *next;
dev_info_t *dip;
ddi_minor_type type;
struct ddi_minor d_minor;
};
#define ddm_name d_minor.name
#define ddm_dev d_minor.dev
#define ddm_flags d_minor.flags
#define ddm_spec_type d_minor.spec_type
#define ddm_node_type d_minor.node_type
#define ddm_node_priv d_minor.node_priv
#define ddm_priv_mode d_minor.priv_mode
struct ddi_parent_private_data {
int par_nreg;
struct regspec *par_reg;
int par_nintr;
struct intrspec *par_intr;
int par_nrng;
struct rangespec *par_rng;
};
#define DEVI_PD(d) \
((struct ddi_parent_private_data *)DEVI((d))->devi_parent_data)
#define sparc_pd_getnreg(dev) (DEVI_PD(dev)->par_nreg)
#define sparc_pd_getnintr(dev) (DEVI_PD(dev)->par_nintr)
#define sparc_pd_getnrng(dev) (DEVI_PD(dev)->par_nrng)
#define sparc_pd_getreg(dev, n) (&DEVI_PD(dev)->par_reg[(n)])
#define sparc_pd_getintr(dev, n) (&DEVI_PD(dev)->par_intr[(n)])
#define sparc_pd_getrng(dev, n) (&DEVI_PD(dev)->par_rng[(n)])
#ifdef _KERNEL
typedef struct i_ddi_soft_state {
void **array;
kmutex_t lock;
size_t size;
size_t n_items;
struct i_ddi_soft_state *next;
} i_ddi_soft_state;
typedef struct i_ddi_soft_state_bystr {
size_t ss_size;
mod_hash_t *ss_mod_hash;
} i_ddi_soft_state_bystr;
typedef struct i_ddi_strid {
size_t strid_chunksz;
size_t strid_spacesz;
id_space_t *strid_space;
mod_hash_t *strid_byid;
mod_hash_t *strid_bystr;
} i_ddi_strid;
#endif
#if defined(__sparc)
typedef struct ddi_dma_impl {
ulong_t dmai_mapping;
uint_t dmai_size;
off_t dmai_offset;
uint_t dmai_minxfer;
uint_t dmai_burstsizes;
uint_t dmai_ndvmapages;
uint_t dmai_pool;
uint_t dmai_rflags;
uint_t dmai_inuse;
uint_t dmai_nwin;
uint_t dmai_winsize;
uint_t dmai_ncookies;
uint_t dmai_curcookie;
caddr_t dmai_nexus_private;
void *dmai_iopte;
uint_t *dmai_sbi;
void *dmai_minfo;
dev_info_t *dmai_rdip;
ddi_dma_obj_t dmai_object;
ddi_dma_attr_t dmai_attr;
ddi_dma_cookie_t *dmai_cookie;
int (*dmai_fault_check)(struct ddi_dma_impl *handle);
void (*dmai_fault_notify)(struct ddi_dma_impl *handle);
int dmai_fault;
ndi_err_t dmai_error;
} ddi_dma_impl_t;
#elif defined(__x86)
typedef struct ddi_dma_impl {
ddi_dma_cookie_t *dmai_cookie;
uint_t dmai_ncookies;
uint_t dmai_curcookie;
void *dmai_private;
uint_t dmai_minxfer;
uint_t dmai_burstsizes;
uint_t dmai_rflags;
int dmai_nwin;
dev_info_t *dmai_rdip;
ddi_dma_attr_t dmai_attr;
int (*dmai_fault_check)(struct ddi_dma_impl *handle);
void (*dmai_fault_notify)(struct ddi_dma_impl *handle);
int dmai_fault;
ndi_err_t dmai_error;
} ddi_dma_impl_t;
#else
#error "struct ddi_dma_impl not defined for this architecture"
#endif
typedef ddi_dma_impl_t ddi_dma_seg_impl_t;
#define _DMCM1 DDI_DMA_RDWR|DDI_DMA_REDZONE|DDI_DMA_PARTIAL
#define _DMCM2 DDI_DMA_CONSISTENT|DMP_VMEREQ
#define DMP_DDIFLAGS (_DMCM1|_DMCM2)
#define DMP_SHADOW 0x20
#define DMP_LKIOPB 0x40
#define DMP_LKSYSV 0x80
#define DMP_IOCACHE 0x100
#define DMP_USEHAT 0x200
#define DMP_PHYSADDR 0x400
#define DMP_INVALID 0x800
#define DMP_NOLIMIT 0x1000
#define DMP_VMEREQ 0x10000000
#define DMP_BYPASSNEXUS 0x20000000
#define DMP_NODEVSYNC 0x40000000
#define DMP_NOCPUSYNC 0x80000000
#define DMP_NOSYNC (DMP_NODEVSYNC|DMP_NOCPUSYNC)
struct dma_phys_mapc {
struct ddi_dma_req *dma_req;
ddi_dma_impl_t *mp;
int nptes;
void *ptes;
};
#define MAXCALLBACK 20
struct ddi_callback {
struct ddi_callback *c_nfree;
struct ddi_callback *c_nlist;
int (*c_call)();
int c_count;
caddr_t c_arg;
size_t c_size;
};
typedef struct i_ddi_prop_dyn {
char *dp_name;
int dp_type;
int dp_spec_type;
} i_ddi_prop_dyn_t;
void i_ddi_prop_dyn_driver_set(dev_info_t *,
i_ddi_prop_dyn_t *);
i_ddi_prop_dyn_t *i_ddi_prop_dyn_driver_get(dev_info_t *);
void i_ddi_prop_dyn_parent_set(dev_info_t *,
i_ddi_prop_dyn_t *);
i_ddi_prop_dyn_t *i_ddi_prop_dyn_parent_get(dev_info_t *);
void i_ddi_prop_dyn_cache_invalidate(dev_info_t *,
i_ddi_prop_dyn_t *);
#define DEVID_MAGIC_MSB 0x69
#define DEVID_MAGIC_LSB 0x64
#define DEVID_REV_MSB 0x00
#define DEVID_REV_LSB 0x01
#define DEVID_HINT_SIZE 4
typedef struct impl_devid {
uchar_t did_magic_hi;
uchar_t did_magic_lo;
uchar_t did_rev_hi;
uchar_t did_rev_lo;
uchar_t did_type_hi;
uchar_t did_type_lo;
uchar_t did_len_hi;
uchar_t did_len_lo;
char did_driver[DEVID_HINT_SIZE];
char did_id[1];
} impl_devid_t;
#define DEVID_GETTYPE(devid) ((ushort_t) \
(((devid)->did_type_hi << NBBY) + \
(devid)->did_type_lo))
#define DEVID_FORMTYPE(devid, type) (devid)->did_type_hi = hibyte((type)); \
(devid)->did_type_lo = lobyte((type));
#define DEVID_GETLEN(devid) ((ushort_t) \
(((devid)->did_len_hi << NBBY) + \
(devid)->did_len_lo))
#define DEVID_FORMLEN(devid, len) (devid)->did_len_hi = hibyte((len)); \
(devid)->did_len_lo = lobyte((len));
#define DEVID_IDBYTE_ISASCII(b) ( \
(((b) >= 'a') && ((b) <= 'z')) || \
(((b) >= 'A') && ((b) <= 'Z')) || \
(((b) >= '0') && ((b) <= '9')) || \
(b == '+') || (b == '-') || (b == '.') || (b == '=') || \
(b == ' ') || (b == 0x00))
#define DEVID_TYPE_SETASCII(c) (c - 0x20)
#define DEVID_TYPE_ISASCII(c) (((c) >= 'A') && ((c) <= 'Z'))
#define DEVID_TYPE_BINTOASCII(b) ( \
((b) == DEVID_SCSI3_WWN) ? 'w' : \
((b) == DEVID_SCSI3_VPD_T10) ? 't' : \
((b) == DEVID_SCSI3_VPD_EUI) ? 'x' : \
((b) == DEVID_SCSI3_VPD_NAA) ? 'n' : \
((b) == DEVID_SCSI_SERIAL) ? 's' : \
((b) == DEVID_FAB) ? 'f' : \
((b) == DEVID_ENCAP) ? 'e' : \
((b) == DEVID_ATA_SERIAL) ? 'a' : \
((b) == DEVID_NVME_NSID) ? 'd' : \
((b) == DEVID_NVME_EUI64) ? 'i' : \
((b) == DEVID_NVME_NGUID) ? 'g' : \
'u')
#define DEVID_TYPE_ASCIITOBIN(c) ( \
(((c) == 'w') || ((c) == 'W')) ? DEVID_SCSI3_WWN : \
(((c) == 't') || ((c) == 'T')) ? DEVID_SCSI3_VPD_T10 : \
(((c) == 'x') || ((c) == 'X')) ? DEVID_SCSI3_VPD_EUI : \
(((c) == 'n') || ((c) == 'N')) ? DEVID_SCSI3_VPD_NAA : \
(((c) == 's') || ((c) == 'S')) ? DEVID_SCSI_SERIAL : \
(((c) == 'f') || ((c) == 'F')) ? DEVID_FAB : \
(((c) == 'e') || ((c) == 'E')) ? DEVID_ENCAP : \
(((c) == 'a') || ((c) == 'A')) ? DEVID_ATA_SERIAL : \
(((c) == 'd') || ((c) == 'D')) ? DEVID_NVME_NSID : \
(((c) == 'i') || ((c) == 'I')) ? DEVID_NVME_EUI64 : \
(((c) == 'g') || ((c) == 'G')) ? DEVID_NVME_NGUID : \
DEVID_MAXTYPE +1)
#define DEVID_TYPE_BIN_FORCEHEX(b) ( \
((b) == DEVID_SCSI3_WWN) || \
((b) == DEVID_SCSI3_VPD_EUI) || \
((b) == DEVID_SCSI3_VPD_NAA) || \
((b) == DEVID_NVME_EUI64) || \
((b) == DEVID_NVME_NGUID) || \
((b) == DEVID_FAB))
#define IS_DEVID_SCSI3_VPD_TYPE(b) ( \
((b) == DEVID_SCSI3_VPD_T10) || \
((b) == DEVID_SCSI3_VPD_EUI) || \
((b) == DEVID_SCSI3_VPD_NAA))
#define DEVID_REV_BINTOASCII(b) (b + '0')
#define DEVID_REV_ASCIITOBIN(c) (c - '0')
#define DEVID_PROP_NAME "devid"
#define SAVED_CONFIG_REGS "pci-config-regs"
#define SAVED_CONFIG_REGS_MASK "pcie-config-regs-mask"
#define SAVED_CONFIG_REGS_CAPINFO "pci-cap-info"
typedef struct pci_config_header_state {
uint16_t chs_command;
uint8_t chs_cache_line_size;
uint8_t chs_latency_timer;
uint8_t chs_header_type;
uint8_t chs_sec_latency_timer;
uint8_t chs_bridge_control;
uint32_t chs_base0;
uint32_t chs_base1;
uint32_t chs_base2;
uint32_t chs_base3;
uint32_t chs_base4;
uint32_t chs_base5;
} pci_config_header_state_t;
#ifdef _KERNEL
typedef struct pci_cap_save_desc {
uint16_t cap_offset;
uint16_t cap_id;
uint32_t cap_nregs;
} pci_cap_save_desc_t;
typedef struct pci_cap_entry {
uint16_t cap_id;
uint16_t cap_reg;
uint16_t cap_mask;
uint32_t cap_ndwords;
uint32_t (*cap_save_func)(ddi_acc_handle_t confhdl, uint16_t cap_ptr,
uint32_t *regbuf, uint32_t ndwords);
} pci_cap_entry_t;
#endif
#ifdef __cplusplus
}
#endif
#endif