Annotation of XNU/iokit/IOKit/IOServicePM.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: #include <libkern/c++/OSObject.h>
                     23: #include <IOKit/IOLocks.h>
                     24: class IOPMinformee;
                     25: class IOPMinformeeList;
                     26: class IOPMchangeNoteList;
                     27: class IOPMpmChild;
                     28: class IOWorkLoop;
                     29: class IOCommandQueue;
                     30: class IOTimerEventSource;
                     31: class IOPlatformExpert;
                     32: 
                     33: #include <IOKit/pwr_mgt/IOPM.h>
                     34: 
                     35: 
                     36: /*!
                     37: @defined ACK_TIMER_PERIOD
                     38: @discussion When an IOService is waiting for acknowledgement to a power state change
                     39: notification from an interested driver or the controlling driver its ack timer is ticking every tenth of a second.
                     40: (100000000 nanoseconds are one tenth of a second).
                     41: */
                     42:  #define ACK_TIMER_PERIOD 100000000
                     43: 
                     44: 
                     45: /*!
                     46: @defined State machine states
                     47: @discussion The current change note is processed by a state machine.
                     48: Inputs are acks from interested parties, ack from the controlling driver,
                     49: ack timeouts, settle timeout, and powerStateDidChange from the parent.
                     50: */
                     51: #define IOPMour_prechange_1            1
                     52: #define IOPMour_prechange_2            2
                     53: #define IOPMour_prechange_3            3
                     54: #define IOPMour_prechange_4            4
                     55: #define IOPMparent_prechange_down_3    5
                     56: #define IOPMparent_prechange_down_4    6
                     57: #define IOPMparent_prechange_down_5    7
                     58: #define IOPMparent_postchange_down_1   8
                     59: #define IOPMparent_postchange_down_2   9
                     60: #define IOPMparent_prechange_up_1      10
                     61: #define IOPMparent_postchange_up_1     11
                     62: #define IOPMparent_postchange_up_4     12
                     63: #define IOPMparent_postchange_up_5     13
                     64: #define IOPMparent_postchange_up_6     14
                     65: #define IOPMparent_postchange_null     15
                     66: #define IOPMfinished                   16
                     67: 
                     68: /*!
                     69: @class IOPMpriv : public OSObject
                     70: @abstract Private power management private instance variables for IOService objects.
                     71: */
                     72: class IOPMpriv : public OSObject
                     73: {
                     74:     friend class IOService;
                     75: 
                     76:     OSDeclareDefaultStructors(IOPMpriv)
                     77: 
                     78:     public:
                     79: 
                     80: /*! @field we_are_root                 TRUE if this device is the root power domain */
                     81:     bool                       we_are_root;
                     82:     
                     83:     /*! @field interestedDrivers        list of interested drivers */
                     84:     IOPMinformeeList * interestedDrivers;
                     85:     
                     86:     /*! @field children                 list of power domain children */
                     87:     IOPMinformeeList * children;
                     88:     
                     89:     /*! @field numberOfInformees        sum of lengths of driver list and children list */
                     90:     unsigned long              numberOfInformees;
                     91:     
                     92:     /*! @field changeList              list of pending power state changes */
                     93:     IOPMchangeNoteList *       changeList;
                     94:     
                     95:     /*! @field driver_timer            timeout on waiting for controlling driver to acknowledgeSetPowerState */
                     96:     IOReturn           driver_timer;
                     97:     
                     98:     /*! @field machine_state           state number of state machine processing current change note */
                     99:     unsigned long              machine_state;
                    100:     
                    101:     /*! @field settle_time             settle timer after changing power state */
                    102:     unsigned long              settle_time;
                    103:     
                    104:     /*! @field head_note               ordinal of change note currently being processed */
                    105:     long                       head_note;
                    106:     
                    107:     /*! @field head_note_flags copy of flags field in change note currently being processed*/
                    108:     unsigned long              head_note_flags;
                    109: 
                    110:     /*! @field head_note_state copy of newStateNumberfield in change note currently being  processed */
                    111:     unsigned long              head_note_state;
                    112: 
                    113:     /*! @field head_note_outputFlags    outputPowerCharacter field from change note currently being processed */
                    114:     unsigned long              head_note_outputFlags;
                    115: 
                    116:     /*! @field head_note_inputFlags            power domain flags from parent... (only on parent change) */
                    117:     unsigned long              head_note_domainState;
                    118: 
                    119:     /*! @field head_note_capabilityFlags       copy of capabilityFlags field in change note currently being processed */
                    120:     unsigned long              head_note_capabilityFlags;
                    121: 
                    122:     /*! @field head_note_pendingAcks   number of acks we are waiting for during notification */
                    123:     unsigned long              head_note_pendingAcks;
                    124: 
                    125:     /*! @field our_lock                        used to control access to head_note_pendingAcks and driver_timer */
                    126:     IOLock     *               our_lock;
                    127: 
                    128:     /*! @field initial_change                  true forces first state to be broadcast even if it isn't a change */
                    129:     bool                       initial_change;
                    130: 
                    131:     /*! @field need_to_become_usable   someone called makeUsable before we had a controlling driver */
                    132:     bool                       need_to_become_usable;
                    133: 
                    134:     /*! @field device_overrides                state changes are made based only on subclass's desire */
                    135:     bool                       device_overrides;
                    136: 
                    137:     /*! @field owner                   points to object which made this struct.  Used for debug output only */
                    138:     IOService *                owner;
                    139: 
                    140:     /*! @field activityLock                    used to protect activity flag */
                    141:     IOLock *           activityLock;
                    142: 
                    143:     /*! @field timerEventSrc           an idle timer */
                    144:     IOTimerEventSource *       timerEventSrc;
                    145: 
                    146:     /*! @field idle_timer_period               its period in seconds */
                    147:     unsigned long              idle_timer_period;
                    148: 
                    149:     /*! @field device_active                   true: there has been device activity since last idle timer expiration  */
                    150:     bool                       device_active;
                    151: 
                    152:     /*! @field driverDesire
                    153: This is the power state desired by our controlling driver.  It is initialized to myCurrentState and is changed
                    154: when the controlling driver calls changeStateTo.   A change in driverDesire may cause a change in ourDesiredPowerState.
                    155: */
                    156:     unsigned long              driverDesire;
                    157: 
                    158: 
                    159: 
                    160:     /*! @field deviceDesire
                    161: This is the power state desired by a subclassed device object.  It is initialized to myCurrentState and is changed
                    162: when the subclassed object calls changeStateToPriv.  A change in deviceDesire may cause a change in ourDesiredPowerState.
                    163: */
                    164:     unsigned long              deviceDesire;
                    165: 
                    166: 
                    167: 
                    168:     /*! @field ourDesiredPowerState
                    169: This is the power state we desire currently.  If equal to myCurrentState, we're happy.
                    170: Otherwise, we're waiting for the parent to raise the power domain to at least this level.
                    171:     
                    172: If this is a power domain, this is the maximum of all our children's desires, driverDesire, and deviceDesire.
                    173: It increases when:
                    174: a child asks for more power via requestDomainState,
                    175: the controlling driver asks for more power via changeStateTo
                    176: 
                    177: It decreases when:
                    178: we lose a child and the child had the highest power need of all our children,
                    179: the child with the highest power need suggests a lower power domain state,
                    180: the controlling driver asks for lower power for some reason via changeStateTo
                    181: 
                    182: If this is not a power domain, ourDesiredPowerState represents the greater of driverDesire and deviceDesire.
                    183: It increases when:
                    184: the controlling driver asks for more power via changeStateTo
                    185: some driver calls makeUsable
                    186: a subclassed object asks for more power via changeStateToPriv
                    187: 
                    188: It decreases when:
                    189: the controlling driver asks for lower power for some reason via changeStateTo
                    190: a subclassed object asks for lower power for some reason via changeStateToPriv
                    191: */
                    192:     unsigned long              ourDesiredPowerState;
                    193: 
                    194: 
                    195:     /*! @field previousRequest
                    196: This is a reminder of what our parent thinks our need is.  Whenever it changes,
                    197: we call requestDomainState in the parent to keep it current.  It is usually equal to ourDesiredPowerState
                    198: except while a power change is in progress.
                    199: */
                    200:     unsigned long              previousRequest;
                    201: 
                    202: 
                    203:     /*! @field askingFor
                    204: Used by activityTickle so it doesn't try to raise the device to a lower state than
                    205: what it may have previously requested.
                    206: */
                    207:     unsigned long              askingFor;               
                    208: 
                    209: 
                    210:     /*! @field imminentState
                    211: Usually the same as myCurrentState, except right after calling powerStateWillChangeTo.
                    212: */
                    213:     unsigned long              imminentState;
                    214: 
                    215:     /*! @function serialize
                    216: Serialize private instance variables for debug output (IORegistryDumper).
                    217: */
                    218:     virtual bool serialize(OSSerialize *s) const;
                    219: 
                    220: };
                    221: 
                    222: 
                    223: 
                    224: 
                    225: /*!
                    226: @class IOPMprot : public OSObject
                    227: @abstract Protected power management instance variables for IOService objects.
                    228: */
                    229: class IOPMprot : public OSObject //management
                    230: {
                    231:     friend class IOService;
                    232:     
                    233:     OSDeclareDefaultStructors(IOPMprot)
                    234: 
                    235:     public:
                    236: 
                    237:         /*! @field ourName                     from getName(), used in logging */
                    238:     const char *               ourName;
                    239: 
                    240:     /*! @field thePlatform                     from getPlatform, used in logging and registering */
                    241:     IOPlatformExpert *         thePlatform;
                    242: 
                    243:     /*! @field theNumberOfPowerStates  the number of states in the array */
                    244:     unsigned long              theNumberOfPowerStates;                 // the number of states in the array
                    245: 
                    246:     /*! @field thePowerStates          the array */
                    247:     IOPMPowerState     thePowerStates[IOPMMaxPowerStates];
                    248: 
                    249:     /*! @field myParent                         power domain parent */
                    250:     IOService *                myParent;
                    251: 
                    252:     /*! @field theControllingDriver            points to the controlling driver */
                    253:     IOService *                theControllingDriver;
                    254: 
                    255:     /*! @field aggressiveness          current value of power management aggressiveness */
                    256:     unsigned long              aggressiveness;
                    257: 
                    258:     /*! @field myCurrentState          the ordinal of our current power state */
                    259:     unsigned long              myCurrentState;
                    260: 
                    261:     /*! @field parentCurrentPowerFlags the power flags of the current state of the power domain (our parent) */
                    262:     IOPMPowerFlags     parentCurrentPowerFlags;
                    263: 
                    264:     /*! @field maxCapability                   ordinal of highest state we can achieve in current power domain state */
                    265:     unsigned long              maxCapability;
                    266: 
                    267:     /*! @field PMworkloop                      points to the single power management workloop */
                    268:     IOWorkLoop *               PMworkloop;
                    269: 
                    270:     /*! @field commandQueue            used to serialize idle-power-down and busy-power-up */
                    271:     IOCommandQueue *   commandQueue;
                    272: 
                    273:     /*! @function serialize
                    274: Serialize protected instance variables for debug output (IORegistryDumper).
                    275: */
                    276:     virtual bool serialize(OSSerialize *s) const;
                    277: 
                    278: };
                    279: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.