]> git.saurik.com Git - apple/xnu.git/blame - iokit/Kernel/IOServicePMPrivate.h
xnu-2782.30.5.tar.gz
[apple/xnu.git] / iokit / Kernel / IOServicePMPrivate.h
CommitLineData
2d21ac55
A
1/*
2 * Copyright (c) 2007 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
29#ifndef _IOKIT_IOSERVICEPMPRIVATE_H
30#define _IOKIT_IOSERVICEPMPRIVATE_H
31
6d2010ae
A
32#include <IOKit/IOCommand.h>
33#include <IOKit/IOEventSource.h>
34
35//******************************************************************************
36// PM command types
37//******************************************************************************
38
39enum {
40 /* Command Types */
41 kIOPMRequestTypeInvalid = 0x00,
42 kIOPMRequestTypePMStop = 0x01,
43 kIOPMRequestTypeAddPowerChild1 = 0x02,
44 kIOPMRequestTypeAddPowerChild2 = 0x03,
45 kIOPMRequestTypeAddPowerChild3 = 0x04,
46 kIOPMRequestTypeRegisterPowerDriver = 0x05,
47 kIOPMRequestTypeAdjustPowerState = 0x06,
48 kIOPMRequestTypePowerDomainWillChange = 0x07,
49 kIOPMRequestTypePowerDomainDidChange = 0x08,
50 kIOPMRequestTypePowerOverrideOnPriv = 0x09,
51 kIOPMRequestTypePowerOverrideOffPriv = 0x0A,
52 kIOPMRequestTypeActivityTickle = 0x0B,
53 kIOPMRequestTypeRequestPowerState = 0x0C,
54 kIOPMRequestTypeSynchronizePowerTree = 0x0D,
55 kIOPMRequestTypeRequestPowerStateOverride = 0x0E,
56 kIOPMRequestTypeSetIdleTimerPeriod = 0x0F,
7ddcb079 57 kIOPMRequestTypeIgnoreIdleTimer = 0x10,
fe8ab488 58
6d2010ae
A
59 /* Reply Types */
60 kIOPMRequestTypeReplyStart = 0x80,
61 kIOPMRequestTypeAckPowerChange = 0x81,
62 kIOPMRequestTypeAckSetPowerState = 0x82,
63 kIOPMRequestTypeAllowPowerChange = 0x83,
64 kIOPMRequestTypeCancelPowerChange = 0x84,
65 kIOPMRequestTypeInterestChanged = 0x85,
66 kIOPMRequestTypeIdleCancel = 0x86,
67 kIOPMRequestTypeChildNotifyDelayCancel = 0x87
68};
69
70//******************************************************************************
71// PM actions - For root domain only
72//******************************************************************************
73
74struct IOPMActions;
75
76typedef void
77(*IOPMActionPowerChangeStart)(
39236c6e
A
78 void * target,
79 IOService * service,
80 IOPMActions * actions,
81 IOPMPowerStateIndex powerState,
82 IOPMPowerChangeFlags * changeFlags,
83 IOPMRequestTag requestTag );
6d2010ae
A
84
85typedef void
86(*IOPMActionPowerChangeDone)(
39236c6e
A
87 void * target,
88 IOService * service,
89 IOPMActions * actions,
90 IOPMPowerStateIndex powerState,
91 IOPMPowerChangeFlags changeFlags,
92 IOPMRequestTag requestTag );
6d2010ae
A
93
94typedef void
95(*IOPMActionPowerChangeOverride)(
39236c6e
A
96 void * target,
97 IOService * service,
98 IOPMActions * actions,
99 IOPMPowerStateIndex * powerState,
100 IOPMPowerChangeFlags * changeFlags,
101 IOPMRequestTag requestTag );
6d2010ae
A
102
103typedef void
104(*IOPMActionActivityTickle)(
39236c6e
A
105 void * target,
106 IOService * service,
107 IOPMActions * actions );
108
109typedef void
110(*IOPMActionUpdatePowerClient)(
111 void * target,
112 IOService * service,
113 IOPMActions * actions,
114 const OSSymbol * powerClient,
115 IOPMPowerStateIndex oldPowerState,
116 IOPMPowerStateIndex newPowerState
117);
6d2010ae
A
118
119struct IOPMActions {
120 void * target;
121 uint32_t parameter;
122 IOPMActionPowerChangeStart actionPowerChangeStart;
123 IOPMActionPowerChangeDone actionPowerChangeDone;
124 IOPMActionPowerChangeOverride actionPowerChangeOverride;
125 IOPMActionActivityTickle actionActivityTickle;
39236c6e
A
126 IOPMActionUpdatePowerClient actionUpdatePowerClient;
127};
128
129// IOPMActions parameter flags
130enum {
131 kPMActionsFlagIsDisplayWrangler = 0x00000100,
132 kPMActionsFlagIsGraphicsDevice = 0x00000200,
133 kPMActionsFlagIsAudioDevice = 0x00000400,
134 kPMActionsFlagLimitPower = 0x00000800,
fe8ab488 135 kPMActionsPCIBitNumberMask = 0x000000ff
6d2010ae
A
136};
137
138//******************************************************************************
6d2010ae
A
139// Internal concise representation of IOPMPowerState
140struct IOPMPSEntry
141{
fe8ab488
A
142 IOPMPowerFlags capabilityFlags;
143 IOPMPowerFlags outputPowerFlags;
144 IOPMPowerFlags inputPowerFlags;
39236c6e
A
145 uint32_t staticPower;
146 uint32_t settleUpTime;
147 uint32_t settleDownTime;
148 IOPMPowerStateIndex stateOrder;
149 IOPMPowerStateIndex stateOrderToIndex;
6d2010ae
A
150};
151
152//******************************************************************************
153// IOServicePM
154//******************************************************************************
155
2d21ac55
A
156class IOServicePM : public OSObject
157{
158 friend class IOService;
6d2010ae 159 friend class IOPMWorkQueue;
2d21ac55
A
160
161 OSDeclareDefaultStructors( IOServicePM )
162
163private:
6d2010ae
A
164 // Link IOServicePM objects on IOPMWorkQueue.
165 queue_chain_t WorkChain;
fe8ab488 166
6d2010ae
A
167 // Queue of IOPMRequest objects.
168 queue_head_t RequestHead;
169
170 // IOService creator and owner.
171 IOService * Owner;
172
173 // List of interested drivers (protected by PMLock).
2d21ac55
A
174 IOPMinformeeList * InterestedDrivers;
175
b0d623f7 176 // How long to wait for controlling driver to acknowledge.
2d21ac55
A
177 IOReturn DriverTimer;
178
b0d623f7
A
179 // Current power management machine state.
180 uint32_t MachineState;
2d21ac55 181
b0d623f7 182 thread_call_t AckTimer;
2d21ac55 183 thread_call_t SettleTimer;
6d2010ae 184 thread_call_t IdleTimer;
39236c6e 185 thread_call_t WatchdogTimer;
2d21ac55 186
b0d623f7 187 // Settle time after changing power state.
6d2010ae 188 uint32_t SettleTimeUS;
fe8ab488 189 uint32_t IdleTimerGeneration;
2d21ac55 190
b0d623f7 191 // The flags describing current change note.
6d2010ae 192 IOPMPowerChangeFlags HeadNoteChangeFlags;
2d21ac55 193
b0d623f7 194 // The new power state number being changed to.
6d2010ae 195 IOPMPowerStateIndex HeadNotePowerState;
b0d623f7
A
196
197 // Points to the entry in the power state array.
6d2010ae 198 IOPMPSEntry * HeadNotePowerArrayEntry;
b0d623f7
A
199
200 // Power flags supplied by all parents (domain).
6d2010ae 201 IOPMPowerFlags HeadNoteDomainFlags;
b0d623f7 202
7e4a7d39
A
203 // Power flags supplied by domain accounting for parent changes.
204 IOPMPowerFlags HeadNoteDomainTargetFlags;
205
b0d623f7
A
206 // Connection attached to the changing parent.
207 IOPowerConnection * HeadNoteParentConnection;
fe8ab488 208
b0d623f7 209 // Power flags supplied by the changing parent.
6d2010ae 210 IOPMPowerFlags HeadNoteParentFlags;
b0d623f7
A
211
212 // Number of acks still outstanding.
6d2010ae 213 uint32_t HeadNotePendingAcks;
2d21ac55 214
b0d623f7 215 // PM state lock.
6d2010ae
A
216 IOLock * PMLock;
217
bd504ef0
A
218 unsigned int InitialPowerChange :1;
219 unsigned int InitialSetPowerState :1;
220 unsigned int DeviceOverrideEnabled :1;
221 unsigned int DoNotPowerDown :1;
222 unsigned int ParentsKnowState :1;
223 unsigned int StrictTreeOrder :1;
224 unsigned int IdleTimerStopped :1;
225 unsigned int AdjustPowerScheduled :1;
fe8ab488 226
bd504ef0
A
227 unsigned int IsPreChange :1;
228 unsigned int DriverCallBusy :1;
229 unsigned int PCDFunctionOverride :1;
230 unsigned int IdleTimerIgnored :1;
231 unsigned int HasAdvisoryDesire :1;
232 unsigned int AdvisoryTickleUsed :1;
233 unsigned int ResetPowerStateOnWake :1;
b0d623f7
A
234
235 // Time of last device activity.
2d21ac55 236 AbsoluteTime DeviceActiveTimestamp;
fe8ab488
A
237 AbsoluteTime MaxPowerStateEntryTime;
238 AbsoluteTime MaxPowerStateExitTime;
2d21ac55 239
b0d623f7 240 // Used to protect activity flag.
2d21ac55
A
241 IOLock * ActivityLock;
242
b0d623f7 243 // Idle timer's period in seconds.
2d21ac55 244 unsigned long IdleTimerPeriod;
cf7d32b8 245 unsigned long IdleTimerMinPowerState;
fe8ab488 246 unsigned long NextIdleTimerPeriod;
b0d623f7 247 AbsoluteTime IdleTimerStartTime;
2d21ac55 248
b0d623f7 249 // Power state desired by a subclassed device object.
6d2010ae 250 IOPMPowerStateIndex DeviceDesire;
2d21ac55 251
b0d623f7 252 // This is the power state we desire currently.
6d2010ae 253 IOPMPowerStateIndex DesiredPowerState;
2d21ac55 254
b0d623f7 255 // This is what our parent thinks our need is.
6d2010ae 256 IOPMPowerFlags PreviousRequestPowerFlags;
2d21ac55 257
b0d623f7 258 // Cache result from getName(), used in logging.
2d21ac55
A
259 const char * Name;
260
b0d623f7 261 // Number of power states in the power array.
6d2010ae 262 IOPMPowerStateIndex NumberOfPowerStates;
2d21ac55 263
39236c6e
A
264 // Ordered highest power state in the power array.
265 IOPMPowerStateIndex HighestPowerState;
266
b0d623f7 267 // Power state array.
6d2010ae 268 IOPMPSEntry * PowerStates;
2d21ac55 269
b0d623f7 270 // The controlling driver.
6d2010ae 271 IOService * ControllingDriver;
2d21ac55 272
b0d623f7 273 // Our current power state.
6d2010ae 274 IOPMPowerStateIndex CurrentPowerState;
2d21ac55 275
b0d623f7 276 // Logical OR of power flags for each power domain parent.
6d2010ae 277 IOPMPowerFlags ParentsCurrentPowerFlags;
2d21ac55 278
b0d623f7 279 // The highest power state we can achieve in current power domain.
6d2010ae 280 IOPMPowerStateIndex MaxPowerState;
2d21ac55 281
39236c6e
A
282 // Logical OR of all output power flags in the power state array.
283 IOPMPowerFlags MergedOutputPowerFlags;
2d21ac55 284
b0d623f7 285 // OSArray which manages responses from notified apps and clients.
6d2010ae 286 OSArray * ResponseArray;
b0d623f7
A
287 OSArray * NotifyClientArray;
288
289 // Used to uniquely identify power management notification to apps and clients.
6d2010ae 290 UInt16 SerialNumber;
2d21ac55 291
b0d623f7
A
292 // Used to communicate desired function to tellClientsWithResponse().
293 // This is used because it avoids changing the signatures of the affected virtual methods.
6d2010ae 294 int OutOfBandParameter;
2d21ac55
A
295
296 AbsoluteTime DriverCallStartTime;
297 IOPMPowerFlags CurrentCapabilityFlags;
298 unsigned long CurrentPowerConsumption;
6d2010ae
A
299 IOPMPowerStateIndex TempClampPowerState;
300 OSArray * NotifyChildArray;
b0d623f7 301 OSDictionary * PowerClients;
6d2010ae
A
302 thread_call_t DriverCallEntry;
303 void * DriverCallParamPtr;
304 IOItemCount DriverCallParamCount;
305 IOItemCount DriverCallParamSlots;
b0d623f7 306 uint32_t DriverCallReason;
6d2010ae 307 uint32_t OutOfBandMessage;
b0d623f7
A
308 uint32_t TempClampCount;
309 uint32_t OverrideMaxPowerState;
db609669 310 uint32_t DeviceUsablePowerState;
316670eb
A
311
312 // Protected by ActivityLock - BEGIN
39236c6e
A
313 IOPMPowerStateIndex ActivityTicklePowerState;
314 IOPMPowerStateIndex AdvisoryTicklePowerState;
b0d623f7 315 uint32_t ActivityTickleCount;
db609669
A
316 uint32_t DeviceWasActive : 1;
317 uint32_t AdvisoryTickled : 1;
316670eb
A
318 // Protected by ActivityLock - END
319
b0d623f7 320 uint32_t WaitReason;
6d2010ae 321 uint32_t SavedMachineState;
b0d623f7 322
6d2010ae 323 // Protected by PMLock - BEGIN
b0d623f7 324 struct {
6d2010ae
A
325 uint32_t PMStop : 1;
326 uint32_t PMDriverCallWait : 1;
b0d623f7
A
327 } LockedFlags;
328
6d2010ae
A
329 queue_head_t PMDriverCallQueue;
330 OSSet * InsertInterestSet;
331 OSSet * RemoveInterestSet;
fe8ab488 332
39236c6e
A
333 // IOReporter Data
334 uint32_t ReportClientCnt;
335 void * ReportBuf;
6d2010ae 336 // Protected by PMLock - END
2d21ac55
A
337
338#if PM_VARS_SUPPORT
6d2010ae 339 IOPMprot * PMVars;
2d21ac55
A
340#endif
341
6d2010ae
A
342 IOPMActions PMActions;
343
b0d623f7 344 // Serialize IOServicePM state for debug output.
39236c6e 345 IOReturn gatedSerialize( OSSerialize * s ) const;
2d21ac55 346 virtual bool serialize( OSSerialize * s ) const;
fe8ab488 347
4b17d6b6
A
348 // PM log and trace
349 void pmPrint( uint32_t event, uintptr_t param1, uintptr_t param2 ) const;
350 void pmTrace( uint32_t event, uintptr_t param1, uintptr_t param2 ) const;
2d21ac55
A
351};
352
6d2010ae 353#define fOwner pwrMgt->Owner
2d21ac55
A
354#define fInterestedDrivers pwrMgt->InterestedDrivers
355#define fDriverTimer pwrMgt->DriverTimer
6d2010ae 356#define fMachineState pwrMgt->MachineState
2d21ac55
A
357#define fAckTimer pwrMgt->AckTimer
358#define fSettleTimer pwrMgt->SettleTimer
6d2010ae 359#define fIdleTimer pwrMgt->IdleTimer
39236c6e 360#define fWatchdogTimer pwrMgt->WatchdogTimer
2d21ac55 361#define fSettleTimeUS pwrMgt->SettleTimeUS
fe8ab488 362#define fIdleTimerGeneration pwrMgt->IdleTimerGeneration
6d2010ae 363#define fHeadNoteChangeFlags pwrMgt->HeadNoteChangeFlags
b0d623f7
A
364#define fHeadNotePowerState pwrMgt->HeadNotePowerState
365#define fHeadNotePowerArrayEntry pwrMgt->HeadNotePowerArrayEntry
366#define fHeadNoteDomainFlags pwrMgt->HeadNoteDomainFlags
7e4a7d39 367#define fHeadNoteDomainTargetFlags pwrMgt->HeadNoteDomainTargetFlags
b0d623f7
A
368#define fHeadNoteParentConnection pwrMgt->HeadNoteParentConnection
369#define fHeadNoteParentFlags pwrMgt->HeadNoteParentFlags
2d21ac55
A
370#define fHeadNotePendingAcks pwrMgt->HeadNotePendingAcks
371#define fPMLock pwrMgt->PMLock
6d2010ae
A
372#define fInitialPowerChange pwrMgt->InitialPowerChange
373#define fInitialSetPowerState pwrMgt->InitialSetPowerState
374#define fDeviceOverrideEnabled pwrMgt->DeviceOverrideEnabled
6d2010ae
A
375#define fDoNotPowerDown pwrMgt->DoNotPowerDown
376#define fParentsKnowState pwrMgt->ParentsKnowState
377#define fStrictTreeOrder pwrMgt->StrictTreeOrder
378#define fIdleTimerStopped pwrMgt->IdleTimerStopped
379#define fAdjustPowerScheduled pwrMgt->AdjustPowerScheduled
380#define fIsPreChange pwrMgt->IsPreChange
381#define fDriverCallBusy pwrMgt->DriverCallBusy
382#define fPCDFunctionOverride pwrMgt->PCDFunctionOverride
7ddcb079 383#define fIdleTimerIgnored pwrMgt->IdleTimerIgnored
db609669
A
384#define fHasAdvisoryDesire pwrMgt->HasAdvisoryDesire
385#define fAdvisoryTickleUsed pwrMgt->AdvisoryTickleUsed
bd504ef0 386#define fResetPowerStateOnWake pwrMgt->ResetPowerStateOnWake
6d2010ae 387#define fDeviceActiveTimestamp pwrMgt->DeviceActiveTimestamp
fe8ab488
A
388#define fMaxPowerStateEntryTime pwrMgt->MaxPowerStateEntryTime
389#define fMaxPowerStateExitTime pwrMgt->MaxPowerStateExitTime
2d21ac55 390#define fActivityLock pwrMgt->ActivityLock
2d21ac55 391#define fIdleTimerPeriod pwrMgt->IdleTimerPeriod
cf7d32b8 392#define fIdleTimerMinPowerState pwrMgt->IdleTimerMinPowerState
fe8ab488 393#define fNextIdleTimerPeriod pwrMgt->NextIdleTimerPeriod
b0d623f7 394#define fIdleTimerStartTime pwrMgt->IdleTimerStartTime
2d21ac55 395#define fDeviceDesire pwrMgt->DeviceDesire
2d21ac55 396#define fDesiredPowerState pwrMgt->DesiredPowerState
6d2010ae 397#define fPreviousRequestPowerFlags pwrMgt->PreviousRequestPowerFlags
2d21ac55 398#define fName pwrMgt->Name
2d21ac55 399#define fNumberOfPowerStates pwrMgt->NumberOfPowerStates
39236c6e 400#define fHighestPowerState pwrMgt->HighestPowerState
2d21ac55
A
401#define fPowerStates pwrMgt->PowerStates
402#define fControllingDriver pwrMgt->ControllingDriver
2d21ac55 403#define fCurrentPowerState pwrMgt->CurrentPowerState
2d21ac55 404#define fParentsCurrentPowerFlags pwrMgt->ParentsCurrentPowerFlags
6d2010ae 405#define fMaxPowerState pwrMgt->MaxPowerState
39236c6e 406#define fMergedOutputPowerFlags pwrMgt->MergedOutputPowerFlags
2d21ac55 407#define fResponseArray pwrMgt->ResponseArray
b0d623f7 408#define fNotifyClientArray pwrMgt->NotifyClientArray
6d2010ae 409#define fSerialNumber pwrMgt->SerialNumber
2d21ac55
A
410#define fOutOfBandParameter pwrMgt->OutOfBandParameter
411#define fDriverCallStartTime pwrMgt->DriverCallStartTime
412#define fCurrentCapabilityFlags pwrMgt->CurrentCapabilityFlags
413#define fCurrentPowerConsumption pwrMgt->CurrentPowerConsumption
414#define fTempClampPowerState pwrMgt->TempClampPowerState
6d2010ae
A
415#define fNotifyChildArray pwrMgt->NotifyChildArray
416#define fPowerClients pwrMgt->PowerClients
2d21ac55
A
417#define fDriverCallEntry pwrMgt->DriverCallEntry
418#define fDriverCallParamPtr pwrMgt->DriverCallParamPtr
419#define fDriverCallParamCount pwrMgt->DriverCallParamCount
420#define fDriverCallParamSlots pwrMgt->DriverCallParamSlots
6d2010ae
A
421#define fDriverCallReason pwrMgt->DriverCallReason
422#define fOutOfBandMessage pwrMgt->OutOfBandMessage
423#define fTempClampCount pwrMgt->TempClampCount
424#define fOverrideMaxPowerState pwrMgt->OverrideMaxPowerState
db609669
A
425#define fDeviceUsablePowerState pwrMgt->DeviceUsablePowerState
426#define fActivityTicklePowerState pwrMgt->ActivityTicklePowerState
427#define fAdvisoryTicklePowerState pwrMgt->AdvisoryTicklePowerState
6d2010ae 428#define fActivityTickleCount pwrMgt->ActivityTickleCount
db609669
A
429#define fDeviceWasActive pwrMgt->DeviceWasActive
430#define fAdvisoryTickled pwrMgt->AdvisoryTickled
6d2010ae
A
431#define fWaitReason pwrMgt->WaitReason
432#define fSavedMachineState pwrMgt->SavedMachineState
6d2010ae
A
433#define fLockedFlags pwrMgt->LockedFlags
434#define fPMDriverCallQueue pwrMgt->PMDriverCallQueue
2d21ac55
A
435#define fInsertInterestSet pwrMgt->InsertInterestSet
436#define fRemoveInterestSet pwrMgt->RemoveInterestSet
39236c6e
A
437#define fReportClientCnt pwrMgt->ReportClientCnt
438#define fReportBuf pwrMgt->ReportBuf
2d21ac55 439#define fPMVars pwrMgt->PMVars
6d2010ae 440#define fPMActions pwrMgt->PMActions
2d21ac55 441
fe8ab488
A
442#define StateOrder(state) (((state) < fNumberOfPowerStates) \
443 ? pwrMgt->PowerStates[(state)].stateOrder \
444 : (state))
445#define StateMax(a,b) (StateOrder((a)) < StateOrder((b)) ? (b) : (a))
446#define StateMin(a,b) (StateOrder((a)) < StateOrder((b)) ? (a) : (b))
39236c6e
A
447
448#define kPowerStateZero (0)
449
b0d623f7
A
450/*
451When an IOService is waiting for acknowledgement to a power change
452notification from an interested driver or the controlling driver,
453the ack timer is ticking every tenth of a second.
2d21ac55
A
454(100000000 nanoseconds are one tenth of a second).
455*/
b0d623f7
A
456#define ACK_TIMER_PERIOD 100000000
457
39236c6e
A
458#define WATCHDOG_TIMER_PERIOD (300) // 300 secs
459
6d2010ae
A
460// Max wait time in microseconds for kernel priority and capability clients
461// with async message handlers to acknowledge.
fe8ab488 462//
6d2010ae
A
463#define kPriorityClientMaxWait (90 * 1000 * 1000)
464#define kCapabilityClientMaxWait (240 * 1000 * 1000)
465
466// Attributes describing a power state change.
467// See IOPMPowerChangeFlags data type.
468//
39236c6e
A
469#define kIOPMParentInitiated 0x0001 // power change initiated by our parent
470#define kIOPMSelfInitiated 0x0002 // power change initiated by this device
6d2010ae
A
471#define kIOPMNotDone 0x0004 // we couldn't make this change
472#define kIOPMDomainWillChange 0x0008 // change started by PowerDomainWillChangeTo
473#define kIOPMDomainDidChange 0x0010 // change started by PowerDomainDidChangeTo
474#define kIOPMDomainPowerDrop 0x0020 // Domain is lowering power
475#define kIOPMIgnoreChildren 0x0040 // Ignore children and driver power desires
476#define kIOPMSkipAskPowerDown 0x0080 // skip the ask app phase
477#define kIOPMSynchronize 0x0100 // change triggered by power tree re-sync
478#define kIOPMSyncNoChildNotify 0x0200 // sync root domain only, not entire tree
479#define kIOPMSyncTellPowerDown 0x0400 // send the ask/will power off messages
480#define kIOPMSyncCancelPowerDown 0x0800 // sleep cancel for maintenance wake
316670eb 481#define kIOPMInitialPowerChange 0x1000 // set for initial power change
bd504ef0
A
482#define kIOPMRootChangeUp 0x2000 // Root power domain change up
483#define kIOPMRootChangeDown 0x4000 // Root power domain change down
39236c6e 484#define kIOPMExpireIdleTimer 0x8000 // Accelerate idle timer expiration
bd504ef0
A
485
486#define kIOPMRootBroadcastFlags (kIOPMSynchronize | \
487 kIOPMRootChangeUp | kIOPMRootChangeDown)
488
489// Activity tickle request flags
490#define kTickleTypePowerDrop 0x01
491#define kTickleTypePowerRise 0x02
492#define kTickleTypeActivity 0x04
493#define kTickleTypeAdvisory 0x08
2d21ac55
A
494
495enum {
496 kDriverCallInformPreChange,
497 kDriverCallInformPostChange,
39236c6e
A
498 kDriverCallSetPowerState,
499 kRootDomainInformPreChange
2d21ac55
A
500};
501
502struct DriverCallParam {
503 OSObject * Target;
504 IOReturn Result;
505};
506
6d2010ae 507// values of OutOfBandParameter
2d21ac55
A
508enum {
509 kNotifyApps,
6d2010ae
A
510 kNotifyPriority,
511 kNotifyCapabilityChangeApps,
512 kNotifyCapabilityChangePriority
2d21ac55
A
513};
514
6d2010ae
A
515typedef bool (*IOPMMessageFilter)(
516 void * target, void * object, void * arg1, void * arg2, void * arg3 );
b0d623f7 517
2d21ac55 518// used for applyToInterested
b0d623f7 519struct IOPMInterestContext {
6d2010ae
A
520 OSArray * responseArray;
521 OSArray * notifyClients;
522 uint16_t serialNumber;
523 uint8_t isPreChange;
524 uint8_t enableTracing;
525 uint32_t maxTimeRequested;
526 uint32_t messageType;
527 uint32_t notifyType;
528 IOService * us;
529 IOPMPowerStateIndex stateNumber;
530 IOPMPowerFlags stateFlags;
531 IOPMPowerChangeFlags changeFlags;
532 const char * errorLog;
533 IOPMMessageFilter messageFilter;
2d21ac55
A
534};
535
6d2010ae
A
536// assertPMDriverCall() options
537enum {
538 kIOPMADC_NoInactiveCheck = 1
539};
540
541//******************************************************************************
b0d623f7 542// PM Statistics & Diagnostics
6d2010ae 543//******************************************************************************
b0d623f7
A
544
545extern const OSSymbol *gIOPMStatsApplicationResponseTimedOut;
546extern const OSSymbol *gIOPMStatsApplicationResponseCancel;
547extern const OSSymbol *gIOPMStatsApplicationResponseSlow;
fe8ab488
A
548extern const OSSymbol *gIOPMStatsApplicationResponsePrompt;
549extern const OSSymbol *gIOPMStatsDriverPSChangeSlow;
b0d623f7 550
6d2010ae
A
551//******************************************************************************
552// IOPMRequest
553//******************************************************************************
2d21ac55 554
b0d623f7
A
555typedef void (*IOPMCompletionAction)(void * target, void * param, IOReturn status);
556
2d21ac55
A
557class IOPMRequest : public IOCommand
558{
559 OSDeclareDefaultStructors( IOPMRequest )
560
561protected:
b0d623f7
A
562 IOService * fTarget; // request target
563 IOPMRequest * fRequestNext; // the next request in the chain
7e4a7d39 564 IOPMRequest * fRequestRoot; // the root request in the issue tree
b0d623f7 565 IOItemCount fWorkWaitCount; // execution blocked if non-zero
7e4a7d39 566 IOItemCount fFreeWaitCount; // completion blocked if non-zero
b0d623f7
A
567 uint32_t fType; // request type
568
39236c6e 569#if NOT_READY
b0d623f7
A
570 IOPMCompletionAction fCompletionAction;
571 void * fCompletionTarget;
572 void * fCompletionParam;
573 IOReturn fCompletionStatus;
39236c6e 574#endif
2d21ac55
A
575
576public:
39236c6e 577 uint32_t fRequestTag;
b0d623f7
A
578 void * fArg0;
579 void * fArg1;
580 void * fArg2;
2d21ac55 581
b0d623f7 582 inline bool isWorkBlocked( void ) const
2d21ac55 583 {
b0d623f7 584 return (fWorkWaitCount != 0);
2d21ac55
A
585 }
586
b0d623f7 587 inline bool isFreeBlocked( void ) const
2d21ac55 588 {
b0d623f7 589 return (fFreeWaitCount != 0);
2d21ac55
A
590 }
591
b0d623f7 592 inline IOPMRequest * getNextRequest( void ) const
2d21ac55 593 {
b0d623f7 594 return fRequestNext;
2d21ac55
A
595 }
596
7e4a7d39
A
597 inline IOPMRequest * getRootRequest( void ) const
598 {
b0d623f7 599 if (fRequestRoot) return fRequestRoot;
39236c6e 600#if NOT_READY
b0d623f7 601 if (fCompletionAction) return (IOPMRequest *) this;
39236c6e 602#endif
7e4a7d39
A
603 return 0;
604 }
b0d623f7
A
605
606 inline uint32_t getType( void ) const
2d21ac55
A
607 {
608 return fType;
609 }
610
b0d623f7 611 inline bool isReplyType( void ) const
2d21ac55
A
612 {
613 return (fType > kIOPMRequestTypeReplyStart);
614 }
615
b0d623f7 616 inline IOService * getTarget( void ) const
2d21ac55
A
617 {
618 return fTarget;
619 }
620
39236c6e 621#if NOT_READY
b0d623f7
A
622 inline bool isCompletionInstalled( void )
623 {
624 return (fCompletionAction != 0);
625 }
2d21ac55 626
b0d623f7
A
627 inline void installCompletionAction(
628 IOPMCompletionAction action,
629 void * target,
630 void * param )
631 {
632 fCompletionAction = action;
633 fCompletionTarget = target;
634 fCompletionParam = param;
635 }
39236c6e 636#endif /* NOT_READY */
2d21ac55 637
b0d623f7
A
638 static IOPMRequest * create( void );
639 bool init( IOService * owner, IOOptionBits type );
640 void reset( void );
6d2010ae
A
641 bool attachNextRequest( IOPMRequest * next );
642 bool detachNextRequest( void );
643 bool attachRootRequest( IOPMRequest * root );
644 bool detachRootRequest( void );
2d21ac55
A
645};
646
6d2010ae
A
647//******************************************************************************
648// IOPMRequestQueue
649//******************************************************************************
650
2d21ac55
A
651class IOPMRequestQueue : public IOEventSource
652{
653 OSDeclareDefaultStructors( IOPMRequestQueue )
654
655public:
656 typedef bool (*Action)( IOService *, IOPMRequest *, IOPMRequestQueue * );
657
658protected:
659 queue_head_t fQueue;
660 IOLock * fLock;
661
662 virtual bool checkForWork( void );
663 virtual void free( void );
664 virtual bool init( IOService * inOwner, Action inAction );
665
666public:
667 static IOPMRequestQueue * create( IOService * inOwner, Action inAction );
668 void queuePMRequest( IOPMRequest * request );
669 void queuePMRequestChain( IOPMRequest ** requests, IOItemCount count );
2d21ac55
A
670};
671
6d2010ae
A
672//******************************************************************************
673// IOPMWorkQueue
674//******************************************************************************
675
676#define WORK_QUEUE_STATS 1
677
2d21ac55
A
678class IOPMWorkQueue : public IOEventSource
679{
680 OSDeclareDefaultStructors( IOPMWorkQueue )
681
682public:
683 typedef bool (*Action)( IOService *, IOPMRequest *, IOPMWorkQueue * );
684
6d2010ae
A
685#if WORK_QUEUE_STATS
686 uint64_t fStatCheckForWork;
687 uint64_t fStatScanEntries;
688 uint64_t fStatQueueEmpty;
689 uint64_t fStatNoWorkDone;
690#endif
691
2d21ac55 692protected:
6d2010ae
A
693 queue_head_t fWorkQueue;
694 Action fWorkAction;
695 Action fRetireAction;
696 uint32_t fQueueLength;
697 uint32_t fConsumerCount;
698 volatile uint32_t fProducerCount;
2d21ac55
A
699
700 virtual bool checkForWork( void );
701 virtual bool init( IOService * inOwner, Action work, Action retire );
6d2010ae 702 bool checkRequestQueue( queue_head_t * queue, bool * empty );
2d21ac55
A
703
704public:
b0d623f7 705 static IOPMWorkQueue * create( IOService * inOwner, Action work, Action retire );
6d2010ae
A
706 bool queuePMRequest( IOPMRequest * request, IOServicePM * pwrMgt );
707 void signalWorkAvailable( void );
708 void incrementProducerCount( void );
b0d623f7
A
709};
710
6d2010ae
A
711//******************************************************************************
712// IOPMCompletionQueue
713//******************************************************************************
714
b0d623f7
A
715class IOPMCompletionQueue : public IOEventSource
716{
717 OSDeclareDefaultStructors( IOPMCompletionQueue )
718
719public:
720 typedef bool (*Action)( IOService *, IOPMRequest *, IOPMCompletionQueue * );
721
722protected:
723 queue_head_t fQueue;
724
725 virtual bool checkForWork( void );
726 virtual bool init( IOService * inOwner, Action inAction );
727
728public:
729 static IOPMCompletionQueue * create( IOService * inOwner, Action inAction );
6d2010ae 730 bool queuePMRequest( IOPMRequest * request );
2d21ac55
A
731};
732
733#endif /* !_IOKIT_IOSERVICEPMPRIVATE_H */