255 lines · c
1// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.02/*******************************************************************************3 *4 * Module Name: rsio - IO and DMA resource descriptors5 *6 ******************************************************************************/7 8#include <acpi/acpi.h>9#include "accommon.h"10#include "acresrc.h"11 12#define _COMPONENT ACPI_RESOURCES13ACPI_MODULE_NAME("rsio")14 15/*******************************************************************************16 *17 * acpi_rs_convert_io18 *19 ******************************************************************************/20struct 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 Alignment37 * Length38 * Minimum Base Address39 * Maximum Base Address40 */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_io53 *54 ******************************************************************************/55 56struct 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 Address67 * Length68 */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_reg81 *82 ******************************************************************************/83 84struct 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 ID95 * Register Bit Width96 * Register Bit Offset97 * Access Size98 */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_dpf113 *114 ******************************************************************************/115 116struct 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_tag129 *130 ******************************************************************************/131 132struct 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 resource139 * 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_dpf150 *151 ******************************************************************************/152 153struct 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_dpf190 *191 ******************************************************************************/192 193struct 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 1213 * (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 not228 * 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 value240 * is not ACPI_ACCEPTABLE_CONFIGURATION241 */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};255