1 /*******************************************************************************
   2  *
   3  * Module Name: rsio - IO and DMA resource descriptors
   4  *
   5  ******************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2014, 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 MERCHANTIBILITY 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 #define __RSIO_C__
  45 
  46 #include "acpi.h"
  47 #include "accommon.h"
  48 #include "acresrc.h"
  49 
  50 #define _COMPONENT          ACPI_RESOURCES
  51         ACPI_MODULE_NAME    ("rsio")
  52 
  53 
  54 /*******************************************************************************
  55  *
  56  * AcpiRsConvertIo
  57  *
  58  ******************************************************************************/
  59 
  60 ACPI_RSCONVERT_INFO     AcpiRsConvertIo[5] =
  61 {
  62     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_IO,
  63                         ACPI_RS_SIZE (ACPI_RESOURCE_IO),
  64                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertIo)},
  65 
  66     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_IO,
  67                         sizeof (AML_RESOURCE_IO),
  68                         0},
  69 
  70     /* Decode flag */
  71 
  72     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Io.IoDecode),
  73                         AML_OFFSET (Io.Flags),
  74                         0},
  75     /*
  76      * These fields are contiguous in both the source and destination:
  77      * Address Alignment
  78      * Length
  79      * Minimum Base Address
  80      * Maximum Base Address
  81      */
  82     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.Io.Alignment),
  83                         AML_OFFSET (Io.Alignment),
  84                         2},
  85 
  86     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.Io.Minimum),
  87                         AML_OFFSET (Io.Minimum),
  88                         2}
  89 };
  90 
  91 
  92 /*******************************************************************************
  93  *
  94  * AcpiRsConvertFixedIo
  95  *
  96  ******************************************************************************/
  97 
  98 ACPI_RSCONVERT_INFO     AcpiRsConvertFixedIo[4] =
  99 {
 100     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_FIXED_IO,
 101                         ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_IO),
 102                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedIo)},
 103 
 104     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_FIXED_IO,
 105                         sizeof (AML_RESOURCE_FIXED_IO),
 106                         0},
 107     /*
 108      * These fields are contiguous in both the source and destination:
 109      * Base Address
 110      * Length
 111      */
 112     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.FixedIo.AddressLength),
 113                         AML_OFFSET (FixedIo.AddressLength),
 114                         1},
 115 
 116     {ACPI_RSC_MOVE16,   ACPI_RS_OFFSET (Data.FixedIo.Address),
 117                         AML_OFFSET (FixedIo.Address),
 118                         1}
 119 };
 120 
 121 
 122 /*******************************************************************************
 123  *
 124  * AcpiRsConvertGenericReg
 125  *
 126  ******************************************************************************/
 127 
 128 ACPI_RSCONVERT_INFO     AcpiRsConvertGenericReg[4] =
 129 {
 130     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
 131                         ACPI_RS_SIZE (ACPI_RESOURCE_GENERIC_REGISTER),
 132                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertGenericReg)},
 133 
 134     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_GENERIC_REGISTER,
 135                         sizeof (AML_RESOURCE_GENERIC_REGISTER),
 136                         0},
 137     /*
 138      * These fields are contiguous in both the source and destination:
 139      * Address Space ID
 140      * Register Bit Width
 141      * Register Bit Offset
 142      * Access Size
 143      */
 144     {ACPI_RSC_MOVE8,    ACPI_RS_OFFSET (Data.GenericReg.SpaceId),
 145                         AML_OFFSET (GenericReg.AddressSpaceId),
 146                         4},
 147 
 148     /* Get the Register Address */
 149 
 150     {ACPI_RSC_MOVE64,   ACPI_RS_OFFSET (Data.GenericReg.Address),
 151                         AML_OFFSET (GenericReg.Address),
 152                         1}
 153 };
 154 
 155 
 156 /*******************************************************************************
 157  *
 158  * AcpiRsConvertEndDpf
 159  *
 160  ******************************************************************************/
 161 
 162 ACPI_RSCONVERT_INFO   AcpiRsConvertEndDpf[2] =
 163 {
 164     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_END_DEPENDENT,
 165                         ACPI_RS_SIZE_MIN,
 166                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndDpf)},
 167 
 168     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_END_DEPENDENT,
 169                         sizeof (AML_RESOURCE_END_DEPENDENT),
 170                         0}
 171 };
 172 
 173 
 174 /*******************************************************************************
 175  *
 176  * AcpiRsConvertEndTag
 177  *
 178  ******************************************************************************/
 179 
 180 ACPI_RSCONVERT_INFO   AcpiRsConvertEndTag[2] =
 181 {
 182     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_END_TAG,
 183                         ACPI_RS_SIZE_MIN,
 184                         ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndTag)},
 185 
 186     /*
 187      * Note: The checksum field is set to zero, meaning that the resource
 188      * data is treated as if the checksum operation succeeded.
 189      * (ACPI Spec 1.0b Section 6.4.2.8)
 190      */
 191     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_END_TAG,
 192                         sizeof (AML_RESOURCE_END_TAG),
 193                         0}
 194 };
 195 
 196 
 197 /*******************************************************************************
 198  *
 199  * AcpiRsGetStartDpf
 200  *
 201  ******************************************************************************/
 202 
 203 ACPI_RSCONVERT_INFO   AcpiRsGetStartDpf[6] =
 204 {
 205     {ACPI_RSC_INITGET,  ACPI_RESOURCE_TYPE_START_DEPENDENT,
 206                         ACPI_RS_SIZE (ACPI_RESOURCE_START_DEPENDENT),
 207                         ACPI_RSC_TABLE_SIZE (AcpiRsGetStartDpf)},
 208 
 209     /* Defaults for Compatibility and Performance priorities */
 210 
 211     {ACPI_RSC_SET8,     ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
 212                         ACPI_ACCEPTABLE_CONFIGURATION,
 213                         2},
 214 
 215     /* Get the descriptor length (0 or 1 for Start Dpf descriptor) */
 216 
 217     {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.DescriptorLength),
 218                         AML_OFFSET (StartDpf.DescriptorType),
 219                         0},
 220 
 221     /* All done if there is no flag byte present in the descriptor */
 222 
 223     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
 224 
 225     /* Flag byte is present, get the flags */
 226 
 227     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
 228                         AML_OFFSET (StartDpf.Flags),
 229                         0},
 230 
 231     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
 232                         AML_OFFSET (StartDpf.Flags),
 233                         2}
 234 };
 235 
 236 
 237 /*******************************************************************************
 238  *
 239  * AcpiRsSetStartDpf
 240  *
 241  ******************************************************************************/
 242 
 243 ACPI_RSCONVERT_INFO   AcpiRsSetStartDpf[10] =
 244 {
 245     /* Start with a default descriptor of length 1 */
 246 
 247     {ACPI_RSC_INITSET,  ACPI_RESOURCE_NAME_START_DEPENDENT,
 248                         sizeof (AML_RESOURCE_START_DEPENDENT),
 249                         ACPI_RSC_TABLE_SIZE (AcpiRsSetStartDpf)},
 250 
 251     /* Set the default flag values */
 252 
 253     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
 254                         AML_OFFSET (StartDpf.Flags),
 255                         0},
 256 
 257     {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
 258                         AML_OFFSET (StartDpf.Flags),
 259                         2},
 260     /*
 261      * All done if the output descriptor length is required to be 1
 262      * (i.e., optimization to 0 bytes cannot be attempted)
 263      */
 264     {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
 265                         ACPI_RS_OFFSET(Data.StartDpf.DescriptorLength),
 266                         1},
 267 
 268     /* Set length to 0 bytes (no flags byte) */
 269 
 270     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)},
 271 
 272     /*
 273      * All done if the output descriptor length is required to be 0.
 274      *
 275      * TBD: Perhaps we should check for error if input flags are not
 276      * compatible with a 0-byte descriptor.
 277      */
 278     {ACPI_RSC_EXIT_EQ,  ACPI_RSC_COMPARE_VALUE,
 279                         ACPI_RS_OFFSET(Data.StartDpf.DescriptorLength),
 280                         0},
 281 
 282     /* Reset length to 1 byte (descriptor with flags byte) */
 283 
 284     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT)},
 285 
 286 
 287     /*
 288      * All done if flags byte is necessary -- if either priority value
 289      * is not ACPI_ACCEPTABLE_CONFIGURATION
 290      */
 291     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
 292                         ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
 293                         ACPI_ACCEPTABLE_CONFIGURATION},
 294 
 295     {ACPI_RSC_EXIT_NE,  ACPI_RSC_COMPARE_VALUE,
 296                         ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
 297                         ACPI_ACCEPTABLE_CONFIGURATION},
 298 
 299     /* Flag byte is not necessary */
 300 
 301     {ACPI_RSC_LENGTH,   0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)}
 302 };