+enum {
+ kIOPMPowerOn = 0x00000002,
+ kIOPMDeviceUsable = 0x00008000,
+ kIOPMLowPower = 0x00010000,
+ kIOPMPreventIdleSleep = 0x00000040,
+ kIOPMSleepCapability = 0x00000004,
+ kIOPMRestartCapability = 0x00000080,
+ kIOPMSleep = 0x00000001,
+ kIOPMRestart = 0x00000080,
+ kIOPMInitialDeviceState = 0x00000100,
+ kIOPMRootDomainState = 0x00000200
+};
+
+/*
+ * Private IOPMPowerFlags
+ *
+ * For Apple use only
+ * Not for use with non-Apple drivers
+ * Their behavior is undefined
+ */
+enum {
+ kIOPMClockNormal = 0x0004,
+ kIOPMClockRunning = 0x0008,
+ kIOPMPreventSystemSleep = 0x0010,
+ kIOPMDoze = 0x0400,
+ kIOPMChildClamp = 0x0080,
+ kIOPMChildClamp2 = 0x0200,
+ kIOPMNotPowerManaged = 0x0800
+};
+
+/*
+ * Deprecated IOPMPowerFlags
+ * Their behavior is undefined when used in IOPMPowerState
+ * Capability, InputPowerRequirement, or OutputPowerCharacter fields.
+ */
+enum {
+ kIOPMMaxPerformance = 0x4000,
+ kIOPMPassThrough = 0x0100,
+ kIOPMAuxPowerOn = 0x0020,
+ kIOPMNotAttainable = 0x0001,
+ kIOPMContextRetained = 0x2000,
+ kIOPMConfigRetained = 0x1000,
+ kIOPMStaticPowerValid = 0x0800,
+ kIOPMSoftSleep = 0x0400,
+ kIOPMCapabilitiesMask = kIOPMPowerOn | kIOPMDeviceUsable |
+ kIOPMMaxPerformance | kIOPMContextRetained |
+ kIOPMConfigRetained | kIOPMSleepCapability |
+ kIOPMRestartCapability
+};
+
+/*
+ * Support for old names of IOPMPowerFlag constants
+ */
+enum {
+ IOPMNotAttainable = kIOPMNotAttainable,
+ IOPMPowerOn = kIOPMPowerOn,
+ IOPMClockNormal = kIOPMClockNormal,
+ IOPMClockRunning = kIOPMClockRunning,
+ IOPMAuxPowerOn = kIOPMAuxPowerOn,
+ IOPMDeviceUsable = kIOPMDeviceUsable,
+ IOPMMaxPerformance = kIOPMMaxPerformance,
+ IOPMContextRetained = kIOPMContextRetained,
+ IOPMConfigRetained = kIOPMConfigRetained,
+ IOPMNotPowerManaged = kIOPMNotPowerManaged,
+ IOPMSoftSleep = kIOPMSoftSleep
+};
+
+
+enum {
+ kIOPMNextHigherState = 1,
+ kIOPMHighestState = 2,
+ kIOPMNextLowerState = 3,
+ kIOPMLowestState = 4
+};
+
+enum {
+ IOPMNextHigherState = kIOPMNextHigherState,
+ IOPMHighestState = kIOPMHighestState,
+ IOPMNextLowerState = kIOPMNextLowerState,
+ IOPMLowestState = kIOPMLowestState
+};
+
+// Internal commands used by power managment command queue
+enum {
+ kIOPMBroadcastAggressiveness = 1,
+ kIOPMUnidleDevice
+};
+
+// Power consumption unknown value
+enum {
+ kIOPMUnknown = 0xFFFF
+};
+
+/*******************************************************************************
+ *
+ * Root Domain property keys of interest
+ *
+ ******************************************************************************/
+
+/* AppleClamshellState
+ * reflects the state of the clamshell (lid) on a portable.
+ * It has a boolean value.
+ * true == clamshell is closed
+ * false == clamshell is open
+ * not present == no clamshell on this hardware
+ */
+#define kAppleClamshellStateKey "AppleClamshellState"
+
+/* AppleClamshellCausesSleep
+ * reflects the clamshell close behavior on a portable.
+ * It has a boolean value.
+ * true == system will sleep when clamshell is closed
+ * false == system will not sleep on clamshell close
+ * (typically external display mode)
+ * not present == no clamshell on this hardware
+ */
+#define kAppleClamshellCausesSleepKey "AppleClamshellCausesSleep"
+
+/* kIOPMSleepWakeUUIDKey
+ * Key refers to a CFStringRef that will uniquely identify
+ * a sleep/wake cycle for logging & tracking.
+ * The key becomes valid at the beginning of a sleep cycle - before we
+ * initiate any sleep/wake notifications.
+ * The key becomes invalid at the completion of a system wakeup. The
+ * property will not be present in the IOPMrootDomain's registry entry
+ * when it is invalid.
+ *
+ * See IOPMrootDomain notification kIOPMMessageSleepWakeUUIDChange
+ */
+ #define kIOPMSleepWakeUUIDKey "SleepWakeUUID"
+
+/* kIOPMBootSessionUUIDKey
+ * Key refers to a CFStringRef that will uniquely identify
+ * a boot cycle.
+ * The key becomes valid at boot time and remains valid
+ * till shutdown. The property value will remain same across
+ * sleep/wake/hibernate cycle.
+ */
+#define kIOPMBootSessionUUIDKey "BootSessionUUID"
+
+/* kIOPMDeepSleepEnabledKey
+ * Indicates the Deep Sleep enable state.
+ * It has a boolean value.
+ * true == Deep Sleep is enabled
+ * false == Deep Sleep is disabled
+ * not present == Deep Sleep is not supported on this hardware
+ */
+#define kIOPMDeepSleepEnabledKey "Standby Enabled"
+
+/* kIOPMDeepSleepDelayKey
+ * Key refers to a CFNumberRef that represents the delay in seconds before
+ * entering Deep Sleep state. The property is not present if Deep Sleep is
+ * unsupported.
+ */
+#define kIOPMDeepSleepDelayKey "Standby Delay"
+
+/* kIOPMDestroyFVKeyOnStandbyKey
+ * Specifies if FileVault key can be stored when going to standby mode
+ * It has a boolean value,
+ * true == Destroy FV key when going to standby mode
+ * false == Retain FV key when going to standby mode
+ * not present == Retain FV key when going to standby mode
+ */
+#define kIOPMDestroyFVKeyOnStandbyKey "DestroyFVKeyOnStandby"
+
+/*******************************************************************************
+ *
+ * Properties that can control power management behavior
+ *
+ ******************************************************************************/
+
+/* kIOPMResetPowerStateOnWakeKey
+ * If an IOService publishes this key with the value of kOSBooleanTrue,
+ * then PM will disregard the influence from changePowerStateToPriv() or
+ * any activity tickles that occurred before system sleep when resolving
+ * the initial device power state on wake. Influences from power children
+ * and changePowerStateTo() are not eliminated. At the earliest opportunity
+ * upon system wake, PM will query the driver for a new power state to be
+ * installed as the initial changePowerStateToPriv() influence, by calling
+ * initialPowerStateForDomainState() with both kIOPMRootDomainState and
+ * kIOPMPowerOn flags set. The default implementation will always return
+ * the lowest power state. Drivers can override this default behavior to
+ * immediately raise the power state when there are work blocked on the
+ * power change, and cannot afford to wait until the next activity tickle.
+ * This property should be statically added to a driver's plist or set at
+ * runtime before calling PMinit().
+ */
+#define kIOPMResetPowerStateOnWakeKey "IOPMResetPowerStateOnWake"
+
+/*******************************************************************************
+ *
+ * Driver PM Assertions
+ *
+ ******************************************************************************/
+
+/* Driver Assertion bitfield description
+ * Driver PM assertions are defined by these bits.
+ */
+enum {
+ /*! kIOPMDriverAssertionCPUBit
+ * When set, PM kernel will prefer to leave the CPU and core hardware
+ * running in "Dark Wake" state, instead of sleeping.
+ */
+ kIOPMDriverAssertionCPUBit = 0x01,
+
+ /*! kIOPMDriverAssertionUSBExternalDeviceBit
+ * When set, driver is informing PM that an external USB device is attached.
+ */
+ kIOPMDriverAssertionUSBExternalDeviceBit = 0x04,
+
+ /*! kIOPMDriverAssertionBluetoothHIDDevicePairedBit
+ * When set, driver is informing PM that a Bluetooth HID device is paired.
+ */
+ kIOPMDriverAssertionBluetoothHIDDevicePairedBit = 0x08,
+
+ /*! kIOPMDriverAssertionExternalMediaMountedBit
+ * When set, driver is informing PM that an external media is mounted.
+ */
+ kIOPMDriverAssertionExternalMediaMountedBit = 0x10,
+
+ /*! kIOPMDriverAssertionReservedBit5
+ * Reserved for Thunderbolt.
+ */
+ kIOPMDriverAssertionReservedBit5 = 0x20,
+
+ /*! kIOPMDriverAssertionPreventDisplaySleepBit
+ * When set, the display should remain powered on while the system's awake.
+ */
+ kIOPMDriverAssertionPreventDisplaySleepBit = 0x40,
+
+ /*! kIOPMDriverAssertionReservedBit7
+ * Reserved for storage family.
+ */
+ kIOPMDriverAssertionReservedBit7 = 0x80,
+
+ /*! kIOPMDriverAssertionMagicPacketWakeEnabledBit
+ * When set, driver is informing PM that magic packet wake is enabled.
+ */
+ kIOPMDriverAssertionMagicPacketWakeEnabledBit = 0x100,
+
+ /*! kIOPMDriverAssertionNetworkKeepAliveActiveBit
+ * When set, driver is informing PM that it is holding the network
+ * interface up to do TCPKeepAlive
+ */
+ kIOPMDriverAssertionNetworkKeepAliveActiveBit = 0x200
+};
+
+ /* kIOPMAssertionsDriverKey
+ * This kIOPMrootDomain key refers to a CFNumberRef property, containing
+ * a bitfield describing the aggregate PM assertion levels.
+ * Example: A value of 0 indicates that no driver has asserted anything.
+ * Or, a value of <link>kIOPMDriverAssertionCPUBit</link>
+ * indicates that a driver (or drivers) have asserted a need for CPU and video.
+ */
+#define kIOPMAssertionsDriverKey "DriverPMAssertions"
+
+ /* kIOPMAssertionsDriverKey
+ * This kIOPMrootDomain key refers to a CFNumberRef property, containing
+ * a bitfield describing the aggregate PM assertion levels.
+ * Example: A value of 0 indicates that no driver has asserted anything.
+ * Or, a value of <link>kIOPMDriverAssertionCPUBit</link>
+ * indicates that a driver (or drivers) have asserted a need for CPU and video.
+ */
+#define kIOPMAssertionsDriverDetailedKey "DriverPMAssertionsDetailed"
+
+/*******************************************************************************
+ *
+ * Kernel Driver assertion detailed dictionary keys
+ *
+ * Keys decode the Array & dictionary data structure under IOPMrootDomain property
+ * kIOPMAssertionsDriverKey.
+ *
+ */
+#define kIOPMDriverAssertionIDKey "ID"
+#define kIOPMDriverAssertionCreatedTimeKey "CreatedTime"
+#define kIOPMDriverAssertionModifiedTimeKey "ModifiedTime"
+#define kIOPMDriverAssertionOwnerStringKey "Owner"
+#define kIOPMDriverAssertionOwnerServiceKey "ServicePtr"
+#define kIOPMDriverAssertionRegistryEntryIDKey "RegistryEntryID"
+#define kIOPMDriverAssertionLevelKey "Level"
+#define kIOPMDriverAssertionAssertedKey "Assertions"
+
+/*******************************************************************************
+ *
+ * Root Domain general interest messages
+ *
+ * Available by registering for interest type 'gIOGeneralInterest'
+ * on IOPMrootDomain.
+ *
+ ******************************************************************************/
+
+/* kIOPMMessageClamshellStateChange
+ * Delivered as a general interest notification on the IOPMrootDomain
+ * IOPMrootDomain sends this message when state of either AppleClamshellState
+ * or AppleClamshellCausesSleep changes. If this clamshell change results in
+ * a sleep, the sleep will initiate soon AFTER delivery of this message.
+ * The state of both variables is encoded in a bitfield argument sent with
+ * the message. Check bits 0 and 1 using kClamshellStateBit & kClamshellSleepBit
+ */
+enum {
+ kClamshellStateBit = (1 << 0),
+ kClamshellSleepBit = (1 << 1)
+};
+
+#define kIOPMMessageClamshellStateChange \
+ iokit_family_msg(sub_iokit_powermanagement, 0x100)
+
+/* kIOPMMessageFeatureChange
+ * Delivered when the set of supported features ("Supported Features" dictionary
+ * under IOPMrootDomain registry) changes in some way. Typically addition or
+ * removal of a supported feature.
+ * RootDomain passes no argument with this message.
+ */
+#define kIOPMMessageFeatureChange \
+ iokit_family_msg(sub_iokit_powermanagement, 0x110)
+
+/* kIOPMMessageInflowDisableCancelled
+ * The battery has drained completely to its "Fully Discharged" state.
+ * If a user process has disabled battery inflow for battery
+ * calibration, we forcibly re-enable Inflow at this point.
+ * If inflow HAS been forcibly re-enabled, bit 0
+ * (kInflowForciblyEnabledBit) will be set.
+ */
+enum {
+ kInflowForciblyEnabledBit = (1 << 0)
+};
+
+/* kIOPMMessageInternalBatteryFullyDischarged
+ * The battery has drained completely to its "Fully Discharged" state.
+ */
+#define kIOPMMessageInternalBatteryFullyDischarged \
+ iokit_family_msg(sub_iokit_powermanagement, 0x120)
+
+/* kIOPMMessageSystemPowerEventOccurred
+ * Some major system thermal property has changed, and interested clients may
+ * modify their behavior.
+ */
+#define kIOPMMessageSystemPowerEventOccurred \
+ iokit_family_msg(sub_iokit_powermanagement, 0x130)
+
+/* kIOPMMessageSleepWakeUUIDChange
+ * Either a new SleepWakeUUID has been specified at the beginning of a sleep,
+ * or we're removing the existing property upon completion of a wakeup.
+ */
+#define kIOPMMessageSleepWakeUUIDChange \
+ iokit_family_msg(sub_iokit_powermanagement, 0x140)
+
+/* kIOPMMessageSleepWakeUUIDSet
+ * Argument accompanying the kIOPMMessageSleepWakeUUIDChange notification when
+ * a new UUID has been specified.
+ */
+#define kIOPMMessageSleepWakeUUIDSet ((void *)1)
+
+/* kIOPMMessageSleepWakeUUIDCleared
+ * Argument accompanying the kIOPMMessageSleepWakeUUIDChange notification when
+ * the current UUID has been removed.
+ */
+#define kIOPMMessageSleepWakeUUIDCleared ((void *)0)
+
+/*! kIOPMMessageDriverAssertionsChanged
+ * Sent when kernel PM driver assertions have changed.
+ */
+#define kIOPMMessageDriverAssertionsChanged \
+ iokit_family_msg(sub_iokit_powermanagement, 0x150)
+
+/*! kIOPMMessageDarkWakeThermalEmergency
+ * Sent when machine becomes unsustainably warm in DarkWake.
+ * Kernel PM might choose to put the machine back to sleep right after.
+ */
+#define kIOPMMessageDarkWakeThermalEmergency \
+ iokit_family_msg(sub_iokit_powermanagement, 0x160)
+
+/*******************************************************************************
+ *
+ * Power commands issued to root domain
+ * Use with IOPMrootDomain::receivePowerNotification()
+ *
+ * These commands are issued from system drivers only:
+ * ApplePMU, AppleSMU, IOGraphics, AppleACPIFamily
+ *
+ * TODO: deprecate kIOPMAllowSleep and kIOPMPreventSleep
+ ******************************************************************************/
+enum {
+ kIOPMSleepNow = (1<<0), // put machine to sleep now
+ kIOPMAllowSleep = (1<<1), // allow idle sleep
+ kIOPMPreventSleep = (1<<2), // do not allow idle sleep
+ kIOPMPowerButton = (1<<3), // power button was pressed
+ kIOPMClamshellClosed = (1<<4), // clamshell was closed
+ kIOPMPowerEmergency = (1<<5), // battery dangerously low
+ kIOPMDisableClamshell = (1<<6), // do not sleep on clamshell closure
+ kIOPMEnableClamshell = (1<<7), // sleep on clamshell closure
+ kIOPMProcessorSpeedChange = (1<<8), // change the processor speed
+ kIOPMOverTemp = (1<<9), // system dangerously hot
+ kIOPMClamshellOpened = (1<<10), // clamshell was opened
+ kIOPMDWOverTemp = (1<<11) // DarkWake thermal limits exceeded.
+};
+
+
+/*******************************************************************************
+ *
+ * Power Management Return Codes
+ *
+ ******************************************************************************/
+enum {
+ kIOPMNoErr = 0,
+
+ // Returned by driver's setPowerState(), powerStateWillChangeTo(),
+ // powerStateDidChangeTo(), or acknowledgeSetPowerState() to
+ // implicitly acknowledge power change upon function return.
+ kIOPMAckImplied = 0,
+
+ // Deprecated
+ kIOPMWillAckLater = 1,
+
+ // Returned by requestPowerDomainState() to indicate
+ // unrecognized specification parameter.
+ kIOPMBadSpecification = 4,
+
+ // Returned by requestPowerDomainState() to indicate
+ // no power state matches search specification.
+ kIOPMNoSuchState = 5,
+
+ // Deprecated
+ kIOPMCannotRaisePower = 6,
+
+ // Deprecated
+ kIOPMParameterError = 7,
+
+ // Returned when power management state is accessed
+ // before driver has called PMinit().
+ kIOPMNotYetInitialized = 8,
+
+ // And the old constants; deprecated
+ IOPMNoErr = kIOPMNoErr,
+ IOPMAckImplied = kIOPMAckImplied,
+ IOPMWillAckLater = kIOPMWillAckLater,
+ IOPMBadSpecification = kIOPMBadSpecification,
+ IOPMNoSuchState = kIOPMNoSuchState,
+ IOPMCannotRaisePower = kIOPMCannotRaisePower,
+ IOPMParameterError = kIOPMParameterError,
+ IOPMNotYetInitialized = kIOPMNotYetInitialized
+};
+