+#include <IOKit/IOCommand.h>
+#include <IOKit/IOEventSource.h>
+
+//******************************************************************************
+// PM command types
+//******************************************************************************
+
+enum {
+ /* Command Types */
+ kIOPMRequestTypeInvalid = 0x00,
+ kIOPMRequestTypePMStop = 0x01,
+ kIOPMRequestTypeAddPowerChild1 = 0x02,
+ kIOPMRequestTypeAddPowerChild2 = 0x03,
+ kIOPMRequestTypeAddPowerChild3 = 0x04,
+ kIOPMRequestTypeRegisterPowerDriver = 0x05,
+ kIOPMRequestTypeAdjustPowerState = 0x06,
+ kIOPMRequestTypePowerDomainWillChange = 0x07,
+ kIOPMRequestTypePowerDomainDidChange = 0x08,
+ kIOPMRequestTypePowerOverrideOnPriv = 0x09,
+ kIOPMRequestTypePowerOverrideOffPriv = 0x0A,
+ kIOPMRequestTypeActivityTickle = 0x0B,
+ kIOPMRequestTypeRequestPowerState = 0x0C,
+ kIOPMRequestTypeSynchronizePowerTree = 0x0D,
+ kIOPMRequestTypeRequestPowerStateOverride = 0x0E,
+ kIOPMRequestTypeSetIdleTimerPeriod = 0x0F,
+ kIOPMRequestTypeIgnoreIdleTimer = 0x10,
+
+ /* Reply Types */
+ kIOPMRequestTypeReplyStart = 0x80,
+ kIOPMRequestTypeAckPowerChange = 0x81,
+ kIOPMRequestTypeAckSetPowerState = 0x82,
+ kIOPMRequestTypeAllowPowerChange = 0x83,
+ kIOPMRequestTypeCancelPowerChange = 0x84,
+ kIOPMRequestTypeInterestChanged = 0x85,
+ kIOPMRequestTypeIdleCancel = 0x86,
+ kIOPMRequestTypeChildNotifyDelayCancel = 0x87
+};
+
+//******************************************************************************
+// PM actions - For root domain only
+//******************************************************************************
+
+struct IOPMActions;
+
+typedef void
+(*IOPMActionPowerChangeStart)(
+ void * target,
+ IOService * service,
+ IOPMActions * actions,
+ IOPMPowerStateIndex powerState,
+ IOPMPowerChangeFlags * changeFlags,
+ IOPMRequestTag requestTag );
+
+typedef void
+(*IOPMActionPowerChangeDone)(
+ void * target,
+ IOService * service,
+ IOPMActions * actions,
+ IOPMPowerStateIndex powerState,
+ IOPMPowerChangeFlags changeFlags,
+ IOPMRequestTag requestTag );
+
+typedef void
+(*IOPMActionPowerChangeOverride)(
+ void * target,
+ IOService * service,
+ IOPMActions * actions,
+ IOPMPowerStateIndex * powerState,
+ IOPMPowerChangeFlags * changeFlags,
+ IOPMRequestTag requestTag );
+
+typedef void
+(*IOPMActionActivityTickle)(
+ void * target,
+ IOService * service,
+ IOPMActions * actions );
+
+typedef void
+(*IOPMActionUpdatePowerClient)(
+ void * target,
+ IOService * service,
+ IOPMActions * actions,
+ const OSSymbol * powerClient,
+ IOPMPowerStateIndex oldPowerState,
+ IOPMPowerStateIndex newPowerState
+);
+
+struct IOPMActions {
+ void * target;
+ uint32_t parameter;
+ IOPMActionPowerChangeStart actionPowerChangeStart;
+ IOPMActionPowerChangeDone actionPowerChangeDone;
+ IOPMActionPowerChangeOverride actionPowerChangeOverride;
+ IOPMActionActivityTickle actionActivityTickle;
+ IOPMActionUpdatePowerClient actionUpdatePowerClient;
+};
+
+// IOPMActions parameter flags
+enum {
+ kPMActionsFlagIsDisplayWrangler = 0x00000100,
+ kPMActionsFlagIsGraphicsDevice = 0x00000200,
+ kPMActionsFlagIsAudioDevice = 0x00000400,
+ kPMActionsFlagLimitPower = 0x00000800,
+ kPMActionsPCIBitNumberMask = 0x000000ff
+};
+
+//******************************************************************************
+// Internal concise representation of IOPMPowerState
+struct IOPMPSEntry
+{
+ IOPMPowerFlags capabilityFlags;
+ IOPMPowerFlags outputPowerFlags;
+ IOPMPowerFlags inputPowerFlags;
+ uint32_t staticPower;
+ uint32_t settleUpTime;
+ uint32_t settleDownTime;
+ IOPMPowerStateIndex stateOrder;
+ IOPMPowerStateIndex stateOrderToIndex;
+};
+
+//******************************************************************************
+// IOServicePM
+//******************************************************************************