#ifndef _SYS_EPM_H
#define _SYS_EPM_H
#include <sys/pm.h>
#include <sys/dditypes.h>
#include <sys/devops.h>
#include <sys/ddi_impldefs.h>
#include <sys/taskq.h>
#include <sys/tzfile.h>
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
void e_pm_props(dev_info_t *);
int e_new_pm_props(dev_info_t *);
#define PM_LEVEL_UPONLY (-2)
#define PM_LEVEL_DOWNONLY (-3)
#define PM_LEVEL_EXACT (-4)
#define PMC_NEEDS_SR 0x00001
#define PMC_NO_SR 0x00002
#define PMC_PARENTAL_SR 0x00004
#define PMC_WANTS_NOTIFY 0x00008
#define PMC_BC 0x00010
#define PMC_COMPONENTS_DONE 0x00020
#define PMC_COMPONENTS_FAILED 0x00040
#define PMC_SUSPENDED 0x00080
#define PMC_DEF_THRESH 0x00100
#define PMC_DEV_THRESH 0x00200
#define PMC_COMP_THRESH 0x00400
#define PMC_NEXDEF_THRESH 0x00800
#define PMC_NOPMKID 0x01000
#define PMC_NO_INVOL 0x02000
#define PMC_VOLPMD 0x04000
#define PMC_SKIP_BRINGUP 0x08000
#define PMC_CONSOLE_FB 0x10000
#define PMC_NOINVOL_DONE 0x20000
#define PMC_DRIVER_REMOVED 0x40000
#define PMC_CPU_DEVICE 0x80000
#define PMC_CPU_THRESH 0x100000
#define PMC_THRESH_ALL (PMC_DEF_THRESH | PMC_DEV_THRESH | \
PMC_COMP_THRESH | PMC_NEXDEF_THRESH | PMC_CPU_THRESH)
#define PMC_THRESH_NONE ~(PMC_THRESH_ALL)
#define PM_POWER_OP 0x00001
#define PM_PHC_WHILE_SET_POWER 0x00002
typedef struct pm_scan {
int ps_idle_down;
int ps_scan_flags;
timeout_id_t ps_scan_id;
} pm_scan_t;
#define PM_SCANNING 0x100
#define PM_SCAN_AGAIN 0x200
#define PM_SCAN_STOP 0x400
#define PM_SCAN_DISPATCHED 0x800
#define PM_DEFAULT_MIN_SCAN ((clock_t)15)
#define PM_CPU_MIN_SCAN ((clock_t)1)
typedef struct pm_comp {
char *pmc_name;
int pmc_numlevels;
int *pmc_lvals;
int *pmc_thresh;
char **pmc_lnames;
size_t pmc_name_sz;
char *pmc_lname_buf;
size_t pmc_lnames_sz;
} pm_comp_t;
typedef struct pm_component {
uint_t pmc_flags;
uint_t pmc_busycount;
time_t pmc_timestamp;
uint_t pmc_norm_pwr;
int pmc_cur_pwr;
int pmc_phc_pwr;
pm_comp_t pmc_comp;
} pm_component_t;
typedef struct pm_info {
uint_t pmi_dev_pm_state;
int pmi_clone;
int pmi_levels[2];
int *pmi_lp;
kcondvar_t pmi_cv;
} pm_info_t;
typedef struct pm_dep_wk {
int pdw_type;
int pdw_wait;
int pdw_done;
int pdw_ret;
int pdw_pwr;
kcondvar_t pdw_cv;
struct pm_dep_wk *pdw_next;
char *pdw_keeper;
char *pdw_kept;
} pm_dep_wk_t;
#define PM_DEP_WK_POWER_ON 1
#define PM_DEP_WK_POWER_OFF 2
#define PM_DEP_WK_DETACH 3
#define PM_DEP_WK_REMOVE_DEP 4
#define PM_DEP_WK_BRINGUP_SELF 5
#define PM_DEP_WK_RECORD_KEEPER 6
#define PM_DEP_WK_RECORD_KEEPER_PROP 7
#define PM_DEP_WK_KEPT 8
#define PM_DEP_WK_KEEPER 9
#define PM_DEP_WK_ATTACH 10
#define PM_DEP_WK_CHECK_KEPT 11
#define PM_DEP_WK_CPR_SUSPEND 12
#define PM_DEP_WK_CPR_RESUME 13
#define PM_DEP_WAIT 1
#define PM_DEP_NOWAIT 0
typedef enum pm_canblock
{
PM_CANBLOCK_BLOCK,
PM_CANBLOCK_FAIL,
PM_CANBLOCK_BYPASS
} pm_canblock_t;
typedef enum pm_cpupm
{
PM_CPUPM_NOTSET,
PM_CPUPM_POLLING,
PM_CPUPM_EVENT,
PM_CPUPM_DISABLE
} pm_cpupm_t;
#define PPM(dip) ((dev_info_t *)DEVI(dip)->devi_pm_ppm)
typedef enum {
PMR_SET_POWER = 1,
PMR_SUSPEND,
PMR_RESUME,
PMR_PRE_SET_POWER,
PMR_POST_SET_POWER,
PMR_PPM_SET_POWER,
PMR_PPM_ATTACH,
PMR_PPM_DETACH,
PMR_PPM_POWER_CHANGE_NOTIFY,
PMR_REPORT_PMCAP,
PMR_CHANGED_POWER,
PMR_PPM_PRE_PROBE,
PMR_PPM_POST_PROBE,
PMR_PPM_PRE_ATTACH,
PMR_PPM_POST_ATTACH,
PMR_PPM_PRE_DETACH,
PMR_PPM_POST_DETACH,
PMR_PPM_UNMANAGE,
PMR_PPM_PRE_RESUME,
PMR_PPM_ALL_LOWEST,
PMR_PPM_LOCK_POWER,
PMR_PPM_UNLOCK_POWER,
PMR_PPM_TRY_LOCK_POWER,
PMR_PPM_INIT_CHILD,
PMR_PPM_UNINIT_CHILD,
PMR_PPM_POWER_LOCK_OWNER,
PMR_PPM_ENTER_SX,
PMR_PPM_EXIT_SX,
PMR_PPM_SEARCH_LIST
} pm_request_type;
typedef struct power_req {
pm_request_type request_type;
union req {
struct set_power_req {
dev_info_t *who;
int cmpt;
int level;
} set_power_req;
struct suspend_req {
dev_info_t *who;
ddi_detach_cmd_t cmd;
} suspend_req;
struct resume_req {
dev_info_t *who;
ddi_attach_cmd_t cmd;
} resume_req;
struct pre_set_power_req {
dev_info_t *who;
int cmpt;
int old_level;
int new_level;
} pre_set_power_req;
struct post_set_power_req {
dev_info_t *who;
int cmpt;
int old_level;
int new_level;
int result;
} post_set_power_req;
struct ppm_set_power_req {
dev_info_t *who;
int cmpt;
int old_level;
int new_level;
pm_canblock_t canblock;
void *cookie;
} ppm_set_power_req;
struct ppm_notify_level_req {
dev_info_t *who;
int cmpt;
int old_level;
int new_level;
} ppm_notify_level_req;
struct report_pmcap_req {
dev_info_t *who;
int cap;
void *arg;
} report_pmcap_req;
struct changed_power_req {
dev_info_t *who;
int cmpt;
int old_level;
int new_level;
int result;
} changed_power_req;
struct ppm_config_req {
dev_info_t *who;
int result;
} ppm_config_req;
struct ppm_all_lowest_req {
int mode;
} ppm_all_lowest_req;
struct ppm_lock_power_req {
dev_info_t *who;
} ppm_lock_power_req;
struct ppm_unlock_power_req {
dev_info_t *who;
} ppm_unlock_power_req;
struct ppm_power_lock_owner_req {
dev_info_t *who;
kthread_t *owner;
} ppm_power_lock_owner_req;
struct ppm_power_enter_sx_req {
int sx_state;
int test_point;
uint64_t wakephys;
void *psr;
} ppm_power_enter_sx_req;
struct ppm_search_list {
pm_searchargs_t *searchlist;
int result;
} ppm_search_list_req;
} req;
} power_req_t;
#define S3 3
#define S4 4
extern int cpr_test_point;
extern major_t cpr_device;
#define LOOP_BACK_NONE 0
#define LOOP_BACK_PASS 1
#define LOOP_BACK_FAIL 2
#define FORCE_SUSPEND_TO_RAM 3
#define DEVICE_SUSPEND_TO_RAM 4
typedef struct s3_args {
int s3a_state;
int s3a_test_point;
uint64_t s3a_wakephys;
void *s3a_psr;
} s3a_t;
typedef struct pm_bp_child_pwrchg {
dev_info_t *bpc_dip;
char *bpc_path;
int bpc_comp;
int bpc_olevel;
int bpc_nlevel;
void *bpc_private;
} pm_bp_child_pwrchg_t;
typedef struct pm_bp_nexus_pwrup {
dev_info_t *bpn_dip;
int bpn_comp;
int bpn_level;
void *bpn_private;
} pm_bp_nexus_pwrup_t;
typedef struct pm_bp_has_changed {
dev_info_t *bphc_dip;
char *bphc_path;
int bphc_comp;
int bphc_olevel;
int bphc_nlevel;
void *bphc_private;
} pm_bp_has_changed_t;
#define PM_BP_NOINVOL_ATTACH 1
#define PM_BP_NOINVOL_DETACH 2
#define PM_BP_NOINVOL_REMDRV 3
#define PM_BP_NOINVOL_CFB 4
#define PM_BP_NOINVOL_POWER 5
typedef struct pm_bp_noinvol {
dev_info_t *bpni_dip;
char *bpni_path;
int bpni_cmd;
int bpni_volpmd;
int bpni_wasvolpmd;
void *bpni_private;
} pm_bp_noinvol_t;
typedef struct pm_ppm_devlist {
dev_info_t *ppd_who;
int ppd_cmpt;
int ppd_old_level;
int ppd_new_level;
struct pm_ppm_devlist *ppd_next;
} pm_ppm_devlist_t;
typedef struct pm_ppm_cookie {
dev_info_t *ppc_dip;
dev_info_t *ppc_pdip;
dev_info_t *ppc_ppm;
int ppc_cmd;
} pm_ppm_cookie_t;
typedef struct pm_dep_rec {
char *pdr_keeper;
char *pdr_kept;
char **pdr_kept_paths;
struct pm_dep_rec *pdr_next;
size_t pdr_size;
major_t pdr_major;
int pdr_isprop;
int pdr_kept_count;
int pdr_satisfied;
} pm_pdr_t;
typedef struct pm_thresh_entry {
int pte_numthresh;
int *pte_thresh;
} pm_pte_t;
typedef struct pm_thresh_rec {
char *ptr_physpath;
struct pm_thresh_rec *ptr_next;
int ptr_numcomps;
size_t ptr_size;
pm_pte_t *ptr_entries;
} pm_thresh_rec_t;
#define PM_DIRECT 0x1
#define PM_DETACHING 0x2
#define PM_ALLNORM_DEFERRED 0x4
#define PM_GET_PM_INFO(dip) (DEVI(dip)->devi_pm_info)
#define PM_GET_PM_SCAN(dip) (DEVI(dip)->devi_pm_scan)
#define PM_NUMCMPTS(dip) (DEVI(dip)->devi_pm_num_components)
#define PM_CP(dip, comp) (&DEVI(dip)->devi_pm_components[comp])
#define PM_ISDIRECT(dip) \
(((pm_info_t *)PM_GET_PM_INFO(dip))->pmi_dev_pm_state & PM_DIRECT)
#define PM_ISBC(dip) (DEVI(dip)->devi_pm_flags & PMC_BC)
#define PM_SKBU(dip) (DEVI(dip)->devi_pm_flags & PMC_SKIP_BRINGUP)
#define PM_ISCPU(dip) (DEVI(dip)->devi_pm_flags & PMC_CPU_DEVICE)
#define PM_EVENT_CPUPM (cpupm == PM_CPUPM_EVENT)
#define PM_POLLING_CPUPM (cpupm == PM_CPUPM_POLLING)
#define PM_DEFAULT_CPUPM (cpupm == cpupm_default_mode)
#define PM_CPUPM_DISABLED (cpupm == PM_CPUPM_DISABLE)
#define PM_SCANABLE(dip) ((autopm_enabled && \
((!PM_CPUPM_DISABLED && !PM_EVENT_CPUPM) || !PM_ISCPU(dip))) || \
(PM_POLLING_CPUPM && PM_ISCPU(dip)))
#define PM_NOT_ALL_LOWEST 0x0
#define PM_ALL_LOWEST 0x1
#define PM_ADDR(dip) (ddi_get_name_addr(dip) ? ddi_get_name_addr(dip) : "")
#define PM_NAME(dip) (ddi_binding_name(dip))
#define PM_NODE(dip) (ddi_node_name(dip))
#define PM_INST(dip) (ddi_get_instance(dip))
#define PM_DEVICE(dip) PM_NAME(dip), PM_ADDR(dip), PM_NODE(dip), PM_INST(dip)
#ifdef DEBUG
#define PMD_ERROR 0x0000001
#define PMD_FAIL 0x0000002
#define PMD_IOCTL 0x0000004
#define PMD_SCAN 0x0000008
#define PMD_RESCAN 0x0000010
#define PMD_REMINFO 0x0000020
#define PMD_NAMETODIP 0x0000040
#define PMD_CLOSE 0x0000080
#define PMD_DIN 0x0000100
#define PMD_PMC 0x0000200
#define PMD_PPM 0x0000400
#define PMD_DEP 0x0000800
#define PMD_IDLEDOWN 0x0001000
#define PMD_SET 0x0002000
#define PMD_BRING 0x0004000
#define PMD_ALLNORM 0x0008000
#define PMD_REMDEV 0x0010000
#define PMD_LEVEL 0x0020000
#define PMD_THRESH 0x0040000
#define PMD_DPM 0x0080000
#define PMD_NORM 0x0100000
#define PMD_STATS 0x0200000
#define PMD_DEREG 0x0400000
#define PMD_KEEPS 0x0800000
#define PMD_KIDSUP 0x1000000
#define PMD_TCHECK 0x2000000
#define PMD_NOINVOL 0x4000000
#define PMD_CFB 0x8000000
#define PMD_DHR 0x10000000
#define PMD_PIL 0x20000000
#define PMD_PHC 0x40000000
#define PMD_LOCK 0x80000000
#define PMD_SX 0x80000000
#define PMD_PROTO PMD_SX
extern uint_t pm_debug;
extern uint_t pm_divertdebug;
extern void pm_log(const char *fmt, ...) __KPRINTFLIKE(1);
#if !defined(__sparc)
#define PMDDEBUG
#endif
#ifdef PMDDEBUG
#define PMD(level, arglist) { \
if (pm_debug & (level)) { \
pm_log arglist; \
} \
}
#else
#define PMD(level, arglist) ((void)0);
#endif
#ifndef sparc
extern clock_t pt_sleep;
#define PT(code) {outb(0x80, (char)code); drv_usecwait(pt_sleep); }
#else
#define PT(code)
#endif
#else
#define PMD(level, arglist)
#define PT(code)
#endif
#define PT_SPL7 0x01
#define PT_PMSRET 0x02
#define PT_PPMCTLOP 0x03
#define PT_ACPISDEV 0x04
#define PT_IC 0x05
#define PT_1to1 0x06
#define PT_SC 0x07
#define PT_SWV 0x08
#define PT_SWV_FAIL 0x09
#define PT_EWE 0x0a
#define PT_EWE_FAIL 0x0b
#define PT_RTCW 0x0c
#define PT_RTCW_FAIL 0x0d
#define PT_TOD 0x0e
#define PT_SXP 0x0f
#define PT_SXE 0x10
#define PT_SXE_FAIL 0x11
#define PT_INSOM 0x12
#define PT_WOKE 0x20
#define PT_UNDO1to1 0x21
#define PT_LSS 0x22
#define PT_LSS_FAIL 0x23
#define PT_CPB 0x24
#define PT_CPB_FAIL 0x25
#define PT_DRTC_FAIL 0x26
#define PT_ACPIREINIT 0x27
#define PT_ACPIRESTORE 0x28
#define PT_INTRRESTORE 0x28
#define PT_RESDEV 0x2a
#define PT_CPU 0x2b
#define PT_PRESUME 0x30
#define PT_RSUS 0x31
#define PT_RKERN 0x32
#define PT_RDRV 0x33
#define PT_RDRV_FAIL 0x34
#define PT_RRNOINVOL 0x35
#define PT_RUSER 0x36
#define PT_RAPMSIG 0x37
#define PT_RMPO 0x38
#define PT_RDONE 0x39
extern void pm_detaching(dev_info_t *);
extern void pm_detach_failed(dev_info_t *);
extern int pm_power(dev_info_t *, int, int);
extern int pm_unmanage(dev_info_t *);
extern void pm_rem_info(dev_info_t *);
extern int pm_get_norm_pwrs(dev_info_t *, int **, size_t *);
extern dev_info_t *pm_name_to_dip(char *, int);
extern int pm_power_up(dev_info_t *, int, int, int, pm_info_t *);
extern int pm_default_idle_threshold;
extern void pm_set_device_threshold(dev_info_t *, int, int);
extern int pm_valid_power(dev_info_t *, int, int);
extern void pm_lock_power(dev_info_t *);
extern void pm_unlock_power(dev_info_t *);
extern int pm_try_locking_power(dev_info_t *);
extern void pm_lock_power_single(dev_info_t *);
extern void pm_unlock_power_single(dev_info_t *);
extern int pm_try_locking_power_single(dev_info_t *);
extern int pm_isbc(dev_info_t *dip);
extern int pm_isdirect(dev_info_t *dip);
extern int pm_ctlops(dev_info_t *d, dev_info_t *r, ddi_ctl_enum_t o,
void *a, void *v);
extern int pm_noinvol_detached(char *);
extern int pm_init_child(dev_info_t *);
extern int pm_uninit_child(dev_info_t *);
extern int pm_all_to_normal(dev_info_t *, pm_canblock_t);
extern int pm_set_power(dev_info_t *, int, int, int, pm_canblock_t, int,
int *);
extern void pm_scan_init(dev_info_t *dip);
extern void pm_scan_fini(dev_info_t *dip);
extern void pm_scan_stop(dev_info_t *dip);
extern int pm_scan_stop_walk(dev_info_t *dip, void *);
extern void pm_scan(void *);
extern time_t pm_scan_dev(dev_info_t *dip);
extern void pm_rescan(void *);
extern int pm_rescan_walk(dev_info_t *, void *);
extern void pm_forget_power_level(dev_info_t *);
extern int pm_pre_config(dev_info_t *, char *);
extern int pm_pre_unconfig(dev_info_t *, int, int *, char *);
extern void pm_post_config(dev_info_t *, char *);
extern void pm_post_unconfig(dev_info_t *, int, char *);
extern void pm_pre_probe(dev_info_t *, pm_ppm_cookie_t *);
extern void pm_post_probe(pm_ppm_cookie_t *, int, int);
extern void pm_post_attach(pm_ppm_cookie_t *, int);
extern void pm_pre_attach(dev_info_t *, pm_ppm_cookie_t *,
ddi_attach_cmd_t);
extern void pm_pre_detach(dev_info_t *, ddi_detach_cmd_t,
pm_ppm_cookie_t *);
extern void pm_post_detach(pm_ppm_cookie_t *, int);
extern int pm_powerup(dev_info_t *);
extern int pm_all_at_normal(dev_info_t *);
extern int pm_busop_bus_power(dev_info_t *, void *,
pm_bus_power_op_t, void *, void *);
extern void pm_hold_power(dev_info_t *);
extern void pm_rele_power(dev_info_t *);
extern void pm_driver_removed(major_t);
extern void pm_borrow_lock(kthread_t *);
extern void pm_return_lock(void);
extern int pm_reattach_noinvol(void);
extern void pm_reattach_noinvol_fini();
extern void pm_restore_direct_levels(void);
extern void pm_save_direct_levels(void);
extern void pm_cfb_setup(const char *);
extern void pm_proceed(dev_info_t *, int, int, int);
extern void pm_get_timestamps(dev_info_t *, time_t *);
extern void pm_deregister_watcher(int, dev_info_t *);
extern void pm_dispatch_to_dep_thread(int, char *, char *, int, int *, int);
extern int e_pm_valid_comp(dev_info_t *, int, pm_component_t **);
extern int e_pm_valid_info(dev_info_t *, pm_info_t **);
extern int e_pm_valid_power(dev_info_t *, int, int);
extern void pm_init_locks(void);
extern int pm_register_ppm(int (*)(dev_info_t *), dev_info_t *);
extern int pm_is_cfb(dev_info_t *);
#ifdef DEBUG
extern int pm_cfb_is_up(void);
#endif
#ifdef DIPLOCKDEBUG
#define PM_LOCK_DIP(dip) { PMD(PMD_LOCK, ("dip lock %s@%s(%s#%d) " \
"%s %d\n", PM_DEVICE(dip), \
__FILE__, __LINE__)) \
mutex_enter(&DEVI(dip)->devi_pm_lock); }
#define PM_UNLOCK_DIP(dip) { PMD(PMD_LOCK, ("dip unlock %s@%s(%s#%d) " \
"%s %d\n", PM_DEVICE(dip), \
__FILE__, __LINE__)) \
mutex_exit(&DEVI(dip)->devi_pm_lock); }
#else
#define PM_LOCK_DIP(dip) mutex_enter(&DEVI(dip)->devi_pm_lock)
#define PM_UNLOCK_DIP(dip) mutex_exit(&DEVI(dip)->devi_pm_lock)
#endif
#define PM_LOCK_BUSY(dip) mutex_enter(&DEVI(dip)->devi_pm_busy_lock)
#define PM_UNLOCK_BUSY(dip) mutex_exit(&DEVI(dip)->devi_pm_busy_lock)
#define PM_LOCK_POWER(dip) pm_lock_power(dip)
#define PM_UNLOCK_POWER(dip) pm_unlock_power(dip)
#define PM_TRY_LOCK_POWER(dip) pm_try_locking_power(dip)
#define PM_IAM_LOCKING_DIP(dip) (mutex_owned(&DEVI(dip)->devi_pm_lock))
#define PM_DEFAULT_SYS_IDLENESS 1800
#define PMP_SUCCEED 0x1
#define PMP_FAIL 0x2
#define PMP_RELEASE 0x3
#define PM_STYLE_NEW 0
#define PM_STYLE_UNKNOWN 1
#define PMP_SETPOWER 0x4
#define PM_MAX_CLONE 256
typedef struct pm_rsvp {
dev_info_t *pr_dip;
int pr_comp;
int pr_newlevel;
int pr_oldlevel;
kcondvar_t pr_cv;
int pr_retval;
struct pm_rsvp *pr_next;
struct pm_rsvp *pr_prev;
} pm_rsvp_t;
typedef struct psce {
struct pm_state_change *psce_first;
struct pm_state_change *psce_in;
struct pm_state_change *psce_out;
struct pm_state_change *psce_last;
int psce_overruns;
int psce_references;
kmutex_t psce_lock;
} psce_t;
typedef struct pscc {
int pscc_clone;
dev_info_t *pscc_dip;
psce_t *pscc_entries;
struct pscc *pscc_next;
struct pscc *pscc_prev;
} pscc_t;
#define PSCCOUNT 128
typedef struct pm_noinvol {
struct pm_noinvol *ni_next;
char *ni_path;
major_t ni_major;
uint_t ni_flags;
uint_t ni_noinvolpm;
uint_t ni_volpmd;
uint_t ni_wasvolpmd;
size_t ni_size;
int ni_persistent;
} pm_noinvol_t;
#define PMID_IOCTIMER 0x1
#define PMID_CFBTIMER 0x2
#define PMID_IOCSCAN 0x4
#define PMID_CFBSCAN 0x8
#define PMID_IOC (PMID_IOCTIMER | PMID_IOCSCAN)
#define PMID_CFB (PMID_CFBTIMER | PMID_CFBSCAN)
#define PMID_TIMERS (PMID_IOCTIMER | PMID_CFBTIMER)
#define PMID_SCANS (PMID_IOCSCAN | PMID_CFBSCAN)
#define PMID_SCANS_SHIFT 2
#define PMID_SET_SCANS(pmid) (pmid) |= (((pmid) & PMID_TIMERS) << \
PMID_SCANS_SHIFT);
#define PMID_IS_IOC(pmid) ((pmid) & PMID_IOC)
#define PMID_IS_CFB(pmid, dip) (((pmid) & PMID_CFB) && \
(DEVI(dip)->devi_pm_flags & \
(PMC_DEF_THRESH | PMC_NEXDEF_THRESH)))
#define PM_IS_PID(dip) (PMID_IS_IOC(PM_GET_PM_SCAN(dip)->ps_idle_down) || \
PMID_IS_CFB(PM_GET_PM_SCAN(dip)->ps_idle_down, dip))
#define PM_IS_CFB(dip) (DEVI(dip)->devi_pm_flags & PMC_CONSOLE_FB)
#define PM_KUC(dip) (DEVI(dip)->devi_pm_kidsupcnt)
#define PM_CURPOWER(dip, comp) cur_power(PM_CP(dip, comp))
#define PM_WANTS_NOTIFICATION(dip) \
(DEVI(dip)->devi_pm_flags & PMC_WANTS_NOTIFY)
#define PM_HAS_BUS_POWER(dip) \
((DEVI(dip)->devi_ops->devo_bus_ops != NULL) && \
(DEVI(dip)->devi_ops->devo_bus_ops->busops_rev >= BUSO_REV_7) &&\
(DEVI(dip)->devi_ops->devo_bus_ops->bus_power != NULL))
#define PM_BUS_POWER_FUNC(dip) \
DEVI(dip)->devi_ops->devo_bus_ops->bus_power
typedef struct pm_sp_misc {
pm_canblock_t pspm_canblock;
int pspm_scan;
int *pspm_errnop;
int pspm_direction;
} pm_sp_misc_t;
typedef struct pm_desc_pwrchk {
dev_info_t *pdpc_dip;
int pdpc_par_involved;
} pm_desc_pwrchk_t;
#define DC_SPY (SECSPERDAY * DAYSPERNYEAR)
#define DC_SPW (SECSPERDAY * DAYSPERWEEK)
#define DC_SPD SECSPERDAY
#define DC_SCSI_YEAR_LEN 4
#define DC_SCSI_WEEK_LEN 2
#define DC_SCSI_NPY 5
#endif
#ifdef __cplusplus
}
#endif
#endif