IOServicePMPrivate.h [plain text]
#ifndef _IOKIT_IOSERVICEPMPRIVATE_H
#define _IOKIT_IOSERVICEPMPRIVATE_H
#define PM_VARS_SUPPORT 1
class IOServicePM : public OSObject
{
friend class IOService;
OSDeclareDefaultStructors( IOServicePM )
private:
IOService * Owner;
IOPMinformeeList * InterestedDrivers;
IOReturn DriverTimer;
thread_call_t AckTimer;
thread_call_t SettleTimer;
unsigned long MachineState;
unsigned long SettleTimeUS;
unsigned long HeadNoteFlags;
unsigned long HeadNoteState;
unsigned long HeadNoteOutputFlags;
unsigned long HeadNoteDomainState;
IOPowerConnection * HeadNoteParent;
unsigned long HeadNoteCapabilityFlags;
unsigned long HeadNotePendingAcks;
IOLock * PMLock;
bool WeAreRoot;
bool InitialChange;
bool NeedToBecomeUsable;
bool DeviceOverrides;
bool ClampOn;
bool DeviceActive;
bool DoNotPowerDown;
bool ParentsKnowState;
AbsoluteTime DeviceActiveTimestamp;
IOLock * ActivityLock;
IOTimerEventSource * IdleTimerEventSource;
unsigned long IdleTimerPeriod;
unsigned long DriverDesire;
unsigned long DeviceDesire;
unsigned long ChildrenDesire;
unsigned long DesiredPowerState;
unsigned long PreviousRequest;
const char * Name;
IOPlatformExpert * Platform;
unsigned long NumberOfPowerStates;
IOPMPowerState * PowerStates;
IOService * ControllingDriver;
unsigned long AggressivenessValue[ kMaxType + 1 ];
bool AggressivenessValid[ kMaxType + 1 ];
unsigned long CurrentPowerState;
IOPMPowerFlags ParentsCurrentPowerFlags;
unsigned long MaxCapability;
IOPMPowerFlags OutputPowerCharacterFlags;
UInt16 SerialNumber;
OSArray * ResponseArray;
int OutOfBandParameter;
AbsoluteTime DriverCallStartTime;
IOPMPowerFlags CurrentCapabilityFlags;
unsigned long CurrentPowerConsumption;
unsigned long TempClampPowerState;
unsigned long TempClampCount;
IOPMWorkQueue * PMWorkQueue;
IOPMRequest * PMRequest;
OSSet * InsertInterestSet;
OSSet * RemoveInterestSet;
OSArray * NotifyChildArray;
unsigned long WaitReason;
unsigned long NextMachineState;
thread_call_t DriverCallEntry;
void * DriverCallParamPtr;
IOItemCount DriverCallParamCount;
IOItemCount DriverCallParamSlots;
IOOptionBits DriverCallReason;
long ActivityTicklePowerState;
bool StrictTreeOrder;
bool DriverCallBusy;
bool ActivityTimerStopped;
bool WillAdjustPowerState;
bool WillPMStop;
#if PM_VARS_SUPPORT
IOPMprot * PMVars;
#endif
virtual bool serialize( OSSerialize * s ) const;
};
#define fWeAreRoot pwrMgt->WeAreRoot
#define fInterestedDrivers pwrMgt->InterestedDrivers
#define fDriverTimer pwrMgt->DriverTimer
#define fAckTimer pwrMgt->AckTimer
#define fSettleTimer pwrMgt->SettleTimer
#define fMachineState pwrMgt->MachineState
#define fSettleTimeUS pwrMgt->SettleTimeUS
#define fHeadNoteFlags pwrMgt->HeadNoteFlags
#define fHeadNoteState pwrMgt->HeadNoteState
#define fHeadNoteOutputFlags pwrMgt->HeadNoteOutputFlags
#define fHeadNoteDomainState pwrMgt->HeadNoteDomainState
#define fHeadNoteParent pwrMgt->HeadNoteParent
#define fHeadNoteCapabilityFlags pwrMgt->HeadNoteCapabilityFlags
#define fHeadNotePendingAcks pwrMgt->HeadNotePendingAcks
#define fPMLock pwrMgt->PMLock
#define fInitialChange pwrMgt->InitialChange
#define fNeedToBecomeUsable pwrMgt->NeedToBecomeUsable
#define fDeviceOverrides pwrMgt->DeviceOverrides
#define fClampOn pwrMgt->ClampOn
#define fOwner pwrMgt->Owner
#define fActivityLock pwrMgt->ActivityLock
#define fIdleTimerEventSource pwrMgt->IdleTimerEventSource
#define fIdleTimerPeriod pwrMgt->IdleTimerPeriod
#define fDeviceActive pwrMgt->DeviceActive
#define fDeviceActiveTimestamp pwrMgt->DeviceActiveTimestamp
#define fDriverDesire pwrMgt->DriverDesire
#define fDeviceDesire pwrMgt->DeviceDesire
#define fChildrenDesire pwrMgt->ChildrenDesire
#define fDesiredPowerState pwrMgt->DesiredPowerState
#define fPreviousRequest pwrMgt->PreviousRequest
#define fName pwrMgt->Name
#define fPlatform pwrMgt->Platform
#define fNumberOfPowerStates pwrMgt->NumberOfPowerStates
#define fPowerStates pwrMgt->PowerStates
#define fControllingDriver pwrMgt->ControllingDriver
#define fAggressivenessValue pwrMgt->AggressivenessValue
#define fAggressivenessValid pwrMgt->AggressivenessValid
#define fCurrentPowerState pwrMgt->CurrentPowerState
#define fParentsKnowState pwrMgt->ParentsKnowState
#define fParentsCurrentPowerFlags pwrMgt->ParentsCurrentPowerFlags
#define fMaxCapability pwrMgt->MaxCapability
#define fOutputPowerCharacterFlags pwrMgt->OutputPowerCharacterFlags
#define fSerialNumber pwrMgt->SerialNumber
#define fResponseArray pwrMgt->ResponseArray
#define fDoNotPowerDown pwrMgt->DoNotPowerDown
#define fOutOfBandParameter pwrMgt->OutOfBandParameter
#define fDriverCallStartTime pwrMgt->DriverCallStartTime
#define fCurrentCapabilityFlags pwrMgt->CurrentCapabilityFlags
#define fCurrentPowerConsumption pwrMgt->CurrentPowerConsumption
#define fTempClampPowerState pwrMgt->TempClampPowerState
#define fTempClampCount pwrMgt->TempClampCount
#define fPMWorkQueue pwrMgt->PMWorkQueue
#define fPMRequest pwrMgt->PMRequest
#define fWaitReason pwrMgt->WaitReason
#define fNextMachineState pwrMgt->NextMachineState
#define fDriverCallReason pwrMgt->DriverCallReason
#define fDriverCallEntry pwrMgt->DriverCallEntry
#define fDriverCallParamPtr pwrMgt->DriverCallParamPtr
#define fDriverCallParamCount pwrMgt->DriverCallParamCount
#define fDriverCallParamSlots pwrMgt->DriverCallParamSlots
#define fDriverCallBusy pwrMgt->DriverCallBusy
#define fWillPMStop pwrMgt->WillPMStop
#define fActivityTickled pwrMgt->ActivityTickled
#define fInsertInterestSet pwrMgt->InsertInterestSet
#define fRemoveInterestSet pwrMgt->RemoveInterestSet
#define fStrictTreeOrder pwrMgt->StrictTreeOrder
#define fNotifyChildArray pwrMgt->NotifyChildArray
#define fWillAdjustPowerState pwrMgt->WillAdjustPowerState
#define fActivityTimerStopped pwrMgt->ActivityTimerStopped
#define fActivityTicklePowerState pwrMgt->ActivityTicklePowerState
#define fPMVars pwrMgt->PMVars
#define ACK_TIMER_PERIOD 100000000
#define IOPMParentInitiated 1 // this power change initiated by our parent
#define IOPMWeInitiated 2 // this power change initiated by this device
#define IOPMNotDone 4 // we couldn't make this change
#define IOPMNotInUse 8 // this list element not currently in use
#define IOPMDomainWillChange 16 // change started by PowerDomainWillChangeTo
#define IOPMDomainDidChange 32 // change started by PowerDomainDidChangeTo
struct changeNoteItem {
unsigned long flags;
unsigned long newStateNumber;
IOPMPowerFlags outputPowerCharacter;
IOPMPowerFlags inputPowerRequirement;
IOPMPowerFlags domainState;
IOPowerConnection * parent;
IOPMPowerFlags singleParentState;
IOPMPowerFlags capabilityFlags;
};
enum {
kDriverCallInformPreChange,
kDriverCallInformPostChange,
kDriverCallSetPowerState
};
struct DriverCallParam {
OSObject * Target;
IOReturn Result;
};
enum {
kNotifyApps,
kNotifyPriority
};
struct context {
OSArray * responseFlags;
UInt16 serialNumber;
UInt16 counter;
UInt32 maxTimeRequested;
int msgType;
IOService * us;
unsigned long stateNumber;
IOPMPowerFlags stateFlags;
const char * errorLog;
};
enum {
kIOPMRequestTypeInvalid = 0x00,
kIOPMRequestTypePMStop = 0x01,
kIOPMRequestTypeAddPowerChild1 = 0x02,
kIOPMRequestTypeAddPowerChild2 = 0x03,
kIOPMRequestTypeAddPowerChild3 = 0x04,
kIOPMRequestTypeRegisterPowerDriver = 0x05,
kIOPMRequestTypeAdjustPowerState = 0x06,
kIOPMRequestTypeMakeUsable = 0x07,
kIOPMRequestTypeTemporaryPowerClamp = 0x08,
kIOPMRequestTypePowerDomainWillChange = 0x09,
kIOPMRequestTypePowerDomainDidChange = 0x0A,
kIOPMRequestTypeChangePowerStateTo = 0x0B,
kIOPMRequestTypeChangePowerStateToPriv = 0x0C,
kIOPMRequestTypePowerOverrideOnPriv = 0x0D,
kIOPMRequestTypePowerOverrideOffPriv = 0x0E,
kIOPMRequestTypeActivityTickle = 0x0F,
kIOPMRequestTypeReplyStart = 0x80,
kIOPMRequestTypeAckPowerChange = 0x81,
kIOPMRequestTypeAckSetPowerState = 0x82,
kIOPMRequestTypeAllowPowerChange = 0x83,
kIOPMRequestTypeCancelPowerChange = 0x84,
kIOPMRequestTypeInterestChanged = 0x85
};
class IOPMRequest : public IOCommand
{
OSDeclareDefaultStructors( IOPMRequest )
protected:
IOOptionBits fType; IOService * fTarget; IOPMRequest * fParent; IOItemCount fChildCount;
public:
void * fArg0;
void * fArg1;
void * fArg2;
inline bool hasChildRequest( void ) const
{
return (fChildCount != 0);
}
inline bool hasParentRequest( void ) const
{
return (fParent != 0);
}
inline void setParentRequest( IOPMRequest * parent )
{
if (!fParent)
{
fParent = parent;
fParent->fChildCount++;
}
}
inline IOOptionBits getType( void ) const
{
return fType;
}
inline bool isReply( void ) const
{
return (fType > kIOPMRequestTypeReplyStart);
}
inline IOService * getTarget( void ) const
{
return fTarget;
}
static IOPMRequest *create( void );
void reset( void );
bool init( IOService * owner, IOOptionBits type );
};
class IOPMRequestQueue : public IOEventSource
{
OSDeclareDefaultStructors( IOPMRequestQueue )
public:
typedef bool (*Action)( IOService *, IOPMRequest *, IOPMRequestQueue * );
protected:
queue_head_t fQueue;
IOLock * fLock;
virtual bool checkForWork( void );
virtual void free( void );
virtual bool init( IOService * inOwner, Action inAction );
public:
static IOPMRequestQueue * create( IOService * inOwner, Action inAction );
void queuePMRequest( IOPMRequest * request );
void queuePMRequestChain( IOPMRequest ** requests, IOItemCount count );
void signalWorkAvailable( void );
};
class IOPMWorkQueue : public IOEventSource
{
OSDeclareDefaultStructors( IOPMWorkQueue )
public:
typedef bool (*Action)( IOService *, IOPMRequest *, IOPMWorkQueue * );
protected:
queue_head_t fWorkQueue;
Action fWorkAction;
Action fRetireAction;
virtual bool checkForWork( void );
virtual bool init( IOService * inOwner, Action work, Action retire );
public:
static IOPMWorkQueue * create( IOService * inOwner, Action work, Action retire );
void queuePMRequest( IOPMRequest * request );
};
#endif