The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/dev/acpica/common/dmrestag.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /******************************************************************************
    2  *
    3  * Module Name: dmrestag - Add tags to resource descriptors (Application-level)
    4  *
    5  *****************************************************************************/
    6 
    7 /******************************************************************************
    8  *
    9  * 1. Copyright Notice
   10  *
   11  * Some or all of this work - Copyright (c) 1999 - 2022, Intel Corp.
   12  * All rights reserved.
   13  *
   14  * 2. License
   15  *
   16  * 2.1. This is your license from Intel Corp. under its intellectual property
   17  * rights. You may have additional license terms from the party that provided
   18  * you this software, covering your right to use that party's intellectual
   19  * property rights.
   20  *
   21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
   22  * copy of the source code appearing in this file ("Covered Code") an
   23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
   24  * base code distributed originally by Intel ("Original Intel Code") to copy,
   25  * make derivatives, distribute, use and display any portion of the Covered
   26  * Code in any form, with the right to sublicense such rights; and
   27  *
   28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
   29  * license (with the right to sublicense), under only those claims of Intel
   30  * patents that are infringed by the Original Intel Code, to make, use, sell,
   31  * offer to sell, and import the Covered Code and derivative works thereof
   32  * solely to the minimum extent necessary to exercise the above copyright
   33  * license, and in no event shall the patent license extend to any additions
   34  * to or modifications of the Original Intel Code. No other license or right
   35  * is granted directly or by implication, estoppel or otherwise;
   36  *
   37  * The above copyright and patent license is granted only if the following
   38  * conditions are met:
   39  *
   40  * 3. Conditions
   41  *
   42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
   43  * Redistribution of source code of any substantial portion of the Covered
   44  * Code or modification with rights to further distribute source must include
   45  * the above Copyright Notice, the above License, this list of Conditions,
   46  * and the following Disclaimer and Export Compliance provision. In addition,
   47  * Licensee must cause all Covered Code to which Licensee contributes to
   48  * contain a file documenting the changes Licensee made to create that Covered
   49  * Code and the date of any change. Licensee must include in that file the
   50  * documentation of any changes made by any predecessor Licensee. Licensee
   51  * must include a prominent statement that the modification is derived,
   52  * directly or indirectly, from Original Intel Code.
   53  *
   54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
   55  * Redistribution of source code of any substantial portion of the Covered
   56  * Code or modification without rights to further distribute source must
   57  * include the following Disclaimer and Export Compliance provision in the
   58  * documentation and/or other materials provided with distribution. In
   59  * addition, Licensee may not authorize further sublicense of source of any
   60  * portion of the Covered Code, and must include terms to the effect that the
   61  * license from Licensee to its licensee is limited to the intellectual
   62  * property embodied in the software Licensee provides to its licensee, and
   63  * not to intellectual property embodied in modifications its licensee may
   64  * make.
   65  *
   66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
   67  * substantial portion of the Covered Code or modification must reproduce the
   68  * above Copyright Notice, and the following Disclaimer and Export Compliance
   69  * provision in the documentation and/or other materials provided with the
   70  * distribution.
   71  *
   72  * 3.4. Intel retains all right, title, and interest in and to the Original
   73  * Intel Code.
   74  *
   75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
   76  * Intel shall be used in advertising or otherwise to promote the sale, use or
   77  * other dealings in products derived from or relating to the Covered Code
   78  * without prior written authorization from Intel.
   79  *
   80  * 4. Disclaimer and Export Compliance
   81  *
   82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
   83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
   84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
   85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
   86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
   87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
   88  * PARTICULAR PURPOSE.
   89  *
   90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
   91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
   92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
   93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
   94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
   95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
   96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
   97  * LIMITED REMEDY.
   98  *
   99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  100  * software or system incorporating such software without first obtaining any
  101  * required license or other approval from the U. S. Department of Commerce or
  102  * any other agency or department of the United States Government. In the
  103  * event Licensee exports any such software from the United States or
  104  * re-exports any such software from a foreign destination, Licensee shall
  105  * ensure that the distribution and export/re-export of the software is in
  106  * compliance with all laws, regulations, orders, or other restrictions of the
  107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  108  * any of its subsidiaries will export/re-export any technical data, process,
  109  * software, or service, directly or indirectly, to any country for which the
  110  * United States government or any agency thereof requires an export license,
  111  * other governmental approval, or letter of assurance, without first obtaining
  112  * such license, approval or letter.
  113  *
  114  *****************************************************************************
  115  *
  116  * Alternatively, you may choose to be licensed under the terms of the
  117  * following license:
  118  *
  119  * Redistribution and use in source and binary forms, with or without
  120  * modification, are permitted provided that the following conditions
  121  * are met:
  122  * 1. Redistributions of source code must retain the above copyright
  123  *    notice, this list of conditions, and the following disclaimer,
  124  *    without modification.
  125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  126  *    substantially similar to the "NO WARRANTY" disclaimer below
  127  *    ("Disclaimer") and any redistribution must be conditioned upon
  128  *    including a substantially similar Disclaimer requirement for further
  129  *    binary redistribution.
  130  * 3. Neither the names of the above-listed copyright holders nor the names
  131  *    of any contributors may be used to endorse or promote products derived
  132  *    from this software without specific prior written permission.
  133  *
  134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  145  *
  146  * Alternatively, you may choose to be licensed under the terms of the
  147  * GNU General Public License ("GPL") version 2 as published by the Free
  148  * Software Foundation.
  149  *
  150  *****************************************************************************/
  151 
  152 #include <contrib/dev/acpica/include/acpi.h>
  153 #include <contrib/dev/acpica/include/accommon.h>
  154 #include <contrib/dev/acpica/include/acparser.h>
  155 #include <contrib/dev/acpica/include/acdisasm.h>
  156 #include <contrib/dev/acpica/include/acnamesp.h>
  157 #include <contrib/dev/acpica/include/amlcode.h>
  158 
  159 /* This module used for application-level code only */
  160 
  161 #define _COMPONENT          ACPI_CA_DISASSEMBLER
  162         ACPI_MODULE_NAME    ("dmrestag")
  163 
  164 /* Local prototypes */
  165 
  166 static void
  167 AcpiDmUpdateResourceName (
  168     ACPI_NAMESPACE_NODE     *ResourceNode);
  169 
  170 static char *
  171 AcpiDmSearchTagList (
  172     UINT32                  BitIndex,
  173     const ACPI_RESOURCE_TAG *TagList);
  174 
  175 static char *
  176 AcpiDmGetResourceTag (
  177     UINT32                  BitIndex,
  178     AML_RESOURCE            *Resource,
  179     UINT8                   ResourceIndex);
  180 
  181 static char *
  182 AcpiGetTagPathname (
  183     ACPI_PARSE_OBJECT       *Op,
  184     ACPI_NAMESPACE_NODE     *BufferNode,
  185     ACPI_NAMESPACE_NODE     *ResourceNode,
  186     UINT32                  BitIndex);
  187 
  188 static ACPI_NAMESPACE_NODE *
  189 AcpiDmGetResourceNode (
  190     ACPI_NAMESPACE_NODE     *BufferNode,
  191     UINT32                  BitIndex);
  192 
  193 static ACPI_STATUS
  194 AcpiDmAddResourceToNamespace (
  195     UINT8                   *Aml,
  196     UINT32                  Length,
  197     UINT32                  Offset,
  198     UINT8                   ResourceIndex,
  199     void                    **Context);
  200 
  201 static void
  202 AcpiDmAddResourcesToNamespace (
  203     ACPI_NAMESPACE_NODE     *BufferNode,
  204     ACPI_PARSE_OBJECT       *Op);
  205 
  206 
  207 /******************************************************************************
  208  *
  209  * Resource Tag tables
  210  *
  211  * These are the predefined tags that refer to elements of a resource
  212  * descriptor. Each name and offset is defined in the ACPI specification.
  213  *
  214  * Each table entry contains the bit offset of the field and the associated
  215  * name.
  216  *
  217  ******************************************************************************/
  218 
  219 static const ACPI_RESOURCE_TAG      AcpiDmIrqTags[] =
  220 {
  221     {( 1 * 8),      ACPI_RESTAG_INTERRUPT},
  222     {( 3 * 8) + 0,  ACPI_RESTAG_INTERRUPTTYPE},
  223     {( 3 * 8) + 3,  ACPI_RESTAG_INTERRUPTLEVEL},
  224     {( 3 * 8) + 4,  ACPI_RESTAG_INTERRUPTSHARE},
  225     {0,             NULL}
  226 };
  227 
  228 static const ACPI_RESOURCE_TAG      AcpiDmDmaTags[] =
  229 {
  230     {( 1 * 8),      ACPI_RESTAG_DMA},
  231     {( 2 * 8) + 0,  ACPI_RESTAG_XFERTYPE},
  232     {( 2 * 8) + 2,  ACPI_RESTAG_BUSMASTER},
  233     {( 2 * 8) + 5,  ACPI_RESTAG_DMATYPE},
  234     {0,             NULL}
  235 };
  236 
  237 static const ACPI_RESOURCE_TAG      AcpiDmIoTags[] =
  238 {
  239     {( 1 * 8) + 0,  ACPI_RESTAG_DECODE},
  240     {( 2 * 8),      ACPI_RESTAG_MINADDR},
  241     {( 4 * 8),      ACPI_RESTAG_MAXADDR},
  242     {( 6 * 8),      ACPI_RESTAG_ALIGNMENT},
  243     {( 7 * 8),      ACPI_RESTAG_LENGTH},
  244     {0,             NULL}
  245 };
  246 
  247 static const ACPI_RESOURCE_TAG      AcpiDmFixedIoTags[] =
  248 {
  249     {( 1 * 8),      ACPI_RESTAG_BASEADDRESS},
  250     {( 3 * 8),      ACPI_RESTAG_LENGTH},
  251     {0,             NULL}
  252 };
  253 
  254 static const ACPI_RESOURCE_TAG      AcpiDmFixedDmaTags[] =
  255 {
  256     {( 1 * 8),      ACPI_RESTAG_DMA},
  257     {( 3 * 8),      ACPI_RESTAG_DMATYPE},
  258     {( 5 * 8),      ACPI_RESTAG_XFERTYPE},
  259     {0,             NULL}
  260 };
  261 
  262 static const ACPI_RESOURCE_TAG      AcpiDmMemory24Tags[] =
  263 {
  264     {( 3 * 8) + 0,  ACPI_RESTAG_READWRITETYPE},
  265     {( 4 * 8),      ACPI_RESTAG_MINADDR},
  266     {( 6 * 8),      ACPI_RESTAG_MAXADDR},
  267     {( 8 * 8),      ACPI_RESTAG_ALIGNMENT},
  268     {(10 * 8),      ACPI_RESTAG_LENGTH},
  269     {0,             NULL}
  270 };
  271 
  272 static const ACPI_RESOURCE_TAG      AcpiDmRegisterTags[] =
  273 {
  274     {( 3 * 8),      ACPI_RESTAG_ADDRESSSPACE},
  275     {( 4 * 8),      ACPI_RESTAG_REGISTERBITWIDTH},
  276     {( 5 * 8),      ACPI_RESTAG_REGISTERBITOFFSET},
  277     {( 6 * 8),      ACPI_RESTAG_ACCESSSIZE},
  278     {( 7 * 8),      ACPI_RESTAG_ADDRESS},
  279     {0,             NULL}
  280 };
  281 
  282 static const ACPI_RESOURCE_TAG      AcpiDmMemory32Tags[] =
  283 {
  284     {( 3 * 8) + 0,  ACPI_RESTAG_READWRITETYPE},
  285     {( 4 * 8),      ACPI_RESTAG_MINADDR},
  286     {( 8 * 8),      ACPI_RESTAG_MAXADDR},
  287     {(12 * 8),      ACPI_RESTAG_ALIGNMENT},
  288     {(16 * 8),      ACPI_RESTAG_LENGTH},
  289     {0,             NULL}
  290 };
  291 
  292 static const ACPI_RESOURCE_TAG      AcpiDmFixedMemory32Tags[] =
  293 {
  294     {( 3 * 8) + 0,  ACPI_RESTAG_READWRITETYPE},
  295     {( 4 * 8),      ACPI_RESTAG_BASEADDRESS},
  296     {( 8 * 8),      ACPI_RESTAG_LENGTH},
  297     {0,             NULL}
  298 };
  299 
  300 static const ACPI_RESOURCE_TAG      AcpiDmInterruptTags[] =
  301 {
  302     {( 3 * 8) + 1,  ACPI_RESTAG_INTERRUPTTYPE},
  303     {( 3 * 8) + 2,  ACPI_RESTAG_INTERRUPTLEVEL},
  304     {( 3 * 8) + 3,  ACPI_RESTAG_INTERRUPTSHARE},
  305     {( 5 * 8),      ACPI_RESTAG_INTERRUPT},
  306     {0,             NULL}
  307 };
  308 
  309 static const ACPI_RESOURCE_TAG      AcpiDmAddress16Tags[] =
  310 {
  311     {( 4 * 8) + 1,  ACPI_RESTAG_DECODE},
  312     {( 4 * 8) + 2,  ACPI_RESTAG_MINTYPE},
  313     {( 4 * 8) + 3,  ACPI_RESTAG_MAXTYPE},
  314     {( 6 * 8),      ACPI_RESTAG_GRANULARITY},
  315     {( 8 * 8),      ACPI_RESTAG_MINADDR},
  316     {(10 * 8),      ACPI_RESTAG_MAXADDR},
  317     {(12 * 8),      ACPI_RESTAG_TRANSLATION},
  318     {(14 * 8),      ACPI_RESTAG_LENGTH},
  319     {0,             NULL}
  320 };
  321 
  322 static const ACPI_RESOURCE_TAG      AcpiDmAddress32Tags[] =
  323 {
  324     {( 4 * 8) + 1,  ACPI_RESTAG_DECODE},
  325     {( 4 * 8) + 2,  ACPI_RESTAG_MINTYPE},
  326     {( 4 * 8) + 3,  ACPI_RESTAG_MAXTYPE},
  327     {( 6 * 8),      ACPI_RESTAG_GRANULARITY},
  328     {(10 * 8),      ACPI_RESTAG_MINADDR},
  329     {(14 * 8),      ACPI_RESTAG_MAXADDR},
  330     {(18 * 8),      ACPI_RESTAG_TRANSLATION},
  331     {(22 * 8),      ACPI_RESTAG_LENGTH},
  332     {0,             NULL}
  333 };
  334 
  335 static const ACPI_RESOURCE_TAG      AcpiDmAddress64Tags[] =
  336 {
  337     {( 4 * 8) + 1,  ACPI_RESTAG_DECODE},
  338     {( 4 * 8) + 2,  ACPI_RESTAG_MINTYPE},
  339     {( 4 * 8) + 3,  ACPI_RESTAG_MAXTYPE},
  340     {( 6 * 8),      ACPI_RESTAG_GRANULARITY},
  341     {(14 * 8),      ACPI_RESTAG_MINADDR},
  342     {(22 * 8),      ACPI_RESTAG_MAXADDR},
  343     {(30 * 8),      ACPI_RESTAG_TRANSLATION},
  344     {(38 * 8),      ACPI_RESTAG_LENGTH},
  345     {0,             NULL}
  346 };
  347 
  348 static const ACPI_RESOURCE_TAG      AcpiDmExtendedAddressTags[] =
  349 {
  350     {( 4 * 8) + 1,  ACPI_RESTAG_DECODE},
  351     {( 4 * 8) + 2,  ACPI_RESTAG_MINTYPE},
  352     {( 4 * 8) + 3,  ACPI_RESTAG_MAXTYPE},
  353     {( 8 * 8),      ACPI_RESTAG_GRANULARITY},
  354     {(16 * 8),      ACPI_RESTAG_MINADDR},
  355     {(24 * 8),      ACPI_RESTAG_MAXADDR},
  356     {(32 * 8),      ACPI_RESTAG_TRANSLATION},
  357     {(40 * 8),      ACPI_RESTAG_LENGTH},
  358     {(48 * 8),      ACPI_RESTAG_TYPESPECIFICATTRIBUTES},
  359     {0,             NULL}
  360 };
  361 
  362 /* Subtype tables for GPIO descriptors */
  363 
  364 static const ACPI_RESOURCE_TAG      AcpiDmGpioIntTags[] =
  365 {
  366     {( 7 * 8) + 0,  ACPI_RESTAG_MODE},
  367     {( 7 * 8) + 1,  ACPI_RESTAG_POLARITY},
  368     {( 7 * 8) + 3,  ACPI_RESTAG_INTERRUPTSHARE},
  369     {( 9 * 8),      ACPI_RESTAG_PINCONFIG},
  370     {(10 * 8),      ACPI_RESTAG_DRIVESTRENGTH},
  371     {(12 * 8),      ACPI_RESTAG_DEBOUNCETIME},
  372     {0,             NULL}
  373 };
  374 
  375 static const ACPI_RESOURCE_TAG      AcpiDmGpioIoTags[] =
  376 {
  377     {( 7 * 8) + 0,  ACPI_RESTAG_IORESTRICTION},
  378     {( 7 * 8) + 3,  ACPI_RESTAG_INTERRUPTSHARE},
  379     {( 9 * 8),      ACPI_RESTAG_PINCONFIG},
  380     {(10 * 8),      ACPI_RESTAG_DRIVESTRENGTH},
  381     {(12 * 8),      ACPI_RESTAG_DEBOUNCETIME},
  382     {0,             NULL}
  383 };
  384 
  385 /* Subtype tables for SerialBus descriptors */
  386 
  387 static const ACPI_RESOURCE_TAG      AcpiDmCsi2SerialBusTags[] =    /* ACPI 6.4 */
  388 {
  389     {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
  390     {( 7 * 8) + 0,  ACPI_RESTAG_PHYTYPE},
  391     {( 7 * 8) + 2,  ACPI_RESTAG_LOCALPORT},
  392     {0,             NULL}
  393 };
  394 
  395 static const ACPI_RESOURCE_TAG      AcpiDmI2cSerialBusTags[] =
  396 {
  397     {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
  398     {( 6 * 8) + 2,  ACPI_RESTAG_INTERRUPTSHARE},    /* V2 - ACPI 6.0 */
  399     {( 7 * 8) + 0,  ACPI_RESTAG_MODE},
  400     {(12 * 8),      ACPI_RESTAG_SPEED},
  401     {(16 * 8),      ACPI_RESTAG_ADDRESS},
  402     {0,             NULL}
  403 };
  404 
  405 static const ACPI_RESOURCE_TAG      AcpiDmSpiSerialBusTags[] =
  406 {
  407     {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},
  408     {( 6 * 8) + 2,  ACPI_RESTAG_INTERRUPTSHARE},    /* V2 - ACPI 6.0 */
  409     {( 7 * 8) + 0,  ACPI_RESTAG_MODE},
  410     {( 7 * 8) + 1,  ACPI_RESTAG_DEVICEPOLARITY},
  411     {(12 * 8),      ACPI_RESTAG_SPEED},
  412     {(16 * 8),      ACPI_RESTAG_LENGTH},
  413     {(17 * 8),      ACPI_RESTAG_PHASE},
  414     {(18 * 8),      ACPI_RESTAG_POLARITY},
  415     {(19 * 8),      ACPI_RESTAG_ADDRESS},
  416     {0,             NULL}
  417 };
  418 
  419 static const ACPI_RESOURCE_TAG      AcpiDmUartSerialBusTags[] =
  420 {
  421     {( 6 * 8) + 0,  ACPI_RESTAG_SLAVEMODE},         /* Note: not part of original macro */
  422     {( 6 * 8) + 2,  ACPI_RESTAG_INTERRUPTSHARE},    /* V2 - ACPI 6.0 */
  423     {( 7 * 8) + 0,  ACPI_RESTAG_FLOWCONTROL},
  424     {( 7 * 8) + 2,  ACPI_RESTAG_STOPBITS},
  425     {( 7 * 8) + 4,  ACPI_RESTAG_LENGTH},
  426     {( 7 * 8) + 7,  ACPI_RESTAG_ENDIANNESS},
  427     {(12 * 8),      ACPI_RESTAG_SPEED},
  428     {(16 * 8),      ACPI_RESTAG_LENGTH_RX},
  429     {(18 * 8),      ACPI_RESTAG_LENGTH_TX},
  430     {(20 * 8),      ACPI_RESTAG_PARITY},
  431     {(21 * 8),      ACPI_RESTAG_LINE},
  432     {0,             NULL}
  433 };
  434 
  435 
  436 /* Subtype tables for PinFunction descriptor */
  437 
  438 static const ACPI_RESOURCE_TAG      AcpiDmPinFunctionTags[] =
  439 {
  440     {( 4 * 8),      ACPI_RESTAG_INTERRUPTSHARE},
  441     {( 6 * 8),      ACPI_RESTAG_PINCONFIG},
  442     {( 7 * 8),      ACPI_RESTAG_FUNCTION},
  443     {0,             NULL}
  444 };
  445 
  446 /* Subtype tables for PinConfig descriptor */
  447 
  448 static const ACPI_RESOURCE_TAG      AcpiDmPinConfigTags[] =
  449 {
  450     {( 4 * 8),      ACPI_RESTAG_INTERRUPTSHARE},
  451     {( 6 * 8),      ACPI_RESTAG_PINCONFIG_TYPE},
  452     {( 7 * 8),      ACPI_RESTAG_PINCONFIG_VALUE},
  453     {0,             NULL}
  454 };
  455 
  456 /* Subtype tables for PinGroupFunction descriptor */
  457 
  458 static const ACPI_RESOURCE_TAG      AcpiDmPinGroupFunctionTags[] =
  459 {
  460     {( 6 * 8),      ACPI_RESTAG_FUNCTION},
  461     {0,             NULL}
  462 };
  463 
  464 /* Subtype tables for Address descriptor type-specific flags */
  465 
  466 static const ACPI_RESOURCE_TAG      AcpiDmMemoryFlagTags[] =
  467 {
  468     {( 5 * 8) + 0,  ACPI_RESTAG_READWRITETYPE},
  469     {( 5 * 8) + 1,  ACPI_RESTAG_MEMTYPE},
  470     {( 5 * 8) + 3,  ACPI_RESTAG_MEMATTRIBUTES},
  471     {( 5 * 8) + 5,  ACPI_RESTAG_TYPE},
  472     {0,             NULL}
  473 };
  474 
  475 static const ACPI_RESOURCE_TAG      AcpiDmIoFlagTags[] =
  476 {
  477     {( 5 * 8) + 0,  ACPI_RESTAG_RANGETYPE},
  478     {( 5 * 8) + 4,  ACPI_RESTAG_TYPE},
  479     {( 5 * 8) + 5,  ACPI_RESTAG_TRANSTYPE},
  480     {0,             NULL}
  481 };
  482 
  483 
  484 /*
  485  * Dispatch table used to obtain the correct tag table for a descriptor.
  486  *
  487  * A NULL in this table means one of three things:
  488  * 1) The descriptor ID is reserved and invalid
  489  * 2) The descriptor has no tags associated with it
  490  * 3) The descriptor has subtypes and a separate table will be used.
  491  */
  492 static const ACPI_RESOURCE_TAG      *AcpiGbl_ResourceTags[] =
  493 {
  494     /* Small descriptors */
  495 
  496     NULL,                           /* 0x00, Reserved */
  497     NULL,                           /* 0x01, Reserved */
  498     NULL,                           /* 0x02, Reserved */
  499     NULL,                           /* 0x03, Reserved */
  500     AcpiDmIrqTags,                  /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */
  501     AcpiDmDmaTags,                  /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */
  502     NULL,                           /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
  503     NULL,                           /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
  504     AcpiDmIoTags,                   /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */
  505     AcpiDmFixedIoTags,              /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */
  506     AcpiDmFixedDmaTags,             /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */
  507     NULL,                           /* 0x0B, Reserved */
  508     NULL,                           /* 0x0C, Reserved */
  509     NULL,                           /* 0x0D, Reserved */
  510     NULL,                           /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */
  511     NULL,                           /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */
  512 
  513     /* Large descriptors */
  514 
  515     NULL,                           /* 0x00, Reserved */
  516     AcpiDmMemory24Tags,             /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */
  517     AcpiDmRegisterTags,             /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
  518     NULL,                           /* 0x03, Reserved */
  519     NULL,                           /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */
  520     AcpiDmMemory32Tags,             /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */
  521     AcpiDmFixedMemory32Tags,        /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */
  522     AcpiDmAddress32Tags,            /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */
  523     AcpiDmAddress16Tags,            /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */
  524     AcpiDmInterruptTags,            /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */
  525     AcpiDmAddress64Tags,            /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
  526     AcpiDmExtendedAddressTags,      /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
  527     NULL,                           /* 0x0C, ACPI_RESOURCE_NAME_GPIO - Use Subtype table below */
  528     AcpiDmPinFunctionTags,          /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
  529     NULL,                           /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use Subtype table below */
  530     AcpiDmPinConfigTags,            /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
  531     NULL,                           /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
  532     AcpiDmPinGroupFunctionTags,     /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
  533     AcpiDmPinConfigTags,            /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG - Same as PinConfig */
  534 };
  535 
  536 /* GPIO Subtypes */
  537 
  538 static const ACPI_RESOURCE_TAG      *AcpiGbl_GpioResourceTags[] =
  539 {
  540     AcpiDmGpioIntTags,              /* 0x00 Interrupt Connection */
  541     AcpiDmGpioIoTags                /* 0x01 I/O Connection */
  542 };
  543 
  544 /* Serial Bus Subtypes */
  545 
  546 static const ACPI_RESOURCE_TAG      *AcpiGbl_SerialResourceTags[] =
  547 {
  548     NULL,                           /* 0x00 Reserved */
  549     AcpiDmI2cSerialBusTags,         /* 0x01 I2C SerialBus */
  550     AcpiDmSpiSerialBusTags,         /* 0x02 SPI SerialBus */
  551     AcpiDmUartSerialBusTags,        /* 0x03 UART SerialBus */
  552     AcpiDmCsi2SerialBusTags         /* 0x04 CSI2 SerialBus */
  553 };
  554 
  555 /*
  556  * Globals used to generate unique resource descriptor names. We use names that
  557  * start with underscore and a prefix letter that is not used by other ACPI
  558  * reserved names. To this, we append hex 0x00 through 0xFF. These 5 prefixes
  559  * allow for 5*256 = 1280 unique names, probably sufficient for any single ASL
  560  * file. If this becomes too small, we can use alpha+numerals for a total
  561  * of 5*36*36 = 6480.
  562  */
  563 #define ACPI_NUM_RES_PREFIX     5
  564 
  565 static UINT32                   AcpiGbl_NextResourceId = 0;
  566 static UINT8                    AcpiGbl_NextPrefix = 0;
  567 static char                     AcpiGbl_Prefix[ACPI_NUM_RES_PREFIX] =
  568                                     {'Y','Z','J','K','X'};
  569 
  570 
  571 /*******************************************************************************
  572  *
  573  * FUNCTION:    AcpiDmCheckResourceReference
  574  *
  575  * PARAMETERS:  Op                  - Parse Op for the AML opcode
  576  *              WalkState           - Current walk state (with valid scope)
  577  *
  578  * RETURN:      None
  579  *
  580  * DESCRIPTION: Convert a reference to a resource descriptor to a symbolic
  581  *              reference if possible
  582  *
  583  * NOTE:        Bit index is used to transparently handle both resource bit
  584  *              fields and byte fields.
  585  *
  586  ******************************************************************************/
  587 
  588 void
  589 AcpiDmCheckResourceReference (
  590     ACPI_PARSE_OBJECT       *Op,
  591     ACPI_WALK_STATE         *WalkState)
  592 {
  593     ACPI_STATUS             Status;
  594     ACPI_PARSE_OBJECT       *BufferNameOp;
  595     ACPI_PARSE_OBJECT       *IndexOp;
  596     ACPI_NAMESPACE_NODE     *BufferNode;
  597     ACPI_NAMESPACE_NODE     *ResourceNode;
  598     const ACPI_OPCODE_INFO  *OpInfo;
  599     UINT32                  BitIndex;
  600 
  601 
  602     /* We are only interested in the CreateXxxxField opcodes */
  603 
  604     OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
  605     if (OpInfo->Type != AML_TYPE_CREATE_FIELD)
  606     {
  607         return;
  608     }
  609 
  610     /* Get the buffer term operand */
  611 
  612     BufferNameOp = AcpiPsGetDepthNext (NULL, Op);
  613 
  614     /* Must be a named buffer, not an arg or local or method call */
  615 
  616     if (BufferNameOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
  617     {
  618         return;
  619     }
  620 
  621     /* Get the Index term, must be an integer constant to convert */
  622 
  623     IndexOp = BufferNameOp->Common.Next;
  624 
  625     /* Major cheat: The Node field is also used for the Tag ptr. Clear it now */
  626 
  627     IndexOp->Common.Node = NULL;
  628 
  629     OpInfo = AcpiPsGetOpcodeInfo (IndexOp->Common.AmlOpcode);
  630     if (OpInfo->ObjectType != ACPI_TYPE_INTEGER)
  631     {
  632         return;
  633     }
  634 
  635     /* Get the bit offset of the descriptor within the buffer */
  636 
  637     if ((Op->Common.AmlOpcode == AML_CREATE_BIT_FIELD_OP) ||
  638         (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP))
  639     {
  640         /* Index operand is a bit offset */
  641 
  642         BitIndex = (UINT32) IndexOp->Common.Value.Integer;
  643     }
  644     else
  645     {
  646         /* Index operand is a byte offset, convert to bits */
  647 
  648         BitIndex = (UINT32) ACPI_MUL_8 (IndexOp->Common.Value.Integer);
  649     }
  650 
  651     /* Lookup the buffer in the namespace */
  652 
  653     Status = AcpiNsLookup (WalkState->ScopeInfo,
  654         BufferNameOp->Common.Value.String, ACPI_TYPE_BUFFER,
  655         ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState,
  656         &BufferNode);
  657     if (ACPI_FAILURE (Status))
  658     {
  659         return;
  660     }
  661 
  662     /* Validate object type, we must have a buffer */
  663 
  664     if (BufferNode->Type != ACPI_TYPE_BUFFER)
  665     {
  666         return;
  667     }
  668 
  669     /* Find the resource descriptor node corresponding to the index */
  670 
  671     ResourceNode = AcpiDmGetResourceNode (BufferNode, BitIndex);
  672     if (!ResourceNode)
  673     {
  674         return;
  675     }
  676 
  677     /* Translate the Index to a resource tag pathname */
  678 
  679     AcpiGetTagPathname (IndexOp, BufferNode, ResourceNode, BitIndex);
  680 }
  681 
  682 
  683 /*******************************************************************************
  684  *
  685  * FUNCTION:    AcpiDmGetResourceNode
  686  *
  687  * PARAMETERS:  BufferNode          - Node for the parent buffer
  688  *              BitIndex            - Index into the resource descriptor
  689  *
  690  * RETURN:      Namespace node for the resource descriptor. NULL if not found
  691  *
  692  * DESCRIPTION: Find a resource descriptor that corresponds to the bit index
  693  *
  694  ******************************************************************************/
  695 
  696 static ACPI_NAMESPACE_NODE *
  697 AcpiDmGetResourceNode (
  698     ACPI_NAMESPACE_NODE     *BufferNode,
  699     UINT32                  BitIndex)
  700 {
  701     ACPI_NAMESPACE_NODE     *Node;
  702     UINT32                  ByteIndex = ACPI_DIV_8 (BitIndex);
  703 
  704 
  705     /*
  706      * Child list contains an entry for each resource descriptor. Find
  707      * the descriptor that corresponds to the Index.
  708      *
  709      * If there are no children, this is not a resource template
  710      */
  711     Node = BufferNode->Child;
  712     while (Node)
  713     {
  714         /*
  715          * Check if the Index falls within this resource.
  716          *
  717          * Value contains the resource offset, Object contains the resource
  718          * length (both in bytes)
  719          */
  720         if ((ByteIndex >= Node->Value) &&
  721             (ByteIndex < (Node->Value + Node->Length)))
  722         {
  723             return (Node);
  724         }
  725 
  726         Node = Node->Peer;
  727     }
  728 
  729     return (NULL);
  730 }
  731 
  732 
  733 /*******************************************************************************
  734  *
  735  * FUNCTION:    AcpiGetTagPathname
  736  *
  737  * PARAMETERS:  BufferNode          - Node for the parent buffer
  738  *              ResourceNode        - Node for a resource descriptor
  739  *              BitIndex            - Index into the resource descriptor
  740  *
  741  * RETURN:      Full pathname for a resource tag. NULL if no match.
  742  *              Path is returned in AML (packed) format.
  743  *
  744  * DESCRIPTION: Convert a BitIndex into a symbolic resource tag (full pathname)
  745  *
  746  ******************************************************************************/
  747 
  748 static char *
  749 AcpiGetTagPathname (
  750     ACPI_PARSE_OBJECT       *IndexOp,
  751     ACPI_NAMESPACE_NODE     *BufferNode,
  752     ACPI_NAMESPACE_NODE     *ResourceNode,
  753     UINT32                  BitIndex)
  754 {
  755     ACPI_STATUS             Status;
  756     UINT32                  ResourceBitIndex;
  757     UINT8                   ResourceTableIndex;
  758     ACPI_SIZE               RequiredSize;
  759     char                    *Pathname;
  760     char                    *PathnameEnd;
  761     AML_RESOURCE            *Aml;
  762     ACPI_PARSE_OBJECT       *Op;
  763     char                    *InternalPath;
  764     char                    *Tag;
  765 
  766 
  767     /* Get the Op that contains the actual buffer data */
  768 
  769     Op = BufferNode->Op->Common.Value.Arg;
  770     Op = Op->Common.Next;
  771     if (!Op)
  772     {
  773         return (NULL);
  774     }
  775 
  776     /* Get the individual resource descriptor and validate it */
  777 
  778     Aml = ACPI_CAST_PTR (
  779         AML_RESOURCE, &Op->Named.Data[ResourceNode->Value]);
  780 
  781     Status = AcpiUtValidateResource (NULL, Aml, &ResourceTableIndex);
  782     if (ACPI_FAILURE (Status))
  783     {
  784         return (NULL);
  785     }
  786 
  787     /* Get offset into this descriptor (from offset into entire buffer) */
  788 
  789     ResourceBitIndex = BitIndex - ACPI_MUL_8 (ResourceNode->Value);
  790 
  791     /* Get the tag associated with this resource descriptor and offset */
  792 
  793     Tag = AcpiDmGetResourceTag (ResourceBitIndex, Aml, ResourceTableIndex);
  794     if (!Tag)
  795     {
  796         return (NULL);
  797     }
  798 
  799     /*
  800      * Now that we know that we have a reference that can be converted to a
  801      * symbol, change the name of the resource to a unique name.
  802      */
  803     AcpiDmUpdateResourceName (ResourceNode);
  804 
  805     /* Get the full pathname to the parent buffer */
  806 
  807     RequiredSize = AcpiNsBuildNormalizedPath (BufferNode, NULL, 0, FALSE);
  808     if (!RequiredSize)
  809     {
  810         return (NULL);
  811     }
  812 
  813     Pathname = ACPI_ALLOCATE_ZEROED (RequiredSize + ACPI_PATH_SEGMENT_LENGTH);
  814     if (!Pathname)
  815     {
  816         return (NULL);
  817     }
  818 
  819     (void) AcpiNsBuildNormalizedPath (BufferNode, Pathname,
  820         RequiredSize, FALSE);
  821 
  822     /*
  823      * Create the full path to the resource and tag by:
  824      *  1) Remove the buffer nameseg from the end of the pathname
  825      *  2) Append the resource descriptor nameseg
  826      *  3) Append a dot
  827      *  4) Append the field tag nameseg
  828      *
  829      * Always using the full path is a bit brute force, the path can be
  830      * often be optimized with carats (if the original buffer namepath is a
  831      * single nameseg). This doesn't really matter, because these paths do not
  832      * end up in the final compiled AML, it's just an appearance issue for the
  833      * disassembled code.
  834      */
  835     PathnameEnd = Pathname + (RequiredSize - ACPI_NAMESEG_SIZE - 1);
  836     ACPI_COPY_NAMESEG (PathnameEnd, ResourceNode->Name.Ascii);
  837 
  838     PathnameEnd += ACPI_NAMESEG_SIZE;
  839     *PathnameEnd = '.';
  840 
  841     PathnameEnd++;
  842     ACPI_COPY_NAMESEG (PathnameEnd, Tag);
  843 
  844     /* Internalize the namepath to AML format */
  845 
  846     Status = AcpiNsInternalizeName (Pathname, &InternalPath);
  847     ACPI_FREE (Pathname);
  848     if (ACPI_FAILURE (Status))
  849     {
  850         return (NULL);
  851     }
  852 
  853     /* Update the Op with the symbol */
  854 
  855     AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP);
  856     IndexOp->Common.Value.String = InternalPath;
  857 
  858     /*
  859      * We will need the tag later. Cheat by putting it in the Node field.
  860      * Note, Tag is a const that is part of a lookup table.
  861      */
  862     IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag);
  863     return (InternalPath);
  864 }
  865 
  866 
  867 /*******************************************************************************
  868  *
  869  * FUNCTION:    AcpiDmUpdateResourceName
  870  *
  871  * PARAMETERS:  ResourceNode        - Node for a resource descriptor
  872  *
  873  * RETURN:      Stores new name in the ResourceNode
  874  *
  875  * DESCRIPTION: Create a new, unique name for a resource descriptor. Used by
  876  *              both the disassembly of the descriptor itself and any symbolic
  877  *              references to the descriptor. Ignored if a unique name has
  878  *              already been assigned to the resource.
  879  *
  880  * NOTE: Single threaded, suitable for applications only!
  881  *
  882  ******************************************************************************/
  883 
  884 static void
  885 AcpiDmUpdateResourceName (
  886     ACPI_NAMESPACE_NODE     *ResourceNode)
  887 {
  888     char                    Name[ACPI_NAMESEG_SIZE];
  889 
  890 
  891     /* Ignore if a unique name has already been assigned */
  892 
  893     if (ResourceNode->Name.Integer != ACPI_DEFAULT_RESNAME)
  894     {
  895         return;
  896     }
  897 
  898     /* Generate a new ACPI name for the descriptor */
  899 
  900     Name[0] = '_';
  901     Name[1] = AcpiGbl_Prefix[AcpiGbl_NextPrefix];
  902     Name[2] = AcpiUtHexToAsciiChar ((UINT64) AcpiGbl_NextResourceId, 4);
  903     Name[3] = AcpiUtHexToAsciiChar ((UINT64) AcpiGbl_NextResourceId, 0);
  904 
  905     /* Update globals for next name */
  906 
  907     AcpiGbl_NextResourceId++;
  908     if (AcpiGbl_NextResourceId >= 256)
  909     {
  910         AcpiGbl_NextResourceId = 0;
  911         AcpiGbl_NextPrefix++;
  912 
  913         if (AcpiGbl_NextPrefix > ACPI_NUM_RES_PREFIX)
  914         {
  915             AcpiGbl_NextPrefix = 0;
  916         }
  917     }
  918 
  919     /* Change the resource descriptor name */
  920 
  921     ResourceNode->Name.Integer = *ACPI_CAST_PTR (UINT32, &Name[0]);
  922 }
  923 
  924 
  925 /*******************************************************************************
  926  *
  927  * FUNCTION:    AcpiDmGetResourceTag
  928  *
  929  * PARAMETERS:  BitIndex            - Index into the resource descriptor
  930  *              Resource            - Pointer to the raw resource data
  931  *              ResourceIndex       - Index corresponding to the resource type
  932  *
  933  * RETURN:      Pointer to the resource tag (ACPI_NAME). NULL if no match.
  934  *
  935  * DESCRIPTION: Convert a BitIndex into a symbolic resource tag.
  936  *
  937  * Note: ResourceIndex should be previously validated and guaranteed to ve
  938  *       valid.
  939  *
  940  ******************************************************************************/
  941 
  942 static char *
  943 AcpiDmGetResourceTag (
  944     UINT32                  BitIndex,
  945     AML_RESOURCE            *Resource,
  946     UINT8                   ResourceIndex)
  947 {
  948     const ACPI_RESOURCE_TAG *TagList;
  949     char                    *Tag = NULL;
  950 
  951 
  952     /* Get the tag list for this resource descriptor type */
  953 
  954     TagList = AcpiGbl_ResourceTags[ResourceIndex];
  955 
  956     /*
  957      * Handle descriptors that have multiple subtypes
  958      */
  959     switch (Resource->DescriptorType)
  960     {
  961     case ACPI_RESOURCE_NAME_ADDRESS16:
  962     case ACPI_RESOURCE_NAME_ADDRESS32:
  963     case ACPI_RESOURCE_NAME_ADDRESS64:
  964     case ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64:
  965         /*
  966          * Subtype differentiation is the flags.
  967          * Kindof brute force, but just blindly search for an index match
  968          */
  969         if (Resource->Address.ResourceType == ACPI_ADDRESS_TYPE_MEMORY_RANGE)
  970         {
  971             Tag = AcpiDmSearchTagList (BitIndex, AcpiDmMemoryFlagTags);
  972         }
  973         else if (Resource->Address.ResourceType == ACPI_ADDRESS_TYPE_IO_RANGE)
  974         {
  975             Tag = AcpiDmSearchTagList (BitIndex, AcpiDmIoFlagTags);
  976         }
  977 
  978         /* If we found a match, all done. Else, drop to normal search below */
  979 
  980         if (Tag)
  981         {
  982             return (Tag);
  983         }
  984         break;
  985 
  986     case ACPI_RESOURCE_NAME_GPIO:
  987 
  988         /* GPIO connection has 2 subtypes: Interrupt and I/O */
  989 
  990         if (Resource->Gpio.ConnectionType > AML_RESOURCE_MAX_GPIOTYPE)
  991         {
  992             return (NULL);
  993         }
  994 
  995         TagList = AcpiGbl_GpioResourceTags[Resource->Gpio.ConnectionType];
  996         break;
  997 
  998     case ACPI_RESOURCE_NAME_SERIAL_BUS:
  999 
 1000         /* SerialBus has 4 subtypes: I2C, SPI, UART, and CSI2 */
 1001 
 1002         if ((Resource->CommonSerialBus.Type == 0) ||
 1003             (Resource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE))
 1004         {
 1005             return (NULL);
 1006         }
 1007 
 1008         TagList = AcpiGbl_SerialResourceTags[Resource->CommonSerialBus.Type];
 1009         break;
 1010 
 1011     default:
 1012 
 1013         break;
 1014     }
 1015 
 1016     /* Search for a match against the BitIndex */
 1017 
 1018     if (TagList)
 1019     {
 1020         Tag = AcpiDmSearchTagList (BitIndex, TagList);
 1021     }
 1022 
 1023     return (Tag);
 1024 }
 1025 
 1026 
 1027 /*******************************************************************************
 1028  *
 1029  * FUNCTION:    AcpiDmSearchTagList
 1030  *
 1031  * PARAMETERS:  BitIndex            - Index into the resource descriptor
 1032  *              TagList             - List to search
 1033  *
 1034  * RETURN:      Pointer to a tag (ACPI_NAME). NULL if no match found.
 1035  *
 1036  * DESCRIPTION: Search a tag list for a match to the input BitIndex. Matches
 1037  *              a fixed offset to a symbolic resource tag name.
 1038  *
 1039  ******************************************************************************/
 1040 
 1041 static char *
 1042 AcpiDmSearchTagList (
 1043     UINT32                  BitIndex,
 1044     const ACPI_RESOURCE_TAG *TagList)
 1045 {
 1046 
 1047     /*
 1048      * Walk the null-terminated tag list to find a matching bit offset.
 1049      * We are looking for an exact match.
 1050      */
 1051     for ( ; TagList->Tag; TagList++)
 1052     {
 1053         if (BitIndex == TagList->BitIndex)
 1054         {
 1055             return (TagList->Tag);
 1056         }
 1057     }
 1058 
 1059     /* A matching offset was not found */
 1060 
 1061     return (NULL);
 1062 }
 1063 
 1064 
 1065 /*******************************************************************************
 1066  *
 1067  * FUNCTION:    AcpiDmFindResources
 1068  *
 1069  * PARAMETERS:  Root                - Root of the parse tree
 1070  *
 1071  * RETURN:      None
 1072  *
 1073  * DESCRIPTION: Add all ResourceTemplate declarations to the namespace. Each
 1074  *              resource descriptor in each template is given a node -- used
 1075  *              for later conversion of resource references to symbolic refs.
 1076  *
 1077  ******************************************************************************/
 1078 
 1079 void
 1080 AcpiDmFindResources (
 1081     ACPI_PARSE_OBJECT       *Root)
 1082 {
 1083     ACPI_PARSE_OBJECT       *Op = Root;
 1084     ACPI_PARSE_OBJECT       *Parent;
 1085 
 1086 
 1087     /* Walk the entire parse tree */
 1088 
 1089     while (Op)
 1090     {
 1091         /* We are interested in Buffer() declarations */
 1092 
 1093         if (Op->Common.AmlOpcode == AML_BUFFER_OP)
 1094         {
 1095             /* And only declarations of the form Name (XXXX, Buffer()... ) */
 1096 
 1097             Parent = Op->Common.Parent;
 1098             if (Parent->Common.AmlOpcode == AML_NAME_OP)
 1099             {
 1100                 /*
 1101                  * If the buffer is a resource template, add the individual
 1102                  * resource descriptors to the namespace, as children of the
 1103                  * buffer node.
 1104                  */
 1105                 if (ACPI_SUCCESS (AcpiDmIsResourceTemplate (NULL, Op)))
 1106                 {
 1107                     Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
 1108                     AcpiDmAddResourcesToNamespace (Parent->Common.Node, Op);
 1109                 }
 1110             }
 1111         }
 1112 
 1113         Op = AcpiPsGetDepthNext (Root, Op);
 1114     }
 1115 }
 1116 
 1117 
 1118 /*******************************************************************************
 1119  *
 1120  * FUNCTION:    AcpiDmAddResourcesToNamespace
 1121  *
 1122  * PARAMETERS:  BufferNode          - Node for the parent buffer
 1123  *              Op                  - Parse op for the buffer
 1124  *
 1125  * RETURN:      None
 1126  *
 1127  * DESCRIPTION: Add an entire resource template to the namespace. Each
 1128  *              resource descriptor is added as a namespace node.
 1129  *
 1130  ******************************************************************************/
 1131 
 1132 static void
 1133 AcpiDmAddResourcesToNamespace (
 1134     ACPI_NAMESPACE_NODE     *BufferNode,
 1135     ACPI_PARSE_OBJECT       *Op)
 1136 {
 1137     ACPI_PARSE_OBJECT       *NextOp;
 1138 
 1139 
 1140     /* Get to the ByteData list */
 1141 
 1142     NextOp = Op->Common.Value.Arg;
 1143     NextOp = NextOp->Common.Next;
 1144     if (!NextOp)
 1145     {
 1146         return;
 1147     }
 1148 
 1149     /* Set Node and Op to point to each other */
 1150 
 1151     BufferNode->Op = Op;
 1152     Op->Common.Node = BufferNode;
 1153 
 1154     /*
 1155      * Insert each resource into the namespace
 1156      * NextOp contains the Aml pointer and the Aml length
 1157      */
 1158     AcpiUtWalkAmlResources (NULL, (UINT8 *) NextOp->Named.Data,
 1159         (ACPI_SIZE) NextOp->Common.Value.Integer,
 1160         AcpiDmAddResourceToNamespace, (void **) BufferNode);
 1161 }
 1162 
 1163 
 1164 /*******************************************************************************
 1165  *
 1166  * FUNCTION:    AcpiDmAddResourceToNamespace
 1167  *
 1168  * PARAMETERS:  ACPI_WALK_AML_CALLBACK
 1169  *              BufferNode              - Node for the parent buffer
 1170  *
 1171  * RETURN:      Status
 1172  *
 1173  * DESCRIPTION: Add one resource descriptor to the namespace as a child of the
 1174  *              parent buffer. The same name is used for each descriptor. This
 1175  *              is changed later to a unique name if the resource is actually
 1176  *              referenced by an AML operator.
 1177  *
 1178  ******************************************************************************/
 1179 
 1180 static ACPI_STATUS
 1181 AcpiDmAddResourceToNamespace (
 1182     UINT8                   *Aml,
 1183     UINT32                  Length,
 1184     UINT32                  Offset,
 1185     UINT8                   ResourceIndex,
 1186     void                    **Context)
 1187 {
 1188     ACPI_STATUS             Status;
 1189     ACPI_GENERIC_STATE      ScopeInfo;
 1190     ACPI_NAMESPACE_NODE     *Node;
 1191 
 1192 
 1193     /* TBD: Don't need to add descriptors that have no tags defined? */
 1194 
 1195     /* Add the resource to the namespace, as child of the buffer */
 1196 
 1197     ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Context);
 1198     Status = AcpiNsLookup (&ScopeInfo, "_TMP", ACPI_TYPE_LOCAL_RESOURCE,
 1199         ACPI_IMODE_LOAD_PASS2,
 1200         ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_PREFIX_IS_SCOPE,
 1201         NULL, &Node);
 1202     if (ACPI_FAILURE (Status))
 1203     {
 1204         return (AE_OK);
 1205     }
 1206 
 1207     /* Set the name to the default, changed later if resource is referenced */
 1208 
 1209     Node->Name.Integer = ACPI_DEFAULT_RESNAME;
 1210 
 1211     /* Save the offset of the descriptor (within the original buffer) */
 1212 
 1213     Node->Value = Offset;
 1214     Node->Length = Length;
 1215     return (AE_OK);
 1216 }

Cache object: 204e3c5688c5557ed98184f44bf93e5a


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.