Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1498 serge 1
/******************************************************************************
2
 *
3
 * Module Name: dttable.c - handling for specific ACPI tables
4
 *
5
 *****************************************************************************/
6
 
7
/******************************************************************************
8
 *
9
 * 1. Copyright Notice
10
 *
11
 * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12
 * All rights reserved.
13
 *
14
 * 2. License
15
 *
16
 * 2.1. This is your license from Intel Corp. under its intellectual property
17
 * rights.  You may have additional license terms from the party that provided
18
 * you this software, covering your right to use that party's intellectual
19
 * property rights.
20
 *
21
 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22
 * copy of the source code appearing in this file ("Covered Code") an
23
 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24
 * base code distributed originally by Intel ("Original Intel Code") to copy,
25
 * make derivatives, distribute, use and display any portion of the Covered
26
 * Code in any form, with the right to sublicense such rights; and
27
 *
28
 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29
 * license (with the right to sublicense), under only those claims of Intel
30
 * patents that are infringed by the Original Intel Code, to make, use, sell,
31
 * offer to sell, and import the Covered Code and derivative works thereof
32
 * solely to the minimum extent necessary to exercise the above copyright
33
 * license, and in no event shall the patent license extend to any additions
34
 * to or modifications of the Original Intel Code.  No other license or right
35
 * is granted directly or by implication, estoppel or otherwise;
36
 *
37
 * The above copyright and patent license is granted only if the following
38
 * conditions are met:
39
 *
40
 * 3. Conditions
41
 *
42
 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43
 * Redistribution of source code of any substantial portion of the Covered
44
 * Code or modification with rights to further distribute source must include
45
 * the above Copyright Notice, the above License, this list of Conditions,
46
 * and the following Disclaimer and Export Compliance provision.  In addition,
47
 * Licensee must cause all Covered Code to which Licensee contributes to
48
 * contain a file documenting the changes Licensee made to create that Covered
49
 * Code and the date of any change.  Licensee must include in that file the
50
 * documentation of any changes made by any predecessor Licensee.  Licensee
51
 * must include a prominent statement that the modification is derived,
52
 * directly or indirectly, from Original Intel Code.
53
 *
54
 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55
 * Redistribution of source code of any substantial portion of the Covered
56
 * Code or modification without rights to further distribute source must
57
 * include the following Disclaimer and Export Compliance provision in the
58
 * documentation and/or other materials provided with distribution.  In
59
 * addition, Licensee may not authorize further sublicense of source of any
60
 * portion of the Covered Code, and must include terms to the effect that the
61
 * license from Licensee to its licensee is limited to the intellectual
62
 * property embodied in the software Licensee provides to its licensee, and
63
 * not to intellectual property embodied in modifications its licensee may
64
 * make.
65
 *
66
 * 3.3. Redistribution of Executable. Redistribution in executable form of any
67
 * substantial portion of the Covered Code or modification must reproduce the
68
 * above Copyright Notice, and the following Disclaimer and Export Compliance
69
 * provision in the documentation and/or other materials provided with the
70
 * distribution.
71
 *
72
 * 3.4. Intel retains all right, title, and interest in and to the Original
73
 * Intel Code.
74
 *
75
 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76
 * Intel shall be used in advertising or otherwise to promote the sale, use or
77
 * other dealings in products derived from or relating to the Covered Code
78
 * without prior written authorization from Intel.
79
 *
80
 * 4. Disclaimer and Export Compliance
81
 *
82
 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83
 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84
 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85
 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86
 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87
 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88
 * PARTICULAR PURPOSE.
89
 *
90
 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91
 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92
 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93
 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94
 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95
 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96
 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97
 * LIMITED REMEDY.
98
 *
99
 * 4.3. Licensee shall not export, either directly or indirectly, any of this
100
 * software or system incorporating such software without first obtaining any
101
 * required license or other approval from the U. S. Department of Commerce or
102
 * any other agency or department of the United States Government.  In the
103
 * event Licensee exports any such software from the United States or
104
 * re-exports any such software from a foreign destination, Licensee shall
105
 * ensure that the distribution and export/re-export of the software is in
106
 * compliance with all laws, regulations, orders, or other restrictions of the
107
 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108
 * any of its subsidiaries will export/re-export any technical data, process,
109
 * software, or service, directly or indirectly, to any country for which the
110
 * United States government or any agency thereof requires an export license,
111
 * other governmental approval, or letter of assurance, without first obtaining
112
 * such license, approval or letter.
113
 *
114
 *****************************************************************************/
115
 
116
#define __DTTABLE_C__
117
 
118
/* Compile all complex data tables */
119
 
120
#include "aslcompiler.h"
121
#include "dtcompiler.h"
122
 
123
#define _COMPONENT          DT_COMPILER
124
        ACPI_MODULE_NAME    ("dttable")
125
 
126
 
127
/* TBD: merge these into dmtbinfo.c? */
128
 
129
static ACPI_DMTABLE_INFO           TableInfoAsfAddress[] =
130
{
131
    {ACPI_DMT_BUFFER,   0,               "Addresses", 0},
132
    {ACPI_DMT_EXIT,     0,               NULL, 0}
133
};
134
 
135
static ACPI_DMTABLE_INFO           TableInfoDmarPciPath[] =
136
{
137
    {ACPI_DMT_PCI_PATH, 0,               "PCI Path", 0},
138
    {ACPI_DMT_EXIT,     0,               NULL, 0}
139
};
140
 
141
 
142
/* TBD: move to acmacros.h */
143
 
144
#define ACPI_SUB_PTR(t, a, b) \
145
    ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b)))
146
 
147
 
148
/* Local prototypes */
149
 
150
static ACPI_STATUS
151
DtCompileTwoSubtables (
152
    void                    **List,
153
    ACPI_DMTABLE_INFO       *TableInfo1,
154
    ACPI_DMTABLE_INFO       *TableInfo2);
155
 
156
 
157
/******************************************************************************
158
 *
159
 * FUNCTION:    DtCompileTwoSubtables
160
 *
161
 * PARAMETERS:  List                - Current field list pointer
162
 *              TableInfo1          - Info table 1
163
 *              TableInfo1          - Info table 2
164
 *
165
 * RETURN:      Status
166
 *
167
 * DESCRIPTION: Compile tables with a header and one or more same subtables.
168
 *              Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
169
 *
170
 *****************************************************************************/
171
 
172
static ACPI_STATUS
173
DtCompileTwoSubtables (
174
    void                    **List,
175
    ACPI_DMTABLE_INFO       *TableInfo1,
176
    ACPI_DMTABLE_INFO       *TableInfo2)
177
{
178
    ACPI_STATUS             Status;
179
    DT_SUBTABLE             *Subtable;
180
    DT_SUBTABLE             *ParentTable;
181
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
182
 
183
 
184
    Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
185
    if (ACPI_FAILURE (Status))
186
    {
187
        return (Status);
188
    }
189
 
190
    ParentTable = DtPeekSubtable ();
191
    DtInsertSubtable (ParentTable, Subtable);
192
 
193
    while (*PFieldList)
194
    {
195
        Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
196
        if (ACPI_FAILURE (Status))
197
        {
198
            return (Status);
199
        }
200
 
201
        DtInsertSubtable (ParentTable, Subtable);
202
    }
203
 
204
    return (AE_OK);
205
}
206
 
207
 
208
/******************************************************************************
209
 *
210
 * FUNCTION:    DtCompileFacs
211
 *
212
 * PARAMETERS:  PFieldList          - Current field list pointer
213
 *
214
 * RETURN:      Status
215
 *
216
 * DESCRIPTION: Compile FACS.
217
 *
218
 *****************************************************************************/
219
 
220
ACPI_STATUS
221
DtCompileFacs (
222
    DT_FIELD                **PFieldList)
223
{
224
    DT_SUBTABLE             *Subtable;
225
    UINT8                   *ReservedBuffer;
226
    ACPI_STATUS             Status;
227
    UINT32                  ReservedSize;
228
 
229
 
230
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
231
                &Gbl_RootTable, TRUE);
232
    if (ACPI_FAILURE (Status))
233
    {
234
        return (Status);
235
    }
236
 
237
    /* Large FACS reserved area at the end of the table */
238
 
239
    ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
240
    ReservedBuffer = UtLocalCalloc (ReservedSize);
241
 
242
    DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
243
 
244
    ACPI_FREE (ReservedBuffer);
245
    DtInsertSubtable (Gbl_RootTable, Subtable);
246
    return (AE_OK);
247
}
248
 
249
 
250
/******************************************************************************
251
 *
252
 * FUNCTION:    DtCompileRsdp
253
 *
254
 * PARAMETERS:  PFieldList          - Current field list pointer
255
 *
256
 * RETURN:      Status
257
 *
258
 * DESCRIPTION: Compile RSDP.
259
 *
260
 *****************************************************************************/
261
 
262
ACPI_STATUS
263
DtCompileRsdp (
264
    DT_FIELD                **PFieldList)
265
{
266
    DT_SUBTABLE             *Subtable;
267
    ACPI_TABLE_RSDP         *Table;
268
    ACPI_STATUS             Status;
269
 
270
 
271
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
272
                &Gbl_RootTable, TRUE);
273
    if (ACPI_FAILURE (Status))
274
    {
275
        return (Status);
276
    }
277
 
278
    Table = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
279
    DtSetTableChecksum (&Table->Checksum);
280
 
281
    if (Table->Revision > 0)
282
    {
283
        Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
284
                    &Subtable, TRUE);
285
        if (ACPI_FAILURE (Status))
286
        {
287
            return (Status);
288
        }
289
 
290
        DtInsertSubtable (Gbl_RootTable, Subtable);
291
        DtSetTableChecksum (&Table->ExtendedChecksum);
292
    }
293
 
294
    return (AE_OK);
295
}
296
 
297
 
298
/******************************************************************************
299
 *
300
 * FUNCTION:    DtCompileAsf
301
 *
302
 * PARAMETERS:  List                - Current field list pointer
303
 *
304
 * RETURN:      Status
305
 *
306
 * DESCRIPTION: Compile ASF!.
307
 *
308
 *****************************************************************************/
309
 
310
ACPI_STATUS
311
DtCompileAsf (
312
    void                    **List)
313
{
314
    ACPI_ASF_INFO           *AsfTable;
315
    DT_SUBTABLE             *Subtable;
316
    DT_SUBTABLE             *ParentTable;
317
    ACPI_DMTABLE_INFO       *InfoTable;
318
    ACPI_DMTABLE_INFO       *DataInfoTable = NULL;
319
    UINT32                  DataCount = 0;
320
    ACPI_STATUS             Status;
321
    UINT32                  i;
322
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
323
    DT_FIELD                *SubtableStart;
324
 
325
 
326
    while (*PFieldList)
327
    {
328
        SubtableStart = *PFieldList;
329
        Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
330
                    &Subtable, TRUE);
331
        if (ACPI_FAILURE (Status))
332
        {
333
            return (Status);
334
        }
335
 
336
        ParentTable = DtPeekSubtable ();
337
        DtInsertSubtable (ParentTable, Subtable);
338
        DtPushSubtable (Subtable);
339
 
340
        AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
341
 
342
        switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
343
        {
344
        case ACPI_ASF_TYPE_INFO:
345
            InfoTable = AcpiDmTableInfoAsf0;
346
            break;
347
 
348
        case ACPI_ASF_TYPE_ALERT:
349
            InfoTable = AcpiDmTableInfoAsf1;
350
            break;
351
 
352
        case ACPI_ASF_TYPE_CONTROL:
353
            InfoTable = AcpiDmTableInfoAsf2;
354
            break;
355
 
356
        case ACPI_ASF_TYPE_BOOT:
357
            InfoTable = AcpiDmTableInfoAsf3;
358
            break;
359
 
360
        case ACPI_ASF_TYPE_ADDRESS:
361
            InfoTable = AcpiDmTableInfoAsf4;
362
            break;
363
 
364
        default:
365
            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
366
            return (AE_ERROR);
367
        }
368
 
369
        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
370
        if (ACPI_FAILURE (Status))
371
        {
372
            return (Status);
373
        }
374
 
375
        ParentTable = DtPeekSubtable ();
376
        DtInsertSubtable (ParentTable, Subtable);
377
 
378
        switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
379
        {
380
        case ACPI_ASF_TYPE_INFO:
381
            DataInfoTable = NULL;
382
            break;
383
 
384
        case ACPI_ASF_TYPE_ALERT:
385
            DataInfoTable = AcpiDmTableInfoAsf1a;
386
            DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
387
                        ACPI_SUB_PTR (UINT8, Subtable->Buffer,
388
                            sizeof (ACPI_ASF_HEADER)))->Alerts;
389
            break;
390
 
391
        case ACPI_ASF_TYPE_CONTROL:
392
            DataInfoTable = AcpiDmTableInfoAsf2a;
393
            DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
394
                        ACPI_SUB_PTR (UINT8, Subtable->Buffer,
395
                            sizeof (ACPI_ASF_HEADER)))->Controls;
396
            break;
397
 
398
        case ACPI_ASF_TYPE_BOOT:
399
            DataInfoTable = NULL;
400
            break;
401
 
402
        case ACPI_ASF_TYPE_ADDRESS:
403
            DataInfoTable = TableInfoAsfAddress;
404
            DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
405
                        ACPI_SUB_PTR (UINT8, Subtable->Buffer,
406
                            sizeof (ACPI_ASF_HEADER)))->Devices;
407
            break;
408
 
409
        default:
410
            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
411
            return (AE_ERROR);
412
        }
413
 
414
        if (DataInfoTable)
415
        {
416
            switch (AsfTable->Header.Type & 0x7F)
417
            {
418
            case ACPI_ASF_TYPE_ADDRESS:
419
 
420
                while (DataCount > 0)
421
                {
422
                    Status = DtCompileTable (PFieldList, DataInfoTable,
423
                                &Subtable, TRUE);
424
                    if (ACPI_FAILURE (Status))
425
                    {
426
                        return (Status);
427
                    }
428
 
429
                    DtInsertSubtable (ParentTable, Subtable);
430
                    DataCount = DataCount - Subtable->Length;
431
                }
432
                break;
433
 
434
            default:
435
 
436
                for (i = 0; i < DataCount; i++)
437
                {
438
                    Status = DtCompileTable (PFieldList, DataInfoTable,
439
                                &Subtable, TRUE);
440
                    if (ACPI_FAILURE (Status))
441
                    {
442
                        return (Status);
443
                    }
444
 
445
                    DtInsertSubtable (ParentTable, Subtable);
446
                }
447
                break;
448
            }
449
        }
450
 
451
        DtPopSubtable ();
452
    }
453
 
454
    return (AE_OK);
455
}
456
 
457
 
458
/******************************************************************************
459
 *
460
 * FUNCTION:    DtCompileCpep
461
 *
462
 * PARAMETERS:  List                - Current field list pointer
463
 *
464
 * RETURN:      Status
465
 *
466
 * DESCRIPTION: Compile CPEP.
467
 *
468
 *****************************************************************************/
469
 
470
ACPI_STATUS
471
DtCompileCpep (
472
    void                    **List)
473
{
474
    ACPI_STATUS             Status;
475
 
476
 
477
    Status = DtCompileTwoSubtables (List,
478
                 AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
479
    return (Status);
480
}
481
 
482
 
483
/******************************************************************************
484
 *
485
 * FUNCTION:    DtCompileDmar
486
 *
487
 * PARAMETERS:  List                - Current field list pointer
488
 *
489
 * RETURN:      Status
490
 *
491
 * DESCRIPTION: Compile DMAR.
492
 *
493
 *****************************************************************************/
494
 
495
ACPI_STATUS
496
DtCompileDmar (
497
    void                    **List)
498
{
499
    ACPI_STATUS             Status;
500
    DT_SUBTABLE             *Subtable;
501
    DT_SUBTABLE             *ParentTable;
502
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
503
    DT_FIELD                *SubtableStart;
504
    ACPI_DMTABLE_INFO       *InfoTable;
505
    ACPI_DMAR_HEADER        *DmarHeader;
506
    UINT8                   *ReservedBuffer;
507
    UINT32                  ReservedSize;
508
 
509
 
510
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
511
    if (ACPI_FAILURE (Status))
512
    {
513
        return (Status);
514
    }
515
 
516
    ParentTable = DtPeekSubtable ();
517
    DtInsertSubtable (ParentTable, Subtable);
518
 
519
    /* DMAR Reserved area */
520
 
521
    ReservedSize = (UINT32) sizeof (((ACPI_TABLE_DMAR *) NULL)->Reserved);
522
    ReservedBuffer = UtLocalCalloc (ReservedSize);
523
 
524
    DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
525
 
526
    ACPI_FREE (ReservedBuffer);
527
    ParentTable = DtPeekSubtable ();
528
    DtInsertSubtable (ParentTable, Subtable);
529
 
530
    while (*PFieldList)
531
    {
532
        /* DMAR Header */
533
 
534
        SubtableStart = *PFieldList;
535
        Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
536
                    &Subtable, TRUE);
537
        if (ACPI_FAILURE (Status))
538
        {
539
            return (Status);
540
        }
541
 
542
        ParentTable = DtPeekSubtable ();
543
        DtInsertSubtable (ParentTable, Subtable);
544
        DtPushSubtable (Subtable);
545
 
546
        DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
547
 
548
        switch (DmarHeader->Type)
549
        {
550
        case ACPI_DMAR_TYPE_HARDWARE_UNIT:
551
            InfoTable = AcpiDmTableInfoDmar0;
552
            break;
553
        case ACPI_DMAR_TYPE_RESERVED_MEMORY:
554
            InfoTable = AcpiDmTableInfoDmar1;
555
            break;
556
        case ACPI_DMAR_TYPE_ATSR:
557
            InfoTable = AcpiDmTableInfoDmar2;
558
            break;
559
        case ACPI_DMAR_HARDWARE_AFFINITY:
560
            InfoTable = AcpiDmTableInfoDmar3;
561
            break;
562
        default:
563
            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
564
            return (AE_ERROR);
565
        }
566
 
567
        /* DMAR Subtable */
568
 
569
        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
570
        if (ACPI_FAILURE (Status))
571
        {
572
            return (Status);
573
        }
574
 
575
        ParentTable = DtPeekSubtable ();
576
        DtInsertSubtable (ParentTable, Subtable);
577
 
578
        /* Optional Device Scope subtables */
579
 
580
        while (*PFieldList)
581
        {
582
            Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
583
                        &Subtable, FALSE);
584
            if (Status == AE_NOT_FOUND)
585
            {
586
                break;
587
            }
588
 
589
            ParentTable = DtPeekSubtable ();
590
            DtInsertSubtable (ParentTable, Subtable);
591
            DtPushSubtable (Subtable);
592
 
593
            /* Optional PCI Paths */
594
 
595
            while (*PFieldList)
596
            {
597
                Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
598
                            &Subtable, FALSE);
599
                if (Status == AE_NOT_FOUND)
600
                {
601
                    DtPopSubtable ();
602
                    break;
603
                }
604
 
605
                ParentTable = DtPeekSubtable ();
606
                DtInsertSubtable (ParentTable, Subtable);
607
            }
608
        }
609
 
610
        DtPopSubtable ();
611
    }
612
 
613
    return (AE_OK);
614
}
615
 
616
 
617
/******************************************************************************
618
 *
619
 * FUNCTION:    DtCompileEinj
620
 *
621
 * PARAMETERS:  List                - Current field list pointer
622
 *
623
 * RETURN:      Status
624
 *
625
 * DESCRIPTION: Compile EINJ.
626
 *
627
 *****************************************************************************/
628
 
629
ACPI_STATUS
630
DtCompileEinj (
631
    void                    **List)
632
{
633
    ACPI_STATUS             Status;
634
 
635
 
636
    Status = DtCompileTwoSubtables (List,
637
                 AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
638
    return (Status);
639
}
640
 
641
 
642
/******************************************************************************
643
 *
644
 * FUNCTION:    DtCompileErst
645
 *
646
 * PARAMETERS:  List                - Current field list pointer
647
 *
648
 * RETURN:      Status
649
 *
650
 * DESCRIPTION: Compile ERST.
651
 *
652
 *****************************************************************************/
653
 
654
ACPI_STATUS
655
DtCompileErst (
656
    void                    **List)
657
{
658
    ACPI_STATUS             Status;
659
 
660
 
661
    Status = DtCompileTwoSubtables (List,
662
                 AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
663
    return (Status);
664
}
665
 
666
 
667
/******************************************************************************
668
 *
669
 * FUNCTION:    DtCompileFadt
670
 *
671
 * PARAMETERS:  List                - Current field list pointer
672
 *
673
 * RETURN:      Status
674
 *
675
 * DESCRIPTION: Compile FADT.
676
 *
677
 *****************************************************************************/
678
 
679
ACPI_STATUS
680
DtCompileFadt (
681
    void                    **List)
682
{
683
    ACPI_STATUS             Status;
684
    DT_SUBTABLE             *Subtable;
685
    DT_SUBTABLE             *ParentTable;
686
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
687
    ACPI_TABLE_HEADER       *Table;
688
    UINT8                   Revision;
689
 
690
 
691
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
692
                &Subtable, TRUE);
693
    if (ACPI_FAILURE (Status))
694
    {
695
        return (Status);
696
    }
697
 
698
    ParentTable = DtPeekSubtable ();
699
    DtInsertSubtable (ParentTable, Subtable);
700
 
701
    Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
702
    Revision = Table->Revision;
703
 
704
    if (Revision == 2)
705
    {
706
        Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
707
                    &Subtable, TRUE);
708
        if (ACPI_FAILURE (Status))
709
        {
710
            return (Status);
711
        }
712
 
713
        DtInsertSubtable (ParentTable, Subtable);
714
    }
715
    else if (Revision >= 2)
716
    {
717
        Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
718
                    &Subtable, TRUE);
719
        if (ACPI_FAILURE (Status))
720
        {
721
            return (Status);
722
        }
723
 
724
        DtInsertSubtable (ParentTable, Subtable);
725
    }
726
 
727
    return (AE_OK);
728
}
729
 
730
 
731
/******************************************************************************
732
 *
733
 * FUNCTION:    DtCompileHest
734
 *
735
 * PARAMETERS:  List                - Current field list pointer
736
 *
737
 * RETURN:      Status
738
 *
739
 * DESCRIPTION: Compile HEST.
740
 *
741
 *****************************************************************************/
742
 
743
ACPI_STATUS
744
DtCompileHest (
745
    void                    **List)
746
{
747
    ACPI_STATUS             Status;
748
    DT_SUBTABLE             *Subtable;
749
    DT_SUBTABLE             *ParentTable;
750
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
751
    DT_FIELD                *SubtableStart;
752
    ACPI_DMTABLE_INFO       *InfoTable;
753
    UINT16                  Type;
754
    UINT32                  BankCount;
755
 
756
 
757
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
758
                &Subtable, TRUE);
759
    if (ACPI_FAILURE (Status))
760
    {
761
        return (Status);
762
    }
763
 
764
    ParentTable = DtPeekSubtable ();
765
    DtInsertSubtable (ParentTable, Subtable);
766
 
767
    while (*PFieldList)
768
    {
769
        /* Get subtable type */
770
 
771
        SubtableStart = *PFieldList;
772
        DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
773
 
774
        switch (Type)
775
        {
776
        case ACPI_HEST_TYPE_IA32_CHECK:
777
            InfoTable = AcpiDmTableInfoHest0;
778
            break;
779
 
780
        case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
781
            InfoTable = AcpiDmTableInfoHest1;
782
            break;
783
 
784
        case ACPI_HEST_TYPE_IA32_NMI:
785
            InfoTable = AcpiDmTableInfoHest2;
786
            break;
787
 
788
        case ACPI_HEST_TYPE_AER_ROOT_PORT:
789
            InfoTable = AcpiDmTableInfoHest6;
790
            break;
791
 
792
        case ACPI_HEST_TYPE_AER_ENDPOINT:
793
            InfoTable = AcpiDmTableInfoHest7;
794
            break;
795
 
796
        case ACPI_HEST_TYPE_AER_BRIDGE:
797
            InfoTable = AcpiDmTableInfoHest8;
798
            break;
799
 
800
        case ACPI_HEST_TYPE_GENERIC_ERROR:
801
            InfoTable = AcpiDmTableInfoHest9;
802
            break;
803
 
804
        default:
805
            /* Cannot continue on unknown type */
806
 
807
            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
808
            return (AE_ERROR);
809
        }
810
 
811
        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
812
        if (ACPI_FAILURE (Status))
813
        {
814
            return (Status);
815
        }
816
 
817
        DtInsertSubtable (ParentTable, Subtable);
818
 
819
        /*
820
         * Additional subtable data - IA32 Error Bank(s)
821
         */
822
        BankCount = 0;
823
        switch (Type)
824
        {
825
        case ACPI_HEST_TYPE_IA32_CHECK:
826
            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
827
                            Subtable->Buffer))->NumHardwareBanks;
828
            break;
829
 
830
        case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
831
            BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
832
                            Subtable->Buffer))->NumHardwareBanks;
833
            break;
834
 
835
        default:
836
            break;
837
        }
838
 
839
        while (BankCount)
840
        {
841
            Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
842
                        &Subtable, TRUE);
843
            if (ACPI_FAILURE (Status))
844
            {
845
                return (Status);
846
            }
847
 
848
            DtInsertSubtable (ParentTable, Subtable);
849
            BankCount--;
850
        }
851
    }
852
 
853
    return AE_OK;
854
}
855
 
856
 
857
/******************************************************************************
858
 *
859
 * FUNCTION:    DtCompileIvrs
860
 *
861
 * PARAMETERS:  List                - Current field list pointer
862
 *
863
 * RETURN:      Status
864
 *
865
 * DESCRIPTION: Compile IVRS.
866
 *
867
 *****************************************************************************/
868
 
869
ACPI_STATUS
870
DtCompileIvrs (
871
    void                    **List)
872
{
873
    ACPI_STATUS             Status;
874
    DT_SUBTABLE             *Subtable;
875
    DT_SUBTABLE             *ParentTable;
876
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
877
    DT_FIELD                *SubtableStart;
878
    ACPI_DMTABLE_INFO       *InfoTable;
879
    ACPI_IVRS_HEADER        *IvrsHeader;
880
    UINT8                   EntryType;
881
 
882
 
883
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
884
                &Subtable, TRUE);
885
    if (ACPI_FAILURE (Status))
886
    {
887
        return (Status);
888
    }
889
 
890
    ParentTable = DtPeekSubtable ();
891
    DtInsertSubtable (ParentTable, Subtable);
892
 
893
    while (*PFieldList)
894
    {
895
        SubtableStart = *PFieldList;
896
        Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
897
                    &Subtable, TRUE);
898
        if (ACPI_FAILURE (Status))
899
        {
900
            return (Status);
901
        }
902
 
903
        ParentTable = DtPeekSubtable ();
904
        DtInsertSubtable (ParentTable, Subtable);
905
        DtPushSubtable (Subtable);
906
 
907
        IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
908
 
909
        switch (IvrsHeader->Type)
910
        {
911
        case ACPI_IVRS_TYPE_HARDWARE:
912
            InfoTable = AcpiDmTableInfoIvrs0;
913
            break;
914
 
915
        case ACPI_IVRS_TYPE_MEMORY1:
916
        case ACPI_IVRS_TYPE_MEMORY2:
917
        case ACPI_IVRS_TYPE_MEMORY3:
918
            InfoTable = AcpiDmTableInfoIvrs1;
919
            break;
920
 
921
        default:
922
            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
923
            return (AE_ERROR);
924
        }
925
 
926
        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
927
        if (ACPI_FAILURE (Status))
928
        {
929
            return (Status);
930
        }
931
 
932
        ParentTable = DtPeekSubtable ();
933
        DtInsertSubtable (ParentTable, Subtable);
934
 
935
        if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
936
        {
937
            while (*PFieldList &&
938
                    !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
939
            {
940
                SubtableStart = *PFieldList;
941
                DtCompileInteger (&EntryType, *PFieldList, 1, 0);
942
 
943
                switch (EntryType)
944
                {
945
                /* 4-byte device entries */
946
 
947
                case ACPI_IVRS_TYPE_PAD4:
948
                case ACPI_IVRS_TYPE_ALL:
949
                case ACPI_IVRS_TYPE_SELECT:
950
                case ACPI_IVRS_TYPE_START:
951
                case ACPI_IVRS_TYPE_END:
952
 
953
                    InfoTable = AcpiDmTableInfoIvrs4;
954
                    break;
955
 
956
                /* 8-byte entries, type A */
957
 
958
                case ACPI_IVRS_TYPE_ALIAS_SELECT:
959
                case ACPI_IVRS_TYPE_ALIAS_START:
960
 
961
                    InfoTable = AcpiDmTableInfoIvrs8a;
962
                    break;
963
 
964
                /* 8-byte entries, type B */
965
 
966
                case ACPI_IVRS_TYPE_PAD8:
967
                case ACPI_IVRS_TYPE_EXT_SELECT:
968
                case ACPI_IVRS_TYPE_EXT_START:
969
 
970
                    InfoTable = AcpiDmTableInfoIvrs8b;
971
                    break;
972
 
973
                /* 8-byte entries, type C */
974
 
975
                case ACPI_IVRS_TYPE_SPECIAL:
976
 
977
                    InfoTable = AcpiDmTableInfoIvrs8c;
978
                    break;
979
 
980
                default:
981
                    DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
982
                        "IVRS Device Entry");
983
                    return (AE_ERROR);
984
                }
985
 
986
                Status = DtCompileTable (PFieldList, InfoTable,
987
                            &Subtable, TRUE);
988
                if (ACPI_FAILURE (Status))
989
                {
990
                    return (Status);
991
                }
992
 
993
                DtInsertSubtable (ParentTable, Subtable);
994
            }
995
        }
996
 
997
        DtPopSubtable ();
998
    }
999
 
1000
    return (AE_OK);
1001
}
1002
 
1003
 
1004
/******************************************************************************
1005
 *
1006
 * FUNCTION:    DtCompileMadt
1007
 *
1008
 * PARAMETERS:  List                - Current field list pointer
1009
 *
1010
 * RETURN:      Status
1011
 *
1012
 * DESCRIPTION: Compile MADT.
1013
 *
1014
 *****************************************************************************/
1015
 
1016
ACPI_STATUS
1017
DtCompileMadt (
1018
    void                    **List)
1019
{
1020
    ACPI_STATUS             Status;
1021
    DT_SUBTABLE             *Subtable;
1022
    DT_SUBTABLE             *ParentTable;
1023
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
1024
    DT_FIELD                *SubtableStart;
1025
    ACPI_SUBTABLE_HEADER    *MadtHeader;
1026
    ACPI_DMTABLE_INFO       *InfoTable;
1027
 
1028
 
1029
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
1030
                &Subtable, TRUE);
1031
    if (ACPI_FAILURE (Status))
1032
    {
1033
        return (Status);
1034
    }
1035
 
1036
    ParentTable = DtPeekSubtable ();
1037
    DtInsertSubtable (ParentTable, Subtable);
1038
 
1039
    while (*PFieldList)
1040
    {
1041
        SubtableStart = *PFieldList;
1042
        Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
1043
                    &Subtable, TRUE);
1044
        if (ACPI_FAILURE (Status))
1045
        {
1046
            return (Status);
1047
        }
1048
 
1049
        ParentTable = DtPeekSubtable ();
1050
        DtInsertSubtable (ParentTable, Subtable);
1051
        DtPushSubtable (Subtable);
1052
 
1053
        MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1054
 
1055
        switch (MadtHeader->Type)
1056
        {
1057
        case ACPI_MADT_TYPE_LOCAL_APIC:
1058
            InfoTable = AcpiDmTableInfoMadt0;
1059
            break;
1060
        case ACPI_MADT_TYPE_IO_APIC:
1061
            InfoTable = AcpiDmTableInfoMadt1;
1062
            break;
1063
        case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1064
            InfoTable = AcpiDmTableInfoMadt2;
1065
            break;
1066
        case ACPI_MADT_TYPE_NMI_SOURCE:
1067
            InfoTable = AcpiDmTableInfoMadt3;
1068
            break;
1069
        case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1070
            InfoTable = AcpiDmTableInfoMadt4;
1071
            break;
1072
        case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1073
            InfoTable = AcpiDmTableInfoMadt5;
1074
            break;
1075
        case ACPI_MADT_TYPE_IO_SAPIC:
1076
            InfoTable = AcpiDmTableInfoMadt6;
1077
            break;
1078
        case ACPI_MADT_TYPE_LOCAL_SAPIC:
1079
            InfoTable = AcpiDmTableInfoMadt7;
1080
            break;
1081
        case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1082
            InfoTable = AcpiDmTableInfoMadt8;
1083
            break;
1084
        case ACPI_MADT_TYPE_LOCAL_X2APIC:
1085
            InfoTable = AcpiDmTableInfoMadt9;
1086
            break;
1087
        case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1088
            InfoTable = AcpiDmTableInfoMadt10;
1089
            break;
1090
        default:
1091
            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
1092
            return (AE_ERROR);
1093
        }
1094
 
1095
        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1096
        if (ACPI_FAILURE (Status))
1097
        {
1098
            return (Status);
1099
        }
1100
 
1101
        ParentTable = DtPeekSubtable ();
1102
        DtInsertSubtable (ParentTable, Subtable);
1103
        DtPopSubtable ();
1104
    }
1105
 
1106
    return (AE_OK);
1107
}
1108
 
1109
 
1110
/******************************************************************************
1111
 *
1112
 * FUNCTION:    DtCompileMcfg
1113
 *
1114
 * PARAMETERS:  List                - Current field list pointer
1115
 *
1116
 * RETURN:      Status
1117
 *
1118
 * DESCRIPTION: Compile MCFG.
1119
 *
1120
 *****************************************************************************/
1121
 
1122
ACPI_STATUS
1123
DtCompileMcfg (
1124
    void                    **List)
1125
{
1126
    ACPI_STATUS             Status;
1127
 
1128
 
1129
    Status = DtCompileTwoSubtables (List,
1130
                 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
1131
    return (Status);
1132
}
1133
 
1134
 
1135
/******************************************************************************
1136
 *
1137
 * FUNCTION:    DtCompileMsct
1138
 *
1139
 * PARAMETERS:  List                - Current field list pointer
1140
 *
1141
 * RETURN:      Status
1142
 *
1143
 * DESCRIPTION: Compile MSCT.
1144
 *
1145
 *****************************************************************************/
1146
 
1147
ACPI_STATUS
1148
DtCompileMsct (
1149
    void                    **List)
1150
{
1151
    ACPI_STATUS             Status;
1152
 
1153
 
1154
    Status = DtCompileTwoSubtables (List,
1155
                 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
1156
    return (Status);
1157
}
1158
 
1159
 
1160
/******************************************************************************
1161
 *
1162
 * FUNCTION:    DtCompileRsdt
1163
 *
1164
 * PARAMETERS:  List                - Current field list pointer
1165
 *
1166
 * RETURN:      Status
1167
 *
1168
 * DESCRIPTION: Compile RSDT.
1169
 *
1170
 *****************************************************************************/
1171
 
1172
ACPI_STATUS
1173
DtCompileRsdt (
1174
    void                    **List)
1175
{
1176
    DT_SUBTABLE             *Subtable;
1177
    DT_SUBTABLE             *ParentTable;
1178
    DT_FIELD                *FieldList = *(DT_FIELD **) List;
1179
    UINT32                  Address;
1180
 
1181
 
1182
    ParentTable = DtPeekSubtable ();
1183
 
1184
    while (FieldList)
1185
    {
1186
        DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
1187
 
1188
        DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
1189
        DtInsertSubtable (ParentTable, Subtable);
1190
        FieldList = FieldList->Next;
1191
    }
1192
 
1193
    return (AE_OK);
1194
}
1195
 
1196
 
1197
/******************************************************************************
1198
 *
1199
 * FUNCTION:    DtCompileSlit
1200
 *
1201
 * PARAMETERS:  List                - Current field list pointer
1202
 *
1203
 * RETURN:      Status
1204
 *
1205
 * DESCRIPTION: Compile SLIT.
1206
 *
1207
 *****************************************************************************/
1208
 
1209
ACPI_STATUS
1210
DtCompileSlit (
1211
    void                    **List)
1212
{
1213
    ACPI_STATUS             Status;
1214
    DT_SUBTABLE             *Subtable;
1215
    DT_SUBTABLE             *ParentTable;
1216
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
1217
    DT_FIELD                *FieldList;
1218
    UINT32                  Localities;
1219
    UINT8                   *LocalityBuffer;
1220
    UINT32                  RemainingData;
1221
 
1222
 
1223
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
1224
                &Subtable, TRUE);
1225
    if (ACPI_FAILURE (Status))
1226
    {
1227
        return (Status);
1228
    }
1229
 
1230
    ParentTable = DtPeekSubtable ();
1231
    DtInsertSubtable (ParentTable, Subtable);
1232
 
1233
    Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
1234
    LocalityBuffer = UtLocalCalloc (Localities);
1235
 
1236
    FieldList = *PFieldList;
1237
    while (FieldList)
1238
    {
1239
        /* Handle multiple-line buffer */
1240
 
1241
        RemainingData = Localities;
1242
        while (RemainingData && FieldList)
1243
        {
1244
            RemainingData = DtCompileBuffer (
1245
                LocalityBuffer + (Localities - RemainingData),
1246
                FieldList->Value, FieldList, RemainingData);
1247
            FieldList = FieldList->Next;
1248
        }
1249
 
1250
        DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
1251
        DtInsertSubtable (ParentTable, Subtable);
1252
    }
1253
 
1254
    ACPI_FREE (LocalityBuffer);
1255
    return (AE_OK);
1256
}
1257
 
1258
 
1259
/******************************************************************************
1260
 *
1261
 * FUNCTION:    DtCompileSrat
1262
 *
1263
 * PARAMETERS:  List                - Current field list pointer
1264
 *
1265
 * RETURN:      Status
1266
 *
1267
 * DESCRIPTION: Compile SRAT.
1268
 *
1269
 *****************************************************************************/
1270
 
1271
ACPI_STATUS
1272
DtCompileSrat (
1273
    void                    **List)
1274
{
1275
    ACPI_STATUS             Status;
1276
    DT_SUBTABLE             *Subtable;
1277
    DT_SUBTABLE             *ParentTable;
1278
    DT_FIELD                **PFieldList = (DT_FIELD **) List;
1279
    DT_FIELD                *SubtableStart;
1280
    ACPI_SUBTABLE_HEADER    *SratHeader;
1281
    ACPI_DMTABLE_INFO       *InfoTable;
1282
 
1283
 
1284
    Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
1285
                &Subtable, TRUE);
1286
    if (ACPI_FAILURE (Status))
1287
    {
1288
        return (Status);
1289
    }
1290
 
1291
    ParentTable = DtPeekSubtable ();
1292
    DtInsertSubtable (ParentTable, Subtable);
1293
 
1294
    while (*PFieldList)
1295
    {
1296
        SubtableStart = *PFieldList;
1297
        Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
1298
                    &Subtable, TRUE);
1299
        if (ACPI_FAILURE (Status))
1300
        {
1301
            return (Status);
1302
        }
1303
 
1304
        ParentTable = DtPeekSubtable ();
1305
        DtInsertSubtable (ParentTable, Subtable);
1306
        DtPushSubtable (Subtable);
1307
 
1308
        SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1309
 
1310
        switch (SratHeader->Type)
1311
        {
1312
        case ACPI_SRAT_TYPE_CPU_AFFINITY:
1313
            InfoTable = AcpiDmTableInfoSrat0;
1314
            break;
1315
        case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1316
            InfoTable = AcpiDmTableInfoSrat1;
1317
            break;
1318
        case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1319
            InfoTable = AcpiDmTableInfoSrat2;
1320
            break;
1321
        default:
1322
            DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
1323
            return (AE_ERROR);
1324
        }
1325
 
1326
        Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1327
        if (ACPI_FAILURE (Status))
1328
        {
1329
            return (Status);
1330
        }
1331
 
1332
        ParentTable = DtPeekSubtable ();
1333
        DtInsertSubtable (ParentTable, Subtable);
1334
        DtPopSubtable ();
1335
    }
1336
 
1337
    return (AE_OK);
1338
}
1339
 
1340
 
1341
/******************************************************************************
1342
 *
1343
 * FUNCTION:    DtCompileWdat
1344
 *
1345
 * PARAMETERS:  List                - Current field list pointer
1346
 *
1347
 * RETURN:      Status
1348
 *
1349
 * DESCRIPTION: Compile WDAT.
1350
 *
1351
 *****************************************************************************/
1352
 
1353
ACPI_STATUS
1354
DtCompileWdat (
1355
    void                    **List)
1356
{
1357
    ACPI_STATUS             Status;
1358
 
1359
 
1360
    Status = DtCompileTwoSubtables (List,
1361
                 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
1362
    return (Status);
1363
}
1364
 
1365
 
1366
/******************************************************************************
1367
 *
1368
 * FUNCTION:    DtCompileXsdt
1369
 *
1370
 * PARAMETERS:  List                - Current field list pointer
1371
 *
1372
 * RETURN:      Status
1373
 *
1374
 * DESCRIPTION: Compile XSDT.
1375
 *
1376
 *****************************************************************************/
1377
 
1378
ACPI_STATUS
1379
DtCompileXsdt (
1380
    void                    **List)
1381
{
1382
    DT_SUBTABLE             *Subtable;
1383
    DT_SUBTABLE             *ParentTable;
1384
    DT_FIELD                *FieldList = *(DT_FIELD **) List;
1385
    UINT64                  Address;
1386
 
1387
    ParentTable = DtPeekSubtable ();
1388
 
1389
    while (FieldList)
1390
    {
1391
        DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
1392
 
1393
        DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
1394
        DtInsertSubtable (ParentTable, Subtable);
1395
        FieldList = FieldList->Next;
1396
    }
1397
 
1398
    return (AE_OK);
1399
}