amlresrc.h revision 306536
1/****************************************************************************** 2 * 3 * Module Name: amlresrc.h - AML resource descriptors 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2016, 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 117typedef struct asl_resource_node 118{ 119 UINT32 BufferLength; 120 void *Buffer; 121 struct asl_resource_node *Next; 122 123} ASL_RESOURCE_NODE; 124 125typedef struct asl_resource_info 126{ 127 ACPI_PARSE_OBJECT *DescriptorTypeOp; /* Resource descriptor parse node */ 128 ACPI_PARSE_OBJECT *MappingOp; /* Used for mapfile support */ 129 UINT32 CurrentByteOffset; /* Offset in resource template */ 130 131} ASL_RESOURCE_INFO; 132 133 134/* Macros used to generate AML resource length fields */ 135 136#define ACPI_AML_SIZE_LARGE(r) (sizeof (r) - sizeof (AML_RESOURCE_LARGE_HEADER)) 137#define ACPI_AML_SIZE_SMALL(r) (sizeof (r) - sizeof (AML_RESOURCE_SMALL_HEADER)) 138 139/* 140 * Resource descriptors defined in the ACPI specification. 141 * 142 * Packing/alignment must be BYTE because these descriptors 143 * are used to overlay the raw AML byte stream. 144 */ 145#pragma pack(1) 146 147/* 148 * SMALL descriptors 149 */ 150#define AML_RESOURCE_SMALL_HEADER_COMMON \ 151 UINT8 DescriptorType; 152 153typedef struct aml_resource_small_header 154{ 155 AML_RESOURCE_SMALL_HEADER_COMMON 156 157} AML_RESOURCE_SMALL_HEADER; 158 159 160typedef struct aml_resource_irq 161{ 162 AML_RESOURCE_SMALL_HEADER_COMMON 163 UINT16 IrqMask; 164 UINT8 Flags; 165 166} AML_RESOURCE_IRQ; 167 168 169typedef struct aml_resource_irq_noflags 170{ 171 AML_RESOURCE_SMALL_HEADER_COMMON 172 UINT16 IrqMask; 173 174} AML_RESOURCE_IRQ_NOFLAGS; 175 176 177typedef struct aml_resource_dma 178{ 179 AML_RESOURCE_SMALL_HEADER_COMMON 180 UINT8 DmaChannelMask; 181 UINT8 Flags; 182 183} AML_RESOURCE_DMA; 184 185 186typedef struct aml_resource_start_dependent 187{ 188 AML_RESOURCE_SMALL_HEADER_COMMON 189 UINT8 Flags; 190 191} AML_RESOURCE_START_DEPENDENT; 192 193 194typedef struct aml_resource_start_dependent_noprio 195{ 196 AML_RESOURCE_SMALL_HEADER_COMMON 197 198} AML_RESOURCE_START_DEPENDENT_NOPRIO; 199 200 201typedef struct aml_resource_end_dependent 202{ 203 AML_RESOURCE_SMALL_HEADER_COMMON 204 205} AML_RESOURCE_END_DEPENDENT; 206 207 208typedef struct aml_resource_io 209{ 210 AML_RESOURCE_SMALL_HEADER_COMMON 211 UINT8 Flags; 212 UINT16 Minimum; 213 UINT16 Maximum; 214 UINT8 Alignment; 215 UINT8 AddressLength; 216 217} AML_RESOURCE_IO; 218 219 220typedef struct aml_resource_fixed_io 221{ 222 AML_RESOURCE_SMALL_HEADER_COMMON 223 UINT16 Address; 224 UINT8 AddressLength; 225 226} AML_RESOURCE_FIXED_IO; 227 228 229typedef struct aml_resource_vendor_small 230{ 231 AML_RESOURCE_SMALL_HEADER_COMMON 232 233} AML_RESOURCE_VENDOR_SMALL; 234 235 236typedef struct aml_resource_end_tag 237{ 238 AML_RESOURCE_SMALL_HEADER_COMMON 239 UINT8 Checksum; 240 241} AML_RESOURCE_END_TAG; 242 243 244typedef struct aml_resource_fixed_dma 245{ 246 AML_RESOURCE_SMALL_HEADER_COMMON 247 UINT16 RequestLines; 248 UINT16 Channels; 249 UINT8 Width; 250 251} AML_RESOURCE_FIXED_DMA; 252 253 254/* 255 * LARGE descriptors 256 */ 257#define AML_RESOURCE_LARGE_HEADER_COMMON \ 258 UINT8 DescriptorType;\ 259 UINT16 ResourceLength; 260 261typedef struct aml_resource_large_header 262{ 263 AML_RESOURCE_LARGE_HEADER_COMMON 264 265} AML_RESOURCE_LARGE_HEADER; 266 267 268/* General Flags for address space resource descriptors */ 269 270#define ACPI_RESOURCE_FLAG_DEC 2 271#define ACPI_RESOURCE_FLAG_MIF 4 272#define ACPI_RESOURCE_FLAG_MAF 8 273 274typedef struct aml_resource_memory24 275{ 276 AML_RESOURCE_LARGE_HEADER_COMMON 277 UINT8 Flags; 278 UINT16 Minimum; 279 UINT16 Maximum; 280 UINT16 Alignment; 281 UINT16 AddressLength; 282 283} AML_RESOURCE_MEMORY24; 284 285 286typedef struct aml_resource_vendor_large 287{ 288 AML_RESOURCE_LARGE_HEADER_COMMON 289 290} AML_RESOURCE_VENDOR_LARGE; 291 292 293typedef struct aml_resource_memory32 294{ 295 AML_RESOURCE_LARGE_HEADER_COMMON 296 UINT8 Flags; 297 UINT32 Minimum; 298 UINT32 Maximum; 299 UINT32 Alignment; 300 UINT32 AddressLength; 301 302} AML_RESOURCE_MEMORY32; 303 304 305typedef struct aml_resource_fixed_memory32 306{ 307 AML_RESOURCE_LARGE_HEADER_COMMON 308 UINT8 Flags; 309 UINT32 Address; 310 UINT32 AddressLength; 311 312} AML_RESOURCE_FIXED_MEMORY32; 313 314 315#define AML_RESOURCE_ADDRESS_COMMON \ 316 UINT8 ResourceType; \ 317 UINT8 Flags; \ 318 UINT8 SpecificFlags; 319 320 321typedef struct aml_resource_address 322{ 323 AML_RESOURCE_LARGE_HEADER_COMMON 324 AML_RESOURCE_ADDRESS_COMMON 325 326} AML_RESOURCE_ADDRESS; 327 328 329typedef struct aml_resource_extended_address64 330{ 331 AML_RESOURCE_LARGE_HEADER_COMMON 332 AML_RESOURCE_ADDRESS_COMMON 333 UINT8 RevisionID; 334 UINT8 Reserved; 335 UINT64 Granularity; 336 UINT64 Minimum; 337 UINT64 Maximum; 338 UINT64 TranslationOffset; 339 UINT64 AddressLength; 340 UINT64 TypeSpecific; 341 342} AML_RESOURCE_EXTENDED_ADDRESS64; 343 344#define AML_RESOURCE_EXTENDED_ADDRESS_REVISION 1 /* ACPI 3.0 */ 345 346 347typedef struct aml_resource_address64 348{ 349 AML_RESOURCE_LARGE_HEADER_COMMON 350 AML_RESOURCE_ADDRESS_COMMON 351 UINT64 Granularity; 352 UINT64 Minimum; 353 UINT64 Maximum; 354 UINT64 TranslationOffset; 355 UINT64 AddressLength; 356 357} AML_RESOURCE_ADDRESS64; 358 359 360typedef struct aml_resource_address32 361{ 362 AML_RESOURCE_LARGE_HEADER_COMMON 363 AML_RESOURCE_ADDRESS_COMMON 364 UINT32 Granularity; 365 UINT32 Minimum; 366 UINT32 Maximum; 367 UINT32 TranslationOffset; 368 UINT32 AddressLength; 369 370} AML_RESOURCE_ADDRESS32; 371 372 373typedef struct aml_resource_address16 374{ 375 AML_RESOURCE_LARGE_HEADER_COMMON 376 AML_RESOURCE_ADDRESS_COMMON 377 UINT16 Granularity; 378 UINT16 Minimum; 379 UINT16 Maximum; 380 UINT16 TranslationOffset; 381 UINT16 AddressLength; 382 383} AML_RESOURCE_ADDRESS16; 384 385 386typedef struct aml_resource_extended_irq 387{ 388 AML_RESOURCE_LARGE_HEADER_COMMON 389 UINT8 Flags; 390 UINT8 InterruptCount; 391 UINT32 Interrupts[1]; 392 /* ResSourceIndex, ResSource optional fields follow */ 393 394} AML_RESOURCE_EXTENDED_IRQ; 395 396 397typedef struct aml_resource_generic_register 398{ 399 AML_RESOURCE_LARGE_HEADER_COMMON 400 UINT8 AddressSpaceId; 401 UINT8 BitWidth; 402 UINT8 BitOffset; 403 UINT8 AccessSize; /* ACPI 3.0, was previously Reserved */ 404 UINT64 Address; 405 406} AML_RESOURCE_GENERIC_REGISTER; 407 408 409/* Common descriptor for GpioInt and GpioIo (ACPI 5.0) */ 410 411typedef struct aml_resource_gpio 412{ 413 AML_RESOURCE_LARGE_HEADER_COMMON 414 UINT8 RevisionId; 415 UINT8 ConnectionType; 416 UINT16 Flags; 417 UINT16 IntFlags; 418 UINT8 PinConfig; 419 UINT16 DriveStrength; 420 UINT16 DebounceTimeout; 421 UINT16 PinTableOffset; 422 UINT8 ResSourceIndex; 423 UINT16 ResSourceOffset; 424 UINT16 VendorOffset; 425 UINT16 VendorLength; 426 /* 427 * Optional fields follow immediately: 428 * 1) PIN list (Words) 429 * 2) Resource Source String 430 * 3) Vendor Data bytes 431 */ 432 433} AML_RESOURCE_GPIO; 434 435#define AML_RESOURCE_GPIO_REVISION 1 /* ACPI 5.0 */ 436 437/* Values for ConnectionType above */ 438 439#define AML_RESOURCE_GPIO_TYPE_INT 0 440#define AML_RESOURCE_GPIO_TYPE_IO 1 441#define AML_RESOURCE_MAX_GPIOTYPE 1 442 443 444/* Common preamble for all serial descriptors (ACPI 5.0) */ 445 446#define AML_RESOURCE_SERIAL_COMMON \ 447 UINT8 RevisionId; \ 448 UINT8 ResSourceIndex; \ 449 UINT8 Type; \ 450 UINT8 Flags; \ 451 UINT16 TypeSpecificFlags; \ 452 UINT8 TypeRevisionId; \ 453 UINT16 TypeDataLength; \ 454 455/* Values for the type field above */ 456 457#define AML_RESOURCE_I2C_SERIALBUSTYPE 1 458#define AML_RESOURCE_SPI_SERIALBUSTYPE 2 459#define AML_RESOURCE_UART_SERIALBUSTYPE 3 460#define AML_RESOURCE_MAX_SERIALBUSTYPE 3 461#define AML_RESOURCE_VENDOR_SERIALBUSTYPE 192 /* Vendor defined is 0xC0-0xFF (NOT SUPPORTED) */ 462 463typedef struct aml_resource_common_serialbus 464{ 465 AML_RESOURCE_LARGE_HEADER_COMMON 466 AML_RESOURCE_SERIAL_COMMON 467 468} AML_RESOURCE_COMMON_SERIALBUS; 469 470typedef struct aml_resource_i2c_serialbus 471{ 472 AML_RESOURCE_LARGE_HEADER_COMMON 473 AML_RESOURCE_SERIAL_COMMON 474 UINT32 ConnectionSpeed; 475 UINT16 SlaveAddress; 476 /* 477 * Optional fields follow immediately: 478 * 1) Vendor Data bytes 479 * 2) Resource Source String 480 */ 481 482} AML_RESOURCE_I2C_SERIALBUS; 483 484#define AML_RESOURCE_I2C_REVISION 1 /* ACPI 5.0 */ 485#define AML_RESOURCE_I2C_TYPE_REVISION 1 /* ACPI 5.0 */ 486#define AML_RESOURCE_I2C_MIN_DATA_LEN 6 487 488typedef struct aml_resource_spi_serialbus 489{ 490 AML_RESOURCE_LARGE_HEADER_COMMON 491 AML_RESOURCE_SERIAL_COMMON 492 UINT32 ConnectionSpeed; 493 UINT8 DataBitLength; 494 UINT8 ClockPhase; 495 UINT8 ClockPolarity; 496 UINT16 DeviceSelection; 497 /* 498 * Optional fields follow immediately: 499 * 1) Vendor Data bytes 500 * 2) Resource Source String 501 */ 502 503} AML_RESOURCE_SPI_SERIALBUS; 504 505#define AML_RESOURCE_SPI_REVISION 1 /* ACPI 5.0 */ 506#define AML_RESOURCE_SPI_TYPE_REVISION 1 /* ACPI 5.0 */ 507#define AML_RESOURCE_SPI_MIN_DATA_LEN 9 508 509 510typedef struct aml_resource_uart_serialbus 511{ 512 AML_RESOURCE_LARGE_HEADER_COMMON 513 AML_RESOURCE_SERIAL_COMMON 514 UINT32 DefaultBaudRate; 515 UINT16 RxFifoSize; 516 UINT16 TxFifoSize; 517 UINT8 Parity; 518 UINT8 LinesEnabled; 519 /* 520 * Optional fields follow immediately: 521 * 1) Vendor Data bytes 522 * 2) Resource Source String 523 */ 524 525} AML_RESOURCE_UART_SERIALBUS; 526 527#define AML_RESOURCE_UART_REVISION 1 /* ACPI 5.0 */ 528#define AML_RESOURCE_UART_TYPE_REVISION 1 /* ACPI 5.0 */ 529#define AML_RESOURCE_UART_MIN_DATA_LEN 10 530 531 532/* restore default alignment */ 533 534#pragma pack() 535 536/* Union of all resource descriptors, so we can allocate the worst case */ 537 538typedef union aml_resource 539{ 540 /* Descriptor headers */ 541 542 UINT8 DescriptorType; 543 AML_RESOURCE_SMALL_HEADER SmallHeader; 544 AML_RESOURCE_LARGE_HEADER LargeHeader; 545 546 /* Small resource descriptors */ 547 548 AML_RESOURCE_IRQ Irq; 549 AML_RESOURCE_DMA Dma; 550 AML_RESOURCE_START_DEPENDENT StartDpf; 551 AML_RESOURCE_END_DEPENDENT EndDpf; 552 AML_RESOURCE_IO Io; 553 AML_RESOURCE_FIXED_IO FixedIo; 554 AML_RESOURCE_FIXED_DMA FixedDma; 555 AML_RESOURCE_VENDOR_SMALL VendorSmall; 556 AML_RESOURCE_END_TAG EndTag; 557 558 /* Large resource descriptors */ 559 560 AML_RESOURCE_MEMORY24 Memory24; 561 AML_RESOURCE_GENERIC_REGISTER GenericReg; 562 AML_RESOURCE_VENDOR_LARGE VendorLarge; 563 AML_RESOURCE_MEMORY32 Memory32; 564 AML_RESOURCE_FIXED_MEMORY32 FixedMemory32; 565 AML_RESOURCE_ADDRESS16 Address16; 566 AML_RESOURCE_ADDRESS32 Address32; 567 AML_RESOURCE_ADDRESS64 Address64; 568 AML_RESOURCE_EXTENDED_ADDRESS64 ExtAddress64; 569 AML_RESOURCE_EXTENDED_IRQ ExtendedIrq; 570 AML_RESOURCE_GPIO Gpio; 571 AML_RESOURCE_I2C_SERIALBUS I2cSerialBus; 572 AML_RESOURCE_SPI_SERIALBUS SpiSerialBus; 573 AML_RESOURCE_UART_SERIALBUS UartSerialBus; 574 AML_RESOURCE_COMMON_SERIALBUS CommonSerialBus; 575 576 /* Utility overlays */ 577 578 AML_RESOURCE_ADDRESS Address; 579 UINT32 DwordItem; 580 UINT16 WordItem; 581 UINT8 ByteItem; 582 583} AML_RESOURCE; 584 585 586/* Interfaces used by both the disassembler and compiler */ 587 588void 589MpSaveGpioInfo ( 590 ACPI_PARSE_OBJECT *Op, 591 AML_RESOURCE *Resource, 592 UINT32 PinCount, 593 UINT16 *PinList, 594 char *DeviceName); 595 596void 597MpSaveSerialInfo ( 598 ACPI_PARSE_OBJECT *Op, 599 AML_RESOURCE *Resource, 600 char *DeviceName); 601 602char * 603MpGetHidFromParseTree ( 604 ACPI_NAMESPACE_NODE *HidNode); 605 606char * 607MpGetHidViaNamestring ( 608 char *DeviceName); 609 610char * 611MpGetConnectionInfo ( 612 ACPI_PARSE_OBJECT *Op, 613 UINT32 PinIndex, 614 ACPI_NAMESPACE_NODE **TargetNode, 615 char **TargetName); 616 617char * 618MpGetParentDeviceHid ( 619 ACPI_PARSE_OBJECT *Op, 620 ACPI_NAMESPACE_NODE **TargetNode, 621 char **ParentDeviceName); 622 623char * 624MpGetDdnValue ( 625 char *DeviceName); 626 627char * 628MpGetHidValue ( 629 ACPI_NAMESPACE_NODE *DeviceNode); 630 631#endif 632