Annotation of XNU/iokit/IOKit/IOServicePM.h, revision 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.