11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/****************************************************************************** 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Module Name: nsparse - namespace interface to AML parser 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *****************************************************************************/ 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 8fbb7a2dc2be493c87399550bdc2ddaa510cdf450Bob Moore * Copyright (C) 2000 - 2014, Intel Corp. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * All rights reserved. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Redistribution and use in source and binary forms, with or without 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * modification, are permitted provided that the following conditions 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * are met: 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1. Redistributions of source code must retain the above copyright 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notice, this list of conditions, and the following disclaimer, 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * without modification. 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2. Redistributions in binary form must reproduce at minimum a disclaimer 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * substantially similar to the "NO WARRANTY" disclaimer below 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ("Disclaimer") and any redistribution must be conditioned upon 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including a substantially similar Disclaimer requirement for further 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * binary redistribution. 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3. Neither the names of the above-listed copyright holders nor the names 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of any contributors may be used to endorse or promote products derived 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * from this software without specific prior written permission. 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Alternatively, this software may be distributed under the terms of the 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License ("GPL") version 2 as published by the Free 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Software Foundation. 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NO WARRANTY 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * POSSIBILITY OF SUCH DAMAGES. 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <acpi/acpi.h> 45e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "accommon.h" 46e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acnamesp.h" 47e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acparser.h" 48e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "acdispat.h" 49e2f7a7772880458edff1b1cc5a988947229fac26Len Brown#include "actables.h" 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _COMPONENT ACPI_NAMESPACE 524be44fcd3bf648b782f4460fd06dfae6c42ded4bLen BrownACPI_MODULE_NAME("nsparse") 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: ns_one_complete_parse 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: pass_number - 1 or 2 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * table_desc - The table to be parsed. 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Perform one complete parse of an ACPI/AML table. 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 6767a119f990063f5662574f6d6414fe9bc5ece86aBob Mooreacpi_ns_one_complete_parse(u32 pass_number, 6867a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 table_index, 6967a119f990063f5662574f6d6414fe9bc5ece86aBob Moore struct acpi_namespace_node *start_node) 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 714be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown union acpi_parse_object *parse_root; 724be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 7367a119f990063f5662574f6d6414fe9bc5ece86aBob Moore u32 aml_length; 74f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore u8 *aml_start; 754be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown struct acpi_walk_state *walk_state; 76f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore struct acpi_table_header *table; 77f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_owner_id owner_id; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 79b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ns_one_complete_parse); 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 81f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = acpi_tb_get_owner_id(table_index, &owner_id); 82f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (ACPI_FAILURE(status)) { 83f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(status); 84f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 85f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create and init a Root Node */ 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 884be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown parse_root = acpi_ps_create_scope_op(); 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!parse_root) { 904be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Create and initialize a new walk state */ 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 95f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore walk_state = acpi_ds_create_walk_state(owner_id, NULL, NULL, NULL); 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!walk_state) { 974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ps_free_op(parse_root); 984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(AE_NO_MEMORY); 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 101f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = acpi_get_table_by_index(table_index, &table); 102f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (ACPI_FAILURE(status)) { 103f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_ds_delete_walk_state(walk_state); 104f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore acpi_ps_free_op(parse_root); 105f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore return_ACPI_STATUS(status); 106f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 107f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 108f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore /* Table must consist of at least a complete header */ 109f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 110f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore if (table->length < sizeof(struct acpi_table_header)) { 111f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = AE_BAD_HEADER; 112f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } else { 113f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore aml_start = (u8 *) table + sizeof(struct acpi_table_header); 114f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore aml_length = table->length - sizeof(struct acpi_table_header); 115f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore status = acpi_ds_init_aml_walk(walk_state, parse_root, NULL, 11667a119f990063f5662574f6d6414fe9bc5ece86aBob Moore aml_start, aml_length, NULL, 11767a119f990063f5662574f6d6414fe9bc5ece86aBob Moore (u8) pass_number); 118f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore } 119f3d2e7865c816258c699ff965768e46b50d536d3Bob Moore 1204be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 1214be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ds_delete_walk_state(walk_state); 1221d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore goto cleanup; 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1257f4ac9f91383a0707de559dc8fbca986fc2d302fBob Moore /* start_node is the default location to load the table */ 1267f4ac9f91383a0707de559dc8fbca986fc2d302fBob Moore 1277f4ac9f91383a0707de559dc8fbca986fc2d302fBob Moore if (start_node && start_node != acpi_gbl_root_node) { 1281d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore status = 1291d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore acpi_ds_scope_stack_push(start_node, ACPI_TYPE_METHOD, 1301d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore walk_state); 1311d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore if (ACPI_FAILURE(status)) { 1321d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore acpi_ds_delete_walk_state(walk_state); 1331d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore goto cleanup; 1341d18c05825c3f2b8933a7fc7f7528881e98deb04Bob Moore } 1357f4ac9f91383a0707de559dc8fbca986fc2d302fBob Moore } 1367f4ac9f91383a0707de559dc8fbca986fc2d302fBob Moore 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Parse the AML */ 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 139b27d65975c252ff774edff8e01f0a9fd46d8ab62Bob Moore ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "*PARSE* pass %u parse\n", 140b27d65975c252ff774edff8e01f0a9fd46d8ab62Bob Moore pass_number)); 1414be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown status = acpi_ps_parse_aml(walk_state); 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14310622bf8ce432e6a53fd3c37163e99e99c9e43eeLv Zhengcleanup: 1444be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_ps_delete_parse_tree(parse_root); 1454be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/******************************************************************************* 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * FUNCTION: acpi_ns_parse_table 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PARAMETERS: table_desc - An ACPI table descriptor for table to parse 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * start_node - Where to enter the table into the namespace 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURN: Status 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DESCRIPTION: Parse AML within an ACPI table and return a tree of ops 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ******************************************************************************/ 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsacpi_status 16267a119f990063f5662574f6d6414fe9bc5ece86aBob Mooreacpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node) 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1644be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown acpi_status status; 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 166b229cf92eee616c7cb5ad8cdb35a19b119f00bc8Bob Moore ACPI_FUNCTION_TRACE(ns_parse_table); 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * AML Parse, pass 1 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 17173a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * In this pass, we load most of the namespace. Control methods 17273a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * are not parsed until later. A parse tree is not created. Instead, 17373a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * each Parser Op subtree is deleted when it is finished. This saves 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a great deal of memory, and allows a small cache of parse objects 17573a3090a2160fb01317f5a44af6ee5a064a29625Bob Moore * to service the entire parse. The second pass of the parse then 176ec3153fb0e96988dc7e378b3ab01e05131ba713bBob Moore * performs another complete parse of the AML. 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1784be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 1\n")); 179d4913dc6d0c680aa106d1d80b5ad2a9325367afdBob Moore status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS1, 180d4913dc6d0c680aa106d1d80b5ad2a9325367afdBob Moore table_index, start_node); 1814be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 1824be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * AML Parse, pass 2 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * In this pass, we resolve forward references and other things 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * that could not be completed during the first pass. 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Another complete parse of the AML is performed, but the 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * overhead of this is compensated for by the fact that the 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * parse objects are all cached. 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1944be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 2\n")); 195d4913dc6d0c680aa106d1d80b5ad2a9325367afdBob Moore status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS2, 196d4913dc6d0c680aa106d1d80b5ad2a9325367afdBob Moore table_index, start_node); 1974be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown if (ACPI_FAILURE(status)) { 1984be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2014be44fcd3bf648b782f4460fd06dfae6c42ded4bLen Brown return_ACPI_STATUS(status); 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 203