Home | History | Annotate | Line # | Download | only in resources
      1 /*******************************************************************************
      2  *
      3  * Module Name: rsio - IO and DMA resource descriptors
      4  *
      5  ******************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2025, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include "acpi.h"
     45 #include "accommon.h"
     46 #include "acresrc.h"
     47 
     48 #define _COMPONENT          ACPI_RESOURCES
     49         ACPI_MODULE_NAME    ("rsio")
     50 
     51 
     52 /*******************************************************************************
     53  *
     54  * AcpiRsConvertIo
     55  *
     56  ******************************************************************************/
     57 
     58 ACPI_RSCONVERT_INFO     AcpiRsConvertIo[5] =
     59 {
     60     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_IO,
     61                         ACPI_RS_SIZE (ACPI_RESOURCE_IO),
     62                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertIo)},
     63 
     64     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_IO,
     65                         sizeof (AML_RESOURCE_IO),
     66                         0},
     67 
     68     /* Decode flag */
     69 
     70     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Io.IoDecode),
     71                         AML_OFFSET (Io.Flags),
     72                         0},
     73     /*
     74      * These fields are contiguous in both the source and destination:
     75      * Address Alignment
     76      * Length
     77      * Minimum Base Address
     78      * Maximum Base Address
     79      */
     80     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Io.Alignment),
     81                         AML_OFFSET (Io.Alignment),
     82                         2},
     83 
     84     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.Io.Minimum),
     85                         AML_OFFSET (Io.Minimum),
     86                         2}
     87 };
     88 
     89 
     90 /*******************************************************************************
     91  *
     92  * AcpiRsConvertFixedIo
     93  *
     94  ******************************************************************************/
     95 
     96 ACPI_RSCONVERT_INFO     AcpiRsConvertFixedIo[4] =
     97 {
     98     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_FIXED_IO,
     99                         ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_IO),
    100                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedIo)},
    101 
    102     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_FIXED_IO,
    103                         sizeof (AML_RESOURCE_FIXED_IO),
    104                         0},
    105     /*
    106      * These fields are contiguous in both the source and destination:
    107      * Base Address
    108      * Length
    109      */
    110     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.FixedIo.AddressLength),
    111                         AML_OFFSET (FixedIo.AddressLength),
    112                         1},
    113 
    114     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.FixedIo.Address),
    115                         AML_OFFSET (FixedIo.Address),
    116                         1}
    117 };
    118 
    119 
    120 /*******************************************************************************
    121  *
    122  * AcpiRsConvertGenericReg
    123  *
    124  ******************************************************************************/
    125 
    126 ACPI_RSCONVERT_INFO     AcpiRsConvertGenericReg[4] =
    127 {
    128     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
    129                         ACPI_RS_SIZE (ACPI_RESOURCE_GENERIC_REGISTER),
    130                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertGenericReg)},
    131 
    132     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_GENERIC_REGISTER,
    133                         sizeof (AML_RESOURCE_GENERIC_REGISTER),
    134                         0},
    135     /*
    136      * These fields are contiguous in both the source and destination:
    137      * Address Space ID
    138      * Register Bit Width
    139      * Register Bit Offset
    140      * Access Size
    141      */
    142     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.GenericReg.SpaceId),
    143                         AML_OFFSET (GenericReg.AddressSpaceId),
    144                         4},
    145 
    146     /* Get the Register Address */
    147 
    148     {ACPI_RSC_MOVE64,   ACPI_RS_OFFSET (Data.GenericReg.Address),
    149                         AML_OFFSET (GenericReg.Address),
    150                         1}
    151 };
    152 
    153 
    154 /*******************************************************************************
    155  *
    156  * AcpiRsConvertEndDpf
    157  *
    158  ******************************************************************************/
    159 
    160 ACPI_RSCONVERT_INFO   AcpiRsConvertEndDpf[2] =
    161 {
    162     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_END_DEPENDENT,
    163                         ACPI_RS_SIZE_MIN,
    164                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndDpf)},
    165 
    166     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_END_DEPENDENT,
    167                         sizeof (AML_RESOURCE_END_DEPENDENT),
    168                         0}
    169 };
    170 
    171 
    172 /*******************************************************************************
    173  *
    174  * AcpiRsConvertEndTag
    175  *
    176  ******************************************************************************/
    177 
    178 ACPI_RSCONVERT_INFO   AcpiRsConvertEndTag[2] =
    179 {
    180     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_END_TAG,
    181                         ACPI_RS_SIZE_MIN,
    182                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndTag)},
    183 
    184     /*
    185      * Note: The checksum field is set to zero, meaning that the resource
    186      * data is treated as if the checksum operation succeeded.
    187      * (ACPI Spec 1.0b Section 6.4.2.8)
    188      */
    189     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_END_TAG,
    190                         sizeof (AML_RESOURCE_END_TAG),
    191                         0}
    192 };
    193 
    194 
    195 /*******************************************************************************
    196  *
    197  * AcpiRsGetStartDpf
    198  *
    199  ******************************************************************************/
    200 
    201 ACPI_RSCONVERT_INFO   AcpiRsGetStartDpf[6] =
    202 {
    203     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_START_DEPENDENT,
    204                         ACPI_RS_SIZE (ACPI_RESOURCE_START_DEPENDENT),
    205                         ACPI_RSC_TABLE_SIZE (AcpiRsGetStartDpf)},
    206 
    207     /* Defaults for Compatibility and Performance priorities */
    208 
    209     {ACPI_RSC_SET8,     ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
    210                         ACPI_ACCEPTABLE_CONFIGURATION,
    211                         2},
    212 
    213     /* Get the descriptor length (0 or 1 for Start Dpf descriptor) */
    214 
    215     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.DescriptorLength),
    216                         AML_OFFSET (StartDpf.DescriptorType),
    217                         0},
    218 
    219     /* All done if there is no flag byte present in the descriptor */
    220 
    221     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
    222 
    223     /* Flag byte is present, get the flags */
    224 
    225     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
    226                         AML_OFFSET (StartDpf.Flags),
    227                         0},
    228 
    229     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
    230                         AML_OFFSET (StartDpf.Flags),
    231                         2}
    232 };
    233 
    234 
    235 /*******************************************************************************
    236  *
    237  * AcpiRsSetStartDpf
    238  *
    239  ******************************************************************************/
    240 
    241 ACPI_RSCONVERT_INFO   AcpiRsSetStartDpf[10] =
    242 {
    243     /* Start with a default descriptor of length 1 */
    244 
    245     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_START_DEPENDENT,
    246                         sizeof (AML_RESOURCE_START_DEPENDENT),
    247                         ACPI_RSC_TABLE_SIZE (AcpiRsSetStartDpf)},
    248 
    249     /* Set the default flag values */
    250 
    251     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
    252                         AML_OFFSET (StartDpf.Flags),
    253                         0},
    254 
    255     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
    256                         AML_OFFSET (StartDpf.Flags),
    257                         2},
    258     /*
    259      * All done if the output descriptor length is required to be 1
    260      * (i.e., optimization to 0 bytes cannot be attempted)
    261      */
    262     {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
    263                         ACPI_RS_OFFSET(Data.StartDpf.DescriptorLength),
    264                         1},
    265 
    266     /* Set length to 0 bytes (no flags byte) */
    267 
    268     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)},
    269 
    270     /*
    271      * All done if the output descriptor length is required to be 0.
    272      *
    273      * TBD: Perhaps we should check for error if input flags are not
    274      * compatible with a 0-byte descriptor.
    275      */
    276     {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
    277                         ACPI_RS_OFFSET(Data.StartDpf.DescriptorLength),
    278                         0},
    279 
    280     /* Reset length to 1 byte (descriptor with flags byte) */
    281 
    282     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT)},
    283 
    284 
    285     /*
    286      * All done if flags byte is necessary -- if either priority value
    287      * is not ACPI_ACCEPTABLE_CONFIGURATION
    288      */
    289     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
    290                         ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
    291                         ACPI_ACCEPTABLE_CONFIGURATION},
    292 
    293     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
    294                         ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
    295                         ACPI_ACCEPTABLE_CONFIGURATION},
    296 
    297     /* Flag byte is not necessary */
    298 
    299     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)}
    300 };
    301