]> git.saurik.com Git - apple/xnu.git/blame - iokit/Kernel/IOPMchangeNoteList.cpp
xnu-201.14.tar.gz
[apple/xnu.git] / iokit / Kernel / IOPMchangeNoteList.cpp
CommitLineData
1c79356b
A
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 <IOKit/pwr_mgt/IOPM.h>
23#include <IOKit/pwr_mgt/IOPMchangeNoteList.h>
24
25#define super OSObject
26OSDefineMetaClassAndStructors(IOPMchangeNoteList,OSObject)
27
28//*********************************************************************************
29// init
30//
31//*********************************************************************************
32void IOPMchangeNoteList::initialize ( void )
33{
34 long i;
35
36 firstInList = 0;
37 firstUnused = 0;
38 for ( i = 0; i < IOPMMaxChangeNotes; i++ ) {
39 changeNote[i].flags = IOPMNotInUse;
40 }
41}
42
43//*********************************************************************************
44// createChangeNote
45//
46//*********************************************************************************
47
48long IOPMchangeNoteList::createChangeNote ( void )
49{
50 unsigned long i, j;
51
52 i = increment(firstUnused);
53 if ( firstInList == i ) {
54 return -1;
55 }
56 j = firstUnused;
57 firstUnused = i;
58
59 return j;
60}
61
62//*********************************************************************************
63// currentChange
64//
65// Return the ordinal of the first change note in the list.
66// If the list is empty, return -1.
67//*********************************************************************************
68
69long IOPMchangeNoteList::currentChange ( void )
70{
71 if ( firstUnused == firstInList ) {
72 return -1;
73 }
74 else {
75 return firstInList;
76 }
77}
78
79//*********************************************************************************
80// latestChange
81//
82// Return the ordinal of the last change note in the list.
83// If the list is empty, return -1.
84//*********************************************************************************
85
86long IOPMchangeNoteList::latestChange ( void )
87{
88 if ( firstUnused == firstInList ) {
89 return -1;
90 }
91 else {
92 return decrement(firstUnused);
93 }
94}
95
96//*********************************************************************************
97// releaseHeadChangeNote
98//
99// Mark the head node unused.
100// This happens when the first change in the list is completely processed.
101// That is, all interested parties have acknowledged it, and power is settled
102// at the new level.
103//*********************************************************************************
104
105IOReturn IOPMchangeNoteList::releaseHeadChangeNote ( void )
106{
107 changeNote[firstInList].flags = IOPMNotInUse;
108 firstInList = increment(firstInList);
109 return IOPMNoErr;
110}
111
112//*********************************************************************************
113// releaseTailChangeNote
114//
115// Mark the tail node unused.
116// This happens when a power change is queued up after another which has
117// not yet been started, and the second one supercedes the first. The data in
118// the second is copied into the first and the the second is released. This
119// collapses the first change out of the list.
120//*********************************************************************************
121
122IOReturn IOPMchangeNoteList::releaseTailChangeNote ( void )
123{
124 firstUnused = decrement(firstUnused);
125 changeNote[firstUnused].flags = IOPMNotInUse;
126 return IOPMNoErr;
127}
128
129//*********************************************************************************
130// changeNoteInUse
131//
132//*********************************************************************************
133
134bool IOPMchangeNoteList::changeNoteInUse ( unsigned long ordinal )
135{
136 if ( changeNote[ordinal].flags == IOPMNotInUse ) {
137 return false;
138 }
139 else {
140 return true;
141 }
142}
143
144//*********************************************************************************
145// nextChangeNote
146//
147// If the parameter corresponds to the most recent power change notification
148// passed to drivers and children, return -1. Otherwise, return the array
149// position of the next notification in the circular list.
150//*********************************************************************************
151
152long IOPMchangeNoteList::nextChangeNote ( unsigned long ordinal )
153{
154 unsigned long i;
155
156 i = increment(ordinal);
157 if ( i == firstUnused) {
158 return -1;
159 }
160 return ( i );
161}
162
163//*********************************************************************************
164// increment
165//
166// Increment the parameter mod the circular list size and return it.
167//*********************************************************************************
168
169unsigned long IOPMchangeNoteList::increment ( unsigned long ordinal )
170{
171 if ( ordinal == (IOPMMaxChangeNotes - 1) ) {
172 return 0;
173 }
174 else {
175 return ordinal + 1;
176 }
177}
178
179//*********************************************************************************
180// decrement
181//
182// Decrement the parameter mod the circular list size and return it.
183//*********************************************************************************
184
185unsigned long IOPMchangeNoteList::decrement ( unsigned long ordinal )
186{
187 if ( ordinal == 0 ) {
188 return IOPMMaxChangeNotes - 1;
189 }
190 else {
191 return ordinal - 1;
192 }
193}
194
195//*********************************************************************************
196// previousChangeNote
197//
198// If the parameter corresponds to the oldest power change notification
199// passed to drivers and children, return -1. Otherwise, return the array
200// position of the previous notification in the circular list.
201//*********************************************************************************
202
203long IOPMchangeNoteList::previousChangeNote ( unsigned long ordinal )
204{
205 if ( ordinal == firstInList ) {
206 return -1;
207 }
208 return decrement(ordinal);
209}
210
211//*********************************************************************************
212// listEmpty
213//
214//*********************************************************************************
215
216bool IOPMchangeNoteList::listEmpty ( void )
217{
218 return ( firstInList == firstUnused ) ;
219}