xref: /xnu-8796.141.3/iokit/IOKit/pwr_mgt/RootDomain.h (revision 1b191cb58250d0705d8a51287127505aa4bc0789)
1 /*
2  * Copyright (c) 1998-2020 Apple 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_ROOTDOMAIN_H
29 #define _IOKIT_ROOTDOMAIN_H
30 
31 #include <libkern/c++/OSPtr.h>
32 #include <IOKit/IOService.h>
33 #include <IOKit/pwr_mgt/IOPM.h>
34 #include <IOKit/IOBufferMemoryDescriptor.h>
35 #include <sys/vnode.h>
36 
37 #ifdef XNU_KERNEL_PRIVATE
38 
39 #include <IOKit/pwr_mgt/IOPMPrivate.h>
40 
41 struct AggressivesRecord;
42 struct IOPMMessageFilterContext;
43 struct IOPMActions;
44 struct IOPMSystemSleepParameters;
45 class PMSettingObject;
46 class PMTraceWorker;
47 class IOPMPowerStateQueue;
48 class RootDomainUserClient;
49 class PMAssertionsTracker;
50 class IOTimerEventSource;
51 
52 #define OBFUSCATE(x) (void *)VM_KERNEL_UNSLIDE_OR_PERM(x)
53 
54 #endif
55 
56 /*!
57  * Types for PM Assertions
58  * For creating, releasing, and getting PM assertion levels.
59  */
60 
61 /*! IOPMDriverAssertionType
62  * A bitfield describing a set of assertions. May be used to specify which assertions
63  * to set with <link>IOPMrootDomain::createPMAssertion</link>; or to query which
64  * assertions are set with <link>IOPMrootDomain::releasePMAssertion</link>.
65  */
66 typedef uint64_t IOPMDriverAssertionType;
67 
68 /* IOPMDriverAssertionID
69  * Drivers may create PM assertions to request system behavior (keep the system awake,
70  *  or keep the display awake). When a driver creates an assertion via
71  *  <link>IOPMrootDomain::createPMAssertion</link>, PM returns a handle to
72  *  the assertion of type IOPMDriverAssertionID.
73  */
74 typedef uint64_t IOPMDriverAssertionID;
75 #define kIOPMUndefinedDriverAssertionID       0
76 
77 /* IOPMDriverAssertionLevel
78  * Possible values for IOPMDriverAssertionLevel are <link>kIOPMDriverAssertionLevelOff</link>
79  * and <link>kIOPMDriverAssertionLevelOn</link>
80  */
81 typedef uint32_t IOPMDriverAssertionLevel;
82 #define kIOPMDriverAssertionLevelOff          0
83 #define kIOPMDriverAssertionLevelOn           255
84 
85 /*
86  * Flags for get/setSleepSupported()
87  */
88 enum {
89 	kRootDomainSleepNotSupported    = 0x00000000,
90 	kRootDomainSleepSupported         = 0x00000001,
91 	kFrameBufferDeepSleepSupported    = 0x00000002,
92 	kPCICantSleep                   = 0x00000004
93 };
94 
95 /*
96  * IOPMrootDomain registry property keys
97  */
98 #define kRootDomainSupportedFeatures        "Supported Features"
99 #define kRootDomainSleepReasonKey           "Last Sleep Reason"
100 #define kRootDomainSleepOptionsKey          "Last Sleep Options"
101 #define kIOPMRootDomainWakeReasonKey        "Wake Reason"
102 #define kIOPMRootDomainWakeTypeKey          "Wake Type"
103 #define kIOPMRootDomainPowerStatusKey       "Power Status"
104 
105 /*
106  * Possible sleep reasons found under kRootDomainSleepReasonsKey
107  */
108 #define kIOPMClamshellSleepKey              "Clamshell Sleep"
109 #define kIOPMPowerButtonSleepKey            "Power Button Sleep"
110 #define kIOPMSoftwareSleepKey               "Software Sleep"
111 #define kIOPMOSSwitchHibernationKey         "OS Switch Sleep"
112 #define kIOPMIdleSleepKey                   "Idle Sleep"
113 #define kIOPMLowPowerSleepKey               "Low Power Sleep"
114 #define kIOPMThermalEmergencySleepKey       "Thermal Emergency Sleep"
115 #define kIOPMMaintenanceSleepKey            "Maintenance Sleep"
116 
117 /*
118  * String constants for communication with PM CPU
119  */
120 #define kIOPMRootDomainLidCloseCString      "LidClose"
121 #define kIOPMRootDomainBatPowerCString      "BatPower"
122 
123 /*
124  * Supported Feature bitfields for IOPMrootDomain::publishFeature()
125  */
126 enum {
127 	kIOPMSupportedOnAC      = (1 << 0),
128 	kIOPMSupportedOnBatt    = (1 << 1),
129 	kIOPMSupportedOnUPS     = (1 << 2)
130 };
131 
132 typedef IOReturn (*IOPMSettingControllerCallback)
133 (OSObject *target, const OSSymbol *type,
134     OSObject *val, uintptr_t refcon);
135 
136 __BEGIN_DECLS
137 IONotifier *    registerSleepWakeInterest(
138 	IOServiceInterestHandler, void *, void * = NULL);
139 
140 IONotifier *    registerPrioritySleepWakeInterest(
141 	IOServiceInterestHandler handler,
142 	void * self, void * ref = NULL);
143 
144 IOReturn        acknowledgeSleepWakeNotification(void * );
145 
146 IOReturn        vetoSleepWakeNotification(void * PMrefcon);
147 __END_DECLS
148 
149 #define IOPM_ROOTDOMAIN_REV        2
150 
151 class IOPMrootDomain : public IOService
152 {
153 	OSDeclareFinalStructors(IOPMrootDomain);
154 
155 public:
156 	static IOPMrootDomain * construct( void );
157 
158 	virtual bool        start( IOService * provider ) APPLE_KEXT_OVERRIDE;
159 	virtual IOReturn    setAggressiveness( unsigned long, unsigned long ) APPLE_KEXT_OVERRIDE;
160 	virtual IOReturn    getAggressiveness( unsigned long, unsigned long * ) APPLE_KEXT_OVERRIDE;
161 
162 	virtual IOReturn    sleepSystem( void );
163 	IOReturn            sleepSystemOptions( OSDictionary *options );
164 
165 	virtual IOReturn    setProperties( OSObject * ) APPLE_KEXT_OVERRIDE;
166 	virtual bool        serializeProperties( OSSerialize * s ) const APPLE_KEXT_OVERRIDE;
167 	virtual OSPtr<OSObject>  copyProperty( const char * aKey ) const APPLE_KEXT_OVERRIDE;
168 
169 /*! @function systemPowerEventOccurred
170  *    @abstract Other drivers may inform IOPMrootDomain of system PM events
171  *    @discussion systemPowerEventOccurred is a richer alternative to receivePowerNotification()
172  *        Only Apple-owned kexts should have reason to call systemPowerEventOccurred.
173  *    @param event An OSSymbol describing the type of power event.
174  *    @param intValue A 32-bit integer value associated with the event.
175  *    @result kIOReturnSuccess on success */
176 
177 	IOReturn            systemPowerEventOccurred(
178 		const OSSymbol *event,
179 		uint32_t intValue );
180 
181 	IOReturn            systemPowerEventOccurred(
182 		const OSSymbol *event,
183 		OSObject *value );
184 
185 #ifdef XNU_KERNEL_PRIVATE   // Hide doc from public headers
186 /*! @function claimSystemWakeEvent
187  *   @abstract   Apple-internal SPI to describe system wake events.
188  *   @discussion IOKit drivers may call claimSystemWakeEvent() during system wakeup to
189  *               provide human readable debug information describing the event(s) that
190  *               caused the system to wake.
191  *
192  *               - Drivers should call claimSystemWakeEvent before completing
193  *                 their setPowerState() acknowledgement. IOPMrootDomain stops
194  *                 collecting wake events when driver wake is complete.
195  *
196  *               - It is only appropriate to claim a wake event when the driver
197  *                 can positively identify its hardware has generated an event
198  *                 that can wake the system.
199  *
200  *               - This call tracks wake events from a non-S0 state (S0i, S3, S4) into S0.
201  *               - This call does not track wake events from DarkWake(S0) to FullWake(S0).
202  *
203  *       Examples:
204  *               (reason  = "WiFi.TCPData",
205  *        details = "TCPKeepAlive packet arrived from IP 16.2.1.1")
206  *               (reason  = "WiFi.ScanOffload",
207  *        details = "WiFi station 'AppleWiFi' signal dropped below threshold")
208  *               (reason  = "Enet.LinkToggle",
209  *        details = "Ethernet attached")
210  *
211  *   @param device   The device/nub that is associated with the wake event.
212  *
213  *   @param flags    Pass kIOPMWakeEventSource if the device is the source
214  *                   of the wake event. Pass zero if the device is forwarding or
215  *                   aggregating wake events from multiple sources, e.g. an USB or
216  *                   Thunderbolt host controller.
217  *
218  *   @param reason   Caller should pass a human readable C string describing the
219  *                   wake reason. Please use a string from the list below, or create
220  *                   your own string matching this format:
221  *                             [Hardware].[Event]
222  *                             WiFi.MagicPacket
223  *                             WiFi.ScanOffload
224  *                             WiFi.mDNSConflict
225  *                             WiFi.mDNSService
226  *                             WiFi.TCPData
227  *                             WiFi.TCPTimeout
228  *                             WiFi.FirmwareCrash
229  *                             Enet.MagicPacket
230  *                             Enet.mDNSConflict
231  *                             Enet.mDNSService
232  *                             Enet.TCPData
233  *                             Enet.TCPTimeout
234  *                             Enet.Service
235  *                             Enet.LinkToggle
236  *                             Enet.ConflictResolution
237  *                             Enet.PatternMatch
238  *                             Enet.Timer
239  *                             Enet.LinkUpTimeout
240  *                             Enet.LinkDown
241  *                             USB.DeviceAttach
242  *                             USB.DeviceDetach
243  *
244  *    @param details Optional details further describing the wake event.
245  *                   Please pass an OSString defining the event.
246  */
247 #endif
248 	void                claimSystemWakeEvent(
249 		IOService     *device,
250 		IOOptionBits  flags,
251 		const char    *reason,
252 		OSObject      *details = NULL );
253 
254 	void                claimSystemBootEvent(
255 		IOService     *device,
256 		IOOptionBits  flags,
257 		const char    *reason,
258 		OSObject      *details = NULL );
259 
260 	void                claimSystemShutdownEvent(
261 		IOService     *device,
262 		IOOptionBits  flags,
263 		const char    *reason,
264 		OSObject      *details = NULL );
265 
266 	virtual IOReturn    receivePowerNotification( UInt32 msg );
267 
268 	virtual void        setSleepSupported( IOOptionBits flags );
269 
270 	virtual IOOptionBits getSleepSupported( void );
271 
272 	void                wakeFromDoze( void );
273 
274 	void                requestUserActive(IOService *driver, const char *reason);
275 
276 // KEXT driver announces support of power management feature
277 
278 	void                publishFeature( const char *feature );
279 
280 // KEXT driver announces support of power management feature
281 // And specifies power sources with kIOPMSupportedOn{AC/Batt/UPS} bitfield.
282 // Returns a unique uint32_t identifier for later removing support for this
283 // feature.
284 // NULL is acceptable for uniqueFeatureID for kexts without plans to unload.
285 
286 	void                publishFeature( const char *feature,
287 	    uint32_t supportedWhere,
288 	    uint32_t *uniqueFeatureID);
289 
290 // KEXT driver announces removal of a previously published power management
291 // feature. Pass 'uniqueFeatureID' returned from publishFeature()
292 
293 	IOReturn            removePublishedFeature( uint32_t removeFeatureID );
294 
295 /*! @function copyPMSetting
296  *   @abstract Copy the current value for a PM setting. Returns an OSNumber or
297  *       OSData depending on the setting.
298  *   @param whichSetting Name of the desired setting.
299  *   @result OSObject value if valid, NULL otherwise. */
300 
301 	OSPtr<OSObject>           copyPMSetting( OSSymbol *whichSetting );
302 
303 /*! @function registerPMSettingController
304  *   @abstract Register for callbacks on changes to certain PM settings.
305  *   @param settings NULL terminated array of C strings, each string for a PM
306  *       setting that the caller is interested in and wants to get callbacks for.
307  *   @param callout C function ptr or member function cast as such.
308  *   @param target The target of the callback, usually 'this'
309  *   @param refcon Will be passed to caller in callback; for caller's use.
310  *   @param handle Caller should keep the OSObject * returned here. If non-NULL,
311  *       handle will have a retain count of 1 on return. To deregister, pass to
312  *       unregisterPMSettingController()
313  *   @result kIOReturnSuccess on success. */
314 
315 	IOReturn            registerPMSettingController(
316 		const OSSymbol *settings[],
317 		IOPMSettingControllerCallback callout,
318 		OSObject   *target,
319 		uintptr_t  refcon,
320 		OSObject   **handle);                     // out param
321 
322 /*! @function registerPMSettingController
323  *   @abstract Register for callbacks on changes to certain PM settings.
324  *   @param settings NULL terminated array of C strings, each string for a PM
325  *       setting that the caller is interested in and wants to get callbacks for.
326  *   @param supportedPowerSources bitfield indicating which power sources these
327  *       settings are supported for (kIOPMSupportedOnAC, etc.)
328  *   @param callout C function ptr or member function cast as such.
329  *   @param target The target of the callback, usually 'this'
330  *   @param refcon Will be passed to caller in callback; for caller's use.
331  *   @param handle Caller should keep the OSObject * returned here. If non-NULL,
332  *       handle will have a retain count of 1 on return. To deregister, pass to
333  *       unregisterPMSettingController()
334  *   @result kIOReturnSuccess on success. */
335 
336 	IOReturn            registerPMSettingController(
337 		const OSSymbol *settings[],
338 		uint32_t   supportedPowerSources,
339 		IOPMSettingControllerCallback callout,
340 		OSObject   *target,
341 		uintptr_t  refcon,
342 		OSObject   **handle);                     // out param
343 
344 	virtual OSPtr<IONotifier> registerInterest(
345 		const OSSymbol * typeOfInterest,
346 		IOServiceInterestHandler handler,
347 		void * target, void * ref = NULL ) APPLE_KEXT_OVERRIDE;
348 
349 	virtual IOReturn    callPlatformFunction(
350 		const OSSymbol *functionName,
351 		bool waitForFunction,
352 		void *param1, void *param2,
353 		void *param3, void *param4 ) APPLE_KEXT_OVERRIDE;
354 
355 /*! @function createPMAssertion
356  *   @abstract Creates an assertion to influence system power behavior.
357  *   @param whichAssertionsBits A bitfield specify the assertion that the caller requests.
358  *   @param assertionLevel An integer detailing the initial assertion level, kIOPMDriverAssertionLevelOn
359  *       or kIOPMDriverAssertionLevelOff.
360  *   @param ownerService A pointer to the caller's IOService class, for tracking.
361  *   @param ownerDescription A reverse-DNS string describing the caller's identity and reason.
362  *   @result On success, returns a new assertion of type IOPMDriverAssertionID
363  */
364 	IOPMDriverAssertionID createPMAssertion(
365 		IOPMDriverAssertionType whichAssertionsBits,
366 		IOPMDriverAssertionLevel assertionLevel,
367 		IOService *ownerService,
368 		const char *ownerDescription);
369 
370 /* @function setPMAssertionLevel
371  *  @abstract Modify the level of a pre-existing assertion.
372  *  @discussion Change the value of a PM assertion to influence system behavior,
373  *   without undergoing the work required to create or destroy an assertion. Suggested
374  *   for clients who will assert and de-assert needs for PM behavior several times over
375  *   their lifespan.
376  *  @param assertionID An assertion ID previously returned by <link>createPMAssertion</link>
377  *  @param assertionLevel The new assertion level.
378  *  @result kIOReturnSuccess if it worked; kIOReturnNotFound or other IOReturn error on failure.
379  */
380 	IOReturn setPMAssertionLevel(IOPMDriverAssertionID assertionID, IOPMDriverAssertionLevel assertionLevel);
381 
382 /*! @function getPMAssertionLevel
383  *   @absract Returns the active level of the specified assertion(s).
384  *   @discussion Returns <link>kIOPMDriverAssertionLevelOff</link> or
385  *       <link>kIOPMDriverAssertionLevelOn</link>. If multiple assertions are specified
386  *       in the bitfield, only returns <link>kIOPMDriverAssertionLevelOn</link>
387  *       if all assertions are active.
388  *   @param whichAssertionBits Bits defining the assertion or assertions the caller is interested in
389  *       the level of. If in doubt, pass <link>kIOPMDriverAssertionCPUBit</link> as the argument.
390  *   @result Returns <link>kIOPMDriverAssertionLevelOff</link> or
391  *       <link>kIOPMDriverAssertionLevelOn</link> indicating the specified assertion's levels, if available.
392  *       If the assertions aren't supported on this machine, or aren't recognized by the OS, the
393  *       result is undefined.
394  */
395 	IOPMDriverAssertionLevel getPMAssertionLevel(IOPMDriverAssertionType whichAssertionBits);
396 
397 /*! @function releasePMAssertion
398  *   @abstract Removes an assertion to influence system power behavior.
399  *   @result On success, returns a new assertion of type IOPMDriverAssertionID *
400  */
401 	IOReturn releasePMAssertion(IOPMDriverAssertionID releaseAssertion);
402 
403 /*! @function restartWithStackshot
404  *   @abstract Take a stackshot of the system and restart the system.
405  *   @result Return kIOReturnSuccess if it work, kIOReturnError if the service is not available.
406  */
407 	IOReturn restartWithStackshot();
408 
409 	IOReturn    setWakeTime(uint64_t wakeContinuousTime);
410 
411 #if XNU_KERNEL_PRIVATE
412 	IOReturn acquireDriverKitMatchingAssertion();
413 	void releaseDriverKitMatchingAssertion();
414 #endif
415 
416 private:
417 	unsigned long getRUN_STATE(void);
418 
419 	virtual IOReturn    changePowerStateTo( unsigned long ordinal ) APPLE_KEXT_COMPATIBILITY_OVERRIDE;
420 	virtual IOReturn    changePowerStateToPriv( unsigned long ordinal );
421 	virtual IOReturn    requestPowerDomainState( IOPMPowerFlags, IOPowerConnection *, unsigned long ) APPLE_KEXT_OVERRIDE;
422 	virtual void        powerChangeDone( unsigned long ) APPLE_KEXT_OVERRIDE;
423 	virtual bool        tellChangeDown( unsigned long ) APPLE_KEXT_OVERRIDE;
424 	virtual bool        askChangeDown( unsigned long ) APPLE_KEXT_OVERRIDE;
425 	virtual void        tellChangeUp( unsigned long ) APPLE_KEXT_OVERRIDE;
426 	virtual void        tellNoChangeDown( unsigned long ) APPLE_KEXT_OVERRIDE;
427 	virtual IOReturn configureReport(IOReportChannelList   *channels,
428 	    IOReportConfigureAction action,
429 	    void                    *result,
430 	    void                    *destination) APPLE_KEXT_OVERRIDE;
431 	virtual IOReturn updateReport(IOReportChannelList      *channels,
432 	    IOReportUpdateAction     action,
433 	    void                     *result,
434 	    void                     *destination) APPLE_KEXT_OVERRIDE;
435 
436 	void             configureReportGated(uint64_t channel_id,
437 	    uint64_t action,
438 	    void     *result);
439 	IOReturn         updateReportGated(uint64_t ch_id,
440 	    void *result,
441 	    IOBufferMemoryDescriptor *dest);
442 
443 #ifdef XNU_KERNEL_PRIVATE
444 /* Root Domain internals */
445 public:
446 	void        tagPowerPlaneService(
447 		IOService *             service,
448 		IOPMActions *           actions,
449 		IOPMPowerStateIndex     maxPowerState );
450 
451 	void        overrideOurPowerChange(
452 		IOService *             service,
453 		IOPMActions *           actions,
454 		const IOPMRequest *     request,
455 		IOPMPowerStateIndex *   inOutPowerState,
456 		IOPMPowerChangeFlags *  inOutChangeFlags );
457 
458 	void        handleOurPowerChangeStart(
459 		IOService *             service,
460 		IOPMActions *           actions,
461 		const IOPMRequest *     request,
462 		IOPMPowerStateIndex     powerState,
463 		IOPMPowerChangeFlags *  inOutChangeFlags );
464 
465 	void        handleOurPowerChangeDone(
466 		IOService *             service,
467 		IOPMActions *           actions,
468 		const IOPMRequest *     request,
469 		IOPMPowerStateIndex     powerState,
470 		IOPMPowerChangeFlags    changeFlags );
471 
472 	void        overridePowerChangeForService(
473 		IOService *             service,
474 		IOPMActions *           actions,
475 		const IOPMRequest *     request,
476 		IOPMPowerStateIndex *   inOutPowerState,
477 		IOPMPowerChangeFlags *  inOutChangeFlags );
478 
479 	void        handleActivityTickleForDisplayWrangler(
480 		IOService *             service,
481 		IOPMActions *           actions );
482 
483 	void        handleUpdatePowerClientForDisplayWrangler(
484 		IOService *             service,
485 		IOPMActions *           actions,
486 		const OSSymbol *        powerClient,
487 		IOPMPowerStateIndex     oldPowerState,
488 		IOPMPowerStateIndex     newPowerState );
489 
490 	bool        shouldDelayChildNotification(
491 		IOService *     service );
492 
493 	void        handlePowerChangeStartForPCIDevice(
494 		IOService *             service,
495 		IOPMActions *           actions,
496 		const IOPMRequest *     request,
497 		IOPMPowerStateIndex     powerState,
498 		IOPMPowerChangeFlags *  inOutChangeFlags );
499 
500 	void        handlePowerChangeDoneForPCIDevice(
501 		IOService *             service,
502 		IOPMActions *           actions,
503 		const IOPMRequest *     request,
504 		IOPMPowerStateIndex     powerState,
505 		IOPMPowerChangeFlags    changeFlags );
506 
507 	void        askChangeDownDone(
508 		IOPMPowerChangeFlags * inOutChangeFlags,
509 		bool * cancel );
510 
511 	void        handlePublishSleepWakeUUID(
512 		bool shouldPublish);
513 
514 	void        handleQueueSleepWakeUUID(
515 		OSObject *obj);
516 
517 	void        willTellSystemCapabilityDidChange(void);
518 
519 	void        handleSetDisplayPowerOn(bool powerOn);
520 
521 	void        willNotifyPowerChildren( IOPMPowerStateIndex newPowerState );
522 
523 	IOReturn    setMaintenanceWakeCalendar(
524 		const IOPMCalendarStruct * calendar );
525 
526 	IOReturn    getSystemSleepType(uint32_t * sleepType, uint32_t * standbyTimer);
527 
528 // Handle callbacks from IOService::systemWillShutdown()
529 	void        acknowledgeSystemWillShutdown( IOService * from );
530 
531 // Handle platform halt and restart notifications
532 	void        handlePlatformHaltRestart( UInt32 pe_type );
533 
534 	IOReturn    shutdownSystem( void );
535 	IOReturn    restartSystem( void );
536 	void        handleSleepTimerExpiration( void );
537 
538 	bool        activitySinceSleep(void);
539 	bool        abortHibernation(void);
540 	void        updateConsoleUsers(void);
541 
542 	IOReturn    joinAggressiveness( IOService * service );
543 	void        handleAggressivesRequests( void );
544 
545 	void        kdebugTrace(uint32_t event, uint64_t regId,
546 	    uintptr_t param1, uintptr_t param2, uintptr_t param3 = 0);
547 	void        tracePoint(uint8_t point);
548 	void        traceDetail(uint32_t msgType, uint32_t msgIndex, uint32_t delay);
549 	void        traceNotification(OSObject *notifier, bool start, uint64_t ts = 0, uint32_t msgIndex = UINT_MAX);
550 	void        traceNotificationAck(OSObject *notifier, uint32_t delay_ms);
551 	void        traceNotificationResponse(OSObject *object, uint32_t delay_ms, uint32_t ack_time_us);
552 	void        traceFilteredNotification(OSObject *notifier);
553 	const char * getNotificationClientName(OSObject *notifier);
554 
555 	void        startSpinDump(uint32_t spindumpKind);
556 
557 	bool        systemMessageFilter(
558 		void * object, void * arg1, void * arg2, void * arg3 );
559 
560 	bool        updatePreventIdleSleepList(
561 		IOService * service, bool addNotRemove );
562 	void        updatePreventSystemSleepList(
563 		IOService * service, bool addNotRemove );
564 
565 	bool        updatePreventIdleSleepListInternal(
566 		IOService * service, bool addNotRemove, unsigned int oldCount);
567 	unsigned int idleSleepPreventersCount();
568 
569 	void        publishPMSetting(
570 		const OSSymbol * feature, uint32_t where, uint32_t * featureID );
571 
572 	void        pmStatsRecordEvent(
573 		int             eventIndex,
574 		AbsoluteTime    timestamp);
575 
576 	void        pmStatsRecordApplicationResponse(
577 		const OSSymbol      *response,
578 		const char          *name,
579 		int                 messageType,
580 		uint32_t            delay_ms,
581 		uint64_t            id,
582 		OSObject            *object,
583 		IOPMPowerStateIndex ps = 0,
584 		bool                async = false);
585 
586 	void        copyWakeReasonString( char * outBuf, size_t bufSize );
587 	void        copyShutdownReasonString( char * outBuf, size_t bufSize );
588 	void        lowLatencyAudioNotify(uint64_t time, boolean_t state);
589 
590 #if HIBERNATION
591 	bool        getHibernateSettings(
592 		uint32_t *  hibernateMode,
593 		uint32_t *  hibernateFreeRatio,
594 		uint32_t *  hibernateFreeTime );
595 	bool        mustHibernate( void );
596 #endif
597 	void        takeStackshot(bool restart);
598 	void        sleepWakeDebugTrig(bool restart);
599 	void        sleepWakeDebugEnableWdog();
600 	bool        sleepWakeDebugIsWdogEnabled();
601 	void        sleepWakeDebugSaveSpinDumpFile();
602 	bool        checkShutdownTimeout();
603 	void        panicWithShutdownLog(uint32_t timeoutInMs) __abortlike;
604 	uint32_t    getWatchdogTimeout();
605 	void        deleteStackshot();
606 
607 private:
608 	friend class PMSettingObject;
609 	friend class RootDomainUserClient;
610 	friend class PMAssertionsTracker;
611 
612 	static IOReturn sysPowerDownHandler( void * target, void * refCon,
613 	    UInt32 messageType, IOService * service,
614 	    void * messageArgument, vm_size_t argSize );
615 
616 	static IOReturn displayWranglerNotification( void * target, void * refCon,
617 	    UInt32 messageType, IOService * service,
618 	    void * messageArgument, vm_size_t argSize );
619 
620 	static IOReturn rootBusyStateChangeHandler( void * target, void * refCon,
621 	    UInt32 messageType, IOService * service,
622 	    void * messageArgument, vm_size_t argSize );
623 
624 	void initializeBootSessionUUID( void );
625 
626 	void fullWakeDelayedWork( void );
627 
628 	OSPtr<IOService>        wrangler;
629 	OSPtr<OSDictionary>     wranglerIdleSettings;
630 
631 	IOLock                  *featuresDictLock;// guards supportedFeatures
632 	IOLock                  *wakeEventLock;
633 	IOPMPowerStateQueue     *pmPowerStateQueue;
634 
635 	OSPtr<OSArray>           allowedPMSettings;
636 	OSPtr<OSArray>           noPublishPMSettings;
637 	OSPtr<PMTraceWorker>     pmTracer;
638 	PMAssertionsTracker     *pmAssertions;
639 
640 // Settings controller info
641 	IOLock                  *settingsCtrlLock;
642 	OSPtr<OSDictionary>      settingsCallbacks;
643 	OSPtr<OSDictionary>      fPMSettingsDict;
644 
645 // Statistics
646 	OSPtr<const OSSymbol>   _statsNameKey;
647 	OSPtr<const OSSymbol>   _statsPIDKey;
648 	OSPtr<const OSSymbol>   _statsTimeMSKey;
649 	OSPtr<const OSSymbol>   _statsResponseTypeKey;
650 	OSPtr<const OSSymbol>   _statsMessageTypeKey;
651 	OSPtr<const OSSymbol>   _statsPowerCapsKey;
652 	uint32_t                sleepCnt;
653 	uint32_t                darkWakeCnt;
654 	uint32_t                displayWakeCnt;
655 
656 	OSPtr<OSString>         queuedSleepWakeUUIDString;
657 	OSPtr<OSArray>          pmStatsAppResponses;
658 	IOLock                  *pmStatsLock;// guards pmStatsAppResponses
659 
660 	void                    *sleepDelaysReport; // report to track time taken to go to sleep
661 	uint32_t                sleepDelaysClientCnt;// Number of interested clients in sleepDelaysReport
662 	uint64_t                ts_sleepStart;
663 	uint64_t                wake2DarkwakeDelay;  // Time taken to change from full wake -> Dark wake
664 
665 	void                    *assertOnWakeReport;// report to track time spent without any assertions held after wake
666 	uint32_t                assertOnWakeClientCnt;// Number of clients interested in assertOnWakeReport
667 	clock_sec_t             assertOnWakeSecs;   // Num of secs after wake for first assertion
668 
669 	bool                    uuidPublished;
670 
671 // Pref: idle time before idle sleep
672 	bool                    idleSleepEnabled;
673 	uint32_t                sleepSlider;
674 	uint32_t                idleMilliSeconds;
675 
676 // Difference between sleepSlider and longestNonSleepSlider
677 	uint32_t                extraSleepDelay;
678 
679 // Used to wait between say display idle and system idle
680 	thread_call_t           extraSleepTimer;
681 	thread_call_t           powerButtonDown;
682 	thread_call_t           powerButtonUp;
683 	thread_call_t           diskSyncCalloutEntry;
684 	thread_call_t           fullWakeThreadCall;
685 	thread_call_t           updateConsoleUsersEntry;
686 
687 // Track system capabilities.
688 	uint32_t                _desiredCapability;
689 	uint32_t                _currentCapability;
690 	uint32_t                _pendingCapability;
691 	uint32_t                _highestCapability;
692 	OSPtr<OSSet>            _joinedCapabilityClients;
693 	uint32_t                _systemStateGeneration;
694 
695 // Type of clients that can receive system messages.
696 	enum {
697 		kSystemMessageClientPowerd    = 0x01,
698 		kSystemMessageClientLegacyApp = 0x02,
699 		kSystemMessageClientKernel    = 0x04,
700 		kSystemMessageClientAll       = 0x07
701 	};
702 	uint32_t                _systemMessageClientMask;
703 
704 // Power state and capability change transitions.
705 	enum {
706 		kSystemTransitionNone         = 0,
707 		kSystemTransitionSleep        = 1,
708 		kSystemTransitionWake         = 2,
709 		kSystemTransitionCapability   = 3,
710 		kSystemTransitionNewCapClient = 4
711 	}                       _systemTransitionType;
712 
713 	unsigned int            systemBooting           :1;
714 	unsigned int            systemShutdown          :1;
715 	unsigned int            systemDarkWake          :1;
716 	unsigned int            clamshellExists         :1;
717 	unsigned int            clamshellClosed         :1;
718 	unsigned int            clamshellDisabled       :1;
719 	unsigned int            desktopMode             :1;
720 	unsigned int            acAdaptorConnected      :1;
721 
722 	unsigned int            clamshellIgnoreClose    :1;
723 	unsigned int            idleSleepTimerPending   :1;
724 	unsigned int            userDisabledAllSleep    :1;
725 	unsigned int            ignoreTellChangeDown    :1;
726 	unsigned int            wranglerAsleep          :1;
727 	unsigned int            darkWakeExit            :1;
728 	unsigned int            _preventUserActive      :1;
729 	unsigned int            darkWakePowerClamped    :1;
730 
731 	unsigned int            capabilityLoss          :1;
732 	unsigned int            pciCantSleepFlag        :1;
733 	unsigned int            pciCantSleepValid       :1;
734 	unsigned int            darkWakeLogClamp        :1;
735 	unsigned int            darkWakeToSleepASAP     :1;
736 	unsigned int            darkWakeMaintenance     :1;
737 	unsigned int            darkWakeSleepService    :1;
738 	unsigned int            darkWakePostTickle      :1;
739 
740 	unsigned int            sleepTimerMaintenance   :1;
741 	unsigned int            sleepToStandby          :1;
742 	unsigned int            lowBatteryCondition     :1;
743 	unsigned int            hibernateDisabled       :1;
744 	unsigned int            hibernateRetry          :1;
745 	unsigned int            wranglerTickled         :1;
746 	unsigned int            userIsActive            :1;
747 	unsigned int            userWasActive           :1;
748 
749 	unsigned int            displayIdleForDemandSleep :1;
750 	unsigned int            darkWakeHibernateError  :1;
751 	unsigned int            thermalWarningState     :1;
752 	unsigned int            toldPowerdCapWillChange :1;
753 	unsigned int            displayPowerOnRequested :1;
754 	unsigned int            isRTCAlarmWake          :1;
755 	unsigned int            wranglerPowerOff        :1;
756 	unsigned int            thermalEmergencyState   :1;
757 
758 	uint8_t                 tasksSuspended;
759 	uint8_t                 tasksSuspendState;
760 	uint32_t                hibernateMode;
761 	AbsoluteTime            userActivityTime;
762 	AbsoluteTime            userActivityTime_prev;
763 	uint32_t                userActivityCount;
764 	uint32_t                userActivityAtSleep;
765 	uint32_t                lastSleepReason;
766 	uint32_t                fullToDarkReason;
767 	uint32_t                hibernateAborted;
768 	uint8_t                 standbyNixed;
769 	uint8_t                 resetTimers;
770 
771 	enum FullWakeReason {
772 		kFullWakeReasonNone = 0,
773 		kFullWakeReasonLocalUser = 1,
774 		kFullWakeReasonDisplayOn = 2,
775 		fFullWakeReasonDisplayOnAndLocalUser = 3
776 	};
777 	uint32_t                fullWakeReason;
778 
779 	enum {
780 		kClamshellSleepDisableInternal = 0x01,
781 		kClamshellSleepDisablePowerd   = 0x02
782 	};
783 	uint32_t                clamshellSleepDisableMask;
784 
785 // Info for communicating system state changes to PMCPU
786 	int32_t                 idxPMCPUClamshell;
787 	int32_t                 idxPMCPULimitedPower;
788 
789 	IOOptionBits            platformSleepSupport;
790 	uint32_t                _debugWakeSeconds;
791 
792 	queue_head_t            aggressivesQueue;
793 	thread_call_t           aggressivesThreadCall;
794 	OSPtr<OSData>                aggressivesData;
795 
796 	AbsoluteTime            userBecameInactiveTime;
797 
798 // PCI top-level PM trace
799 	OSPtr<IOService>        pciHostBridgeDevice;
800 	OSPtr<IOService>        pciHostBridgeDriver;
801 
802 	OSPtr<IONotifier>       systemCapabilityNotifier;
803 
804 	typedef struct {
805 		uint32_t            pid;
806 		uint32_t            refcount;
807 	} PMNotifySuspendedStruct;
808 
809 	uint32_t                pmSuspendedCapacity;
810 	uint32_t                pmSuspendedSize;
811 	PMNotifySuspendedStruct *pmSuspendedPIDS;
812 
813 	OSPtr<OSSet>            preventIdleSleepList;
814 	OSPtr<OSSet>            preventSystemSleepList;
815 
816 	OSPtr<const OSSymbol>   _nextScheduledAlarmType;
817 	clock_sec_t             _nextScheduledAlarmUTC;
818 	clock_sec_t             _calendarWakeAlarmUTC;
819 	UInt32                  _scheduledAlarmMask;
820 	UInt32                  _userScheduledAlarmMask;
821 
822 #if HIBERNATION
823 	clock_sec_t             _standbyTimerResetSeconds;
824 #endif
825 	volatile uint32_t   swd_lock;/* Lock to access swd_buffer & and its header */
826 	void  *             swd_buffer;/* Memory allocated for dumping sleep/wake logs */
827 	uint32_t            swd_flags;/* Flags defined in IOPMPrivate.h */
828 	void *              swd_compressed_buffer;
829 	void  *             swd_spindump_buffer;
830 	thread_t            notifierThread;
831 	OSPtr<OSObject>     notifierObject;
832 
833 	OSPtr<IOBufferMemoryDescriptor>    swd_spindump_memDesc;
834 	OSPtr<IOBufferMemoryDescriptor>    swd_memDesc;
835 
836 // Wake Event Reporting
837 	OSPtr<OSArray>       _systemWakeEventsArray;
838 	bool                 _acceptSystemWakeEvents;
839 
840 	// AOT --
841 	IOPMCalendarStruct   _aotWakeTimeCalendar;
842 	OSPtr<IOTimerEventSource> _aotTimerES;
843 	clock_sec_t          _aotWakeTimeUTC;
844 	uint64_t             _aotTestTime;
845 	uint64_t             _aotTestInterval;
846 	uint32_t             _aotPendingFlags;
847 public:
848 	IOPMAOTMetrics     * _aotMetrics;
849 	uint8_t              _aotMode;
850 private:
851 	uint8_t              _aotNow;
852 	uint8_t              _aotTasksSuspended;
853 	uint8_t              _aotTimerScheduled;
854 	uint8_t              _aotReadyToFullWake;
855 	uint64_t             _aotLastWakeTime;
856 	uint64_t             _aotWakeTimeContinuous;
857 	uint64_t             _aotWakePreWindow;
858 	uint64_t             _aotWakePostWindow;
859 	uint64_t             _aotLingerTime;
860 
861 	size_t               _driverKitMatchingAssertionCount;
862 	IOPMDriverAssertionID _driverKitMatchingAssertion;
863 
864 	bool        aotShouldExit(bool checkTimeSet, bool software);
865 	void        aotExit(bool cps);
866 	void        aotEvaluate(IOTimerEventSource * timer);
867 public:
868 	bool        isAOTMode(void);
869 private:
870 	// -- AOT
871 	enum {
872 		kTasksSuspendUnsuspended = 0,
873 		kTasksSuspendSuspended   = 1,
874 		kTasksSuspendNoChange    = -1,
875 	};
876 	bool        updateTasksSuspend(int newTasksSuspended, int newAOTTasksSuspended);
877 	int         findSuspendedPID(uint32_t pid, uint32_t *outRefCount);
878 
879 // IOPMrootDomain internal sleep call
880 	IOReturn    privateSleepSystem( uint32_t sleepReason );
881 	void        reportUserInput( void );
882 	void        updateUserActivity( void );
883 	void        setDisableClamShellSleep( bool );
884 	void        setClamShellSleepDisable(bool disable, uint32_t bitmask);
885 	bool        checkSystemSleepAllowed( IOOptionBits options,
886 	    uint32_t sleepReason );
887 	bool        checkSystemSleepEnabled( void );
888 	bool        checkSystemCanSleep( uint32_t sleepReason );
889 	bool        checkSystemCanSustainFullWake( void );
890 
891 	void        adjustPowerState( bool sleepASAP = false );
892 	void        setQuickSpinDownTimeout( void );
893 	void        restoreUserSpinDownTimeout( void );
894 
895 	bool        shouldSleepOnClamshellClosed(void );
896 	bool        shouldSleepOnRTCAlarmWake(void );
897 	void        sendClientClamshellNotification( void );
898 
899 // Inform PMCPU of changes to state like lid, AC vs. battery
900 	void        informCPUStateChange( uint32_t type, uint32_t value );
901 
902 	void        dispatchPowerEvent( uint32_t event, void * arg0, uint64_t arg1 );
903 	void        handlePowerNotification( UInt32 msg );
904 
905 	IOReturn    setPMSetting(const OSSymbol *, OSObject *);
906 
907 	void        startIdleSleepTimer( uint32_t inMilliSeconds );
908 	void        cancelIdleSleepTimer( void );
909 	uint32_t    getTimeToIdleSleep( void );
910 
911 	IOReturn    setAggressiveness(
912 		unsigned long type,
913 		unsigned long value,
914 		IOOptionBits  options );
915 
916 	void        synchronizeAggressives(
917 		queue_head_t * services,
918 		const AggressivesRecord * array,
919 		int count );
920 
921 	void        broadcastAggressives(
922 		const AggressivesRecord * array,
923 		int count );
924 
925 	IOReturn    setPMAssertionUserLevels(IOPMDriverAssertionType);
926 
927 	void        publishSleepWakeUUID( bool shouldPublish );
928 
929 	void        evaluatePolicy( int stimulus, uint32_t arg = 0 );
930 	void        requestFullWake( FullWakeReason reason );
931 	void        willEnterFullWake( void );
932 
933 	void        evaluateAssertions(IOPMDriverAssertionType newAssertions,
934 	    IOPMDriverAssertionType oldAssertions);
935 
936 	void        deregisterPMSettingObject( PMSettingObject * pmso );
937 
938 	uint32_t    checkForValidDebugData(const char *fname, vfs_context_t *ctx,
939 	    void *tmpBuf, struct vnode **vp);
940 	void        getFailureData(thread_t *thread, char *failureStr, size_t strLen);
941 	void        saveFailureData2File();
942 	void        tracePhase2String(uint32_t tracePhase, const char **phaseString, const char **description);
943 	void        sleepWakeDebugMemAlloc();
944 	void        sleepWakeDebugSpinDumpMemAlloc();
945 	errno_t     sleepWakeDebugSaveFile(const char *name, char *buf, int len);
946 
947 	IOReturn    changePowerStateWithOverrideTo( IOPMPowerStateIndex ordinal, IOPMRequestTag tag );
948 	IOReturn    changePowerStateWithTagToPriv( IOPMPowerStateIndex ordinal, IOPMRequestTag tag );
949 	IOReturn    changePowerStateWithTagTo( IOPMPowerStateIndex ordinal, IOPMRequestTag tag );
950 
951 #if HIBERNATION
952 	bool        getSleepOption( const char * key, uint32_t * option );
953 	bool        evaluateSystemSleepPolicy( IOPMSystemSleepParameters * p,
954 	    int phase, uint32_t * hibMode );
955 	void        evaluateSystemSleepPolicyEarly( void );
956 	void        evaluateSystemSleepPolicyFinal( void );
957 #endif /* HIBERNATION */
958 
959 	bool        latchDisplayWranglerTickle( bool latch );
960 	void        setDisplayPowerOn( uint32_t options );
961 
962 	void        acceptSystemWakeEvents( uint32_t control );
963 	void        systemDidNotSleep( void );
964 	void        preventTransitionToUserActive( bool prevent );
965 	void        setThermalState(OSObject *value);
966 	void        copySleepPreventersList(OSArray  **idleSleepList, OSArray  **systemSleepList);
967 	void        copySleepPreventersListWithID(OSArray  **idleSleepList, OSArray  **systemSleepList);
968 	void        recordRTCAlarm(const OSSymbol *type, OSObject *object);
969 
970 	// Used to inform interested clients about low latency audio activity in the system
971 	OSPtr<OSDictionary>   lowLatencyAudioNotifierDict;
972 	OSPtr<OSNumber>       lowLatencyAudioNotifyStateVal;
973 	OSPtr<OSNumber>       lowLatencyAudioNotifyTimestampVal;
974 	OSPtr<const OSSymbol> lowLatencyAudioNotifyStateSym;
975 	OSPtr<const OSSymbol> lowLatencyAudioNotifyTimestampSym;
976 #endif /* XNU_KERNEL_PRIVATE */
977 };
978 
979 #ifdef XNU_KERNEL_PRIVATE
980 class IORootParent : public IOService
981 {
982 	OSDeclareFinalStructors(IORootParent);
983 
984 public:
985 	static void initialize( void );
986 	virtual OSPtr<OSObject> copyProperty( const char * aKey ) const APPLE_KEXT_OVERRIDE;
987 	bool start( IOService * nub ) APPLE_KEXT_OVERRIDE;
988 	void shutDownSystem( void );
989 	void restartSystem( void );
990 	void sleepSystem( void );
991 	void dozeSystem( void );
992 	void sleepToDoze( void );
993 	void wakeSystem( void );
994 };
995 #endif /* XNU_KERNEL_PRIVATE */
996 
997 #endif /* _IOKIT_ROOTDOMAIN_H */
998