dttable2.c revision 1.1.1.2 1 /******************************************************************************
2 *
3 * Module Name: dttable2.c - handling for specific ACPI tables
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2016, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44 /* Compile all complex data tables, signatures starting with L-Z */
45
46 #include "aslcompiler.h"
47 #include "dtcompiler.h"
48
49 #define _COMPONENT DT_COMPILER
50 ACPI_MODULE_NAME ("dttable2")
51
52
53 /******************************************************************************
54 *
55 * FUNCTION: DtCompileLpit
56 *
57 * PARAMETERS: List - Current field list pointer
58 *
59 * RETURN: Status
60 *
61 * DESCRIPTION: Compile LPIT.
62 *
63 *****************************************************************************/
64
65 ACPI_STATUS
66 DtCompileLpit (
67 void **List)
68 {
69 ACPI_STATUS Status;
70 DT_SUBTABLE *Subtable;
71 DT_SUBTABLE *ParentTable;
72 DT_FIELD **PFieldList = (DT_FIELD **) List;
73 DT_FIELD *SubtableStart;
74 ACPI_DMTABLE_INFO *InfoTable;
75 ACPI_LPIT_HEADER *LpitHeader;
76
77
78 /* Note: Main table consists only of the standard ACPI table header */
79
80 while (*PFieldList)
81 {
82 SubtableStart = *PFieldList;
83
84 /* LPIT Subtable header */
85
86 Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
87 &Subtable, TRUE);
88 if (ACPI_FAILURE (Status))
89 {
90 return (Status);
91 }
92
93 ParentTable = DtPeekSubtable ();
94 DtInsertSubtable (ParentTable, Subtable);
95 DtPushSubtable (Subtable);
96
97 LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
98
99 switch (LpitHeader->Type)
100 {
101 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
102
103 InfoTable = AcpiDmTableInfoLpit0;
104 break;
105
106 default:
107
108 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
109 return (AE_ERROR);
110 }
111
112 /* LPIT Subtable */
113
114 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
115 if (ACPI_FAILURE (Status))
116 {
117 return (Status);
118 }
119
120 ParentTable = DtPeekSubtable ();
121 DtInsertSubtable (ParentTable, Subtable);
122 DtPopSubtable ();
123 }
124
125 return (AE_OK);
126 }
127
128
129 /******************************************************************************
130 *
131 * FUNCTION: DtCompileMadt
132 *
133 * PARAMETERS: List - Current field list pointer
134 *
135 * RETURN: Status
136 *
137 * DESCRIPTION: Compile MADT.
138 *
139 *****************************************************************************/
140
141 ACPI_STATUS
142 DtCompileMadt (
143 void **List)
144 {
145 ACPI_STATUS Status;
146 DT_SUBTABLE *Subtable;
147 DT_SUBTABLE *ParentTable;
148 DT_FIELD **PFieldList = (DT_FIELD **) List;
149 DT_FIELD *SubtableStart;
150 ACPI_SUBTABLE_HEADER *MadtHeader;
151 ACPI_DMTABLE_INFO *InfoTable;
152
153
154 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
155 &Subtable, TRUE);
156 if (ACPI_FAILURE (Status))
157 {
158 return (Status);
159 }
160
161 ParentTable = DtPeekSubtable ();
162 DtInsertSubtable (ParentTable, Subtable);
163
164 while (*PFieldList)
165 {
166 SubtableStart = *PFieldList;
167 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
168 &Subtable, TRUE);
169 if (ACPI_FAILURE (Status))
170 {
171 return (Status);
172 }
173
174 ParentTable = DtPeekSubtable ();
175 DtInsertSubtable (ParentTable, Subtable);
176 DtPushSubtable (Subtable);
177
178 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
179
180 switch (MadtHeader->Type)
181 {
182 case ACPI_MADT_TYPE_LOCAL_APIC:
183
184 InfoTable = AcpiDmTableInfoMadt0;
185 break;
186
187 case ACPI_MADT_TYPE_IO_APIC:
188
189 InfoTable = AcpiDmTableInfoMadt1;
190 break;
191
192 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
193
194 InfoTable = AcpiDmTableInfoMadt2;
195 break;
196
197 case ACPI_MADT_TYPE_NMI_SOURCE:
198
199 InfoTable = AcpiDmTableInfoMadt3;
200 break;
201
202 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
203
204 InfoTable = AcpiDmTableInfoMadt4;
205 break;
206
207 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
208
209 InfoTable = AcpiDmTableInfoMadt5;
210 break;
211
212 case ACPI_MADT_TYPE_IO_SAPIC:
213
214 InfoTable = AcpiDmTableInfoMadt6;
215 break;
216
217 case ACPI_MADT_TYPE_LOCAL_SAPIC:
218
219 InfoTable = AcpiDmTableInfoMadt7;
220 break;
221
222 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
223
224 InfoTable = AcpiDmTableInfoMadt8;
225 break;
226
227 case ACPI_MADT_TYPE_LOCAL_X2APIC:
228
229 InfoTable = AcpiDmTableInfoMadt9;
230 break;
231
232 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
233
234 InfoTable = AcpiDmTableInfoMadt10;
235 break;
236
237 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
238
239 InfoTable = AcpiDmTableInfoMadt11;
240 break;
241
242 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
243
244 InfoTable = AcpiDmTableInfoMadt12;
245 break;
246
247 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
248
249 InfoTable = AcpiDmTableInfoMadt13;
250 break;
251
252 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
253
254 InfoTable = AcpiDmTableInfoMadt14;
255 break;
256
257 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
258
259 InfoTable = AcpiDmTableInfoMadt15;
260 break;
261
262 default:
263
264 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
265 return (AE_ERROR);
266 }
267
268 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
269 if (ACPI_FAILURE (Status))
270 {
271 return (Status);
272 }
273
274 ParentTable = DtPeekSubtable ();
275 DtInsertSubtable (ParentTable, Subtable);
276 DtPopSubtable ();
277 }
278
279 return (AE_OK);
280 }
281
282
283 /******************************************************************************
284 *
285 * FUNCTION: DtCompileMcfg
286 *
287 * PARAMETERS: List - Current field list pointer
288 *
289 * RETURN: Status
290 *
291 * DESCRIPTION: Compile MCFG.
292 *
293 *****************************************************************************/
294
295 ACPI_STATUS
296 DtCompileMcfg (
297 void **List)
298 {
299 ACPI_STATUS Status;
300
301
302 Status = DtCompileTwoSubtables (List,
303 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
304 return (Status);
305 }
306
307
308 /******************************************************************************
309 *
310 * FUNCTION: DtCompileMpst
311 *
312 * PARAMETERS: List - Current field list pointer
313 *
314 * RETURN: Status
315 *
316 * DESCRIPTION: Compile MPST.
317 *
318 *****************************************************************************/
319
320 ACPI_STATUS
321 DtCompileMpst (
322 void **List)
323 {
324 ACPI_STATUS Status;
325 DT_SUBTABLE *Subtable;
326 DT_SUBTABLE *ParentTable;
327 DT_FIELD **PFieldList = (DT_FIELD **) List;
328 ACPI_MPST_CHANNEL *MpstChannelInfo;
329 ACPI_MPST_POWER_NODE *MpstPowerNode;
330 ACPI_MPST_DATA_HDR *MpstDataHeader;
331 UINT16 SubtableCount;
332 UINT32 PowerStateCount;
333 UINT32 ComponentCount;
334
335
336 /* Main table */
337
338 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
339 if (ACPI_FAILURE (Status))
340 {
341 return (Status);
342 }
343
344 ParentTable = DtPeekSubtable ();
345 DtInsertSubtable (ParentTable, Subtable);
346 DtPushSubtable (Subtable);
347
348 MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
349 SubtableCount = MpstChannelInfo->PowerNodeCount;
350
351 while (*PFieldList && SubtableCount)
352 {
353 /* Subtable: Memory Power Node(s) */
354
355 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
356 &Subtable, TRUE);
357 if (ACPI_FAILURE (Status))
358 {
359 return (Status);
360 }
361
362 ParentTable = DtPeekSubtable ();
363 DtInsertSubtable (ParentTable, Subtable);
364 DtPushSubtable (Subtable);
365
366 MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
367 PowerStateCount = MpstPowerNode->NumPowerStates;
368 ComponentCount = MpstPowerNode->NumPhysicalComponents;
369
370 ParentTable = DtPeekSubtable ();
371
372 /* Sub-subtables - Memory Power State Structure(s) */
373
374 while (*PFieldList && PowerStateCount)
375 {
376 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
377 &Subtable, TRUE);
378 if (ACPI_FAILURE (Status))
379 {
380 return (Status);
381 }
382
383 DtInsertSubtable (ParentTable, Subtable);
384 PowerStateCount--;
385 }
386
387 /* Sub-subtables - Physical Component ID Structure(s) */
388
389 while (*PFieldList && ComponentCount)
390 {
391 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
392 &Subtable, TRUE);
393 if (ACPI_FAILURE (Status))
394 {
395 return (Status);
396 }
397
398 DtInsertSubtable (ParentTable, Subtable);
399 ComponentCount--;
400 }
401
402 SubtableCount--;
403 DtPopSubtable ();
404 }
405
406 /* Subtable: Count of Memory Power State Characteristic structures */
407
408 DtPopSubtable ();
409
410 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
411 if (ACPI_FAILURE (Status))
412 {
413 return (Status);
414 }
415
416 ParentTable = DtPeekSubtable ();
417 DtInsertSubtable (ParentTable, Subtable);
418 DtPushSubtable (Subtable);
419
420 MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
421 SubtableCount = MpstDataHeader->CharacteristicsCount;
422
423 ParentTable = DtPeekSubtable ();
424
425 /* Subtable: Memory Power State Characteristics structure(s) */
426
427 while (*PFieldList && SubtableCount)
428 {
429 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
430 &Subtable, TRUE);
431 if (ACPI_FAILURE (Status))
432 {
433 return (Status);
434 }
435
436 DtInsertSubtable (ParentTable, Subtable);
437 SubtableCount--;
438 }
439
440 DtPopSubtable ();
441 return (AE_OK);
442 }
443
444
445 /******************************************************************************
446 *
447 * FUNCTION: DtCompileMsct
448 *
449 * PARAMETERS: List - Current field list pointer
450 *
451 * RETURN: Status
452 *
453 * DESCRIPTION: Compile MSCT.
454 *
455 *****************************************************************************/
456
457 ACPI_STATUS
458 DtCompileMsct (
459 void **List)
460 {
461 ACPI_STATUS Status;
462
463
464 Status = DtCompileTwoSubtables (List,
465 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
466 return (Status);
467 }
468
469
470 /******************************************************************************
471 *
472 * FUNCTION: DtCompileMtmr
473 *
474 * PARAMETERS: List - Current field list pointer
475 *
476 * RETURN: Status
477 *
478 * DESCRIPTION: Compile MTMR.
479 *
480 *****************************************************************************/
481
482 ACPI_STATUS
483 DtCompileMtmr (
484 void **List)
485 {
486 ACPI_STATUS Status;
487
488
489 Status = DtCompileTwoSubtables (List,
490 AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
491 return (Status);
492 }
493
494
495 /******************************************************************************
496 *
497 * FUNCTION: DtCompileNfit
498 *
499 * PARAMETERS: List - Current field list pointer
500 *
501 * RETURN: Status
502 *
503 * DESCRIPTION: Compile NFIT.
504 *
505 *****************************************************************************/
506
507 ACPI_STATUS
508 DtCompileNfit (
509 void **List)
510 {
511 ACPI_STATUS Status;
512 DT_SUBTABLE *Subtable;
513 DT_SUBTABLE *ParentTable;
514 DT_FIELD **PFieldList = (DT_FIELD **) List;
515 DT_FIELD *SubtableStart;
516 ACPI_NFIT_HEADER *NfitHeader;
517 ACPI_DMTABLE_INFO *InfoTable;
518 UINT32 Count;
519 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
520 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
521
522
523 /* Main table */
524
525 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
526 &Subtable, TRUE);
527 if (ACPI_FAILURE (Status))
528 {
529 return (Status);
530 }
531
532 ParentTable = DtPeekSubtable ();
533 DtInsertSubtable (ParentTable, Subtable);
534 DtPushSubtable (Subtable);
535
536 /* Subtables */
537
538 while (*PFieldList)
539 {
540 SubtableStart = *PFieldList;
541 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
542 &Subtable, TRUE);
543 if (ACPI_FAILURE (Status))
544 {
545 return (Status);
546 }
547
548 ParentTable = DtPeekSubtable ();
549 DtInsertSubtable (ParentTable, Subtable);
550 DtPushSubtable (Subtable);
551
552 NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
553
554 switch (NfitHeader->Type)
555 {
556 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
557
558 InfoTable = AcpiDmTableInfoNfit0;
559 break;
560
561 case ACPI_NFIT_TYPE_MEMORY_MAP:
562
563 InfoTable = AcpiDmTableInfoNfit1;
564 break;
565
566 case ACPI_NFIT_TYPE_INTERLEAVE:
567
568 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
569 InfoTable = AcpiDmTableInfoNfit2;
570 break;
571
572 case ACPI_NFIT_TYPE_SMBIOS:
573
574 InfoTable = AcpiDmTableInfoNfit3;
575 break;
576
577 case ACPI_NFIT_TYPE_CONTROL_REGION:
578
579 InfoTable = AcpiDmTableInfoNfit4;
580 break;
581
582 case ACPI_NFIT_TYPE_DATA_REGION:
583
584 InfoTable = AcpiDmTableInfoNfit5;
585 break;
586
587 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
588
589 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
590 InfoTable = AcpiDmTableInfoNfit6;
591 break;
592
593 default:
594
595 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
596 return (AE_ERROR);
597 }
598
599 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
600 if (ACPI_FAILURE (Status))
601 {
602 return (Status);
603 }
604
605 ParentTable = DtPeekSubtable ();
606 DtInsertSubtable (ParentTable, Subtable);
607 DtPopSubtable ();
608
609 switch (NfitHeader->Type)
610 {
611 case ACPI_NFIT_TYPE_INTERLEAVE:
612
613 Count = 0;
614 DtPushSubtable (Subtable);
615 while (*PFieldList)
616 {
617 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
618 &Subtable, FALSE);
619 if (ACPI_FAILURE (Status))
620 {
621 return (Status);
622 }
623
624 if (!Subtable)
625 {
626 DtPopSubtable ();
627 break;
628 }
629
630 ParentTable = DtPeekSubtable ();
631 DtInsertSubtable (ParentTable, Subtable);
632 Count++;
633 }
634
635 Interleave->LineCount = Count;
636 DtPopSubtable ();
637 break;
638
639 case ACPI_NFIT_TYPE_SMBIOS:
640
641 if (*PFieldList)
642 {
643 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
644 &Subtable, TRUE);
645 if (ACPI_FAILURE (Status))
646 {
647 return (Status);
648 }
649
650 if (Subtable)
651 {
652 DtInsertSubtable (ParentTable, Subtable);
653 }
654 }
655 break;
656
657 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
658
659 Count = 0;
660 DtPushSubtable (Subtable);
661 while (*PFieldList)
662 {
663 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
664 &Subtable, FALSE);
665 if (ACPI_FAILURE (Status))
666 {
667 return (Status);
668 }
669
670 if (!Subtable)
671 {
672 DtPopSubtable ();
673 break;
674 }
675
676 ParentTable = DtPeekSubtable ();
677 DtInsertSubtable (ParentTable, Subtable);
678 Count++;
679 }
680
681 Hint->HintCount = (UINT16) Count;
682 DtPopSubtable ();
683 break;
684
685 default:
686 break;
687 }
688 }
689
690 return (AE_OK);
691 }
692
693
694 /******************************************************************************
695 *
696 * FUNCTION: DtCompilePcct
697 *
698 * PARAMETERS: List - Current field list pointer
699 *
700 * RETURN: Status
701 *
702 * DESCRIPTION: Compile PCCT.
703 *
704 *****************************************************************************/
705
706 ACPI_STATUS
707 DtCompilePcct (
708 void **List)
709 {
710 ACPI_STATUS Status;
711 DT_SUBTABLE *Subtable;
712 DT_SUBTABLE *ParentTable;
713 DT_FIELD **PFieldList = (DT_FIELD **) List;
714 DT_FIELD *SubtableStart;
715 ACPI_SUBTABLE_HEADER *PcctHeader;
716 ACPI_DMTABLE_INFO *InfoTable;
717
718
719 /* Main table */
720
721 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
722 &Subtable, TRUE);
723 if (ACPI_FAILURE (Status))
724 {
725 return (Status);
726 }
727
728 ParentTable = DtPeekSubtable ();
729 DtInsertSubtable (ParentTable, Subtable);
730
731 /* Subtables */
732
733 while (*PFieldList)
734 {
735 SubtableStart = *PFieldList;
736 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
737 &Subtable, TRUE);
738 if (ACPI_FAILURE (Status))
739 {
740 return (Status);
741 }
742
743 ParentTable = DtPeekSubtable ();
744 DtInsertSubtable (ParentTable, Subtable);
745 DtPushSubtable (Subtable);
746
747 PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
748
749 switch (PcctHeader->Type)
750 {
751 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
752
753 InfoTable = AcpiDmTableInfoPcct0;
754 break;
755
756 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
757
758 InfoTable = AcpiDmTableInfoPcct1;
759 break;
760
761 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
762
763 InfoTable = AcpiDmTableInfoPcct2;
764 break;
765
766 default:
767
768 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
769 return (AE_ERROR);
770 }
771
772 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
773 if (ACPI_FAILURE (Status))
774 {
775 return (Status);
776 }
777
778 ParentTable = DtPeekSubtable ();
779 DtInsertSubtable (ParentTable, Subtable);
780 DtPopSubtable ();
781 }
782
783 return (AE_OK);
784 }
785
786
787 /******************************************************************************
788 *
789 * FUNCTION: DtCompilePmtt
790 *
791 * PARAMETERS: List - Current field list pointer
792 *
793 * RETURN: Status
794 *
795 * DESCRIPTION: Compile PMTT.
796 *
797 *****************************************************************************/
798
799 ACPI_STATUS
800 DtCompilePmtt (
801 void **List)
802 {
803 ACPI_STATUS Status;
804 DT_SUBTABLE *Subtable;
805 DT_SUBTABLE *ParentTable;
806 DT_FIELD **PFieldList = (DT_FIELD **) List;
807 DT_FIELD *SubtableStart;
808 ACPI_PMTT_HEADER *PmttHeader;
809 ACPI_PMTT_CONTROLLER *PmttController;
810 UINT16 DomainCount;
811 UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
812
813
814 /* Main table */
815
816 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
817 if (ACPI_FAILURE (Status))
818 {
819 return (Status);
820 }
821
822 ParentTable = DtPeekSubtable ();
823 DtInsertSubtable (ParentTable, Subtable);
824 DtPushSubtable (Subtable);
825
826 while (*PFieldList)
827 {
828 SubtableStart = *PFieldList;
829 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
830 &Subtable, TRUE);
831 if (ACPI_FAILURE (Status))
832 {
833 return (Status);
834 }
835
836 PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
837 while (PrevType >= PmttHeader->Type)
838 {
839 DtPopSubtable ();
840
841 if (PrevType == ACPI_PMTT_TYPE_SOCKET)
842 {
843 break;
844 }
845
846 PrevType--;
847 }
848
849 PrevType = PmttHeader->Type;
850
851 ParentTable = DtPeekSubtable ();
852 DtInsertSubtable (ParentTable, Subtable);
853 DtPushSubtable (Subtable);
854
855 switch (PmttHeader->Type)
856 {
857 case ACPI_PMTT_TYPE_SOCKET:
858
859 /* Subtable: Socket Structure */
860
861 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
862 &Subtable, TRUE);
863 if (ACPI_FAILURE (Status))
864 {
865 return (Status);
866 }
867
868 ParentTable = DtPeekSubtable ();
869 DtInsertSubtable (ParentTable, Subtable);
870 break;
871
872 case ACPI_PMTT_TYPE_CONTROLLER:
873
874 /* Subtable: Memory Controller Structure */
875
876 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
877 &Subtable, TRUE);
878 if (ACPI_FAILURE (Status))
879 {
880 return (Status);
881 }
882
883 ParentTable = DtPeekSubtable ();
884 DtInsertSubtable (ParentTable, Subtable);
885
886 PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
887 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
888 DomainCount = PmttController->DomainCount;
889
890 while (DomainCount)
891 {
892 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
893 &Subtable, TRUE);
894 if (ACPI_FAILURE (Status))
895 {
896 return (Status);
897 }
898
899 DtInsertSubtable (ParentTable, Subtable);
900 DomainCount--;
901 }
902 break;
903
904 case ACPI_PMTT_TYPE_DIMM:
905
906 /* Subtable: Physical Component Structure */
907
908 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
909 &Subtable, TRUE);
910 if (ACPI_FAILURE (Status))
911 {
912 return (Status);
913 }
914
915 ParentTable = DtPeekSubtable ();
916 DtInsertSubtable (ParentTable, Subtable);
917 break;
918
919 default:
920
921 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
922 return (AE_ERROR);
923 }
924 }
925
926 return (Status);
927 }
928
929
930 /******************************************************************************
931 *
932 * FUNCTION: DtCompileRsdt
933 *
934 * PARAMETERS: List - Current field list pointer
935 *
936 * RETURN: Status
937 *
938 * DESCRIPTION: Compile RSDT.
939 *
940 *****************************************************************************/
941
942 ACPI_STATUS
943 DtCompileRsdt (
944 void **List)
945 {
946 DT_SUBTABLE *Subtable;
947 DT_SUBTABLE *ParentTable;
948 DT_FIELD *FieldList = *(DT_FIELD **) List;
949 UINT32 Address;
950
951
952 ParentTable = DtPeekSubtable ();
953
954 while (FieldList)
955 {
956 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
957
958 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
959 DtInsertSubtable (ParentTable, Subtable);
960 FieldList = FieldList->Next;
961 }
962
963 return (AE_OK);
964 }
965
966
967 /******************************************************************************
968 *
969 * FUNCTION: DtCompileS3pt
970 *
971 * PARAMETERS: PFieldList - Current field list pointer
972 *
973 * RETURN: Status
974 *
975 * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
976 *
977 *****************************************************************************/
978
979 ACPI_STATUS
980 DtCompileS3pt (
981 DT_FIELD **PFieldList)
982 {
983 ACPI_STATUS Status;
984 ACPI_FPDT_HEADER *S3ptHeader;
985 DT_SUBTABLE *Subtable;
986 DT_SUBTABLE *ParentTable;
987 ACPI_DMTABLE_INFO *InfoTable;
988 DT_FIELD *SubtableStart;
989
990
991 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
992 &Gbl_RootTable, TRUE);
993 if (ACPI_FAILURE (Status))
994 {
995 return (Status);
996 }
997
998 DtPushSubtable (Gbl_RootTable);
999
1000 while (*PFieldList)
1001 {
1002 SubtableStart = *PFieldList;
1003 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
1004 &Subtable, TRUE);
1005 if (ACPI_FAILURE (Status))
1006 {
1007 return (Status);
1008 }
1009
1010 ParentTable = DtPeekSubtable ();
1011 DtInsertSubtable (ParentTable, Subtable);
1012 DtPushSubtable (Subtable);
1013
1014 S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1015
1016 switch (S3ptHeader->Type)
1017 {
1018 case ACPI_S3PT_TYPE_RESUME:
1019
1020 InfoTable = AcpiDmTableInfoS3pt0;
1021 break;
1022
1023 case ACPI_S3PT_TYPE_SUSPEND:
1024
1025 InfoTable = AcpiDmTableInfoS3pt1;
1026 break;
1027
1028 default:
1029
1030 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
1031 return (AE_ERROR);
1032 }
1033
1034 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1035 if (ACPI_FAILURE (Status))
1036 {
1037 return (Status);
1038 }
1039
1040 ParentTable = DtPeekSubtable ();
1041 DtInsertSubtable (ParentTable, Subtable);
1042 DtPopSubtable ();
1043 }
1044
1045 return (AE_OK);
1046 }
1047
1048
1049 /******************************************************************************
1050 *
1051 * FUNCTION: DtCompileSlic
1052 *
1053 * PARAMETERS: List - Current field list pointer
1054 *
1055 * RETURN: Status
1056 *
1057 * DESCRIPTION: Compile SLIC.
1058 *
1059 *****************************************************************************/
1060
1061 ACPI_STATUS
1062 DtCompileSlic (
1063 void **List)
1064 {
1065 ACPI_STATUS Status;
1066 DT_SUBTABLE *Subtable;
1067 DT_SUBTABLE *ParentTable;
1068 DT_FIELD **PFieldList = (DT_FIELD **) List;
1069
1070
1071 while (*PFieldList)
1072 {
1073 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
1074 &Subtable, TRUE);
1075 if (ACPI_FAILURE (Status))
1076 {
1077 return (Status);
1078 }
1079
1080 ParentTable = DtPeekSubtable ();
1081 DtInsertSubtable (ParentTable, Subtable);
1082 DtPushSubtable (Subtable);
1083 DtPopSubtable ();
1084 }
1085
1086 return (AE_OK);
1087 }
1088
1089
1090 /******************************************************************************
1091 *
1092 * FUNCTION: DtCompileSlit
1093 *
1094 * PARAMETERS: List - Current field list pointer
1095 *
1096 * RETURN: Status
1097 *
1098 * DESCRIPTION: Compile SLIT.
1099 *
1100 *****************************************************************************/
1101
1102 ACPI_STATUS
1103 DtCompileSlit (
1104 void **List)
1105 {
1106 ACPI_STATUS Status;
1107 DT_SUBTABLE *Subtable;
1108 DT_SUBTABLE *ParentTable;
1109 DT_FIELD **PFieldList = (DT_FIELD **) List;
1110 DT_FIELD *FieldList;
1111 UINT32 Localities;
1112 UINT8 *LocalityBuffer;
1113
1114
1115 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
1116 &Subtable, TRUE);
1117 if (ACPI_FAILURE (Status))
1118 {
1119 return (Status);
1120 }
1121
1122 ParentTable = DtPeekSubtable ();
1123 DtInsertSubtable (ParentTable, Subtable);
1124
1125 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
1126 LocalityBuffer = UtLocalCalloc (Localities);
1127
1128 /* Compile each locality buffer */
1129
1130 FieldList = *PFieldList;
1131 while (FieldList)
1132 {
1133 DtCompileBuffer (LocalityBuffer,
1134 FieldList->Value, FieldList, Localities);
1135
1136 DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
1137 DtInsertSubtable (ParentTable, Subtable);
1138 FieldList = FieldList->Next;
1139 }
1140
1141 ACPI_FREE (LocalityBuffer);
1142 return (AE_OK);
1143 }
1144
1145
1146 /******************************************************************************
1147 *
1148 * FUNCTION: DtCompileSrat
1149 *
1150 * PARAMETERS: List - Current field list pointer
1151 *
1152 * RETURN: Status
1153 *
1154 * DESCRIPTION: Compile SRAT.
1155 *
1156 *****************************************************************************/
1157
1158 ACPI_STATUS
1159 DtCompileSrat (
1160 void **List)
1161 {
1162 ACPI_STATUS Status;
1163 DT_SUBTABLE *Subtable;
1164 DT_SUBTABLE *ParentTable;
1165 DT_FIELD **PFieldList = (DT_FIELD **) List;
1166 DT_FIELD *SubtableStart;
1167 ACPI_SUBTABLE_HEADER *SratHeader;
1168 ACPI_DMTABLE_INFO *InfoTable;
1169
1170
1171 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
1172 &Subtable, TRUE);
1173 if (ACPI_FAILURE (Status))
1174 {
1175 return (Status);
1176 }
1177
1178 ParentTable = DtPeekSubtable ();
1179 DtInsertSubtable (ParentTable, Subtable);
1180
1181 while (*PFieldList)
1182 {
1183 SubtableStart = *PFieldList;
1184 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
1185 &Subtable, TRUE);
1186 if (ACPI_FAILURE (Status))
1187 {
1188 return (Status);
1189 }
1190
1191 ParentTable = DtPeekSubtable ();
1192 DtInsertSubtable (ParentTable, Subtable);
1193 DtPushSubtable (Subtable);
1194
1195 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1196
1197 switch (SratHeader->Type)
1198 {
1199 case ACPI_SRAT_TYPE_CPU_AFFINITY:
1200
1201 InfoTable = AcpiDmTableInfoSrat0;
1202 break;
1203
1204 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1205
1206 InfoTable = AcpiDmTableInfoSrat1;
1207 break;
1208
1209 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1210
1211 InfoTable = AcpiDmTableInfoSrat2;
1212 break;
1213
1214 case ACPI_SRAT_TYPE_GICC_AFFINITY:
1215
1216 InfoTable = AcpiDmTableInfoSrat3;
1217 break;
1218
1219 default:
1220
1221 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
1222 return (AE_ERROR);
1223 }
1224
1225 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1226 if (ACPI_FAILURE (Status))
1227 {
1228 return (Status);
1229 }
1230
1231 ParentTable = DtPeekSubtable ();
1232 DtInsertSubtable (ParentTable, Subtable);
1233 DtPopSubtable ();
1234 }
1235
1236 return (AE_OK);
1237 }
1238
1239
1240 /******************************************************************************
1241 *
1242 * FUNCTION: DtCompileStao
1243 *
1244 * PARAMETERS: PFieldList - Current field list pointer
1245 *
1246 * RETURN: Status
1247 *
1248 * DESCRIPTION: Compile STAO.
1249 *
1250 *****************************************************************************/
1251
1252 ACPI_STATUS
1253 DtCompileStao (
1254 void **List)
1255 {
1256 DT_FIELD **PFieldList = (DT_FIELD **) List;
1257 DT_SUBTABLE *Subtable;
1258 DT_SUBTABLE *ParentTable;
1259 ACPI_STATUS Status;
1260
1261
1262 /* Compile the main table */
1263
1264 Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
1265 &Subtable, TRUE);
1266 if (ACPI_FAILURE (Status))
1267 {
1268 return (Status);
1269 }
1270
1271 ParentTable = DtPeekSubtable ();
1272 DtInsertSubtable (ParentTable, Subtable);
1273
1274 /* Compile each ASCII namestring as a subtable */
1275
1276 while (*PFieldList)
1277 {
1278 Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
1279 &Subtable, TRUE);
1280 if (ACPI_FAILURE (Status))
1281 {
1282 return (Status);
1283 }
1284
1285 ParentTable = DtPeekSubtable ();
1286 DtInsertSubtable (ParentTable, Subtable);
1287 }
1288
1289 return (AE_OK);
1290 }
1291
1292
1293 /******************************************************************************
1294 *
1295 * FUNCTION: DtCompileTcpa
1296 *
1297 * PARAMETERS: PFieldList - Current field list pointer
1298 *
1299 * RETURN: Status
1300 *
1301 * DESCRIPTION: Compile TCPA.
1302 *
1303 *****************************************************************************/
1304
1305 ACPI_STATUS
1306 DtCompileTcpa (
1307 void **List)
1308 {
1309 DT_FIELD **PFieldList = (DT_FIELD **) List;
1310 DT_SUBTABLE *Subtable;
1311 ACPI_TABLE_TCPA_HDR *TcpaHeader;
1312 DT_SUBTABLE *ParentTable;
1313 ACPI_STATUS Status;
1314
1315
1316 /* Compile the main table */
1317
1318 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
1319 &Subtable, TRUE);
1320 if (ACPI_FAILURE (Status))
1321 {
1322 return (Status);
1323 }
1324
1325 ParentTable = DtPeekSubtable ();
1326 DtInsertSubtable (ParentTable, Subtable);
1327
1328 /*
1329 * Examine the PlatformClass field to determine the table type.
1330 * Either a client or server table. Only one.
1331 */
1332 TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
1333
1334 switch (TcpaHeader->PlatformClass)
1335 {
1336 case ACPI_TCPA_CLIENT_TABLE:
1337
1338 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
1339 &Subtable, TRUE);
1340 break;
1341
1342 case ACPI_TCPA_SERVER_TABLE:
1343
1344 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
1345 &Subtable, TRUE);
1346 break;
1347
1348 default:
1349
1350 AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
1351 TcpaHeader->PlatformClass);
1352 Status = AE_ERROR;
1353 break;
1354 }
1355
1356 ParentTable = DtPeekSubtable ();
1357 DtInsertSubtable (ParentTable, Subtable);
1358 return (Status);
1359 }
1360
1361
1362 /******************************************************************************
1363 *
1364 * FUNCTION: DtGetGenericTableInfo
1365 *
1366 * PARAMETERS: Name - Generic type name
1367 *
1368 * RETURN: Info entry
1369 *
1370 * DESCRIPTION: Obtain table info for a generic name entry
1371 *
1372 *****************************************************************************/
1373
1374 ACPI_DMTABLE_INFO *
1375 DtGetGenericTableInfo (
1376 char *Name)
1377 {
1378 ACPI_DMTABLE_INFO *Info;
1379 UINT32 i;
1380
1381
1382 if (!Name)
1383 {
1384 return (NULL);
1385 }
1386
1387 /* Search info table for name match */
1388
1389 for (i = 0; ; i++)
1390 {
1391 Info = AcpiDmTableInfoGeneric[i];
1392 if (Info->Opcode == ACPI_DMT_EXIT)
1393 {
1394 Info = NULL;
1395 break;
1396 }
1397
1398 /* Use caseless compare for generic keywords */
1399
1400 if (!AcpiUtStricmp (Name, Info->Name))
1401 {
1402 break;
1403 }
1404 }
1405
1406 return (Info);
1407 }
1408
1409
1410 /******************************************************************************
1411 *
1412 * FUNCTION: DtCompileUefi
1413 *
1414 * PARAMETERS: List - Current field list pointer
1415 *
1416 * RETURN: Status
1417 *
1418 * DESCRIPTION: Compile UEFI.
1419 *
1420 *****************************************************************************/
1421
1422 ACPI_STATUS
1423 DtCompileUefi (
1424 void **List)
1425 {
1426 ACPI_STATUS Status;
1427 DT_SUBTABLE *Subtable;
1428 DT_SUBTABLE *ParentTable;
1429 DT_FIELD **PFieldList = (DT_FIELD **) List;
1430 UINT16 *DataOffset;
1431
1432
1433 /* Compile the predefined portion of the UEFI table */
1434
1435 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
1436 &Subtable, TRUE);
1437 if (ACPI_FAILURE (Status))
1438 {
1439 return (Status);
1440 }
1441
1442 DataOffset = (UINT16 *) (Subtable->Buffer + 16);
1443 *DataOffset = sizeof (ACPI_TABLE_UEFI);
1444
1445 ParentTable = DtPeekSubtable ();
1446 DtInsertSubtable (ParentTable, Subtable);
1447
1448 /*
1449 * Compile the "generic" portion of the UEFI table. This
1450 * part of the table is not predefined and any of the generic
1451 * operators may be used.
1452 */
1453 DtCompileGeneric ((void **) PFieldList, NULL, NULL);
1454 return (AE_OK);
1455 }
1456
1457
1458 /******************************************************************************
1459 *
1460 * FUNCTION: DtCompileVrtc
1461 *
1462 * PARAMETERS: List - Current field list pointer
1463 *
1464 * RETURN: Status
1465 *
1466 * DESCRIPTION: Compile VRTC.
1467 *
1468 *****************************************************************************/
1469
1470 ACPI_STATUS
1471 DtCompileVrtc (
1472 void **List)
1473 {
1474 ACPI_STATUS Status;
1475
1476
1477 Status = DtCompileTwoSubtables (List,
1478 AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
1479 return (Status);
1480 }
1481
1482
1483 /******************************************************************************
1484 *
1485 * FUNCTION: DtCompileWdat
1486 *
1487 * PARAMETERS: List - Current field list pointer
1488 *
1489 * RETURN: Status
1490 *
1491 * DESCRIPTION: Compile WDAT.
1492 *
1493 *****************************************************************************/
1494
1495 ACPI_STATUS
1496 DtCompileWdat (
1497 void **List)
1498 {
1499 ACPI_STATUS Status;
1500
1501
1502 Status = DtCompileTwoSubtables (List,
1503 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
1504 return (Status);
1505 }
1506
1507
1508 /******************************************************************************
1509 *
1510 * FUNCTION: DtCompileWpbt
1511 *
1512 * PARAMETERS: List - Current field list pointer
1513 *
1514 * RETURN: Status
1515 *
1516 * DESCRIPTION: Compile WPBT.
1517 *
1518 *****************************************************************************/
1519
1520 ACPI_STATUS
1521 DtCompileWpbt (
1522 void **List)
1523 {
1524 DT_FIELD **PFieldList = (DT_FIELD **) List;
1525 DT_SUBTABLE *Subtable;
1526 DT_SUBTABLE *ParentTable;
1527 ACPI_TABLE_WPBT *Table;
1528 ACPI_STATUS Status;
1529 UINT16 Length;
1530
1531
1532 /* Compile the main table */
1533
1534 Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt,
1535 &Subtable, TRUE);
1536 if (ACPI_FAILURE (Status))
1537 {
1538 return (Status);
1539 }
1540
1541 ParentTable = DtPeekSubtable ();
1542 DtInsertSubtable (ParentTable, Subtable);
1543
1544 /* Compile the argument list subtable */
1545
1546 Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0,
1547 &Subtable, TRUE);
1548 if (ACPI_FAILURE (Status))
1549 {
1550 return (Status);
1551 }
1552
1553 /* Extract the length of the Arguments buffer, insert into main table */
1554
1555 Length = (UINT16) Subtable->TotalLength;
1556 Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
1557 Table->ArgumentsLength = Length;
1558
1559 ParentTable = DtPeekSubtable ();
1560 DtInsertSubtable (ParentTable, Subtable);
1561 return (AE_OK);
1562 }
1563
1564
1565 /******************************************************************************
1566 *
1567 * FUNCTION: DtCompileXsdt
1568 *
1569 * PARAMETERS: List - Current field list pointer
1570 *
1571 * RETURN: Status
1572 *
1573 * DESCRIPTION: Compile XSDT.
1574 *
1575 *****************************************************************************/
1576
1577 ACPI_STATUS
1578 DtCompileXsdt (
1579 void **List)
1580 {
1581 DT_SUBTABLE *Subtable;
1582 DT_SUBTABLE *ParentTable;
1583 DT_FIELD *FieldList = *(DT_FIELD **) List;
1584 UINT64 Address;
1585
1586
1587 ParentTable = DtPeekSubtable ();
1588
1589 while (FieldList)
1590 {
1591 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
1592
1593 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
1594 DtInsertSubtable (ParentTable, Subtable);
1595 FieldList = FieldList->Next;
1596 }
1597
1598 return (AE_OK);
1599 }
1600
1601
1602 /******************************************************************************
1603 *
1604 * FUNCTION: DtCompileGeneric
1605 *
1606 * PARAMETERS: List - Current field list pointer
1607 * Name - Field name to end generic compiling
1608 * Length - Compiled table length to return
1609 *
1610 * RETURN: Status
1611 *
1612 * DESCRIPTION: Compile generic unknown table.
1613 *
1614 *****************************************************************************/
1615
1616 ACPI_STATUS
1617 DtCompileGeneric (
1618 void **List,
1619 char *Name,
1620 UINT32 *Length)
1621 {
1622 ACPI_STATUS Status;
1623 DT_SUBTABLE *Subtable;
1624 DT_SUBTABLE *ParentTable;
1625 DT_FIELD **PFieldList = (DT_FIELD **) List;
1626 ACPI_DMTABLE_INFO *Info;
1627
1628
1629 ParentTable = DtPeekSubtable ();
1630
1631 /*
1632 * Compile the "generic" portion of the table. This
1633 * part of the table is not predefined and any of the generic
1634 * operators may be used.
1635 */
1636
1637 /* Find any and all labels in the entire generic portion */
1638
1639 DtDetectAllLabels (*PFieldList);
1640
1641 /* Now we can actually compile the parse tree */
1642
1643 if (Length && *Length)
1644 {
1645 *Length = 0;
1646 }
1647 while (*PFieldList)
1648 {
1649 if (Name && !strcmp ((*PFieldList)->Name, Name))
1650 {
1651 break;
1652 }
1653
1654 Info = DtGetGenericTableInfo ((*PFieldList)->Name);
1655 if (!Info)
1656 {
1657 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
1658 (*PFieldList)->Name);
1659 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
1660 (*PFieldList), MsgBuffer);
1661
1662 *PFieldList = (*PFieldList)->Next;
1663 continue;
1664 }
1665
1666 Status = DtCompileTable (PFieldList, Info,
1667 &Subtable, TRUE);
1668 if (ACPI_SUCCESS (Status))
1669 {
1670 DtInsertSubtable (ParentTable, Subtable);
1671 if (Length)
1672 {
1673 *Length += Subtable->Length;
1674 }
1675 }
1676 else
1677 {
1678 *PFieldList = (*PFieldList)->Next;
1679
1680 if (Status == AE_NOT_FOUND)
1681 {
1682 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
1683 (*PFieldList)->Name);
1684 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
1685 (*PFieldList), MsgBuffer);
1686 }
1687 }
1688 }
1689
1690 return (AE_OK);
1691 }
1692