19c48c75eSJung-uk Kim /****************************************************************************** 29c48c75eSJung-uk Kim * 39c48c75eSJung-uk Kim * Module Name: aslprepkg - support for ACPI predefined name package objects 49c48c75eSJung-uk Kim * 59c48c75eSJung-uk Kim *****************************************************************************/ 69c48c75eSJung-uk Kim 79c48c75eSJung-uk Kim /* 8*f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, Intel Corp. 99c48c75eSJung-uk Kim * All rights reserved. 109c48c75eSJung-uk Kim * 119c48c75eSJung-uk Kim * Redistribution and use in source and binary forms, with or without 129c48c75eSJung-uk Kim * modification, are permitted provided that the following conditions 139c48c75eSJung-uk Kim * are met: 149c48c75eSJung-uk Kim * 1. Redistributions of source code must retain the above copyright 159c48c75eSJung-uk Kim * notice, this list of conditions, and the following disclaimer, 169c48c75eSJung-uk Kim * without modification. 179c48c75eSJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 189c48c75eSJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 199c48c75eSJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 209c48c75eSJung-uk Kim * including a substantially similar Disclaimer requirement for further 219c48c75eSJung-uk Kim * binary redistribution. 229c48c75eSJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 239c48c75eSJung-uk Kim * of any contributors may be used to endorse or promote products derived 249c48c75eSJung-uk Kim * from this software without specific prior written permission. 259c48c75eSJung-uk Kim * 269c48c75eSJung-uk Kim * Alternatively, this software may be distributed under the terms of the 279c48c75eSJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 289c48c75eSJung-uk Kim * Software Foundation. 299c48c75eSJung-uk Kim * 309c48c75eSJung-uk Kim * NO WARRANTY 319c48c75eSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 329c48c75eSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 339c48c75eSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 349c48c75eSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 359c48c75eSJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 369c48c75eSJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 379c48c75eSJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 389c48c75eSJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 399c48c75eSJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 409c48c75eSJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 419c48c75eSJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 429c48c75eSJung-uk Kim */ 439c48c75eSJung-uk Kim 449c48c75eSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 459c48c75eSJung-uk Kim #include "aslcompiler.y.h" 469c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h> 479c48c75eSJung-uk Kim 489c48c75eSJung-uk Kim 499c48c75eSJung-uk Kim #define _COMPONENT ACPI_COMPILER 509c48c75eSJung-uk Kim ACPI_MODULE_NAME ("aslprepkg") 519c48c75eSJung-uk Kim 529c48c75eSJung-uk Kim 539c48c75eSJung-uk Kim /* Local prototypes */ 549c48c75eSJung-uk Kim 55*f8146b88SJung-uk Kim static ACPI_PARSE_OBJECT * 569c48c75eSJung-uk Kim ApCheckPackageElements ( 579c48c75eSJung-uk Kim const char *PredefinedName, 589c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 599c48c75eSJung-uk Kim UINT8 Type1, 609c48c75eSJung-uk Kim UINT32 Count1, 619c48c75eSJung-uk Kim UINT8 Type2, 629c48c75eSJung-uk Kim UINT32 Count2); 639c48c75eSJung-uk Kim 649c48c75eSJung-uk Kim static void 659c48c75eSJung-uk Kim ApCheckPackageList ( 669c48c75eSJung-uk Kim const char *PredefinedName, 679c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp, 689c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package, 699c48c75eSJung-uk Kim UINT32 StartIndex, 709c48c75eSJung-uk Kim UINT32 Count); 719c48c75eSJung-uk Kim 729c48c75eSJung-uk Kim static void 739c48c75eSJung-uk Kim ApPackageTooSmall ( 749c48c75eSJung-uk Kim const char *PredefinedName, 759c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 769c48c75eSJung-uk Kim UINT32 Count, 779c48c75eSJung-uk Kim UINT32 ExpectedCount); 789c48c75eSJung-uk Kim 799c48c75eSJung-uk Kim static void 809c48c75eSJung-uk Kim ApZeroLengthPackage ( 819c48c75eSJung-uk Kim const char *PredefinedName, 829c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op); 839c48c75eSJung-uk Kim 849c48c75eSJung-uk Kim static void 859c48c75eSJung-uk Kim ApPackageTooLarge ( 869c48c75eSJung-uk Kim const char *PredefinedName, 879c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 889c48c75eSJung-uk Kim UINT32 Count, 899c48c75eSJung-uk Kim UINT32 ExpectedCount); 909c48c75eSJung-uk Kim 91*f8146b88SJung-uk Kim static void 92*f8146b88SJung-uk Kim ApCustomPackage ( 93*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp, 94*f8146b88SJung-uk Kim const ACPI_PREDEFINED_INFO *Predefined); 95*f8146b88SJung-uk Kim 969c48c75eSJung-uk Kim 979c48c75eSJung-uk Kim /******************************************************************************* 989c48c75eSJung-uk Kim * 999c48c75eSJung-uk Kim * FUNCTION: ApCheckPackage 1009c48c75eSJung-uk Kim * 1019c48c75eSJung-uk Kim * PARAMETERS: ParentOp - Parser op for the package 102895f26a9SJung-uk Kim * Predefined - Pointer to package-specific info for 103895f26a9SJung-uk Kim * the method 1049c48c75eSJung-uk Kim * 1059c48c75eSJung-uk Kim * RETURN: None 1069c48c75eSJung-uk Kim * 1079c48c75eSJung-uk Kim * DESCRIPTION: Top-level validation for predefined name return package 1089c48c75eSJung-uk Kim * objects. 1099c48c75eSJung-uk Kim * 1109c48c75eSJung-uk Kim ******************************************************************************/ 1119c48c75eSJung-uk Kim 1129c48c75eSJung-uk Kim void 1139c48c75eSJung-uk Kim ApCheckPackage ( 1149c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp, 1159c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Predefined) 1169c48c75eSJung-uk Kim { 1179c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op; 1189c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package; 1199c48c75eSJung-uk Kim ACPI_STATUS Status; 1209c48c75eSJung-uk Kim UINT32 ExpectedCount; 1219c48c75eSJung-uk Kim UINT32 Count; 1229c48c75eSJung-uk Kim UINT32 i; 1239c48c75eSJung-uk Kim 1249c48c75eSJung-uk Kim 1259c48c75eSJung-uk Kim /* The package info for this name is in the next table entry */ 1269c48c75eSJung-uk Kim 1279c48c75eSJung-uk Kim Package = Predefined + 1; 1289c48c75eSJung-uk Kim 1299c48c75eSJung-uk Kim /* First child is the package length */ 1309c48c75eSJung-uk Kim 1319c48c75eSJung-uk Kim Op = ParentOp->Asl.Child; 1329c48c75eSJung-uk Kim Count = (UINT32) Op->Asl.Value.Integer; 1339c48c75eSJung-uk Kim 1349c48c75eSJung-uk Kim /* 1359c7c683cSJung-uk Kim * Many of the variable-length top-level packages are allowed to simply 1369c7c683cSJung-uk Kim * have zero elements. This allows the BIOS to tell the host that even 1379c7c683cSJung-uk Kim * though the predefined name/method exists, the feature is not supported. 1389c7c683cSJung-uk Kim * Other package types require one or more elements. In any case, there 1399c7c683cSJung-uk Kim * is no need to continue validation. 1409c48c75eSJung-uk Kim */ 1419c48c75eSJung-uk Kim if (!Count) 1429c48c75eSJung-uk Kim { 1439c7c683cSJung-uk Kim switch (Package->RetInfo.Type) 1449c48c75eSJung-uk Kim { 1459c7c683cSJung-uk Kim case ACPI_PTYPE1_FIXED: 1469c7c683cSJung-uk Kim case ACPI_PTYPE1_OPTION: 1479c7c683cSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT: 1489c7c683cSJung-uk Kim case ACPI_PTYPE2_REV_FIXED: 1499c7c683cSJung-uk Kim 1509c48c75eSJung-uk Kim ApZeroLengthPackage (Predefined->Info.Name, ParentOp); 1519c7c683cSJung-uk Kim break; 1529c7c683cSJung-uk Kim 1539c7c683cSJung-uk Kim case ACPI_PTYPE1_VAR: 1549c7c683cSJung-uk Kim case ACPI_PTYPE2: 1559c7c683cSJung-uk Kim case ACPI_PTYPE2_COUNT: 1569c7c683cSJung-uk Kim case ACPI_PTYPE2_FIXED: 1579c7c683cSJung-uk Kim case ACPI_PTYPE2_MIN: 1589c7c683cSJung-uk Kim case ACPI_PTYPE2_FIX_VAR: 159a371a5fdSJung-uk Kim case ACPI_PTYPE2_VAR_VAR: 1609c7c683cSJung-uk Kim default: 1619c7c683cSJung-uk Kim 1629c7c683cSJung-uk Kim break; 1639c48c75eSJung-uk Kim } 1649c7c683cSJung-uk Kim 1659c48c75eSJung-uk Kim return; 1669c48c75eSJung-uk Kim } 1679c48c75eSJung-uk Kim 1689c48c75eSJung-uk Kim /* Get the first element of the package */ 1699c48c75eSJung-uk Kim 1709c48c75eSJung-uk Kim Op = Op->Asl.Next; 1719c48c75eSJung-uk Kim 1729c48c75eSJung-uk Kim /* Decode the package type */ 1739c48c75eSJung-uk Kim 1749c48c75eSJung-uk Kim switch (Package->RetInfo.Type) 1759c48c75eSJung-uk Kim { 176*f8146b88SJung-uk Kim case ACPI_PTYPE_CUSTOM: 177*f8146b88SJung-uk Kim 178*f8146b88SJung-uk Kim ApCustomPackage (ParentOp, Predefined); 179*f8146b88SJung-uk Kim break; 180*f8146b88SJung-uk Kim 1819c48c75eSJung-uk Kim case ACPI_PTYPE1_FIXED: 1829c48c75eSJung-uk Kim /* 183313a0c13SJung-uk Kim * The package count is fixed and there are no subpackages 1849c48c75eSJung-uk Kim * 1859c48c75eSJung-uk Kim * If package is too small, exit. 1869c48c75eSJung-uk Kim * If package is larger than expected, issue warning but continue 1879c48c75eSJung-uk Kim */ 1889c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 1899c48c75eSJung-uk Kim if (Count < ExpectedCount) 1909c48c75eSJung-uk Kim { 1919c48c75eSJung-uk Kim goto PackageTooSmall; 1929c48c75eSJung-uk Kim } 1939c48c75eSJung-uk Kim else if (Count > ExpectedCount) 1949c48c75eSJung-uk Kim { 1959c48c75eSJung-uk Kim ApPackageTooLarge (Predefined->Info.Name, ParentOp, 1969c48c75eSJung-uk Kim Count, ExpectedCount); 1979c48c75eSJung-uk Kim } 1989c48c75eSJung-uk Kim 1999c48c75eSJung-uk Kim /* Validate all elements of the package */ 2009c48c75eSJung-uk Kim 2019c48c75eSJung-uk Kim ApCheckPackageElements (Predefined->Info.Name, Op, 2029c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 2039c48c75eSJung-uk Kim Package->RetInfo.ObjectType2, Package->RetInfo.Count2); 2049c48c75eSJung-uk Kim break; 2059c48c75eSJung-uk Kim 2069c48c75eSJung-uk Kim case ACPI_PTYPE1_VAR: 2079c48c75eSJung-uk Kim /* 208313a0c13SJung-uk Kim * The package count is variable, there are no subpackages, 209895f26a9SJung-uk Kim * and all elements must be of the same type 2109c48c75eSJung-uk Kim */ 2119c48c75eSJung-uk Kim for (i = 0; i < Count; i++) 2129c48c75eSJung-uk Kim { 2139c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 2149c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, i); 2159c48c75eSJung-uk Kim Op = Op->Asl.Next; 2169c48c75eSJung-uk Kim } 2179c48c75eSJung-uk Kim break; 2189c48c75eSJung-uk Kim 2199c48c75eSJung-uk Kim case ACPI_PTYPE1_OPTION: 2209c48c75eSJung-uk Kim /* 221313a0c13SJung-uk Kim * The package count is variable, there are no subpackages. 222895f26a9SJung-uk Kim * There are a fixed number of required elements, and a variable 223895f26a9SJung-uk Kim * number of optional elements. 2249c48c75eSJung-uk Kim * 2259c48c75eSJung-uk Kim * Check if package is at least as large as the minimum required 2269c48c75eSJung-uk Kim */ 2279c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo3.Count; 2289c48c75eSJung-uk Kim if (Count < ExpectedCount) 2299c48c75eSJung-uk Kim { 2309c48c75eSJung-uk Kim goto PackageTooSmall; 2319c48c75eSJung-uk Kim } 2329c48c75eSJung-uk Kim 2339c48c75eSJung-uk Kim /* Variable number of sub-objects */ 2349c48c75eSJung-uk Kim 2359c48c75eSJung-uk Kim for (i = 0; i < Count; i++) 2369c48c75eSJung-uk Kim { 2379c48c75eSJung-uk Kim if (i < Package->RetInfo3.Count) 2389c48c75eSJung-uk Kim { 2399c48c75eSJung-uk Kim /* These are the required package elements (0, 1, or 2) */ 2409c48c75eSJung-uk Kim 2419c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 2429c48c75eSJung-uk Kim Package->RetInfo3.ObjectType[i], i); 2439c48c75eSJung-uk Kim } 2449c48c75eSJung-uk Kim else 2459c48c75eSJung-uk Kim { 2469c48c75eSJung-uk Kim /* These are the optional package elements */ 2479c48c75eSJung-uk Kim 2489c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 2499c48c75eSJung-uk Kim Package->RetInfo3.TailObjectType, i); 2509c48c75eSJung-uk Kim } 251*f8146b88SJung-uk Kim 2529c48c75eSJung-uk Kim Op = Op->Asl.Next; 2539c48c75eSJung-uk Kim } 2549c48c75eSJung-uk Kim break; 2559c48c75eSJung-uk Kim 2569c48c75eSJung-uk Kim case ACPI_PTYPE2_REV_FIXED: 2579c48c75eSJung-uk Kim 2589c48c75eSJung-uk Kim /* First element is the (Integer) revision */ 2599c48c75eSJung-uk Kim 2609c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 2619c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0); 2629c48c75eSJung-uk Kim 2639c48c75eSJung-uk Kim Op = Op->Asl.Next; 2649c48c75eSJung-uk Kim Count--; 2659c48c75eSJung-uk Kim 266313a0c13SJung-uk Kim /* Examine the subpackages */ 2679c48c75eSJung-uk Kim 2689c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op, 2699c48c75eSJung-uk Kim Package, 1, Count); 2709c48c75eSJung-uk Kim break; 2719c48c75eSJung-uk Kim 2729c48c75eSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT: 2739c48c75eSJung-uk Kim 274313a0c13SJung-uk Kim /* First element is the (Integer) count of subpackages to follow */ 2759c48c75eSJung-uk Kim 2769c48c75eSJung-uk Kim Status = ApCheckObjectType (Predefined->Info.Name, Op, 2779c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0); 2789c48c75eSJung-uk Kim 2799c48c75eSJung-uk Kim /* We must have an integer count from above (otherwise, use Count) */ 2809c48c75eSJung-uk Kim 2819c48c75eSJung-uk Kim if (ACPI_SUCCESS (Status)) 2829c48c75eSJung-uk Kim { 2839c48c75eSJung-uk Kim /* 284895f26a9SJung-uk Kim * Count cannot be larger than the parent package length, but 285895f26a9SJung-uk Kim * allow it to be smaller. The >= accounts for the Integer above. 2869c48c75eSJung-uk Kim */ 2879c48c75eSJung-uk Kim ExpectedCount = (UINT32) Op->Asl.Value.Integer; 2889c48c75eSJung-uk Kim if (ExpectedCount >= Count) 2899c48c75eSJung-uk Kim { 2909c48c75eSJung-uk Kim goto PackageTooSmall; 2919c48c75eSJung-uk Kim } 2929c48c75eSJung-uk Kim 2939c48c75eSJung-uk Kim Count = ExpectedCount; 2949c48c75eSJung-uk Kim } 2959c48c75eSJung-uk Kim 2969c48c75eSJung-uk Kim Op = Op->Asl.Next; 2979c48c75eSJung-uk Kim 298313a0c13SJung-uk Kim /* Examine the subpackages */ 2999c48c75eSJung-uk Kim 3009c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op, 3019c48c75eSJung-uk Kim Package, 1, Count); 3029c48c75eSJung-uk Kim break; 3039c48c75eSJung-uk Kim 304313a0c13SJung-uk Kim case ACPI_PTYPE2_UUID_PAIR: 305313a0c13SJung-uk Kim 306313a0c13SJung-uk Kim /* The package contains a variable list of UUID Buffer/Package pairs */ 307313a0c13SJung-uk Kim 308313a0c13SJung-uk Kim /* The length of the package must be even */ 309313a0c13SJung-uk Kim 310313a0c13SJung-uk Kim if (Count & 1) 311313a0c13SJung-uk Kim { 312313a0c13SJung-uk Kim sprintf (MsgBuffer, "%4.4s: Package length, %d, must be even.", 313313a0c13SJung-uk Kim Predefined->Info.Name, Count); 314313a0c13SJung-uk Kim 315313a0c13SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, 316313a0c13SJung-uk Kim ParentOp->Asl.Child, MsgBuffer); 317313a0c13SJung-uk Kim } 318313a0c13SJung-uk Kim 319313a0c13SJung-uk Kim /* Validate the alternating types */ 320313a0c13SJung-uk Kim 321313a0c13SJung-uk Kim for (i = 0; i < Count; ++i) 322313a0c13SJung-uk Kim { 323313a0c13SJung-uk Kim if (i & 1) 324313a0c13SJung-uk Kim { 325313a0c13SJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 326313a0c13SJung-uk Kim Package->RetInfo.ObjectType2, i); 327313a0c13SJung-uk Kim } 328313a0c13SJung-uk Kim else 329313a0c13SJung-uk Kim { 330313a0c13SJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op, 331313a0c13SJung-uk Kim Package->RetInfo.ObjectType1, i); 332313a0c13SJung-uk Kim } 333313a0c13SJung-uk Kim 334313a0c13SJung-uk Kim Op = Op->Asl.Next; 335313a0c13SJung-uk Kim } 336313a0c13SJung-uk Kim 337313a0c13SJung-uk Kim break; 338313a0c13SJung-uk Kim 339a371a5fdSJung-uk Kim case ACPI_PTYPE2_VAR_VAR: 340a371a5fdSJung-uk Kim 341a371a5fdSJung-uk Kim /* Check for minimum size (ints at beginning + 1 subpackage) */ 342a371a5fdSJung-uk Kim 343a371a5fdSJung-uk Kim ExpectedCount = Package->RetInfo4.Count1 + 1; 344a371a5fdSJung-uk Kim if (Count < ExpectedCount) 345a371a5fdSJung-uk Kim { 346a371a5fdSJung-uk Kim goto PackageTooSmall; 347a371a5fdSJung-uk Kim } 348a371a5fdSJung-uk Kim 349a371a5fdSJung-uk Kim /* Check the non-package elements at beginning of main package */ 350a371a5fdSJung-uk Kim 351a371a5fdSJung-uk Kim for (i = 0; i < Package->RetInfo4.Count1; ++i) 352a371a5fdSJung-uk Kim { 353a371a5fdSJung-uk Kim Status = ApCheckObjectType (Predefined->Info.Name, Op, 354a371a5fdSJung-uk Kim Package->RetInfo4.ObjectType1, i); 355a371a5fdSJung-uk Kim Op = Op->Asl.Next; 356a371a5fdSJung-uk Kim } 357a371a5fdSJung-uk Kim 358a371a5fdSJung-uk Kim /* Examine the variable-length list of subpackages */ 359a371a5fdSJung-uk Kim 360a371a5fdSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op, 361a371a5fdSJung-uk Kim Package, Package->RetInfo4.Count1, Count); 362a371a5fdSJung-uk Kim 363a371a5fdSJung-uk Kim break; 364a371a5fdSJung-uk Kim 3659c48c75eSJung-uk Kim case ACPI_PTYPE2: 3669c48c75eSJung-uk Kim case ACPI_PTYPE2_FIXED: 3679c48c75eSJung-uk Kim case ACPI_PTYPE2_MIN: 3689c48c75eSJung-uk Kim case ACPI_PTYPE2_COUNT: 3699c48c75eSJung-uk Kim case ACPI_PTYPE2_FIX_VAR: 3709c48c75eSJung-uk Kim /* 3719c48c75eSJung-uk Kim * These types all return a single Package that consists of a 372313a0c13SJung-uk Kim * variable number of subpackages. 3739c48c75eSJung-uk Kim */ 3749c48c75eSJung-uk Kim 375313a0c13SJung-uk Kim /* Examine the subpackages */ 3769c48c75eSJung-uk Kim 3779c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op, 3789c48c75eSJung-uk Kim Package, 0, Count); 3799c48c75eSJung-uk Kim break; 3809c48c75eSJung-uk Kim 3819c48c75eSJung-uk Kim default: 3829c48c75eSJung-uk Kim return; 3839c48c75eSJung-uk Kim } 3849c48c75eSJung-uk Kim 3859c48c75eSJung-uk Kim return; 3869c48c75eSJung-uk Kim 3879c48c75eSJung-uk Kim PackageTooSmall: 3889c48c75eSJung-uk Kim ApPackageTooSmall (Predefined->Info.Name, ParentOp, 3899c48c75eSJung-uk Kim Count, ExpectedCount); 3909c48c75eSJung-uk Kim } 3919c48c75eSJung-uk Kim 3929c48c75eSJung-uk Kim 3939c48c75eSJung-uk Kim /******************************************************************************* 3949c48c75eSJung-uk Kim * 395*f8146b88SJung-uk Kim * FUNCTION: ApCustomPackage 396*f8146b88SJung-uk Kim * 397*f8146b88SJung-uk Kim * PARAMETERS: ParentOp - Parse op for the package 398*f8146b88SJung-uk Kim * Predefined - Pointer to package-specific info for 399*f8146b88SJung-uk Kim * the method 400*f8146b88SJung-uk Kim * 401*f8146b88SJung-uk Kim * RETURN: None 402*f8146b88SJung-uk Kim * 403*f8146b88SJung-uk Kim * DESCRIPTION: Validate packages that don't fit into the standard model and 404*f8146b88SJung-uk Kim * require custom code. 405*f8146b88SJung-uk Kim * 406*f8146b88SJung-uk Kim * NOTE: Currently used for the _BIX method only. When needed for two or more 407*f8146b88SJung-uk Kim * methods, probably a detect/dispatch mechanism will be required. 408*f8146b88SJung-uk Kim * 409*f8146b88SJung-uk Kim ******************************************************************************/ 410*f8146b88SJung-uk Kim 411*f8146b88SJung-uk Kim static void 412*f8146b88SJung-uk Kim ApCustomPackage ( 413*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp, 414*f8146b88SJung-uk Kim const ACPI_PREDEFINED_INFO *Predefined) 415*f8146b88SJung-uk Kim { 416*f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op; 417*f8146b88SJung-uk Kim UINT32 Count; 418*f8146b88SJung-uk Kim UINT32 ExpectedCount; 419*f8146b88SJung-uk Kim UINT32 Version; 420*f8146b88SJung-uk Kim 421*f8146b88SJung-uk Kim 422*f8146b88SJung-uk Kim /* First child is the package length */ 423*f8146b88SJung-uk Kim 424*f8146b88SJung-uk Kim Op = ParentOp->Asl.Child; 425*f8146b88SJung-uk Kim Count = (UINT32) Op->Asl.Value.Integer; 426*f8146b88SJung-uk Kim 427*f8146b88SJung-uk Kim /* Get the version number, must be Integer */ 428*f8146b88SJung-uk Kim 429*f8146b88SJung-uk Kim Op = Op->Asl.Next; 430*f8146b88SJung-uk Kim Version = (UINT32) Op->Asl.Value.Integer; 431*f8146b88SJung-uk Kim if (Op->Asl.ParseOpcode != PARSEOP_INTEGER) 432*f8146b88SJung-uk Kim { 433*f8146b88SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_OPERAND_TYPE, Op, MsgBuffer); 434*f8146b88SJung-uk Kim return; 435*f8146b88SJung-uk Kim } 436*f8146b88SJung-uk Kim 437*f8146b88SJung-uk Kim /* Validate count (# of elements) */ 438*f8146b88SJung-uk Kim 439*f8146b88SJung-uk Kim ExpectedCount = 21; /* Version 1 */ 440*f8146b88SJung-uk Kim if (Version == 0) 441*f8146b88SJung-uk Kim { 442*f8146b88SJung-uk Kim ExpectedCount = 20; /* Version 0 */ 443*f8146b88SJung-uk Kim } 444*f8146b88SJung-uk Kim 445*f8146b88SJung-uk Kim if (Count < ExpectedCount) 446*f8146b88SJung-uk Kim { 447*f8146b88SJung-uk Kim ApPackageTooSmall (Predefined->Info.Name, ParentOp, 448*f8146b88SJung-uk Kim Count, ExpectedCount); 449*f8146b88SJung-uk Kim return; 450*f8146b88SJung-uk Kim } 451*f8146b88SJung-uk Kim else if (Count > ExpectedCount) 452*f8146b88SJung-uk Kim { 453*f8146b88SJung-uk Kim ApPackageTooLarge (Predefined->Info.Name, ParentOp, 454*f8146b88SJung-uk Kim Count, ExpectedCount); 455*f8146b88SJung-uk Kim } 456*f8146b88SJung-uk Kim 457*f8146b88SJung-uk Kim /* Validate all elements of the package */ 458*f8146b88SJung-uk Kim 459*f8146b88SJung-uk Kim Op = ApCheckPackageElements (Predefined->Info.Name, Op, 460*f8146b88SJung-uk Kim ACPI_RTYPE_INTEGER, 16, 461*f8146b88SJung-uk Kim ACPI_RTYPE_STRING, 4); 462*f8146b88SJung-uk Kim 463*f8146b88SJung-uk Kim /* Version 1 has a single trailing integer */ 464*f8146b88SJung-uk Kim 465*f8146b88SJung-uk Kim if (Version > 0) 466*f8146b88SJung-uk Kim { 467*f8146b88SJung-uk Kim ApCheckPackageElements (Predefined->Info.Name, Op, 468*f8146b88SJung-uk Kim ACPI_RTYPE_INTEGER, 1, 0, 0); 469*f8146b88SJung-uk Kim } 470*f8146b88SJung-uk Kim } 471*f8146b88SJung-uk Kim 472*f8146b88SJung-uk Kim 473*f8146b88SJung-uk Kim /******************************************************************************* 474*f8146b88SJung-uk Kim * 4759c48c75eSJung-uk Kim * FUNCTION: ApCheckPackageElements 4769c48c75eSJung-uk Kim * 477895f26a9SJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 4789c48c75eSJung-uk Kim * Op - Parser op for the package 4799c48c75eSJung-uk Kim * Type1 - Object type for first group 4809c48c75eSJung-uk Kim * Count1 - Count for first group 4819c48c75eSJung-uk Kim * Type2 - Object type for second group 4829c48c75eSJung-uk Kim * Count2 - Count for second group 4839c48c75eSJung-uk Kim * 484*f8146b88SJung-uk Kim * RETURN: Next Op peer in the parse tree, after all specified elements 485*f8146b88SJung-uk Kim * have been validated. Used for multiple validations (calls 486*f8146b88SJung-uk Kim * to this function). 4879c48c75eSJung-uk Kim * 4889c48c75eSJung-uk Kim * DESCRIPTION: Validate all elements of a package. Works with packages that 4899c48c75eSJung-uk Kim * are defined to contain up to two groups of different object 4909c48c75eSJung-uk Kim * types. 4919c48c75eSJung-uk Kim * 4929c48c75eSJung-uk Kim ******************************************************************************/ 4939c48c75eSJung-uk Kim 494*f8146b88SJung-uk Kim static ACPI_PARSE_OBJECT * 4959c48c75eSJung-uk Kim ApCheckPackageElements ( 4969c48c75eSJung-uk Kim const char *PredefinedName, 4979c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 4989c48c75eSJung-uk Kim UINT8 Type1, 4999c48c75eSJung-uk Kim UINT32 Count1, 5009c48c75eSJung-uk Kim UINT8 Type2, 5019c48c75eSJung-uk Kim UINT32 Count2) 5029c48c75eSJung-uk Kim { 5039c48c75eSJung-uk Kim UINT32 i; 5049c48c75eSJung-uk Kim 5059c48c75eSJung-uk Kim 5069c48c75eSJung-uk Kim /* 5079c48c75eSJung-uk Kim * Up to two groups of package elements are supported by the data 5089c48c75eSJung-uk Kim * structure. All elements in each group must be of the same type. 5099c48c75eSJung-uk Kim * The second group can have a count of zero. 5109c48c75eSJung-uk Kim * 5119c48c75eSJung-uk Kim * Aborts check upon a NULL package element, as this means (at compile 5129c48c75eSJung-uk Kim * time) that the remainder of the package elements are also NULL 5139c48c75eSJung-uk Kim * (This is the only way to create NULL package elements.) 5149c48c75eSJung-uk Kim */ 5159c48c75eSJung-uk Kim for (i = 0; (i < Count1) && Op; i++) 5169c48c75eSJung-uk Kim { 5179c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op, Type1, i); 5189c48c75eSJung-uk Kim Op = Op->Asl.Next; 5199c48c75eSJung-uk Kim } 5209c48c75eSJung-uk Kim 5219c48c75eSJung-uk Kim for (i = 0; (i < Count2) && Op; i++) 5229c48c75eSJung-uk Kim { 5239c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op, Type2, (i + Count1)); 5249c48c75eSJung-uk Kim Op = Op->Asl.Next; 5259c48c75eSJung-uk Kim } 526*f8146b88SJung-uk Kim 527*f8146b88SJung-uk Kim return (Op); 5289c48c75eSJung-uk Kim } 5299c48c75eSJung-uk Kim 5309c48c75eSJung-uk Kim 5319c48c75eSJung-uk Kim /******************************************************************************* 5329c48c75eSJung-uk Kim * 5339c48c75eSJung-uk Kim * FUNCTION: ApCheckPackageList 5349c48c75eSJung-uk Kim * 5359c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 5369c48c75eSJung-uk Kim * ParentOp - Parser op of the parent package 5379c48c75eSJung-uk Kim * Package - Package info for this predefined name 5389c48c75eSJung-uk Kim * StartIndex - Index in parent package where list begins 5399c48c75eSJung-uk Kim * ParentCount - Element count of parent package 5409c48c75eSJung-uk Kim * 5419c48c75eSJung-uk Kim * RETURN: None 5429c48c75eSJung-uk Kim * 5439c48c75eSJung-uk Kim * DESCRIPTION: Validate the individual package elements for a predefined name. 5449c48c75eSJung-uk Kim * Handles the cases where the predefined name is defined as a 5459c48c75eSJung-uk Kim * Package of Packages (subpackages). These are the types: 5469c48c75eSJung-uk Kim * 5479c48c75eSJung-uk Kim * ACPI_PTYPE2 5489c48c75eSJung-uk Kim * ACPI_PTYPE2_FIXED 5499c48c75eSJung-uk Kim * ACPI_PTYPE2_MIN 5509c48c75eSJung-uk Kim * ACPI_PTYPE2_COUNT 5519c48c75eSJung-uk Kim * ACPI_PTYPE2_FIX_VAR 552a371a5fdSJung-uk Kim * ACPI_PTYPE2_VAR_VAR 5539c48c75eSJung-uk Kim * 5549c48c75eSJung-uk Kim ******************************************************************************/ 5559c48c75eSJung-uk Kim 5569c48c75eSJung-uk Kim static void 5579c48c75eSJung-uk Kim ApCheckPackageList ( 5589c48c75eSJung-uk Kim const char *PredefinedName, 5599c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp, 5609c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package, 5619c48c75eSJung-uk Kim UINT32 StartIndex, 5629c48c75eSJung-uk Kim UINT32 ParentCount) 5639c48c75eSJung-uk Kim { 5649c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *SubPackageOp = ParentOp; 5659c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op; 5669c48c75eSJung-uk Kim ACPI_STATUS Status; 5679c48c75eSJung-uk Kim UINT32 Count; 5689c48c75eSJung-uk Kim UINT32 ExpectedCount; 5699c48c75eSJung-uk Kim UINT32 i; 5709c48c75eSJung-uk Kim UINT32 j; 5719c48c75eSJung-uk Kim 5729c48c75eSJung-uk Kim 5739c48c75eSJung-uk Kim /* 5749c48c75eSJung-uk Kim * Validate each subpackage in the parent Package 5759c48c75eSJung-uk Kim * 5769c48c75eSJung-uk Kim * Note: We ignore NULL package elements on the assumption that 5779c48c75eSJung-uk Kim * they will be initialized by the BIOS or other ASL code. 5789c48c75eSJung-uk Kim */ 5799c48c75eSJung-uk Kim for (i = 0; (i < ParentCount) && SubPackageOp; i++) 5809c48c75eSJung-uk Kim { 5819c48c75eSJung-uk Kim /* Each object in the list must be of type Package */ 5829c48c75eSJung-uk Kim 5839c48c75eSJung-uk Kim Status = ApCheckObjectType (PredefinedName, SubPackageOp, 5849c48c75eSJung-uk Kim ACPI_RTYPE_PACKAGE, i + StartIndex); 5859c48c75eSJung-uk Kim if (ACPI_FAILURE (Status)) 5869c48c75eSJung-uk Kim { 5879c48c75eSJung-uk Kim goto NextSubpackage; 5889c48c75eSJung-uk Kim } 5899c48c75eSJung-uk Kim 5909c48c75eSJung-uk Kim /* Examine the different types of expected subpackages */ 5919c48c75eSJung-uk Kim 5929c48c75eSJung-uk Kim Op = SubPackageOp->Asl.Child; 5939c48c75eSJung-uk Kim 5949c48c75eSJung-uk Kim /* First child is the package length */ 5959c48c75eSJung-uk Kim 5969c48c75eSJung-uk Kim Count = (UINT32) Op->Asl.Value.Integer; 5979c48c75eSJung-uk Kim Op = Op->Asl.Next; 5989c48c75eSJung-uk Kim 599a371a5fdSJung-uk Kim /* 600a371a5fdSJung-uk Kim * Most subpackage must have at least one element, with 601a371a5fdSJung-uk Kim * only rare exceptions. (_RDI) 602a371a5fdSJung-uk Kim */ 603a371a5fdSJung-uk Kim if (!Count && 604a371a5fdSJung-uk Kim (Package->RetInfo.Type != ACPI_PTYPE2_VAR_VAR)) 6059c48c75eSJung-uk Kim { 6069c48c75eSJung-uk Kim ApZeroLengthPackage (PredefinedName, SubPackageOp); 6079c48c75eSJung-uk Kim goto NextSubpackage; 6089c48c75eSJung-uk Kim } 6099c48c75eSJung-uk Kim 6109c48c75eSJung-uk Kim /* 6119c48c75eSJung-uk Kim * Decode the package type. 6129c48c75eSJung-uk Kim * PTYPE2 indicates that a "package of packages" is expected for 6139c48c75eSJung-uk Kim * this name. The various flavors of PTYPE2 indicate the number 6149c48c75eSJung-uk Kim * and format of the subpackages. 6159c48c75eSJung-uk Kim */ 6169c48c75eSJung-uk Kim switch (Package->RetInfo.Type) 6179c48c75eSJung-uk Kim { 6189c48c75eSJung-uk Kim case ACPI_PTYPE2: 6199c48c75eSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT: 6209c48c75eSJung-uk Kim case ACPI_PTYPE2_REV_FIXED: 6219c48c75eSJung-uk Kim 6229c48c75eSJung-uk Kim /* Each subpackage has a fixed number of elements */ 6239c48c75eSJung-uk Kim 6249c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 6259c48c75eSJung-uk Kim if (Count < ExpectedCount) 6269c48c75eSJung-uk Kim { 6279c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 6289c48c75eSJung-uk Kim Count, ExpectedCount); 6299c48c75eSJung-uk Kim break; 6309c48c75eSJung-uk Kim } 631313a0c13SJung-uk Kim if (Count > ExpectedCount) 632313a0c13SJung-uk Kim { 633313a0c13SJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp, 634313a0c13SJung-uk Kim Count, ExpectedCount); 635313a0c13SJung-uk Kim break; 636313a0c13SJung-uk Kim } 6379c48c75eSJung-uk Kim 6389c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 6399c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 6409c48c75eSJung-uk Kim Package->RetInfo.ObjectType2, Package->RetInfo.Count2); 6419c48c75eSJung-uk Kim break; 6429c48c75eSJung-uk Kim 6439c48c75eSJung-uk Kim case ACPI_PTYPE2_FIX_VAR: 6449c48c75eSJung-uk Kim /* 6459c48c75eSJung-uk Kim * Each subpackage has a fixed number of elements and an 6469c48c75eSJung-uk Kim * optional element 6479c48c75eSJung-uk Kim */ 6489c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 6499c48c75eSJung-uk Kim if (Count < ExpectedCount) 6509c48c75eSJung-uk Kim { 6519c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 6529c48c75eSJung-uk Kim Count, ExpectedCount); 6539c48c75eSJung-uk Kim break; 6549c48c75eSJung-uk Kim } 6559c48c75eSJung-uk Kim 6569c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 6579c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 6589c48c75eSJung-uk Kim Package->RetInfo.ObjectType2, 6599c48c75eSJung-uk Kim Count - Package->RetInfo.Count1); 6609c48c75eSJung-uk Kim break; 6619c48c75eSJung-uk Kim 662a371a5fdSJung-uk Kim case ACPI_PTYPE2_VAR_VAR: 663a371a5fdSJung-uk Kim /* 664a371a5fdSJung-uk Kim * Must have at least the minimum number elements. 665a371a5fdSJung-uk Kim * A zero PkgCount means the number of elements is variable. 666a371a5fdSJung-uk Kim */ 667a371a5fdSJung-uk Kim ExpectedCount = Package->RetInfo4.PkgCount; 668a371a5fdSJung-uk Kim if (ExpectedCount && (Count < ExpectedCount)) 669a371a5fdSJung-uk Kim { 670a371a5fdSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 671a371a5fdSJung-uk Kim Count, 1); 672a371a5fdSJung-uk Kim break; 673a371a5fdSJung-uk Kim } 674a371a5fdSJung-uk Kim 675a371a5fdSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 676a371a5fdSJung-uk Kim Package->RetInfo4.SubObjectTypes, 677a371a5fdSJung-uk Kim Package->RetInfo4.PkgCount, 678a371a5fdSJung-uk Kim 0, 0); 679a371a5fdSJung-uk Kim break; 680a371a5fdSJung-uk Kim 6819c48c75eSJung-uk Kim case ACPI_PTYPE2_FIXED: 6829c48c75eSJung-uk Kim 683313a0c13SJung-uk Kim /* Each subpackage has a fixed length */ 6849c48c75eSJung-uk Kim 6859c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo2.Count; 6869c48c75eSJung-uk Kim if (Count < ExpectedCount) 6879c48c75eSJung-uk Kim { 6889c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 6899c48c75eSJung-uk Kim Count, ExpectedCount); 6909c48c75eSJung-uk Kim break; 6919c48c75eSJung-uk Kim } 692313a0c13SJung-uk Kim if (Count > ExpectedCount) 693313a0c13SJung-uk Kim { 694313a0c13SJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp, 695313a0c13SJung-uk Kim Count, ExpectedCount); 696313a0c13SJung-uk Kim break; 697313a0c13SJung-uk Kim } 6989c48c75eSJung-uk Kim 6999c48c75eSJung-uk Kim /* Check each object/type combination */ 7009c48c75eSJung-uk Kim 7019c48c75eSJung-uk Kim for (j = 0; j < ExpectedCount; j++) 7029c48c75eSJung-uk Kim { 7039c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op, 7049c48c75eSJung-uk Kim Package->RetInfo2.ObjectType[j], j); 7059c48c75eSJung-uk Kim 7069c48c75eSJung-uk Kim Op = Op->Asl.Next; 7079c48c75eSJung-uk Kim } 7089c48c75eSJung-uk Kim break; 7099c48c75eSJung-uk Kim 7109c48c75eSJung-uk Kim case ACPI_PTYPE2_MIN: 7119c48c75eSJung-uk Kim 712313a0c13SJung-uk Kim /* Each subpackage has a variable but minimum length */ 7139c48c75eSJung-uk Kim 7149c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1; 7159c48c75eSJung-uk Kim if (Count < ExpectedCount) 7169c48c75eSJung-uk Kim { 7179c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 7189c48c75eSJung-uk Kim Count, ExpectedCount); 7199c48c75eSJung-uk Kim break; 7209c48c75eSJung-uk Kim } 7219c48c75eSJung-uk Kim 722313a0c13SJung-uk Kim /* Check the type of each subpackage element */ 7239c48c75eSJung-uk Kim 7249c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 7259c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Count, 0, 0); 7269c48c75eSJung-uk Kim break; 7279c48c75eSJung-uk Kim 7289c48c75eSJung-uk Kim case ACPI_PTYPE2_COUNT: 7299c48c75eSJung-uk Kim /* 7309c48c75eSJung-uk Kim * First element is the (Integer) count of elements, including 7319c48c75eSJung-uk Kim * the count field (the ACPI name is NumElements) 7329c48c75eSJung-uk Kim */ 7339c48c75eSJung-uk Kim Status = ApCheckObjectType (PredefinedName, Op, 7349c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0); 7359c48c75eSJung-uk Kim 7369c48c75eSJung-uk Kim /* We must have an integer count from above (otherwise, use Count) */ 7379c48c75eSJung-uk Kim 7389c48c75eSJung-uk Kim if (ACPI_SUCCESS (Status)) 7399c48c75eSJung-uk Kim { 7409c48c75eSJung-uk Kim /* 7419c48c75eSJung-uk Kim * Make sure package is large enough for the Count and is 7429c48c75eSJung-uk Kim * is as large as the minimum size 7439c48c75eSJung-uk Kim */ 7449c48c75eSJung-uk Kim ExpectedCount = (UINT32) Op->Asl.Value.Integer; 7459c48c75eSJung-uk Kim 7469c48c75eSJung-uk Kim if (Count < ExpectedCount) 7479c48c75eSJung-uk Kim { 7489c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 7499c48c75eSJung-uk Kim Count, ExpectedCount); 7509c48c75eSJung-uk Kim break; 7519c48c75eSJung-uk Kim } 7529c48c75eSJung-uk Kim else if (Count > ExpectedCount) 7539c48c75eSJung-uk Kim { 7549c48c75eSJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp, 7559c48c75eSJung-uk Kim Count, ExpectedCount); 7569c48c75eSJung-uk Kim } 7579c48c75eSJung-uk Kim 7589c48c75eSJung-uk Kim /* Some names of this type have a minimum length */ 7599c48c75eSJung-uk Kim 7609c48c75eSJung-uk Kim if (Count < Package->RetInfo.Count1) 7619c48c75eSJung-uk Kim { 7629c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1; 7639c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp, 7649c48c75eSJung-uk Kim Count, ExpectedCount); 7659c48c75eSJung-uk Kim break; 7669c48c75eSJung-uk Kim } 7679c48c75eSJung-uk Kim 7689c48c75eSJung-uk Kim Count = ExpectedCount; 7699c48c75eSJung-uk Kim } 7709c48c75eSJung-uk Kim 771313a0c13SJung-uk Kim /* Check the type of each subpackage element */ 7729c48c75eSJung-uk Kim 7739c48c75eSJung-uk Kim Op = Op->Asl.Next; 7749c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op, 7759c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, (Count - 1), 0, 0); 7769c48c75eSJung-uk Kim break; 7779c48c75eSJung-uk Kim 7789c48c75eSJung-uk Kim default: 7799c48c75eSJung-uk Kim break; 7809c48c75eSJung-uk Kim } 7819c48c75eSJung-uk Kim 7829c48c75eSJung-uk Kim NextSubpackage: 7839c48c75eSJung-uk Kim SubPackageOp = SubPackageOp->Asl.Next; 7849c48c75eSJung-uk Kim } 7859c48c75eSJung-uk Kim } 7869c48c75eSJung-uk Kim 7879c48c75eSJung-uk Kim 7889c48c75eSJung-uk Kim /******************************************************************************* 7899c48c75eSJung-uk Kim * 7909c48c75eSJung-uk Kim * FUNCTION: ApPackageTooSmall 7919c48c75eSJung-uk Kim * 7929c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 7939c48c75eSJung-uk Kim * Op - Current parser op 7949c48c75eSJung-uk Kim * Count - Actual package element count 7959c48c75eSJung-uk Kim * ExpectedCount - Expected package element count 7969c48c75eSJung-uk Kim * 7979c48c75eSJung-uk Kim * RETURN: None 7989c48c75eSJung-uk Kim * 7999c48c75eSJung-uk Kim * DESCRIPTION: Issue error message for a package that is smaller than 8009c48c75eSJung-uk Kim * required. 8019c48c75eSJung-uk Kim * 8029c48c75eSJung-uk Kim ******************************************************************************/ 8039c48c75eSJung-uk Kim 8049c48c75eSJung-uk Kim static void 8059c48c75eSJung-uk Kim ApPackageTooSmall ( 8069c48c75eSJung-uk Kim const char *PredefinedName, 8079c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 8089c48c75eSJung-uk Kim UINT32 Count, 8099c48c75eSJung-uk Kim UINT32 ExpectedCount) 8109c48c75eSJung-uk Kim { 8119c48c75eSJung-uk Kim 8129c48c75eSJung-uk Kim sprintf (MsgBuffer, "%s: length %u, required minimum is %u", 8139c48c75eSJung-uk Kim PredefinedName, Count, ExpectedCount); 8149c48c75eSJung-uk Kim 8159c48c75eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, MsgBuffer); 8169c48c75eSJung-uk Kim } 8179c48c75eSJung-uk Kim 8189c48c75eSJung-uk Kim 8199c48c75eSJung-uk Kim /******************************************************************************* 8209c48c75eSJung-uk Kim * 8219c48c75eSJung-uk Kim * FUNCTION: ApZeroLengthPackage 8229c48c75eSJung-uk Kim * 8239c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 8249c48c75eSJung-uk Kim * Op - Current parser op 8259c48c75eSJung-uk Kim * 8269c48c75eSJung-uk Kim * RETURN: None 8279c48c75eSJung-uk Kim * 8289c48c75eSJung-uk Kim * DESCRIPTION: Issue error message for a zero-length package (a package that 8299c48c75eSJung-uk Kim * is required to have a non-zero length). Variable length 8309c48c75eSJung-uk Kim * packages seem to be allowed to have zero length, however. 8319c48c75eSJung-uk Kim * Even if not allowed, BIOS code does it. 8329c48c75eSJung-uk Kim * 8339c48c75eSJung-uk Kim ******************************************************************************/ 8349c48c75eSJung-uk Kim 8359c48c75eSJung-uk Kim static void 8369c48c75eSJung-uk Kim ApZeroLengthPackage ( 8379c48c75eSJung-uk Kim const char *PredefinedName, 8389c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op) 8399c48c75eSJung-uk Kim { 8409c48c75eSJung-uk Kim 8419c48c75eSJung-uk Kim sprintf (MsgBuffer, "%s: length is zero", PredefinedName); 8429c48c75eSJung-uk Kim 8439c48c75eSJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, MsgBuffer); 8449c48c75eSJung-uk Kim } 8459c48c75eSJung-uk Kim 8469c48c75eSJung-uk Kim 8479c48c75eSJung-uk Kim /******************************************************************************* 8489c48c75eSJung-uk Kim * 8499c48c75eSJung-uk Kim * FUNCTION: ApPackageTooLarge 8509c48c75eSJung-uk Kim * 8519c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object 8529c48c75eSJung-uk Kim * Op - Current parser op 8539c48c75eSJung-uk Kim * Count - Actual package element count 8549c48c75eSJung-uk Kim * ExpectedCount - Expected package element count 8559c48c75eSJung-uk Kim * 8569c48c75eSJung-uk Kim * RETURN: None 8579c48c75eSJung-uk Kim * 8589c48c75eSJung-uk Kim * DESCRIPTION: Issue a remark for a package that is larger than expected. 8599c48c75eSJung-uk Kim * 8609c48c75eSJung-uk Kim ******************************************************************************/ 8619c48c75eSJung-uk Kim 8629c48c75eSJung-uk Kim static void 8639c48c75eSJung-uk Kim ApPackageTooLarge ( 8649c48c75eSJung-uk Kim const char *PredefinedName, 8659c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 8669c48c75eSJung-uk Kim UINT32 Count, 8679c48c75eSJung-uk Kim UINT32 ExpectedCount) 8689c48c75eSJung-uk Kim { 8699c48c75eSJung-uk Kim 8709c48c75eSJung-uk Kim sprintf (MsgBuffer, "%s: length is %u, only %u required", 8719c48c75eSJung-uk Kim PredefinedName, Count, ExpectedCount); 8729c48c75eSJung-uk Kim 8739c48c75eSJung-uk Kim AslError (ASL_REMARK, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, MsgBuffer); 8749c48c75eSJung-uk Kim } 875