dmrestag.c revision 250838
1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmrestag - Add tags to resource descriptors (Application-level) 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp. 9167802Sjkim * All rights reserved. 10167802Sjkim * 11217365Sjkim * Redistribution and use in source and binary forms, with or without 12217365Sjkim * modification, are permitted provided that the following conditions 13217365Sjkim * are met: 14217365Sjkim * 1. Redistributions of source code must retain the above copyright 15217365Sjkim * notice, this list of conditions, and the following disclaimer, 16217365Sjkim * without modification. 17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20217365Sjkim * including a substantially similar Disclaimer requirement for further 21217365Sjkim * binary redistribution. 22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23217365Sjkim * of any contributors may be used to endorse or promote products derived 24217365Sjkim * from this software without specific prior written permission. 25167802Sjkim * 26217365Sjkim * Alternatively, this software may be distributed under the terms of the 27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28217365Sjkim * Software Foundation. 29167802Sjkim * 30217365Sjkim * NO WARRANTY 31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 42217365Sjkim */ 43167802Sjkim 44167802Sjkim 45193529Sjkim#include <contrib/dev/acpica/include/acpi.h> 46193529Sjkim#include <contrib/dev/acpica/include/accommon.h> 47193529Sjkim#include <contrib/dev/acpica/include/acparser.h> 48193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 49193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 50193529Sjkim#include <contrib/dev/acpica/include/amlcode.h> 51167802Sjkim 52167802Sjkim/* This module used for application-level code only */ 53167802Sjkim 54167802Sjkim#define _COMPONENT ACPI_CA_DISASSEMBLER 55167802Sjkim ACPI_MODULE_NAME ("dmrestag") 56167802Sjkim 57167802Sjkim/* Local prototypes */ 58167802Sjkim 59167802Sjkimstatic void 60167802SjkimAcpiDmUpdateResourceName ( 61167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode); 62167802Sjkim 63167802Sjkimstatic char * 64167802SjkimAcpiDmSearchTagList ( 65167802Sjkim UINT32 BitIndex, 66228110Sjkim const ACPI_RESOURCE_TAG *TagList); 67167802Sjkim 68167802Sjkimstatic char * 69167802SjkimAcpiDmGetResourceTag ( 70167802Sjkim UINT32 BitIndex, 71167802Sjkim AML_RESOURCE *Resource, 72167802Sjkim UINT8 ResourceIndex); 73167802Sjkim 74167802Sjkimstatic char * 75167802SjkimAcpiGetTagPathname ( 76237412Sjkim ACPI_PARSE_OBJECT *Op, 77167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 78167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode, 79167802Sjkim UINT32 BitIndex); 80167802Sjkim 81167802Sjkimstatic ACPI_NAMESPACE_NODE * 82167802SjkimAcpiDmGetResourceNode ( 83167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 84167802Sjkim UINT32 BitIndex); 85167802Sjkim 86167802Sjkimstatic ACPI_STATUS 87167802SjkimAcpiDmAddResourceToNamespace ( 88167802Sjkim UINT8 *Aml, 89167802Sjkim UINT32 Length, 90167802Sjkim UINT32 Offset, 91167802Sjkim UINT8 ResourceIndex, 92245582Sjkim void **Context); 93167802Sjkim 94167802Sjkimstatic void 95167802SjkimAcpiDmAddResourcesToNamespace ( 96167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 97167802Sjkim ACPI_PARSE_OBJECT *Op); 98167802Sjkim 99167802Sjkim 100167802Sjkim/****************************************************************************** 101167802Sjkim * 102167802Sjkim * Resource Tag tables 103167802Sjkim * 104167802Sjkim * These are the predefined tags that refer to elements of a resource 105167802Sjkim * descriptor. Each name and offset is defined in the ACPI specification. 106167802Sjkim * 107167802Sjkim * Each table entry contains the bit offset of the field and the associated 108167802Sjkim * name. 109167802Sjkim * 110167802Sjkim ******************************************************************************/ 111167802Sjkim 112228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmIrqTags[] = 113167802Sjkim{ 114167802Sjkim {( 1 * 8), ACPI_RESTAG_INTERRUPT}, 115167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_INTERRUPTTYPE}, 116167802Sjkim {( 3 * 8) + 3, ACPI_RESTAG_INTERRUPTLEVEL}, 117167802Sjkim {( 3 * 8) + 4, ACPI_RESTAG_INTERRUPTSHARE}, 118167802Sjkim {0, NULL} 119167802Sjkim}; 120167802Sjkim 121228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmDmaTags[] = 122167802Sjkim{ 123167802Sjkim {( 1 * 8), ACPI_RESTAG_DMA}, 124167802Sjkim {( 2 * 8) + 0, ACPI_RESTAG_XFERTYPE}, 125167802Sjkim {( 2 * 8) + 2, ACPI_RESTAG_BUSMASTER}, 126167802Sjkim {( 2 * 8) + 5, ACPI_RESTAG_DMATYPE}, 127167802Sjkim {0, NULL} 128167802Sjkim}; 129167802Sjkim 130228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmIoTags[] = 131167802Sjkim{ 132167802Sjkim {( 1 * 8) + 0, ACPI_RESTAG_DECODE}, 133167802Sjkim {( 2 * 8), ACPI_RESTAG_MINADDR}, 134167802Sjkim {( 4 * 8), ACPI_RESTAG_MAXADDR}, 135167802Sjkim {( 6 * 8), ACPI_RESTAG_ALIGNMENT}, 136167802Sjkim {( 7 * 8), ACPI_RESTAG_LENGTH}, 137167802Sjkim {0, NULL} 138167802Sjkim}; 139167802Sjkim 140228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmFixedIoTags[] = 141167802Sjkim{ 142167802Sjkim {( 1 * 8), ACPI_RESTAG_BASEADDRESS}, 143167802Sjkim {( 3 * 8), ACPI_RESTAG_LENGTH}, 144167802Sjkim {0, NULL} 145167802Sjkim}; 146167802Sjkim 147228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmFixedDmaTags[] = 148167802Sjkim{ 149228110Sjkim {( 1 * 8), ACPI_RESTAG_DMA}, 150228110Sjkim {( 3 * 8), ACPI_RESTAG_DMATYPE}, 151228110Sjkim {( 5 * 8), ACPI_RESTAG_XFERTYPE}, 152228110Sjkim {0, NULL} 153228110Sjkim}; 154228110Sjkim 155228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmMemory24Tags[] = 156228110Sjkim{ 157167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 158167802Sjkim {( 4 * 8), ACPI_RESTAG_MINADDR}, 159167802Sjkim {( 6 * 8), ACPI_RESTAG_MAXADDR}, 160167802Sjkim {( 8 * 8), ACPI_RESTAG_ALIGNMENT}, 161167802Sjkim {(10 * 8), ACPI_RESTAG_LENGTH}, 162167802Sjkim {0, NULL} 163167802Sjkim}; 164167802Sjkim 165228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmRegisterTags[] = 166167802Sjkim{ 167167802Sjkim {( 3 * 8), ACPI_RESTAG_ADDRESSSPACE}, 168167802Sjkim {( 4 * 8), ACPI_RESTAG_REGISTERBITWIDTH}, 169167802Sjkim {( 5 * 8), ACPI_RESTAG_REGISTERBITOFFSET}, 170167802Sjkim {( 6 * 8), ACPI_RESTAG_ACCESSSIZE}, 171167802Sjkim {( 7 * 8), ACPI_RESTAG_ADDRESS}, 172167802Sjkim {0, NULL} 173167802Sjkim}; 174167802Sjkim 175228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmMemory32Tags[] = 176167802Sjkim{ 177167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 178167802Sjkim {( 4 * 8), ACPI_RESTAG_MINADDR}, 179167802Sjkim {( 8 * 8), ACPI_RESTAG_MAXADDR}, 180167802Sjkim {(12 * 8), ACPI_RESTAG_ALIGNMENT}, 181167802Sjkim {(16 * 8), ACPI_RESTAG_LENGTH}, 182167802Sjkim {0, NULL} 183167802Sjkim}; 184167802Sjkim 185228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmFixedMemory32Tags[] = 186167802Sjkim{ 187167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 188167802Sjkim {( 4 * 8), ACPI_RESTAG_BASEADDRESS}, 189167802Sjkim {( 8 * 8), ACPI_RESTAG_LENGTH}, 190167802Sjkim {0, NULL} 191167802Sjkim}; 192167802Sjkim 193228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmInterruptTags[] = 194167802Sjkim{ 195167802Sjkim {( 3 * 8) + 1, ACPI_RESTAG_INTERRUPTTYPE}, 196167802Sjkim {( 3 * 8) + 2, ACPI_RESTAG_INTERRUPTLEVEL}, 197167802Sjkim {( 3 * 8) + 3, ACPI_RESTAG_INTERRUPTSHARE}, 198167802Sjkim {( 5 * 8), ACPI_RESTAG_INTERRUPT}, 199167802Sjkim {0, NULL} 200167802Sjkim}; 201167802Sjkim 202228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmAddress16Tags[] = 203167802Sjkim{ 204167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 205167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 206167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 207167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 208167802Sjkim {( 8 * 8), ACPI_RESTAG_MINADDR}, 209167802Sjkim {(10 * 8), ACPI_RESTAG_MAXADDR}, 210167802Sjkim {(12 * 8), ACPI_RESTAG_TRANSLATION}, 211167802Sjkim {(14 * 8), ACPI_RESTAG_LENGTH}, 212167802Sjkim {0, NULL} 213167802Sjkim}; 214167802Sjkim 215228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmAddress32Tags[] = 216167802Sjkim{ 217167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 218167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 219167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 220167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 221167802Sjkim {(10 * 8), ACPI_RESTAG_MINADDR}, 222167802Sjkim {(14 * 8), ACPI_RESTAG_MAXADDR}, 223167802Sjkim {(18 * 8), ACPI_RESTAG_TRANSLATION}, 224167802Sjkim {(22 * 8), ACPI_RESTAG_LENGTH}, 225167802Sjkim {0, NULL} 226167802Sjkim}; 227167802Sjkim 228228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmAddress64Tags[] = 229167802Sjkim{ 230167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 231167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 232167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 233167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 234167802Sjkim {(14 * 8), ACPI_RESTAG_MINADDR}, 235167802Sjkim {(22 * 8), ACPI_RESTAG_MAXADDR}, 236167802Sjkim {(30 * 8), ACPI_RESTAG_TRANSLATION}, 237167802Sjkim {(38 * 8), ACPI_RESTAG_LENGTH}, 238167802Sjkim {0, NULL} 239167802Sjkim}; 240167802Sjkim 241228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmExtendedAddressTags[] = 242167802Sjkim{ 243167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 244167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 245167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 246167802Sjkim {( 8 * 8), ACPI_RESTAG_GRANULARITY}, 247167802Sjkim {(16 * 8), ACPI_RESTAG_MINADDR}, 248167802Sjkim {(24 * 8), ACPI_RESTAG_MAXADDR}, 249167802Sjkim {(32 * 8), ACPI_RESTAG_TRANSLATION}, 250167802Sjkim {(40 * 8), ACPI_RESTAG_LENGTH}, 251167802Sjkim {(48 * 8), ACPI_RESTAG_TYPESPECIFICATTRIBUTES}, 252167802Sjkim {0, NULL} 253167802Sjkim}; 254167802Sjkim 255228110Sjkim/* Subtype tables for GPIO descriptors */ 256167802Sjkim 257228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmGpioIntTags[] = 258167802Sjkim{ 259228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_MODE}, 260228110Sjkim {( 7 * 8) + 1, ACPI_RESTAG_POLARITY}, 261228110Sjkim {( 7 * 8) + 3, ACPI_RESTAG_INTERRUPTSHARE}, 262228110Sjkim {( 9 * 8), ACPI_RESTAG_PINCONFIG}, 263228110Sjkim {(10 * 8), ACPI_RESTAG_DRIVESTRENGTH}, 264228110Sjkim {(12 * 8), ACPI_RESTAG_DEBOUNCETIME}, 265228110Sjkim {0, NULL} 266228110Sjkim}; 267228110Sjkim 268228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmGpioIoTags[] = 269228110Sjkim{ 270228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_IORESTRICTION}, 271228110Sjkim {( 7 * 8) + 3, ACPI_RESTAG_INTERRUPTSHARE}, 272228110Sjkim {( 9 * 8), ACPI_RESTAG_PINCONFIG}, 273228110Sjkim {(10 * 8), ACPI_RESTAG_DRIVESTRENGTH}, 274228110Sjkim {(12 * 8), ACPI_RESTAG_DEBOUNCETIME}, 275228110Sjkim {0, NULL} 276228110Sjkim}; 277228110Sjkim 278228110Sjkim/* Subtype tables for SerialBus descriptors */ 279228110Sjkim 280228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmI2cSerialBusTags[] = 281228110Sjkim{ 282228110Sjkim {( 6 * 8) + 0, ACPI_RESTAG_SLAVEMODE}, 283228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_MODE}, 284228110Sjkim {(12 * 8), ACPI_RESTAG_SPEED}, 285228110Sjkim {(16 * 8), ACPI_RESTAG_ADDRESS}, 286228110Sjkim {0, NULL} 287228110Sjkim}; 288228110Sjkim 289228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmSpiSerialBusTags[] = 290228110Sjkim{ 291228110Sjkim {( 6 * 8) + 0, ACPI_RESTAG_SLAVEMODE}, 292228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_MODE}, 293228110Sjkim {( 7 * 8) + 1, ACPI_RESTAG_DEVICEPOLARITY}, 294228110Sjkim {(12 * 8), ACPI_RESTAG_SPEED}, 295228110Sjkim {(16 * 8), ACPI_RESTAG_LENGTH}, 296228110Sjkim {(17 * 8), ACPI_RESTAG_PHASE}, 297228110Sjkim {(18 * 8), ACPI_RESTAG_POLARITY}, 298228110Sjkim {(19 * 8), ACPI_RESTAG_ADDRESS}, 299228110Sjkim {0, NULL} 300228110Sjkim}; 301228110Sjkim 302228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmUartSerialBusTags[] = 303228110Sjkim{ 304228110Sjkim {( 6 * 8) + 0, ACPI_RESTAG_SLAVEMODE}, /* Note: not part of original macro */ 305228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_FLOWCONTROL}, 306228110Sjkim {( 7 * 8) + 2, ACPI_RESTAG_STOPBITS}, 307228110Sjkim {( 7 * 8) + 4, ACPI_RESTAG_LENGTH}, 308228110Sjkim {( 7 * 8) + 7, ACPI_RESTAG_ENDIANNESS}, 309228110Sjkim {(12 * 8), ACPI_RESTAG_SPEED}, 310228110Sjkim {(16 * 8), ACPI_RESTAG_LENGTH_RX}, 311228110Sjkim {(18 * 8), ACPI_RESTAG_LENGTH_TX}, 312228110Sjkim {(20 * 8), ACPI_RESTAG_PARITY}, 313228110Sjkim {(21 * 8), ACPI_RESTAG_LINE}, 314228110Sjkim {0, NULL} 315228110Sjkim}; 316228110Sjkim 317228110Sjkim/* Subtype tables for Address descriptor type-specific flags */ 318228110Sjkim 319228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmMemoryFlagTags[] = 320228110Sjkim{ 321167802Sjkim {( 5 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 322167802Sjkim {( 5 * 8) + 1, ACPI_RESTAG_MEMTYPE}, 323167802Sjkim {( 5 * 8) + 3, ACPI_RESTAG_MEMATTRIBUTES}, 324167802Sjkim {( 5 * 8) + 5, ACPI_RESTAG_TYPE}, 325167802Sjkim {0, NULL} 326167802Sjkim}; 327167802Sjkim 328228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmIoFlagTags[] = 329167802Sjkim{ 330167802Sjkim {( 5 * 8) + 0, ACPI_RESTAG_RANGETYPE}, 331167802Sjkim {( 5 * 8) + 4, ACPI_RESTAG_TYPE}, 332167802Sjkim {( 5 * 8) + 5, ACPI_RESTAG_TRANSTYPE}, 333167802Sjkim {0, NULL} 334167802Sjkim}; 335167802Sjkim 336167802Sjkim 337228110Sjkim/* 338228110Sjkim * Dispatch table used to obtain the correct tag table for a descriptor. 339228110Sjkim * 340228110Sjkim * A NULL in this table means one of three things: 341228110Sjkim * 1) The descriptor ID is reserved and invalid 342228110Sjkim * 2) The descriptor has no tags associated with it 343228110Sjkim * 3) The descriptor has subtypes and a separate table will be used. 344228110Sjkim */ 345228110Sjkimstatic const ACPI_RESOURCE_TAG *AcpiGbl_ResourceTags[] = 346167802Sjkim{ 347167802Sjkim /* Small descriptors */ 348167802Sjkim 349167802Sjkim NULL, /* 0x00, Reserved */ 350167802Sjkim NULL, /* 0x01, Reserved */ 351167802Sjkim NULL, /* 0x02, Reserved */ 352167802Sjkim NULL, /* 0x03, Reserved */ 353167802Sjkim AcpiDmIrqTags, /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */ 354167802Sjkim AcpiDmDmaTags, /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */ 355167802Sjkim NULL, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */ 356167802Sjkim NULL, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */ 357167802Sjkim AcpiDmIoTags, /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */ 358167802Sjkim AcpiDmFixedIoTags, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */ 359228110Sjkim AcpiDmFixedDmaTags, /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */ 360167802Sjkim NULL, /* 0x0B, Reserved */ 361167802Sjkim NULL, /* 0x0C, Reserved */ 362167802Sjkim NULL, /* 0x0D, Reserved */ 363167802Sjkim NULL, /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */ 364167802Sjkim NULL, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */ 365167802Sjkim 366167802Sjkim /* Large descriptors */ 367167802Sjkim 368167802Sjkim NULL, /* 0x00, Reserved */ 369167802Sjkim AcpiDmMemory24Tags, /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */ 370167802Sjkim AcpiDmRegisterTags, /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */ 371167802Sjkim NULL, /* 0x03, Reserved */ 372167802Sjkim NULL, /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */ 373167802Sjkim AcpiDmMemory32Tags, /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */ 374167802Sjkim AcpiDmFixedMemory32Tags, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */ 375167802Sjkim AcpiDmAddress32Tags, /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */ 376167802Sjkim AcpiDmAddress16Tags, /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */ 377167802Sjkim AcpiDmInterruptTags, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */ 378167802Sjkim AcpiDmAddress64Tags, /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */ 379228110Sjkim AcpiDmExtendedAddressTags, /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */ 380228110Sjkim NULL, /* 0x0C, ACPI_RESOURCE_NAME_GPIO - Use Subtype table below */ 381228110Sjkim NULL, /* 0x0D, Reserved */ 382228110Sjkim NULL /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use Subtype table below */ 383167802Sjkim}; 384167802Sjkim 385228110Sjkim/* GPIO Subtypes */ 386167802Sjkim 387228110Sjkimstatic const ACPI_RESOURCE_TAG *AcpiGbl_GpioResourceTags[] = 388228110Sjkim{ 389228110Sjkim AcpiDmGpioIntTags, /* 0x00 Interrupt Connection */ 390228110Sjkim AcpiDmGpioIoTags /* 0x01 I/O Connection */ 391228110Sjkim}; 392228110Sjkim 393228110Sjkim/* Serial Bus Subtypes */ 394228110Sjkim 395228110Sjkimstatic const ACPI_RESOURCE_TAG *AcpiGbl_SerialResourceTags[] = 396228110Sjkim{ 397228110Sjkim NULL, /* 0x00 Reserved */ 398228110Sjkim AcpiDmI2cSerialBusTags, /* 0x01 I2C SerialBus */ 399228110Sjkim AcpiDmSpiSerialBusTags, /* 0x02 SPI SerialBus */ 400228110Sjkim AcpiDmUartSerialBusTags /* 0x03 UART SerialBus */ 401228110Sjkim}; 402228110Sjkim 403167802Sjkim/* 404167802Sjkim * Globals used to generate unique resource descriptor names. We use names that 405167802Sjkim * start with underscore and a prefix letter that is not used by other ACPI 406167802Sjkim * reserved names. To this, we append hex 0x00 through 0xFF. These 5 prefixes 407167802Sjkim * allow for 5*256 = 1280 unique names, probably sufficient for any single ASL 408167802Sjkim * file. If this becomes too small, we can use alpha+numerals for a total 409167802Sjkim * of 5*36*36 = 6480. 410167802Sjkim */ 411167802Sjkim#define ACPI_NUM_RES_PREFIX 5 412167802Sjkim 413167802Sjkimstatic UINT32 AcpiGbl_NextResourceId = 0; 414167802Sjkimstatic UINT8 AcpiGbl_NextPrefix = 0; 415197104Sjkimstatic char AcpiGbl_Prefix[ACPI_NUM_RES_PREFIX] = 416167802Sjkim {'Y','Z','J','K','X'}; 417167802Sjkim 418167802Sjkim 419167802Sjkim/******************************************************************************* 420167802Sjkim * 421167802Sjkim * FUNCTION: AcpiDmCheckResourceReference 422167802Sjkim * 423167802Sjkim * PARAMETERS: Op - Parse Op for the AML opcode 424167802Sjkim * WalkState - Current walk state (with valid scope) 425167802Sjkim * 426167802Sjkim * RETURN: None 427167802Sjkim * 428167802Sjkim * DESCRIPTION: Convert a reference to a resource descriptor to a symbolic 429167802Sjkim * reference if possible 430167802Sjkim * 431167802Sjkim * NOTE: Bit index is used to transparently handle both resource bit 432167802Sjkim * fields and byte fields. 433167802Sjkim * 434167802Sjkim ******************************************************************************/ 435167802Sjkim 436167802Sjkimvoid 437167802SjkimAcpiDmCheckResourceReference ( 438167802Sjkim ACPI_PARSE_OBJECT *Op, 439167802Sjkim ACPI_WALK_STATE *WalkState) 440167802Sjkim{ 441167802Sjkim ACPI_STATUS Status; 442167802Sjkim ACPI_PARSE_OBJECT *BufferNameOp; 443167802Sjkim ACPI_PARSE_OBJECT *IndexOp; 444167802Sjkim ACPI_NAMESPACE_NODE *BufferNode; 445167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode; 446167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 447167802Sjkim UINT32 BitIndex; 448167802Sjkim 449167802Sjkim 450167802Sjkim /* We are only interested in the CreateXxxxField opcodes */ 451167802Sjkim 452167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 453167802Sjkim if (OpInfo->Type != AML_TYPE_CREATE_FIELD) 454167802Sjkim { 455167802Sjkim return; 456167802Sjkim } 457167802Sjkim 458167802Sjkim /* Get the buffer term operand */ 459167802Sjkim 460167802Sjkim BufferNameOp = AcpiPsGetDepthNext (NULL, Op); 461167802Sjkim 462167802Sjkim /* Must be a named buffer, not an arg or local or method call */ 463167802Sjkim 464167802Sjkim if (BufferNameOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP) 465167802Sjkim { 466167802Sjkim return; 467167802Sjkim } 468167802Sjkim 469167802Sjkim /* Get the Index term, must be an integer constant to convert */ 470167802Sjkim 471167802Sjkim IndexOp = BufferNameOp->Common.Next; 472240716Sjkim 473240716Sjkim /* Major cheat: The Node field is also used for the Tag ptr. Clear it now */ 474240716Sjkim 475240716Sjkim IndexOp->Common.Node = NULL; 476240716Sjkim 477167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (IndexOp->Common.AmlOpcode); 478167802Sjkim if (OpInfo->ObjectType != ACPI_TYPE_INTEGER) 479167802Sjkim { 480167802Sjkim return; 481167802Sjkim } 482167802Sjkim 483167802Sjkim /* Get the bit offset of the descriptor within the buffer */ 484167802Sjkim 485167802Sjkim if ((Op->Common.AmlOpcode == AML_CREATE_BIT_FIELD_OP) || 486167802Sjkim (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)) 487167802Sjkim { 488167802Sjkim /* Index operand is a bit offset */ 489167802Sjkim 490167802Sjkim BitIndex = (UINT32) IndexOp->Common.Value.Integer; 491167802Sjkim } 492167802Sjkim else 493167802Sjkim { 494167802Sjkim /* Index operand is a byte offset, convert to bits */ 495167802Sjkim 496167802Sjkim BitIndex = (UINT32) ACPI_MUL_8 (IndexOp->Common.Value.Integer); 497167802Sjkim } 498167802Sjkim 499167802Sjkim /* Lookup the buffer in the namespace */ 500167802Sjkim 501167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, 502167802Sjkim BufferNameOp->Common.Value.String, ACPI_TYPE_BUFFER, 503167802Sjkim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, 504167802Sjkim &BufferNode); 505167802Sjkim if (ACPI_FAILURE (Status)) 506167802Sjkim { 507167802Sjkim return; 508167802Sjkim } 509167802Sjkim 510167802Sjkim /* Validate object type, we must have a buffer */ 511167802Sjkim 512167802Sjkim if (BufferNode->Type != ACPI_TYPE_BUFFER) 513167802Sjkim { 514167802Sjkim return; 515167802Sjkim } 516167802Sjkim 517167802Sjkim /* Find the resource descriptor node corresponding to the index */ 518167802Sjkim 519167802Sjkim ResourceNode = AcpiDmGetResourceNode (BufferNode, BitIndex); 520167802Sjkim if (!ResourceNode) 521167802Sjkim { 522167802Sjkim return; 523167802Sjkim } 524167802Sjkim 525167802Sjkim /* Translate the Index to a resource tag pathname */ 526167802Sjkim 527237412Sjkim AcpiGetTagPathname (IndexOp, BufferNode, ResourceNode, BitIndex); 528167802Sjkim} 529167802Sjkim 530167802Sjkim 531167802Sjkim/******************************************************************************* 532167802Sjkim * 533167802Sjkim * FUNCTION: AcpiDmGetResourceNode 534167802Sjkim * 535167802Sjkim * PARAMETERS: BufferNode - Node for the parent buffer 536167802Sjkim * BitIndex - Index into the resource descriptor 537167802Sjkim * 538167802Sjkim * RETURN: Namespace node for the resource descriptor. NULL if not found 539167802Sjkim * 540167802Sjkim * DESCRIPTION: Find a resource descriptor that corresponds to the bit index 541167802Sjkim * 542167802Sjkim ******************************************************************************/ 543167802Sjkim 544167802Sjkimstatic ACPI_NAMESPACE_NODE * 545167802SjkimAcpiDmGetResourceNode ( 546167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 547167802Sjkim UINT32 BitIndex) 548167802Sjkim{ 549167802Sjkim ACPI_NAMESPACE_NODE *Node; 550167802Sjkim UINT32 ByteIndex = ACPI_DIV_8 (BitIndex); 551167802Sjkim 552167802Sjkim 553167802Sjkim /* 554167802Sjkim * Child list contains an entry for each resource descriptor. Find 555167802Sjkim * the descriptor that corresponds to the Index. 556167802Sjkim * 557167802Sjkim * If there are no children, this is not a resource template 558167802Sjkim */ 559167802Sjkim Node = BufferNode->Child; 560167802Sjkim while (Node) 561167802Sjkim { 562167802Sjkim /* 563167802Sjkim * Check if the Index falls within this resource. 564167802Sjkim * 565167802Sjkim * Value contains the resource offset, Object contains the resource 566167802Sjkim * length (both in bytes) 567167802Sjkim */ 568167802Sjkim if ((ByteIndex >= Node->Value) && 569167802Sjkim (ByteIndex < (Node->Value + Node->Length))) 570167802Sjkim { 571167802Sjkim return (Node); 572167802Sjkim } 573167802Sjkim 574167802Sjkim Node = Node->Peer; 575167802Sjkim } 576167802Sjkim 577167802Sjkim return (NULL); 578167802Sjkim} 579167802Sjkim 580167802Sjkim 581167802Sjkim/******************************************************************************* 582167802Sjkim * 583167802Sjkim * FUNCTION: AcpiGetTagPathname 584167802Sjkim * 585167802Sjkim * PARAMETERS: BufferNode - Node for the parent buffer 586167802Sjkim * ResourceNode - Node for a resource descriptor 587167802Sjkim * BitIndex - Index into the resource descriptor 588167802Sjkim * 589167802Sjkim * RETURN: Full pathname for a resource tag. NULL if no match. 590167802Sjkim * Path is returned in AML (packed) format. 591167802Sjkim * 592167802Sjkim * DESCRIPTION: Convert a BitIndex into a symbolic resource tag (full pathname) 593167802Sjkim * 594167802Sjkim ******************************************************************************/ 595167802Sjkim 596167802Sjkimstatic char * 597167802SjkimAcpiGetTagPathname ( 598237412Sjkim ACPI_PARSE_OBJECT *IndexOp, 599167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 600167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode, 601167802Sjkim UINT32 BitIndex) 602167802Sjkim{ 603167802Sjkim ACPI_STATUS Status; 604167802Sjkim UINT32 ResourceBitIndex; 605167802Sjkim UINT8 ResourceTableIndex; 606167802Sjkim ACPI_SIZE RequiredSize; 607167802Sjkim char *Pathname; 608167802Sjkim AML_RESOURCE *Aml; 609167802Sjkim ACPI_PARSE_OBJECT *Op; 610167802Sjkim char *InternalPath; 611167802Sjkim char *Tag; 612167802Sjkim 613167802Sjkim 614167802Sjkim /* Get the Op that contains the actual buffer data */ 615167802Sjkim 616167802Sjkim Op = BufferNode->Op->Common.Value.Arg; 617167802Sjkim Op = Op->Common.Next; 618167802Sjkim if (!Op) 619167802Sjkim { 620167802Sjkim return (NULL); 621167802Sjkim } 622167802Sjkim 623167802Sjkim /* Get the individual resource descriptor and validate it */ 624167802Sjkim 625167802Sjkim Aml = ACPI_CAST_PTR (AML_RESOURCE, 626167802Sjkim &Op->Named.Data[ResourceNode->Value]); 627167802Sjkim 628243347Sjkim Status = AcpiUtValidateResource (NULL, Aml, &ResourceTableIndex); 629167802Sjkim if (ACPI_FAILURE (Status)) 630167802Sjkim { 631167802Sjkim return (NULL); 632167802Sjkim } 633167802Sjkim 634167802Sjkim /* Get offset into this descriptor (from offset into entire buffer) */ 635167802Sjkim 636167802Sjkim ResourceBitIndex = BitIndex - ACPI_MUL_8 (ResourceNode->Value); 637167802Sjkim 638167802Sjkim /* Get the tag associated with this resource descriptor and offset */ 639167802Sjkim 640167802Sjkim Tag = AcpiDmGetResourceTag (ResourceBitIndex, Aml, ResourceTableIndex); 641167802Sjkim if (!Tag) 642167802Sjkim { 643167802Sjkim return (NULL); 644167802Sjkim } 645167802Sjkim 646167802Sjkim /* 647167802Sjkim * Now that we know that we have a reference that can be converted to a 648167802Sjkim * symbol, change the name of the resource to a unique name. 649167802Sjkim */ 650167802Sjkim AcpiDmUpdateResourceName (ResourceNode); 651167802Sjkim 652167802Sjkim /* Get the full pathname to the parent buffer */ 653167802Sjkim 654167802Sjkim RequiredSize = AcpiNsGetPathnameLength (BufferNode); 655193529Sjkim if (!RequiredSize) 656193529Sjkim { 657193529Sjkim return (NULL); 658193529Sjkim } 659193529Sjkim 660167802Sjkim Pathname = ACPI_ALLOCATE_ZEROED (RequiredSize + ACPI_PATH_SEGMENT_LENGTH); 661167802Sjkim if (!Pathname) 662167802Sjkim { 663167802Sjkim return (NULL); 664167802Sjkim } 665167802Sjkim 666193529Sjkim Status = AcpiNsBuildExternalPath (BufferNode, RequiredSize, Pathname); 667193529Sjkim if (ACPI_FAILURE (Status)) 668193529Sjkim { 669193529Sjkim return (NULL); 670193529Sjkim } 671167802Sjkim 672167802Sjkim /* 673167802Sjkim * Create the full path to the resource and tag by: remove the buffer name, 674167802Sjkim * append the resource descriptor name, append a dot, append the tag name. 675167802Sjkim * 676167802Sjkim * TBD: Always using the full path is a bit brute force, the path can be 677167802Sjkim * often be optimized with carats (if the original buffer namepath is a 678167802Sjkim * single nameseg). This doesn't really matter, because these paths do not 679167802Sjkim * end up in the final compiled AML, it's just an appearance issue for the 680167802Sjkim * disassembled code. 681167802Sjkim */ 682167802Sjkim Pathname[ACPI_STRLEN (Pathname) - ACPI_NAME_SIZE] = 0; 683167802Sjkim ACPI_STRNCAT (Pathname, ResourceNode->Name.Ascii, ACPI_NAME_SIZE); 684167802Sjkim ACPI_STRCAT (Pathname, "."); 685167802Sjkim ACPI_STRNCAT (Pathname, Tag, ACPI_NAME_SIZE); 686167802Sjkim 687167802Sjkim /* Internalize the namepath to AML format */ 688167802Sjkim 689167802Sjkim AcpiNsInternalizeName (Pathname, &InternalPath); 690167802Sjkim ACPI_FREE (Pathname); 691237412Sjkim 692237412Sjkim /* Update the Op with the symbol */ 693237412Sjkim 694237412Sjkim AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP); 695237412Sjkim IndexOp->Common.Value.String = InternalPath; 696237412Sjkim 697237412Sjkim /* We will need the tag later. Cheat by putting it in the Node field */ 698237412Sjkim 699237412Sjkim IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag); 700167802Sjkim return (InternalPath); 701167802Sjkim} 702167802Sjkim 703167802Sjkim 704167802Sjkim/******************************************************************************* 705167802Sjkim * 706167802Sjkim * FUNCTION: AcpiDmUpdateResourceName 707167802Sjkim * 708167802Sjkim * PARAMETERS: ResourceNode - Node for a resource descriptor 709167802Sjkim * 710167802Sjkim * RETURN: Stores new name in the ResourceNode 711167802Sjkim * 712167802Sjkim * DESCRIPTION: Create a new, unique name for a resource descriptor. Used by 713167802Sjkim * both the disassembly of the descriptor itself and any symbolic 714167802Sjkim * references to the descriptor. Ignored if a unique name has 715167802Sjkim * already been assigned to the resource. 716167802Sjkim * 717167802Sjkim * NOTE: Single threaded, suitable for applications only! 718167802Sjkim * 719167802Sjkim ******************************************************************************/ 720167802Sjkim 721167802Sjkimstatic void 722167802SjkimAcpiDmUpdateResourceName ( 723167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode) 724167802Sjkim{ 725167802Sjkim char Name[ACPI_NAME_SIZE]; 726167802Sjkim 727167802Sjkim 728167802Sjkim /* Ignore if a unique name has already been assigned */ 729167802Sjkim 730167802Sjkim if (ResourceNode->Name.Integer != ACPI_DEFAULT_RESNAME) 731167802Sjkim { 732167802Sjkim return; 733167802Sjkim } 734167802Sjkim 735167802Sjkim /* Generate a new ACPI name for the descriptor */ 736167802Sjkim 737167802Sjkim Name[0] = '_'; 738167802Sjkim Name[1] = AcpiGbl_Prefix[AcpiGbl_NextPrefix]; 739212761Sjkim Name[2] = AcpiUtHexToAsciiChar ((UINT64) AcpiGbl_NextResourceId, 4); 740212761Sjkim Name[3] = AcpiUtHexToAsciiChar ((UINT64) AcpiGbl_NextResourceId, 0); 741167802Sjkim 742167802Sjkim /* Update globals for next name */ 743167802Sjkim 744167802Sjkim AcpiGbl_NextResourceId++; 745167802Sjkim if (AcpiGbl_NextResourceId >= 256) 746167802Sjkim { 747167802Sjkim AcpiGbl_NextResourceId = 0; 748167802Sjkim AcpiGbl_NextPrefix++; 749167802Sjkim if (AcpiGbl_NextPrefix > ACPI_NUM_RES_PREFIX) 750167802Sjkim { 751167802Sjkim AcpiGbl_NextPrefix = 0; 752167802Sjkim } 753167802Sjkim } 754167802Sjkim 755167802Sjkim /* Change the resource descriptor name */ 756167802Sjkim 757193529Sjkim ResourceNode->Name.Integer = *ACPI_CAST_PTR (UINT32, &Name[0]); 758167802Sjkim} 759167802Sjkim 760167802Sjkim 761167802Sjkim/******************************************************************************* 762167802Sjkim * 763167802Sjkim * FUNCTION: AcpiDmGetResourceTag 764167802Sjkim * 765167802Sjkim * PARAMETERS: BitIndex - Index into the resource descriptor 766167802Sjkim * Resource - Pointer to the raw resource data 767167802Sjkim * ResourceIndex - Index correspoinding to the resource type 768167802Sjkim * 769167802Sjkim * RETURN: Pointer to the resource tag (ACPI_NAME). NULL if no match. 770167802Sjkim * 771167802Sjkim * DESCRIPTION: Convert a BitIndex into a symbolic resource tag. 772167802Sjkim * 773228110Sjkim * Note: ResourceIndex should be previously validated and guaranteed to ve 774228110Sjkim * valid. 775228110Sjkim * 776167802Sjkim ******************************************************************************/ 777167802Sjkim 778167802Sjkimstatic char * 779167802SjkimAcpiDmGetResourceTag ( 780167802Sjkim UINT32 BitIndex, 781167802Sjkim AML_RESOURCE *Resource, 782167802Sjkim UINT8 ResourceIndex) 783167802Sjkim{ 784228110Sjkim const ACPI_RESOURCE_TAG *TagList; 785167802Sjkim char *Tag = NULL; 786167802Sjkim 787167802Sjkim 788167802Sjkim /* Get the tag list for this resource descriptor type */ 789167802Sjkim 790167802Sjkim TagList = AcpiGbl_ResourceTags[ResourceIndex]; 791167802Sjkim 792167802Sjkim /* 793228110Sjkim * Handle descriptors that have multiple subtypes 794167802Sjkim */ 795167802Sjkim switch (Resource->DescriptorType) 796167802Sjkim { 797167802Sjkim case ACPI_RESOURCE_NAME_ADDRESS16: 798167802Sjkim case ACPI_RESOURCE_NAME_ADDRESS32: 799167802Sjkim case ACPI_RESOURCE_NAME_ADDRESS64: 800167802Sjkim case ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64: 801228110Sjkim /* 802228110Sjkim * Subtype differentiation is the flags. 803228110Sjkim * Kindof brute force, but just blindly search for an index match 804228110Sjkim */ 805167802Sjkim if (Resource->Address.ResourceType == ACPI_ADDRESS_TYPE_MEMORY_RANGE) 806167802Sjkim { 807167802Sjkim Tag = AcpiDmSearchTagList (BitIndex, AcpiDmMemoryFlagTags); 808167802Sjkim } 809167802Sjkim else if (Resource->Address.ResourceType == ACPI_ADDRESS_TYPE_IO_RANGE) 810167802Sjkim { 811167802Sjkim Tag = AcpiDmSearchTagList (BitIndex, AcpiDmIoFlagTags); 812167802Sjkim } 813167802Sjkim 814167802Sjkim /* If we found a match, all done. Else, drop to normal search below */ 815167802Sjkim 816167802Sjkim if (Tag) 817167802Sjkim { 818167802Sjkim return (Tag); 819167802Sjkim } 820167802Sjkim break; 821167802Sjkim 822228110Sjkim case ACPI_RESOURCE_NAME_GPIO: 823228110Sjkim 824228110Sjkim /* GPIO connection has 2 subtypes: Interrupt and I/O */ 825228110Sjkim 826228110Sjkim if (Resource->Gpio.ConnectionType > AML_RESOURCE_MAX_GPIOTYPE) 827228110Sjkim { 828228110Sjkim return (NULL); 829228110Sjkim } 830228110Sjkim 831228110Sjkim TagList = AcpiGbl_GpioResourceTags[Resource->Gpio.ConnectionType]; 832228110Sjkim break; 833228110Sjkim 834228110Sjkim case ACPI_RESOURCE_NAME_SERIAL_BUS: 835228110Sjkim 836228110Sjkim /* SerialBus has 3 subtypes: I2C, SPI, and UART */ 837228110Sjkim 838228110Sjkim if ((Resource->CommonSerialBus.Type == 0) || 839228110Sjkim (Resource->CommonSerialBus.Type > AML_RESOURCE_MAX_SERIALBUSTYPE)) 840228110Sjkim { 841228110Sjkim return (NULL); 842228110Sjkim } 843228110Sjkim 844228110Sjkim TagList = AcpiGbl_SerialResourceTags[Resource->CommonSerialBus.Type]; 845228110Sjkim break; 846228110Sjkim 847167802Sjkim default: 848250838Sjkim 849167802Sjkim break; 850167802Sjkim } 851167802Sjkim 852228110Sjkim /* Search for a match against the BitIndex */ 853167802Sjkim 854228110Sjkim if (TagList) 855228110Sjkim { 856228110Sjkim Tag = AcpiDmSearchTagList (BitIndex, TagList); 857228110Sjkim } 858228110Sjkim 859167802Sjkim return (Tag); 860167802Sjkim} 861167802Sjkim 862167802Sjkim 863167802Sjkim/******************************************************************************* 864167802Sjkim * 865167802Sjkim * FUNCTION: AcpiDmSearchTagList 866167802Sjkim * 867167802Sjkim * PARAMETERS: BitIndex - Index into the resource descriptor 868167802Sjkim * TagList - List to search 869167802Sjkim * 870167802Sjkim * RETURN: Pointer to a tag (ACPI_NAME). NULL if no match found. 871167802Sjkim * 872167802Sjkim * DESCRIPTION: Search a tag list for a match to the input BitIndex. Matches 873167802Sjkim * a fixed offset to a symbolic resource tag name. 874167802Sjkim * 875167802Sjkim ******************************************************************************/ 876167802Sjkim 877167802Sjkimstatic char * 878167802SjkimAcpiDmSearchTagList ( 879167802Sjkim UINT32 BitIndex, 880228110Sjkim const ACPI_RESOURCE_TAG *TagList) 881167802Sjkim{ 882167802Sjkim 883167802Sjkim /* 884167802Sjkim * Walk the null-terminated tag list to find a matching bit offset. 885167802Sjkim * We are looking for an exact match. 886167802Sjkim */ 887167802Sjkim for ( ; TagList->Tag; TagList++) 888167802Sjkim { 889167802Sjkim if (BitIndex == TagList->BitIndex) 890167802Sjkim { 891167802Sjkim return (TagList->Tag); 892167802Sjkim } 893167802Sjkim } 894167802Sjkim 895167802Sjkim /* A matching offset was not found */ 896167802Sjkim 897167802Sjkim return (NULL); 898167802Sjkim} 899167802Sjkim 900167802Sjkim 901167802Sjkim/******************************************************************************* 902167802Sjkim * 903167802Sjkim * FUNCTION: AcpiDmFindResources 904167802Sjkim * 905167802Sjkim * PARAMETERS: Root - Root of the parse tree 906167802Sjkim * 907167802Sjkim * RETURN: None 908167802Sjkim * 909167802Sjkim * DESCRIPTION: Add all ResourceTemplate declarations to the namespace. Each 910167802Sjkim * resource descriptor in each template is given a node -- used 911167802Sjkim * for later conversion of resource references to symbolic refs. 912167802Sjkim * 913167802Sjkim ******************************************************************************/ 914167802Sjkim 915167802Sjkimvoid 916167802SjkimAcpiDmFindResources ( 917167802Sjkim ACPI_PARSE_OBJECT *Root) 918167802Sjkim{ 919167802Sjkim ACPI_PARSE_OBJECT *Op = Root; 920167802Sjkim ACPI_PARSE_OBJECT *Parent; 921167802Sjkim 922167802Sjkim 923167802Sjkim /* Walk the entire parse tree */ 924167802Sjkim 925167802Sjkim while (Op) 926167802Sjkim { 927167802Sjkim /* We are interested in Buffer() declarations */ 928167802Sjkim 929167802Sjkim if (Op->Common.AmlOpcode == AML_BUFFER_OP) 930167802Sjkim { 931167802Sjkim /* And only declarations of the form Name (XXXX, Buffer()... ) */ 932167802Sjkim 933167802Sjkim Parent = Op->Common.Parent; 934167802Sjkim if (Parent->Common.AmlOpcode == AML_NAME_OP) 935167802Sjkim { 936167802Sjkim /* 937167802Sjkim * If the buffer is a resource template, add the individual 938167802Sjkim * resource descriptors to the namespace, as children of the 939167802Sjkim * buffer node. 940167802Sjkim */ 941243347Sjkim if (ACPI_SUCCESS (AcpiDmIsResourceTemplate (NULL, Op))) 942167802Sjkim { 943167802Sjkim Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; 944167802Sjkim AcpiDmAddResourcesToNamespace (Parent->Common.Node, Op); 945167802Sjkim } 946167802Sjkim } 947167802Sjkim } 948167802Sjkim 949167802Sjkim Op = AcpiPsGetDepthNext (Root, Op); 950167802Sjkim } 951167802Sjkim} 952167802Sjkim 953167802Sjkim 954167802Sjkim/******************************************************************************* 955167802Sjkim * 956167802Sjkim * FUNCTION: AcpiDmAddResourcesToNamespace 957167802Sjkim * 958167802Sjkim * PARAMETERS: BufferNode - Node for the parent buffer 959167802Sjkim * Op - Parse op for the buffer 960167802Sjkim * 961167802Sjkim * RETURN: None 962167802Sjkim * 963167802Sjkim * DESCRIPTION: Add an entire resource template to the namespace. Each 964167802Sjkim * resource descriptor is added as a namespace node. 965167802Sjkim * 966167802Sjkim ******************************************************************************/ 967167802Sjkim 968167802Sjkimstatic void 969167802SjkimAcpiDmAddResourcesToNamespace ( 970167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 971167802Sjkim ACPI_PARSE_OBJECT *Op) 972167802Sjkim{ 973167802Sjkim ACPI_PARSE_OBJECT *NextOp; 974167802Sjkim 975167802Sjkim 976167802Sjkim /* Get to the ByteData list */ 977167802Sjkim 978167802Sjkim NextOp = Op->Common.Value.Arg; 979167802Sjkim NextOp = NextOp->Common.Next; 980167802Sjkim if (!NextOp) 981167802Sjkim { 982167802Sjkim return; 983167802Sjkim } 984167802Sjkim 985167802Sjkim /* Set Node and Op to point to each other */ 986167802Sjkim 987167802Sjkim BufferNode->Op = Op; 988167802Sjkim Op->Common.Node = BufferNode; 989167802Sjkim 990167802Sjkim /* 991167802Sjkim * Insert each resource into the namespace 992167802Sjkim * NextOp contains the Aml pointer and the Aml length 993167802Sjkim */ 994243347Sjkim AcpiUtWalkAmlResources (NULL, (UINT8 *) NextOp->Named.Data, 995167802Sjkim (ACPI_SIZE) NextOp->Common.Value.Integer, 996245582Sjkim AcpiDmAddResourceToNamespace, (void **) BufferNode); 997167802Sjkim} 998167802Sjkim 999167802Sjkim 1000167802Sjkim/******************************************************************************* 1001167802Sjkim * 1002167802Sjkim * FUNCTION: AcpiDmAddResourceToNamespace 1003167802Sjkim * 1004167802Sjkim * PARAMETERS: ACPI_WALK_AML_CALLBACK 1005167802Sjkim * BufferNode - Node for the parent buffer 1006167802Sjkim * 1007167802Sjkim * RETURN: Status 1008167802Sjkim * 1009167802Sjkim * DESCRIPTION: Add one resource descriptor to the namespace as a child of the 1010167802Sjkim * parent buffer. The same name is used for each descriptor. This 1011167802Sjkim * is changed later to a unique name if the resource is actually 1012167802Sjkim * referenced by an AML operator. 1013167802Sjkim * 1014167802Sjkim ******************************************************************************/ 1015167802Sjkim 1016167802Sjkimstatic ACPI_STATUS 1017167802SjkimAcpiDmAddResourceToNamespace ( 1018167802Sjkim UINT8 *Aml, 1019167802Sjkim UINT32 Length, 1020167802Sjkim UINT32 Offset, 1021167802Sjkim UINT8 ResourceIndex, 1022245582Sjkim void **Context) 1023167802Sjkim{ 1024167802Sjkim ACPI_STATUS Status; 1025167802Sjkim ACPI_GENERIC_STATE ScopeInfo; 1026167802Sjkim ACPI_NAMESPACE_NODE *Node; 1027167802Sjkim 1028167802Sjkim 1029167802Sjkim /* TBD: Don't need to add descriptors that have no tags defined? */ 1030167802Sjkim 1031167802Sjkim /* Add the resource to the namespace, as child of the buffer */ 1032167802Sjkim 1033167802Sjkim ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Context); 1034167802Sjkim Status = AcpiNsLookup (&ScopeInfo, "_TMP", ACPI_TYPE_LOCAL_RESOURCE, 1035167802Sjkim ACPI_IMODE_LOAD_PASS2, 1036167802Sjkim ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_PREFIX_IS_SCOPE, 1037167802Sjkim NULL, &Node); 1038167802Sjkim if (ACPI_FAILURE (Status)) 1039167802Sjkim { 1040167802Sjkim return (AE_OK); 1041167802Sjkim } 1042167802Sjkim 1043167802Sjkim /* Set the name to the default, changed later if resource is referenced */ 1044167802Sjkim 1045167802Sjkim Node->Name.Integer = ACPI_DEFAULT_RESNAME; 1046167802Sjkim 1047167802Sjkim /* Save the offset of the descriptor (within the original buffer) */ 1048167802Sjkim 1049167802Sjkim Node->Value = Offset; 1050167802Sjkim Node->Length = Length; 1051167802Sjkim return (AE_OK); 1052167802Sjkim} 1053