|
|
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/IOReturn.h> ! 24: ! 25: // This is a list of State Changes which are in progress. Its purpose is to keep track of the ! 26: // notifications and acknowledgements caused by state change. A change is added to the list ! 27: // when either our parent notifies us that the power domain is changing state or when we decide ! 28: // to change power to our device or domain. ! 29: // ! 30: // A change is removed from the list when all interested parties have been informed of the upcoming ! 31: // change, all of them have acknowledged the notification, the change has been made, all interested ! 32: // parties have been informed that the change was made, and all of them have acknowledged. ! 33: // ! 34: // The list is strictly first-in, first-out. It is implemented as a circular list in a linear ! 35: // array. There are two pointers into the array. The circular list is empty when these two ! 36: // pointers are equal. ! 37: ! 38: // More specifically, a change note is put into the array when one of these things happens: ! 39: // the device decides it is idle and needs to reduce power. (changeStateTo) ! 40: // the device decides it is not idle and needs to increase power. (changeStateTo) ! 41: // the controlling driver requests a state change. (changeStateTo) ! 42: // some client needs to use the device but it is powered down. (makeUsable) ! 43: // the parent says the domain power is changing. (powerStateWillChangeTo) ! 44: // a child says it no longer needs power, and all other children are similarly idle. (requestDomainState) ! 45: //. a child wants more power in the domain so it can raise its power state. (requestDomainState) ! 46: // ! 47: // A change note is removed from the array when all interested drivers and power domain ! 48: // children have acknowledged the change. ! 49: ! 50: // Each change note contains: ! 51: // A flag field which describes the change. ! 52: // Which power state the device will be in after the change. ! 53: // The power flags which describe the result of this change. ! 54: ! 55: struct changeNoteItem{ ! 56: unsigned long flags; ! 57: unsigned long newStateNumber; ! 58: IOPMPowerFlags outputPowerCharacter; ! 59: IOPMPowerFlags inputPowerRequirement; ! 60: IOPMPowerFlags domainState; ! 61: IOPMPowerFlags capabilityFlags; ! 62: }; ! 63: ! 64: typedef struct changeNoteItem changeNoteItem; ! 65: ! 66: ! 67: // flags field ! 68: ! 69: #define IOPMParentInitiated 1 // this power change initiated by our parent ! 70: #define IOPMWeInitiated 2 // this power change initiated by this device (not parent) ! 71: #define IOPMNotDone 4 // we couldn't make this change ! 72: #define IOPMNotInUse 8 // this list element not currently in use ! 73: ! 74: ! 75: // Length of change note list is maximum 5. There cannot be two adjacent device-initiated change notes unless ! 76: // one is currently being actioned, because two adjacent in-active device-initiated changes are always collapsed ! 77: // into one, and there cannot be more than two parent-initiated change notes in the queue, because the parent does not ! 78: // initiate a change (by calling domainStateWillChange) until everybody has acknowledged the previous one ! 79: // (by calling domainStateDidChange), although if we are the last to send that acknowledgement, the change we ! 80: // are acknowledging will still be in the queue as we acknowledge, and at that point the parent can give us another ! 81: // (by callingdomainStateWillChange). So we need room for two parent changes, two non-adjacent device changes, ! 82: // and room for one more device change to get into the queue before collapsing it with its neighbor. Or, we need ! 83: // room for two adjacent device changes (one in progress), a parent change, another device change, and room for ! 84: // one more device change to get into the queue before collapsing it with its neighbor. Five entries in either case. ! 85: // I'm not sure what irrationallity causes me to code for ten entries in the queue. ! 86: #define IOPMMaxChangeNotes 10 ! 87: ! 88: class IOPMchangeNoteList :public OSObject ! 89: { ! 90: OSDeclareDefaultStructors(IOPMchangeNoteList) ! 91: ! 92: private: ! 93: unsigned long firstInList; // points to oldest active change note in list ! 94: unsigned long firstUnused; // points just beyond newest change note in list ! 95: ! 96: public: ! 97: ! 98: changeNoteItem changeNote[IOPMMaxChangeNotes]; ! 99: ! 100: ! 101: void initialize ( void ); ! 102: ! 103: long createChangeNote ( void ); ! 104: ! 105: long currentChange ( void ); ! 106: ! 107: long latestChange ( void ); ! 108: ! 109: IOReturn releaseHeadChangeNote ( void ); ! 110: ! 111: IOReturn releaseTailChangeNote ( void ); ! 112: ! 113: bool changeNoteInUse ( unsigned long ordinal ); ! 114: ! 115: long nextChangeNote ( unsigned long ordinal ); ! 116: ! 117: unsigned long increment (unsigned long ordinal ); ! 118: ! 119: unsigned long decrement (unsigned long ordinal ); ! 120: ! 121: long previousChangeNote (unsigned long ordinal ); ! 122: ! 123: bool listEmpty ( void ); ! 124: ! 125: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.