IOPlatformMonitor.h [plain text]
#ifndef _IOPLATFORMMONITOR_H
#define _IOPLATFORMMONITOR_H
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
#include <IOKit/IOCommandGate.h>
#include <IOKit/IOWorkLoop.h>
#include <IOKit/pwr_mgt/RootDomain.h>
#include <libkern/c++/OSObject.h>
#include <libkern/c++/OSIterator.h>
#ifdef DLOG
#undef DLOG
#endif
#ifdef IOPFMDEBUG
#define DLOG(fmt, args...) kprintf(fmt, ## args)
#define debug_msg( msg ) IOLog(msg)
#else
#define DLOG(fmt, args...)
#define debug_msg( msg )
#endif
#define kIOPMonTypeKey "sensor-type"
#define kIOPMonControlTypeKey "control-type"
#define kIOPMonTypePowerSens "power-sensor"
#define kIOPMonTypeThermalSens "temp-sensor"
#define kIOPMonTypeClamshellSens "clamshell-sensor"
#define kIOPMonTypeCPUCon "cpu-controller"
#define kIOPMonTypeGPUCon "gpu-controller"
#define kIOPMonTypeSlewCon "slew"
#define kIOPMonTypeFanCon "fan-controller"
#define kIOPMonIDKey "sensor-id"
#define kIOPMonCPUIDKey "cpu-index"
#define kIOPMonLowThresholdKey "low-threshold"
#define kIOPMonHighThresholdKey "high-threshold"
#define kIOPMonThresholdValueKey "threshold-value"
#define kIOPMonCurrentValueKey "current-value"
enum {
kIOPMonMessageRegister = 1,
kIOPMonMessageUnregister = 2,
kIOPMonMessageLowThresholdHit = 3,
kIOPMonMessageHighThresholdHit = 4,
kIOPMonMessageCurrentValue = 5,
kIOPMonMessageStateChanged = 6,
kIOPMonMessagePowerMonitor = 7,
kIOPMonMessageError = 8,
};
enum
{
kPowerBookModel = 0x00010000,
kPowerMacModel = 0x00020000,
kRackMacModel = 0x00040000,
kUsesIOPlatformPlugin = 0x00080000,
kPB51MachineModel = kPowerBookModel + 0x00000501,
kPB61MachineModel = kPowerBookModel + 0x00000601,
kPB52MachineModel = kPowerBookModel + 0x00000502,
kPB53MachineModel = kPowerBookModel + 0x00000503,
kPB62MachineModel = kPowerBookModel + 0x00000602,
kPB63MachineModel = kPowerBookModel + 0x00000603,
kPB64MachineModel = kPowerBookModel + 0x00000604,
kPB65MachineModel = kPowerBookModel + 0x00000605,
kPB54MachineModel = kPowerBookModel + 0x00000504,
kPB55MachineModel = kPowerBookModel + 0x00000505,
kPB66MachineModel = kPowerBookModel + 0x00000606,
kPB67MachineModel = kPowerBookModel + 0x00000607,
kPB68MachineModel = kPowerBookModel + 0x00000608,
kPB56MachineModel = kPowerBookModel + 0x00000506 + kUsesIOPlatformPlugin,
kPB57MachineModel = kPowerBookModel + 0x00000507 + kUsesIOPlatformPlugin,
kPB58MachineModel = kPowerBookModel + 0x00000508 + kUsesIOPlatformPlugin,
kPB59MachineModel = kPowerBookModel + 0x00000509 + kUsesIOPlatformPlugin
};
typedef UInt32 ThermalValue;
#define TEMP_SENSOR_FMT(x) ((x) << 16)
typedef struct OldThresholdInfo {
ThermalValue thresholdLow;
UInt32 nextStateLow;
ThermalValue thresholdHigh;
UInt32 nextStateHigh;
};
typedef struct SmallerThresholdInfo {
ThermalValue thresholdLow;
ThermalValue thresholdHigh;
};
typedef struct ThresholdInfo {
ThermalValue thresholdLow;
ThermalValue thresholdHigh;
ThermalValue thresholdAction;
};
enum {
kThrottleCPU = 0x00000001,
kThrottleGPU = 0x00000002
};
enum {
kNoSpecialState = 0x00000000,
kClamshellClosedState = 0x00000001
};
typedef struct LimitsInfo {
SInt32 sensorID;
UInt16 sensorThreshold;
UInt16 sensorHysteresis;
UInt32 sensorEffect;
UInt16 machineState;
};
typedef struct ConSensorInfo {
UInt32 conSensorType;
UInt32 conSensorParent;
IOService *conSensor;
OSDictionary *dict;
OSDictionary *threshDict;
UInt32 responseRate;
UInt32 value;
UInt32 state;
UInt32 numStates;
bool sensorValid;
bool registered;
};
typedef bool (*IOPlatformMonitorAction)( );
class IOPlatformMonitor : public IOService
{
OSDeclareDefaultStructors(IOPlatformMonitor)
protected:
typedef struct IOPMonEventData {
IOService *conSensor;
UInt32 event;
OSDictionary *eventDict;
};
struct IOPMonCommandThreadSet;
typedef void (*IOPMonCommandFunctionType)(IOPMonCommandThreadSet *threadSet);
typedef struct IOPMonCommandThreadSet {
IOPlatformMonitor *me;
UInt32 command;
thread_call_t workThread;
IOPMonCommandFunctionType commandFunction;
IOPMonEventData eventData;
};
private:
bool retrieveValueByKey (const OSSymbol *key, OSDictionary *dict, UInt32 *value);
static void executeCommandThread (IOPMonCommandThreadSet *threadSet);
virtual bool threadCommon (IOPMonCommandThreadSet *threadSet);
protected:
enum {
kIOPMonUnknownSensor = 0,
kIOPMonPowerSensor = 1,
kIOPMonThermalSensor = 2,
kIOPMonClamshellSensor = 3,
kIOPMonCPUController = 4,
kIOPMonGPUController = 5,
kIOPMonSlewController = 6,
kIOPMonFanController = 7
};
enum {
kIOPMonCommandHandleEvent = 1,
kIOPMonCommandSaveState = 2,
kIOPMonCommandRestoreState = 3
};
const OSSymbol *gIOPMonTypeKey;
const OSSymbol *gIOPMonConTypeKey;
const OSSymbol *gIOPMonTypePowerSens;
const OSSymbol *gIOPMonTypeThermalSens;
const OSSymbol *gIOPMonTypeClamshellSens;
const OSSymbol *gIOPMonTypeCPUCon;
const OSSymbol *gIOPMonTypeGPUCon;
const OSSymbol *gIOPMonTypeSlewCon;
const OSSymbol *gIOPMonTypeFanCon;
const OSSymbol *gIOPMonIDKey;
const OSSymbol *gIOPMonCPUIDKey;
const OSSymbol *gIOPMonLowThresholdKey;
const OSSymbol *gIOPMonHighThresholdKey;
const OSSymbol *gIOPMonThresholdValueKey;
const OSSymbol *gIOPMonCurrentValueKey;
UInt32 currentPowerState;
UInt32 currentClamshellState;
UInt32 currentThermalState;
UInt32 lastPowerState;
UInt32 lastClamshellState;
UInt32 lastThermalState;
IOPlatformMonitorAction lastAction;
IOPMrootDomain *pmRootDomain;
IOWorkLoop *workLoop; IOCommandGate *commandGate;
IOCommandGate::Action commandGateCaller;
virtual bool initSymbols ();
virtual IOReturn monitorPower (OSDictionary *dict, IOService *provider);
bool retrieveSensorIndex (OSDictionary *dict, UInt32 *value);
bool retrieveThreshold (OSDictionary *dict, ThermalValue *value);
bool retrieveCurrentValue (OSDictionary *dict, UInt32 *value);
virtual bool initPowerState ();
virtual void savePowerState ();
virtual bool restorePowerState ();
virtual bool initThermalState ();
virtual void saveThermalState ();
virtual bool restoreThermalState ();
virtual bool initClamshellState ();
virtual void saveClamshellState ();
virtual bool restoreClamshellState ();
public:
virtual bool start(IOService *nub);
virtual void free();
virtual IOReturn message( UInt32 type, IOService * provider, void * argument = 0 );
virtual IOReturn powerStateWillChangeTo (IOPMPowerFlags, unsigned long, IOService*);
virtual IOReturn setAggressiveness(unsigned long selector, unsigned long newLevel);
virtual bool initPlatformState ();
virtual void savePlatformState ();
virtual void restorePlatformState ();
virtual bool adjustPlatformState ();
virtual IOReturn registerConSensor (OSDictionary *dict, IOService *conSensor);
virtual bool unregisterSensor (UInt32 sensorID);
virtual IOReturn handleEvent (IOPMonEventData *event);
};
#endif