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 }; 255