#ifdef KERNEL_PRIVATE
#ifndef _I386_PMCPU_H_
#define _I386_PMCPU_H_
#include <i386/cpu_topology.h>
#include <i386/rtclock.h>
#ifndef ASSEMBLER
#define PM_DISPATCH_VERSION 18
typedef struct
{
int (*pmCPUStateInit)(void);
void (*cstateInit)(void);
uint64_t (*cstateMachineIdle)(uint64_t maxIdleDuration);
uint64_t (*GetDeadline)(x86_lcpu_t *lcpu);
uint64_t (*SetDeadline)(x86_lcpu_t *lcpu, uint64_t);
void (*Deadline)(x86_lcpu_t *lcpu);
boolean_t (*exitIdle)(x86_lcpu_t *lcpu);
void (*markCPURunning)(x86_lcpu_t *lcpu);
int (*pmCPUControl)(uint32_t cmd, void *datap);
void (*pmCPUHalt)(void);
uint64_t (*getMaxSnoop)(void);
void (*setMaxBusDelay)(uint64_t time);
uint64_t (*getMaxBusDelay)(void);
void (*setMaxIntDelay)(uint64_t time);
uint64_t (*getMaxIntDelay)(void);
void (*pmCPUSafeMode)(x86_lcpu_t *lcpu, uint32_t flags);
void (*pmTimerStateSave)(void);
void (*pmTimerStateRestore)(void);
kern_return_t (*exitHalt)(x86_lcpu_t *lcpu);
kern_return_t (*exitHaltToOff)(x86_lcpu_t *lcpu);
void (*markAllCPUsOff)(void);
void (*pmSetRunCount)(uint32_t count);
boolean_t (*pmIsCPUUnAvailable)(x86_lcpu_t *lcpu);
int (*pmIPIHandler)(void *state);
} pmDispatch_t;
typedef struct {
int (*setRTCPop)(uint64_t time);
void (*resyncDeadlines)(int cpu);
void (*initComplete)(void);
x86_lcpu_t *(*GetLCPU)(int cpu);
x86_core_t *(*GetCore)(int cpu);
x86_die_t *(*GetDie)(int cpu);
x86_pkg_t *(*GetPackage)(int cpu);
x86_lcpu_t *(*GetMyLCPU)(void);
x86_core_t *(*GetMyCore)(void);
x86_die_t *(*GetMyDie)(void);
x86_pkg_t *(*GetMyPackage)(void);
x86_pkg_t *(*GetPkgRoot)(void);
void (*LockCPUTopology)(int lock);
boolean_t (*GetHibernate)(int cpu);
processor_t (*LCPUtoProcessor)(int lcpu);
processor_t (*ThreadBind)(processor_t proc);
uint32_t (*GetSavedRunCount)(void);
void (*pmSendIPI)(int cpu);
rtc_nanotime_t *(*GetNanotimeInfo)(void);
x86_topology_parameters_t *topoParms;
} pmCallBacks_t;
extern pmDispatch_t *pmDispatch;
void power_management_init(void);
void pmKextRegister(uint32_t version, pmDispatch_t *cpuFuncs,
pmCallBacks_t *callbacks);
void pmUnRegister(pmDispatch_t *cpuFuncs);
void pmCPUStateInit(void);
uint64_t pmCPUGetDeadline(struct cpu_data *cpu);
uint64_t pmCPUSetDeadline(struct cpu_data *cpu, uint64_t deadline);
void pmCPUDeadline(struct cpu_data *cpu);
boolean_t pmCPUExitIdle(struct cpu_data *cpu);
void pmCPUMarkRunning(struct cpu_data *cpu);
void pmMarkAllCPUsOff(void);
int pmCPUControl(uint32_t cmd, void *datap);
void pmCPUHalt(uint32_t reason);
void pmTimerSave(void);
void pmTimerRestore(void);
kern_return_t pmCPUExitHalt(int cpu);
kern_return_t pmCPUExitHaltToOff(int cpu);
#define PM_HALT_NORMAL 0
#define PM_HALT_DEBUG 1
#define PM_HALT_PANIC 2
#define PM_HALT_SLEEP 3
void pmSafeMode(x86_lcpu_t *lcpu, uint32_t flags);
#define PM_SAFE_FL_NORMAL 0x00000001
#define PM_SAFE_FL_SAFE 0x00000002
#define PM_SAFE_FL_PAUSE 0x00000010
#define PM_SAFE_FL_RESUME 0x00000020
extern int pmsafe_debug;
extern int idlehalt;
#endif
#endif
#endif