1208625Sjkim/******************************************************************************
2208625Sjkim *
3208625Sjkim * Module Name: dttable.c - handling for specific ACPI tables
4208625Sjkim *
5208625Sjkim *****************************************************************************/
6208625Sjkim
7217365Sjkim/*
8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9208625Sjkim * All rights reserved.
10208625Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25208625Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29208625Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43208625Sjkim
44306536Sjkim/* Compile routines for the basic ACPI tables */
45208625Sjkim
46209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
47209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h>
48208625Sjkim
49208625Sjkim#define _COMPONENT          DT_COMPILER
50208625Sjkim        ACPI_MODULE_NAME    ("dttable")
51208625Sjkim
52208625Sjkim
53208625Sjkim/******************************************************************************
54208625Sjkim *
55208625Sjkim * FUNCTION:    DtCompileRsdp
56208625Sjkim *
57208625Sjkim * PARAMETERS:  PFieldList          - Current field list pointer
58208625Sjkim *
59208625Sjkim * RETURN:      Status
60208625Sjkim *
61208625Sjkim * DESCRIPTION: Compile RSDP.
62208625Sjkim *
63208625Sjkim *****************************************************************************/
64208625Sjkim
65208625SjkimACPI_STATUS
66208625SjkimDtCompileRsdp (
67208625Sjkim    DT_FIELD                **PFieldList)
68208625Sjkim{
69208625Sjkim    DT_SUBTABLE             *Subtable;
70209734Sjkim    ACPI_TABLE_RSDP         *Rsdp;
71209734Sjkim    ACPI_RSDP_EXTENSION     *RsdpExtension;
72208625Sjkim    ACPI_STATUS             Status;
73208625Sjkim
74208625Sjkim
75209734Sjkim    /* Compile the "common" RSDP (ACPI 1.0) */
76209734Sjkim
77208625Sjkim    Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
78306536Sjkim        &Gbl_RootTable, TRUE);
79208625Sjkim    if (ACPI_FAILURE (Status))
80208625Sjkim    {
81208625Sjkim        return (Status);
82208625Sjkim    }
83208625Sjkim
84209734Sjkim    Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
85209734Sjkim    DtSetTableChecksum (&Rsdp->Checksum);
86208625Sjkim
87209734Sjkim    if (Rsdp->Revision > 0)
88208625Sjkim    {
89209734Sjkim        /* Compile the "extended" part of the RSDP as a subtable */
90209734Sjkim
91208625Sjkim        Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
92306536Sjkim            &Subtable, TRUE);
93208625Sjkim        if (ACPI_FAILURE (Status))
94208625Sjkim        {
95208625Sjkim            return (Status);
96208625Sjkim        }
97208625Sjkim
98208625Sjkim        DtInsertSubtable (Gbl_RootTable, Subtable);
99209734Sjkim
100209734Sjkim        /* Set length and extended checksum for entire RSDP */
101209734Sjkim
102209734Sjkim        RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
103209734Sjkim        RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
104209734Sjkim        DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
105208625Sjkim    }
106208625Sjkim
107208625Sjkim    return (AE_OK);
108208625Sjkim}
109208625Sjkim
110208625Sjkim
111208625Sjkim/******************************************************************************
112208625Sjkim *
113208625Sjkim * FUNCTION:    DtCompileFadt
114208625Sjkim *
115208625Sjkim * PARAMETERS:  List                - Current field list pointer
116208625Sjkim *
117208625Sjkim * RETURN:      Status
118208625Sjkim *
119208625Sjkim * DESCRIPTION: Compile FADT.
120208625Sjkim *
121208625Sjkim *****************************************************************************/
122208625Sjkim
123208625SjkimACPI_STATUS
124208625SjkimDtCompileFadt (
125208625Sjkim    void                    **List)
126208625Sjkim{
127208625Sjkim    ACPI_STATUS             Status;
128208625Sjkim    DT_SUBTABLE             *Subtable;
129208625Sjkim    DT_SUBTABLE             *ParentTable;
130208625Sjkim    DT_FIELD                **PFieldList = (DT_FIELD **) List;
131208625Sjkim    ACPI_TABLE_HEADER       *Table;
132208625Sjkim    UINT8                   Revision;
133208625Sjkim
134208625Sjkim
135208625Sjkim    Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
136306536Sjkim        &Subtable, TRUE);
137208625Sjkim    if (ACPI_FAILURE (Status))
138208625Sjkim    {
139208625Sjkim        return (Status);
140208625Sjkim    }
141208625Sjkim
142208625Sjkim    ParentTable = DtPeekSubtable ();
143208625Sjkim    DtInsertSubtable (ParentTable, Subtable);
144208625Sjkim
145208625Sjkim    Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
146208625Sjkim    Revision = Table->Revision;
147208625Sjkim
148208625Sjkim    if (Revision == 2)
149208625Sjkim    {
150208625Sjkim        Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
151306536Sjkim            &Subtable, TRUE);
152208625Sjkim        if (ACPI_FAILURE (Status))
153208625Sjkim        {
154208625Sjkim            return (Status);
155208625Sjkim        }
156208625Sjkim
157208625Sjkim        DtInsertSubtable (ParentTable, Subtable);
158208625Sjkim    }
159208625Sjkim    else if (Revision >= 2)
160208625Sjkim    {
161208625Sjkim        Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
162306536Sjkim            &Subtable, TRUE);
163208625Sjkim        if (ACPI_FAILURE (Status))
164208625Sjkim        {
165208625Sjkim            return (Status);
166208625Sjkim        }
167208625Sjkim
168208625Sjkim        DtInsertSubtable (ParentTable, Subtable);
169228110Sjkim
170228110Sjkim        if (Revision >= 5)
171228110Sjkim        {
172228110Sjkim            Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
173306536Sjkim                &Subtable, TRUE);
174228110Sjkim            if (ACPI_FAILURE (Status))
175228110Sjkim            {
176228110Sjkim                return (Status);
177228110Sjkim            }
178228110Sjkim
179228110Sjkim            DtInsertSubtable (ParentTable, Subtable);
180228110Sjkim        }
181284460Sjkim
182284460Sjkim        if (Revision >= 6)
183284460Sjkim        {
184284460Sjkim            Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6,
185281075Sdim                &Subtable, TRUE);
186208625Sjkim            if (ACPI_FAILURE (Status))
187208625Sjkim            {
188208625Sjkim                return (Status);
189208625Sjkim            }
190208625Sjkim
191208625Sjkim            DtInsertSubtable (ParentTable, Subtable);
192208625Sjkim        }
193208625Sjkim    }
194208625Sjkim
195241973Sjkim    return (AE_OK);
196208625Sjkim}
197208625Sjkim
198208625Sjkim
199208625Sjkim/******************************************************************************
200208625Sjkim *
201306536Sjkim * FUNCTION:    DtCompileFacs
202284460Sjkim *
203228110Sjkim * PARAMETERS:  PFieldList          - Current field list pointer
204228110Sjkim *
205228110Sjkim * RETURN:      Status
206228110Sjkim *
207306536Sjkim * DESCRIPTION: Compile FACS.
208228110Sjkim *
209228110Sjkim *****************************************************************************/
210228110Sjkim
211228110SjkimACPI_STATUS
212306536SjkimDtCompileFacs (
213228110Sjkim    DT_FIELD                **PFieldList)
214228110Sjkim{
215228110Sjkim    DT_SUBTABLE             *Subtable;
216306536Sjkim    UINT8                   *ReservedBuffer;
217219707Sjkim    ACPI_STATUS             Status;
218306536Sjkim    UINT32                  ReservedSize;
219219707Sjkim
220219707Sjkim
221306536Sjkim    Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
222306536Sjkim        &Gbl_RootTable, TRUE);
223208625Sjkim    if (ACPI_FAILURE (Status))
224208625Sjkim    {
225208625Sjkim        return (Status);
226208625Sjkim    }
227208625Sjkim
228306536Sjkim    /* Large FACS reserved area at the end of the table */
229208625Sjkim
230306536Sjkim    ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
231306536Sjkim    ReservedBuffer = UtLocalCalloc (ReservedSize);
232208625Sjkim
233306536Sjkim    DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
234220663Sjkim
235306536Sjkim    ACPI_FREE (ReservedBuffer);
236306536Sjkim    DtInsertSubtable (Gbl_RootTable, Subtable);
237208625Sjkim    return (AE_OK);
238208625Sjkim}
239