tbxface.c revision 1.4.6.2 1 1.4.6.2 jruoho /******************************************************************************
2 1.4.6.2 jruoho *
3 1.4.6.2 jruoho * Module Name: tbxface - Public interfaces to the ACPI subsystem
4 1.4.6.2 jruoho * ACPI table oriented interfaces
5 1.4.6.2 jruoho *
6 1.4.6.2 jruoho *****************************************************************************/
7 1.4.6.2 jruoho
8 1.4.6.2 jruoho /*
9 1.4.6.2 jruoho * Copyright (C) 2000 - 2011, Intel Corp.
10 1.4.6.2 jruoho * All rights reserved.
11 1.4.6.2 jruoho *
12 1.4.6.2 jruoho * Redistribution and use in source and binary forms, with or without
13 1.4.6.2 jruoho * modification, are permitted provided that the following conditions
14 1.4.6.2 jruoho * are met:
15 1.4.6.2 jruoho * 1. Redistributions of source code must retain the above copyright
16 1.4.6.2 jruoho * notice, this list of conditions, and the following disclaimer,
17 1.4.6.2 jruoho * without modification.
18 1.4.6.2 jruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 1.4.6.2 jruoho * substantially similar to the "NO WARRANTY" disclaimer below
20 1.4.6.2 jruoho * ("Disclaimer") and any redistribution must be conditioned upon
21 1.4.6.2 jruoho * including a substantially similar Disclaimer requirement for further
22 1.4.6.2 jruoho * binary redistribution.
23 1.4.6.2 jruoho * 3. Neither the names of the above-listed copyright holders nor the names
24 1.4.6.2 jruoho * of any contributors may be used to endorse or promote products derived
25 1.4.6.2 jruoho * from this software without specific prior written permission.
26 1.4.6.2 jruoho *
27 1.4.6.2 jruoho * Alternatively, this software may be distributed under the terms of the
28 1.4.6.2 jruoho * GNU General Public License ("GPL") version 2 as published by the Free
29 1.4.6.2 jruoho * Software Foundation.
30 1.4.6.2 jruoho *
31 1.4.6.2 jruoho * NO WARRANTY
32 1.4.6.2 jruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 1.4.6.2 jruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 1.4.6.2 jruoho * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35 1.4.6.2 jruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 1.4.6.2 jruoho * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 1.4.6.2 jruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38 1.4.6.2 jruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 1.4.6.2 jruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 1.4.6.2 jruoho * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41 1.4.6.2 jruoho * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 1.4.6.2 jruoho * POSSIBILITY OF SUCH DAMAGES.
43 1.4.6.2 jruoho */
44 1.4.6.2 jruoho
45 1.4.6.2 jruoho #define __TBXFACE_C__
46 1.4.6.2 jruoho
47 1.4.6.2 jruoho #include "acpi.h"
48 1.4.6.2 jruoho #include "accommon.h"
49 1.4.6.2 jruoho #include "acnamesp.h"
50 1.4.6.2 jruoho #include "actables.h"
51 1.4.6.2 jruoho
52 1.4.6.2 jruoho #define _COMPONENT ACPI_TABLES
53 1.4.6.2 jruoho ACPI_MODULE_NAME ("tbxface")
54 1.4.6.2 jruoho
55 1.4.6.2 jruoho /* Local prototypes */
56 1.4.6.2 jruoho
57 1.4.6.2 jruoho static ACPI_STATUS
58 1.4.6.2 jruoho AcpiTbLoadNamespace (
59 1.4.6.2 jruoho void);
60 1.4.6.2 jruoho
61 1.4.6.2 jruoho
62 1.4.6.2 jruoho /*******************************************************************************
63 1.4.6.2 jruoho *
64 1.4.6.2 jruoho * FUNCTION: AcpiAllocateRootTable
65 1.4.6.2 jruoho *
66 1.4.6.2 jruoho * PARAMETERS: InitialTableCount - Size of InitialTableArray, in number of
67 1.4.6.2 jruoho * ACPI_TABLE_DESC structures
68 1.4.6.2 jruoho *
69 1.4.6.2 jruoho * RETURN: Status
70 1.4.6.2 jruoho *
71 1.4.6.2 jruoho * DESCRIPTION: Allocate a root table array. Used by iASL compiler and
72 1.4.6.2 jruoho * AcpiInitializeTables.
73 1.4.6.2 jruoho *
74 1.4.6.2 jruoho ******************************************************************************/
75 1.4.6.2 jruoho
76 1.4.6.2 jruoho ACPI_STATUS
77 1.4.6.2 jruoho AcpiAllocateRootTable (
78 1.4.6.2 jruoho UINT32 InitialTableCount)
79 1.4.6.2 jruoho {
80 1.4.6.2 jruoho
81 1.4.6.2 jruoho AcpiGbl_RootTableList.MaxTableCount = InitialTableCount;
82 1.4.6.2 jruoho AcpiGbl_RootTableList.Flags = ACPI_ROOT_ALLOW_RESIZE;
83 1.4.6.2 jruoho
84 1.4.6.2 jruoho return (AcpiTbResizeRootTableList ());
85 1.4.6.2 jruoho }
86 1.4.6.2 jruoho
87 1.4.6.2 jruoho
88 1.4.6.2 jruoho /*******************************************************************************
89 1.4.6.2 jruoho *
90 1.4.6.2 jruoho * FUNCTION: AcpiInitializeTables
91 1.4.6.2 jruoho *
92 1.4.6.2 jruoho * PARAMETERS: InitialTableArray - Pointer to an array of pre-allocated
93 1.4.6.2 jruoho * ACPI_TABLE_DESC structures. If NULL, the
94 1.4.6.2 jruoho * array is dynamically allocated.
95 1.4.6.2 jruoho * InitialTableCount - Size of InitialTableArray, in number of
96 1.4.6.2 jruoho * ACPI_TABLE_DESC structures
97 1.4.6.2 jruoho * AllowRealloc - Flag to tell Table Manager if resize of
98 1.4.6.2 jruoho * pre-allocated array is allowed. Ignored
99 1.4.6.2 jruoho * if InitialTableArray is NULL.
100 1.4.6.2 jruoho *
101 1.4.6.2 jruoho * RETURN: Status
102 1.4.6.2 jruoho *
103 1.4.6.2 jruoho * DESCRIPTION: Initialize the table manager, get the RSDP and RSDT/XSDT.
104 1.4.6.2 jruoho *
105 1.4.6.2 jruoho * NOTE: Allows static allocation of the initial table array in order
106 1.4.6.2 jruoho * to avoid the use of dynamic memory in confined environments
107 1.4.6.2 jruoho * such as the kernel boot sequence where it may not be available.
108 1.4.6.2 jruoho *
109 1.4.6.2 jruoho * If the host OS memory managers are initialized, use NULL for
110 1.4.6.2 jruoho * InitialTableArray, and the table will be dynamically allocated.
111 1.4.6.2 jruoho *
112 1.4.6.2 jruoho ******************************************************************************/
113 1.4.6.2 jruoho
114 1.4.6.2 jruoho ACPI_STATUS
115 1.4.6.2 jruoho AcpiInitializeTables (
116 1.4.6.2 jruoho ACPI_TABLE_DESC *InitialTableArray,
117 1.4.6.2 jruoho UINT32 InitialTableCount,
118 1.4.6.2 jruoho BOOLEAN AllowResize)
119 1.4.6.2 jruoho {
120 1.4.6.2 jruoho ACPI_PHYSICAL_ADDRESS RsdpAddress;
121 1.4.6.2 jruoho ACPI_STATUS Status;
122 1.4.6.2 jruoho
123 1.4.6.2 jruoho
124 1.4.6.2 jruoho ACPI_FUNCTION_TRACE (AcpiInitializeTables);
125 1.4.6.2 jruoho
126 1.4.6.2 jruoho
127 1.4.6.2 jruoho /*
128 1.4.6.2 jruoho * Set up the Root Table Array
129 1.4.6.2 jruoho * Allocate the table array if requested
130 1.4.6.2 jruoho */
131 1.4.6.2 jruoho if (!InitialTableArray)
132 1.4.6.2 jruoho {
133 1.4.6.2 jruoho Status = AcpiAllocateRootTable (InitialTableCount);
134 1.4.6.2 jruoho if (ACPI_FAILURE (Status))
135 1.4.6.2 jruoho {
136 1.4.6.2 jruoho return_ACPI_STATUS (Status);
137 1.4.6.2 jruoho }
138 1.4.6.2 jruoho }
139 1.4.6.2 jruoho else
140 1.4.6.2 jruoho {
141 1.4.6.2 jruoho /* Root Table Array has been statically allocated by the host */
142 1.4.6.2 jruoho
143 1.4.6.2 jruoho ACPI_MEMSET (InitialTableArray, 0,
144 1.4.6.2 jruoho (ACPI_SIZE) InitialTableCount * sizeof (ACPI_TABLE_DESC));
145 1.4.6.2 jruoho
146 1.4.6.2 jruoho AcpiGbl_RootTableList.Tables = InitialTableArray;
147 1.4.6.2 jruoho AcpiGbl_RootTableList.MaxTableCount = InitialTableCount;
148 1.4.6.2 jruoho AcpiGbl_RootTableList.Flags = ACPI_ROOT_ORIGIN_UNKNOWN;
149 1.4.6.2 jruoho if (AllowResize)
150 1.4.6.2 jruoho {
151 1.4.6.2 jruoho AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ALLOW_RESIZE;
152 1.4.6.2 jruoho }
153 1.4.6.2 jruoho }
154 1.4.6.2 jruoho
155 1.4.6.2 jruoho /* Get the address of the RSDP */
156 1.4.6.2 jruoho
157 1.4.6.2 jruoho RsdpAddress = AcpiOsGetRootPointer ();
158 1.4.6.2 jruoho if (!RsdpAddress)
159 1.4.6.2 jruoho {
160 1.4.6.2 jruoho return_ACPI_STATUS (AE_NOT_FOUND);
161 1.4.6.2 jruoho }
162 1.4.6.2 jruoho
163 1.4.6.2 jruoho /*
164 1.4.6.2 jruoho * Get the root table (RSDT or XSDT) and extract all entries to the local
165 1.4.6.2 jruoho * Root Table Array. This array contains the information of the RSDT/XSDT
166 1.4.6.2 jruoho * in a common, more useable format.
167 1.4.6.2 jruoho */
168 1.4.6.2 jruoho Status = AcpiTbParseRootTable (RsdpAddress);
169 1.4.6.2 jruoho return_ACPI_STATUS (Status);
170 1.4.6.2 jruoho }
171 1.4.6.2 jruoho
172 1.4.6.2 jruoho ACPI_EXPORT_SYMBOL (AcpiInitializeTables)
173 1.4.6.2 jruoho
174 1.4.6.2 jruoho
175 1.4.6.2 jruoho /*******************************************************************************
176 1.4.6.2 jruoho *
177 1.4.6.2 jruoho * FUNCTION: AcpiReallocateRootTable
178 1.4.6.2 jruoho *
179 1.4.6.2 jruoho * PARAMETERS: None
180 1.4.6.2 jruoho *
181 1.4.6.2 jruoho * RETURN: Status
182 1.4.6.2 jruoho *
183 1.4.6.2 jruoho * DESCRIPTION: Reallocate Root Table List into dynamic memory. Copies the
184 1.4.6.2 jruoho * root list from the previously provided scratch area. Should
185 1.4.6.2 jruoho * be called once dynamic memory allocation is available in the
186 1.4.6.2 jruoho * kernel
187 1.4.6.2 jruoho *
188 1.4.6.2 jruoho ******************************************************************************/
189 1.4.6.2 jruoho
190 1.4.6.2 jruoho ACPI_STATUS
191 1.4.6.2 jruoho AcpiReallocateRootTable (
192 1.4.6.2 jruoho void)
193 1.4.6.2 jruoho {
194 1.4.6.2 jruoho ACPI_TABLE_DESC *Tables;
195 1.4.6.2 jruoho ACPI_SIZE NewSize;
196 1.4.6.2 jruoho ACPI_SIZE CurrentSize;
197 1.4.6.2 jruoho
198 1.4.6.2 jruoho
199 1.4.6.2 jruoho ACPI_FUNCTION_TRACE (AcpiReallocateRootTable);
200 1.4.6.2 jruoho
201 1.4.6.2 jruoho
202 1.4.6.2 jruoho /*
203 1.4.6.2 jruoho * Only reallocate the root table if the host provided a static buffer
204 1.4.6.2 jruoho * for the table array in the call to AcpiInitializeTables.
205 1.4.6.2 jruoho */
206 1.4.6.2 jruoho if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
207 1.4.6.2 jruoho {
208 1.4.6.2 jruoho return_ACPI_STATUS (AE_SUPPORT);
209 1.4.6.2 jruoho }
210 1.4.6.2 jruoho
211 1.4.6.2 jruoho /*
212 1.4.6.2 jruoho * Get the current size of the root table and add the default
213 1.4.6.2 jruoho * increment to create the new table size.
214 1.4.6.2 jruoho */
215 1.4.6.2 jruoho CurrentSize = (ACPI_SIZE)
216 1.4.6.2 jruoho AcpiGbl_RootTableList.CurrentTableCount * sizeof (ACPI_TABLE_DESC);
217 1.4.6.2 jruoho
218 1.4.6.2 jruoho NewSize = CurrentSize +
219 1.4.6.2 jruoho (ACPI_ROOT_TABLE_SIZE_INCREMENT * sizeof (ACPI_TABLE_DESC));
220 1.4.6.2 jruoho
221 1.4.6.2 jruoho /* Create new array and copy the old array */
222 1.4.6.2 jruoho
223 1.4.6.2 jruoho Tables = ACPI_ALLOCATE_ZEROED (NewSize);
224 1.4.6.2 jruoho if (!Tables)
225 1.4.6.2 jruoho {
226 1.4.6.2 jruoho return_ACPI_STATUS (AE_NO_MEMORY);
227 1.4.6.2 jruoho }
228 1.4.6.2 jruoho
229 1.4.6.2 jruoho ACPI_MEMCPY (Tables, AcpiGbl_RootTableList.Tables, CurrentSize);
230 1.4.6.2 jruoho
231 1.4.6.2 jruoho /*
232 1.4.6.2 jruoho * Update the root table descriptor. The new size will be the current
233 1.4.6.2 jruoho * number of tables plus the increment, independent of the reserved
234 1.4.6.2 jruoho * size of the original table list.
235 1.4.6.2 jruoho */
236 1.4.6.2 jruoho AcpiGbl_RootTableList.Tables = Tables;
237 1.4.6.2 jruoho AcpiGbl_RootTableList.MaxTableCount =
238 1.4.6.2 jruoho AcpiGbl_RootTableList.CurrentTableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT;
239 1.4.6.2 jruoho AcpiGbl_RootTableList.Flags =
240 1.4.6.2 jruoho ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE;
241 1.4.6.2 jruoho
242 1.4.6.2 jruoho return_ACPI_STATUS (AE_OK);
243 1.4.6.2 jruoho }
244 1.4.6.2 jruoho
245 1.4.6.2 jruoho ACPI_EXPORT_SYMBOL (AcpiReallocateRootTable)
246 1.4.6.2 jruoho
247 1.4.6.2 jruoho
248 1.4.6.2 jruoho /*******************************************************************************
249 1.4.6.2 jruoho *
250 1.4.6.2 jruoho * FUNCTION: AcpiGetTableHeader
251 1.4.6.2 jruoho *
252 1.4.6.2 jruoho * PARAMETERS: Signature - ACPI signature of needed table
253 1.4.6.2 jruoho * Instance - Which instance (for SSDTs)
254 1.4.6.2 jruoho * OutTableHeader - The pointer to the table header to fill
255 1.4.6.2 jruoho *
256 1.4.6.2 jruoho * RETURN: Status and pointer to mapped table header
257 1.4.6.2 jruoho *
258 1.4.6.2 jruoho * DESCRIPTION: Finds an ACPI table header.
259 1.4.6.2 jruoho *
260 1.4.6.2 jruoho ******************************************************************************/
261 1.4.6.2 jruoho
262 1.4.6.2 jruoho ACPI_STATUS
263 1.4.6.2 jruoho AcpiGetTableHeader (
264 1.4.6.2 jruoho ACPI_CONST_STRING Signature,
265 1.4.6.2 jruoho UINT32 Instance,
266 1.4.6.2 jruoho ACPI_TABLE_HEADER *OutTableHeader)
267 1.4.6.2 jruoho {
268 1.4.6.2 jruoho UINT32 i;
269 1.4.6.2 jruoho UINT32 j;
270 1.4.6.2 jruoho ACPI_TABLE_HEADER *Header;
271 1.4.6.2 jruoho ACPI_STRING USignature = __UNCONST(Signature);
272 1.4.6.2 jruoho
273 1.4.6.2 jruoho /* Parameter validation */
274 1.4.6.2 jruoho
275 1.4.6.2 jruoho if (!Signature || !OutTableHeader)
276 1.4.6.2 jruoho {
277 1.4.6.2 jruoho return (AE_BAD_PARAMETER);
278 1.4.6.2 jruoho }
279 1.4.6.2 jruoho
280 1.4.6.2 jruoho /* Walk the root table list */
281 1.4.6.2 jruoho
282 1.4.6.2 jruoho for (i = 0, j = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
283 1.4.6.2 jruoho {
284 1.4.6.2 jruoho if (!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
285 1.4.6.2 jruoho USignature))
286 1.4.6.2 jruoho {
287 1.4.6.2 jruoho continue;
288 1.4.6.2 jruoho }
289 1.4.6.2 jruoho
290 1.4.6.2 jruoho if (++j < Instance)
291 1.4.6.2 jruoho {
292 1.4.6.2 jruoho continue;
293 1.4.6.2 jruoho }
294 1.4.6.2 jruoho
295 1.4.6.2 jruoho if (!AcpiGbl_RootTableList.Tables[i].Pointer)
296 1.4.6.2 jruoho {
297 1.4.6.2 jruoho if ((AcpiGbl_RootTableList.Tables[i].Flags &
298 1.4.6.2 jruoho ACPI_TABLE_ORIGIN_MASK) ==
299 1.4.6.2 jruoho ACPI_TABLE_ORIGIN_MAPPED)
300 1.4.6.2 jruoho {
301 1.4.6.2 jruoho Header = AcpiOsMapMemory (
302 1.4.6.2 jruoho AcpiGbl_RootTableList.Tables[i].Address,
303 1.4.6.2 jruoho sizeof (ACPI_TABLE_HEADER));
304 1.4.6.2 jruoho if (!Header)
305 1.4.6.2 jruoho {
306 1.4.6.2 jruoho return AE_NO_MEMORY;
307 1.4.6.2 jruoho }
308 1.4.6.2 jruoho
309 1.4.6.2 jruoho ACPI_MEMCPY (OutTableHeader, Header, sizeof(ACPI_TABLE_HEADER));
310 1.4.6.2 jruoho AcpiOsUnmapMemory (Header, sizeof(ACPI_TABLE_HEADER));
311 1.4.6.2 jruoho }
312 1.4.6.2 jruoho else
313 1.4.6.2 jruoho {
314 1.4.6.2 jruoho return AE_NOT_FOUND;
315 1.4.6.2 jruoho }
316 1.4.6.2 jruoho }
317 1.4.6.2 jruoho else
318 1.4.6.2 jruoho {
319 1.4.6.2 jruoho ACPI_MEMCPY (OutTableHeader,
320 1.4.6.2 jruoho AcpiGbl_RootTableList.Tables[i].Pointer,
321 1.4.6.2 jruoho sizeof(ACPI_TABLE_HEADER));
322 1.4.6.2 jruoho }
323 1.4.6.2 jruoho
324 1.4.6.2 jruoho return (AE_OK);
325 1.4.6.2 jruoho }
326 1.4.6.2 jruoho
327 1.4.6.2 jruoho return (AE_NOT_FOUND);
328 1.4.6.2 jruoho }
329 1.4.6.2 jruoho
330 1.4.6.2 jruoho ACPI_EXPORT_SYMBOL (AcpiGetTableHeader)
331 1.4.6.2 jruoho
332 1.4.6.2 jruoho
333 1.4.6.2 jruoho /*******************************************************************************
334 1.4.6.2 jruoho *
335 1.4.6.2 jruoho * FUNCTION: AcpiGetTable
336 1.4.6.2 jruoho *
337 1.4.6.2 jruoho * PARAMETERS: Signature - ACPI signature of needed table
338 1.4.6.2 jruoho * Instance - Which instance (for SSDTs)
339 1.4.6.2 jruoho * OutTable - Where the pointer to the table is returned
340 1.4.6.2 jruoho *
341 1.4.6.2 jruoho * RETURN: Status and pointer to table
342 1.4.6.2 jruoho *
343 1.4.6.2 jruoho * DESCRIPTION: Finds and verifies an ACPI table.
344 1.4.6.2 jruoho *
345 1.4.6.2 jruoho ******************************************************************************/
346 1.4.6.2 jruoho
347 1.4.6.2 jruoho ACPI_STATUS
348 1.4.6.2 jruoho AcpiGetTable (
349 1.4.6.2 jruoho ACPI_CONST_STRING Signature,
350 1.4.6.2 jruoho UINT32 Instance,
351 1.4.6.2 jruoho ACPI_TABLE_HEADER **OutTable)
352 1.4.6.2 jruoho {
353 1.4.6.2 jruoho UINT32 i;
354 1.4.6.2 jruoho UINT32 j;
355 1.4.6.2 jruoho ACPI_STATUS Status;
356 1.4.6.2 jruoho ACPI_STRING USignature = __UNCONST(Signature);
357 1.4.6.2 jruoho
358 1.4.6.2 jruoho /* Parameter validation */
359 1.4.6.2 jruoho
360 1.4.6.2 jruoho if (!Signature || !OutTable)
361 1.4.6.2 jruoho {
362 1.4.6.2 jruoho return (AE_BAD_PARAMETER);
363 1.4.6.2 jruoho }
364 1.4.6.2 jruoho
365 1.4.6.2 jruoho /* Walk the root table list */
366 1.4.6.2 jruoho
367 1.4.6.2 jruoho for (i = 0, j = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
368 1.4.6.2 jruoho {
369 1.4.6.2 jruoho if (!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
370 1.4.6.2 jruoho USignature))
371 1.4.6.2 jruoho {
372 1.4.6.2 jruoho continue;
373 1.4.6.2 jruoho }
374 1.4.6.2 jruoho
375 1.4.6.2 jruoho if (++j < Instance)
376 1.4.6.2 jruoho {
377 1.4.6.2 jruoho continue;
378 1.4.6.2 jruoho }
379 1.4.6.2 jruoho
380 1.4.6.2 jruoho Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i]);
381 1.4.6.2 jruoho if (ACPI_SUCCESS (Status))
382 1.4.6.2 jruoho {
383 1.4.6.2 jruoho *OutTable = AcpiGbl_RootTableList.Tables[i].Pointer;
384 1.4.6.2 jruoho }
385 1.4.6.2 jruoho
386 1.4.6.2 jruoho return (Status);
387 1.4.6.2 jruoho }
388 1.4.6.2 jruoho
389 1.4.6.2 jruoho return (AE_NOT_FOUND);
390 1.4.6.2 jruoho }
391 1.4.6.2 jruoho
392 1.4.6.2 jruoho ACPI_EXPORT_SYMBOL (AcpiGetTable)
393 1.4.6.2 jruoho
394 1.4.6.2 jruoho
395 1.4.6.2 jruoho /*******************************************************************************
396 1.4.6.2 jruoho *
397 1.4.6.2 jruoho * FUNCTION: AcpiGetTableByIndex
398 1.4.6.2 jruoho *
399 1.4.6.2 jruoho * PARAMETERS: TableIndex - Table index
400 1.4.6.2 jruoho * Table - Where the pointer to the table is returned
401 1.4.6.2 jruoho *
402 1.4.6.2 jruoho * RETURN: Status and pointer to the table
403 1.4.6.2 jruoho *
404 1.4.6.2 jruoho * DESCRIPTION: Obtain a table by an index into the global table list.
405 1.4.6.2 jruoho *
406 1.4.6.2 jruoho ******************************************************************************/
407 1.4.6.2 jruoho
408 1.4.6.2 jruoho ACPI_STATUS
409 1.4.6.2 jruoho AcpiGetTableByIndex (
410 1.4.6.2 jruoho UINT32 TableIndex,
411 1.4.6.2 jruoho ACPI_TABLE_HEADER **Table)
412 1.4.6.2 jruoho {
413 1.4.6.2 jruoho ACPI_STATUS Status;
414 1.4.6.2 jruoho
415 1.4.6.2 jruoho
416 1.4.6.2 jruoho ACPI_FUNCTION_TRACE (AcpiGetTableByIndex);
417 1.4.6.2 jruoho
418 1.4.6.2 jruoho
419 1.4.6.2 jruoho /* Parameter validation */
420 1.4.6.2 jruoho
421 1.4.6.2 jruoho if (!Table)
422 1.4.6.2 jruoho {
423 1.4.6.2 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER);
424 1.4.6.2 jruoho }
425 1.4.6.2 jruoho
426 1.4.6.2 jruoho (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
427 1.4.6.2 jruoho
428 1.4.6.2 jruoho /* Validate index */
429 1.4.6.2 jruoho
430 1.4.6.2 jruoho if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
431 1.4.6.2 jruoho {
432 1.4.6.2 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
433 1.4.6.2 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER);
434 1.4.6.2 jruoho }
435 1.4.6.2 jruoho
436 1.4.6.2 jruoho if (!AcpiGbl_RootTableList.Tables[TableIndex].Pointer)
437 1.4.6.2 jruoho {
438 1.4.6.2 jruoho /* Table is not mapped, map it */
439 1.4.6.2 jruoho
440 1.4.6.2 jruoho Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[TableIndex]);
441 1.4.6.2 jruoho if (ACPI_FAILURE (Status))
442 1.4.6.2 jruoho {
443 1.4.6.2 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
444 1.4.6.2 jruoho return_ACPI_STATUS (Status);
445 1.4.6.2 jruoho }
446 1.4.6.2 jruoho }
447 1.4.6.2 jruoho
448 1.4.6.2 jruoho *Table = AcpiGbl_RootTableList.Tables[TableIndex].Pointer;
449 1.4.6.2 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
450 1.4.6.2 jruoho return_ACPI_STATUS (AE_OK);
451 1.4.6.2 jruoho }
452 1.4.6.2 jruoho
453 1.4.6.2 jruoho ACPI_EXPORT_SYMBOL (AcpiGetTableByIndex)
454 1.4.6.2 jruoho
455 1.4.6.2 jruoho
456 1.4.6.2 jruoho /*******************************************************************************
457 1.4.6.2 jruoho *
458 1.4.6.2 jruoho * FUNCTION: AcpiTbLoadNamespace
459 1.4.6.2 jruoho *
460 1.4.6.2 jruoho * PARAMETERS: None
461 1.4.6.2 jruoho *
462 1.4.6.2 jruoho * RETURN: Status
463 1.4.6.2 jruoho *
464 1.4.6.2 jruoho * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
465 1.4.6.2 jruoho * the RSDT/XSDT.
466 1.4.6.2 jruoho *
467 1.4.6.2 jruoho ******************************************************************************/
468 1.4.6.2 jruoho
469 1.4.6.2 jruoho static ACPI_STATUS
470 1.4.6.2 jruoho AcpiTbLoadNamespace (
471 1.4.6.2 jruoho void)
472 1.4.6.2 jruoho {
473 1.4.6.2 jruoho ACPI_STATUS Status;
474 1.4.6.2 jruoho UINT32 i;
475 1.4.6.2 jruoho ACPI_TABLE_HEADER *NewDsdt;
476 1.4.6.2 jruoho
477 1.4.6.2 jruoho
478 1.4.6.2 jruoho ACPI_FUNCTION_TRACE (TbLoadNamespace);
479 1.4.6.2 jruoho
480 1.4.6.2 jruoho
481 1.4.6.2 jruoho (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
482 1.4.6.2 jruoho
483 1.4.6.2 jruoho /*
484 1.4.6.2 jruoho * Load the namespace. The DSDT is required, but any SSDT and
485 1.4.6.2 jruoho * PSDT tables are optional. Verify the DSDT.
486 1.4.6.2 jruoho */
487 1.4.6.2 jruoho if (!AcpiGbl_RootTableList.CurrentTableCount ||
488 1.4.6.2 jruoho !ACPI_COMPARE_NAME (
489 1.4.6.2 jruoho &(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature),
490 1.4.6.2 jruoho ACPI_SIG_DSDT) ||
491 1.4.6.2 jruoho ACPI_FAILURE (AcpiTbVerifyTable (
492 1.4.6.2 jruoho &AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT])))
493 1.4.6.2 jruoho {
494 1.4.6.2 jruoho Status = AE_NO_ACPI_TABLES;
495 1.4.6.2 jruoho goto UnlockAndExit;
496 1.4.6.2 jruoho }
497 1.4.6.2 jruoho
498 1.4.6.2 jruoho /*
499 1.4.6.2 jruoho * Save the DSDT pointer for simple access. This is the mapped memory
500 1.4.6.2 jruoho * address. We must take care here because the address of the .Tables
501 1.4.6.2 jruoho * array can change dynamically as tables are loaded at run-time. Note:
502 1.4.6.2 jruoho * .Pointer field is not validated until after call to AcpiTbVerifyTable.
503 1.4.6.2 jruoho */
504 1.4.6.2 jruoho AcpiGbl_DSDT = AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer;
505 1.4.6.2 jruoho
506 1.4.6.2 jruoho /*
507 1.4.6.2 jruoho * Optionally copy the entire DSDT to local memory (instead of simply
508 1.4.6.2 jruoho * mapping it.) There are some BIOSs that corrupt or replace the original
509 1.4.6.2 jruoho * DSDT, creating the need for this option. Default is FALSE, do not copy
510 1.4.6.2 jruoho * the DSDT.
511 1.4.6.2 jruoho */
512 1.4.6.2 jruoho if (AcpiGbl_CopyDsdtLocally)
513 1.4.6.2 jruoho {
514 1.4.6.2 jruoho NewDsdt = AcpiTbCopyDsdt (ACPI_TABLE_INDEX_DSDT);
515 1.4.6.2 jruoho if (NewDsdt)
516 1.4.6.2 jruoho {
517 1.4.6.2 jruoho AcpiGbl_DSDT = NewDsdt;
518 1.4.6.2 jruoho }
519 1.4.6.2 jruoho }
520 1.4.6.2 jruoho
521 1.4.6.2 jruoho /*
522 1.4.6.2 jruoho * Save the original DSDT header for detection of table corruption
523 1.4.6.2 jruoho * and/or replacement of the DSDT from outside the OS.
524 1.4.6.2 jruoho */
525 1.4.6.2 jruoho ACPI_MEMCPY (&AcpiGbl_OriginalDsdtHeader, AcpiGbl_DSDT,
526 1.4.6.2 jruoho sizeof (ACPI_TABLE_HEADER));
527 1.4.6.2 jruoho
528 1.4.6.2 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
529 1.4.6.2 jruoho
530 1.4.6.2 jruoho /* Load and parse tables */
531 1.4.6.2 jruoho
532 1.4.6.2 jruoho Status = AcpiNsLoadTable (ACPI_TABLE_INDEX_DSDT, AcpiGbl_RootNode);
533 1.4.6.2 jruoho if (ACPI_FAILURE (Status))
534 1.4.6.2 jruoho {
535 1.4.6.2 jruoho return_ACPI_STATUS (Status);
536 1.4.6.2 jruoho }
537 1.4.6.2 jruoho
538 1.4.6.2 jruoho /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
539 1.4.6.2 jruoho
540 1.4.6.2 jruoho (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
541 1.4.6.2 jruoho for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
542 1.4.6.2 jruoho {
543 1.4.6.2 jruoho if ((!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
544 1.4.6.2 jruoho ACPI_SIG_SSDT) &&
545 1.4.6.2 jruoho !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
546 1.4.6.2 jruoho ACPI_SIG_PSDT)) ||
547 1.4.6.2 jruoho ACPI_FAILURE (AcpiTbVerifyTable (
548 1.4.6.2 jruoho &AcpiGbl_RootTableList.Tables[i])))
549 1.4.6.2 jruoho {
550 1.4.6.2 jruoho continue;
551 1.4.6.2 jruoho }
552 1.4.6.2 jruoho
553 1.4.6.2 jruoho /* Ignore errors while loading tables, get as many as possible */
554 1.4.6.2 jruoho
555 1.4.6.2 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
556 1.4.6.2 jruoho (void) AcpiNsLoadTable (i, AcpiGbl_RootNode);
557 1.4.6.2 jruoho (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
558 1.4.6.2 jruoho }
559 1.4.6.2 jruoho
560 1.4.6.2 jruoho ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
561 1.4.6.2 jruoho
562 1.4.6.2 jruoho UnlockAndExit:
563 1.4.6.2 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
564 1.4.6.2 jruoho return_ACPI_STATUS (Status);
565 1.4.6.2 jruoho }
566 1.4.6.2 jruoho
567 1.4.6.2 jruoho
568 1.4.6.2 jruoho /*******************************************************************************
569 1.4.6.2 jruoho *
570 1.4.6.2 jruoho * FUNCTION: AcpiLoadTables
571 1.4.6.2 jruoho *
572 1.4.6.2 jruoho * PARAMETERS: None
573 1.4.6.2 jruoho *
574 1.4.6.2 jruoho * RETURN: Status
575 1.4.6.2 jruoho *
576 1.4.6.2 jruoho * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
577 1.4.6.2 jruoho *
578 1.4.6.2 jruoho ******************************************************************************/
579 1.4.6.2 jruoho
580 1.4.6.2 jruoho ACPI_STATUS
581 1.4.6.2 jruoho AcpiLoadTables (
582 1.4.6.2 jruoho void)
583 1.4.6.2 jruoho {
584 1.4.6.2 jruoho ACPI_STATUS Status;
585 1.4.6.2 jruoho
586 1.4.6.2 jruoho
587 1.4.6.2 jruoho ACPI_FUNCTION_TRACE (AcpiLoadTables);
588 1.4.6.2 jruoho
589 1.4.6.2 jruoho
590 1.4.6.2 jruoho /* Load the namespace from the tables */
591 1.4.6.2 jruoho
592 1.4.6.2 jruoho Status = AcpiTbLoadNamespace ();
593 1.4.6.2 jruoho if (ACPI_FAILURE (Status))
594 1.4.6.2 jruoho {
595 1.4.6.2 jruoho ACPI_EXCEPTION ((AE_INFO, Status,
596 1.4.6.2 jruoho "While loading namespace from ACPI tables"));
597 1.4.6.2 jruoho }
598 1.4.6.2 jruoho
599 1.4.6.2 jruoho return_ACPI_STATUS (Status);
600 1.4.6.2 jruoho }
601 1.4.6.2 jruoho
602 1.4.6.2 jruoho ACPI_EXPORT_SYMBOL (AcpiLoadTables)
603 1.4.6.2 jruoho
604 1.4.6.2 jruoho
605 1.4.6.2 jruoho /*******************************************************************************
606 1.4.6.2 jruoho *
607 1.4.6.2 jruoho * FUNCTION: AcpiInstallTableHandler
608 1.4.6.2 jruoho *
609 1.4.6.2 jruoho * PARAMETERS: Handler - Table event handler
610 1.4.6.2 jruoho * Context - Value passed to the handler on each event
611 1.4.6.2 jruoho *
612 1.4.6.2 jruoho * RETURN: Status
613 1.4.6.2 jruoho *
614 1.4.6.2 jruoho * DESCRIPTION: Install table event handler
615 1.4.6.2 jruoho *
616 1.4.6.2 jruoho ******************************************************************************/
617 1.4.6.2 jruoho
618 1.4.6.2 jruoho ACPI_STATUS
619 1.4.6.2 jruoho AcpiInstallTableHandler (
620 1.4.6.2 jruoho ACPI_TABLE_HANDLER Handler,
621 1.4.6.2 jruoho void *Context)
622 1.4.6.2 jruoho {
623 1.4.6.2 jruoho ACPI_STATUS Status;
624 1.4.6.2 jruoho
625 1.4.6.2 jruoho
626 1.4.6.2 jruoho ACPI_FUNCTION_TRACE (AcpiInstallTableHandler);
627 1.4.6.2 jruoho
628 1.4.6.2 jruoho
629 1.4.6.2 jruoho if (!Handler)
630 1.4.6.2 jruoho {
631 1.4.6.2 jruoho return_ACPI_STATUS (AE_BAD_PARAMETER);
632 1.4.6.2 jruoho }
633 1.4.6.2 jruoho
634 1.4.6.2 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
635 1.4.6.2 jruoho if (ACPI_FAILURE (Status))
636 1.4.6.2 jruoho {
637 1.4.6.2 jruoho return_ACPI_STATUS (Status);
638 1.4.6.2 jruoho }
639 1.4.6.2 jruoho
640 1.4.6.2 jruoho /* Don't allow more than one handler */
641 1.4.6.2 jruoho
642 1.4.6.2 jruoho if (AcpiGbl_TableHandler)
643 1.4.6.2 jruoho {
644 1.4.6.2 jruoho Status = AE_ALREADY_EXISTS;
645 1.4.6.2 jruoho goto Cleanup;
646 1.4.6.2 jruoho }
647 1.4.6.2 jruoho
648 1.4.6.2 jruoho /* Install the handler */
649 1.4.6.2 jruoho
650 1.4.6.2 jruoho AcpiGbl_TableHandler = Handler;
651 1.4.6.2 jruoho AcpiGbl_TableHandlerContext = Context;
652 1.4.6.2 jruoho
653 1.4.6.2 jruoho Cleanup:
654 1.4.6.2 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
655 1.4.6.2 jruoho return_ACPI_STATUS (Status);
656 1.4.6.2 jruoho }
657 1.4.6.2 jruoho
658 1.4.6.2 jruoho ACPI_EXPORT_SYMBOL (AcpiInstallTableHandler)
659 1.4.6.2 jruoho
660 1.4.6.2 jruoho
661 1.4.6.2 jruoho /*******************************************************************************
662 1.4.6.2 jruoho *
663 1.4.6.2 jruoho * FUNCTION: AcpiRemoveTableHandler
664 1.4.6.2 jruoho *
665 1.4.6.2 jruoho * PARAMETERS: Handler - Table event handler that was installed
666 1.4.6.2 jruoho * previously.
667 1.4.6.2 jruoho *
668 1.4.6.2 jruoho * RETURN: Status
669 1.4.6.2 jruoho *
670 1.4.6.2 jruoho * DESCRIPTION: Remove table event handler
671 1.4.6.2 jruoho *
672 1.4.6.2 jruoho ******************************************************************************/
673 1.4.6.2 jruoho
674 1.4.6.2 jruoho ACPI_STATUS
675 1.4.6.2 jruoho AcpiRemoveTableHandler (
676 1.4.6.2 jruoho ACPI_TABLE_HANDLER Handler)
677 1.4.6.2 jruoho {
678 1.4.6.2 jruoho ACPI_STATUS Status;
679 1.4.6.2 jruoho
680 1.4.6.2 jruoho
681 1.4.6.2 jruoho ACPI_FUNCTION_TRACE (AcpiRemoveTableHandler);
682 1.4.6.2 jruoho
683 1.4.6.2 jruoho
684 1.4.6.2 jruoho Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
685 1.4.6.2 jruoho if (ACPI_FAILURE (Status))
686 1.4.6.2 jruoho {
687 1.4.6.2 jruoho return_ACPI_STATUS (Status);
688 1.4.6.2 jruoho }
689 1.4.6.2 jruoho
690 1.4.6.2 jruoho /* Make sure that the installed handler is the same */
691 1.4.6.2 jruoho
692 1.4.6.2 jruoho if (!Handler ||
693 1.4.6.2 jruoho Handler != AcpiGbl_TableHandler)
694 1.4.6.2 jruoho {
695 1.4.6.2 jruoho Status = AE_BAD_PARAMETER;
696 1.4.6.2 jruoho goto Cleanup;
697 1.4.6.2 jruoho }
698 1.4.6.2 jruoho
699 1.4.6.2 jruoho /* Remove the handler */
700 1.4.6.2 jruoho
701 1.4.6.2 jruoho AcpiGbl_TableHandler = NULL;
702 1.4.6.2 jruoho
703 1.4.6.2 jruoho Cleanup:
704 1.4.6.2 jruoho (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
705 1.4.6.2 jruoho return_ACPI_STATUS (Status);
706 1.4.6.2 jruoho }
707 1.4.6.2 jruoho
708 1.4.6.2 jruoho ACPI_EXPORT_SYMBOL (AcpiRemoveTableHandler)
709 1.4.6.2 jruoho
710