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