1 | /*␊ |
2 | * Copyright (c) 1998-2000 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_ROOTDOMAIN_H␊ |
29 | #define _IOKIT_ROOTDOMAIN_H␊ |
30 | ␊ |
31 | #include <IOKit/IOService.h>␊ |
32 | #include <IOKit/pwr_mgt/IOPM.h>␊ |
33 | #include "IOKit/pwr_mgt/IOPMPrivate.h"␊ |
34 | ␊ |
35 | ␊ |
36 | class IOPMPowerStateQueue;␊ |
37 | class RootDomainUserClient;␊ |
38 | class PMTraceWorker;␊ |
39 | ␊ |
40 | /*␊ |
41 | * Flags for get/setSleepSupported()␊ |
42 | */␊ |
43 | enum {␊ |
44 | kRootDomainSleepNotSupported␉= 0x00000000,␊ |
45 | kRootDomainSleepSupported ␉␉= 0x00000001,␊ |
46 | kFrameBufferDeepSleepSupported␉= 0x00000002,␊ |
47 | kPCICantSleep = 0x00000004␊ |
48 | };␊ |
49 | ␊ |
50 | /* ␊ |
51 | *IOPMrootDomain registry property keys␊ |
52 | */␊ |
53 | #define kRootDomainSupportedFeatures "Supported Features"␊ |
54 | #define kRootDomainSleepReasonKey "Last Sleep Reason"␊ |
55 | #define kRootDomainSleepOptionsKey "Last Sleep Options"␊ |
56 | #define kIOPMRootDomainWakeReasonKey "Wake Reason"␊ |
57 | #define kIOPMRootDomainWakeTypeKey "Wake Type"␊ |
58 | #define kIOPMRootDomainPowerStatusKey "Power Status"␊ |
59 | ␊ |
60 | /*␊ |
61 | * Possible sleep reasons found under kRootDomainSleepReasonsKey␊ |
62 | */␊ |
63 | #define kIOPMClamshellSleepKey "Clamshell Sleep"␊ |
64 | #define kIOPMPowerButtonSleepKey "Power Button Sleep"␊ |
65 | #define kIOPMSoftwareSleepKey "Software Sleep"␊ |
66 | #define kIOPMOSSwitchHibernationKey "OS Switch Sleep"␊ |
67 | #define kIOPMIdleSleepKey "Idle Sleep"␊ |
68 | #define kIOPMLowPowerSleepKey "Low Power Sleep"␊ |
69 | #define kIOPMThermalEmergencySleepKey "Thermal Emergency Sleep"␊ |
70 | #define kIOPMMaintenanceSleepKey "Maintenance Sleep"␊ |
71 | ␊ |
72 | /*␊ |
73 | * String constants for communication with PM CPU␊ |
74 | */␊ |
75 | #define kIOPMRootDomainLidCloseCString "LidClose"␊ |
76 | #define kIOPMRootDomainBatPowerCString "BatPower"␊ |
77 | ␊ |
78 | /*␊ |
79 | * Supported Feature bitfields for IOPMrootDomain::publishFeature()␊ |
80 | */␊ |
81 | enum {␊ |
82 | kIOPMSupportedOnAC = (1<<0),␊ |
83 | kIOPMSupportedOnBatt = (1<<1),␊ |
84 | kIOPMSupportedOnUPS = (1<<2)␊ |
85 | };␊ |
86 | ␊ |
87 | typedef IOReturn (*IOPMSettingControllerCallback)␊ |
88 | (OSObject *target, const OSSymbol *type,␊ |
89 | OSObject *val, uintptr_t refcon);␊ |
90 | ␊ |
91 | __BEGIN_DECLS␊ |
92 | IONotifier * registerSleepWakeInterest(␊ |
93 | IOServiceInterestHandler, void *, void * = 0);␊ |
94 | ␊ |
95 | IONotifier * registerPrioritySleepWakeInterest(␊ |
96 | IOServiceInterestHandler handler, ␊ |
97 | void * self, void * ref = 0);␊ |
98 | ␊ |
99 | IOReturn acknowledgeSleepWakeNotification(void * );␊ |
100 | ␊ |
101 | IOReturn vetoSleepWakeNotification(void * PMrefcon);␊ |
102 | __END_DECLS␊ |
103 | ␊ |
104 | #define IOPM_ROOTDOMAIN_REV␉␉2␊ |
105 | ␊ |
106 | class IOPMrootDomain: public IOService␊ |
107 | {␊ |
108 | OSDeclareFinalStructors(IOPMrootDomain)␊ |
109 | ␊ |
110 | public:␊ |
111 | static IOPMrootDomain * construct( void );␊ |
112 | ␊ |
113 | virtual bool start( IOService * provider );␊ |
114 | virtual IOReturn setAggressiveness( unsigned long, unsigned long );␊ |
115 | virtual IOReturn getAggressiveness( unsigned long, unsigned long * );␊ |
116 | ␊ |
117 | virtual IOReturn sleepSystem( void );␊ |
118 | IOReturn sleepSystemOptions( OSDictionary *options );␊ |
119 | ␊ |
120 | virtual IOReturn setProperties( OSObject * );␊ |
121 | ␊ |
122 | /*! @function systemPowerEventOccurred␊ |
123 | @abstract Other drivers may inform IOPMrootDomain of system PM events␊ |
124 | @discussion systemPowerEventOccurred is a richer alternative to receivePowerNotification()␊ |
125 | Only Apple-owned kexts should have reason to call systemPowerEventOccurred.␊ |
126 | @param event An OSSymbol describing the type of power event.␊ |
127 | @param value A 32-bit integer value associated with the event.␊ |
128 | @param shouldUpdate indicates whether the root domain should send a notification␊ |
129 | to interested parties. Pass false if you're calling systemPowerEventOccurred␊ |
130 | several times in succession; and pass true only on the last invocatino.␊ |
131 | @result kIOReturnSuccess on success */␊ |
132 | ␊ |
133 | IOReturn systemPowerEventOccurred(␊ |
134 | const OSSymbol *event, ␊ |
135 | uint32_t intValue );␊ |
136 | ␊ |
137 | IOReturn systemPowerEventOccurred(␊ |
138 | const OSSymbol *event, ␊ |
139 | OSObject *value );␊ |
140 | ␊ |
141 | virtual IOReturn receivePowerNotification( UInt32 msg );␊ |
142 | ␊ |
143 | virtual void setSleepSupported( IOOptionBits flags );␊ |
144 | ␊ |
145 | virtual IOOptionBits getSleepSupported( void );␊ |
146 | ␊ |
147 | void wakeFromDoze( void );␊ |
148 | ␊ |
149 | // KEXT driver announces support of power management feature␊ |
150 | ␊ |
151 | void publishFeature( const char *feature );␊ |
152 | ␊ |
153 | // KEXT driver announces support of power management feature␊ |
154 | // And specifies power sources with kIOPMSupportedOn{AC/Batt/UPS} bitfield.␊ |
155 | // Returns a unique uint32_t identifier for later removing support for this␊ |
156 | // feature. ␊ |
157 | // NULL is acceptable for uniqueFeatureID for kexts without plans to unload.␊ |
158 | ␊ |
159 | void publishFeature( const char *feature, ␊ |
160 | uint32_t supportedWhere,␊ |
161 | uint32_t *uniqueFeatureID);␊ |
162 | ␊ |
163 | // KEXT driver announces removal of a previously published power management ␊ |
164 | // feature. Pass 'uniqueFeatureID' returned from publishFeature()␊ |
165 | ␊ |
166 | IOReturn removePublishedFeature( uint32_t removeFeatureID );␊ |
167 | ␊ |
168 | /*! @function copyPMSetting␊ |
169 | @abstract Copy the current value for a PM setting. Returns an OSNumber or␊ |
170 | OSData depending on the setting.␊ |
171 | @param whichSetting Name of the desired setting.␊ |
172 | @result OSObject value if valid, NULL otherwise. */␊ |
173 | ␊ |
174 | OSObject * copyPMSetting( OSSymbol *whichSetting );␊ |
175 | ␊ |
176 | /*! @function registerPMSettingController␊ |
177 | @abstract Register for callbacks on changes to certain PM settings.␊ |
178 | @param settings NULL terminated array of C strings, each string for a PM ␊ |
179 | setting that the caller is interested in and wants to get callbacks for. ␊ |
180 | @param callout C function ptr or member function cast as such.␊ |
181 | @param target The target of the callback, usually 'this'␊ |
182 | @param refcon Will be passed to caller in callback; for caller's use.␊ |
183 | @param handle Caller should keep the OSObject * returned here. If non-NULL,␊ |
184 | handle will have a retain count of 1 on return. To deregister, pass to␊ |
185 | unregisterPMSettingController()␊ |
186 | @result kIOReturnSuccess on success. */␊ |
187 | ␊ |
188 | IOReturn registerPMSettingController(␊ |
189 | const OSSymbol *settings[],␊ |
190 | IOPMSettingControllerCallback callout,␊ |
191 | OSObject *target,␊ |
192 | uintptr_t refcon,␊ |
193 | OSObject **handle); // out param␊ |
194 | ␊ |
195 | /*! @function registerPMSettingController␊ |
196 | @abstract Register for callbacks on changes to certain PM settings.␊ |
197 | @param settings NULL terminated array of C strings, each string for a PM ␊ |
198 | setting that the caller is interested in and wants to get callbacks for. ␊ |
199 | @param supportedPowerSources bitfield indicating which power sources these␊ |
200 | settings are supported for (kIOPMSupportedOnAC, etc.)␊ |
201 | @param callout C function ptr or member function cast as such.␊ |
202 | @param target The target of the callback, usually 'this'␊ |
203 | @param refcon Will be passed to caller in callback; for caller's use.␊ |
204 | @param handle Caller should keep the OSObject * returned here. If non-NULL,␊ |
205 | handle will have a retain count of 1 on return. To deregister, pass to␊ |
206 | unregisterPMSettingController()␊ |
207 | @result kIOReturnSuccess on success. */␊ |
208 | ␊ |
209 | IOReturn registerPMSettingController(␊ |
210 | const OSSymbol *settings[],␊ |
211 | uint32_t supportedPowerSources,␊ |
212 | IOPMSettingControllerCallback callout,␊ |
213 | OSObject *target,␊ |
214 | uintptr_t refcon,␊ |
215 | OSObject **handle); // out param␊ |
216 | ␊ |
217 | virtual IONotifier * registerInterest(␊ |
218 | const OSSymbol * typeOfInterest,␊ |
219 | IOServiceInterestHandler handler,␊ |
220 | void * target, void * ref = 0 );␊ |
221 | ␊ |
222 | void pmStatsRecordEvent(␊ |
223 | int eventIndex,␊ |
224 | AbsoluteTime timestamp);␊ |
225 | ␊ |
226 | void pmStatsRecordApplicationResponse(␊ |
227 | const OSSymbol␉␉*response,␊ |
228 | const char ␉␉ *name,␊ |
229 | int messageType,␊ |
230 | uint32_t␉␉␉delay_ms,␊ |
231 | int ␉␉␉app_pid);␊ |
232 | ␊ |
233 | virtual IOReturn callPlatformFunction(␊ |
234 | const OSSymbol *functionName,␊ |
235 | bool waitForFunction,␊ |
236 | void *param1, void *param2,␊ |
237 | void *param3, void *param4 );␊ |
238 | ␊ |
239 | private:␊ |
240 | virtual IOReturn changePowerStateTo( unsigned long ordinal );␊ |
241 | virtual IOReturn changePowerStateToPriv( unsigned long ordinal );␊ |
242 | virtual IOReturn requestPowerDomainState( IOPMPowerFlags, IOPowerConnection *, unsigned long );␊ |
243 | virtual void powerChangeDone( unsigned long );␊ |
244 | virtual bool tellChangeDown( unsigned long );␊ |
245 | virtual bool askChangeDown( unsigned long );␊ |
246 | virtual void tellChangeUp( unsigned long );␊ |
247 | virtual void tellNoChangeDown( unsigned long );␊ |
248 | };␊ |
249 | ␊ |
250 | ␊ |
251 | #endif /* _IOKIT_ROOTDOMAIN_H */␊ |
252 | |