dttable.c revision 1.1.1.3.2.1 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: dttable.c - handling for specific ACPI tables
4 1.1 jruoho *
5 1.1 jruoho *****************************************************************************/
6 1.1 jruoho
7 1.1.1.2 jruoho /*
8 1.1.1.3.2.1 yamt * Copyright (C) 2000 - 2013, Intel Corp.
9 1.1 jruoho * All rights reserved.
10 1.1 jruoho *
11 1.1.1.2 jruoho * Redistribution and use in source and binary forms, with or without
12 1.1.1.2 jruoho * modification, are permitted provided that the following conditions
13 1.1.1.2 jruoho * are met:
14 1.1.1.2 jruoho * 1. Redistributions of source code must retain the above copyright
15 1.1.1.2 jruoho * notice, this list of conditions, and the following disclaimer,
16 1.1.1.2 jruoho * without modification.
17 1.1.1.2 jruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 1.1.1.2 jruoho * substantially similar to the "NO WARRANTY" disclaimer below
19 1.1.1.2 jruoho * ("Disclaimer") and any redistribution must be conditioned upon
20 1.1.1.2 jruoho * including a substantially similar Disclaimer requirement for further
21 1.1.1.2 jruoho * binary redistribution.
22 1.1.1.2 jruoho * 3. Neither the names of the above-listed copyright holders nor the names
23 1.1.1.2 jruoho * of any contributors may be used to endorse or promote products derived
24 1.1.1.2 jruoho * from this software without specific prior written permission.
25 1.1.1.2 jruoho *
26 1.1.1.2 jruoho * Alternatively, this software may be distributed under the terms of the
27 1.1.1.2 jruoho * GNU General Public License ("GPL") version 2 as published by the Free
28 1.1.1.2 jruoho * Software Foundation.
29 1.1.1.2 jruoho *
30 1.1.1.2 jruoho * NO WARRANTY
31 1.1.1.2 jruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 1.1.1.2 jruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 1.1.1.2 jruoho * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 1.1.1.2 jruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 1.1.1.2 jruoho * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 1.1.1.2 jruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 1.1.1.2 jruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 1.1.1.2 jruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 1.1.1.2 jruoho * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 1.1.1.2 jruoho * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 1.1.1.2 jruoho * POSSIBILITY OF SUCH DAMAGES.
42 1.1.1.2 jruoho */
43 1.1 jruoho
44 1.1 jruoho #define __DTTABLE_C__
45 1.1 jruoho
46 1.1 jruoho /* Compile all complex data tables */
47 1.1 jruoho
48 1.1 jruoho #include "aslcompiler.h"
49 1.1 jruoho #include "dtcompiler.h"
50 1.1 jruoho
51 1.1 jruoho #define _COMPONENT DT_COMPILER
52 1.1 jruoho ACPI_MODULE_NAME ("dttable")
53 1.1 jruoho
54 1.1 jruoho
55 1.1 jruoho /* TBD: merge these into dmtbinfo.c? */
56 1.1 jruoho
57 1.1 jruoho static ACPI_DMTABLE_INFO TableInfoAsfAddress[] =
58 1.1 jruoho {
59 1.1 jruoho {ACPI_DMT_BUFFER, 0, "Addresses", 0},
60 1.1 jruoho {ACPI_DMT_EXIT, 0, NULL, 0}
61 1.1 jruoho };
62 1.1 jruoho
63 1.1 jruoho static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] =
64 1.1 jruoho {
65 1.1 jruoho {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0},
66 1.1 jruoho {ACPI_DMT_EXIT, 0, NULL, 0}
67 1.1 jruoho };
68 1.1 jruoho
69 1.1 jruoho
70 1.1 jruoho /* TBD: move to acmacros.h */
71 1.1 jruoho
72 1.1 jruoho #define ACPI_SUB_PTR(t, a, b) \
73 1.1 jruoho ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b)))
74 1.1 jruoho
75 1.1 jruoho
76 1.1 jruoho /* Local prototypes */
77 1.1 jruoho
78 1.1 jruoho static ACPI_STATUS
79 1.1 jruoho DtCompileTwoSubtables (
80 1.1 jruoho void **List,
81 1.1 jruoho ACPI_DMTABLE_INFO *TableInfo1,
82 1.1 jruoho ACPI_DMTABLE_INFO *TableInfo2);
83 1.1 jruoho
84 1.1 jruoho
85 1.1 jruoho /******************************************************************************
86 1.1 jruoho *
87 1.1 jruoho * FUNCTION: DtCompileTwoSubtables
88 1.1 jruoho *
89 1.1 jruoho * PARAMETERS: List - Current field list pointer
90 1.1 jruoho * TableInfo1 - Info table 1
91 1.1 jruoho * TableInfo1 - Info table 2
92 1.1 jruoho *
93 1.1 jruoho * RETURN: Status
94 1.1 jruoho *
95 1.1 jruoho * DESCRIPTION: Compile tables with a header and one or more same subtables.
96 1.1 jruoho * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
97 1.1 jruoho *
98 1.1 jruoho *****************************************************************************/
99 1.1 jruoho
100 1.1 jruoho static ACPI_STATUS
101 1.1 jruoho DtCompileTwoSubtables (
102 1.1 jruoho void **List,
103 1.1 jruoho ACPI_DMTABLE_INFO *TableInfo1,
104 1.1 jruoho ACPI_DMTABLE_INFO *TableInfo2)
105 1.1 jruoho {
106 1.1 jruoho ACPI_STATUS Status;
107 1.1 jruoho DT_SUBTABLE *Subtable;
108 1.1 jruoho DT_SUBTABLE *ParentTable;
109 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
110 1.1 jruoho
111 1.1 jruoho
112 1.1 jruoho Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
113 1.1 jruoho if (ACPI_FAILURE (Status))
114 1.1 jruoho {
115 1.1 jruoho return (Status);
116 1.1 jruoho }
117 1.1 jruoho
118 1.1 jruoho ParentTable = DtPeekSubtable ();
119 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
120 1.1 jruoho
121 1.1 jruoho while (*PFieldList)
122 1.1 jruoho {
123 1.1 jruoho Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
124 1.1 jruoho if (ACPI_FAILURE (Status))
125 1.1 jruoho {
126 1.1 jruoho return (Status);
127 1.1 jruoho }
128 1.1 jruoho
129 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
130 1.1 jruoho }
131 1.1 jruoho
132 1.1 jruoho return (AE_OK);
133 1.1 jruoho }
134 1.1 jruoho
135 1.1 jruoho
136 1.1 jruoho /******************************************************************************
137 1.1 jruoho *
138 1.1 jruoho * FUNCTION: DtCompileFacs
139 1.1 jruoho *
140 1.1 jruoho * PARAMETERS: PFieldList - Current field list pointer
141 1.1 jruoho *
142 1.1 jruoho * RETURN: Status
143 1.1 jruoho *
144 1.1 jruoho * DESCRIPTION: Compile FACS.
145 1.1 jruoho *
146 1.1 jruoho *****************************************************************************/
147 1.1 jruoho
148 1.1 jruoho ACPI_STATUS
149 1.1 jruoho DtCompileFacs (
150 1.1 jruoho DT_FIELD **PFieldList)
151 1.1 jruoho {
152 1.1 jruoho DT_SUBTABLE *Subtable;
153 1.1 jruoho UINT8 *ReservedBuffer;
154 1.1 jruoho ACPI_STATUS Status;
155 1.1 jruoho UINT32 ReservedSize;
156 1.1 jruoho
157 1.1 jruoho
158 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
159 1.1 jruoho &Gbl_RootTable, TRUE);
160 1.1 jruoho if (ACPI_FAILURE (Status))
161 1.1 jruoho {
162 1.1 jruoho return (Status);
163 1.1 jruoho }
164 1.1 jruoho
165 1.1 jruoho /* Large FACS reserved area at the end of the table */
166 1.1 jruoho
167 1.1 jruoho ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
168 1.1 jruoho ReservedBuffer = UtLocalCalloc (ReservedSize);
169 1.1 jruoho
170 1.1 jruoho DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
171 1.1 jruoho
172 1.1 jruoho ACPI_FREE (ReservedBuffer);
173 1.1 jruoho DtInsertSubtable (Gbl_RootTable, Subtable);
174 1.1 jruoho return (AE_OK);
175 1.1 jruoho }
176 1.1 jruoho
177 1.1 jruoho
178 1.1 jruoho /******************************************************************************
179 1.1 jruoho *
180 1.1 jruoho * FUNCTION: DtCompileRsdp
181 1.1 jruoho *
182 1.1 jruoho * PARAMETERS: PFieldList - Current field list pointer
183 1.1 jruoho *
184 1.1 jruoho * RETURN: Status
185 1.1 jruoho *
186 1.1 jruoho * DESCRIPTION: Compile RSDP.
187 1.1 jruoho *
188 1.1 jruoho *****************************************************************************/
189 1.1 jruoho
190 1.1 jruoho ACPI_STATUS
191 1.1 jruoho DtCompileRsdp (
192 1.1 jruoho DT_FIELD **PFieldList)
193 1.1 jruoho {
194 1.1 jruoho DT_SUBTABLE *Subtable;
195 1.1.1.2 jruoho ACPI_TABLE_RSDP *Rsdp;
196 1.1.1.2 jruoho ACPI_RSDP_EXTENSION *RsdpExtension;
197 1.1 jruoho ACPI_STATUS Status;
198 1.1 jruoho
199 1.1 jruoho
200 1.1.1.2 jruoho /* Compile the "common" RSDP (ACPI 1.0) */
201 1.1.1.2 jruoho
202 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
203 1.1 jruoho &Gbl_RootTable, TRUE);
204 1.1 jruoho if (ACPI_FAILURE (Status))
205 1.1 jruoho {
206 1.1 jruoho return (Status);
207 1.1 jruoho }
208 1.1 jruoho
209 1.1.1.2 jruoho Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
210 1.1.1.2 jruoho DtSetTableChecksum (&Rsdp->Checksum);
211 1.1 jruoho
212 1.1.1.2 jruoho if (Rsdp->Revision > 0)
213 1.1 jruoho {
214 1.1.1.2 jruoho /* Compile the "extended" part of the RSDP as a subtable */
215 1.1.1.2 jruoho
216 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
217 1.1 jruoho &Subtable, TRUE);
218 1.1 jruoho if (ACPI_FAILURE (Status))
219 1.1 jruoho {
220 1.1 jruoho return (Status);
221 1.1 jruoho }
222 1.1 jruoho
223 1.1 jruoho DtInsertSubtable (Gbl_RootTable, Subtable);
224 1.1.1.2 jruoho
225 1.1.1.2 jruoho /* Set length and extended checksum for entire RSDP */
226 1.1.1.2 jruoho
227 1.1.1.2 jruoho RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
228 1.1.1.2 jruoho RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
229 1.1.1.2 jruoho DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
230 1.1 jruoho }
231 1.1 jruoho
232 1.1 jruoho return (AE_OK);
233 1.1 jruoho }
234 1.1 jruoho
235 1.1 jruoho
236 1.1 jruoho /******************************************************************************
237 1.1 jruoho *
238 1.1 jruoho * FUNCTION: DtCompileAsf
239 1.1 jruoho *
240 1.1 jruoho * PARAMETERS: List - Current field list pointer
241 1.1 jruoho *
242 1.1 jruoho * RETURN: Status
243 1.1 jruoho *
244 1.1 jruoho * DESCRIPTION: Compile ASF!.
245 1.1 jruoho *
246 1.1 jruoho *****************************************************************************/
247 1.1 jruoho
248 1.1 jruoho ACPI_STATUS
249 1.1 jruoho DtCompileAsf (
250 1.1 jruoho void **List)
251 1.1 jruoho {
252 1.1 jruoho ACPI_ASF_INFO *AsfTable;
253 1.1 jruoho DT_SUBTABLE *Subtable;
254 1.1 jruoho DT_SUBTABLE *ParentTable;
255 1.1 jruoho ACPI_DMTABLE_INFO *InfoTable;
256 1.1 jruoho ACPI_DMTABLE_INFO *DataInfoTable = NULL;
257 1.1 jruoho UINT32 DataCount = 0;
258 1.1 jruoho ACPI_STATUS Status;
259 1.1 jruoho UINT32 i;
260 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
261 1.1 jruoho DT_FIELD *SubtableStart;
262 1.1 jruoho
263 1.1 jruoho
264 1.1 jruoho while (*PFieldList)
265 1.1 jruoho {
266 1.1 jruoho SubtableStart = *PFieldList;
267 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
268 1.1 jruoho &Subtable, TRUE);
269 1.1 jruoho if (ACPI_FAILURE (Status))
270 1.1 jruoho {
271 1.1 jruoho return (Status);
272 1.1 jruoho }
273 1.1 jruoho
274 1.1 jruoho ParentTable = DtPeekSubtable ();
275 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
276 1.1 jruoho DtPushSubtable (Subtable);
277 1.1 jruoho
278 1.1 jruoho AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
279 1.1 jruoho
280 1.1 jruoho switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
281 1.1 jruoho {
282 1.1 jruoho case ACPI_ASF_TYPE_INFO:
283 1.1.1.3.2.1 yamt
284 1.1 jruoho InfoTable = AcpiDmTableInfoAsf0;
285 1.1 jruoho break;
286 1.1 jruoho
287 1.1 jruoho case ACPI_ASF_TYPE_ALERT:
288 1.1.1.3.2.1 yamt
289 1.1 jruoho InfoTable = AcpiDmTableInfoAsf1;
290 1.1 jruoho break;
291 1.1 jruoho
292 1.1 jruoho case ACPI_ASF_TYPE_CONTROL:
293 1.1.1.3.2.1 yamt
294 1.1 jruoho InfoTable = AcpiDmTableInfoAsf2;
295 1.1 jruoho break;
296 1.1 jruoho
297 1.1 jruoho case ACPI_ASF_TYPE_BOOT:
298 1.1.1.3.2.1 yamt
299 1.1 jruoho InfoTable = AcpiDmTableInfoAsf3;
300 1.1 jruoho break;
301 1.1 jruoho
302 1.1 jruoho case ACPI_ASF_TYPE_ADDRESS:
303 1.1.1.3.2.1 yamt
304 1.1 jruoho InfoTable = AcpiDmTableInfoAsf4;
305 1.1 jruoho break;
306 1.1 jruoho
307 1.1 jruoho default:
308 1.1.1.3.2.1 yamt
309 1.1 jruoho DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
310 1.1 jruoho return (AE_ERROR);
311 1.1 jruoho }
312 1.1 jruoho
313 1.1 jruoho Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
314 1.1 jruoho if (ACPI_FAILURE (Status))
315 1.1 jruoho {
316 1.1 jruoho return (Status);
317 1.1 jruoho }
318 1.1 jruoho
319 1.1 jruoho ParentTable = DtPeekSubtable ();
320 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
321 1.1 jruoho
322 1.1 jruoho switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
323 1.1 jruoho {
324 1.1 jruoho case ACPI_ASF_TYPE_INFO:
325 1.1.1.3.2.1 yamt
326 1.1 jruoho DataInfoTable = NULL;
327 1.1 jruoho break;
328 1.1 jruoho
329 1.1 jruoho case ACPI_ASF_TYPE_ALERT:
330 1.1.1.3.2.1 yamt
331 1.1 jruoho DataInfoTable = AcpiDmTableInfoAsf1a;
332 1.1 jruoho DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
333 1.1 jruoho ACPI_SUB_PTR (UINT8, Subtable->Buffer,
334 1.1 jruoho sizeof (ACPI_ASF_HEADER)))->Alerts;
335 1.1 jruoho break;
336 1.1 jruoho
337 1.1 jruoho case ACPI_ASF_TYPE_CONTROL:
338 1.1.1.3.2.1 yamt
339 1.1 jruoho DataInfoTable = AcpiDmTableInfoAsf2a;
340 1.1 jruoho DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
341 1.1 jruoho ACPI_SUB_PTR (UINT8, Subtable->Buffer,
342 1.1 jruoho sizeof (ACPI_ASF_HEADER)))->Controls;
343 1.1 jruoho break;
344 1.1 jruoho
345 1.1 jruoho case ACPI_ASF_TYPE_BOOT:
346 1.1.1.3.2.1 yamt
347 1.1 jruoho DataInfoTable = NULL;
348 1.1 jruoho break;
349 1.1 jruoho
350 1.1 jruoho case ACPI_ASF_TYPE_ADDRESS:
351 1.1.1.3.2.1 yamt
352 1.1 jruoho DataInfoTable = TableInfoAsfAddress;
353 1.1 jruoho DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
354 1.1 jruoho ACPI_SUB_PTR (UINT8, Subtable->Buffer,
355 1.1 jruoho sizeof (ACPI_ASF_HEADER)))->Devices;
356 1.1 jruoho break;
357 1.1 jruoho
358 1.1 jruoho default:
359 1.1.1.3.2.1 yamt
360 1.1 jruoho DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
361 1.1 jruoho return (AE_ERROR);
362 1.1 jruoho }
363 1.1 jruoho
364 1.1 jruoho if (DataInfoTable)
365 1.1 jruoho {
366 1.1 jruoho switch (AsfTable->Header.Type & 0x7F)
367 1.1 jruoho {
368 1.1 jruoho case ACPI_ASF_TYPE_ADDRESS:
369 1.1 jruoho
370 1.1 jruoho while (DataCount > 0)
371 1.1 jruoho {
372 1.1 jruoho Status = DtCompileTable (PFieldList, DataInfoTable,
373 1.1 jruoho &Subtable, TRUE);
374 1.1 jruoho if (ACPI_FAILURE (Status))
375 1.1 jruoho {
376 1.1 jruoho return (Status);
377 1.1 jruoho }
378 1.1 jruoho
379 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
380 1.1 jruoho DataCount = DataCount - Subtable->Length;
381 1.1 jruoho }
382 1.1 jruoho break;
383 1.1 jruoho
384 1.1 jruoho default:
385 1.1 jruoho
386 1.1 jruoho for (i = 0; i < DataCount; i++)
387 1.1 jruoho {
388 1.1 jruoho Status = DtCompileTable (PFieldList, DataInfoTable,
389 1.1 jruoho &Subtable, TRUE);
390 1.1 jruoho if (ACPI_FAILURE (Status))
391 1.1 jruoho {
392 1.1 jruoho return (Status);
393 1.1 jruoho }
394 1.1 jruoho
395 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
396 1.1 jruoho }
397 1.1 jruoho break;
398 1.1 jruoho }
399 1.1 jruoho }
400 1.1 jruoho
401 1.1 jruoho DtPopSubtable ();
402 1.1 jruoho }
403 1.1 jruoho
404 1.1 jruoho return (AE_OK);
405 1.1 jruoho }
406 1.1 jruoho
407 1.1 jruoho
408 1.1 jruoho /******************************************************************************
409 1.1 jruoho *
410 1.1 jruoho * FUNCTION: DtCompileCpep
411 1.1 jruoho *
412 1.1 jruoho * PARAMETERS: List - Current field list pointer
413 1.1 jruoho *
414 1.1 jruoho * RETURN: Status
415 1.1 jruoho *
416 1.1 jruoho * DESCRIPTION: Compile CPEP.
417 1.1 jruoho *
418 1.1 jruoho *****************************************************************************/
419 1.1 jruoho
420 1.1 jruoho ACPI_STATUS
421 1.1 jruoho DtCompileCpep (
422 1.1 jruoho void **List)
423 1.1 jruoho {
424 1.1 jruoho ACPI_STATUS Status;
425 1.1 jruoho
426 1.1 jruoho
427 1.1 jruoho Status = DtCompileTwoSubtables (List,
428 1.1 jruoho AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
429 1.1 jruoho return (Status);
430 1.1 jruoho }
431 1.1 jruoho
432 1.1 jruoho
433 1.1 jruoho /******************************************************************************
434 1.1 jruoho *
435 1.1.1.3.2.1 yamt * FUNCTION: DtCompileCsrt
436 1.1.1.3.2.1 yamt *
437 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
438 1.1.1.3.2.1 yamt *
439 1.1.1.3.2.1 yamt * RETURN: Status
440 1.1.1.3.2.1 yamt *
441 1.1.1.3.2.1 yamt * DESCRIPTION: Compile CSRT.
442 1.1.1.3.2.1 yamt *
443 1.1.1.3.2.1 yamt *****************************************************************************/
444 1.1.1.3.2.1 yamt
445 1.1.1.3.2.1 yamt ACPI_STATUS
446 1.1.1.3.2.1 yamt DtCompileCsrt (
447 1.1.1.3.2.1 yamt void **List)
448 1.1.1.3.2.1 yamt {
449 1.1.1.3.2.1 yamt ACPI_STATUS Status = AE_OK;
450 1.1.1.3.2.1 yamt DT_SUBTABLE *Subtable;
451 1.1.1.3.2.1 yamt DT_SUBTABLE *ParentTable;
452 1.1.1.3.2.1 yamt DT_FIELD **PFieldList = (DT_FIELD **) List;
453 1.1.1.3.2.1 yamt UINT32 DescriptorCount;
454 1.1.1.3.2.1 yamt UINT32 GroupLength;
455 1.1.1.3.2.1 yamt
456 1.1.1.3.2.1 yamt
457 1.1.1.3.2.1 yamt /* Sub-tables (Resource Groups) */
458 1.1.1.3.2.1 yamt
459 1.1.1.3.2.1 yamt while (*PFieldList)
460 1.1.1.3.2.1 yamt {
461 1.1.1.3.2.1 yamt /* Resource group subtable */
462 1.1.1.3.2.1 yamt
463 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
464 1.1.1.3.2.1 yamt &Subtable, TRUE);
465 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
466 1.1.1.3.2.1 yamt {
467 1.1.1.3.2.1 yamt return (Status);
468 1.1.1.3.2.1 yamt }
469 1.1.1.3.2.1 yamt
470 1.1.1.3.2.1 yamt /* Compute the number of resource descriptors */
471 1.1.1.3.2.1 yamt
472 1.1.1.3.2.1 yamt GroupLength =
473 1.1.1.3.2.1 yamt (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
474 1.1.1.3.2.1 yamt Subtable->Buffer))->Length -
475 1.1.1.3.2.1 yamt (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
476 1.1.1.3.2.1 yamt Subtable->Buffer))->SharedInfoLength -
477 1.1.1.3.2.1 yamt sizeof (ACPI_CSRT_GROUP);
478 1.1.1.3.2.1 yamt
479 1.1.1.3.2.1 yamt DescriptorCount = (GroupLength /
480 1.1.1.3.2.1 yamt sizeof (ACPI_CSRT_DESCRIPTOR));
481 1.1.1.3.2.1 yamt
482 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
483 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
484 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
485 1.1.1.3.2.1 yamt
486 1.1.1.3.2.1 yamt /* Shared info subtable (One per resource group) */
487 1.1.1.3.2.1 yamt
488 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
489 1.1.1.3.2.1 yamt &Subtable, TRUE);
490 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
491 1.1.1.3.2.1 yamt {
492 1.1.1.3.2.1 yamt return (Status);
493 1.1.1.3.2.1 yamt }
494 1.1.1.3.2.1 yamt
495 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
496 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
497 1.1.1.3.2.1 yamt
498 1.1.1.3.2.1 yamt /* Sub-Subtables (Resource Descriptors) */
499 1.1.1.3.2.1 yamt
500 1.1.1.3.2.1 yamt while (*PFieldList && DescriptorCount)
501 1.1.1.3.2.1 yamt {
502 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
503 1.1.1.3.2.1 yamt &Subtable, TRUE);
504 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
505 1.1.1.3.2.1 yamt {
506 1.1.1.3.2.1 yamt return (Status);
507 1.1.1.3.2.1 yamt }
508 1.1.1.3.2.1 yamt
509 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
510 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
511 1.1.1.3.2.1 yamt DescriptorCount--;
512 1.1.1.3.2.1 yamt }
513 1.1.1.3.2.1 yamt
514 1.1.1.3.2.1 yamt DtPopSubtable ();
515 1.1.1.3.2.1 yamt }
516 1.1.1.3.2.1 yamt
517 1.1.1.3.2.1 yamt return (Status);
518 1.1.1.3.2.1 yamt }
519 1.1.1.3.2.1 yamt
520 1.1.1.3.2.1 yamt
521 1.1.1.3.2.1 yamt /******************************************************************************
522 1.1.1.3.2.1 yamt *
523 1.1.1.3.2.1 yamt * FUNCTION: DtCompileDbg2
524 1.1.1.3.2.1 yamt *
525 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
526 1.1.1.3.2.1 yamt *
527 1.1.1.3.2.1 yamt * RETURN: Status
528 1.1.1.3.2.1 yamt *
529 1.1.1.3.2.1 yamt * DESCRIPTION: Compile DBG2.
530 1.1.1.3.2.1 yamt *
531 1.1.1.3.2.1 yamt *****************************************************************************/
532 1.1.1.3.2.1 yamt
533 1.1.1.3.2.1 yamt ACPI_STATUS
534 1.1.1.3.2.1 yamt DtCompileDbg2 (
535 1.1.1.3.2.1 yamt void **List)
536 1.1.1.3.2.1 yamt {
537 1.1.1.3.2.1 yamt ACPI_STATUS Status;
538 1.1.1.3.2.1 yamt DT_SUBTABLE *Subtable;
539 1.1.1.3.2.1 yamt DT_SUBTABLE *ParentTable;
540 1.1.1.3.2.1 yamt DT_FIELD **PFieldList = (DT_FIELD **) List;
541 1.1.1.3.2.1 yamt UINT32 SubtableCount;
542 1.1.1.3.2.1 yamt ACPI_DBG2_HEADER *Dbg2Header;
543 1.1.1.3.2.1 yamt ACPI_DBG2_DEVICE *DeviceInfo;
544 1.1.1.3.2.1 yamt UINT16 CurrentOffset;
545 1.1.1.3.2.1 yamt UINT32 i;
546 1.1.1.3.2.1 yamt
547 1.1.1.3.2.1 yamt
548 1.1.1.3.2.1 yamt /* Main table */
549 1.1.1.3.2.1 yamt
550 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable, TRUE);
551 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
552 1.1.1.3.2.1 yamt {
553 1.1.1.3.2.1 yamt return (Status);
554 1.1.1.3.2.1 yamt }
555 1.1.1.3.2.1 yamt
556 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
557 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
558 1.1.1.3.2.1 yamt
559 1.1.1.3.2.1 yamt /* Main table fields */
560 1.1.1.3.2.1 yamt
561 1.1.1.3.2.1 yamt Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
562 1.1.1.3.2.1 yamt Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
563 1.1.1.3.2.1 yamt ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
564 1.1.1.3.2.1 yamt
565 1.1.1.3.2.1 yamt SubtableCount = Dbg2Header->InfoCount;
566 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
567 1.1.1.3.2.1 yamt
568 1.1.1.3.2.1 yamt /* Process all Device Information subtables (Count = InfoCount) */
569 1.1.1.3.2.1 yamt
570 1.1.1.3.2.1 yamt while (*PFieldList && SubtableCount)
571 1.1.1.3.2.1 yamt {
572 1.1.1.3.2.1 yamt /* Subtable: Debug Device Information */
573 1.1.1.3.2.1 yamt
574 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
575 1.1.1.3.2.1 yamt &Subtable, TRUE);
576 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
577 1.1.1.3.2.1 yamt {
578 1.1.1.3.2.1 yamt return (Status);
579 1.1.1.3.2.1 yamt }
580 1.1.1.3.2.1 yamt
581 1.1.1.3.2.1 yamt DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
582 1.1.1.3.2.1 yamt CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
583 1.1.1.3.2.1 yamt
584 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
585 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
586 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
587 1.1.1.3.2.1 yamt
588 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
589 1.1.1.3.2.1 yamt
590 1.1.1.3.2.1 yamt /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
591 1.1.1.3.2.1 yamt
592 1.1.1.3.2.1 yamt DeviceInfo->BaseAddressOffset = CurrentOffset;
593 1.1.1.3.2.1 yamt for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
594 1.1.1.3.2.1 yamt {
595 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
596 1.1.1.3.2.1 yamt &Subtable, TRUE);
597 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
598 1.1.1.3.2.1 yamt {
599 1.1.1.3.2.1 yamt return (Status);
600 1.1.1.3.2.1 yamt }
601 1.1.1.3.2.1 yamt
602 1.1.1.3.2.1 yamt CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
603 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
604 1.1.1.3.2.1 yamt }
605 1.1.1.3.2.1 yamt
606 1.1.1.3.2.1 yamt /* AddressSize array (Required, size = RegisterCount) */
607 1.1.1.3.2.1 yamt
608 1.1.1.3.2.1 yamt DeviceInfo->AddressSizeOffset = CurrentOffset;
609 1.1.1.3.2.1 yamt for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
610 1.1.1.3.2.1 yamt {
611 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
612 1.1.1.3.2.1 yamt &Subtable, TRUE);
613 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
614 1.1.1.3.2.1 yamt {
615 1.1.1.3.2.1 yamt return (Status);
616 1.1.1.3.2.1 yamt }
617 1.1.1.3.2.1 yamt
618 1.1.1.3.2.1 yamt CurrentOffset += (UINT16) sizeof (UINT32);
619 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
620 1.1.1.3.2.1 yamt }
621 1.1.1.3.2.1 yamt
622 1.1.1.3.2.1 yamt /* NamespaceString device identifier (Required, size = NamePathLength) */
623 1.1.1.3.2.1 yamt
624 1.1.1.3.2.1 yamt DeviceInfo->NamepathOffset = CurrentOffset;
625 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
626 1.1.1.3.2.1 yamt &Subtable, TRUE);
627 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
628 1.1.1.3.2.1 yamt {
629 1.1.1.3.2.1 yamt return (Status);
630 1.1.1.3.2.1 yamt }
631 1.1.1.3.2.1 yamt
632 1.1.1.3.2.1 yamt /* Update the device info header */
633 1.1.1.3.2.1 yamt
634 1.1.1.3.2.1 yamt DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
635 1.1.1.3.2.1 yamt CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
636 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
637 1.1.1.3.2.1 yamt
638 1.1.1.3.2.1 yamt /* OemData - Variable-length data (Optional, size = OemDataLength) */
639 1.1.1.3.2.1 yamt
640 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
641 1.1.1.3.2.1 yamt &Subtable, TRUE);
642 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
643 1.1.1.3.2.1 yamt {
644 1.1.1.3.2.1 yamt return (Status);
645 1.1.1.3.2.1 yamt }
646 1.1.1.3.2.1 yamt
647 1.1.1.3.2.1 yamt /* Update the device info header (zeros if no OEM data present) */
648 1.1.1.3.2.1 yamt
649 1.1.1.3.2.1 yamt DeviceInfo->OemDataOffset = 0;
650 1.1.1.3.2.1 yamt DeviceInfo->OemDataLength = 0;
651 1.1.1.3.2.1 yamt
652 1.1.1.3.2.1 yamt /* Optional subtable (OemData) */
653 1.1.1.3.2.1 yamt
654 1.1.1.3.2.1 yamt if (Subtable && Subtable->Length)
655 1.1.1.3.2.1 yamt {
656 1.1.1.3.2.1 yamt DeviceInfo->OemDataOffset = CurrentOffset;
657 1.1.1.3.2.1 yamt DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
658 1.1.1.3.2.1 yamt
659 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
660 1.1.1.3.2.1 yamt }
661 1.1.1.3.2.1 yamt
662 1.1.1.3.2.1 yamt SubtableCount--;
663 1.1.1.3.2.1 yamt DtPopSubtable (); /* Get next Device Information subtable */
664 1.1.1.3.2.1 yamt }
665 1.1.1.3.2.1 yamt
666 1.1.1.3.2.1 yamt DtPopSubtable ();
667 1.1.1.3.2.1 yamt return (AE_OK);
668 1.1.1.3.2.1 yamt }
669 1.1.1.3.2.1 yamt
670 1.1.1.3.2.1 yamt
671 1.1.1.3.2.1 yamt /******************************************************************************
672 1.1.1.3.2.1 yamt *
673 1.1 jruoho * FUNCTION: DtCompileDmar
674 1.1 jruoho *
675 1.1 jruoho * PARAMETERS: List - Current field list pointer
676 1.1 jruoho *
677 1.1 jruoho * RETURN: Status
678 1.1 jruoho *
679 1.1 jruoho * DESCRIPTION: Compile DMAR.
680 1.1 jruoho *
681 1.1 jruoho *****************************************************************************/
682 1.1 jruoho
683 1.1 jruoho ACPI_STATUS
684 1.1 jruoho DtCompileDmar (
685 1.1 jruoho void **List)
686 1.1 jruoho {
687 1.1 jruoho ACPI_STATUS Status;
688 1.1 jruoho DT_SUBTABLE *Subtable;
689 1.1 jruoho DT_SUBTABLE *ParentTable;
690 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
691 1.1 jruoho DT_FIELD *SubtableStart;
692 1.1 jruoho ACPI_DMTABLE_INFO *InfoTable;
693 1.1 jruoho ACPI_DMAR_HEADER *DmarHeader;
694 1.1.1.3.2.1 yamt ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope;
695 1.1.1.3.2.1 yamt UINT32 DeviceScopeLength;
696 1.1.1.3.2.1 yamt UINT32 PciPathLength;
697 1.1 jruoho
698 1.1 jruoho
699 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
700 1.1 jruoho if (ACPI_FAILURE (Status))
701 1.1 jruoho {
702 1.1 jruoho return (Status);
703 1.1 jruoho }
704 1.1 jruoho
705 1.1 jruoho ParentTable = DtPeekSubtable ();
706 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
707 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
708 1.1 jruoho
709 1.1 jruoho while (*PFieldList)
710 1.1 jruoho {
711 1.1 jruoho /* DMAR Header */
712 1.1 jruoho
713 1.1 jruoho SubtableStart = *PFieldList;
714 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
715 1.1 jruoho &Subtable, TRUE);
716 1.1 jruoho if (ACPI_FAILURE (Status))
717 1.1 jruoho {
718 1.1 jruoho return (Status);
719 1.1 jruoho }
720 1.1 jruoho
721 1.1 jruoho ParentTable = DtPeekSubtable ();
722 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
723 1.1 jruoho DtPushSubtable (Subtable);
724 1.1 jruoho
725 1.1 jruoho DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
726 1.1 jruoho
727 1.1 jruoho switch (DmarHeader->Type)
728 1.1 jruoho {
729 1.1 jruoho case ACPI_DMAR_TYPE_HARDWARE_UNIT:
730 1.1.1.3.2.1 yamt
731 1.1 jruoho InfoTable = AcpiDmTableInfoDmar0;
732 1.1 jruoho break;
733 1.1.1.3.2.1 yamt
734 1.1 jruoho case ACPI_DMAR_TYPE_RESERVED_MEMORY:
735 1.1.1.3.2.1 yamt
736 1.1 jruoho InfoTable = AcpiDmTableInfoDmar1;
737 1.1 jruoho break;
738 1.1.1.3.2.1 yamt
739 1.1 jruoho case ACPI_DMAR_TYPE_ATSR:
740 1.1.1.3.2.1 yamt
741 1.1 jruoho InfoTable = AcpiDmTableInfoDmar2;
742 1.1 jruoho break;
743 1.1.1.3.2.1 yamt
744 1.1 jruoho case ACPI_DMAR_HARDWARE_AFFINITY:
745 1.1.1.3.2.1 yamt
746 1.1 jruoho InfoTable = AcpiDmTableInfoDmar3;
747 1.1 jruoho break;
748 1.1.1.3.2.1 yamt
749 1.1 jruoho default:
750 1.1.1.3.2.1 yamt
751 1.1 jruoho DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
752 1.1 jruoho return (AE_ERROR);
753 1.1 jruoho }
754 1.1 jruoho
755 1.1 jruoho /* DMAR Subtable */
756 1.1 jruoho
757 1.1 jruoho Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
758 1.1 jruoho if (ACPI_FAILURE (Status))
759 1.1 jruoho {
760 1.1 jruoho return (Status);
761 1.1 jruoho }
762 1.1 jruoho
763 1.1 jruoho ParentTable = DtPeekSubtable ();
764 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
765 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
766 1.1 jruoho
767 1.1 jruoho /* Optional Device Scope subtables */
768 1.1 jruoho
769 1.1.1.3.2.1 yamt DeviceScopeLength = DmarHeader->Length - Subtable->Length -
770 1.1.1.3.2.1 yamt ParentTable->Length;
771 1.1.1.3.2.1 yamt while (DeviceScopeLength)
772 1.1 jruoho {
773 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
774 1.1 jruoho &Subtable, FALSE);
775 1.1 jruoho if (Status == AE_NOT_FOUND)
776 1.1 jruoho {
777 1.1 jruoho break;
778 1.1 jruoho }
779 1.1 jruoho
780 1.1 jruoho ParentTable = DtPeekSubtable ();
781 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
782 1.1 jruoho DtPushSubtable (Subtable);
783 1.1 jruoho
784 1.1.1.3.2.1 yamt DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
785 1.1.1.3.2.1 yamt
786 1.1 jruoho /* Optional PCI Paths */
787 1.1 jruoho
788 1.1.1.3.2.1 yamt PciPathLength = DmarDeviceScope->Length - Subtable->Length;
789 1.1.1.3.2.1 yamt while (PciPathLength)
790 1.1 jruoho {
791 1.1 jruoho Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
792 1.1 jruoho &Subtable, FALSE);
793 1.1 jruoho if (Status == AE_NOT_FOUND)
794 1.1 jruoho {
795 1.1 jruoho DtPopSubtable ();
796 1.1 jruoho break;
797 1.1 jruoho }
798 1.1 jruoho
799 1.1 jruoho ParentTable = DtPeekSubtable ();
800 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
801 1.1.1.3.2.1 yamt PciPathLength -= Subtable->Length;
802 1.1 jruoho }
803 1.1.1.3.2.1 yamt
804 1.1.1.3.2.1 yamt DtPopSubtable ();
805 1.1.1.3.2.1 yamt DeviceScopeLength -= DmarDeviceScope->Length;
806 1.1 jruoho }
807 1.1 jruoho
808 1.1 jruoho DtPopSubtable ();
809 1.1.1.3.2.1 yamt DtPopSubtable ();
810 1.1 jruoho }
811 1.1 jruoho
812 1.1 jruoho return (AE_OK);
813 1.1 jruoho }
814 1.1 jruoho
815 1.1 jruoho
816 1.1 jruoho /******************************************************************************
817 1.1 jruoho *
818 1.1 jruoho * FUNCTION: DtCompileEinj
819 1.1 jruoho *
820 1.1 jruoho * PARAMETERS: List - Current field list pointer
821 1.1 jruoho *
822 1.1 jruoho * RETURN: Status
823 1.1 jruoho *
824 1.1 jruoho * DESCRIPTION: Compile EINJ.
825 1.1 jruoho *
826 1.1 jruoho *****************************************************************************/
827 1.1 jruoho
828 1.1 jruoho ACPI_STATUS
829 1.1 jruoho DtCompileEinj (
830 1.1 jruoho void **List)
831 1.1 jruoho {
832 1.1 jruoho ACPI_STATUS Status;
833 1.1 jruoho
834 1.1 jruoho
835 1.1 jruoho Status = DtCompileTwoSubtables (List,
836 1.1 jruoho AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
837 1.1 jruoho return (Status);
838 1.1 jruoho }
839 1.1 jruoho
840 1.1 jruoho
841 1.1 jruoho /******************************************************************************
842 1.1 jruoho *
843 1.1 jruoho * FUNCTION: DtCompileErst
844 1.1 jruoho *
845 1.1 jruoho * PARAMETERS: List - Current field list pointer
846 1.1 jruoho *
847 1.1 jruoho * RETURN: Status
848 1.1 jruoho *
849 1.1 jruoho * DESCRIPTION: Compile ERST.
850 1.1 jruoho *
851 1.1 jruoho *****************************************************************************/
852 1.1 jruoho
853 1.1 jruoho ACPI_STATUS
854 1.1 jruoho DtCompileErst (
855 1.1 jruoho void **List)
856 1.1 jruoho {
857 1.1 jruoho ACPI_STATUS Status;
858 1.1 jruoho
859 1.1 jruoho
860 1.1 jruoho Status = DtCompileTwoSubtables (List,
861 1.1 jruoho AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
862 1.1 jruoho return (Status);
863 1.1 jruoho }
864 1.1 jruoho
865 1.1 jruoho
866 1.1 jruoho /******************************************************************************
867 1.1 jruoho *
868 1.1 jruoho * FUNCTION: DtCompileFadt
869 1.1 jruoho *
870 1.1 jruoho * PARAMETERS: List - Current field list pointer
871 1.1 jruoho *
872 1.1 jruoho * RETURN: Status
873 1.1 jruoho *
874 1.1 jruoho * DESCRIPTION: Compile FADT.
875 1.1 jruoho *
876 1.1 jruoho *****************************************************************************/
877 1.1 jruoho
878 1.1 jruoho ACPI_STATUS
879 1.1 jruoho DtCompileFadt (
880 1.1 jruoho void **List)
881 1.1 jruoho {
882 1.1 jruoho ACPI_STATUS Status;
883 1.1 jruoho DT_SUBTABLE *Subtable;
884 1.1 jruoho DT_SUBTABLE *ParentTable;
885 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
886 1.1 jruoho ACPI_TABLE_HEADER *Table;
887 1.1 jruoho UINT8 Revision;
888 1.1 jruoho
889 1.1 jruoho
890 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
891 1.1 jruoho &Subtable, TRUE);
892 1.1 jruoho if (ACPI_FAILURE (Status))
893 1.1 jruoho {
894 1.1 jruoho return (Status);
895 1.1 jruoho }
896 1.1 jruoho
897 1.1 jruoho ParentTable = DtPeekSubtable ();
898 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
899 1.1 jruoho
900 1.1 jruoho Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
901 1.1 jruoho Revision = Table->Revision;
902 1.1 jruoho
903 1.1 jruoho if (Revision == 2)
904 1.1 jruoho {
905 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
906 1.1 jruoho &Subtable, TRUE);
907 1.1 jruoho if (ACPI_FAILURE (Status))
908 1.1 jruoho {
909 1.1 jruoho return (Status);
910 1.1 jruoho }
911 1.1 jruoho
912 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
913 1.1 jruoho }
914 1.1 jruoho else if (Revision >= 2)
915 1.1 jruoho {
916 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
917 1.1 jruoho &Subtable, TRUE);
918 1.1 jruoho if (ACPI_FAILURE (Status))
919 1.1 jruoho {
920 1.1 jruoho return (Status);
921 1.1 jruoho }
922 1.1 jruoho
923 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
924 1.1.1.3.2.1 yamt
925 1.1.1.3.2.1 yamt if (Revision >= 5)
926 1.1.1.3.2.1 yamt {
927 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
928 1.1.1.3.2.1 yamt &Subtable, TRUE);
929 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
930 1.1.1.3.2.1 yamt {
931 1.1.1.3.2.1 yamt return (Status);
932 1.1.1.3.2.1 yamt }
933 1.1.1.3.2.1 yamt
934 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
935 1.1.1.3.2.1 yamt }
936 1.1 jruoho }
937 1.1 jruoho
938 1.1 jruoho return (AE_OK);
939 1.1 jruoho }
940 1.1 jruoho
941 1.1 jruoho
942 1.1 jruoho /******************************************************************************
943 1.1 jruoho *
944 1.1.1.3.2.1 yamt * FUNCTION: DtCompileFpdt
945 1.1 jruoho *
946 1.1 jruoho * PARAMETERS: List - Current field list pointer
947 1.1 jruoho *
948 1.1 jruoho * RETURN: Status
949 1.1 jruoho *
950 1.1.1.3.2.1 yamt * DESCRIPTION: Compile FPDT.
951 1.1 jruoho *
952 1.1 jruoho *****************************************************************************/
953 1.1 jruoho
954 1.1 jruoho ACPI_STATUS
955 1.1.1.3.2.1 yamt DtCompileFpdt (
956 1.1 jruoho void **List)
957 1.1 jruoho {
958 1.1 jruoho ACPI_STATUS Status;
959 1.1.1.3.2.1 yamt ACPI_FPDT_HEADER *FpdtHeader;
960 1.1 jruoho DT_SUBTABLE *Subtable;
961 1.1 jruoho DT_SUBTABLE *ParentTable;
962 1.1.1.3.2.1 yamt ACPI_DMTABLE_INFO *InfoTable;
963 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
964 1.1 jruoho DT_FIELD *SubtableStart;
965 1.1 jruoho
966 1.1 jruoho
967 1.1 jruoho while (*PFieldList)
968 1.1 jruoho {
969 1.1 jruoho SubtableStart = *PFieldList;
970 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
971 1.1.1.3.2.1 yamt &Subtable, TRUE);
972 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
973 1.1.1.3.2.1 yamt {
974 1.1.1.3.2.1 yamt return (Status);
975 1.1.1.3.2.1 yamt }
976 1.1 jruoho
977 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
978 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
979 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
980 1.1.1.3.2.1 yamt
981 1.1.1.3.2.1 yamt FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
982 1.1.1.3.2.1 yamt
983 1.1.1.3.2.1 yamt switch (FpdtHeader->Type)
984 1.1 jruoho {
985 1.1.1.3.2.1 yamt case ACPI_FPDT_TYPE_BOOT:
986 1.1 jruoho
987 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoFpdt0;
988 1.1 jruoho break;
989 1.1 jruoho
990 1.1.1.3.2.1 yamt case ACPI_FPDT_TYPE_S3PERF:
991 1.1 jruoho
992 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoFpdt1;
993 1.1 jruoho break;
994 1.1 jruoho
995 1.1.1.3.2.1 yamt default:
996 1.1.1.3.2.1 yamt
997 1.1.1.3.2.1 yamt DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
998 1.1.1.3.2.1 yamt return (AE_ERROR);
999 1.1.1.3.2.1 yamt break;
1000 1.1.1.3.2.1 yamt }
1001 1.1.1.3.2.1 yamt
1002 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1003 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1004 1.1.1.3.2.1 yamt {
1005 1.1.1.3.2.1 yamt return (Status);
1006 1.1.1.3.2.1 yamt }
1007 1.1.1.3.2.1 yamt
1008 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1009 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1010 1.1.1.3.2.1 yamt DtPopSubtable ();
1011 1.1.1.3.2.1 yamt }
1012 1.1.1.3.2.1 yamt
1013 1.1.1.3.2.1 yamt return (AE_OK);
1014 1.1.1.3.2.1 yamt }
1015 1.1.1.3.2.1 yamt
1016 1.1.1.3.2.1 yamt
1017 1.1.1.3.2.1 yamt /******************************************************************************
1018 1.1.1.3.2.1 yamt *
1019 1.1.1.3.2.1 yamt * FUNCTION: DtCompileHest
1020 1.1.1.3.2.1 yamt *
1021 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
1022 1.1.1.3.2.1 yamt *
1023 1.1.1.3.2.1 yamt * RETURN: Status
1024 1.1.1.3.2.1 yamt *
1025 1.1.1.3.2.1 yamt * DESCRIPTION: Compile HEST.
1026 1.1.1.3.2.1 yamt *
1027 1.1.1.3.2.1 yamt *****************************************************************************/
1028 1.1.1.3.2.1 yamt
1029 1.1.1.3.2.1 yamt ACPI_STATUS
1030 1.1.1.3.2.1 yamt DtCompileHest (
1031 1.1.1.3.2.1 yamt void **List)
1032 1.1.1.3.2.1 yamt {
1033 1.1.1.3.2.1 yamt ACPI_STATUS Status;
1034 1.1.1.3.2.1 yamt DT_SUBTABLE *Subtable;
1035 1.1.1.3.2.1 yamt DT_SUBTABLE *ParentTable;
1036 1.1.1.3.2.1 yamt DT_FIELD **PFieldList = (DT_FIELD **) List;
1037 1.1.1.3.2.1 yamt DT_FIELD *SubtableStart;
1038 1.1.1.3.2.1 yamt ACPI_DMTABLE_INFO *InfoTable;
1039 1.1.1.3.2.1 yamt UINT16 Type;
1040 1.1.1.3.2.1 yamt UINT32 BankCount;
1041 1.1.1.3.2.1 yamt
1042 1.1.1.3.2.1 yamt
1043 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
1044 1.1.1.3.2.1 yamt &Subtable, TRUE);
1045 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1046 1.1.1.3.2.1 yamt {
1047 1.1.1.3.2.1 yamt return (Status);
1048 1.1.1.3.2.1 yamt }
1049 1.1.1.3.2.1 yamt
1050 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1051 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1052 1.1.1.3.2.1 yamt
1053 1.1.1.3.2.1 yamt while (*PFieldList)
1054 1.1.1.3.2.1 yamt {
1055 1.1.1.3.2.1 yamt /* Get subtable type */
1056 1.1.1.3.2.1 yamt
1057 1.1.1.3.2.1 yamt SubtableStart = *PFieldList;
1058 1.1.1.3.2.1 yamt DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1059 1.1.1.3.2.1 yamt
1060 1.1.1.3.2.1 yamt switch (Type)
1061 1.1.1.3.2.1 yamt {
1062 1.1.1.3.2.1 yamt case ACPI_HEST_TYPE_IA32_CHECK:
1063 1.1.1.3.2.1 yamt
1064 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoHest0;
1065 1.1.1.3.2.1 yamt break;
1066 1.1.1.3.2.1 yamt
1067 1.1.1.3.2.1 yamt case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1068 1.1.1.3.2.1 yamt
1069 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoHest1;
1070 1.1.1.3.2.1 yamt break;
1071 1.1.1.3.2.1 yamt
1072 1.1.1.3.2.1 yamt case ACPI_HEST_TYPE_IA32_NMI:
1073 1.1.1.3.2.1 yamt
1074 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoHest2;
1075 1.1.1.3.2.1 yamt break;
1076 1.1.1.3.2.1 yamt
1077 1.1.1.3.2.1 yamt case ACPI_HEST_TYPE_AER_ROOT_PORT:
1078 1.1.1.3.2.1 yamt
1079 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoHest6;
1080 1.1.1.3.2.1 yamt break;
1081 1.1.1.3.2.1 yamt
1082 1.1.1.3.2.1 yamt case ACPI_HEST_TYPE_AER_ENDPOINT:
1083 1.1.1.3.2.1 yamt
1084 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoHest7;
1085 1.1.1.3.2.1 yamt break;
1086 1.1 jruoho
1087 1.1 jruoho case ACPI_HEST_TYPE_AER_BRIDGE:
1088 1.1.1.3.2.1 yamt
1089 1.1 jruoho InfoTable = AcpiDmTableInfoHest8;
1090 1.1 jruoho break;
1091 1.1 jruoho
1092 1.1 jruoho case ACPI_HEST_TYPE_GENERIC_ERROR:
1093 1.1.1.3.2.1 yamt
1094 1.1 jruoho InfoTable = AcpiDmTableInfoHest9;
1095 1.1 jruoho break;
1096 1.1 jruoho
1097 1.1 jruoho default:
1098 1.1.1.3.2.1 yamt
1099 1.1 jruoho /* Cannot continue on unknown type */
1100 1.1 jruoho
1101 1.1 jruoho DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
1102 1.1 jruoho return (AE_ERROR);
1103 1.1 jruoho }
1104 1.1 jruoho
1105 1.1 jruoho Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1106 1.1 jruoho if (ACPI_FAILURE (Status))
1107 1.1 jruoho {
1108 1.1 jruoho return (Status);
1109 1.1 jruoho }
1110 1.1 jruoho
1111 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1112 1.1 jruoho
1113 1.1 jruoho /*
1114 1.1 jruoho * Additional subtable data - IA32 Error Bank(s)
1115 1.1 jruoho */
1116 1.1 jruoho BankCount = 0;
1117 1.1 jruoho switch (Type)
1118 1.1 jruoho {
1119 1.1 jruoho case ACPI_HEST_TYPE_IA32_CHECK:
1120 1.1.1.3.2.1 yamt
1121 1.1 jruoho BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1122 1.1 jruoho Subtable->Buffer))->NumHardwareBanks;
1123 1.1 jruoho break;
1124 1.1 jruoho
1125 1.1 jruoho case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1126 1.1.1.3.2.1 yamt
1127 1.1 jruoho BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1128 1.1 jruoho Subtable->Buffer))->NumHardwareBanks;
1129 1.1 jruoho break;
1130 1.1 jruoho
1131 1.1 jruoho default:
1132 1.1.1.3.2.1 yamt
1133 1.1 jruoho break;
1134 1.1 jruoho }
1135 1.1 jruoho
1136 1.1 jruoho while (BankCount)
1137 1.1 jruoho {
1138 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
1139 1.1 jruoho &Subtable, TRUE);
1140 1.1 jruoho if (ACPI_FAILURE (Status))
1141 1.1 jruoho {
1142 1.1 jruoho return (Status);
1143 1.1 jruoho }
1144 1.1 jruoho
1145 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1146 1.1 jruoho BankCount--;
1147 1.1 jruoho }
1148 1.1 jruoho }
1149 1.1 jruoho
1150 1.1.1.3.2.1 yamt return (AE_OK);
1151 1.1 jruoho }
1152 1.1 jruoho
1153 1.1 jruoho
1154 1.1 jruoho /******************************************************************************
1155 1.1 jruoho *
1156 1.1 jruoho * FUNCTION: DtCompileIvrs
1157 1.1 jruoho *
1158 1.1 jruoho * PARAMETERS: List - Current field list pointer
1159 1.1 jruoho *
1160 1.1 jruoho * RETURN: Status
1161 1.1 jruoho *
1162 1.1 jruoho * DESCRIPTION: Compile IVRS.
1163 1.1 jruoho *
1164 1.1 jruoho *****************************************************************************/
1165 1.1 jruoho
1166 1.1 jruoho ACPI_STATUS
1167 1.1 jruoho DtCompileIvrs (
1168 1.1 jruoho void **List)
1169 1.1 jruoho {
1170 1.1 jruoho ACPI_STATUS Status;
1171 1.1 jruoho DT_SUBTABLE *Subtable;
1172 1.1 jruoho DT_SUBTABLE *ParentTable;
1173 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
1174 1.1 jruoho DT_FIELD *SubtableStart;
1175 1.1 jruoho ACPI_DMTABLE_INFO *InfoTable;
1176 1.1 jruoho ACPI_IVRS_HEADER *IvrsHeader;
1177 1.1 jruoho UINT8 EntryType;
1178 1.1 jruoho
1179 1.1 jruoho
1180 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
1181 1.1 jruoho &Subtable, TRUE);
1182 1.1 jruoho if (ACPI_FAILURE (Status))
1183 1.1 jruoho {
1184 1.1 jruoho return (Status);
1185 1.1 jruoho }
1186 1.1 jruoho
1187 1.1 jruoho ParentTable = DtPeekSubtable ();
1188 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1189 1.1 jruoho
1190 1.1 jruoho while (*PFieldList)
1191 1.1 jruoho {
1192 1.1 jruoho SubtableStart = *PFieldList;
1193 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
1194 1.1 jruoho &Subtable, TRUE);
1195 1.1 jruoho if (ACPI_FAILURE (Status))
1196 1.1 jruoho {
1197 1.1 jruoho return (Status);
1198 1.1 jruoho }
1199 1.1 jruoho
1200 1.1 jruoho ParentTable = DtPeekSubtable ();
1201 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1202 1.1 jruoho DtPushSubtable (Subtable);
1203 1.1 jruoho
1204 1.1 jruoho IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
1205 1.1 jruoho
1206 1.1 jruoho switch (IvrsHeader->Type)
1207 1.1 jruoho {
1208 1.1 jruoho case ACPI_IVRS_TYPE_HARDWARE:
1209 1.1.1.3.2.1 yamt
1210 1.1 jruoho InfoTable = AcpiDmTableInfoIvrs0;
1211 1.1 jruoho break;
1212 1.1 jruoho
1213 1.1 jruoho case ACPI_IVRS_TYPE_MEMORY1:
1214 1.1 jruoho case ACPI_IVRS_TYPE_MEMORY2:
1215 1.1 jruoho case ACPI_IVRS_TYPE_MEMORY3:
1216 1.1.1.3.2.1 yamt
1217 1.1 jruoho InfoTable = AcpiDmTableInfoIvrs1;
1218 1.1 jruoho break;
1219 1.1 jruoho
1220 1.1 jruoho default:
1221 1.1.1.3.2.1 yamt
1222 1.1 jruoho DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
1223 1.1 jruoho return (AE_ERROR);
1224 1.1 jruoho }
1225 1.1 jruoho
1226 1.1 jruoho Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1227 1.1 jruoho if (ACPI_FAILURE (Status))
1228 1.1 jruoho {
1229 1.1 jruoho return (Status);
1230 1.1 jruoho }
1231 1.1 jruoho
1232 1.1 jruoho ParentTable = DtPeekSubtable ();
1233 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1234 1.1 jruoho
1235 1.1 jruoho if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
1236 1.1 jruoho {
1237 1.1 jruoho while (*PFieldList &&
1238 1.1 jruoho !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
1239 1.1 jruoho {
1240 1.1 jruoho SubtableStart = *PFieldList;
1241 1.1 jruoho DtCompileInteger (&EntryType, *PFieldList, 1, 0);
1242 1.1 jruoho
1243 1.1 jruoho switch (EntryType)
1244 1.1 jruoho {
1245 1.1 jruoho /* 4-byte device entries */
1246 1.1 jruoho
1247 1.1 jruoho case ACPI_IVRS_TYPE_PAD4:
1248 1.1 jruoho case ACPI_IVRS_TYPE_ALL:
1249 1.1 jruoho case ACPI_IVRS_TYPE_SELECT:
1250 1.1 jruoho case ACPI_IVRS_TYPE_START:
1251 1.1 jruoho case ACPI_IVRS_TYPE_END:
1252 1.1 jruoho
1253 1.1 jruoho InfoTable = AcpiDmTableInfoIvrs4;
1254 1.1 jruoho break;
1255 1.1 jruoho
1256 1.1 jruoho /* 8-byte entries, type A */
1257 1.1 jruoho
1258 1.1 jruoho case ACPI_IVRS_TYPE_ALIAS_SELECT:
1259 1.1 jruoho case ACPI_IVRS_TYPE_ALIAS_START:
1260 1.1 jruoho
1261 1.1 jruoho InfoTable = AcpiDmTableInfoIvrs8a;
1262 1.1 jruoho break;
1263 1.1 jruoho
1264 1.1 jruoho /* 8-byte entries, type B */
1265 1.1 jruoho
1266 1.1 jruoho case ACPI_IVRS_TYPE_PAD8:
1267 1.1 jruoho case ACPI_IVRS_TYPE_EXT_SELECT:
1268 1.1 jruoho case ACPI_IVRS_TYPE_EXT_START:
1269 1.1 jruoho
1270 1.1 jruoho InfoTable = AcpiDmTableInfoIvrs8b;
1271 1.1 jruoho break;
1272 1.1 jruoho
1273 1.1 jruoho /* 8-byte entries, type C */
1274 1.1 jruoho
1275 1.1 jruoho case ACPI_IVRS_TYPE_SPECIAL:
1276 1.1 jruoho
1277 1.1 jruoho InfoTable = AcpiDmTableInfoIvrs8c;
1278 1.1 jruoho break;
1279 1.1 jruoho
1280 1.1 jruoho default:
1281 1.1.1.3.2.1 yamt
1282 1.1 jruoho DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
1283 1.1 jruoho "IVRS Device Entry");
1284 1.1 jruoho return (AE_ERROR);
1285 1.1 jruoho }
1286 1.1 jruoho
1287 1.1 jruoho Status = DtCompileTable (PFieldList, InfoTable,
1288 1.1 jruoho &Subtable, TRUE);
1289 1.1 jruoho if (ACPI_FAILURE (Status))
1290 1.1 jruoho {
1291 1.1 jruoho return (Status);
1292 1.1 jruoho }
1293 1.1 jruoho
1294 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1295 1.1 jruoho }
1296 1.1 jruoho }
1297 1.1 jruoho
1298 1.1.1.3.2.1 yamt DtPopSubtable ();
1299 1.1.1.3.2.1 yamt }
1300 1.1.1.3.2.1 yamt
1301 1.1.1.3.2.1 yamt return (AE_OK);
1302 1.1.1.3.2.1 yamt }
1303 1.1.1.3.2.1 yamt
1304 1.1.1.3.2.1 yamt
1305 1.1.1.3.2.1 yamt /******************************************************************************
1306 1.1.1.3.2.1 yamt *
1307 1.1.1.3.2.1 yamt * FUNCTION: DtCompileMadt
1308 1.1.1.3.2.1 yamt *
1309 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
1310 1.1.1.3.2.1 yamt *
1311 1.1.1.3.2.1 yamt * RETURN: Status
1312 1.1.1.3.2.1 yamt *
1313 1.1.1.3.2.1 yamt * DESCRIPTION: Compile MADT.
1314 1.1.1.3.2.1 yamt *
1315 1.1.1.3.2.1 yamt *****************************************************************************/
1316 1.1.1.3.2.1 yamt
1317 1.1.1.3.2.1 yamt ACPI_STATUS
1318 1.1.1.3.2.1 yamt DtCompileMadt (
1319 1.1.1.3.2.1 yamt void **List)
1320 1.1.1.3.2.1 yamt {
1321 1.1.1.3.2.1 yamt ACPI_STATUS Status;
1322 1.1.1.3.2.1 yamt DT_SUBTABLE *Subtable;
1323 1.1.1.3.2.1 yamt DT_SUBTABLE *ParentTable;
1324 1.1.1.3.2.1 yamt DT_FIELD **PFieldList = (DT_FIELD **) List;
1325 1.1.1.3.2.1 yamt DT_FIELD *SubtableStart;
1326 1.1.1.3.2.1 yamt ACPI_SUBTABLE_HEADER *MadtHeader;
1327 1.1.1.3.2.1 yamt ACPI_DMTABLE_INFO *InfoTable;
1328 1.1.1.3.2.1 yamt
1329 1.1.1.3.2.1 yamt
1330 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
1331 1.1.1.3.2.1 yamt &Subtable, TRUE);
1332 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1333 1.1.1.3.2.1 yamt {
1334 1.1.1.3.2.1 yamt return (Status);
1335 1.1.1.3.2.1 yamt }
1336 1.1.1.3.2.1 yamt
1337 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1338 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1339 1.1.1.3.2.1 yamt
1340 1.1.1.3.2.1 yamt while (*PFieldList)
1341 1.1.1.3.2.1 yamt {
1342 1.1.1.3.2.1 yamt SubtableStart = *PFieldList;
1343 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
1344 1.1.1.3.2.1 yamt &Subtable, TRUE);
1345 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1346 1.1.1.3.2.1 yamt {
1347 1.1.1.3.2.1 yamt return (Status);
1348 1.1.1.3.2.1 yamt }
1349 1.1.1.3.2.1 yamt
1350 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1351 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1352 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
1353 1.1.1.3.2.1 yamt
1354 1.1.1.3.2.1 yamt MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1355 1.1.1.3.2.1 yamt
1356 1.1.1.3.2.1 yamt switch (MadtHeader->Type)
1357 1.1.1.3.2.1 yamt {
1358 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_LOCAL_APIC:
1359 1.1.1.3.2.1 yamt
1360 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt0;
1361 1.1.1.3.2.1 yamt break;
1362 1.1.1.3.2.1 yamt
1363 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_IO_APIC:
1364 1.1.1.3.2.1 yamt
1365 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt1;
1366 1.1.1.3.2.1 yamt break;
1367 1.1.1.3.2.1 yamt
1368 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1369 1.1.1.3.2.1 yamt
1370 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt2;
1371 1.1.1.3.2.1 yamt break;
1372 1.1.1.3.2.1 yamt
1373 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_NMI_SOURCE:
1374 1.1.1.3.2.1 yamt
1375 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt3;
1376 1.1.1.3.2.1 yamt break;
1377 1.1.1.3.2.1 yamt
1378 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1379 1.1.1.3.2.1 yamt
1380 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt4;
1381 1.1.1.3.2.1 yamt break;
1382 1.1.1.3.2.1 yamt
1383 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1384 1.1.1.3.2.1 yamt
1385 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt5;
1386 1.1.1.3.2.1 yamt break;
1387 1.1.1.3.2.1 yamt
1388 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_IO_SAPIC:
1389 1.1.1.3.2.1 yamt
1390 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt6;
1391 1.1.1.3.2.1 yamt break;
1392 1.1.1.3.2.1 yamt
1393 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_LOCAL_SAPIC:
1394 1.1.1.3.2.1 yamt
1395 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt7;
1396 1.1.1.3.2.1 yamt break;
1397 1.1.1.3.2.1 yamt
1398 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1399 1.1.1.3.2.1 yamt
1400 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt8;
1401 1.1.1.3.2.1 yamt break;
1402 1.1.1.3.2.1 yamt
1403 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_LOCAL_X2APIC:
1404 1.1.1.3.2.1 yamt
1405 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt9;
1406 1.1.1.3.2.1 yamt break;
1407 1.1.1.3.2.1 yamt
1408 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1409 1.1.1.3.2.1 yamt
1410 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt10;
1411 1.1.1.3.2.1 yamt break;
1412 1.1.1.3.2.1 yamt
1413 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1414 1.1.1.3.2.1 yamt
1415 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt11;
1416 1.1.1.3.2.1 yamt break;
1417 1.1.1.3.2.1 yamt
1418 1.1.1.3.2.1 yamt case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1419 1.1.1.3.2.1 yamt
1420 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoMadt12;
1421 1.1.1.3.2.1 yamt break;
1422 1.1.1.3.2.1 yamt
1423 1.1.1.3.2.1 yamt default:
1424 1.1.1.3.2.1 yamt
1425 1.1.1.3.2.1 yamt DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
1426 1.1.1.3.2.1 yamt return (AE_ERROR);
1427 1.1.1.3.2.1 yamt }
1428 1.1.1.3.2.1 yamt
1429 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1430 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1431 1.1.1.3.2.1 yamt {
1432 1.1.1.3.2.1 yamt return (Status);
1433 1.1.1.3.2.1 yamt }
1434 1.1.1.3.2.1 yamt
1435 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1436 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1437 1.1.1.3.2.1 yamt DtPopSubtable ();
1438 1.1.1.3.2.1 yamt }
1439 1.1.1.3.2.1 yamt
1440 1.1.1.3.2.1 yamt return (AE_OK);
1441 1.1.1.3.2.1 yamt }
1442 1.1.1.3.2.1 yamt
1443 1.1.1.3.2.1 yamt
1444 1.1.1.3.2.1 yamt /******************************************************************************
1445 1.1.1.3.2.1 yamt *
1446 1.1.1.3.2.1 yamt * FUNCTION: DtCompileMcfg
1447 1.1.1.3.2.1 yamt *
1448 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
1449 1.1.1.3.2.1 yamt *
1450 1.1.1.3.2.1 yamt * RETURN: Status
1451 1.1.1.3.2.1 yamt *
1452 1.1.1.3.2.1 yamt * DESCRIPTION: Compile MCFG.
1453 1.1.1.3.2.1 yamt *
1454 1.1.1.3.2.1 yamt *****************************************************************************/
1455 1.1.1.3.2.1 yamt
1456 1.1.1.3.2.1 yamt ACPI_STATUS
1457 1.1.1.3.2.1 yamt DtCompileMcfg (
1458 1.1.1.3.2.1 yamt void **List)
1459 1.1.1.3.2.1 yamt {
1460 1.1.1.3.2.1 yamt ACPI_STATUS Status;
1461 1.1.1.3.2.1 yamt
1462 1.1.1.3.2.1 yamt
1463 1.1.1.3.2.1 yamt Status = DtCompileTwoSubtables (List,
1464 1.1.1.3.2.1 yamt AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
1465 1.1.1.3.2.1 yamt return (Status);
1466 1.1.1.3.2.1 yamt }
1467 1.1.1.3.2.1 yamt
1468 1.1.1.3.2.1 yamt
1469 1.1.1.3.2.1 yamt /******************************************************************************
1470 1.1.1.3.2.1 yamt *
1471 1.1.1.3.2.1 yamt * FUNCTION: DtCompileMpst
1472 1.1.1.3.2.1 yamt *
1473 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
1474 1.1.1.3.2.1 yamt *
1475 1.1.1.3.2.1 yamt * RETURN: Status
1476 1.1.1.3.2.1 yamt *
1477 1.1.1.3.2.1 yamt * DESCRIPTION: Compile MPST.
1478 1.1.1.3.2.1 yamt *
1479 1.1.1.3.2.1 yamt *****************************************************************************/
1480 1.1.1.3.2.1 yamt
1481 1.1.1.3.2.1 yamt ACPI_STATUS
1482 1.1.1.3.2.1 yamt DtCompileMpst (
1483 1.1.1.3.2.1 yamt void **List)
1484 1.1.1.3.2.1 yamt {
1485 1.1.1.3.2.1 yamt ACPI_STATUS Status;
1486 1.1.1.3.2.1 yamt DT_SUBTABLE *Subtable;
1487 1.1.1.3.2.1 yamt DT_SUBTABLE *ParentTable;
1488 1.1.1.3.2.1 yamt DT_FIELD **PFieldList = (DT_FIELD **) List;
1489 1.1.1.3.2.1 yamt ACPI_MPST_CHANNEL *MpstChannelInfo;
1490 1.1.1.3.2.1 yamt ACPI_MPST_POWER_NODE *MpstPowerNode;
1491 1.1.1.3.2.1 yamt ACPI_MPST_DATA_HDR *MpstDataHeader;
1492 1.1.1.3.2.1 yamt UINT16 SubtableCount;
1493 1.1.1.3.2.1 yamt UINT32 PowerStateCount;
1494 1.1.1.3.2.1 yamt UINT32 ComponentCount;
1495 1.1.1.3.2.1 yamt
1496 1.1.1.3.2.1 yamt
1497 1.1.1.3.2.1 yamt /* Main table */
1498 1.1.1.3.2.1 yamt
1499 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
1500 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1501 1.1.1.3.2.1 yamt {
1502 1.1.1.3.2.1 yamt return (Status);
1503 1.1.1.3.2.1 yamt }
1504 1.1.1.3.2.1 yamt
1505 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1506 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1507 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
1508 1.1.1.3.2.1 yamt
1509 1.1.1.3.2.1 yamt MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
1510 1.1.1.3.2.1 yamt SubtableCount = MpstChannelInfo->PowerNodeCount;
1511 1.1.1.3.2.1 yamt
1512 1.1.1.3.2.1 yamt while (*PFieldList && SubtableCount)
1513 1.1.1.3.2.1 yamt {
1514 1.1.1.3.2.1 yamt /* Subtable: Memory Power Node(s) */
1515 1.1.1.3.2.1 yamt
1516 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
1517 1.1.1.3.2.1 yamt &Subtable, TRUE);
1518 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1519 1.1.1.3.2.1 yamt {
1520 1.1.1.3.2.1 yamt return (Status);
1521 1.1.1.3.2.1 yamt }
1522 1.1.1.3.2.1 yamt
1523 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1524 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1525 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
1526 1.1.1.3.2.1 yamt
1527 1.1.1.3.2.1 yamt MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
1528 1.1.1.3.2.1 yamt PowerStateCount = MpstPowerNode->NumPowerStates;
1529 1.1.1.3.2.1 yamt ComponentCount = MpstPowerNode->NumPhysicalComponents;
1530 1.1.1.3.2.1 yamt
1531 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1532 1.1.1.3.2.1 yamt
1533 1.1.1.3.2.1 yamt /* Sub-subtables - Memory Power State Structure(s) */
1534 1.1.1.3.2.1 yamt
1535 1.1.1.3.2.1 yamt while (*PFieldList && PowerStateCount)
1536 1.1.1.3.2.1 yamt {
1537 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
1538 1.1.1.3.2.1 yamt &Subtable, TRUE);
1539 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1540 1.1.1.3.2.1 yamt {
1541 1.1.1.3.2.1 yamt return (Status);
1542 1.1.1.3.2.1 yamt }
1543 1.1.1.3.2.1 yamt
1544 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1545 1.1.1.3.2.1 yamt PowerStateCount--;
1546 1.1.1.3.2.1 yamt }
1547 1.1.1.3.2.1 yamt
1548 1.1.1.3.2.1 yamt /* Sub-subtables - Physical Component ID Structure(s) */
1549 1.1.1.3.2.1 yamt
1550 1.1.1.3.2.1 yamt while (*PFieldList && ComponentCount)
1551 1.1.1.3.2.1 yamt {
1552 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
1553 1.1.1.3.2.1 yamt &Subtable, TRUE);
1554 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1555 1.1.1.3.2.1 yamt {
1556 1.1.1.3.2.1 yamt return (Status);
1557 1.1.1.3.2.1 yamt }
1558 1.1.1.3.2.1 yamt
1559 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1560 1.1.1.3.2.1 yamt ComponentCount--;
1561 1.1.1.3.2.1 yamt }
1562 1.1.1.3.2.1 yamt
1563 1.1.1.3.2.1 yamt SubtableCount--;
1564 1.1.1.3.2.1 yamt DtPopSubtable ();
1565 1.1.1.3.2.1 yamt }
1566 1.1.1.3.2.1 yamt
1567 1.1.1.3.2.1 yamt /* Subtable: Count of Memory Power State Characteristic structures */
1568 1.1.1.3.2.1 yamt
1569 1.1.1.3.2.1 yamt DtPopSubtable ();
1570 1.1.1.3.2.1 yamt
1571 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
1572 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1573 1.1.1.3.2.1 yamt {
1574 1.1.1.3.2.1 yamt return (Status);
1575 1.1.1.3.2.1 yamt }
1576 1.1.1.3.2.1 yamt
1577 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1578 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1579 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
1580 1.1.1.3.2.1 yamt
1581 1.1.1.3.2.1 yamt MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
1582 1.1.1.3.2.1 yamt SubtableCount = MpstDataHeader->CharacteristicsCount;
1583 1.1.1.3.2.1 yamt
1584 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1585 1.1.1.3.2.1 yamt
1586 1.1.1.3.2.1 yamt /* Subtable: Memory Power State Characteristics structure(s) */
1587 1.1.1.3.2.1 yamt
1588 1.1.1.3.2.1 yamt while (*PFieldList && SubtableCount)
1589 1.1.1.3.2.1 yamt {
1590 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
1591 1.1.1.3.2.1 yamt &Subtable, TRUE);
1592 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1593 1.1.1.3.2.1 yamt {
1594 1.1.1.3.2.1 yamt return (Status);
1595 1.1.1.3.2.1 yamt }
1596 1.1.1.3.2.1 yamt
1597 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1598 1.1.1.3.2.1 yamt SubtableCount--;
1599 1.1.1.3.2.1 yamt }
1600 1.1.1.3.2.1 yamt
1601 1.1.1.3.2.1 yamt DtPopSubtable ();
1602 1.1.1.3.2.1 yamt return (AE_OK);
1603 1.1.1.3.2.1 yamt }
1604 1.1.1.3.2.1 yamt
1605 1.1.1.3.2.1 yamt
1606 1.1.1.3.2.1 yamt /******************************************************************************
1607 1.1.1.3.2.1 yamt *
1608 1.1.1.3.2.1 yamt * FUNCTION: DtCompileMsct
1609 1.1.1.3.2.1 yamt *
1610 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
1611 1.1.1.3.2.1 yamt *
1612 1.1.1.3.2.1 yamt * RETURN: Status
1613 1.1.1.3.2.1 yamt *
1614 1.1.1.3.2.1 yamt * DESCRIPTION: Compile MSCT.
1615 1.1.1.3.2.1 yamt *
1616 1.1.1.3.2.1 yamt *****************************************************************************/
1617 1.1.1.3.2.1 yamt
1618 1.1.1.3.2.1 yamt ACPI_STATUS
1619 1.1.1.3.2.1 yamt DtCompileMsct (
1620 1.1.1.3.2.1 yamt void **List)
1621 1.1.1.3.2.1 yamt {
1622 1.1.1.3.2.1 yamt ACPI_STATUS Status;
1623 1.1.1.3.2.1 yamt
1624 1.1.1.3.2.1 yamt
1625 1.1.1.3.2.1 yamt Status = DtCompileTwoSubtables (List,
1626 1.1.1.3.2.1 yamt AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
1627 1.1.1.3.2.1 yamt return (Status);
1628 1.1.1.3.2.1 yamt }
1629 1.1.1.3.2.1 yamt
1630 1.1.1.3.2.1 yamt
1631 1.1.1.3.2.1 yamt /******************************************************************************
1632 1.1.1.3.2.1 yamt *
1633 1.1.1.3.2.1 yamt * FUNCTION: DtCompileMtmr
1634 1.1.1.3.2.1 yamt *
1635 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
1636 1.1.1.3.2.1 yamt *
1637 1.1.1.3.2.1 yamt * RETURN: Status
1638 1.1.1.3.2.1 yamt *
1639 1.1.1.3.2.1 yamt * DESCRIPTION: Compile MTMR.
1640 1.1.1.3.2.1 yamt *
1641 1.1.1.3.2.1 yamt *****************************************************************************/
1642 1.1.1.3.2.1 yamt
1643 1.1.1.3.2.1 yamt ACPI_STATUS
1644 1.1.1.3.2.1 yamt DtCompileMtmr (
1645 1.1.1.3.2.1 yamt void **List)
1646 1.1.1.3.2.1 yamt {
1647 1.1.1.3.2.1 yamt ACPI_STATUS Status;
1648 1.1.1.3.2.1 yamt
1649 1.1 jruoho
1650 1.1.1.3.2.1 yamt Status = DtCompileTwoSubtables (List,
1651 1.1.1.3.2.1 yamt AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
1652 1.1.1.3.2.1 yamt return (Status);
1653 1.1 jruoho }
1654 1.1 jruoho
1655 1.1 jruoho
1656 1.1 jruoho /******************************************************************************
1657 1.1 jruoho *
1658 1.1.1.3.2.1 yamt * FUNCTION: DtCompilePcct
1659 1.1 jruoho *
1660 1.1 jruoho * PARAMETERS: List - Current field list pointer
1661 1.1 jruoho *
1662 1.1 jruoho * RETURN: Status
1663 1.1 jruoho *
1664 1.1.1.3.2.1 yamt * DESCRIPTION: Compile PCCT.
1665 1.1 jruoho *
1666 1.1 jruoho *****************************************************************************/
1667 1.1 jruoho
1668 1.1 jruoho ACPI_STATUS
1669 1.1.1.3.2.1 yamt DtCompilePcct (
1670 1.1 jruoho void **List)
1671 1.1 jruoho {
1672 1.1 jruoho ACPI_STATUS Status;
1673 1.1 jruoho DT_SUBTABLE *Subtable;
1674 1.1 jruoho DT_SUBTABLE *ParentTable;
1675 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
1676 1.1 jruoho DT_FIELD *SubtableStart;
1677 1.1.1.3.2.1 yamt ACPI_SUBTABLE_HEADER *PcctHeader;
1678 1.1 jruoho ACPI_DMTABLE_INFO *InfoTable;
1679 1.1 jruoho
1680 1.1 jruoho
1681 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
1682 1.1 jruoho &Subtable, TRUE);
1683 1.1 jruoho if (ACPI_FAILURE (Status))
1684 1.1 jruoho {
1685 1.1 jruoho return (Status);
1686 1.1 jruoho }
1687 1.1 jruoho
1688 1.1 jruoho ParentTable = DtPeekSubtable ();
1689 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1690 1.1 jruoho
1691 1.1 jruoho while (*PFieldList)
1692 1.1 jruoho {
1693 1.1 jruoho SubtableStart = *PFieldList;
1694 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
1695 1.1 jruoho &Subtable, TRUE);
1696 1.1 jruoho if (ACPI_FAILURE (Status))
1697 1.1 jruoho {
1698 1.1 jruoho return (Status);
1699 1.1 jruoho }
1700 1.1 jruoho
1701 1.1 jruoho ParentTable = DtPeekSubtable ();
1702 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1703 1.1 jruoho DtPushSubtable (Subtable);
1704 1.1 jruoho
1705 1.1.1.3.2.1 yamt PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1706 1.1 jruoho
1707 1.1.1.3.2.1 yamt switch (PcctHeader->Type)
1708 1.1 jruoho {
1709 1.1.1.3.2.1 yamt case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1710 1.1.1.3.2.1 yamt
1711 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoPcct0;
1712 1.1 jruoho break;
1713 1.1.1.3.2.1 yamt
1714 1.1 jruoho default:
1715 1.1.1.3.2.1 yamt
1716 1.1.1.3.2.1 yamt DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
1717 1.1 jruoho return (AE_ERROR);
1718 1.1 jruoho }
1719 1.1 jruoho
1720 1.1 jruoho Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1721 1.1 jruoho if (ACPI_FAILURE (Status))
1722 1.1 jruoho {
1723 1.1 jruoho return (Status);
1724 1.1 jruoho }
1725 1.1 jruoho
1726 1.1 jruoho ParentTable = DtPeekSubtable ();
1727 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1728 1.1 jruoho DtPopSubtable ();
1729 1.1 jruoho }
1730 1.1 jruoho
1731 1.1 jruoho return (AE_OK);
1732 1.1 jruoho }
1733 1.1 jruoho
1734 1.1 jruoho
1735 1.1 jruoho /******************************************************************************
1736 1.1 jruoho *
1737 1.1.1.3.2.1 yamt * FUNCTION: DtCompilePmtt
1738 1.1 jruoho *
1739 1.1 jruoho * PARAMETERS: List - Current field list pointer
1740 1.1 jruoho *
1741 1.1 jruoho * RETURN: Status
1742 1.1 jruoho *
1743 1.1.1.3.2.1 yamt * DESCRIPTION: Compile PMTT.
1744 1.1 jruoho *
1745 1.1 jruoho *****************************************************************************/
1746 1.1 jruoho
1747 1.1 jruoho ACPI_STATUS
1748 1.1.1.3.2.1 yamt DtCompilePmtt (
1749 1.1 jruoho void **List)
1750 1.1 jruoho {
1751 1.1 jruoho ACPI_STATUS Status;
1752 1.1.1.3.2.1 yamt DT_SUBTABLE *Subtable;
1753 1.1.1.3.2.1 yamt DT_SUBTABLE *ParentTable;
1754 1.1.1.3.2.1 yamt DT_FIELD **PFieldList = (DT_FIELD **) List;
1755 1.1.1.3.2.1 yamt DT_FIELD *SubtableStart;
1756 1.1.1.3.2.1 yamt ACPI_PMTT_HEADER *PmttHeader;
1757 1.1.1.3.2.1 yamt ACPI_PMTT_CONTROLLER *PmttController;
1758 1.1.1.3.2.1 yamt UINT16 DomainCount;
1759 1.1.1.3.2.1 yamt UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
1760 1.1 jruoho
1761 1.1 jruoho
1762 1.1.1.3.2.1 yamt /* Main table */
1763 1.1.1.3.2.1 yamt
1764 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
1765 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1766 1.1.1.3.2.1 yamt {
1767 1.1.1.3.2.1 yamt return (Status);
1768 1.1.1.3.2.1 yamt }
1769 1.1.1.3.2.1 yamt
1770 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1771 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1772 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
1773 1.1.1.3.2.1 yamt
1774 1.1.1.3.2.1 yamt while (*PFieldList)
1775 1.1.1.3.2.1 yamt {
1776 1.1.1.3.2.1 yamt SubtableStart = *PFieldList;
1777 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
1778 1.1.1.3.2.1 yamt &Subtable, TRUE);
1779 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1780 1.1.1.3.2.1 yamt {
1781 1.1.1.3.2.1 yamt return (Status);
1782 1.1.1.3.2.1 yamt }
1783 1.1.1.3.2.1 yamt
1784 1.1.1.3.2.1 yamt PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
1785 1.1.1.3.2.1 yamt while (PrevType >= PmttHeader->Type)
1786 1.1.1.3.2.1 yamt {
1787 1.1.1.3.2.1 yamt DtPopSubtable ();
1788 1.1.1.3.2.1 yamt
1789 1.1.1.3.2.1 yamt if (PrevType == ACPI_PMTT_TYPE_SOCKET)
1790 1.1.1.3.2.1 yamt {
1791 1.1.1.3.2.1 yamt break;
1792 1.1.1.3.2.1 yamt }
1793 1.1.1.3.2.1 yamt PrevType--;
1794 1.1.1.3.2.1 yamt }
1795 1.1.1.3.2.1 yamt PrevType = PmttHeader->Type;
1796 1.1.1.3.2.1 yamt
1797 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1798 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1799 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
1800 1.1.1.3.2.1 yamt
1801 1.1.1.3.2.1 yamt switch (PmttHeader->Type)
1802 1.1.1.3.2.1 yamt {
1803 1.1.1.3.2.1 yamt case ACPI_PMTT_TYPE_SOCKET:
1804 1.1.1.3.2.1 yamt
1805 1.1.1.3.2.1 yamt /* Subtable: Socket Structure */
1806 1.1.1.3.2.1 yamt
1807 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
1808 1.1.1.3.2.1 yamt &Subtable, TRUE);
1809 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1810 1.1.1.3.2.1 yamt {
1811 1.1.1.3.2.1 yamt return (Status);
1812 1.1.1.3.2.1 yamt }
1813 1.1.1.3.2.1 yamt
1814 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1815 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1816 1.1.1.3.2.1 yamt break;
1817 1.1.1.3.2.1 yamt
1818 1.1.1.3.2.1 yamt case ACPI_PMTT_TYPE_CONTROLLER:
1819 1.1.1.3.2.1 yamt
1820 1.1.1.3.2.1 yamt /* Subtable: Memory Controller Structure */
1821 1.1.1.3.2.1 yamt
1822 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
1823 1.1.1.3.2.1 yamt &Subtable, TRUE);
1824 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1825 1.1.1.3.2.1 yamt {
1826 1.1.1.3.2.1 yamt return (Status);
1827 1.1.1.3.2.1 yamt }
1828 1.1.1.3.2.1 yamt
1829 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1830 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1831 1.1.1.3.2.1 yamt
1832 1.1.1.3.2.1 yamt PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
1833 1.1.1.3.2.1 yamt (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
1834 1.1.1.3.2.1 yamt DomainCount = PmttController->DomainCount;
1835 1.1.1.3.2.1 yamt
1836 1.1.1.3.2.1 yamt while (DomainCount)
1837 1.1.1.3.2.1 yamt {
1838 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
1839 1.1.1.3.2.1 yamt &Subtable, TRUE);
1840 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1841 1.1.1.3.2.1 yamt {
1842 1.1.1.3.2.1 yamt return (Status);
1843 1.1.1.3.2.1 yamt }
1844 1.1.1.3.2.1 yamt
1845 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1846 1.1.1.3.2.1 yamt DomainCount--;
1847 1.1.1.3.2.1 yamt }
1848 1.1.1.3.2.1 yamt break;
1849 1.1.1.3.2.1 yamt
1850 1.1.1.3.2.1 yamt case ACPI_PMTT_TYPE_DIMM:
1851 1.1.1.3.2.1 yamt
1852 1.1.1.3.2.1 yamt /* Subtable: Physical Component Structure */
1853 1.1.1.3.2.1 yamt
1854 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
1855 1.1.1.3.2.1 yamt &Subtable, TRUE);
1856 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1857 1.1.1.3.2.1 yamt {
1858 1.1.1.3.2.1 yamt return (Status);
1859 1.1.1.3.2.1 yamt }
1860 1.1.1.3.2.1 yamt
1861 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1862 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1863 1.1.1.3.2.1 yamt break;
1864 1.1.1.3.2.1 yamt
1865 1.1.1.3.2.1 yamt default:
1866 1.1.1.3.2.1 yamt
1867 1.1.1.3.2.1 yamt DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
1868 1.1.1.3.2.1 yamt return (AE_ERROR);
1869 1.1.1.3.2.1 yamt }
1870 1.1.1.3.2.1 yamt }
1871 1.1.1.3.2.1 yamt
1872 1.1 jruoho return (Status);
1873 1.1 jruoho }
1874 1.1 jruoho
1875 1.1 jruoho
1876 1.1 jruoho /******************************************************************************
1877 1.1 jruoho *
1878 1.1.1.3.2.1 yamt * FUNCTION: DtCompileRsdt
1879 1.1 jruoho *
1880 1.1 jruoho * PARAMETERS: List - Current field list pointer
1881 1.1 jruoho *
1882 1.1 jruoho * RETURN: Status
1883 1.1 jruoho *
1884 1.1.1.3.2.1 yamt * DESCRIPTION: Compile RSDT.
1885 1.1 jruoho *
1886 1.1 jruoho *****************************************************************************/
1887 1.1 jruoho
1888 1.1 jruoho ACPI_STATUS
1889 1.1.1.3.2.1 yamt DtCompileRsdt (
1890 1.1 jruoho void **List)
1891 1.1 jruoho {
1892 1.1.1.3.2.1 yamt DT_SUBTABLE *Subtable;
1893 1.1.1.3.2.1 yamt DT_SUBTABLE *ParentTable;
1894 1.1.1.3.2.1 yamt DT_FIELD *FieldList = *(DT_FIELD **) List;
1895 1.1.1.3.2.1 yamt UINT32 Address;
1896 1.1 jruoho
1897 1.1 jruoho
1898 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1899 1.1.1.3.2.1 yamt
1900 1.1.1.3.2.1 yamt while (FieldList)
1901 1.1.1.3.2.1 yamt {
1902 1.1.1.3.2.1 yamt DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
1903 1.1.1.3.2.1 yamt
1904 1.1.1.3.2.1 yamt DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
1905 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1906 1.1.1.3.2.1 yamt FieldList = FieldList->Next;
1907 1.1.1.3.2.1 yamt }
1908 1.1.1.3.2.1 yamt
1909 1.1.1.3.2.1 yamt return (AE_OK);
1910 1.1 jruoho }
1911 1.1 jruoho
1912 1.1 jruoho
1913 1.1 jruoho /******************************************************************************
1914 1.1 jruoho *
1915 1.1.1.3.2.1 yamt * FUNCTION: DtCompileS3pt
1916 1.1 jruoho *
1917 1.1.1.3.2.1 yamt * PARAMETERS: PFieldList - Current field list pointer
1918 1.1 jruoho *
1919 1.1 jruoho * RETURN: Status
1920 1.1 jruoho *
1921 1.1.1.3.2.1 yamt * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
1922 1.1 jruoho *
1923 1.1 jruoho *****************************************************************************/
1924 1.1 jruoho
1925 1.1 jruoho ACPI_STATUS
1926 1.1.1.3.2.1 yamt DtCompileS3pt (
1927 1.1.1.3.2.1 yamt DT_FIELD **PFieldList)
1928 1.1 jruoho {
1929 1.1.1.3.2.1 yamt ACPI_STATUS Status;
1930 1.1.1.3.2.1 yamt ACPI_S3PT_HEADER *S3ptHeader;
1931 1.1 jruoho DT_SUBTABLE *Subtable;
1932 1.1 jruoho DT_SUBTABLE *ParentTable;
1933 1.1.1.3.2.1 yamt ACPI_DMTABLE_INFO *InfoTable;
1934 1.1.1.3.2.1 yamt DT_FIELD *SubtableStart;
1935 1.1 jruoho
1936 1.1 jruoho
1937 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
1938 1.1.1.3.2.1 yamt &Gbl_RootTable, TRUE);
1939 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1940 1.1.1.3.2.1 yamt {
1941 1.1.1.3.2.1 yamt return (Status);
1942 1.1.1.3.2.1 yamt }
1943 1.1 jruoho
1944 1.1.1.3.2.1 yamt DtPushSubtable (Gbl_RootTable);
1945 1.1.1.3.2.1 yamt
1946 1.1.1.3.2.1 yamt while (*PFieldList)
1947 1.1 jruoho {
1948 1.1.1.3.2.1 yamt SubtableStart = *PFieldList;
1949 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
1950 1.1.1.3.2.1 yamt &Subtable, TRUE);
1951 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1952 1.1.1.3.2.1 yamt {
1953 1.1.1.3.2.1 yamt return (Status);
1954 1.1.1.3.2.1 yamt }
1955 1.1 jruoho
1956 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1957 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
1958 1.1.1.3.2.1 yamt DtPushSubtable (Subtable);
1959 1.1.1.3.2.1 yamt
1960 1.1.1.3.2.1 yamt S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
1961 1.1.1.3.2.1 yamt
1962 1.1.1.3.2.1 yamt switch (S3ptHeader->Type)
1963 1.1.1.3.2.1 yamt {
1964 1.1.1.3.2.1 yamt case ACPI_S3PT_TYPE_RESUME:
1965 1.1.1.3.2.1 yamt
1966 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoS3pt0;
1967 1.1.1.3.2.1 yamt break;
1968 1.1.1.3.2.1 yamt
1969 1.1.1.3.2.1 yamt case ACPI_S3PT_TYPE_SUSPEND:
1970 1.1.1.3.2.1 yamt
1971 1.1.1.3.2.1 yamt InfoTable = AcpiDmTableInfoS3pt1;
1972 1.1.1.3.2.1 yamt break;
1973 1.1.1.3.2.1 yamt
1974 1.1.1.3.2.1 yamt default:
1975 1.1.1.3.2.1 yamt
1976 1.1.1.3.2.1 yamt DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
1977 1.1.1.3.2.1 yamt return (AE_ERROR);
1978 1.1.1.3.2.1 yamt }
1979 1.1.1.3.2.1 yamt
1980 1.1.1.3.2.1 yamt Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1981 1.1.1.3.2.1 yamt if (ACPI_FAILURE (Status))
1982 1.1.1.3.2.1 yamt {
1983 1.1.1.3.2.1 yamt return (Status);
1984 1.1.1.3.2.1 yamt }
1985 1.1.1.3.2.1 yamt
1986 1.1.1.3.2.1 yamt ParentTable = DtPeekSubtable ();
1987 1.1.1.3.2.1 yamt DtInsertSubtable (ParentTable, Subtable);
1988 1.1.1.3.2.1 yamt DtPopSubtable ();
1989 1.1 jruoho }
1990 1.1 jruoho
1991 1.1 jruoho return (AE_OK);
1992 1.1 jruoho }
1993 1.1 jruoho
1994 1.1 jruoho
1995 1.1 jruoho /******************************************************************************
1996 1.1 jruoho *
1997 1.1.1.3 jruoho * FUNCTION: DtCompileSlic
1998 1.1.1.3 jruoho *
1999 1.1.1.3 jruoho * PARAMETERS: List - Current field list pointer
2000 1.1.1.3 jruoho *
2001 1.1.1.3 jruoho * RETURN: Status
2002 1.1.1.3 jruoho *
2003 1.1.1.3 jruoho * DESCRIPTION: Compile SLIC.
2004 1.1.1.3 jruoho *
2005 1.1.1.3 jruoho *****************************************************************************/
2006 1.1.1.3 jruoho
2007 1.1.1.3 jruoho ACPI_STATUS
2008 1.1.1.3 jruoho DtCompileSlic (
2009 1.1.1.3 jruoho void **List)
2010 1.1.1.3 jruoho {
2011 1.1.1.3 jruoho ACPI_STATUS Status;
2012 1.1.1.3 jruoho DT_SUBTABLE *Subtable;
2013 1.1.1.3 jruoho DT_SUBTABLE *ParentTable;
2014 1.1.1.3 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
2015 1.1.1.3 jruoho DT_FIELD *SubtableStart;
2016 1.1.1.3 jruoho ACPI_SLIC_HEADER *SlicHeader;
2017 1.1.1.3 jruoho ACPI_DMTABLE_INFO *InfoTable;
2018 1.1.1.3 jruoho
2019 1.1.1.3 jruoho
2020 1.1.1.3 jruoho while (*PFieldList)
2021 1.1.1.3 jruoho {
2022 1.1.1.3 jruoho SubtableStart = *PFieldList;
2023 1.1.1.3 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr,
2024 1.1.1.3 jruoho &Subtable, TRUE);
2025 1.1.1.3 jruoho if (ACPI_FAILURE (Status))
2026 1.1.1.3 jruoho {
2027 1.1.1.3 jruoho return (Status);
2028 1.1.1.3 jruoho }
2029 1.1.1.3 jruoho
2030 1.1.1.3 jruoho ParentTable = DtPeekSubtable ();
2031 1.1.1.3 jruoho DtInsertSubtable (ParentTable, Subtable);
2032 1.1.1.3 jruoho DtPushSubtable (Subtable);
2033 1.1.1.3 jruoho
2034 1.1.1.3 jruoho SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer);
2035 1.1.1.3 jruoho
2036 1.1.1.3 jruoho switch (SlicHeader->Type)
2037 1.1.1.3 jruoho {
2038 1.1.1.3 jruoho case ACPI_SLIC_TYPE_PUBLIC_KEY:
2039 1.1.1.3.2.1 yamt
2040 1.1.1.3 jruoho InfoTable = AcpiDmTableInfoSlic0;
2041 1.1.1.3 jruoho break;
2042 1.1.1.3.2.1 yamt
2043 1.1.1.3 jruoho case ACPI_SLIC_TYPE_WINDOWS_MARKER:
2044 1.1.1.3.2.1 yamt
2045 1.1.1.3 jruoho InfoTable = AcpiDmTableInfoSlic1;
2046 1.1.1.3 jruoho break;
2047 1.1.1.3.2.1 yamt
2048 1.1.1.3 jruoho default:
2049 1.1.1.3.2.1 yamt
2050 1.1.1.3 jruoho DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC");
2051 1.1.1.3 jruoho return (AE_ERROR);
2052 1.1.1.3 jruoho }
2053 1.1.1.3 jruoho
2054 1.1.1.3 jruoho Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2055 1.1.1.3 jruoho if (ACPI_FAILURE (Status))
2056 1.1.1.3 jruoho {
2057 1.1.1.3 jruoho return (Status);
2058 1.1.1.3 jruoho }
2059 1.1.1.3 jruoho
2060 1.1.1.3 jruoho ParentTable = DtPeekSubtable ();
2061 1.1.1.3 jruoho DtInsertSubtable (ParentTable, Subtable);
2062 1.1.1.3 jruoho DtPopSubtable ();
2063 1.1.1.3 jruoho }
2064 1.1.1.3 jruoho
2065 1.1.1.3 jruoho return (AE_OK);
2066 1.1.1.3 jruoho }
2067 1.1.1.3 jruoho
2068 1.1.1.3 jruoho
2069 1.1.1.3 jruoho /******************************************************************************
2070 1.1.1.3 jruoho *
2071 1.1 jruoho * FUNCTION: DtCompileSlit
2072 1.1 jruoho *
2073 1.1 jruoho * PARAMETERS: List - Current field list pointer
2074 1.1 jruoho *
2075 1.1 jruoho * RETURN: Status
2076 1.1 jruoho *
2077 1.1 jruoho * DESCRIPTION: Compile SLIT.
2078 1.1 jruoho *
2079 1.1 jruoho *****************************************************************************/
2080 1.1 jruoho
2081 1.1 jruoho ACPI_STATUS
2082 1.1 jruoho DtCompileSlit (
2083 1.1 jruoho void **List)
2084 1.1 jruoho {
2085 1.1 jruoho ACPI_STATUS Status;
2086 1.1 jruoho DT_SUBTABLE *Subtable;
2087 1.1 jruoho DT_SUBTABLE *ParentTable;
2088 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
2089 1.1 jruoho DT_FIELD *FieldList;
2090 1.1 jruoho UINT32 Localities;
2091 1.1 jruoho UINT8 *LocalityBuffer;
2092 1.1 jruoho
2093 1.1 jruoho
2094 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
2095 1.1 jruoho &Subtable, TRUE);
2096 1.1 jruoho if (ACPI_FAILURE (Status))
2097 1.1 jruoho {
2098 1.1 jruoho return (Status);
2099 1.1 jruoho }
2100 1.1 jruoho
2101 1.1 jruoho ParentTable = DtPeekSubtable ();
2102 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
2103 1.1 jruoho
2104 1.1 jruoho Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
2105 1.1 jruoho LocalityBuffer = UtLocalCalloc (Localities);
2106 1.1 jruoho
2107 1.1.1.3 jruoho /* Compile each locality buffer */
2108 1.1.1.3 jruoho
2109 1.1 jruoho FieldList = *PFieldList;
2110 1.1 jruoho while (FieldList)
2111 1.1 jruoho {
2112 1.1.1.3 jruoho DtCompileBuffer (LocalityBuffer,
2113 1.1.1.3 jruoho FieldList->Value, FieldList, Localities);
2114 1.1 jruoho
2115 1.1 jruoho DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
2116 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
2117 1.1.1.3 jruoho FieldList = FieldList->Next;
2118 1.1 jruoho }
2119 1.1 jruoho
2120 1.1 jruoho ACPI_FREE (LocalityBuffer);
2121 1.1 jruoho return (AE_OK);
2122 1.1 jruoho }
2123 1.1 jruoho
2124 1.1 jruoho
2125 1.1 jruoho /******************************************************************************
2126 1.1 jruoho *
2127 1.1 jruoho * FUNCTION: DtCompileSrat
2128 1.1 jruoho *
2129 1.1 jruoho * PARAMETERS: List - Current field list pointer
2130 1.1 jruoho *
2131 1.1 jruoho * RETURN: Status
2132 1.1 jruoho *
2133 1.1 jruoho * DESCRIPTION: Compile SRAT.
2134 1.1 jruoho *
2135 1.1 jruoho *****************************************************************************/
2136 1.1 jruoho
2137 1.1 jruoho ACPI_STATUS
2138 1.1 jruoho DtCompileSrat (
2139 1.1 jruoho void **List)
2140 1.1 jruoho {
2141 1.1 jruoho ACPI_STATUS Status;
2142 1.1 jruoho DT_SUBTABLE *Subtable;
2143 1.1 jruoho DT_SUBTABLE *ParentTable;
2144 1.1 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
2145 1.1 jruoho DT_FIELD *SubtableStart;
2146 1.1 jruoho ACPI_SUBTABLE_HEADER *SratHeader;
2147 1.1 jruoho ACPI_DMTABLE_INFO *InfoTable;
2148 1.1 jruoho
2149 1.1 jruoho
2150 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
2151 1.1 jruoho &Subtable, TRUE);
2152 1.1 jruoho if (ACPI_FAILURE (Status))
2153 1.1 jruoho {
2154 1.1 jruoho return (Status);
2155 1.1 jruoho }
2156 1.1 jruoho
2157 1.1 jruoho ParentTable = DtPeekSubtable ();
2158 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
2159 1.1 jruoho
2160 1.1 jruoho while (*PFieldList)
2161 1.1 jruoho {
2162 1.1 jruoho SubtableStart = *PFieldList;
2163 1.1 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
2164 1.1 jruoho &Subtable, TRUE);
2165 1.1 jruoho if (ACPI_FAILURE (Status))
2166 1.1 jruoho {
2167 1.1 jruoho return (Status);
2168 1.1 jruoho }
2169 1.1 jruoho
2170 1.1 jruoho ParentTable = DtPeekSubtable ();
2171 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
2172 1.1 jruoho DtPushSubtable (Subtable);
2173 1.1 jruoho
2174 1.1 jruoho SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2175 1.1 jruoho
2176 1.1 jruoho switch (SratHeader->Type)
2177 1.1 jruoho {
2178 1.1 jruoho case ACPI_SRAT_TYPE_CPU_AFFINITY:
2179 1.1.1.3.2.1 yamt
2180 1.1 jruoho InfoTable = AcpiDmTableInfoSrat0;
2181 1.1 jruoho break;
2182 1.1.1.3.2.1 yamt
2183 1.1 jruoho case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2184 1.1.1.3.2.1 yamt
2185 1.1 jruoho InfoTable = AcpiDmTableInfoSrat1;
2186 1.1 jruoho break;
2187 1.1.1.3.2.1 yamt
2188 1.1 jruoho case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2189 1.1.1.3.2.1 yamt
2190 1.1 jruoho InfoTable = AcpiDmTableInfoSrat2;
2191 1.1 jruoho break;
2192 1.1.1.3.2.1 yamt
2193 1.1 jruoho default:
2194 1.1.1.3.2.1 yamt
2195 1.1 jruoho DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
2196 1.1 jruoho return (AE_ERROR);
2197 1.1 jruoho }
2198 1.1 jruoho
2199 1.1 jruoho Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2200 1.1 jruoho if (ACPI_FAILURE (Status))
2201 1.1 jruoho {
2202 1.1 jruoho return (Status);
2203 1.1 jruoho }
2204 1.1 jruoho
2205 1.1 jruoho ParentTable = DtPeekSubtable ();
2206 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
2207 1.1 jruoho DtPopSubtable ();
2208 1.1 jruoho }
2209 1.1 jruoho
2210 1.1 jruoho return (AE_OK);
2211 1.1 jruoho }
2212 1.1 jruoho
2213 1.1 jruoho
2214 1.1 jruoho /******************************************************************************
2215 1.1 jruoho *
2216 1.1.1.2 jruoho * FUNCTION: DtGetGenericTableInfo
2217 1.1.1.2 jruoho *
2218 1.1.1.2 jruoho * PARAMETERS: Name - Generic type name
2219 1.1.1.2 jruoho *
2220 1.1.1.2 jruoho * RETURN: Info entry
2221 1.1.1.2 jruoho *
2222 1.1.1.2 jruoho * DESCRIPTION: Obtain table info for a generic name entry
2223 1.1.1.2 jruoho *
2224 1.1.1.2 jruoho *****************************************************************************/
2225 1.1.1.2 jruoho
2226 1.1.1.2 jruoho ACPI_DMTABLE_INFO *
2227 1.1.1.2 jruoho DtGetGenericTableInfo (
2228 1.1.1.2 jruoho char *Name)
2229 1.1.1.2 jruoho {
2230 1.1.1.2 jruoho ACPI_DMTABLE_INFO *Info;
2231 1.1.1.2 jruoho UINT32 i;
2232 1.1.1.2 jruoho
2233 1.1.1.2 jruoho
2234 1.1.1.2 jruoho if (!Name)
2235 1.1.1.2 jruoho {
2236 1.1.1.2 jruoho return (NULL);
2237 1.1.1.2 jruoho }
2238 1.1.1.2 jruoho
2239 1.1.1.2 jruoho /* Search info table for name match */
2240 1.1.1.2 jruoho
2241 1.1.1.2 jruoho for (i = 0; ; i++)
2242 1.1.1.2 jruoho {
2243 1.1.1.2 jruoho Info = AcpiDmTableInfoGeneric[i];
2244 1.1.1.2 jruoho if (Info->Opcode == ACPI_DMT_EXIT)
2245 1.1.1.2 jruoho {
2246 1.1.1.2 jruoho Info = NULL;
2247 1.1.1.2 jruoho break;
2248 1.1.1.2 jruoho }
2249 1.1.1.2 jruoho
2250 1.1.1.3.2.1 yamt /* Use caseless compare for generic keywords */
2251 1.1.1.3.2.1 yamt
2252 1.1.1.3.2.1 yamt if (!AcpiUtStricmp (Name, Info->Name))
2253 1.1.1.2 jruoho {
2254 1.1.1.2 jruoho break;
2255 1.1.1.2 jruoho }
2256 1.1.1.2 jruoho }
2257 1.1.1.2 jruoho
2258 1.1.1.2 jruoho return (Info);
2259 1.1.1.2 jruoho }
2260 1.1.1.2 jruoho
2261 1.1.1.2 jruoho
2262 1.1.1.2 jruoho /******************************************************************************
2263 1.1.1.2 jruoho *
2264 1.1.1.2 jruoho * FUNCTION: DtCompileUefi
2265 1.1.1.2 jruoho *
2266 1.1.1.2 jruoho * PARAMETERS: List - Current field list pointer
2267 1.1.1.2 jruoho *
2268 1.1.1.2 jruoho * RETURN: Status
2269 1.1.1.2 jruoho *
2270 1.1.1.2 jruoho * DESCRIPTION: Compile UEFI.
2271 1.1.1.2 jruoho *
2272 1.1.1.2 jruoho *****************************************************************************/
2273 1.1.1.2 jruoho
2274 1.1.1.2 jruoho ACPI_STATUS
2275 1.1.1.2 jruoho DtCompileUefi (
2276 1.1.1.2 jruoho void **List)
2277 1.1.1.2 jruoho {
2278 1.1.1.2 jruoho ACPI_STATUS Status;
2279 1.1.1.2 jruoho DT_SUBTABLE *Subtable;
2280 1.1.1.2 jruoho DT_SUBTABLE *ParentTable;
2281 1.1.1.2 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
2282 1.1.1.2 jruoho UINT16 *DataOffset;
2283 1.1.1.2 jruoho
2284 1.1.1.2 jruoho
2285 1.1.1.2 jruoho /* Compile the predefined portion of the UEFI table */
2286 1.1.1.2 jruoho
2287 1.1.1.2 jruoho Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
2288 1.1.1.2 jruoho &Subtable, TRUE);
2289 1.1.1.2 jruoho if (ACPI_FAILURE (Status))
2290 1.1.1.2 jruoho {
2291 1.1.1.2 jruoho return (Status);
2292 1.1.1.2 jruoho }
2293 1.1.1.2 jruoho
2294 1.1.1.2 jruoho DataOffset = (UINT16 *) (Subtable->Buffer + 16);
2295 1.1.1.2 jruoho *DataOffset = sizeof (ACPI_TABLE_UEFI);
2296 1.1.1.2 jruoho
2297 1.1.1.2 jruoho ParentTable = DtPeekSubtable ();
2298 1.1.1.2 jruoho DtInsertSubtable (ParentTable, Subtable);
2299 1.1.1.2 jruoho
2300 1.1.1.2 jruoho /*
2301 1.1.1.2 jruoho * Compile the "generic" portion of the UEFI table. This
2302 1.1.1.2 jruoho * part of the table is not predefined and any of the generic
2303 1.1.1.2 jruoho * operators may be used.
2304 1.1.1.2 jruoho */
2305 1.1.1.2 jruoho
2306 1.1.1.3 jruoho DtCompileGeneric ((void **) PFieldList);
2307 1.1.1.2 jruoho
2308 1.1.1.2 jruoho return (AE_OK);
2309 1.1.1.2 jruoho }
2310 1.1.1.2 jruoho
2311 1.1.1.2 jruoho
2312 1.1.1.2 jruoho /******************************************************************************
2313 1.1.1.2 jruoho *
2314 1.1.1.3.2.1 yamt * FUNCTION: DtCompileVrtc
2315 1.1.1.3.2.1 yamt *
2316 1.1.1.3.2.1 yamt * PARAMETERS: List - Current field list pointer
2317 1.1.1.3.2.1 yamt *
2318 1.1.1.3.2.1 yamt * RETURN: Status
2319 1.1.1.3.2.1 yamt *
2320 1.1.1.3.2.1 yamt * DESCRIPTION: Compile VRTC.
2321 1.1.1.3.2.1 yamt *
2322 1.1.1.3.2.1 yamt *****************************************************************************/
2323 1.1.1.3.2.1 yamt
2324 1.1.1.3.2.1 yamt ACPI_STATUS
2325 1.1.1.3.2.1 yamt DtCompileVrtc (
2326 1.1.1.3.2.1 yamt void **List)
2327 1.1.1.3.2.1 yamt {
2328 1.1.1.3.2.1 yamt ACPI_STATUS Status;
2329 1.1.1.3.2.1 yamt
2330 1.1.1.3.2.1 yamt
2331 1.1.1.3.2.1 yamt Status = DtCompileTwoSubtables (List,
2332 1.1.1.3.2.1 yamt AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
2333 1.1.1.3.2.1 yamt return (Status);
2334 1.1.1.3.2.1 yamt }
2335 1.1.1.3.2.1 yamt
2336 1.1.1.3.2.1 yamt
2337 1.1.1.3.2.1 yamt /******************************************************************************
2338 1.1.1.3.2.1 yamt *
2339 1.1 jruoho * FUNCTION: DtCompileWdat
2340 1.1 jruoho *
2341 1.1 jruoho * PARAMETERS: List - Current field list pointer
2342 1.1 jruoho *
2343 1.1 jruoho * RETURN: Status
2344 1.1 jruoho *
2345 1.1 jruoho * DESCRIPTION: Compile WDAT.
2346 1.1 jruoho *
2347 1.1 jruoho *****************************************************************************/
2348 1.1 jruoho
2349 1.1 jruoho ACPI_STATUS
2350 1.1 jruoho DtCompileWdat (
2351 1.1 jruoho void **List)
2352 1.1 jruoho {
2353 1.1 jruoho ACPI_STATUS Status;
2354 1.1 jruoho
2355 1.1 jruoho
2356 1.1 jruoho Status = DtCompileTwoSubtables (List,
2357 1.1 jruoho AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
2358 1.1 jruoho return (Status);
2359 1.1 jruoho }
2360 1.1 jruoho
2361 1.1 jruoho
2362 1.1 jruoho /******************************************************************************
2363 1.1 jruoho *
2364 1.1 jruoho * FUNCTION: DtCompileXsdt
2365 1.1 jruoho *
2366 1.1 jruoho * PARAMETERS: List - Current field list pointer
2367 1.1 jruoho *
2368 1.1 jruoho * RETURN: Status
2369 1.1 jruoho *
2370 1.1 jruoho * DESCRIPTION: Compile XSDT.
2371 1.1 jruoho *
2372 1.1 jruoho *****************************************************************************/
2373 1.1 jruoho
2374 1.1 jruoho ACPI_STATUS
2375 1.1 jruoho DtCompileXsdt (
2376 1.1 jruoho void **List)
2377 1.1 jruoho {
2378 1.1 jruoho DT_SUBTABLE *Subtable;
2379 1.1 jruoho DT_SUBTABLE *ParentTable;
2380 1.1 jruoho DT_FIELD *FieldList = *(DT_FIELD **) List;
2381 1.1 jruoho UINT64 Address;
2382 1.1 jruoho
2383 1.1 jruoho ParentTable = DtPeekSubtable ();
2384 1.1 jruoho
2385 1.1 jruoho while (FieldList)
2386 1.1 jruoho {
2387 1.1 jruoho DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
2388 1.1 jruoho
2389 1.1 jruoho DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
2390 1.1 jruoho DtInsertSubtable (ParentTable, Subtable);
2391 1.1 jruoho FieldList = FieldList->Next;
2392 1.1 jruoho }
2393 1.1 jruoho
2394 1.1 jruoho return (AE_OK);
2395 1.1 jruoho }
2396 1.1.1.3 jruoho
2397 1.1.1.3 jruoho
2398 1.1.1.3 jruoho /******************************************************************************
2399 1.1.1.3 jruoho *
2400 1.1.1.3 jruoho * FUNCTION: DtCompileGeneric
2401 1.1.1.3 jruoho *
2402 1.1.1.3 jruoho * PARAMETERS: List - Current field list pointer
2403 1.1.1.3 jruoho *
2404 1.1.1.3 jruoho * RETURN: Status
2405 1.1.1.3 jruoho *
2406 1.1.1.3 jruoho * DESCRIPTION: Compile generic unknown table.
2407 1.1.1.3 jruoho *
2408 1.1.1.3 jruoho *****************************************************************************/
2409 1.1.1.3 jruoho
2410 1.1.1.3 jruoho ACPI_STATUS
2411 1.1.1.3 jruoho DtCompileGeneric (
2412 1.1.1.3 jruoho void **List)
2413 1.1.1.3 jruoho {
2414 1.1.1.3 jruoho ACPI_STATUS Status;
2415 1.1.1.3 jruoho DT_SUBTABLE *Subtable;
2416 1.1.1.3 jruoho DT_SUBTABLE *ParentTable;
2417 1.1.1.3 jruoho DT_FIELD **PFieldList = (DT_FIELD **) List;
2418 1.1.1.3 jruoho ACPI_DMTABLE_INFO *Info;
2419 1.1.1.3 jruoho
2420 1.1.1.3 jruoho
2421 1.1.1.3 jruoho ParentTable = DtPeekSubtable ();
2422 1.1.1.3 jruoho
2423 1.1.1.3 jruoho /*
2424 1.1.1.3 jruoho * Compile the "generic" portion of the table. This
2425 1.1.1.3 jruoho * part of the table is not predefined and any of the generic
2426 1.1.1.3 jruoho * operators may be used.
2427 1.1.1.3 jruoho */
2428 1.1.1.3 jruoho
2429 1.1.1.3 jruoho /* Find any and all labels in the entire generic portion */
2430 1.1.1.3 jruoho
2431 1.1.1.3 jruoho DtDetectAllLabels (*PFieldList);
2432 1.1.1.3 jruoho
2433 1.1.1.3 jruoho /* Now we can actually compile the parse tree */
2434 1.1.1.3 jruoho
2435 1.1.1.3 jruoho while (*PFieldList)
2436 1.1.1.3 jruoho {
2437 1.1.1.3 jruoho Info = DtGetGenericTableInfo ((*PFieldList)->Name);
2438 1.1.1.3 jruoho if (!Info)
2439 1.1.1.3 jruoho {
2440 1.1.1.3.2.1 yamt snprintf (MsgBuffer, sizeof(MsgBuffer), "Generic data type \"%s\" not found",
2441 1.1.1.3 jruoho (*PFieldList)->Name);
2442 1.1.1.3 jruoho DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
2443 1.1.1.3 jruoho (*PFieldList), MsgBuffer);
2444 1.1.1.3 jruoho
2445 1.1.1.3 jruoho *PFieldList = (*PFieldList)->Next;
2446 1.1.1.3 jruoho continue;
2447 1.1.1.3 jruoho }
2448 1.1.1.3 jruoho
2449 1.1.1.3 jruoho Status = DtCompileTable (PFieldList, Info,
2450 1.1.1.3 jruoho &Subtable, TRUE);
2451 1.1.1.3 jruoho if (ACPI_SUCCESS (Status))
2452 1.1.1.3 jruoho {
2453 1.1.1.3 jruoho DtInsertSubtable (ParentTable, Subtable);
2454 1.1.1.3 jruoho }
2455 1.1.1.3 jruoho else
2456 1.1.1.3 jruoho {
2457 1.1.1.3 jruoho *PFieldList = (*PFieldList)->Next;
2458 1.1.1.3 jruoho
2459 1.1.1.3 jruoho if (Status == AE_NOT_FOUND)
2460 1.1.1.3 jruoho {
2461 1.1.1.3.2.1 yamt snprintf (MsgBuffer, sizeof(MsgBuffer), "Generic data type \"%s\" not found",
2462 1.1.1.3 jruoho (*PFieldList)->Name);
2463 1.1.1.3 jruoho DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
2464 1.1.1.3 jruoho (*PFieldList), MsgBuffer);
2465 1.1.1.3 jruoho }
2466 1.1.1.3 jruoho }
2467 1.1.1.3 jruoho }
2468 1.1.1.3 jruoho
2469 1.1.1.3 jruoho return (AE_OK);
2470 1.1.1.3 jruoho }
2471