xref: /freebsd/sys/contrib/dev/acpica/compiler/aslprepkg.c (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
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