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