| 1 | /* |
| 2 | * Copyright (c) 2002-2020 Apple Computer, Inc. All rights reserved. |
| 3 | * |
| 4 | * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ |
| 5 | * |
| 6 | * This file contains Original Code and/or Modifications of Original Code |
| 7 | * as defined in and that are subject to the Apple Public Source License |
| 8 | * Version 2.0 (the 'License'). You may not use this file except in |
| 9 | * compliance with the License. The rights granted to you under the License |
| 10 | * may not be used to create, or enable the creation or redistribution of, |
| 11 | * unlawful or unlicensed copies of an Apple operating system, or to |
| 12 | * circumvent, violate, or enable the circumvention or violation of, any |
| 13 | * terms of an Apple operating system software license agreement. |
| 14 | * |
| 15 | * Please obtain a copy of the License at |
| 16 | * http://www.opensource.apple.com/apsl/ and read it before using this file. |
| 17 | * |
| 18 | * The Original Code and all software distributed under the License are |
| 19 | * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
| 20 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
| 21 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, |
| 22 | * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
| 23 | * Please see the License for the specific language governing rights and |
| 24 | * limitations under the License. |
| 25 | * |
| 26 | * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ |
| 27 | */ |
| 28 | #ifndef _IOKIT_IOPMPRIVATE_H |
| 29 | #define _IOKIT_IOPMPRIVATE_H |
| 30 | |
| 31 | #include <IOKit/pwr_mgt/IOPM.h> |
| 32 | |
| 33 | /* @constant kIOPMEventTypeIntermediateFlag |
| 34 | * @abstract This bit indicates the event is an intermediate event |
| 35 | * which must occur within a major system power event. |
| 36 | */ |
| 37 | #define kIOPMEventTypeIntermediateFlag 0x10000000 |
| 38 | |
| 39 | /* @enum SystemEventTypes |
| 40 | * @abstract Potential system events logged in the system event record. |
| 41 | */ |
| 42 | enum { |
| 43 | kIOPMEventTypeUndefined = 0, |
| 44 | |
| 45 | /* Event types mark driver events |
| 46 | */ |
| 47 | kIOPMEventTypeSetPowerStateImmediate = 1001, |
| 48 | kIOPMEventTypeSetPowerStateDelayed = 1002, |
| 49 | kIOPMEventTypePSWillChangeTo = 1003, |
| 50 | kIOPMEventTypePSDidChangeTo = 1004, |
| 51 | kIOPMEventTypeAppResponse = 1005, |
| 52 | |
| 53 | |
| 54 | /* Start and stop event types bracket major |
| 55 | * system power management events. |
| 56 | */ |
| 57 | kIOPMEventTypeSleep = 2001, |
| 58 | kIOPMEventTypeSleepDone = 2002, |
| 59 | kIOPMEventTypeWake = 3001, |
| 60 | kIOPMEventTypeWakeDone = 3002, |
| 61 | kIOPMEventTypeDoze = 4001, |
| 62 | kIOPMEventTypeDozeDone = 4002, |
| 63 | kIOPMEventTypeUUIDSet = 6001, |
| 64 | kIOPMEventTypeUUIDClear = 6002, |
| 65 | |
| 66 | /* Intermediate events that may only occur within the bounds |
| 67 | * of a major system event (between the event's initiation and its "done event".) |
| 68 | * e.g. chronologically kIOPMEventTypeSleep may be followed by one or more |
| 69 | * intermediate events, which then must be followed by kIOPMEventTypeSleepDone. |
| 70 | * |
| 71 | * The intermediate events below will always occur in a Sleep or Wake event, and may |
| 72 | * or may not occur for any of the other events. |
| 73 | */ |
| 74 | kIOPMEventTypeAppNotificationsFinished = 501 | kIOPMEventTypeIntermediateFlag, |
| 75 | kIOPMEventTypeDriverNotificationsFinished = 502 | kIOPMEventTypeIntermediateFlag, |
| 76 | kIOPMEventTypeCalTimeChange = 503 | kIOPMEventTypeIntermediateFlag |
| 77 | }; |
| 78 | |
| 79 | /***************************************************************************** |
| 80 | * |
| 81 | * Private Root Domain general interest messages |
| 82 | * |
| 83 | * Check IOPM.h when adding new messages to avoid conflict. |
| 84 | * |
| 85 | *****************************************************************************/ |
| 86 | |
| 87 | /* kIOPMMessageUserIsActiveChanged |
| 88 | * User became active or inactive. Message sent after the kIOPMUserIsActiveKey |
| 89 | * property was updated with a new value. |
| 90 | */ |
| 91 | #define kIOPMMessageUserIsActiveChanged \ |
| 92 | iokit_family_msg(sub_iokit_powermanagement, 0x400) |
| 93 | |
| 94 | /* |
| 95 | * Private IOMessage notifications shared between kernel and userspace PM policy |
| 96 | */ |
| 97 | #define kIOPMMessageLastCallBeforeSleep \ |
| 98 | iokit_family_msg(sub_iokit_powermanagement, 0x410) |
| 99 | |
| 100 | #define kIOPMMessageIdleSleepPreventers \ |
| 101 | iokit_family_msg(sub_iokit_powermanagement, 0x420) |
| 102 | |
| 103 | #define kIOPMMessageSystemSleepPreventers \ |
| 104 | iokit_family_msg(sub_iokit_powermanagement, 0x430) |
| 105 | |
| 106 | #define kIOPMMessageLaunchBootSpinDump \ |
| 107 | iokit_family_msg(sub_iokit_powermanagement, 0x440) |
| 108 | |
| 109 | #define kIOPMMessageProModeStateChange \ |
| 110 | iokit_family_msg(sub_iokit_powermanagement, 0x450) |
| 111 | |
| 112 | #define kIOPMMessageRequestUserActive \ |
| 113 | iokit_family_msg(sub_iokit_powermanagement, 0x460) |
| 114 | |
| 115 | /* @enum SystemSleepReasons |
| 116 | * @abstract The potential causes for system sleep as logged in the system event record. |
| 117 | */ |
| 118 | enum { |
| 119 | kIOPMSleepReasonClamshell = 101, |
| 120 | kIOPMSleepReasonPowerButton = 102, |
| 121 | kIOPMSleepReasonSoftware = 103, |
| 122 | kIOPMSleepReasonOSSwitchHibernate = 104, |
| 123 | kIOPMSleepReasonIdle = 105, |
| 124 | kIOPMSleepReasonLowPower = 106, |
| 125 | kIOPMSleepReasonThermalEmergency = 107, |
| 126 | kIOPMSleepReasonMaintenance = 108, |
| 127 | kIOPMSleepReasonSleepServiceExit = 109, |
| 128 | kIOPMSleepReasonDarkWakeThermalEmergency = 110, |
| 129 | kIOPMSleepReasonNotificationWakeExit = 111 |
| 130 | }; |
| 131 | |
| 132 | /* |
| 133 | * Possible C-string sleep reasons found under kRootDomainSleepReasonsKey |
| 134 | */ |
| 135 | #define kIOPMClamshellSleepKey "Clamshell Sleep" |
| 136 | #define kIOPMPowerButtonSleepKey "Power Button Sleep" |
| 137 | #define kIOPMSoftwareSleepKey "Software Sleep" |
| 138 | #define kIOPMOSSwitchHibernationKey "OS Switch Sleep" |
| 139 | #define kIOPMIdleSleepKey "Idle Sleep" |
| 140 | #define kIOPMLowPowerSleepKey "Low Power Sleep" |
| 141 | #define kIOPMThermalEmergencySleepKey "Thermal Emergency Sleep" |
| 142 | #define kIOPMSleepServiceExitKey "Sleep Service Back to Sleep" |
| 143 | #define kIOPMDarkWakeThermalEmergencyKey "Dark Wake Thermal Emergency" |
| 144 | #define kIOPMNotificationWakeExitKey "Notification Wake Back to Sleep" |
| 145 | |
| 146 | #define kIOPMPSRestrictedModeKey "RestrictedMode" |
| 147 | |
| 148 | // Private keys for kIOPMPSAdapterDetailsKey dictionary |
| 149 | #define kIOPMPSAdapterDetailsIsWirelessKey "IsWireless" |
| 150 | |
| 151 | #pragma mark Stray Bitfields |
| 152 | // Private power commands issued to root domain |
| 153 | // bits 0-7 in IOPM.h |
| 154 | |
| 155 | enum { |
| 156 | kIOPMSetValue = (1<<16), |
| 157 | // don't sleep on clamshell closure on a portable with AC connected |
| 158 | kIOPMSetDesktopMode = (1<<17), |
| 159 | // set state of AC adaptor connected |
| 160 | kIOPMSetACAdaptorConnected = (1<<18) |
| 161 | }; |
| 162 | |
| 163 | /*****************************************************************************/ |
| 164 | /*****************************************************************************/ |
| 165 | |
| 166 | /* |
| 167 | * PM notification types |
| 168 | */ |
| 169 | |
| 170 | /*! @constant kIOPMSleepServiceScheduleImmediate |
| 171 | * |
| 172 | * Setting type used in calls to IOPMrootDomain::registerPMSettingController |
| 173 | * Use this type between powerd and IOKit.framework |
| 174 | * |
| 175 | */ |
| 176 | #define kIOPMSleepServiceScheduleImmediate "SleepServiceImmediate" |
| 177 | |
| 178 | /*! @constant kIOPMSettingSleepServiceScheduleImmediate |
| 179 | * |
| 180 | * Setting type used in calls to IOPMrootDomain::registerPMSettingController |
| 181 | * Use this type between xnu and AppleRTC |
| 182 | */ |
| 183 | #define kIOPMSettingSleepServiceWakeCalendarKey "SleepServiceWakeCalendarKey" |
| 184 | |
| 185 | /*! @constant kIOPMCalendarWakeTypes |
| 186 | * |
| 187 | * These are valid values for IOPM.h:IOPMCalendarStruct->selector |
| 188 | */ |
| 189 | enum { |
| 190 | kPMCalendarTypeInvalid = 0, |
| 191 | kPMCalendarTypeMaintenance = 1, |
| 192 | kPMCalendarTypeSleepService = 2 |
| 193 | }; |
| 194 | |
| 195 | |
| 196 | /* @constant kIOPMStateConsoleShutdown |
| 197 | * @abstract Notification of GUI shutdown state available to kexts. |
| 198 | * @discussion This type can be passed as arguments to registerPMSettingController() |
| 199 | * to receive callbacks. |
| 200 | */ |
| 201 | #define kIOPMStateConsoleShutdown "ConsoleShutdown" |
| 202 | |
| 203 | /* @enum ShutdownValues |
| 204 | * @abstract Potential values shared with key kIOPMStateConsoleShutdown |
| 205 | */ |
| 206 | enum { |
| 207 | /* @constant kIOPMStateConsoleShutdownNone |
| 208 | * @abstract System shutdown (or restart) hasn't started; system is ON. |
| 209 | * @discussion Next state: 2 |
| 210 | */ |
| 211 | kIOPMStateConsoleShutdownNone = 1, |
| 212 | /* @constant kIOPMStateConsoleShutdownPossible |
| 213 | * @abstract User has been presented with the option to shutdown or restart. Shutdown may be cancelled. |
| 214 | * @discussion Next state may be: 1, 4 |
| 215 | */ |
| 216 | kIOPMStateConsoleShutdownPossible = 2, |
| 217 | /* @constant kIOPMStateConsoleShutdownUnderway |
| 218 | * @abstract Shutdown or restart is proceeding. It may still be cancelled. |
| 219 | * @discussion Next state may be: 1, 4. This state is currently unused. |
| 220 | */ |
| 221 | kIOPMStateConsoleShutdownUnderway = 3, |
| 222 | /* @constant kIOPMStateConsoleShutdownCertain |
| 223 | * @abstract Shutdown is in progress and irrevocable. |
| 224 | * @discussion State remains 4 until power is removed from CPU. |
| 225 | */ |
| 226 | kIOPMStateConsoleShutdownCertain = 4, |
| 227 | /* @constant kIOPMStateConsoleSULogoutInitiated |
| 228 | Indicates that LoginWindow has initiated a software update restart. |
| 229 | The next logout will not immediately lead to a shutdown. |
| 230 | */ |
| 231 | kIOPMStateConsoleSULogoutInitiated = 5 |
| 232 | }; |
| 233 | |
| 234 | /* @constant kIOPMSettingSilentRunningKey |
| 235 | * @abstract Notification of silent running mode changes to kexts. |
| 236 | * @discussion This key can be passed as an argument to registerPMSettingController() |
| 237 | * and also identifies the type of PMSetting notification callback. |
| 238 | */ |
| 239 | #define kIOPMSettingSilentRunningKey "SilentRunning" |
| 240 | #define kIOPMFeatureSilentRunningKey kIOPMSettingSilentRunningKey |
| 241 | |
| 242 | /* @enum SilentRunningFlags |
| 243 | * @abstract The kIOPMSettingSilentRunningKey notification provides an OSNumber |
| 244 | * object with a value described by the following flags. |
| 245 | */ |
| 246 | enum { |
| 247 | kIOPMSilentRunningModeOn = 0x00000001 |
| 248 | }; |
| 249 | |
| 250 | /* @constant kIOPMSettingLowLatencyAudioModeKey |
| 251 | * @abstract Notification about low latency activity in the system available to kexts. |
| 252 | * @discussion This type can be passed as arguments to registerPMSettingController() |
| 253 | * to receive callbacks. |
| 254 | */ |
| 255 | #define kIOPMSettingLowLatencyAudioModeKey "LowLatencyAudioMode" |
| 256 | |
| 257 | /*****************************************************************************/ |
| 258 | /*****************************************************************************/ |
| 259 | |
| 260 | /* PM Statistics - event indices |
| 261 | * These are arguments to IOPMrootDomain::pmStatsRecordEvent(). |
| 262 | */ |
| 263 | enum { |
| 264 | kIOPMStatsHibernateImageWrite = 1, |
| 265 | kIOPMStatsHibernateImageRead, |
| 266 | kIOPMStatsDriversNotify, |
| 267 | kIOPMStatsApplicationNotify, |
| 268 | kIOPMStatsLateDriverAcknowledge, |
| 269 | kIOPMStatsLateAppAcknowledge, |
| 270 | |
| 271 | // To designate if you're specifying the start or stop end of |
| 272 | // each of the above events, do a bitwise OR of the appropriate |
| 273 | // Start/Stop flag and pass the result to IOPMrootDomain to record |
| 274 | // the event. |
| 275 | kIOPMStatsEventStartFlag = (1 << 24), |
| 276 | kIOPMStatsEventStopFlag = (1 << 25) |
| 277 | }; |
| 278 | |
| 279 | // Keys for IOPMrootDomain registry properties |
| 280 | #define kIOPMSleepStatisticsKey "SleepStatistics" |
| 281 | #define kIOPMSleepStatisticsAppsKey "AppStatistics" |
| 282 | #define kIOPMIdleSleepPreventersKey "IdleSleepPreventers" |
| 283 | #define kIOPMSystemSleepPreventersKey "SystemSleepPreventers" |
| 284 | #define kIOPMIdleSleepPreventersWithIDKey "IdleSleepPreventersWithID" |
| 285 | #define kIOPMSystemSleepPreventersWithIDKey "SystemSleepPreventersWithID" |
| 286 | |
| 287 | // Application response statistics |
| 288 | #define kIOPMStatsNameKey "Name" |
| 289 | #define kIOPMStatsPIDKey "Pid" |
| 290 | #define kIOPMStatsTimeMSKey "TimeMS" |
| 291 | #define kIOPMStatsApplicationResponseTypeKey "ResponseType" |
| 292 | #define kIOPMStatsMessageTypeKey "MessageType" |
| 293 | #define kIOPMStatsPowerCapabilityKey "PowerCaps" |
| 294 | #define kIOPMStatsSystemTransitionKey "TransitionType" |
| 295 | |
| 296 | // PM Statistics: potential values for the key kIOPMStatsApplicationResponseTypeKey |
| 297 | // entry in the application results array. |
| 298 | #define kIOPMStatsResponseTimedOut "ResponseTimedOut" |
| 299 | #define kIOPMStatsResponseCancel "ResponseCancel" |
| 300 | #define kIOPMStatsResponseSlow "ResponseSlow" |
| 301 | #define kIOPMStatsResponsePrompt "ResponsePrompt" |
| 302 | #define kIOPMStatsDriverPSChangeSlow "DriverPSChangeSlow" |
| 303 | |
| 304 | struct PMStatsBounds{ |
| 305 | uint64_t start; |
| 306 | uint64_t stop; |
| 307 | }; |
| 308 | typedef struct { |
| 309 | |
| 310 | struct PMStatsBounds hibWrite; |
| 311 | struct PMStatsBounds hibRead; |
| 312 | // bounds driverNotifySleep; |
| 313 | // bounds driverNotifyWake; |
| 314 | // bounds appNotifySleep; |
| 315 | // bounds appNotifyWake; |
| 316 | // OSDictionary *tardyApps; |
| 317 | // OSDictionary *tardyDrivers; |
| 318 | } PMStatsStruct; |
| 319 | |
| 320 | /*****************************************************************************/ |
| 321 | |
| 322 | /* PM RootDomain tracePoints |
| 323 | * |
| 324 | * In the sleep/wake process, we expect the sleep trace points to proceed |
| 325 | * in increasing order. Once sleep begins with code kIOPMTracePointSleepStarted, |
| 326 | * we expect sleep to continue in a monotonically increasing order of tracepoints |
| 327 | * to kIOPMTracePointSystemLoginwindowPhase. After trace point SystemLoginWindowPhase, |
| 328 | * the system will return to kIOPMTracePointSystemUp. |
| 329 | * |
| 330 | * If the trace point decreases (instead of increasing) before reaching kIOPMTracePointSystemUp, |
| 331 | * that indicates that the sleep process was cancelled. The cancel reason shall be indicated |
| 332 | * in the cancel tracepoint. (TBD) |
| 333 | */ |
| 334 | |
| 335 | enum { |
| 336 | /* When kTracePointSystemUp is the latest tracePoint, |
| 337 | * the system is awake. It is not asleep, sleeping, or waking. |
| 338 | * |
| 339 | * Phase begins: At boot, at completion of wake from sleep, |
| 340 | * immediately following kIOPMTracePointSystemLoginwindowPhase. |
| 341 | * Phase ends: When a sleep attempt is initiated. |
| 342 | */ |
| 343 | kIOPMTracePointSystemUp = 0, |
| 344 | |
| 345 | /* When kIOPMTracePointSleepStarted is the latest tracePoint, |
| 346 | * sleep has been initiated. |
| 347 | * |
| 348 | * Phase begins: At initiation of system sleep (idle or forced). |
| 349 | * Phase ends: PM starts to notify applications of system sleep. |
| 350 | */ |
| 351 | kIOPMTracePointSleepStarted = 0x10, |
| 352 | |
| 353 | /* When kIOPMTracePointSleepApplications is the latest tracePoint, |
| 354 | * a system sleep has been initiated and PM waits for responses |
| 355 | * from notified applications. |
| 356 | * |
| 357 | * Phase begins: Begin to asynchronously fire kIOMessageSystemWillSleep |
| 358 | * notifications, and also kIOMessageCanSystemSleep for the idle sleep case. |
| 359 | * Phase ends: When PM has received all application responses. |
| 360 | */ |
| 361 | kIOPMTracePointSleepApplications = 0x11, |
| 362 | |
| 363 | /* When kIOPMTracePointSleepPriorityClients is the latest tracePoint, |
| 364 | * PM is notifying priority clients and in-kernel system capability |
| 365 | * clients, and waiting for any asynchronous completions. |
| 366 | * |
| 367 | * Phase begins: Synchronous delivery of kIOMessageSystemWillSleep notifications. |
| 368 | * Phase ends: All notified clients have acknowledged. |
| 369 | */ |
| 370 | kIOPMTracePointSleepPriorityClients = 0x12, |
| 371 | |
| 372 | /* When kIOPMTracePointSleepWillChangeInterests is the latest tracePoint, |
| 373 | * PM is calling powerStateWillChangeTo() on interested drivers of root domain. |
| 374 | * |
| 375 | * Phase begins: Dispatch a callout thread to call interested drivers. |
| 376 | * Phase ends: Callout thread work done, and acknowledgePowerChange() called |
| 377 | * by drivers that indicated asynchronous completion. |
| 378 | */ |
| 379 | kIOPMTracePointSleepWillChangeInterests = 0x13, |
| 380 | |
| 381 | /* When kIOPMTracePointSleepPowerPlaneDrivers is the latest tracePoint, |
| 382 | * PM is directing power plane drivers to power off in leaf-to-root order. |
| 383 | * |
| 384 | * Phase begins: Root domain informs its power children that it will drop to |
| 385 | * sleep state. This has a cascade effect and triggers all drivers in |
| 386 | * the power plane to transition to a lower power state if necessary. |
| 387 | * Phase ends: All power transitions in response to the root domain power |
| 388 | * change have completed. |
| 389 | */ |
| 390 | kIOPMTracePointSleepPowerPlaneDrivers = 0x14, |
| 391 | |
| 392 | /* When kIOPMTracePointSleepDidChangeInterests is the latest tracePoint, |
| 393 | * PM is calling powerStateDidChangeTo() on interested drivers of root domain. |
| 394 | * |
| 395 | * Phase begins: Dispatch a callout thread to call interested drivers. |
| 396 | * Phase ends: Callout thread work done, and acknowledgePowerChange() called |
| 397 | * by drivers that indicated asynchronous completion. |
| 398 | */ |
| 399 | kIOPMTracePointSleepDidChangeInterests = 0x15, |
| 400 | |
| 401 | /* When kIOPMTracePointSleepCapabilityClients is the latest tracePoint, |
| 402 | * PM is notifying system capability clients about system sleep. |
| 403 | * |
| 404 | * Phase begins: Send kIOMessageSystemCapabilityChange notifications to inform |
| 405 | * capability clients that system has lost all capabilities. |
| 406 | * Phase ends: Finished sending notifications. |
| 407 | */ |
| 408 | kIOPMTracePointSleepCapabilityClients = 0x16, |
| 409 | |
| 410 | /* When kIOPMTracePointSleepPlatformActions is the latest tracePoint, |
| 411 | * PM is calling drivers that have registered a platform sleep action. |
| 412 | */ |
| 413 | kIOPMTracePointSleepPlatformActions = 0x17, |
| 414 | |
| 415 | /* When kIOPMTracePointSleepCPUs is the latest tracePoint, |
| 416 | * PM is shutting down all non-boot processors. |
| 417 | * |
| 418 | * Phase begins: Shutdown all non-boot processors. |
| 419 | * Phase ends: Reduced to only the boot processor running. |
| 420 | */ |
| 421 | kIOPMTracePointSleepCPUs = 0x18, |
| 422 | |
| 423 | /* When kIOPMTracePointSleepPlatformDriver is the latest tracePoint, |
| 424 | * PM is executing platform dependent code to prepare for system sleep. |
| 425 | */ |
| 426 | kIOPMTracePointSleepPlatformDriver = 0x19, |
| 427 | |
| 428 | /* When kIOPMTracePointHibernate is the latest tracePoint, |
| 429 | * PM is writing the hibernate image to disk. |
| 430 | */ |
| 431 | kIOPMTracePointHibernate = 0x1a, |
| 432 | |
| 433 | /* When kIOPMTracePointSystemSleep is the latest tracePoint, |
| 434 | * PM has recorded the final trace point before the hardware platform |
| 435 | * enters sleep state, or low level wakeup is underway - such as restoring |
| 436 | * the hibernate image from disk. |
| 437 | * |
| 438 | * Note: If a system is asleep and then loses power, and it does not have a |
| 439 | * hibernate image to restore from (e.g. hibernatemode = 0), then OS X will |
| 440 | * interpret this power loss as a failure in kIOPMTracePointSystemSleep. |
| 441 | * |
| 442 | * Phase begins: Before the OS directs the hardware to enter sleep state. |
| 443 | * Phase ends: Control returns to the OS on wake, but before recording the first |
| 444 | * wake trace point. |
| 445 | */ |
| 446 | kIOPMTracePointSystemSleep = 0x1f, |
| 447 | |
| 448 | /* When kIOPMTracePointWakePlatformDriver is the latest tracePoint, |
| 449 | * PM is executing platform dependent code to prepare for system wake. |
| 450 | */ |
| 451 | kIOPMTracePointWakePlatformDriver = 0x21, |
| 452 | |
| 453 | /* When kIOPMTracePointWakePlatformActions is the latest tracePoint, |
| 454 | * PM is calling drivers that have registered a platform wake action. |
| 455 | */ |
| 456 | kIOPMTracePointWakePlatformActions = 0x22, |
| 457 | |
| 458 | /* When kIOPMTracePointWakeCPUs is the latest tracePoint, |
| 459 | * PM is bringing all non-boot processors online. |
| 460 | */ |
| 461 | kIOPMTracePointWakeCPUs = 0x23, |
| 462 | |
| 463 | /* When kIOPMTracePointWakeWillPowerOnClients is the latest tracePoint, |
| 464 | * PM is sending kIOMessageSystemWillPowerOn to both kernel clients and |
| 465 | * applications. PM also notifies system capability clients about the |
| 466 | * proposed capability change. |
| 467 | * |
| 468 | * Phase begins: Send kIOMessageSystemWillPowerOn and |
| 469 | * kIOMessageSystemCapabilityChange notifications. |
| 470 | * Phase ends: Finished sending notifications. |
| 471 | */ |
| 472 | kIOPMTracePointWakeWillPowerOnClients = 0x24, |
| 473 | |
| 474 | /* When kIOPMTracePointWakeWillChangeInterests is the latest tracePoint, |
| 475 | * PM is calling powerStateWillChangeTo() on interested drivers of root domain. |
| 476 | * |
| 477 | * Phase begins: Dispatch a callout thread to call interested drivers. |
| 478 | * Phase ends: Callout thread work done, and acknowledgePowerChange() called |
| 479 | * by drivers that indicated asynchronous completion. |
| 480 | */ |
| 481 | kIOPMTracePointWakeWillChangeInterests = 0x25, |
| 482 | |
| 483 | /* When kIOPMTracePointWakeDidChangeInterests is the latest tracePoint, |
| 484 | * PM is calling powerStateDidChangeTo() on interested drivers of root domain. |
| 485 | * |
| 486 | * Phase begins: Dispatch a callout thread to call interested drivers. |
| 487 | * Phase ends: Callout thread work done, and acknowledgePowerChange() called |
| 488 | * by drivers that indicated asynchronous completion. |
| 489 | */ |
| 490 | kIOPMTracePointWakeDidChangeInterests = 0x26, |
| 491 | |
| 492 | /* When kIOPMTracePointWakePowerPlaneDrivers is the latest tracePoint, |
| 493 | * PM is directing power plane drivers to power up in root-to-leaf order. |
| 494 | * |
| 495 | * Phase begins: Root domain informs its power children that it transitioned |
| 496 | * to ON state. This has a cascade effect and triggers all drivers in |
| 497 | * the power plane to re-evaluate and potentially change power state. |
| 498 | * Phase ends: All power transitions in response to the root domain power |
| 499 | * change have completed. |
| 500 | */ |
| 501 | kIOPMTracePointWakePowerPlaneDrivers = 0x27, |
| 502 | |
| 503 | /* When kIOPMTracePointWakeCapabilityClients is the latest tracePoint, |
| 504 | * PM is notifying system capability clients about system wake, and waiting |
| 505 | * for any asynchronous completions. |
| 506 | * |
| 507 | * Phase begins: Inform capability clients that system has gained capabilities. |
| 508 | * Phase ends: All notified clients have acknowledged. |
| 509 | */ |
| 510 | kIOPMTracePointWakeCapabilityClients = 0x28, |
| 511 | |
| 512 | /* When kIOPMTracePointWakeApplications is the latest tracePoint, |
| 513 | * System CPU is powered, PM has powered on each driver. |
| 514 | * |
| 515 | * Phase begins: Send asynchronous kIOMessageSystemHasPoweredOn notifications. |
| 516 | * Phase ends: Finished sending asynchronous notifications. |
| 517 | */ |
| 518 | kIOPMTracePointWakeApplications = 0x29, |
| 519 | |
| 520 | /* kIOPMTracePointSystemLoginwindowPhase |
| 521 | * This phase represents a several minute window after the system has powered on. |
| 522 | * Higher levels of system diagnostics are in a heightened state of alert in this phase, |
| 523 | * in case any user errors occurred that we could not detect in software. |
| 524 | * |
| 525 | * Phase begins: After IOPMrootDomain sends kIOMessageSystemHasPoweredOn message. |
| 526 | * Phase ends: When loginwindow calls IOPMSleepWakeSetUUID(NULL) the system shall |
| 527 | * be considered awake and usable. The next phase shall be kIOPMTracePointSystemUp. |
| 528 | */ |
| 529 | kIOPMTracePointSystemLoginwindowPhase = 0x30, |
| 530 | |
| 531 | /* When kIOPMTracePointDarkWakeEntry is the latest tracePoint, |
| 532 | * PM has started a transition from full wake to dark wake. |
| 533 | * |
| 534 | * Phase begins: Start transition to dark wake. |
| 535 | * Phase ends: System in dark wake. Before recording kIOPMTracePointSystemUp. |
| 536 | */ |
| 537 | kIOPMTracePointDarkWakeEntry = 0x31, |
| 538 | |
| 539 | /* When kIOPMTracePointDarkWakeExit is the latest tracePoint, |
| 540 | * PM has started a transition from dark wake to full wake. |
| 541 | * |
| 542 | * Phase begins: Start transition to full wake. |
| 543 | * Phase ends: System in full wake. Before recording kIOPMTracePointSystemUp. |
| 544 | */ |
| 545 | kIOPMTracePointDarkWakeExit = 0x32 |
| 546 | }; |
| 547 | |
| 548 | /*****************************************************************************/ |
| 549 | |
| 550 | /* |
| 551 | * Component wake progress keys |
| 552 | * |
| 553 | * Certain components have the ability to log their wake progress with |
| 554 | * root domain using the keys provided below. |
| 555 | * |
| 556 | * LoginWindow - 4 bits |
| 557 | * CoreDisplay - 8 bits |
| 558 | * CoreGraphics - 8 bits |
| 559 | * |
| 560 | * These bits are stored with the trace phase that gets logged to |
| 561 | * the RTC register. |
| 562 | */ |
| 563 | |
| 564 | // Values that should be passed in to IOPMLogWakeProgress |
| 565 | enum { |
| 566 | kIOPMLoginWindowProgress = 1, |
| 567 | kIOPMCoreDisplayProgress = 2, |
| 568 | kIOPMCoreGraphicsProgress = 3 |
| 569 | }; |
| 570 | |
| 571 | enum { |
| 572 | kIOPMLoginWindowProgressMask = 0x0f, |
| 573 | kIOPMCoreDisplayProgressMask = 0xff, |
| 574 | kIOPMCoreGraphicsProgressMask = 0xff |
| 575 | }; |
| 576 | |
| 577 | /* |
| 578 | * kIOPMLoginWindowProgressKey - identifies PM debug data specific to LoginWindow |
| 579 | * for use with IOPMrootDomain. Only 4 bits of data are allotted. |
| 580 | */ |
| 581 | #define kIOPMLoginWindowProgressKey "LoginWindowProgress" |
| 582 | |
| 583 | /* |
| 584 | * kIOPMCoreDisplayProgressKey - identifies PM debug data specific to CoreDisplay |
| 585 | * for use with IOPMrootDomain. Only 8 bits of data are allotted. |
| 586 | */ |
| 587 | #define kIOPMCoreDisplayProgressKey "CoreDisplayProgress" |
| 588 | |
| 589 | /* |
| 590 | * kIOPMCoreGraphicsProgressKey - identifies PM debug data specific to CoreGraphics |
| 591 | * for use with IOPMrootDomain. Only 8 bits of data are allotted. |
| 592 | */ |
| 593 | #define kIOPMCoreGraphicsProgressKey "CoreGraphicsProgress" |
| 594 | |
| 595 | // For PM internal use only - key to locate sleep failure results within SCDynamicStore. |
| 596 | #define kIOPMDynamicStoreSleepFailureKey "SleepFailure" |
| 597 | |
| 598 | /*****************************************************************************/ |
| 599 | |
| 600 | // For IOPMLibPrivate.h |
| 601 | #define kIOPMSleepWakeFailureKey "PMFailurePhase" |
| 602 | #define kIOPMSleepWakeFailureCodeKey "PMStatusCode" |
| 603 | #define kIOPMSleepWakeFailureLoginKey "LWFailurePhase" |
| 604 | #define kIOPMSleepWakeFailureUUIDKey "UUID" |
| 605 | #define kIOPMSleepWakeFailureDateKey "Date" |
| 606 | #define kIOPMSleepWakeWdogRebootKey "SWWdogTriggeredRestart" |
| 607 | #define kIOPMSleepWakeWdogLogsValidKey "SWWdogLogsValid" |
| 608 | |
| 609 | /***************************************************************************** |
| 610 | * |
| 611 | * Root Domain private property keys |
| 612 | * |
| 613 | *****************************************************************************/ |
| 614 | |
| 615 | /* kIOPMFeatureAutoPowerOffKey |
| 616 | * Feature published if Auto Power Off is supported |
| 617 | */ |
| 618 | #define kIOPMFeatureAutoPowerOffKey "AutoPowerOff" |
| 619 | |
| 620 | /* kIOPMAutoPowerOffEnabledKey |
| 621 | * Indicates if Auto Power Off is enabled. |
| 622 | * It has a boolean value. |
| 623 | * true == Auto Power Off is enabled |
| 624 | * false == Auto Power Off is disabled |
| 625 | * not present == Auto Power Off is not supported on this hardware |
| 626 | */ |
| 627 | #define kIOPMAutoPowerOffEnabledKey "AutoPowerOff Enabled" |
| 628 | |
| 629 | /* kIOPMAutoPowerOffDelayKey |
| 630 | * Key refers to a CFNumberRef that represents the delay in seconds before |
| 631 | * entering the Auto Power Off state. The property is not present if Auto |
| 632 | * Power Off is unsupported. |
| 633 | */ |
| 634 | #define kIOPMAutoPowerOffDelayKey "AutoPowerOff Delay" |
| 635 | |
| 636 | /* kIOPMAutoPowerOffTimerKey |
| 637 | * Key refers to a CFNumberRef that indicates the time in seconds until the |
| 638 | * expiration of the Auto Power Off delay period. This value should be used |
| 639 | * to program a wake alarm before system sleep. |
| 640 | */ |
| 641 | #define kIOPMAutoPowerOffTimerKey "AutoPowerOff Timer" |
| 642 | |
| 643 | /* kIOPMDeepSleepTimerKey |
| 644 | * Key refers to a CFNumberRef that indicates the time in seconds until the |
| 645 | * expiration of the Standby delay period. This value should be used |
| 646 | * to program a wake alarm before system sleep. |
| 647 | */ |
| 648 | #define kIOPMDeepSleepTimerKey "Standby Timer" |
| 649 | |
| 650 | /* kIOPMUserWakeAlarmScheduledKey |
| 651 | * Key refers to a boolean value that indicates if an user alarm was scheduled |
| 652 | * or pending. |
| 653 | */ |
| 654 | #define kIOPMUserWakeAlarmScheduledKey "UserWakeAlarmScheduled" |
| 655 | |
| 656 | /* kIOPMDeepIdleSupportedKey |
| 657 | * Presence of this key indicates Deep Idle is supported on this platform. |
| 658 | * Key will always refer to a value of kOSBooleanTrue. |
| 659 | */ |
| 660 | #define kIOPMDeepIdleSupportedKey "IOPMDeepIdleSupported" |
| 661 | |
| 662 | /* kIOPMUserTriggeredFullWakeKey |
| 663 | * Key refers to a boolean value that indicates if the first full wake since |
| 664 | * last system sleep was triggered by the local user. This property is set |
| 665 | * before the initial full wake transition, and removed after powering down |
| 666 | * drivers for system sleep. |
| 667 | */ |
| 668 | #define kIOPMUserTriggeredFullWakeKey "IOPMUserTriggeredFullWake" |
| 669 | |
| 670 | /* kIOPMUserIsActiveKey |
| 671 | * Key refers to a boolean value that indicates if the user is active. |
| 672 | */ |
| 673 | #define kIOPMUserIsActiveKey "IOPMUserIsActive" |
| 674 | |
| 675 | /* kIOPMDriverWakeEventsKey |
| 676 | * Key refers to a property that should only be examined by powerd. |
| 677 | */ |
| 678 | #define kIOPMDriverWakeEventsKey "IOPMDriverWakeEvents" |
| 679 | |
| 680 | /***************************************************************************** |
| 681 | * |
| 682 | * IOPMDriverWakeEvents dictionary keys |
| 683 | * |
| 684 | *****************************************************************************/ |
| 685 | |
| 686 | #define kIOPMWakeEventTimeKey "Time" |
| 687 | #define kIOPMWakeEventFlagsKey "Flags" |
| 688 | #define kIOPMWakeEventReasonKey "Reason" |
| 689 | #define kIOPMWakeEventDetailsKey "Details" |
| 690 | |
| 691 | /* kIOPMFeatureProModeKey |
| 692 | * Feature published if ProMode is supported |
| 693 | */ |
| 694 | #define kIOPMFeatureProModeKey "ProMode" |
| 695 | |
| 696 | /***************************************************************************** |
| 697 | * |
| 698 | * Wake event flags reported to IOPMrootDomain::claimSystemWakeEvent() |
| 699 | * |
| 700 | *****************************************************************************/ |
| 701 | |
| 702 | #define kIOPMWakeEventSource 0x00000001 |
| 703 | |
| 704 | /***************************************************************************** |
| 705 | * |
| 706 | * AOT defs |
| 707 | * |
| 708 | *****************************************************************************/ |
| 709 | |
| 710 | // signals the device should wake up to user space running |
| 711 | #define kIOPMWakeEventAOTExit 0x00000002 |
| 712 | |
| 713 | // will start a 400 ms timer before sleeping |
| 714 | #define kIOPMWakeEventAOTPossibleExit 0x00000004 |
| 715 | |
| 716 | // signals the device should wake up to user space running |
| 717 | #define kIOPMWakeEventAOTConfirmedPossibleExit 0x00000008 |
| 718 | |
| 719 | // signals the device should go back to AOT |
| 720 | #define kIOPMWakeEventAOTRejectedPossibleExit 0x00000010 |
| 721 | |
| 722 | // signals the device should go back to AOT |
| 723 | #define kIOPMWakeEventAOTExpiredPossibleExit 0x00000020 |
| 724 | |
| 725 | #define kIOPMWakeEventAOTFlags \ |
| 726 | (kIOPMWakeEventAOTExit \ |
| 727 | | kIOPMWakeEventAOTPossibleExit \ |
| 728 | | kIOPMWakeEventAOTConfirmedPossibleExit \ |
| 729 | | kIOPMWakeEventAOTRejectedPossibleExit \ |
| 730 | | kIOPMWakeEventAOTExpiredPossibleExit) |
| 731 | |
| 732 | #define kIOPMWakeEventAOTPossibleFlags \ |
| 733 | (kIOPMWakeEventAOTPossibleExit \ |
| 734 | | kIOPMWakeEventAOTConfirmedPossibleExit \ |
| 735 | | kIOPMWakeEventAOTRejectedPossibleExit \ |
| 736 | | kIOPMWakeEventAOTExpiredPossibleExit) |
| 737 | |
| 738 | #define kIOPMWakeEventAOTPerCycleFlags \ |
| 739 | (kIOPMWakeEventAOTPossibleExit \ |
| 740 | | kIOPMWakeEventAOTRejectedPossibleExit \ |
| 741 | | kIOPMWakeEventAOTExpiredPossibleExit) |
| 742 | |
| 743 | #define kIOPMWakeEventAOTExitFlags \ |
| 744 | (kIOPMWakeEventAOTExit \ |
| 745 | | kIOPMWakeEventAOTConfirmedPossibleExit) |
| 746 | |
| 747 | enum { |
| 748 | kIOPMAOTModeMask = 0x000000ff, |
| 749 | kIOPMAOTModeEnable = 0x00000001, |
| 750 | kIOPMAOTModeCycle = 0x00000002, |
| 751 | kIOPMAOTModeAddEventFlags = 0x00000004, |
| 752 | kIOPMAOTModeRespectTimers = 0x00000008, |
| 753 | kIOPMAOTModeDefault = (kIOPMAOTModeEnable | kIOPMAOTModeAddEventFlags | kIOPMAOTModeRespectTimers) |
| 754 | }; |
| 755 | |
| 756 | enum { |
| 757 | kIOPMAOTMetricsKernelWakeCountMax = 24 |
| 758 | }; |
| 759 | |
| 760 | struct IOPMAOTMetrics |
| 761 | { |
| 762 | uint32_t sleepCount; |
| 763 | uint32_t possibleCount; |
| 764 | uint32_t confirmedPossibleCount; |
| 765 | uint32_t rejectedPossibleCount; |
| 766 | uint32_t expiredPossibleCount; |
| 767 | uint32_t noTimeSetCount; |
| 768 | uint32_t rtcAlarmsCount; |
| 769 | uint32_t softwareRequestCount; |
| 770 | uint64_t totalTime; |
| 771 | |
| 772 | char kernelWakeReason[kIOPMAOTMetricsKernelWakeCountMax][64]; |
| 773 | // 54:10 secs:ms calendar time |
| 774 | uint64_t kernelSleepTime[kIOPMAOTMetricsKernelWakeCountMax]; |
| 775 | uint64_t kernelWakeTime[kIOPMAOTMetricsKernelWakeCountMax]; |
| 776 | }; |
| 777 | |
| 778 | #define kIOPMAOTPowerKey "aot-power" |
| 779 | |
| 780 | /***************************************************************************** |
| 781 | * |
| 782 | * Dark Wake |
| 783 | * |
| 784 | *****************************************************************************/ |
| 785 | |
| 786 | /* An OSNumber property set on a power managed driver that the root domain |
| 787 | * will use as the driver's max power state while system is in dark wake. |
| 788 | * This property should be set prior to the driver joining the PM tree. |
| 789 | */ |
| 790 | #define kIOPMDarkWakeMaxPowerStateKey "IOPMDarkWakeMaxPowerState" |
| 791 | |
| 792 | /***************************************************************************** |
| 793 | * |
| 794 | * System Sleep Policy |
| 795 | * |
| 796 | *****************************************************************************/ |
| 797 | |
| 798 | #define kIOPMSystemSleepPolicySignature 0x54504c53 |
| 799 | #define kIOPMSystemSleepPolicyVersion 2 |
| 800 | |
| 801 | /*! |
| 802 | * @defined kIOPMSystemSleepTypeKey |
| 803 | * @abstract Indicates the type of system sleep. |
| 804 | * @discussion An OSNumber property of root domain that describes the type |
| 805 | * of system sleep. This property is set after notifying priority sleep/wake |
| 806 | * clients, but before informing interested drivers and shutting down power |
| 807 | * plane drivers. On a hibernate abort or failure, this property will not be |
| 808 | * updated and will indicate the failed sleep type. |
| 809 | */ |
| 810 | #define kIOPMSystemSleepTypeKey "IOPMSystemSleepType" |
| 811 | |
| 812 | struct IOPMSystemSleepPolicyVariables |
| 813 | { |
| 814 | uint32_t signature; // kIOPMSystemSleepPolicySignature |
| 815 | uint32_t version; // kIOPMSystemSleepPolicyVersion |
| 816 | |
| 817 | uint64_t currentCapability; // current system capability bits |
| 818 | uint64_t highestCapability; // highest system capability bits |
| 819 | |
| 820 | uint64_t sleepFactors; // sleep factor bits |
| 821 | uint32_t sleepReason; // kIOPMSleepReason* |
| 822 | uint32_t sleepPhase; // identify the sleep phase |
| 823 | uint32_t hibernateMode; // current hibernate mode |
| 824 | |
| 825 | uint32_t standbyDelay; // standby delay in seconds |
| 826 | uint32_t standbyTimer; // standby timer in seconds |
| 827 | uint32_t poweroffDelay; // auto-poweroff delay in seconds |
| 828 | uint32_t scheduledAlarms; // bitmask of scheduled alarm types |
| 829 | uint32_t poweroffTimer; // auto-poweroff timer in seconds |
| 830 | |
| 831 | uint32_t reserved[49]; // pad sizeof 256 bytes |
| 832 | }; |
| 833 | |
| 834 | enum { |
| 835 | kIOPMAlarmBitDebugWake = 0x01, |
| 836 | kIOPMAlarmBitCalendarWake = 0x02, |
| 837 | kIOPMAlarmBitMaintenanceWake = 0x04, |
| 838 | kIOPMAlarmBitSleepServiceWake = 0x08 |
| 839 | }; |
| 840 | |
| 841 | enum { |
| 842 | kIOPMSleepPhase0 = 0, |
| 843 | kIOPMSleepPhase1, |
| 844 | kIOPMSleepPhase2 |
| 845 | }; |
| 846 | |
| 847 | // Sleep Factor Mask / Bits |
| 848 | enum { |
| 849 | kIOPMSleepFactorSleepTimerWake = 0x00000001ULL, |
| 850 | kIOPMSleepFactorLidOpen = 0x00000002ULL, |
| 851 | kIOPMSleepFactorACPower = 0x00000004ULL, |
| 852 | kIOPMSleepFactorBatteryLow = 0x00000008ULL, |
| 853 | kIOPMSleepFactorStandbyNoDelay = 0x00000010ULL, |
| 854 | kIOPMSleepFactorStandbyForced = 0x00000020ULL, |
| 855 | kIOPMSleepFactorStandbyDisabled = 0x00000040ULL, |
| 856 | kIOPMSleepFactorUSBExternalDevice = 0x00000080ULL, |
| 857 | kIOPMSleepFactorBluetoothHIDDevice = 0x00000100ULL, |
| 858 | kIOPMSleepFactorExternalMediaMounted = 0x00000200ULL, |
| 859 | kIOPMSleepFactorThunderboltDevice = 0x00000400ULL, |
| 860 | kIOPMSleepFactorRTCAlarmScheduled = 0x00000800ULL, |
| 861 | kIOPMSleepFactorMagicPacketWakeEnabled = 0x00001000ULL, |
| 862 | kIOPMSleepFactorHibernateForced = 0x00010000ULL, |
| 863 | kIOPMSleepFactorAutoPowerOffDisabled = 0x00020000ULL, |
| 864 | kIOPMSleepFactorAutoPowerOffForced = 0x00040000ULL, |
| 865 | kIOPMSleepFactorExternalDisplay = 0x00080000ULL, |
| 866 | kIOPMSleepFactorNetworkKeepAliveActive = 0x00100000ULL, |
| 867 | kIOPMSleepFactorLocalUserActivity = 0x00200000ULL, |
| 868 | kIOPMSleepFactorHibernateFailed = 0x00400000ULL, |
| 869 | kIOPMSleepFactorThermalWarning = 0x00800000ULL, |
| 870 | kIOPMSleepFactorDisplayCaptured = 0x01000000ULL |
| 871 | }; |
| 872 | |
| 873 | // System Sleep Types |
| 874 | enum { |
| 875 | kIOPMSleepTypeInvalid = 0, |
| 876 | kIOPMSleepTypeAbortedSleep = 1, |
| 877 | kIOPMSleepTypeNormalSleep = 2, |
| 878 | kIOPMSleepTypeSafeSleep = 3, |
| 879 | kIOPMSleepTypeHibernate = 4, |
| 880 | kIOPMSleepTypeStandby = 5, |
| 881 | kIOPMSleepTypePowerOff = 6, |
| 882 | kIOPMSleepTypeDeepIdle = 7, |
| 883 | kIOPMSleepTypeLast = 8 |
| 884 | }; |
| 885 | |
| 886 | // System Sleep Flags |
| 887 | enum { |
| 888 | kIOPMSleepFlagDisableHibernateAbort = 0x00000001, |
| 889 | kIOPMSleepFlagDisableUSBWakeEvents = 0x00000002, |
| 890 | kIOPMSleepFlagDisableBatlowAssertion = 0x00000004, |
| 891 | kIOPMSleepFlagDisableS4WakeSources = 0x00000008 |
| 892 | }; |
| 893 | |
| 894 | // System Wake Events |
| 895 | enum { |
| 896 | kIOPMWakeEventLidOpen = 0x00000001, |
| 897 | kIOPMWakeEventLidClose = 0x00000002, |
| 898 | kIOPMWakeEventACAttach = 0x00000004, |
| 899 | kIOPMWakeEventACDetach = 0x00000008, |
| 900 | kIOPMWakeEventCDInsert = 0x00000010, |
| 901 | kIOPMWakeEventCDEject = 0x00000020, |
| 902 | kIOPMWakeEventHPDAttach = 0x00000040, |
| 903 | kIOPMWakeEventHPDDetach = 0x00000080, |
| 904 | kIOPMWakeEventPowerButton = 0x00000100, |
| 905 | kIOPMWakeEventG3PowerOn = 0x00000200, |
| 906 | kIOPMWakeEventUserPME = 0x00000400, |
| 907 | kIOPMWakeEventSleepTimer = 0x00000800, |
| 908 | kIOPMWakeEventBatteryLow = 0x00001000, |
| 909 | kIOPMWakeEventDarkPME = 0x00002000, |
| 910 | kIOPMWakeEventWifi = 0x00004000, |
| 911 | kIOPMWakeEventRTCSystem = 0x00008000, // Maintenance RTC wake |
| 912 | kIOPMWakeEventUSBCPlugin = 0x00010000, // USB-C Plugin |
| 913 | kIOPMWakeEventHID = 0x00020000, |
| 914 | kIOPMWakeEventBluetooth = 0x00040000, |
| 915 | kIOPMWakeEventDFR = 0x00080000, |
| 916 | kIOPMWakeEventSD = 0x00100000, // SD card |
| 917 | kIOPMWakeEventLANWake = 0x00200000, // Wake on Lan |
| 918 | kIOPMWakeEventLANPlugin = 0x00400000, // Ethernet media sense |
| 919 | kIOPMWakeEventThunderbolt = 0x00800000, |
| 920 | kIOPMWakeEventRTCUser = 0x01000000, // User requested RTC wake |
| 921 | }; |
| 922 | |
| 923 | /*! |
| 924 | * @defined kIOPMSystemSleepParametersKey |
| 925 | * @abstract Sleep parameters describing the upcoming sleep |
| 926 | * @discussion Root domain updates this OSData property before system sleep |
| 927 | * to pass sleep parameters to the platform driver. Some of the parameters |
| 928 | * are based on the chosen entry in the system sleep policy table. |
| 929 | */ |
| 930 | #define kIOPMSystemSleepParametersKey "IOPMSystemSleepParameters" |
| 931 | #define kIOPMSystemSleepParametersVersion 2 |
| 932 | |
| 933 | struct IOPMSystemSleepParameters |
| 934 | { |
| 935 | uint16_t version; |
| 936 | uint16_t reserved1; |
| 937 | uint32_t sleepType; |
| 938 | uint32_t sleepFlags; |
| 939 | uint32_t ecWakeEvents; |
| 940 | uint32_t ecWakeTimer; |
| 941 | uint32_t ecPoweroffTimer; |
| 942 | uint32_t reserved2[10]; |
| 943 | } __attribute__((packed)); |
| 944 | |
| 945 | |
| 946 | /* |
| 947 | * Sleep Wake debug buffer header |
| 948 | */ |
| 949 | typedef struct { |
| 950 | uint32_t signature; |
| 951 | uint32_t alloc_size; |
| 952 | uint32_t crc; /* CRC for spindump & following data.*/ |
| 953 | uint32_t spindump_offset; /* Offset at which spindump offset is stored */ |
| 954 | uint32_t spindump_size; |
| 955 | uint8_t is_osx_watchdog; |
| 956 | |
| 957 | /* All members from UUID onwards are saved into log file */ |
| 958 | char UUID[44]; |
| 959 | char spindump_status[24]; /* stackshot status*/ |
| 960 | char PMStatusCode[32]; |
| 961 | char reason[32]; |
| 962 | } swd_hdr; |
| 963 | |
| 964 | |
| 965 | #define SWD_HDR_SIGNATURE 0xdeb8da2a |
| 966 | |
| 967 | #define SWD_STACKSHOT_SIZE (40*PAGE_SIZE) |
| 968 | #define SWD_COMPRESSED_BUFSIZE (5*PAGE_SIZE) |
| 969 | #define SWD_ZLIB_BUFSIZE (10*PAGE_SIZE) |
| 970 | #define SWD_STACKSHOT_VAR_PREFIX "sleepwake_diags" |
| 971 | |
| 972 | #define SWD_SPINDUMP_SIZE (256*1024) |
| 973 | #define SWD_INITIAL_SPINDUMP_SIZE ((SWD_SPINDUMP_SIZE/2)-sizeof(swd_hdr)) |
| 974 | #define SWD_MAX_STACKSHOTS (10) |
| 975 | |
| 976 | /* Bits in swd_flags */ |
| 977 | #define SWD_WDOG_ENABLED 0x01 |
| 978 | #define SWD_BOOT_BY_SW_WDOG 0x02 |
| 979 | #define SWD_BOOT_BY_OSX_WDOG 0x04 |
| 980 | #define SWD_VALID_LOGS 0x08 |
| 981 | #define SWD_LOGS_IN_FILE 0x10 |
| 982 | #define SWD_LOGS_IN_MEM 0x20 |
| 983 | #define SWD_PWR_BTN_STACKSHOT 0x30 |
| 984 | |
| 985 | #define SWD_DATA_CRC_ERROR 0x010000 |
| 986 | #define SWD_BUF_SIZE_ERROR 0x020000 |
| 987 | #define SWD_HDR_SIZE_ERROR 0x040000 |
| 988 | #define SWD_FILEOP_ERROR 0x080000 |
| 989 | #define SWD_HDR_SIGNATURE_ERROR 0x100000 |
| 990 | #define SWD_INTERNAL_FAILURE 0x200000 |
| 991 | |
| 992 | |
| 993 | /* Filenames associated with the stackshots/logs generated by the SWD */ |
| 994 | #define kOSWatchdogStacksFilename "/var/log/OSXWatchdogStacks.gz" |
| 995 | #define kOSWatchdogFailureStringFile "/var/log/OSWatchdogFailureString.txt" |
| 996 | #define kSleepWakeStacksFilename "/var/log/SleepWakeStacks.gz" |
| 997 | #define kSleepWakeFailureStringFile "/var/log/SleepWakeFailureString.txt" |
| 998 | |
| 999 | |
| 1000 | /* RootDomain IOReporting channels */ |
| 1001 | #define kSleepCntChID IOREPORT_MAKEID('S','l','e','e','p','C','n','t') |
| 1002 | #define kDarkWkCntChID IOREPORT_MAKEID('G','U','I','W','k','C','n','t') |
| 1003 | #define kUserWkCntChID IOREPORT_MAKEID('D','r','k','W','k','C','n','t') |
| 1004 | |
| 1005 | /* |
| 1006 | * kAssertDelayChID - Histogram of time elapsed before assertion after wake. |
| 1007 | */ |
| 1008 | #define kAssertDelayBcktCnt 11 |
| 1009 | #define kAssertDelayBcktSize 3 |
| 1010 | #define kAssertDelayChID IOREPORT_MAKEID('r','d','A','s','r','t','D','l') |
| 1011 | |
| 1012 | /* |
| 1013 | * kSleepDelaysChID - Histogram of time taken to put system to sleep |
| 1014 | */ |
| 1015 | #define kSleepDelaysBcktCnt 13 |
| 1016 | #define kSleepDelaysBcktSize 10 |
| 1017 | #define kSleepDelaysChID IOREPORT_MAKEID('r','d','S','l','p','D','l','y') |
| 1018 | |
| 1019 | /* Sleep Options/settings */ |
| 1020 | #define kSleepOptionDisplayCapturedModeKey "DisplayCapturedMode" |
| 1021 | |
| 1022 | |
| 1023 | #if defined(KERNEL) && defined(__cplusplus) |
| 1024 | |
| 1025 | /*! |
| 1026 | * @defined kIOPMInstallSystemSleepPolicyHandlerKey |
| 1027 | * @abstract Name of the platform function to install a sleep policy handler. |
| 1028 | * @discussion Pass to IOPMrootDomain::callPlatformFunction(), with a pointer |
| 1029 | * to the C-function handler at param1, and an optional target at param2, to |
| 1030 | * register a sleep policy handler. Only a single sleep policy handler can |
| 1031 | * be installed. |
| 1032 | */ |
| 1033 | #define kIOPMInstallSystemSleepPolicyHandlerKey \ |
| 1034 | "IOPMInstallSystemSleepPolicyHandler" |
| 1035 | |
| 1036 | typedef IOReturn (*IOPMSystemSleepPolicyHandler)( |
| 1037 | void * target, |
| 1038 | const IOPMSystemSleepPolicyVariables * vars, |
| 1039 | IOPMSystemSleepParameters * params ); |
| 1040 | |
| 1041 | #endif /* KERNEL */ |
| 1042 | |
| 1043 | /***************************************************************************** |
| 1044 | * |
| 1045 | * Performance Warning |
| 1046 | * |
| 1047 | *****************************************************************************/ |
| 1048 | |
| 1049 | /* Performance Warning Key |
| 1050 | * Key for performance warning event published using IOPMrootDomain:: |
| 1051 | * systemPowerEventOccurred() |
| 1052 | */ |
| 1053 | #define kIOPMPerformanceWarningKey "Performance_Warning" |
| 1054 | |
| 1055 | /* Performance warning values */ |
| 1056 | enum { |
| 1057 | kIOPMPerformanceNormal = 0, |
| 1058 | kIOPMPerformanceWarning = 100 |
| 1059 | }; |
| 1060 | |
| 1061 | |
| 1062 | #endif /* _IOKIT_IOPMPRIVATE_H */ |
| 1063 | |