1a88e22b7SJung-uk Kim /****************************************************************************** 2a88e22b7SJung-uk Kim * 3a88e22b7SJung-uk Kim * Module Name: dttable.c - handling for specific ACPI tables 4a88e22b7SJung-uk Kim * 5a88e22b7SJung-uk Kim *****************************************************************************/ 6a88e22b7SJung-uk Kim 7d244b227SJung-uk Kim /* 8*f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, Intel Corp. 9a88e22b7SJung-uk Kim * All rights reserved. 10a88e22b7SJung-uk Kim * 11d244b227SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12d244b227SJung-uk Kim * modification, are permitted provided that the following conditions 13d244b227SJung-uk Kim * are met: 14d244b227SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15d244b227SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16d244b227SJung-uk Kim * without modification. 17d244b227SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18d244b227SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19d244b227SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20d244b227SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21d244b227SJung-uk Kim * binary redistribution. 22d244b227SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23d244b227SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24d244b227SJung-uk Kim * from this software without specific prior written permission. 25a88e22b7SJung-uk Kim * 26d244b227SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27d244b227SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28d244b227SJung-uk Kim * Software Foundation. 29a88e22b7SJung-uk Kim * 30d244b227SJung-uk Kim * NO WARRANTY 31d244b227SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32d244b227SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33d244b227SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34d244b227SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35d244b227SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36d244b227SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37d244b227SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38d244b227SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39d244b227SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40d244b227SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41d244b227SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42d244b227SJung-uk Kim */ 43a88e22b7SJung-uk Kim 44*f8146b88SJung-uk Kim /* Compile routines for the basic ACPI tables */ 45a88e22b7SJung-uk Kim 46a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 47a88e22b7SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 48a88e22b7SJung-uk Kim 49a88e22b7SJung-uk Kim #define _COMPONENT DT_COMPILER 50a88e22b7SJung-uk Kim ACPI_MODULE_NAME ("dttable") 51a88e22b7SJung-uk Kim 52a88e22b7SJung-uk Kim 53a88e22b7SJung-uk Kim /****************************************************************************** 54a88e22b7SJung-uk Kim * 55a88e22b7SJung-uk Kim * FUNCTION: DtCompileRsdp 56a88e22b7SJung-uk Kim * 57a88e22b7SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 58a88e22b7SJung-uk Kim * 59a88e22b7SJung-uk Kim * RETURN: Status 60a88e22b7SJung-uk Kim * 61a88e22b7SJung-uk Kim * DESCRIPTION: Compile RSDP. 62a88e22b7SJung-uk Kim * 63a88e22b7SJung-uk Kim *****************************************************************************/ 64a88e22b7SJung-uk Kim 65a88e22b7SJung-uk Kim ACPI_STATUS 66a88e22b7SJung-uk Kim DtCompileRsdp ( 67a88e22b7SJung-uk Kim DT_FIELD **PFieldList) 68a88e22b7SJung-uk Kim { 69a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 70a88e22b7SJung-uk Kim ACPI_TABLE_RSDP *Rsdp; 71a88e22b7SJung-uk Kim ACPI_RSDP_EXTENSION *RsdpExtension; 72a88e22b7SJung-uk Kim ACPI_STATUS Status; 73a88e22b7SJung-uk Kim 74a88e22b7SJung-uk Kim 75a88e22b7SJung-uk Kim /* Compile the "common" RSDP (ACPI 1.0) */ 76a88e22b7SJung-uk Kim 77a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1, 78a88e22b7SJung-uk Kim &Gbl_RootTable, TRUE); 79a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 80a88e22b7SJung-uk Kim { 81a88e22b7SJung-uk Kim return (Status); 82a88e22b7SJung-uk Kim } 83a88e22b7SJung-uk Kim 84a88e22b7SJung-uk Kim Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer); 85a88e22b7SJung-uk Kim DtSetTableChecksum (&Rsdp->Checksum); 86a88e22b7SJung-uk Kim 87a88e22b7SJung-uk Kim if (Rsdp->Revision > 0) 88a88e22b7SJung-uk Kim { 89a88e22b7SJung-uk Kim /* Compile the "extended" part of the RSDP as a subtable */ 90a88e22b7SJung-uk Kim 91a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2, 92a88e22b7SJung-uk Kim &Subtable, TRUE); 93a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 94a88e22b7SJung-uk Kim { 95a88e22b7SJung-uk Kim return (Status); 96a88e22b7SJung-uk Kim } 97a88e22b7SJung-uk Kim 98a88e22b7SJung-uk Kim DtInsertSubtable (Gbl_RootTable, Subtable); 99a88e22b7SJung-uk Kim 100a88e22b7SJung-uk Kim /* Set length and extended checksum for entire RSDP */ 101a88e22b7SJung-uk Kim 102a88e22b7SJung-uk Kim RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer); 103a88e22b7SJung-uk Kim RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length; 104a88e22b7SJung-uk Kim DtSetTableChecksum (&RsdpExtension->ExtendedChecksum); 105a88e22b7SJung-uk Kim } 106a88e22b7SJung-uk Kim 107a88e22b7SJung-uk Kim return (AE_OK); 108a88e22b7SJung-uk Kim } 109a88e22b7SJung-uk Kim 110a88e22b7SJung-uk Kim 111a88e22b7SJung-uk Kim /****************************************************************************** 112a88e22b7SJung-uk Kim * 113a88e22b7SJung-uk Kim * FUNCTION: DtCompileFadt 114a88e22b7SJung-uk Kim * 115a88e22b7SJung-uk Kim * PARAMETERS: List - Current field list pointer 116a88e22b7SJung-uk Kim * 117a88e22b7SJung-uk Kim * RETURN: Status 118a88e22b7SJung-uk Kim * 119a88e22b7SJung-uk Kim * DESCRIPTION: Compile FADT. 120a88e22b7SJung-uk Kim * 121a88e22b7SJung-uk Kim *****************************************************************************/ 122a88e22b7SJung-uk Kim 123a88e22b7SJung-uk Kim ACPI_STATUS 124a88e22b7SJung-uk Kim DtCompileFadt ( 125a88e22b7SJung-uk Kim void **List) 126a88e22b7SJung-uk Kim { 127a88e22b7SJung-uk Kim ACPI_STATUS Status; 128a88e22b7SJung-uk Kim DT_SUBTABLE *Subtable; 129a88e22b7SJung-uk Kim DT_SUBTABLE *ParentTable; 130a88e22b7SJung-uk Kim DT_FIELD **PFieldList = (DT_FIELD **) List; 131a88e22b7SJung-uk Kim ACPI_TABLE_HEADER *Table; 132a88e22b7SJung-uk Kim UINT8 Revision; 133a88e22b7SJung-uk Kim 134a88e22b7SJung-uk Kim 135a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1, 136a88e22b7SJung-uk Kim &Subtable, TRUE); 137a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 138a88e22b7SJung-uk Kim { 139a88e22b7SJung-uk Kim return (Status); 140a88e22b7SJung-uk Kim } 141a88e22b7SJung-uk Kim 142a88e22b7SJung-uk Kim ParentTable = DtPeekSubtable (); 143a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 144a88e22b7SJung-uk Kim 145a88e22b7SJung-uk Kim Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer); 146a88e22b7SJung-uk Kim Revision = Table->Revision; 147a88e22b7SJung-uk Kim 148a88e22b7SJung-uk Kim if (Revision == 2) 149a88e22b7SJung-uk Kim { 150a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2, 151a88e22b7SJung-uk Kim &Subtable, TRUE); 152a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 153a88e22b7SJung-uk Kim { 154a88e22b7SJung-uk Kim return (Status); 155a88e22b7SJung-uk Kim } 156a88e22b7SJung-uk Kim 157a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 158a88e22b7SJung-uk Kim } 159a88e22b7SJung-uk Kim else if (Revision >= 2) 160a88e22b7SJung-uk Kim { 161a88e22b7SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3, 162a88e22b7SJung-uk Kim &Subtable, TRUE); 163a88e22b7SJung-uk Kim if (ACPI_FAILURE (Status)) 164a88e22b7SJung-uk Kim { 165a88e22b7SJung-uk Kim return (Status); 166a88e22b7SJung-uk Kim } 167a88e22b7SJung-uk Kim 168a88e22b7SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1693f0275a0SJung-uk Kim 1703f0275a0SJung-uk Kim if (Revision >= 5) 1713f0275a0SJung-uk Kim { 1723f0275a0SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5, 1733f0275a0SJung-uk Kim &Subtable, TRUE); 1743f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 1753f0275a0SJung-uk Kim { 1763f0275a0SJung-uk Kim return (Status); 1773f0275a0SJung-uk Kim } 1783f0275a0SJung-uk Kim 1793f0275a0SJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 1803f0275a0SJung-uk Kim } 181a371a5fdSJung-uk Kim 182a371a5fdSJung-uk Kim if (Revision >= 6) 183a371a5fdSJung-uk Kim { 184a371a5fdSJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6, 185a371a5fdSJung-uk Kim &Subtable, TRUE); 186a371a5fdSJung-uk Kim if (ACPI_FAILURE (Status)) 187a371a5fdSJung-uk Kim { 188a371a5fdSJung-uk Kim return (Status); 189a371a5fdSJung-uk Kim } 190a371a5fdSJung-uk Kim 191a371a5fdSJung-uk Kim DtInsertSubtable (ParentTable, Subtable); 192a371a5fdSJung-uk Kim } 1933f0275a0SJung-uk Kim } 1943f0275a0SJung-uk Kim 1953f0275a0SJung-uk Kim return (AE_OK); 1963f0275a0SJung-uk Kim } 1973f0275a0SJung-uk Kim 1983f0275a0SJung-uk Kim 1993f0275a0SJung-uk Kim /****************************************************************************** 2003f0275a0SJung-uk Kim * 201*f8146b88SJung-uk Kim * FUNCTION: DtCompileFacs 2023f0275a0SJung-uk Kim * 2033f0275a0SJung-uk Kim * PARAMETERS: PFieldList - Current field list pointer 2043f0275a0SJung-uk Kim * 2053f0275a0SJung-uk Kim * RETURN: Status 2063f0275a0SJung-uk Kim * 207*f8146b88SJung-uk Kim * DESCRIPTION: Compile FACS. 2083f0275a0SJung-uk Kim * 2093f0275a0SJung-uk Kim *****************************************************************************/ 2103f0275a0SJung-uk Kim 2113f0275a0SJung-uk Kim ACPI_STATUS 212*f8146b88SJung-uk Kim DtCompileFacs ( 2133f0275a0SJung-uk Kim DT_FIELD **PFieldList) 2143f0275a0SJung-uk Kim { 2153f0275a0SJung-uk Kim DT_SUBTABLE *Subtable; 216*f8146b88SJung-uk Kim UINT8 *ReservedBuffer; 217*f8146b88SJung-uk Kim ACPI_STATUS Status; 218*f8146b88SJung-uk Kim UINT32 ReservedSize; 2193f0275a0SJung-uk Kim 2203f0275a0SJung-uk Kim 221*f8146b88SJung-uk Kim Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs, 2223f0275a0SJung-uk Kim &Gbl_RootTable, TRUE); 2233f0275a0SJung-uk Kim if (ACPI_FAILURE (Status)) 2243f0275a0SJung-uk Kim { 2253f0275a0SJung-uk Kim return (Status); 2263f0275a0SJung-uk Kim } 2273f0275a0SJung-uk Kim 228*f8146b88SJung-uk Kim /* Large FACS reserved area at the end of the table */ 2293f0275a0SJung-uk Kim 230*f8146b88SJung-uk Kim ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1); 231*f8146b88SJung-uk Kim ReservedBuffer = UtLocalCalloc (ReservedSize); 2323f0275a0SJung-uk Kim 233*f8146b88SJung-uk Kim DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable); 2343f0275a0SJung-uk Kim 235*f8146b88SJung-uk Kim ACPI_FREE (ReservedBuffer); 236*f8146b88SJung-uk Kim DtInsertSubtable (Gbl_RootTable, Subtable); 237d052a1ccSJung-uk Kim return (AE_OK); 238d052a1ccSJung-uk Kim } 239