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