#ifndef _CPU_PM_H
#define _CPU_PM_H
#ifdef __cplusplus
extern "C" {
#endif
#if (defined(_KERNEL) || defined(_KMEMUSER))
#include <sys/cpuvar.h>
#include <sys/processor.h>
#include <sys/types.h>
#include <sys/kstat.h>
#include <sys/cmt.h>
typedef enum cpupm_policy {
CPUPM_POLICY_ELASTIC,
CPUPM_POLICY_DISABLED,
CPUPM_NUM_POLICIES
} cpupm_policy_t;
typedef enum cpupm_dtype {
CPUPM_DTYPE_ACTIVE,
CPUPM_DTYPE_IDLE
} cpupm_dtype_t;
typedef enum cpupm_state_name {
CPUPM_STATE_LOW_POWER,
CPUPM_STATE_MAX_PERF,
CPUPM_STATE_NAMES
} cpupm_state_name_t;
typedef enum cpupm_gov_state_t {
CPUPM_GOV_DISENGAGED,
CPUPM_GOV_TRANS_IDLE,
CPUPM_GOV_TRANS_WORK
} cpupm_gov_state_t;
typedef enum cpupm_util_event {
CPUPM_DOM_BUSY_FROM_IDLE,
CPUPM_DOM_IDLE_FROM_BUSY,
CPUPM_DOM_REMAIN_BUSY
} cpupm_util_event_t;
typedef uintptr_t cpupm_handle_t;
typedef struct cpupm_state {
uint32_t cps_speed;
cpupm_handle_t cps_handle;
} cpupm_state_t;
typedef struct cpupm_domain {
id_t cpd_id;
cpupm_dtype_t cpd_type;
cpupm_state_t *cpd_states;
cpupm_state_t *cpd_state;
uint_t cpd_nstates;
cpupm_state_t *cpd_named_states[CPUPM_STATE_NAMES];
hrtime_t cpd_last_raise;
hrtime_t cpd_last_lower;
int cpd_ti;
int cpd_tw;
cpupm_gov_state_t cpd_governor;
struct cpupm_domain *cpd_next;
} cpupm_domain_t;
#define CPUPM_NO_DOMAIN ((id_t)-1)
cpupm_domain_t *cpupm_domain_init(struct cpu *, cpupm_dtype_t);
id_t cpupm_domain_id(struct cpu *, cpupm_dtype_t);
int cpupm_change_state(struct cpu *, cpupm_domain_t *,
cpupm_state_t *);
extern void cpupm_redefine_max_activepwr_state(struct cpu *, int);
int cpupm_set_policy(cpupm_policy_t);
cpupm_policy_t cpupm_get_policy(void);
void cpupm_utilization_event(struct cpu *, hrtime_t,
cpupm_domain_t *, cpupm_util_event_t);
id_t cpupm_plat_domain_id(struct cpu *, cpupm_dtype_t);
uint_t cpupm_plat_state_enumerate(struct cpu *, cpupm_dtype_t,
cpupm_state_t *);
int cpupm_plat_change_state(struct cpu *, cpupm_state_t *);
#endif
#ifdef __cplusplus
}
#endif
#endif