#ifdef KERNEL_PRIVATE
#ifndef _I386_PMCPU_H_
#define _I386_PMCPU_H_
#include <kern/pms.h>
#ifndef ASSEMBLER
typedef enum { C1, C2, C3, C4, Hlt, C3Res, All, Cnum } pm_Cstate_t;
typedef struct pmStats {
uint64_t pmNapCnt[Cnum];
uint64_t pmNapTime[Cnum];
uint64_t pmNapC2HPET;
uint64_t pmNapC4HPET;
uint64_t pmNapHPETPops;
uint64_t pmHPETRupt;
uint32_t pmCurC3Res;
uint32_t pmLastApic;
uint32_t pmNewApic;
uint64_t pmHpetTim;
uint64_t pmHpetCmp;
uint64_t pmHpetCfg;
uint64_t pmLSNs;
uint64_t pmLLHpet;
} pmStats_t;
#define MAX_PSTATES 32
typedef enum { Cn1, Cn2, Cn3, Cn4, Cnmax } Cstate_number_t;
typedef struct {
Cstate_number_t number;
uint32_t hint;
} Cstate_hint_t;
struct pmData {
uint8_t pad[93];
};
typedef struct pmData pmData_t;
#define pmNapHalt 0x00000010
#define pmNapC1 0x00000008
#define pmNapC2 0x00000004
#define pmNapC3 0x00000002
#define pmNapC4 0x00000001
#define pmNapMask 0x000000FF
#define cfgAdr 0xCF8
#define cfgDat 0xCFC
#define lpcCfg (0x80000000 | (0 << 16) | (31 << 11) | (0 << 8))
typedef struct
{
void (*pmsCPUMachineInit)(void);
void (*pmsCPUInit)(void);
void (*pmsCPUSet)(uint32_t sel);
void (*pmsCPUConf)(void);
void (*pmsCPURun)(uint32_t nstep);
uint32_t (*pmsCPUQuery)(void);
uint32_t (*pmsCPUPackageQuery)(void);
void (*pmsCPUYellowFlag)(void);
void (*pmsCPUGreenFlag)(void);
kern_return_t (*pmsCPULoadVIDTable)(uint16_t *tablep, int nstates);
kern_return_t (*pmsCPUSetPStateLimit)(uint32_t limit);
void (*cstateInit)(void);
void (*cstateMachineIdle)(uint32_t napCtl);
kern_return_t (*cstateTableSet)(Cstate_hint_t *tablep, unsigned int nstates);
uint32_t (*cstateNapPolicy)(uint32_t forcenap, uint32_t napCtl);
} pmDispatch_t;
typedef struct {
uint32_t PState;
uint32_t PLimit;
uint16_t VIDTable[MAX_PSTATES];
uint32_t VIDTableCount;
Cstate_hint_t CStates[Cnmax];
uint32_t CStatesCount;
} pmInitState_t;
typedef struct {
void (*Park)(void);
void (*Run)(uint32_t nstep);
void (*RunLocal)(uint32_t nstep);
void (*SetStep)(uint32_t nstep, int dir);
void (*NapPolicy)(void);
kern_return_t (*Build)(pmsDef *pd, uint32_t pdsize, pmsSetFunc_t *functab, uint32_t platformData, pmsQueryFunc_t queryFunc);
pmStats_t *(*Stats)(void);
pmsd *(*StepperData)(void);
uint64_t *(*HPETAddr)(void);
pmInitState_t *InitState;
} pmCallBacks_t;
extern pmDispatch_t *pmDispatch;
extern uint32_t maxBusDelay;
extern uint32_t C4C2SnoopDelay;
extern uint32_t forcenap;
void power_management_init(void);
void machine_nap_policy(void);
kern_return_t Cstate_table_set(Cstate_hint_t *tablep, unsigned int nstates);
void machine_idle_cstate(void);
void pmRegister(pmDispatch_t *cpuFuncs, pmCallBacks_t *callbacks);
void pmUnRegister(pmDispatch_t *cpuFuncs);
#endif
#endif
#endif