X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/ccc36f2f2d89f9115c479db4439aa5c88de5b44a..4452a7af2eac33dbad800bcc91f2399d62c18f53:/iokit/IOKit/pwr_mgt/RootDomain.h diff --git a/iokit/IOKit/pwr_mgt/RootDomain.h b/iokit/IOKit/pwr_mgt/RootDomain.h index c2962a4ab..e2dd94dfe 100644 --- a/iokit/IOKit/pwr_mgt/RootDomain.h +++ b/iokit/IOKit/pwr_mgt/RootDomain.h @@ -1,23 +1,29 @@ /* * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. * - * @APPLE_LICENSE_HEADER_START@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * The contents of this file constitute Original Code as defined in and - * are subject to the Apple Public Source License Version 1.1 (the - * "License"). You may not use this file except in compliance with the - * License. Please obtain a copy of the License at - * http://www.apple.com/publicsource and read it before using this file. + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. * - * This Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. * - * @APPLE_LICENSE_HEADER_END@ + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ #ifndef _IOKIT_ROOTDOMAIN_H #define _IOKIT_ROOTDOMAIN_H @@ -25,11 +31,10 @@ #include #include +class IOPMWorkArbiter; class IOPMPowerStateQueue; class RootDomainUserClient; -#define kRootDomainSupportedFeatures "Supported Features" - enum { kRootDomainSleepNotSupported = 0x00000000, kRootDomainSleepSupported = 0x00000001, @@ -37,29 +42,35 @@ enum { kPCICantSleep = 0x00000004 }; -// Constants for use as arguments to registerPMSettingsController +#define kRootDomainSupportedFeatures "Supported Features" + +// Supported Feature bitfields for IOPMrootDomain::publishFeature() enum { - kIOPMAutoWakeSetting = 1, - kIOPMAutoPowerOnSetting, - kIOPMWakeOnRingSetting, - kIOPMAutoRestartOnPowerLossSetting, - kIOPMWakeOnLidSetting, - kIOPMWakeOnACChangeSetting + kIOPMSupportedOnAC = 1<<0, + kIOPMSupportedOnBatt = 1<<1, + kIOPMSupportedOnUPS = 1<<2 }; -typedef int IOPMSystemSettingType; - - -typedef IOReturn (*IOPMSettingControllerCallback)(IOPMSystemSettingType arg_type, int arg_val, void *info); +typedef IOReturn (*IOPMSettingControllerCallback) \ + (OSObject *target, const OSSymbol *type, \ + OSObject *val, uintptr_t refcon); extern "C" { - IONotifier * registerSleepWakeInterest(IOServiceInterestHandler, void *, void * = 0); - IONotifier * registerPrioritySleepWakeInterest(IOServiceInterestHandler handler, void * self, void * ref = 0); - IOReturn acknowledgeSleepWakeNotification(void * ); - IOReturn vetoSleepWakeNotification(void * PMrefcon); - IOReturn rootDomainRestart ( void ); - IOReturn rootDomainShutdown ( void ); + IONotifier * registerSleepWakeInterest( + IOServiceInterestHandler, void *, void * = 0); + + IONotifier * registerPrioritySleepWakeInterest( + IOServiceInterestHandler handler, + void * self, void * ref = 0); + + IOReturn acknowledgeSleepWakeNotification(void * ); + + IOReturn vetoSleepWakeNotification(void * PMrefcon); + + IOReturn rootDomainRestart ( void ); + + IOReturn rootDomainShutdown ( void ); } #define IOPM_ROOTDOMAIN_REV 2 @@ -71,6 +82,8 @@ OSDeclareDefaultStructors(IOPMrootDomain) public: class IOService * wrangler; // we tickle the wrangler on button presses, etc + + IOPMWorkArbiter * getPMArbiter(void); static IOPMrootDomain * construct( void ); virtual bool start( IOService * provider ); @@ -88,25 +101,95 @@ public: void stopIgnoringClamshellEventsDuringWakeup ( void ); void wakeFromDoze( void ); void broadcast_it (unsigned long, unsigned long ); + + // KEXT driver announces support of power management feature void publishFeature( const char *feature ); + + // KEXT driver announces support of power management feature + // And specifies power sources with kIOPMSupportedOn{AC/Batt/UPS} bitfield. + // Returns a unique uint32_t identifier for later removing support for this + // feature. + // NULL is acceptable for uniqueFeatureID for kexts without plans to unload. + void publishFeature( const char *feature, + uint32_t supportedWhere, + uint32_t *uniqueFeatureID); + + // KEXT driver announces removal of a previously published power management + // feature. Pass 'uniqueFeatureID' returned from publishFeature() + IOReturn removePublishedFeature( uint32_t removeFeatureID ); + void unIdleDevice( IOService *, unsigned long ); void announcePowerSourceChange( void ); - + // Override of these methods for logging purposes. virtual IOReturn changePowerStateTo ( unsigned long ordinal ); virtual IOReturn changePowerStateToPriv ( unsigned long ordinal ); - IOReturn registerPMSettingController(IOPMSettingControllerCallback, void *); - IOReturn registerPlatformPowerProfiles(OSArray *); +/*! @function copyPMSetting + @abstract Copy the current value for a PM setting. Returns OSNumber or + OSData depending on the setting. + @param whichSetting Name of the desired setting. + @result OSObject *value if valid, NULL otherwise. */ + OSObject *copyPMSetting(OSSymbol *whichSetting); + +/*! @function registerPMSettingController + @abstract Register for callbacks on changes to certain PM settings. + @param settings NULL terminated array of C strings, each string for a PM + setting that the caller is interested in and wants to get callbacks for. + @param callout C function ptr or member function cast as such. + @param target The target of the callback, usually 'this' + @param refcon Will be passed to caller in callback; for caller's use. + @param handle Caller should keep the OSObject * returned here. If non-NULL, + handle will have a retain count of 1 on return. To deregister, pass to + unregisterPMSettingController() + @result kIOReturnSuccess on success. */ + IOReturn registerPMSettingController( + const OSSymbol *settings[], + IOPMSettingControllerCallback callout, + OSObject *target, + uintptr_t refcon, + OSObject **handle); // out param + +/*! @function registerPMSettingController + @abstract Register for callbacks on changes to certain PM settings. + @param settings NULL terminated array of C strings, each string for a PM + setting that the caller is interested in and wants to get callbacks for. + @param supportedPowerSources bitfield indicating which power sources these + settings are supported for (kIOPMSupportedOnAC, etc.) + @param callout C function ptr or member function cast as such. + @param target The target of the callback, usually 'this' + @param refcon Will be passed to caller in callback; for caller's use. + @param handle Caller should keep the OSObject * returned here. If non-NULL, + handle will have a retain count of 1 on return. To deregister, pass to + unregisterPMSettingController() + @result kIOReturnSuccess on success. */ + IOReturn registerPMSettingController( + const OSSymbol *settings[], + uint32_t supportedPowerSources, + IOPMSettingControllerCallback callout, + OSObject *target, + uintptr_t refcon, + OSObject **handle); // out param private: - class IORootParent * patriarch; // points to our parent - long sleepSlider; // pref: idle time before idle sleep - long longestNonSleepSlider; // pref: longest of other idle times - long extraSleepDelay; // sleepSlider - longestNonSleepSlider - thread_call_t extraSleepTimer; // used to wait between say display idle and system idle - thread_call_t clamshellWakeupIgnore; // Used to ignore clamshell close events while we're waking from sleep + // Points to our parent + class IORootParent * patriarch; + + // Pref: idle time before idle sleep + long sleepSlider; + + // Pref: longest of other idle times (disk and display) + long longestNonSleepSlider; + + // Difference between sleepSlider and longestNonSleepSlider + long extraSleepDelay; + + // Used to wait between say display idle and system idle + thread_call_t extraSleepTimer; + + // Used to ignore clamshell close events while we're waking from sleep + thread_call_t clamshellWakeupIgnore; virtual void powerChangeDone ( unsigned long ); virtual void command_received ( void *, void * , void * , void *); @@ -126,17 +209,26 @@ private: static bool displayWranglerPublished( void * target, void * refCon, IOService * newService); - static bool batteryLocationPublished( void * target, void * refCon, + static bool batteryPublished( void * target, void * refCon, IOService * resourceService ); + void adjustPowerState ( void ); void setQuickSpinDownTimeout ( void ); - void adjustPowerState( void ); void restoreUserSpinDownTimeout ( void ); - + + bool shouldSleepOnClamshellClosed (void ); + void sendClientClamshellNotification ( void ); + + IOLock *featuresDictLock; // guards supportedFeatures IOPMPowerStateQueue *pmPowerStateQueue; + + IOWorkLoop *arbiterWorkLoop; + IOPMWorkArbiter *pmArbiter; + unsigned int user_spindown; // User's selected disk spindown value unsigned int systemBooting:1; + unsigned int systemShutdown:1; unsigned int ignoringClamshell:1; unsigned int allowSleep:1; unsigned int sleepIsSupported:1; @@ -147,25 +239,29 @@ private: unsigned int acAdaptorConnect:1; unsigned int ignoringClamshellDuringWakeup:1; - unsigned int reservedA:6; + unsigned int clamshellIsClosed:1; + unsigned int clamshellExists:1; + unsigned int reservedA:4; unsigned char reservedB[3]; - struct PMSettingCtrl { - IOPMSettingControllerCallback func; - void *refcon; - }; + OSArray *allowedPMSettings; + + // Settings controller info + IORecursiveLock *settingsCtrlLock; + OSDictionary *settingsCallbacks; + OSDictionary *fPMSettingsDict; + IOReturn setPMSetting(const OSSymbol *, OSObject *); + + thread_call_t diskSyncCalloutEntry; + IONotifier *_batteryPublishNotifier; + IONotifier *_displayWranglerNotifier; - // Private helper to call PM setting controller - IOReturn setPMSetting(int type, OSNumber *); - struct ExpansionData { - PMSettingCtrl *_settingController; - thread_call_t diskSyncCalloutEntry; - IONotifier *_batteryLocationNotifier; - IONotifier *_displayWranglerNotifier; }; ExpansionData *_reserved; IOOptionBits platformSleepSupport; + + friend class PMSettingObject; }; class IORootParent: public IOService @@ -177,6 +273,8 @@ private: public: + virtual IOReturn changePowerStateToPriv ( unsigned long ordinal ); + bool start ( IOService * nub ); void shutDownSystem ( void ); void restartSystem ( void );