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
70d84335fSJung-uk Kim /******************************************************************************
80d84335fSJung-uk Kim *
90d84335fSJung-uk Kim * 1. Copyright Notice
100d84335fSJung-uk Kim *
11*58308fadSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
129c48c75eSJung-uk Kim * All rights reserved.
139c48c75eSJung-uk Kim *
140d84335fSJung-uk Kim * 2. License
150d84335fSJung-uk Kim *
160d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property
170d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided
180d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual
190d84335fSJung-uk Kim * property rights.
200d84335fSJung-uk Kim *
210d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
220d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an
230d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the
240d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy,
250d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered
260d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and
270d84335fSJung-uk Kim *
280d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
290d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel
300d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell,
310d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof
320d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright
330d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions
340d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right
350d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise;
360d84335fSJung-uk Kim *
370d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following
380d84335fSJung-uk Kim * conditions are met:
390d84335fSJung-uk Kim *
400d84335fSJung-uk Kim * 3. Conditions
410d84335fSJung-uk Kim *
420d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source.
430d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
440d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include
450d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions,
460d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition,
470d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to
480d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered
490d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the
500d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee
510d84335fSJung-uk Kim * must include a prominent statement that the modification is derived,
520d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code.
530d84335fSJung-uk Kim *
540d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
550d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered
560d84335fSJung-uk Kim * Code or modification without rights to further distribute source must
570d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the
580d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In
590d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any
600d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the
610d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual
620d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and
630d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may
640d84335fSJung-uk Kim * make.
650d84335fSJung-uk Kim *
660d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any
670d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the
680d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance
690d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the
700d84335fSJung-uk Kim * distribution.
710d84335fSJung-uk Kim *
720d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original
730d84335fSJung-uk Kim * Intel Code.
740d84335fSJung-uk Kim *
750d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by
760d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or
770d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code
780d84335fSJung-uk Kim * without prior written authorization from Intel.
790d84335fSJung-uk Kim *
800d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance
810d84335fSJung-uk Kim *
820d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
830d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
840d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
850d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
860d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
870d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
880d84335fSJung-uk Kim * PARTICULAR PURPOSE.
890d84335fSJung-uk Kim *
900d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
910d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
920d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
930d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
940d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
950d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
960d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
970d84335fSJung-uk Kim * LIMITED REMEDY.
980d84335fSJung-uk Kim *
990d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this
1000d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any
1010d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or
1020d84335fSJung-uk Kim * any other agency or department of the United States Government. In the
1030d84335fSJung-uk Kim * event Licensee exports any such software from the United States or
1040d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall
1050d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in
1060d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the
1070d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1080d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process,
1090d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the
1100d84335fSJung-uk Kim * United States government or any agency thereof requires an export license,
1110d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining
1120d84335fSJung-uk Kim * such license, approval or letter.
1130d84335fSJung-uk Kim *
1140d84335fSJung-uk Kim *****************************************************************************
1150d84335fSJung-uk Kim *
1160d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
1170d84335fSJung-uk Kim * following license:
1180d84335fSJung-uk Kim *
1199c48c75eSJung-uk Kim * Redistribution and use in source and binary forms, with or without
1209c48c75eSJung-uk Kim * modification, are permitted provided that the following conditions
1219c48c75eSJung-uk Kim * are met:
1229c48c75eSJung-uk Kim * 1. Redistributions of source code must retain the above copyright
1239c48c75eSJung-uk Kim * notice, this list of conditions, and the following disclaimer,
1249c48c75eSJung-uk Kim * without modification.
1259c48c75eSJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1269c48c75eSJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below
1279c48c75eSJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon
1289c48c75eSJung-uk Kim * including a substantially similar Disclaimer requirement for further
1299c48c75eSJung-uk Kim * binary redistribution.
1309c48c75eSJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names
1319c48c75eSJung-uk Kim * of any contributors may be used to endorse or promote products derived
1329c48c75eSJung-uk Kim * from this software without specific prior written permission.
1339c48c75eSJung-uk Kim *
1340d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1350d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1360d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1370d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1380d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1390d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1400d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1410d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1420d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1430d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1440d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1450d84335fSJung-uk Kim *
1460d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the
1479c48c75eSJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free
1489c48c75eSJung-uk Kim * Software Foundation.
1499c48c75eSJung-uk Kim *
1500d84335fSJung-uk Kim *****************************************************************************/
1519c48c75eSJung-uk Kim
1529c48c75eSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
1539c48c75eSJung-uk Kim #include "aslcompiler.y.h"
1549c48c75eSJung-uk Kim #include <contrib/dev/acpica/include/acpredef.h>
1559c48c75eSJung-uk Kim
1569c48c75eSJung-uk Kim
1579c48c75eSJung-uk Kim #define _COMPONENT ACPI_COMPILER
1589c48c75eSJung-uk Kim ACPI_MODULE_NAME ("aslprepkg")
1599c48c75eSJung-uk Kim
1609c48c75eSJung-uk Kim
1619c48c75eSJung-uk Kim /* Local prototypes */
1629c48c75eSJung-uk Kim
163f8146b88SJung-uk Kim static ACPI_PARSE_OBJECT *
1649c48c75eSJung-uk Kim ApCheckPackageElements (
1659c48c75eSJung-uk Kim const char *PredefinedName,
1669c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op,
1679c48c75eSJung-uk Kim UINT8 Type1,
1689c48c75eSJung-uk Kim UINT32 Count1,
1699c48c75eSJung-uk Kim UINT8 Type2,
1709c48c75eSJung-uk Kim UINT32 Count2);
1719c48c75eSJung-uk Kim
1729c48c75eSJung-uk Kim static void
1739c48c75eSJung-uk Kim ApCheckPackageList (
1749c48c75eSJung-uk Kim const char *PredefinedName,
1759c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp,
1769c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package,
1779c48c75eSJung-uk Kim UINT32 StartIndex,
1789c48c75eSJung-uk Kim UINT32 Count);
1799c48c75eSJung-uk Kim
1809c48c75eSJung-uk Kim static void
1819c48c75eSJung-uk Kim ApPackageTooSmall (
1829c48c75eSJung-uk Kim const char *PredefinedName,
1839c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op,
1849c48c75eSJung-uk Kim UINT32 Count,
1859c48c75eSJung-uk Kim UINT32 ExpectedCount);
1869c48c75eSJung-uk Kim
1879c48c75eSJung-uk Kim static void
1889c48c75eSJung-uk Kim ApZeroLengthPackage (
1899c48c75eSJung-uk Kim const char *PredefinedName,
1909c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op);
1919c48c75eSJung-uk Kim
1929c48c75eSJung-uk Kim static void
1939c48c75eSJung-uk Kim ApPackageTooLarge (
1949c48c75eSJung-uk Kim const char *PredefinedName,
1959c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op,
1969c48c75eSJung-uk Kim UINT32 Count,
1979c48c75eSJung-uk Kim UINT32 ExpectedCount);
1989c48c75eSJung-uk Kim
199f8146b88SJung-uk Kim static void
200f8146b88SJung-uk Kim ApCustomPackage (
201f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp,
202f8146b88SJung-uk Kim const ACPI_PREDEFINED_INFO *Predefined);
203f8146b88SJung-uk Kim
2049c48c75eSJung-uk Kim
2059c48c75eSJung-uk Kim /*******************************************************************************
2069c48c75eSJung-uk Kim *
2079c48c75eSJung-uk Kim * FUNCTION: ApCheckPackage
2089c48c75eSJung-uk Kim *
2099c48c75eSJung-uk Kim * PARAMETERS: ParentOp - Parser op for the package
210895f26a9SJung-uk Kim * Predefined - Pointer to package-specific info for
211895f26a9SJung-uk Kim * the method
2129c48c75eSJung-uk Kim *
2139c48c75eSJung-uk Kim * RETURN: None
2149c48c75eSJung-uk Kim *
2159c48c75eSJung-uk Kim * DESCRIPTION: Top-level validation for predefined name return package
2169c48c75eSJung-uk Kim * objects.
2179c48c75eSJung-uk Kim *
2189c48c75eSJung-uk Kim ******************************************************************************/
2199c48c75eSJung-uk Kim
2209c48c75eSJung-uk Kim void
ApCheckPackage(ACPI_PARSE_OBJECT * ParentOp,const ACPI_PREDEFINED_INFO * Predefined)2219c48c75eSJung-uk Kim ApCheckPackage (
2229c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp,
2239c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Predefined)
2249c48c75eSJung-uk Kim {
2259c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op;
2269c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package;
2279c48c75eSJung-uk Kim ACPI_STATUS Status;
2289c48c75eSJung-uk Kim UINT32 ExpectedCount;
2299c48c75eSJung-uk Kim UINT32 Count;
2309c48c75eSJung-uk Kim UINT32 i;
2319c48c75eSJung-uk Kim
2329c48c75eSJung-uk Kim
2339c48c75eSJung-uk Kim /* The package info for this name is in the next table entry */
2349c48c75eSJung-uk Kim
2359c48c75eSJung-uk Kim Package = Predefined + 1;
2369c48c75eSJung-uk Kim
2379c48c75eSJung-uk Kim /* First child is the package length */
2389c48c75eSJung-uk Kim
2399c48c75eSJung-uk Kim Op = ParentOp->Asl.Child;
2409c48c75eSJung-uk Kim Count = (UINT32) Op->Asl.Value.Integer;
2419c48c75eSJung-uk Kim
2429c48c75eSJung-uk Kim /*
2439c7c683cSJung-uk Kim * Many of the variable-length top-level packages are allowed to simply
2449c7c683cSJung-uk Kim * have zero elements. This allows the BIOS to tell the host that even
2459c7c683cSJung-uk Kim * though the predefined name/method exists, the feature is not supported.
2469c7c683cSJung-uk Kim * Other package types require one or more elements. In any case, there
2479c7c683cSJung-uk Kim * is no need to continue validation.
2489c48c75eSJung-uk Kim */
2499c48c75eSJung-uk Kim if (!Count)
2509c48c75eSJung-uk Kim {
2519c7c683cSJung-uk Kim switch (Package->RetInfo.Type)
2529c48c75eSJung-uk Kim {
2539c7c683cSJung-uk Kim case ACPI_PTYPE1_FIXED:
2549c7c683cSJung-uk Kim case ACPI_PTYPE1_OPTION:
2559c7c683cSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT:
2569c7c683cSJung-uk Kim case ACPI_PTYPE2_REV_FIXED:
2579c7c683cSJung-uk Kim
2589c48c75eSJung-uk Kim ApZeroLengthPackage (Predefined->Info.Name, ParentOp);
2599c7c683cSJung-uk Kim break;
2609c7c683cSJung-uk Kim
2619c7c683cSJung-uk Kim case ACPI_PTYPE1_VAR:
2629c7c683cSJung-uk Kim case ACPI_PTYPE2:
2639c7c683cSJung-uk Kim case ACPI_PTYPE2_COUNT:
2649c7c683cSJung-uk Kim case ACPI_PTYPE2_FIXED:
2659c7c683cSJung-uk Kim case ACPI_PTYPE2_MIN:
2669c7c683cSJung-uk Kim case ACPI_PTYPE2_FIX_VAR:
267a371a5fdSJung-uk Kim case ACPI_PTYPE2_VAR_VAR:
2689c7c683cSJung-uk Kim default:
2699c7c683cSJung-uk Kim
2709c7c683cSJung-uk Kim break;
2719c48c75eSJung-uk Kim }
2729c7c683cSJung-uk Kim
2739c48c75eSJung-uk Kim return;
2749c48c75eSJung-uk Kim }
2759c48c75eSJung-uk Kim
2769c48c75eSJung-uk Kim /* Get the first element of the package */
2779c48c75eSJung-uk Kim
2789c48c75eSJung-uk Kim Op = Op->Asl.Next;
2799c48c75eSJung-uk Kim
2809c48c75eSJung-uk Kim /* Decode the package type */
2819c48c75eSJung-uk Kim
2829c48c75eSJung-uk Kim switch (Package->RetInfo.Type)
2839c48c75eSJung-uk Kim {
284f8146b88SJung-uk Kim case ACPI_PTYPE_CUSTOM:
285f8146b88SJung-uk Kim
286f8146b88SJung-uk Kim ApCustomPackage (ParentOp, Predefined);
287f8146b88SJung-uk Kim break;
288f8146b88SJung-uk Kim
2899c48c75eSJung-uk Kim case ACPI_PTYPE1_FIXED:
2909c48c75eSJung-uk Kim /*
291313a0c13SJung-uk Kim * The package count is fixed and there are no subpackages
2929c48c75eSJung-uk Kim *
2939c48c75eSJung-uk Kim * If package is too small, exit.
2949c48c75eSJung-uk Kim * If package is larger than expected, issue warning but continue
2959c48c75eSJung-uk Kim */
2969c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
2979c48c75eSJung-uk Kim if (Count < ExpectedCount)
2989c48c75eSJung-uk Kim {
2999c48c75eSJung-uk Kim goto PackageTooSmall;
3009c48c75eSJung-uk Kim }
3019c48c75eSJung-uk Kim else if (Count > ExpectedCount)
3029c48c75eSJung-uk Kim {
3039c48c75eSJung-uk Kim ApPackageTooLarge (Predefined->Info.Name, ParentOp,
3049c48c75eSJung-uk Kim Count, ExpectedCount);
3059c48c75eSJung-uk Kim }
3069c48c75eSJung-uk Kim
3079c48c75eSJung-uk Kim /* Validate all elements of the package */
3089c48c75eSJung-uk Kim
3099c48c75eSJung-uk Kim ApCheckPackageElements (Predefined->Info.Name, Op,
3109c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1,
3119c48c75eSJung-uk Kim Package->RetInfo.ObjectType2, Package->RetInfo.Count2);
3129c48c75eSJung-uk Kim break;
3139c48c75eSJung-uk Kim
3149c48c75eSJung-uk Kim case ACPI_PTYPE1_VAR:
3159c48c75eSJung-uk Kim /*
316313a0c13SJung-uk Kim * The package count is variable, there are no subpackages,
317895f26a9SJung-uk Kim * and all elements must be of the same type
3189c48c75eSJung-uk Kim */
3199c48c75eSJung-uk Kim for (i = 0; i < Count; i++)
3209c48c75eSJung-uk Kim {
321f15e9afbSJung-uk Kim if (!Op)
322f15e9afbSJung-uk Kim {
323f15e9afbSJung-uk Kim /*
324f15e9afbSJung-uk Kim * If we get to this point, it means that the package length
325f15e9afbSJung-uk Kim * is larger than the initializer list. Stop processing the
326f15e9afbSJung-uk Kim * package and return because we have run out of package
327f15e9afbSJung-uk Kim * elements to analyze.
328f15e9afbSJung-uk Kim */
329f15e9afbSJung-uk Kim return;
330f15e9afbSJung-uk Kim }
331f15e9afbSJung-uk Kim
3329c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op,
3339c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, i);
3349c48c75eSJung-uk Kim Op = Op->Asl.Next;
3359c48c75eSJung-uk Kim }
3369c48c75eSJung-uk Kim break;
3379c48c75eSJung-uk Kim
3389c48c75eSJung-uk Kim case ACPI_PTYPE1_OPTION:
3399c48c75eSJung-uk Kim /*
340313a0c13SJung-uk Kim * The package count is variable, there are no subpackages.
341895f26a9SJung-uk Kim * There are a fixed number of required elements, and a variable
342895f26a9SJung-uk Kim * number of optional elements.
3439c48c75eSJung-uk Kim *
3449c48c75eSJung-uk Kim * Check if package is at least as large as the minimum required
3459c48c75eSJung-uk Kim */
3469c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo3.Count;
3479c48c75eSJung-uk Kim if (Count < ExpectedCount)
3489c48c75eSJung-uk Kim {
3499c48c75eSJung-uk Kim goto PackageTooSmall;
3509c48c75eSJung-uk Kim }
3519c48c75eSJung-uk Kim
3529c48c75eSJung-uk Kim /* Variable number of sub-objects */
3539c48c75eSJung-uk Kim
3549c48c75eSJung-uk Kim for (i = 0; i < Count; i++)
3559c48c75eSJung-uk Kim {
3569c48c75eSJung-uk Kim if (i < Package->RetInfo3.Count)
3579c48c75eSJung-uk Kim {
3589c48c75eSJung-uk Kim /* These are the required package elements (0, 1, or 2) */
3599c48c75eSJung-uk Kim
3609c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op,
3619c48c75eSJung-uk Kim Package->RetInfo3.ObjectType[i], i);
3629c48c75eSJung-uk Kim }
3639c48c75eSJung-uk Kim else
3649c48c75eSJung-uk Kim {
3659c48c75eSJung-uk Kim /* These are the optional package elements */
3669c48c75eSJung-uk Kim
3679c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op,
3689c48c75eSJung-uk Kim Package->RetInfo3.TailObjectType, i);
3699c48c75eSJung-uk Kim }
370f8146b88SJung-uk Kim
3719c48c75eSJung-uk Kim Op = Op->Asl.Next;
3729c48c75eSJung-uk Kim }
3739c48c75eSJung-uk Kim break;
3749c48c75eSJung-uk Kim
3759c48c75eSJung-uk Kim case ACPI_PTYPE2_REV_FIXED:
3769c48c75eSJung-uk Kim
3779c48c75eSJung-uk Kim /* First element is the (Integer) revision */
3789c48c75eSJung-uk Kim
3799c48c75eSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op,
3809c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0);
3819c48c75eSJung-uk Kim
3829c48c75eSJung-uk Kim Op = Op->Asl.Next;
3839c48c75eSJung-uk Kim Count--;
3849c48c75eSJung-uk Kim
385313a0c13SJung-uk Kim /* Examine the subpackages */
3869c48c75eSJung-uk Kim
3879c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op,
3889c48c75eSJung-uk Kim Package, 1, Count);
3899c48c75eSJung-uk Kim break;
3909c48c75eSJung-uk Kim
3919c48c75eSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT:
3929c48c75eSJung-uk Kim
393313a0c13SJung-uk Kim /* First element is the (Integer) count of subpackages to follow */
3949c48c75eSJung-uk Kim
3959c48c75eSJung-uk Kim Status = ApCheckObjectType (Predefined->Info.Name, Op,
3969c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0);
3979c48c75eSJung-uk Kim
3989c48c75eSJung-uk Kim /* We must have an integer count from above (otherwise, use Count) */
3999c48c75eSJung-uk Kim
4009c48c75eSJung-uk Kim if (ACPI_SUCCESS (Status))
4019c48c75eSJung-uk Kim {
4029c48c75eSJung-uk Kim /*
403895f26a9SJung-uk Kim * Count cannot be larger than the parent package length, but
404895f26a9SJung-uk Kim * allow it to be smaller. The >= accounts for the Integer above.
4059c48c75eSJung-uk Kim */
4069c48c75eSJung-uk Kim ExpectedCount = (UINT32) Op->Asl.Value.Integer;
4079c48c75eSJung-uk Kim if (ExpectedCount >= Count)
4089c48c75eSJung-uk Kim {
4099c48c75eSJung-uk Kim goto PackageTooSmall;
4109c48c75eSJung-uk Kim }
4119c48c75eSJung-uk Kim
4129c48c75eSJung-uk Kim Count = ExpectedCount;
4139c48c75eSJung-uk Kim }
4149c48c75eSJung-uk Kim
4159c48c75eSJung-uk Kim Op = Op->Asl.Next;
4169c48c75eSJung-uk Kim
417313a0c13SJung-uk Kim /* Examine the subpackages */
4189c48c75eSJung-uk Kim
4199c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op,
4209c48c75eSJung-uk Kim Package, 1, Count);
4219c48c75eSJung-uk Kim break;
4229c48c75eSJung-uk Kim
423313a0c13SJung-uk Kim case ACPI_PTYPE2_UUID_PAIR:
424313a0c13SJung-uk Kim
425313a0c13SJung-uk Kim /* The package contains a variable list of UUID Buffer/Package pairs */
426313a0c13SJung-uk Kim
427313a0c13SJung-uk Kim /* The length of the package must be even */
428313a0c13SJung-uk Kim
429313a0c13SJung-uk Kim if (Count & 1)
430313a0c13SJung-uk Kim {
4316f1f1a63SJung-uk Kim sprintf (AslGbl_MsgBuffer, "%4.4s: Package length, %d, must be even.",
432313a0c13SJung-uk Kim Predefined->Info.Name, Count);
433313a0c13SJung-uk Kim
434313a0c13SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH,
4356f1f1a63SJung-uk Kim ParentOp->Asl.Child, AslGbl_MsgBuffer);
436313a0c13SJung-uk Kim }
437313a0c13SJung-uk Kim
438313a0c13SJung-uk Kim /* Validate the alternating types */
439313a0c13SJung-uk Kim
440313a0c13SJung-uk Kim for (i = 0; i < Count; ++i)
441313a0c13SJung-uk Kim {
442313a0c13SJung-uk Kim if (i & 1)
443313a0c13SJung-uk Kim {
444313a0c13SJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op,
445313a0c13SJung-uk Kim Package->RetInfo.ObjectType2, i);
446313a0c13SJung-uk Kim }
447313a0c13SJung-uk Kim else
448313a0c13SJung-uk Kim {
449313a0c13SJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op,
450313a0c13SJung-uk Kim Package->RetInfo.ObjectType1, i);
451313a0c13SJung-uk Kim }
452313a0c13SJung-uk Kim
453313a0c13SJung-uk Kim Op = Op->Asl.Next;
454313a0c13SJung-uk Kim }
455313a0c13SJung-uk Kim
456313a0c13SJung-uk Kim break;
457313a0c13SJung-uk Kim
458a371a5fdSJung-uk Kim case ACPI_PTYPE2_VAR_VAR:
459a371a5fdSJung-uk Kim
460a371a5fdSJung-uk Kim /* Check for minimum size (ints at beginning + 1 subpackage) */
461a371a5fdSJung-uk Kim
462a371a5fdSJung-uk Kim ExpectedCount = Package->RetInfo4.Count1 + 1;
463a371a5fdSJung-uk Kim if (Count < ExpectedCount)
464a371a5fdSJung-uk Kim {
465a371a5fdSJung-uk Kim goto PackageTooSmall;
466a371a5fdSJung-uk Kim }
467a371a5fdSJung-uk Kim
468a371a5fdSJung-uk Kim /* Check the non-package elements at beginning of main package */
469a371a5fdSJung-uk Kim
470a371a5fdSJung-uk Kim for (i = 0; i < Package->RetInfo4.Count1; ++i)
471a371a5fdSJung-uk Kim {
472a009b7dcSJung-uk Kim ApCheckObjectType (Predefined->Info.Name, Op,
473a371a5fdSJung-uk Kim Package->RetInfo4.ObjectType1, i);
474a371a5fdSJung-uk Kim Op = Op->Asl.Next;
475a371a5fdSJung-uk Kim }
476a371a5fdSJung-uk Kim
477a371a5fdSJung-uk Kim /* Examine the variable-length list of subpackages */
478a371a5fdSJung-uk Kim
479a371a5fdSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op,
480a371a5fdSJung-uk Kim Package, Package->RetInfo4.Count1, Count);
481a371a5fdSJung-uk Kim
482a371a5fdSJung-uk Kim break;
483a371a5fdSJung-uk Kim
4849c48c75eSJung-uk Kim case ACPI_PTYPE2:
4859c48c75eSJung-uk Kim case ACPI_PTYPE2_FIXED:
4869c48c75eSJung-uk Kim case ACPI_PTYPE2_MIN:
4879c48c75eSJung-uk Kim case ACPI_PTYPE2_COUNT:
4889c48c75eSJung-uk Kim case ACPI_PTYPE2_FIX_VAR:
4899c48c75eSJung-uk Kim /*
4909c48c75eSJung-uk Kim * These types all return a single Package that consists of a
491313a0c13SJung-uk Kim * variable number of subpackages.
4929c48c75eSJung-uk Kim */
4939c48c75eSJung-uk Kim
494313a0c13SJung-uk Kim /* Examine the subpackages */
4959c48c75eSJung-uk Kim
4969c48c75eSJung-uk Kim ApCheckPackageList (Predefined->Info.Name, Op,
4979c48c75eSJung-uk Kim Package, 0, Count);
4989c48c75eSJung-uk Kim break;
4999c48c75eSJung-uk Kim
5009c48c75eSJung-uk Kim default:
5019c48c75eSJung-uk Kim return;
5029c48c75eSJung-uk Kim }
5039c48c75eSJung-uk Kim
5049c48c75eSJung-uk Kim return;
5059c48c75eSJung-uk Kim
5069c48c75eSJung-uk Kim PackageTooSmall:
5079c48c75eSJung-uk Kim ApPackageTooSmall (Predefined->Info.Name, ParentOp,
5089c48c75eSJung-uk Kim Count, ExpectedCount);
5099c48c75eSJung-uk Kim }
5109c48c75eSJung-uk Kim
5119c48c75eSJung-uk Kim
5129c48c75eSJung-uk Kim /*******************************************************************************
5139c48c75eSJung-uk Kim *
514f8146b88SJung-uk Kim * FUNCTION: ApCustomPackage
515f8146b88SJung-uk Kim *
516f8146b88SJung-uk Kim * PARAMETERS: ParentOp - Parse op for the package
517f8146b88SJung-uk Kim * Predefined - Pointer to package-specific info for
518f8146b88SJung-uk Kim * the method
519f8146b88SJung-uk Kim *
520f8146b88SJung-uk Kim * RETURN: None
521f8146b88SJung-uk Kim *
522f8146b88SJung-uk Kim * DESCRIPTION: Validate packages that don't fit into the standard model and
523f8146b88SJung-uk Kim * require custom code.
524f8146b88SJung-uk Kim *
525f8146b88SJung-uk Kim * NOTE: Currently used for the _BIX method only. When needed for two or more
526f8146b88SJung-uk Kim * methods, probably a detect/dispatch mechanism will be required.
527f8146b88SJung-uk Kim *
528f8146b88SJung-uk Kim ******************************************************************************/
529f8146b88SJung-uk Kim
530f8146b88SJung-uk Kim static void
ApCustomPackage(ACPI_PARSE_OBJECT * ParentOp,const ACPI_PREDEFINED_INFO * Predefined)531f8146b88SJung-uk Kim ApCustomPackage (
532f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *ParentOp,
533f8146b88SJung-uk Kim const ACPI_PREDEFINED_INFO *Predefined)
534f8146b88SJung-uk Kim {
535f8146b88SJung-uk Kim ACPI_PARSE_OBJECT *Op;
536f8146b88SJung-uk Kim UINT32 Count;
537f8146b88SJung-uk Kim UINT32 ExpectedCount;
538f8146b88SJung-uk Kim UINT32 Version;
539f8146b88SJung-uk Kim
540f8146b88SJung-uk Kim
541f8146b88SJung-uk Kim /* First child is the package length */
542f8146b88SJung-uk Kim
543f8146b88SJung-uk Kim Op = ParentOp->Asl.Child;
544f8146b88SJung-uk Kim Count = (UINT32) Op->Asl.Value.Integer;
545f8146b88SJung-uk Kim
546f8146b88SJung-uk Kim /* Get the version number, must be Integer */
547f8146b88SJung-uk Kim
548f8146b88SJung-uk Kim Op = Op->Asl.Next;
549f8146b88SJung-uk Kim Version = (UINT32) Op->Asl.Value.Integer;
550f8146b88SJung-uk Kim if (Op->Asl.ParseOpcode != PARSEOP_INTEGER)
551f8146b88SJung-uk Kim {
5526f1f1a63SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_OPERAND_TYPE, Op, AslGbl_MsgBuffer);
553f8146b88SJung-uk Kim return;
554f8146b88SJung-uk Kim }
555f8146b88SJung-uk Kim
556f8146b88SJung-uk Kim /* Validate count (# of elements) */
557f8146b88SJung-uk Kim
558f8146b88SJung-uk Kim ExpectedCount = 21; /* Version 1 */
559f8146b88SJung-uk Kim if (Version == 0)
560f8146b88SJung-uk Kim {
561f8146b88SJung-uk Kim ExpectedCount = 20; /* Version 0 */
562f8146b88SJung-uk Kim }
563f8146b88SJung-uk Kim
564f8146b88SJung-uk Kim if (Count < ExpectedCount)
565f8146b88SJung-uk Kim {
566f8146b88SJung-uk Kim ApPackageTooSmall (Predefined->Info.Name, ParentOp,
567f8146b88SJung-uk Kim Count, ExpectedCount);
568f8146b88SJung-uk Kim return;
569f8146b88SJung-uk Kim }
570f8146b88SJung-uk Kim else if (Count > ExpectedCount)
571f8146b88SJung-uk Kim {
572f8146b88SJung-uk Kim ApPackageTooLarge (Predefined->Info.Name, ParentOp,
573f8146b88SJung-uk Kim Count, ExpectedCount);
574f8146b88SJung-uk Kim }
575f8146b88SJung-uk Kim
576f8146b88SJung-uk Kim /* Validate all elements of the package */
577f8146b88SJung-uk Kim
578f8146b88SJung-uk Kim Op = ApCheckPackageElements (Predefined->Info.Name, Op,
579f8146b88SJung-uk Kim ACPI_RTYPE_INTEGER, 16,
580f8146b88SJung-uk Kim ACPI_RTYPE_STRING, 4);
581f8146b88SJung-uk Kim
582f8146b88SJung-uk Kim /* Version 1 has a single trailing integer */
583f8146b88SJung-uk Kim
584f8146b88SJung-uk Kim if (Version > 0)
585f8146b88SJung-uk Kim {
586f8146b88SJung-uk Kim ApCheckPackageElements (Predefined->Info.Name, Op,
587f8146b88SJung-uk Kim ACPI_RTYPE_INTEGER, 1, 0, 0);
588f8146b88SJung-uk Kim }
589f8146b88SJung-uk Kim }
590f8146b88SJung-uk Kim
591f8146b88SJung-uk Kim
592f8146b88SJung-uk Kim /*******************************************************************************
593f8146b88SJung-uk Kim *
5949c48c75eSJung-uk Kim * FUNCTION: ApCheckPackageElements
5959c48c75eSJung-uk Kim *
596895f26a9SJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object
5979c48c75eSJung-uk Kim * Op - Parser op for the package
5989c48c75eSJung-uk Kim * Type1 - Object type for first group
5999c48c75eSJung-uk Kim * Count1 - Count for first group
6009c48c75eSJung-uk Kim * Type2 - Object type for second group
6019c48c75eSJung-uk Kim * Count2 - Count for second group
6029c48c75eSJung-uk Kim *
603f8146b88SJung-uk Kim * RETURN: Next Op peer in the parse tree, after all specified elements
604f8146b88SJung-uk Kim * have been validated. Used for multiple validations (calls
605f8146b88SJung-uk Kim * to this function).
6069c48c75eSJung-uk Kim *
6079c48c75eSJung-uk Kim * DESCRIPTION: Validate all elements of a package. Works with packages that
6089c48c75eSJung-uk Kim * are defined to contain up to two groups of different object
6099c48c75eSJung-uk Kim * types.
6109c48c75eSJung-uk Kim *
6119c48c75eSJung-uk Kim ******************************************************************************/
6129c48c75eSJung-uk Kim
613f8146b88SJung-uk Kim static ACPI_PARSE_OBJECT *
ApCheckPackageElements(const char * PredefinedName,ACPI_PARSE_OBJECT * Op,UINT8 Type1,UINT32 Count1,UINT8 Type2,UINT32 Count2)6149c48c75eSJung-uk Kim ApCheckPackageElements (
6159c48c75eSJung-uk Kim const char *PredefinedName,
6169c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op,
6179c48c75eSJung-uk Kim UINT8 Type1,
6189c48c75eSJung-uk Kim UINT32 Count1,
6199c48c75eSJung-uk Kim UINT8 Type2,
6209c48c75eSJung-uk Kim UINT32 Count2)
6219c48c75eSJung-uk Kim {
6229c48c75eSJung-uk Kim UINT32 i;
6239c48c75eSJung-uk Kim
6249c48c75eSJung-uk Kim
6259c48c75eSJung-uk Kim /*
6269c48c75eSJung-uk Kim * Up to two groups of package elements are supported by the data
6279c48c75eSJung-uk Kim * structure. All elements in each group must be of the same type.
6289c48c75eSJung-uk Kim * The second group can have a count of zero.
6299c48c75eSJung-uk Kim *
6309c48c75eSJung-uk Kim * Aborts check upon a NULL package element, as this means (at compile
6319c48c75eSJung-uk Kim * time) that the remainder of the package elements are also NULL
6329c48c75eSJung-uk Kim * (This is the only way to create NULL package elements.)
6339c48c75eSJung-uk Kim */
6349c48c75eSJung-uk Kim for (i = 0; (i < Count1) && Op; i++)
6359c48c75eSJung-uk Kim {
6369c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op, Type1, i);
6379c48c75eSJung-uk Kim Op = Op->Asl.Next;
6389c48c75eSJung-uk Kim }
6399c48c75eSJung-uk Kim
6409c48c75eSJung-uk Kim for (i = 0; (i < Count2) && Op; i++)
6419c48c75eSJung-uk Kim {
6429c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op, Type2, (i + Count1));
6439c48c75eSJung-uk Kim Op = Op->Asl.Next;
6449c48c75eSJung-uk Kim }
645f8146b88SJung-uk Kim
646f8146b88SJung-uk Kim return (Op);
6479c48c75eSJung-uk Kim }
6489c48c75eSJung-uk Kim
6499c48c75eSJung-uk Kim
6509c48c75eSJung-uk Kim /*******************************************************************************
6519c48c75eSJung-uk Kim *
6529c48c75eSJung-uk Kim * FUNCTION: ApCheckPackageList
6539c48c75eSJung-uk Kim *
6549c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object
6559c48c75eSJung-uk Kim * ParentOp - Parser op of the parent package
6569c48c75eSJung-uk Kim * Package - Package info for this predefined name
6579c48c75eSJung-uk Kim * StartIndex - Index in parent package where list begins
6589c48c75eSJung-uk Kim * ParentCount - Element count of parent package
6599c48c75eSJung-uk Kim *
6609c48c75eSJung-uk Kim * RETURN: None
6619c48c75eSJung-uk Kim *
6629c48c75eSJung-uk Kim * DESCRIPTION: Validate the individual package elements for a predefined name.
6639c48c75eSJung-uk Kim * Handles the cases where the predefined name is defined as a
6649c48c75eSJung-uk Kim * Package of Packages (subpackages). These are the types:
6659c48c75eSJung-uk Kim *
6669c48c75eSJung-uk Kim * ACPI_PTYPE2
6679c48c75eSJung-uk Kim * ACPI_PTYPE2_FIXED
6689c48c75eSJung-uk Kim * ACPI_PTYPE2_MIN
6699c48c75eSJung-uk Kim * ACPI_PTYPE2_COUNT
6709c48c75eSJung-uk Kim * ACPI_PTYPE2_FIX_VAR
671a371a5fdSJung-uk Kim * ACPI_PTYPE2_VAR_VAR
6729c48c75eSJung-uk Kim *
6739c48c75eSJung-uk Kim ******************************************************************************/
6749c48c75eSJung-uk Kim
6759c48c75eSJung-uk Kim static void
ApCheckPackageList(const char * PredefinedName,ACPI_PARSE_OBJECT * ParentOp,const ACPI_PREDEFINED_INFO * Package,UINT32 StartIndex,UINT32 ParentCount)6769c48c75eSJung-uk Kim ApCheckPackageList (
6779c48c75eSJung-uk Kim const char *PredefinedName,
6789c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *ParentOp,
6799c48c75eSJung-uk Kim const ACPI_PREDEFINED_INFO *Package,
6809c48c75eSJung-uk Kim UINT32 StartIndex,
6819c48c75eSJung-uk Kim UINT32 ParentCount)
6829c48c75eSJung-uk Kim {
6839c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *SubPackageOp = ParentOp;
6849c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op;
6859c48c75eSJung-uk Kim ACPI_STATUS Status;
6869c48c75eSJung-uk Kim UINT32 Count;
6879c48c75eSJung-uk Kim UINT32 ExpectedCount;
6889c48c75eSJung-uk Kim UINT32 i;
6899c48c75eSJung-uk Kim UINT32 j;
6909c48c75eSJung-uk Kim
6919c48c75eSJung-uk Kim
6929c48c75eSJung-uk Kim /*
6939c48c75eSJung-uk Kim * Validate each subpackage in the parent Package
6949c48c75eSJung-uk Kim *
6959c48c75eSJung-uk Kim * Note: We ignore NULL package elements on the assumption that
6969c48c75eSJung-uk Kim * they will be initialized by the BIOS or other ASL code.
6979c48c75eSJung-uk Kim */
6989c48c75eSJung-uk Kim for (i = 0; (i < ParentCount) && SubPackageOp; i++)
6999c48c75eSJung-uk Kim {
7009c48c75eSJung-uk Kim /* Each object in the list must be of type Package */
7019c48c75eSJung-uk Kim
7029c48c75eSJung-uk Kim Status = ApCheckObjectType (PredefinedName, SubPackageOp,
7039c48c75eSJung-uk Kim ACPI_RTYPE_PACKAGE, i + StartIndex);
7049c48c75eSJung-uk Kim if (ACPI_FAILURE (Status))
7059c48c75eSJung-uk Kim {
7069c48c75eSJung-uk Kim goto NextSubpackage;
7079c48c75eSJung-uk Kim }
7089c48c75eSJung-uk Kim
7099c48c75eSJung-uk Kim /* Examine the different types of expected subpackages */
7109c48c75eSJung-uk Kim
7119c48c75eSJung-uk Kim Op = SubPackageOp->Asl.Child;
7129c48c75eSJung-uk Kim
7139c48c75eSJung-uk Kim /* First child is the package length */
7149c48c75eSJung-uk Kim
7159c48c75eSJung-uk Kim Count = (UINT32) Op->Asl.Value.Integer;
7169c48c75eSJung-uk Kim Op = Op->Asl.Next;
7179c48c75eSJung-uk Kim
718a371a5fdSJung-uk Kim /*
719a371a5fdSJung-uk Kim * Most subpackage must have at least one element, with
720a371a5fdSJung-uk Kim * only rare exceptions. (_RDI)
721a371a5fdSJung-uk Kim */
722a371a5fdSJung-uk Kim if (!Count &&
723a371a5fdSJung-uk Kim (Package->RetInfo.Type != ACPI_PTYPE2_VAR_VAR))
7249c48c75eSJung-uk Kim {
7259c48c75eSJung-uk Kim ApZeroLengthPackage (PredefinedName, SubPackageOp);
7269c48c75eSJung-uk Kim goto NextSubpackage;
7279c48c75eSJung-uk Kim }
7289c48c75eSJung-uk Kim
7299c48c75eSJung-uk Kim /*
7309c48c75eSJung-uk Kim * Decode the package type.
7319c48c75eSJung-uk Kim * PTYPE2 indicates that a "package of packages" is expected for
7329c48c75eSJung-uk Kim * this name. The various flavors of PTYPE2 indicate the number
7339c48c75eSJung-uk Kim * and format of the subpackages.
7349c48c75eSJung-uk Kim */
7359c48c75eSJung-uk Kim switch (Package->RetInfo.Type)
7369c48c75eSJung-uk Kim {
7379c48c75eSJung-uk Kim case ACPI_PTYPE2:
7389c48c75eSJung-uk Kim case ACPI_PTYPE2_PKG_COUNT:
7399c48c75eSJung-uk Kim case ACPI_PTYPE2_REV_FIXED:
7409c48c75eSJung-uk Kim
7419c48c75eSJung-uk Kim /* Each subpackage has a fixed number of elements */
7429c48c75eSJung-uk Kim
7439c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
7449c48c75eSJung-uk Kim if (Count < ExpectedCount)
7459c48c75eSJung-uk Kim {
7469c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp,
7479c48c75eSJung-uk Kim Count, ExpectedCount);
7489c48c75eSJung-uk Kim break;
7499c48c75eSJung-uk Kim }
750313a0c13SJung-uk Kim if (Count > ExpectedCount)
751313a0c13SJung-uk Kim {
752313a0c13SJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp,
753313a0c13SJung-uk Kim Count, ExpectedCount);
754313a0c13SJung-uk Kim break;
755313a0c13SJung-uk Kim }
7569c48c75eSJung-uk Kim
7579c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op,
7589c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1,
7599c48c75eSJung-uk Kim Package->RetInfo.ObjectType2, Package->RetInfo.Count2);
7609c48c75eSJung-uk Kim break;
7619c48c75eSJung-uk Kim
7629c48c75eSJung-uk Kim case ACPI_PTYPE2_FIX_VAR:
7639c48c75eSJung-uk Kim /*
7649c48c75eSJung-uk Kim * Each subpackage has a fixed number of elements and an
7659c48c75eSJung-uk Kim * optional element
7669c48c75eSJung-uk Kim */
7679c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2;
7689c48c75eSJung-uk Kim if (Count < ExpectedCount)
7699c48c75eSJung-uk Kim {
7709c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp,
7719c48c75eSJung-uk Kim Count, ExpectedCount);
7729c48c75eSJung-uk Kim break;
7739c48c75eSJung-uk Kim }
7749c48c75eSJung-uk Kim
7759c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op,
7769c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Package->RetInfo.Count1,
7779c48c75eSJung-uk Kim Package->RetInfo.ObjectType2,
7789c48c75eSJung-uk Kim Count - Package->RetInfo.Count1);
7799c48c75eSJung-uk Kim break;
7809c48c75eSJung-uk Kim
781a371a5fdSJung-uk Kim case ACPI_PTYPE2_VAR_VAR:
782a371a5fdSJung-uk Kim /*
783a371a5fdSJung-uk Kim * Must have at least the minimum number elements.
784a371a5fdSJung-uk Kim * A zero PkgCount means the number of elements is variable.
785a371a5fdSJung-uk Kim */
786a371a5fdSJung-uk Kim ExpectedCount = Package->RetInfo4.PkgCount;
787a371a5fdSJung-uk Kim if (ExpectedCount && (Count < ExpectedCount))
788a371a5fdSJung-uk Kim {
789a371a5fdSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp,
790a371a5fdSJung-uk Kim Count, 1);
791a371a5fdSJung-uk Kim break;
792a371a5fdSJung-uk Kim }
793a371a5fdSJung-uk Kim
794a371a5fdSJung-uk Kim ApCheckPackageElements (PredefinedName, Op,
795a371a5fdSJung-uk Kim Package->RetInfo4.SubObjectTypes,
796a371a5fdSJung-uk Kim Package->RetInfo4.PkgCount,
797a371a5fdSJung-uk Kim 0, 0);
798a371a5fdSJung-uk Kim break;
799a371a5fdSJung-uk Kim
8009c48c75eSJung-uk Kim case ACPI_PTYPE2_FIXED:
8019c48c75eSJung-uk Kim
802313a0c13SJung-uk Kim /* Each subpackage has a fixed length */
8039c48c75eSJung-uk Kim
8049c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo2.Count;
8059c48c75eSJung-uk Kim if (Count < ExpectedCount)
8069c48c75eSJung-uk Kim {
8079c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp,
8089c48c75eSJung-uk Kim Count, ExpectedCount);
8099c48c75eSJung-uk Kim break;
8109c48c75eSJung-uk Kim }
811313a0c13SJung-uk Kim if (Count > ExpectedCount)
812313a0c13SJung-uk Kim {
813313a0c13SJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp,
814313a0c13SJung-uk Kim Count, ExpectedCount);
815313a0c13SJung-uk Kim break;
816313a0c13SJung-uk Kim }
8179c48c75eSJung-uk Kim
8189c48c75eSJung-uk Kim /* Check each object/type combination */
8199c48c75eSJung-uk Kim
8209c48c75eSJung-uk Kim for (j = 0; j < ExpectedCount; j++)
8219c48c75eSJung-uk Kim {
8229c48c75eSJung-uk Kim ApCheckObjectType (PredefinedName, Op,
8239c48c75eSJung-uk Kim Package->RetInfo2.ObjectType[j], j);
8249c48c75eSJung-uk Kim
8259c48c75eSJung-uk Kim Op = Op->Asl.Next;
8269c48c75eSJung-uk Kim }
8279c48c75eSJung-uk Kim break;
8289c48c75eSJung-uk Kim
8299c48c75eSJung-uk Kim case ACPI_PTYPE2_MIN:
8309c48c75eSJung-uk Kim
831313a0c13SJung-uk Kim /* Each subpackage has a variable but minimum length */
8329c48c75eSJung-uk Kim
8339c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1;
8349c48c75eSJung-uk Kim if (Count < ExpectedCount)
8359c48c75eSJung-uk Kim {
8369c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp,
8379c48c75eSJung-uk Kim Count, ExpectedCount);
8389c48c75eSJung-uk Kim break;
8399c48c75eSJung-uk Kim }
8409c48c75eSJung-uk Kim
841313a0c13SJung-uk Kim /* Check the type of each subpackage element */
8429c48c75eSJung-uk Kim
8439c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op,
8449c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, Count, 0, 0);
8459c48c75eSJung-uk Kim break;
8469c48c75eSJung-uk Kim
8479c48c75eSJung-uk Kim case ACPI_PTYPE2_COUNT:
8489c48c75eSJung-uk Kim /*
8499c48c75eSJung-uk Kim * First element is the (Integer) count of elements, including
8509c48c75eSJung-uk Kim * the count field (the ACPI name is NumElements)
8519c48c75eSJung-uk Kim */
8529c48c75eSJung-uk Kim Status = ApCheckObjectType (PredefinedName, Op,
8539c48c75eSJung-uk Kim ACPI_RTYPE_INTEGER, 0);
8549c48c75eSJung-uk Kim
8559c48c75eSJung-uk Kim /* We must have an integer count from above (otherwise, use Count) */
8569c48c75eSJung-uk Kim
8579c48c75eSJung-uk Kim if (ACPI_SUCCESS (Status))
8589c48c75eSJung-uk Kim {
8599c48c75eSJung-uk Kim /*
8609c48c75eSJung-uk Kim * Make sure package is large enough for the Count and is
8619c48c75eSJung-uk Kim * is as large as the minimum size
8629c48c75eSJung-uk Kim */
8639c48c75eSJung-uk Kim ExpectedCount = (UINT32) Op->Asl.Value.Integer;
8649c48c75eSJung-uk Kim
8659c48c75eSJung-uk Kim if (Count < ExpectedCount)
8669c48c75eSJung-uk Kim {
8679c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp,
8689c48c75eSJung-uk Kim Count, ExpectedCount);
8699c48c75eSJung-uk Kim break;
8709c48c75eSJung-uk Kim }
8719c48c75eSJung-uk Kim else if (Count > ExpectedCount)
8729c48c75eSJung-uk Kim {
8739c48c75eSJung-uk Kim ApPackageTooLarge (PredefinedName, SubPackageOp,
8749c48c75eSJung-uk Kim Count, ExpectedCount);
8759c48c75eSJung-uk Kim }
8769c48c75eSJung-uk Kim
8779c48c75eSJung-uk Kim /* Some names of this type have a minimum length */
8789c48c75eSJung-uk Kim
8799c48c75eSJung-uk Kim if (Count < Package->RetInfo.Count1)
8809c48c75eSJung-uk Kim {
8819c48c75eSJung-uk Kim ExpectedCount = Package->RetInfo.Count1;
8829c48c75eSJung-uk Kim ApPackageTooSmall (PredefinedName, SubPackageOp,
8839c48c75eSJung-uk Kim Count, ExpectedCount);
8849c48c75eSJung-uk Kim break;
8859c48c75eSJung-uk Kim }
8869c48c75eSJung-uk Kim
8879c48c75eSJung-uk Kim Count = ExpectedCount;
8889c48c75eSJung-uk Kim }
8899c48c75eSJung-uk Kim
890313a0c13SJung-uk Kim /* Check the type of each subpackage element */
8919c48c75eSJung-uk Kim
8929c48c75eSJung-uk Kim Op = Op->Asl.Next;
8939c48c75eSJung-uk Kim ApCheckPackageElements (PredefinedName, Op,
8949c48c75eSJung-uk Kim Package->RetInfo.ObjectType1, (Count - 1), 0, 0);
8959c48c75eSJung-uk Kim break;
8969c48c75eSJung-uk Kim
8979c48c75eSJung-uk Kim default:
8989c48c75eSJung-uk Kim break;
8999c48c75eSJung-uk Kim }
9009c48c75eSJung-uk Kim
9019c48c75eSJung-uk Kim NextSubpackage:
9029c48c75eSJung-uk Kim SubPackageOp = SubPackageOp->Asl.Next;
9039c48c75eSJung-uk Kim }
9049c48c75eSJung-uk Kim }
9059c48c75eSJung-uk Kim
9069c48c75eSJung-uk Kim
9079c48c75eSJung-uk Kim /*******************************************************************************
9089c48c75eSJung-uk Kim *
9099c48c75eSJung-uk Kim * FUNCTION: ApPackageTooSmall
9109c48c75eSJung-uk Kim *
9119c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object
9129c48c75eSJung-uk Kim * Op - Current parser op
9139c48c75eSJung-uk Kim * Count - Actual package element count
9149c48c75eSJung-uk Kim * ExpectedCount - Expected package element count
9159c48c75eSJung-uk Kim *
9169c48c75eSJung-uk Kim * RETURN: None
9179c48c75eSJung-uk Kim *
9189c48c75eSJung-uk Kim * DESCRIPTION: Issue error message for a package that is smaller than
9199c48c75eSJung-uk Kim * required.
9209c48c75eSJung-uk Kim *
9219c48c75eSJung-uk Kim ******************************************************************************/
9229c48c75eSJung-uk Kim
9239c48c75eSJung-uk Kim static void
ApPackageTooSmall(const char * PredefinedName,ACPI_PARSE_OBJECT * Op,UINT32 Count,UINT32 ExpectedCount)9249c48c75eSJung-uk Kim ApPackageTooSmall (
9259c48c75eSJung-uk Kim const char *PredefinedName,
9269c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op,
9279c48c75eSJung-uk Kim UINT32 Count,
9289c48c75eSJung-uk Kim UINT32 ExpectedCount)
9299c48c75eSJung-uk Kim {
9309c48c75eSJung-uk Kim
931f15e9afbSJung-uk Kim sprintf (AslGbl_MsgBuffer, "%4.4s: length %u, required minimum is %u",
9329c48c75eSJung-uk Kim PredefinedName, Count, ExpectedCount);
9339c48c75eSJung-uk Kim
9346f1f1a63SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer);
9359c48c75eSJung-uk Kim }
9369c48c75eSJung-uk Kim
9379c48c75eSJung-uk Kim
9389c48c75eSJung-uk Kim /*******************************************************************************
9399c48c75eSJung-uk Kim *
9409c48c75eSJung-uk Kim * FUNCTION: ApZeroLengthPackage
9419c48c75eSJung-uk Kim *
9429c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object
9439c48c75eSJung-uk Kim * Op - Current parser op
9449c48c75eSJung-uk Kim *
9459c48c75eSJung-uk Kim * RETURN: None
9469c48c75eSJung-uk Kim *
9479c48c75eSJung-uk Kim * DESCRIPTION: Issue error message for a zero-length package (a package that
9489c48c75eSJung-uk Kim * is required to have a non-zero length). Variable length
9499c48c75eSJung-uk Kim * packages seem to be allowed to have zero length, however.
9509c48c75eSJung-uk Kim * Even if not allowed, BIOS code does it.
9519c48c75eSJung-uk Kim *
9529c48c75eSJung-uk Kim ******************************************************************************/
9539c48c75eSJung-uk Kim
9549c48c75eSJung-uk Kim static void
ApZeroLengthPackage(const char * PredefinedName,ACPI_PARSE_OBJECT * Op)9559c48c75eSJung-uk Kim ApZeroLengthPackage (
9569c48c75eSJung-uk Kim const char *PredefinedName,
9579c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op)
9589c48c75eSJung-uk Kim {
9599c48c75eSJung-uk Kim
960f15e9afbSJung-uk Kim sprintf (AslGbl_MsgBuffer, "%4.4s: length is zero", PredefinedName);
9619c48c75eSJung-uk Kim
9626f1f1a63SJung-uk Kim AslError (ASL_ERROR, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer);
9639c48c75eSJung-uk Kim }
9649c48c75eSJung-uk Kim
9659c48c75eSJung-uk Kim
9669c48c75eSJung-uk Kim /*******************************************************************************
9679c48c75eSJung-uk Kim *
9689c48c75eSJung-uk Kim * FUNCTION: ApPackageTooLarge
9699c48c75eSJung-uk Kim *
9709c48c75eSJung-uk Kim * PARAMETERS: PredefinedName - Name of the predefined object
9719c48c75eSJung-uk Kim * Op - Current parser op
9729c48c75eSJung-uk Kim * Count - Actual package element count
9739c48c75eSJung-uk Kim * ExpectedCount - Expected package element count
9749c48c75eSJung-uk Kim *
9759c48c75eSJung-uk Kim * RETURN: None
9769c48c75eSJung-uk Kim *
9779c48c75eSJung-uk Kim * DESCRIPTION: Issue a remark for a package that is larger than expected.
9789c48c75eSJung-uk Kim *
9799c48c75eSJung-uk Kim ******************************************************************************/
9809c48c75eSJung-uk Kim
9819c48c75eSJung-uk Kim static void
ApPackageTooLarge(const char * PredefinedName,ACPI_PARSE_OBJECT * Op,UINT32 Count,UINT32 ExpectedCount)9829c48c75eSJung-uk Kim ApPackageTooLarge (
9839c48c75eSJung-uk Kim const char *PredefinedName,
9849c48c75eSJung-uk Kim ACPI_PARSE_OBJECT *Op,
9859c48c75eSJung-uk Kim UINT32 Count,
9869c48c75eSJung-uk Kim UINT32 ExpectedCount)
9879c48c75eSJung-uk Kim {
9889c48c75eSJung-uk Kim
989f15e9afbSJung-uk Kim sprintf (AslGbl_MsgBuffer, "%4.4s: length is %u, only %u required",
9909c48c75eSJung-uk Kim PredefinedName, Count, ExpectedCount);
9919c48c75eSJung-uk Kim
9926f1f1a63SJung-uk Kim AslError (ASL_REMARK, ASL_MSG_RESERVED_PACKAGE_LENGTH, Op, AslGbl_MsgBuffer);
9939c48c75eSJung-uk Kim }
994