X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/eb6b6ca394357805f2bdba989abae309f718b4d8..f427ee49d309d8fc33ebf3042c3a775f2f530ded:/iokit/IOKit/pwr_mgt/RootDomain.h diff --git a/iokit/IOKit/pwr_mgt/RootDomain.h b/iokit/IOKit/pwr_mgt/RootDomain.h index 22e38474e..79210790e 100644 --- a/iokit/IOKit/pwr_mgt/RootDomain.h +++ b/iokit/IOKit/pwr_mgt/RootDomain.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2019 Apple Inc. All rights reserved. + * Copyright (c) 1998-2020 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -28,6 +28,7 @@ #ifndef _IOKIT_ROOTDOMAIN_H #define _IOKIT_ROOTDOMAIN_H +#include #include #include #include @@ -163,7 +164,7 @@ public: virtual IOReturn setProperties( OSObject * ) APPLE_KEXT_OVERRIDE; virtual bool serializeProperties( OSSerialize * s ) const APPLE_KEXT_OVERRIDE; - virtual OSObject * copyProperty( const char * aKey ) const APPLE_KEXT_OVERRIDE; + virtual OSPtr copyProperty( const char * aKey ) const APPLE_KEXT_OVERRIDE; /*! @function systemPowerEventOccurred * @abstract Other drivers may inform IOPMrootDomain of system PM events @@ -244,10 +245,23 @@ public: * Please pass an OSString defining the event. */ #endif - void claimSystemWakeEvent( IOService *device, - IOOptionBits flags, - const char *reason, - OSObject *details = NULL ); + void claimSystemWakeEvent( + IOService *device, + IOOptionBits flags, + const char *reason, + OSObject *details = NULL ); + + void claimSystemBootEvent( + IOService *device, + IOOptionBits flags, + const char *reason, + OSObject *details = NULL ); + + void claimSystemShutdownEvent( + IOService *device, + IOOptionBits flags, + const char *reason, + OSObject *details = NULL ); virtual IOReturn receivePowerNotification( UInt32 msg ); @@ -257,6 +271,8 @@ public: void wakeFromDoze( void ); + void requestUserActive(IOService *driver, const char *reason); + // KEXT driver announces support of power management feature void publishFeature( const char *feature ); @@ -282,7 +298,7 @@ public: * @param whichSetting Name of the desired setting. * @result OSObject value if valid, NULL otherwise. */ - OSObject * copyPMSetting( OSSymbol *whichSetting ); + OSPtr copyPMSetting( OSSymbol *whichSetting ); /*! @function registerPMSettingController * @abstract Register for callbacks on changes to certain PM settings. @@ -325,7 +341,7 @@ public: uintptr_t refcon, OSObject **handle); // out param - virtual IONotifier * registerInterest( + virtual OSPtr registerInterest( const OSSymbol * typeOfInterest, IOServiceInterestHandler handler, void * target, void * ref = NULL ) APPLE_KEXT_OVERRIDE; @@ -423,33 +439,35 @@ private: /* Root Domain internals */ public: void tagPowerPlaneService( - IOService * service, - IOPMActions * actions ); + IOService * service, + IOPMActions * actions, + IOPMPowerStateIndex maxPowerState ); void overrideOurPowerChange( IOService * service, IOPMActions * actions, + const IOPMRequest * request, IOPMPowerStateIndex * inOutPowerState, - IOPMPowerChangeFlags * inOutChangeFlags, - IOPMRequestTag requestTag ); + IOPMPowerChangeFlags * inOutChangeFlags ); void handleOurPowerChangeStart( IOService * service, IOPMActions * actions, + const IOPMRequest * request, IOPMPowerStateIndex powerState, - IOPMPowerChangeFlags * inOutChangeFlags, - IOPMRequestTag requestTag ); + IOPMPowerChangeFlags * inOutChangeFlags ); void handleOurPowerChangeDone( IOService * service, IOPMActions * actions, + const IOPMRequest * request, IOPMPowerStateIndex powerState, - IOPMPowerChangeFlags changeFlags, - IOPMRequestTag requestTag ); + IOPMPowerChangeFlags changeFlags ); - void overridePowerChangeForUIService( + void overridePowerChangeForService( IOService * service, IOPMActions * actions, + const IOPMRequest * request, IOPMPowerStateIndex * inOutPowerState, IOPMPowerChangeFlags * inOutChangeFlags ); @@ -470,12 +488,14 @@ public: void handlePowerChangeStartForPCIDevice( IOService * service, IOPMActions * actions, + const IOPMRequest * request, IOPMPowerStateIndex powerState, IOPMPowerChangeFlags * inOutChangeFlags ); void handlePowerChangeDoneForPCIDevice( IOService * service, IOPMActions * actions, + const IOPMRequest * request, IOPMPowerStateIndex powerState, IOPMPowerChangeFlags changeFlags ); @@ -489,7 +509,9 @@ public: void handleQueueSleepWakeUUID( OSObject *obj); - void handleDisplayPowerOn(); + void willTellSystemCapabilityDidChange(void); + + void handleSetDisplayPowerOn(bool powerOn); void willNotifyPowerChildren( IOPMPowerStateIndex newPowerState ); @@ -519,8 +541,11 @@ public: uintptr_t param1, uintptr_t param2, uintptr_t param3 = 0); void tracePoint(uint8_t point); void traceDetail(uint32_t msgType, uint32_t msgIndex, uint32_t delay); - void traceDetail(OSObject *notifier, bool start); - void traceAckDelay(OSObject *notifier, uint32_t response, uint32_t delay_ms); + void traceNotification(OSObject *notifier, bool start, uint64_t ts = 0, uint32_t msgIndex = UINT_MAX); + void traceNotificationAck(OSObject *notifier, uint32_t delay_ms); + void traceNotificationResponse(OSObject *object, uint32_t delay_ms, uint32_t ack_time_us); + void traceFilteredNotification(OSObject *notifier); + const char * getNotificationClientName(OSObject *notifier); void startSpinDump(uint32_t spindumpKind); @@ -550,9 +575,12 @@ public: uint32_t delay_ms, uint64_t id, OSObject *object, - IOPMPowerStateIndex ps = 0); + IOPMPowerStateIndex ps = 0, + bool async = false); void copyWakeReasonString( char * outBuf, size_t bufSize ); + void copyShutdownReasonString( char * outBuf, size_t bufSize ); + void lowLatencyAudioNotify(uint64_t time, boolean_t state); #if HIBERNATION bool getHibernateSettings( @@ -588,51 +616,40 @@ private: UInt32 messageType, IOService * service, void * messageArgument, vm_size_t argSize ); - static bool displayWranglerMatchPublished( void * target, void * refCon, - IOService * newService, - IONotifier * notifier); - - static bool batteryPublished( void * target, void * refCon, - IOService * resourceService, - IONotifier * notifier); - void initializeBootSessionUUID( void ); void fullWakeDelayedWork( void ); - IOService * wrangler; - OSDictionary * wranglerIdleSettings; + OSPtr wrangler; + OSPtr wranglerIdleSettings; IOLock *featuresDictLock;// guards supportedFeatures IOLock *wakeEventLock; IOPMPowerStateQueue *pmPowerStateQueue; - OSArray *allowedPMSettings; - OSArray *noPublishPMSettings; - PMTraceWorker *pmTracer; + OSPtr allowedPMSettings; + OSPtr noPublishPMSettings; + OSPtr pmTracer; PMAssertionsTracker *pmAssertions; // Settings controller info IOLock *settingsCtrlLock; - OSDictionary *settingsCallbacks; - OSDictionary *fPMSettingsDict; - - IONotifier *_batteryPublishNotifier; - IONotifier *_displayWranglerNotifier; + OSPtr settingsCallbacks; + OSPtr fPMSettingsDict; // Statistics - const OSSymbol *_statsNameKey; - const OSSymbol *_statsPIDKey; - const OSSymbol *_statsTimeMSKey; - const OSSymbol *_statsResponseTypeKey; - const OSSymbol *_statsMessageTypeKey; - const OSSymbol *_statsPowerCapsKey; + OSPtr _statsNameKey; + OSPtr _statsPIDKey; + OSPtr _statsTimeMSKey; + OSPtr _statsResponseTypeKey; + OSPtr _statsMessageTypeKey; + OSPtr _statsPowerCapsKey; uint32_t sleepCnt; uint32_t darkWakeCnt; uint32_t displayWakeCnt; - OSString *queuedSleepWakeUUIDString; - OSArray *pmStatsAppResponses; + OSPtr queuedSleepWakeUUIDString; + OSPtr pmStatsAppResponses; IOLock *pmStatsLock;// guards pmStatsAppResponses void *sleepDelaysReport; // report to track time taken to go to sleep @@ -640,7 +657,6 @@ private: uint64_t ts_sleepStart; uint64_t wake2DarkwakeDelay; // Time taken to change from full wake -> Dark wake - void *assertOnWakeReport;// report to track time spent without any assertions held after wake uint32_t assertOnWakeClientCnt;// Number of clients interested in assertOnWakeReport clock_sec_t assertOnWakeSecs; // Num of secs after wake for first assertion @@ -649,13 +665,11 @@ private: // Pref: idle time before idle sleep bool idleSleepEnabled; - unsigned long sleepSlider; - unsigned long idleSeconds; - uint64_t autoWakeStart; - uint64_t autoWakeEnd; + uint32_t sleepSlider; + uint32_t idleSeconds; // Difference between sleepSlider and longestNonSleepSlider - unsigned long extraSleepDelay; + uint32_t extraSleepDelay; // Used to wait between say display idle and system idle thread_call_t extraSleepTimer; @@ -670,7 +684,7 @@ private: uint32_t _currentCapability; uint32_t _pendingCapability; uint32_t _highestCapability; - OSSet * _joinedCapabilityClients; + OSPtr _joinedCapabilityClients; uint32_t _systemStateGeneration; // Type of clients that can receive system messages. @@ -700,20 +714,19 @@ private: unsigned int desktopMode :1; unsigned int acAdaptorConnected :1; - unsigned int clamshellSleepDisabled :1; + unsigned int clamshellIgnoreClose :1; unsigned int idleSleepTimerPending :1; unsigned int userDisabledAllSleep :1; unsigned int ignoreTellChangeDown :1; unsigned int wranglerAsleep :1; - unsigned int wranglerTickled :1; + unsigned int darkWakeExit :1; unsigned int _preventUserActive :1; - unsigned int graphicsSuppressed :1; - unsigned int isRTCAlarmWake :1; + unsigned int darkWakePowerClamped :1; unsigned int capabilityLoss :1; unsigned int pciCantSleepFlag :1; unsigned int pciCantSleepValid :1; - unsigned int logGraphicsClamp :1; + unsigned int darkWakeLogClamp :1; unsigned int darkWakeToSleepASAP :1; unsigned int darkWakeMaintenance :1; unsigned int darkWakeSleepService :1; @@ -724,15 +737,18 @@ private: unsigned int lowBatteryCondition :1; unsigned int hibernateDisabled :1; unsigned int hibernateRetry :1; - unsigned int wranglerTickleLatched :1; + unsigned int wranglerTickled :1; unsigned int userIsActive :1; unsigned int userWasActive :1; unsigned int displayIdleForDemandSleep :1; unsigned int darkWakeHibernateError :1; - unsigned int thermalWarningState:1; + unsigned int thermalWarningState :1; unsigned int toldPowerdCapWillChange :1; - unsigned int displayPowerOnRequested:1; + unsigned int displayPowerOnRequested :1; + unsigned int isRTCAlarmWake :1; + unsigned int wranglerPowerOff :1; + unsigned int thermalEmergencyState :1; uint8_t tasksSuspended; uint8_t tasksSuspendState; @@ -755,25 +771,30 @@ private: }; uint32_t fullWakeReason; + enum { + kClamshellSleepDisableInternal = 0x01, + kClamshellSleepDisablePowerd = 0x02 + }; + uint32_t clamshellSleepDisableMask; + // Info for communicating system state changes to PMCPU int32_t idxPMCPUClamshell; int32_t idxPMCPULimitedPower; IOOptionBits platformSleepSupport; uint32_t _debugWakeSeconds; - uint32_t _lastDebugWakeSeconds; queue_head_t aggressivesQueue; thread_call_t aggressivesThreadCall; - OSData * aggressivesData; + OSPtr aggressivesData; AbsoluteTime userBecameInactiveTime; // PCI top-level PM trace - IOService * pciHostBridgeDevice; - IOService * pciHostBridgeDriver; + OSPtr pciHostBridgeDevice; + OSPtr pciHostBridgeDriver; - IONotifier * systemCapabilityNotifier; + OSPtr systemCapabilityNotifier; typedef struct { uint32_t pid; @@ -784,12 +805,14 @@ private: uint32_t pmSuspendedSize; PMNotifySuspendedStruct *pmSuspendedPIDS; - OSSet * preventIdleSleepList; - OSSet * preventSystemSleepList; + OSPtr preventIdleSleepList; + OSPtr preventSystemSleepList; - UInt32 _scheduledAlarms; - UInt32 _userScheduledAlarm; - clock_sec_t _scheduledAlarmUTC; + OSPtr _nextScheduledAlarmType; + clock_sec_t _nextScheduledAlarmUTC; + clock_sec_t _calendarWakeAlarmUTC; + UInt32 _scheduledAlarmMask; + UInt32 _userScheduledAlarmMask; #if HIBERNATION clock_sec_t _standbyTimerResetSeconds; @@ -800,17 +823,18 @@ private: void * swd_compressed_buffer; void * swd_spindump_buffer; thread_t notifierThread; - OSObject *notifierObject; + OSPtr notifierObject; - IOBufferMemoryDescriptor *swd_memDesc; + OSPtr swd_spindump_memDesc; + OSPtr swd_memDesc; // Wake Event Reporting - OSArray * _systemWakeEventsArray; - bool _acceptSystemWakeEvents; + OSPtr _systemWakeEventsArray; + bool _acceptSystemWakeEvents; // AOT -- IOPMCalendarStruct _aotWakeTimeCalendar; - IOTimerEventSource * _aotTimerES; + OSPtr _aotTimerES; clock_sec_t _aotWakeTimeUTC; uint64_t _aotTestTime; uint64_t _aotTestInterval; @@ -844,7 +868,9 @@ private: // IOPMrootDomain internal sleep call IOReturn privateSleepSystem( uint32_t sleepReason ); void reportUserInput( void ); + void updateUserActivity( void ); void setDisableClamShellSleep( bool ); + void setClamShellSleepDisable(bool disable, uint32_t bitmask); bool checkSystemSleepAllowed( IOOptionBits options, uint32_t sleepReason ); bool checkSystemSleepEnabled( void ); @@ -907,6 +933,9 @@ private: void sleepWakeDebugSpinDumpMemAlloc(); errno_t sleepWakeDebugSaveFile(const char *name, char *buf, int len); + IOReturn changePowerStateWithOverrideTo( IOPMPowerStateIndex ordinal, IOPMRequestTag tag ); + IOReturn changePowerStateWithTagToPriv( IOPMPowerStateIndex ordinal, IOPMRequestTag tag ); + IOReturn changePowerStateWithTagTo( IOPMPowerStateIndex ordinal, IOPMRequestTag tag ); #if HIBERNATION bool getSleepOption( const char * key, uint32_t * option ); @@ -919,12 +948,20 @@ private: bool latchDisplayWranglerTickle( bool latch ); void setDisplayPowerOn( uint32_t options ); - void acceptSystemWakeEvents( bool accept ); + void acceptSystemWakeEvents( uint32_t control ); void systemDidNotSleep( void ); void preventTransitionToUserActive( bool prevent ); void setThermalState(OSObject *value); void copySleepPreventersList(OSArray **idleSleepList, OSArray **systemSleepList); void copySleepPreventersListWithID(OSArray **idleSleepList, OSArray **systemSleepList); + void recordRTCAlarm(const OSSymbol *type, OSObject *object); + + // Used to inform interested clients about low latency audio activity in the system + OSPtr lowLatencyAudioNotifierDict; + OSPtr lowLatencyAudioNotifyStateVal; + OSPtr lowLatencyAudioNotifyTimestampVal; + OSPtr lowLatencyAudioNotifyStateSym; + OSPtr lowLatencyAudioNotifyTimestampSym; #endif /* XNU_KERNEL_PRIVATE */ }; @@ -935,7 +972,7 @@ class IORootParent : public IOService public: static void initialize( void ); - virtual OSObject * copyProperty( const char * aKey ) const APPLE_KEXT_OVERRIDE; + virtual OSPtr copyProperty( const char * aKey ) const APPLE_KEXT_OVERRIDE; bool start( IOService * nub ) APPLE_KEXT_OVERRIDE; void shutDownSystem( void ); void restartSystem( void );