root/drivers/acpi/acpica/rsio.c

/* [<][>][^][v][top][bottom][index][help] */
   1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
   2 /*******************************************************************************
   3  *
   4  * Module Name: rsio - IO and DMA resource descriptors
   5  *
   6  ******************************************************************************/
   7 
   8 #include <acpi/acpi.h>
   9 #include "accommon.h"
  10 #include "acresrc.h"
  11 
  12 #define _COMPONENT          ACPI_RESOURCES
  13 ACPI_MODULE_NAME("rsio")
  14 
  15 /*******************************************************************************
  16  *
  17  * acpi_rs_convert_io
  18  *
  19  ******************************************************************************/
  20 struct acpi_rsconvert_info acpi_rs_convert_io[5] = {
  21         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO,
  22          ACPI_RS_SIZE(struct acpi_resource_io),
  23          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_io)},
  24 
  25         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO,
  26          sizeof(struct aml_resource_io),
  27          0},
  28 
  29         /* Decode flag */
  30 
  31         {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.io.io_decode),
  32          AML_OFFSET(io.flags),
  33          0},
  34         /*
  35          * These fields are contiguous in both the source and destination:
  36          * Address Alignment
  37          * Length
  38          * Minimum Base Address
  39          * Maximum Base Address
  40          */
  41         {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.io.alignment),
  42          AML_OFFSET(io.alignment),
  43          2},
  44 
  45         {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.io.minimum),
  46          AML_OFFSET(io.minimum),
  47          2}
  48 };
  49 
  50 /*******************************************************************************
  51  *
  52  * acpi_rs_convert_fixed_io
  53  *
  54  ******************************************************************************/
  55 
  56 struct acpi_rsconvert_info acpi_rs_convert_fixed_io[4] = {
  57         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO,
  58          ACPI_RS_SIZE(struct acpi_resource_fixed_io),
  59          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_fixed_io)},
  60 
  61         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO,
  62          sizeof(struct aml_resource_fixed_io),
  63          0},
  64         /*
  65          * These fields are contiguous in both the source and destination:
  66          * Base Address
  67          * Length
  68          */
  69         {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_io.address_length),
  70          AML_OFFSET(fixed_io.address_length),
  71          1},
  72 
  73         {ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_io.address),
  74          AML_OFFSET(fixed_io.address),
  75          1}
  76 };
  77 
  78 /*******************************************************************************
  79  *
  80  * acpi_rs_convert_generic_reg
  81  *
  82  ******************************************************************************/
  83 
  84 struct acpi_rsconvert_info acpi_rs_convert_generic_reg[4] = {
  85         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
  86          ACPI_RS_SIZE(struct acpi_resource_generic_register),
  87          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_generic_reg)},
  88 
  89         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER,
  90          sizeof(struct aml_resource_generic_register),
  91          0},
  92         /*
  93          * These fields are contiguous in both the source and destination:
  94          * Address Space ID
  95          * Register Bit Width
  96          * Register Bit Offset
  97          * Access Size
  98          */
  99         {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.generic_reg.space_id),
 100          AML_OFFSET(generic_reg.address_space_id),
 101          4},
 102 
 103         /* Get the Register Address */
 104 
 105         {ACPI_RSC_MOVE64, ACPI_RS_OFFSET(data.generic_reg.address),
 106          AML_OFFSET(generic_reg.address),
 107          1}
 108 };
 109 
 110 /*******************************************************************************
 111  *
 112  * acpi_rs_convert_end_dpf
 113  *
 114  ******************************************************************************/
 115 
 116 struct acpi_rsconvert_info acpi_rs_convert_end_dpf[2] = {
 117         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT,
 118          ACPI_RS_SIZE_MIN,
 119          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_dpf)},
 120 
 121         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT,
 122          sizeof(struct aml_resource_end_dependent),
 123          0}
 124 };
 125 
 126 /*******************************************************************************
 127  *
 128  * acpi_rs_convert_end_tag
 129  *
 130  ******************************************************************************/
 131 
 132 struct acpi_rsconvert_info acpi_rs_convert_end_tag[2] = {
 133         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG,
 134          ACPI_RS_SIZE_MIN,
 135          ACPI_RSC_TABLE_SIZE(acpi_rs_convert_end_tag)},
 136 
 137         /*
 138          * Note: The checksum field is set to zero, meaning that the resource
 139          * data is treated as if the checksum operation succeeded.
 140          * (ACPI Spec 1.0b Section 6.4.2.8)
 141          */
 142         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG,
 143          sizeof(struct aml_resource_end_tag),
 144          0}
 145 };
 146 
 147 /*******************************************************************************
 148  *
 149  * acpi_rs_get_start_dpf
 150  *
 151  ******************************************************************************/
 152 
 153 struct acpi_rsconvert_info acpi_rs_get_start_dpf[6] = {
 154         {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT,
 155          ACPI_RS_SIZE(struct acpi_resource_start_dependent),
 156          ACPI_RSC_TABLE_SIZE(acpi_rs_get_start_dpf)},
 157 
 158         /* Defaults for Compatibility and Performance priorities */
 159 
 160         {ACPI_RSC_SET8, ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
 161          ACPI_ACCEPTABLE_CONFIGURATION,
 162          2},
 163 
 164         /* Get the descriptor length (0 or 1 for Start Dpf descriptor) */
 165 
 166         {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
 167          AML_OFFSET(start_dpf.descriptor_type),
 168          0},
 169 
 170         /* All done if there is no flag byte present in the descriptor */
 171 
 172         {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
 173 
 174         /* Flag byte is present, get the flags */
 175 
 176         {ACPI_RSC_2BITFLAG,
 177          ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
 178          AML_OFFSET(start_dpf.flags),
 179          0},
 180 
 181         {ACPI_RSC_2BITFLAG,
 182          ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
 183          AML_OFFSET(start_dpf.flags),
 184          2}
 185 };
 186 
 187 /*******************************************************************************
 188  *
 189  * acpi_rs_set_start_dpf
 190  *
 191  ******************************************************************************/
 192 
 193 struct acpi_rsconvert_info acpi_rs_set_start_dpf[10] = {
 194         /* Start with a default descriptor of length 1 */
 195 
 196         {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT,
 197          sizeof(struct aml_resource_start_dependent),
 198          ACPI_RSC_TABLE_SIZE(acpi_rs_set_start_dpf)},
 199 
 200         /* Set the default flag values */
 201 
 202         {ACPI_RSC_2BITFLAG,
 203          ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
 204          AML_OFFSET(start_dpf.flags),
 205          0},
 206 
 207         {ACPI_RSC_2BITFLAG,
 208          ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
 209          AML_OFFSET(start_dpf.flags),
 210          2},
 211         /*
 212          * All done if the output descriptor length is required to be 1
 213          * (i.e., optimization to 0 bytes cannot be attempted)
 214          */
 215         {ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE,
 216          ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
 217          1},
 218 
 219         /* Set length to 0 bytes (no flags byte) */
 220 
 221         {ACPI_RSC_LENGTH, 0, 0,
 222          sizeof(struct aml_resource_start_dependent_noprio)},
 223 
 224         /*
 225          * All done if the output descriptor length is required to be 0.
 226          *
 227          * TBD: Perhaps we should check for error if input flags are not
 228          * compatible with a 0-byte descriptor.
 229          */
 230         {ACPI_RSC_EXIT_EQ, ACPI_RSC_COMPARE_VALUE,
 231          ACPI_RS_OFFSET(data.start_dpf.descriptor_length),
 232          0},
 233 
 234         /* Reset length to 1 byte (descriptor with flags byte) */
 235 
 236         {ACPI_RSC_LENGTH, 0, 0, sizeof(struct aml_resource_start_dependent)},
 237 
 238         /*
 239          * All done if flags byte is necessary -- if either priority value
 240          * is not ACPI_ACCEPTABLE_CONFIGURATION
 241          */
 242         {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
 243          ACPI_RS_OFFSET(data.start_dpf.compatibility_priority),
 244          ACPI_ACCEPTABLE_CONFIGURATION},
 245 
 246         {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
 247          ACPI_RS_OFFSET(data.start_dpf.performance_robustness),
 248          ACPI_ACCEPTABLE_CONFIGURATION},
 249 
 250         /* Flag byte is not necessary */
 251 
 252         {ACPI_RSC_LENGTH, 0, 0,
 253          sizeof(struct aml_resource_start_dependent_noprio)}
 254 };

/* [<][>][^][v][top][bottom][index][help] */