1 /****************************************************************************** 2 * 3 * Module Name: amlresrc.h - AML resource descriptors 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2014, 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 /* acpisrc:StructDefs -- for acpisrc conversion */ 45 46 #ifndef __AMLRESRC_H 47 #define __AMLRESRC_H 48 49 50 /* 51 * Resource descriptor tags, as defined in the ACPI specification. 52 * Used to symbolically reference fields within a descriptor. 53 */ 54 #define ACPI_RESTAG_ADDRESS "_ADR" 55 #define ACPI_RESTAG_ALIGNMENT "_ALN" 56 #define ACPI_RESTAG_ADDRESSSPACE "_ASI" 57 #define ACPI_RESTAG_ACCESSSIZE "_ASZ" 58 #define ACPI_RESTAG_TYPESPECIFICATTRIBUTES "_ATT" 59 #define ACPI_RESTAG_BASEADDRESS "_BAS" 60 #define ACPI_RESTAG_BUSMASTER "_BM_" /* Master(1), Slave(0) */ 61 #define ACPI_RESTAG_DEBOUNCETIME "_DBT" 62 #define ACPI_RESTAG_DECODE "_DEC" 63 #define ACPI_RESTAG_DEVICEPOLARITY "_DPL" 64 #define ACPI_RESTAG_DMA "_DMA" 65 #define ACPI_RESTAG_DMATYPE "_TYP" /* Compatible(0), A(1), B(2), F(3) */ 66 #define ACPI_RESTAG_DRIVESTRENGTH "_DRS" 67 #define ACPI_RESTAG_ENDIANNESS "_END" 68 #define ACPI_RESTAG_FLOWCONTROL "_FLC" 69 #define ACPI_RESTAG_GRANULARITY "_GRA" 70 #define ACPI_RESTAG_INTERRUPT "_INT" 71 #define ACPI_RESTAG_INTERRUPTLEVEL "_LL_" /* ActiveLo(1), ActiveHi(0) */ 72 #define ACPI_RESTAG_INTERRUPTSHARE "_SHR" /* Shareable(1), NoShare(0) */ 73 #define ACPI_RESTAG_INTERRUPTTYPE "_HE_" /* Edge(1), Level(0) */ 74 #define ACPI_RESTAG_IORESTRICTION "_IOR" 75 #define ACPI_RESTAG_LENGTH "_LEN" 76 #define ACPI_RESTAG_LINE "_LIN" 77 #define ACPI_RESTAG_MEMATTRIBUTES "_MTP" /* Memory(0), Reserved(1), ACPI(2), NVS(3) */ 78 #define ACPI_RESTAG_MEMTYPE "_MEM" /* NonCache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */ 79 #define ACPI_RESTAG_MAXADDR "_MAX" 80 #define ACPI_RESTAG_MINADDR "_MIN" 81 #define ACPI_RESTAG_MAXTYPE "_MAF" 82 #define ACPI_RESTAG_MINTYPE "_MIF" 83 #define ACPI_RESTAG_MODE "_MOD" 84 #define ACPI_RESTAG_PARITY "_PAR" 85 #define ACPI_RESTAG_PHASE "_PHA" 86 #define ACPI_RESTAG_PIN "_PIN" 87 #define ACPI_RESTAG_PINCONFIG "_PPI" 88 #define ACPI_RESTAG_POLARITY "_POL" 89 #define ACPI_RESTAG_REGISTERBITOFFSET "_RBO" 90 #define ACPI_RESTAG_REGISTERBITWIDTH "_RBW" 91 #define ACPI_RESTAG_RANGETYPE "_RNG" 92 #define ACPI_RESTAG_READWRITETYPE "_RW_" /* ReadOnly(0), Writeable (1) */ 93 #define ACPI_RESTAG_LENGTH_RX "_RXL" 94 #define ACPI_RESTAG_LENGTH_TX "_TXL" 95 #define ACPI_RESTAG_SLAVEMODE "_SLV" 96 #define ACPI_RESTAG_SPEED "_SPE" 97 #define ACPI_RESTAG_STOPBITS "_STB" 98 #define ACPI_RESTAG_TRANSLATION "_TRA" 99 #define ACPI_RESTAG_TRANSTYPE "_TRS" /* Sparse(1), Dense(0) */ 100 #define ACPI_RESTAG_TYPE "_TTP" /* Translation(1), Static (0) */ 101 #define ACPI_RESTAG_XFERTYPE "_SIZ" /* 8(0), 8And16(1), 16(2) */ 102 #define ACPI_RESTAG_VENDORDATA "_VEN" 103 104 105 /* Default sizes for "small" resource descriptors */ 106 107 #define ASL_RDESC_IRQ_SIZE 0x02 108 #define ASL_RDESC_DMA_SIZE 0x02 109 #define ASL_RDESC_ST_DEPEND_SIZE 0x00 110 #define ASL_RDESC_END_DEPEND_SIZE 0x00 111 #define ASL_RDESC_IO_SIZE 0x07 112 #define ASL_RDESC_FIXED_IO_SIZE 0x03 113 #define ASL_RDESC_FIXED_DMA_SIZE 0x05 114 #define ASL_RDESC_END_TAG_SIZE 0x01 115 116 117 typedef struct asl_resource_node 118 { 119 UINT32 BufferLength; 120 void *Buffer; 121 struct asl_resource_node *Next; 122 123 } ASL_RESOURCE_NODE; 124 125 126 /* Macros used to generate AML resource length fields */ 127 128 #define ACPI_AML_SIZE_LARGE(r) (sizeof (r) - sizeof (AML_RESOURCE_LARGE_HEADER)) 129 #define ACPI_AML_SIZE_SMALL(r) (sizeof (r) - sizeof (AML_RESOURCE_SMALL_HEADER)) 130 131 /* 132 * Resource descriptors defined in the ACPI specification. 133 * 134 * Packing/alignment must be BYTE because these descriptors 135 * are used to overlay the raw AML byte stream. 136 */ 137 #pragma pack(1) 138 139 /* 140 * SMALL descriptors 141 */ 142 #define AML_RESOURCE_SMALL_HEADER_COMMON \ 143 UINT8 DescriptorType; 144 145 typedef struct aml_resource_small_header 146 { 147 AML_RESOURCE_SMALL_HEADER_COMMON 148 149 } AML_RESOURCE_SMALL_HEADER; 150 151 152 typedef struct aml_resource_irq 153 { 154 AML_RESOURCE_SMALL_HEADER_COMMON 155 UINT16 IrqMask; 156 UINT8 Flags; 157 158 } AML_RESOURCE_IRQ; 159 160 161 typedef struct aml_resource_irq_noflags 162 { 163 AML_RESOURCE_SMALL_HEADER_COMMON 164 UINT16 IrqMask; 165 166 } AML_RESOURCE_IRQ_NOFLAGS; 167 168 169 typedef struct aml_resource_dma 170 { 171 AML_RESOURCE_SMALL_HEADER_COMMON 172 UINT8 DmaChannelMask; 173 UINT8 Flags; 174 175 } AML_RESOURCE_DMA; 176 177 178 typedef struct aml_resource_start_dependent 179 { 180 AML_RESOURCE_SMALL_HEADER_COMMON 181 UINT8 Flags; 182 183 } AML_RESOURCE_START_DEPENDENT; 184 185 186 typedef struct aml_resource_start_dependent_noprio 187 { 188 AML_RESOURCE_SMALL_HEADER_COMMON 189 190 } AML_RESOURCE_START_DEPENDENT_NOPRIO; 191 192 193 typedef struct aml_resource_end_dependent 194 { 195 AML_RESOURCE_SMALL_HEADER_COMMON 196 197 } AML_RESOURCE_END_DEPENDENT; 198 199 200 typedef struct aml_resource_io 201 { 202 AML_RESOURCE_SMALL_HEADER_COMMON 203 UINT8 Flags; 204 UINT16 Minimum; 205 UINT16 Maximum; 206 UINT8 Alignment; 207 UINT8 AddressLength; 208 209 } AML_RESOURCE_IO; 210 211 212 typedef struct aml_resource_fixed_io 213 { 214 AML_RESOURCE_SMALL_HEADER_COMMON 215 UINT16 Address; 216 UINT8 AddressLength; 217 218 } AML_RESOURCE_FIXED_IO; 219 220 221 typedef struct aml_resource_vendor_small 222 { 223 AML_RESOURCE_SMALL_HEADER_COMMON 224 225 } AML_RESOURCE_VENDOR_SMALL; 226 227 228 typedef struct aml_resource_end_tag 229 { 230 AML_RESOURCE_SMALL_HEADER_COMMON 231 UINT8 Checksum; 232 233 } AML_RESOURCE_END_TAG; 234 235 236 typedef struct aml_resource_fixed_dma 237 { 238 AML_RESOURCE_SMALL_HEADER_COMMON 239 UINT16 RequestLines; 240 UINT16 Channels; 241 UINT8 Width; 242 243 } AML_RESOURCE_FIXED_DMA; 244 245 246 /* 247 * LARGE descriptors 248 */ 249 #define AML_RESOURCE_LARGE_HEADER_COMMON \ 250 UINT8 DescriptorType;\ 251 UINT16 ResourceLength; 252 253 typedef struct aml_resource_large_header 254 { 255 AML_RESOURCE_LARGE_HEADER_COMMON 256 257 } AML_RESOURCE_LARGE_HEADER; 258 259 260 /* General Flags for address space resource descriptors */ 261 262 #define ACPI_RESOURCE_FLAG_DEC 2 263 #define ACPI_RESOURCE_FLAG_MIF 4 264 #define ACPI_RESOURCE_FLAG_MAF 8 265 266 typedef struct aml_resource_memory24 267 { 268 AML_RESOURCE_LARGE_HEADER_COMMON 269 UINT8 Flags; 270 UINT16 Minimum; 271 UINT16 Maximum; 272 UINT16 Alignment; 273 UINT16 AddressLength; 274 275 } AML_RESOURCE_MEMORY24; 276 277 278 typedef struct aml_resource_vendor_large 279 { 280 AML_RESOURCE_LARGE_HEADER_COMMON 281 282 } AML_RESOURCE_VENDOR_LARGE; 283 284 285 typedef struct aml_resource_memory32 286 { 287 AML_RESOURCE_LARGE_HEADER_COMMON 288 UINT8 Flags; 289 UINT32 Minimum; 290 UINT32 Maximum; 291 UINT32 Alignment; 292 UINT32 AddressLength; 293 294 } AML_RESOURCE_MEMORY32; 295 296 297 typedef struct aml_resource_fixed_memory32 298 { 299 AML_RESOURCE_LARGE_HEADER_COMMON 300 UINT8 Flags; 301 UINT32 Address; 302 UINT32 AddressLength; 303 304 } AML_RESOURCE_FIXED_MEMORY32; 305 306 307 #define AML_RESOURCE_ADDRESS_COMMON \ 308 UINT8 ResourceType; \ 309 UINT8 Flags; \ 310 UINT8 SpecificFlags; 311 312 313 typedef struct aml_resource_address 314 { 315 AML_RESOURCE_LARGE_HEADER_COMMON 316 AML_RESOURCE_ADDRESS_COMMON 317 318 } AML_RESOURCE_ADDRESS; 319 320 321 typedef struct aml_resource_extended_address64 322 { 323 AML_RESOURCE_LARGE_HEADER_COMMON 324 AML_RESOURCE_ADDRESS_COMMON 325 UINT8 RevisionID; 326 UINT8 Reserved; 327 UINT64 Granularity; 328 UINT64 Minimum; 329 UINT64 Maximum; 330 UINT64 TranslationOffset; 331 UINT64 AddressLength; 332 UINT64 TypeSpecific; 333 334 } AML_RESOURCE_EXTENDED_ADDRESS64; 335 336 #define AML_RESOURCE_EXTENDED_ADDRESS_REVISION 1 /* ACPI 3.0 */ 337 338 339 typedef struct aml_resource_address64 340 { 341 AML_RESOURCE_LARGE_HEADER_COMMON 342 AML_RESOURCE_ADDRESS_COMMON 343 UINT64 Granularity; 344 UINT64 Minimum; 345 UINT64 Maximum; 346 UINT64 TranslationOffset; 347 UINT64 AddressLength; 348 349 } AML_RESOURCE_ADDRESS64; 350 351 352 typedef struct aml_resource_address32 353 { 354 AML_RESOURCE_LARGE_HEADER_COMMON 355 AML_RESOURCE_ADDRESS_COMMON 356 UINT32 Granularity; 357 UINT32 Minimum; 358 UINT32 Maximum; 359 UINT32 TranslationOffset; 360 UINT32 AddressLength; 361 362 } AML_RESOURCE_ADDRESS32; 363 364 365 typedef struct aml_resource_address16 366 { 367 AML_RESOURCE_LARGE_HEADER_COMMON 368 AML_RESOURCE_ADDRESS_COMMON 369 UINT16 Granularity; 370 UINT16 Minimum; 371 UINT16 Maximum; 372 UINT16 TranslationOffset; 373 UINT16 AddressLength; 374 375 } AML_RESOURCE_ADDRESS16; 376 377 378 typedef struct aml_resource_extended_irq 379 { 380 AML_RESOURCE_LARGE_HEADER_COMMON 381 UINT8 Flags; 382 UINT8 InterruptCount; 383 UINT32 Interrupts[1]; 384 /* ResSourceIndex, ResSource optional fields follow */ 385 386 } AML_RESOURCE_EXTENDED_IRQ; 387 388 389 typedef struct aml_resource_generic_register 390 { 391 AML_RESOURCE_LARGE_HEADER_COMMON 392 UINT8 AddressSpaceId; 393 UINT8 BitWidth; 394 UINT8 BitOffset; 395 UINT8 AccessSize; /* ACPI 3.0, was previously Reserved */ 396 UINT64 Address; 397 398 } AML_RESOURCE_GENERIC_REGISTER; 399 400 401 /* Common descriptor for GpioInt and GpioIo (ACPI 5.0) */ 402 403 typedef struct aml_resource_gpio 404 { 405 AML_RESOURCE_LARGE_HEADER_COMMON 406 UINT8 RevisionId; 407 UINT8 ConnectionType; 408 UINT16 Flags; 409 UINT16 IntFlags; 410 UINT8 PinConfig; 411 UINT16 DriveStrength; 412 UINT16 DebounceTimeout; 413 UINT16 PinTableOffset; 414 UINT8 ResSourceIndex; 415 UINT16 ResSourceOffset; 416 UINT16 VendorOffset; 417 UINT16 VendorLength; 418 /* 419 * Optional fields follow immediately: 420 * 1) PIN list (Words) 421 * 2) Resource Source String 422 * 3) Vendor Data bytes 423 */ 424 425 } AML_RESOURCE_GPIO; 426 427 #define AML_RESOURCE_GPIO_REVISION 1 /* ACPI 5.0 */ 428 429 /* Values for ConnectionType above */ 430 431 #define AML_RESOURCE_GPIO_TYPE_INT 0 432 #define AML_RESOURCE_GPIO_TYPE_IO 1 433 #define AML_RESOURCE_MAX_GPIOTYPE 1 434 435 436 /* Common preamble for all serial descriptors (ACPI 5.0) */ 437 438 #define AML_RESOURCE_SERIAL_COMMON \ 439 UINT8 RevisionId; \ 440 UINT8 ResSourceIndex; \ 441 UINT8 Type; \ 442 UINT8 Flags; \ 443 UINT16 TypeSpecificFlags; \ 444 UINT8 TypeRevisionId; \ 445 UINT16 TypeDataLength; \ 446 447 /* Values for the type field above */ 448 449 #define AML_RESOURCE_I2C_SERIALBUSTYPE 1 450 #define AML_RESOURCE_SPI_SERIALBUSTYPE 2 451 #define AML_RESOURCE_UART_SERIALBUSTYPE 3 452 #define AML_RESOURCE_MAX_SERIALBUSTYPE 3 453 #define AML_RESOURCE_VENDOR_SERIALBUSTYPE 192 /* Vendor defined is 0xC0-0xFF (NOT SUPPORTED) */ 454 455 typedef struct aml_resource_common_serialbus 456 { 457 AML_RESOURCE_LARGE_HEADER_COMMON 458 AML_RESOURCE_SERIAL_COMMON 459 460 } AML_RESOURCE_COMMON_SERIALBUS; 461 462 typedef struct aml_resource_i2c_serialbus 463 { 464 AML_RESOURCE_LARGE_HEADER_COMMON 465 AML_RESOURCE_SERIAL_COMMON 466 UINT32 ConnectionSpeed; 467 UINT16 SlaveAddress; 468 /* 469 * Optional fields follow immediately: 470 * 1) Vendor Data bytes 471 * 2) Resource Source String 472 */ 473 474 } AML_RESOURCE_I2C_SERIALBUS; 475 476 #define AML_RESOURCE_I2C_REVISION 1 /* ACPI 5.0 */ 477 #define AML_RESOURCE_I2C_TYPE_REVISION 1 /* ACPI 5.0 */ 478 #define AML_RESOURCE_I2C_MIN_DATA_LEN 6 479 480 typedef struct aml_resource_spi_serialbus 481 { 482 AML_RESOURCE_LARGE_HEADER_COMMON 483 AML_RESOURCE_SERIAL_COMMON 484 UINT32 ConnectionSpeed; 485 UINT8 DataBitLength; 486 UINT8 ClockPhase; 487 UINT8 ClockPolarity; 488 UINT16 DeviceSelection; 489 /* 490 * Optional fields follow immediately: 491 * 1) Vendor Data bytes 492 * 2) Resource Source String 493 */ 494 495 } AML_RESOURCE_SPI_SERIALBUS; 496 497 #define AML_RESOURCE_SPI_REVISION 1 /* ACPI 5.0 */ 498 #define AML_RESOURCE_SPI_TYPE_REVISION 1 /* ACPI 5.0 */ 499 #define AML_RESOURCE_SPI_MIN_DATA_LEN 9 500 501 502 typedef struct aml_resource_uart_serialbus 503 { 504 AML_RESOURCE_LARGE_HEADER_COMMON 505 AML_RESOURCE_SERIAL_COMMON 506 UINT32 DefaultBaudRate; 507 UINT16 RxFifoSize; 508 UINT16 TxFifoSize; 509 UINT8 Parity; 510 UINT8 LinesEnabled; 511 /* 512 * Optional fields follow immediately: 513 * 1) Vendor Data bytes 514 * 2) Resource Source String 515 */ 516 517 } AML_RESOURCE_UART_SERIALBUS; 518 519 #define AML_RESOURCE_UART_REVISION 1 /* ACPI 5.0 */ 520 #define AML_RESOURCE_UART_TYPE_REVISION 1 /* ACPI 5.0 */ 521 #define AML_RESOURCE_UART_MIN_DATA_LEN 10 522 523 524 /* restore default alignment */ 525 526 #pragma pack() 527 528 /* Union of all resource descriptors, so we can allocate the worst case */ 529 530 typedef union aml_resource 531 { 532 /* Descriptor headers */ 533 534 UINT8 DescriptorType; 535 AML_RESOURCE_SMALL_HEADER SmallHeader; 536 AML_RESOURCE_LARGE_HEADER LargeHeader; 537 538 /* Small resource descriptors */ 539 540 AML_RESOURCE_IRQ Irq; 541 AML_RESOURCE_DMA Dma; 542 AML_RESOURCE_START_DEPENDENT StartDpf; 543 AML_RESOURCE_END_DEPENDENT EndDpf; 544 AML_RESOURCE_IO Io; 545 AML_RESOURCE_FIXED_IO FixedIo; 546 AML_RESOURCE_FIXED_DMA FixedDma; 547 AML_RESOURCE_VENDOR_SMALL VendorSmall; 548 AML_RESOURCE_END_TAG EndTag; 549 550 /* Large resource descriptors */ 551 552 AML_RESOURCE_MEMORY24 Memory24; 553 AML_RESOURCE_GENERIC_REGISTER GenericReg; 554 AML_RESOURCE_VENDOR_LARGE VendorLarge; 555 AML_RESOURCE_MEMORY32 Memory32; 556 AML_RESOURCE_FIXED_MEMORY32 FixedMemory32; 557 AML_RESOURCE_ADDRESS16 Address16; 558 AML_RESOURCE_ADDRESS32 Address32; 559 AML_RESOURCE_ADDRESS64 Address64; 560 AML_RESOURCE_EXTENDED_ADDRESS64 ExtAddress64; 561 AML_RESOURCE_EXTENDED_IRQ ExtendedIrq; 562 AML_RESOURCE_GPIO Gpio; 563 AML_RESOURCE_I2C_SERIALBUS I2cSerialBus; 564 AML_RESOURCE_SPI_SERIALBUS SpiSerialBus; 565 AML_RESOURCE_UART_SERIALBUS UartSerialBus; 566 AML_RESOURCE_COMMON_SERIALBUS CommonSerialBus; 567 568 /* Utility overlays */ 569 570 AML_RESOURCE_ADDRESS Address; 571 UINT32 DwordItem; 572 UINT16 WordItem; 573 UINT8 ByteItem; 574 575 } AML_RESOURCE; 576 577 #endif