1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmrestag - Add tags to resource descriptors (Application-level) 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, 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 44193529Sjkim#include <contrib/dev/acpica/include/acpi.h> 45193529Sjkim#include <contrib/dev/acpica/include/accommon.h> 46193529Sjkim#include <contrib/dev/acpica/include/acparser.h> 47193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h> 48193529Sjkim#include <contrib/dev/acpica/include/acnamesp.h> 49193529Sjkim#include <contrib/dev/acpica/include/amlcode.h> 50167802Sjkim 51167802Sjkim/* This module used for application-level code only */ 52167802Sjkim 53167802Sjkim#define _COMPONENT ACPI_CA_DISASSEMBLER 54167802Sjkim ACPI_MODULE_NAME ("dmrestag") 55167802Sjkim 56167802Sjkim/* Local prototypes */ 57167802Sjkim 58167802Sjkimstatic void 59167802SjkimAcpiDmUpdateResourceName ( 60167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode); 61167802Sjkim 62167802Sjkimstatic char * 63167802SjkimAcpiDmSearchTagList ( 64167802Sjkim UINT32 BitIndex, 65228110Sjkim const ACPI_RESOURCE_TAG *TagList); 66167802Sjkim 67167802Sjkimstatic char * 68167802SjkimAcpiDmGetResourceTag ( 69167802Sjkim UINT32 BitIndex, 70167802Sjkim AML_RESOURCE *Resource, 71167802Sjkim UINT8 ResourceIndex); 72167802Sjkim 73167802Sjkimstatic char * 74167802SjkimAcpiGetTagPathname ( 75237412Sjkim ACPI_PARSE_OBJECT *Op, 76167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 77167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode, 78167802Sjkim UINT32 BitIndex); 79167802Sjkim 80167802Sjkimstatic ACPI_NAMESPACE_NODE * 81167802SjkimAcpiDmGetResourceNode ( 82167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 83167802Sjkim UINT32 BitIndex); 84167802Sjkim 85167802Sjkimstatic ACPI_STATUS 86167802SjkimAcpiDmAddResourceToNamespace ( 87167802Sjkim UINT8 *Aml, 88167802Sjkim UINT32 Length, 89167802Sjkim UINT32 Offset, 90167802Sjkim UINT8 ResourceIndex, 91245582Sjkim void **Context); 92167802Sjkim 93167802Sjkimstatic void 94167802SjkimAcpiDmAddResourcesToNamespace ( 95167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 96167802Sjkim ACPI_PARSE_OBJECT *Op); 97167802Sjkim 98167802Sjkim 99167802Sjkim/****************************************************************************** 100167802Sjkim * 101167802Sjkim * Resource Tag tables 102167802Sjkim * 103167802Sjkim * These are the predefined tags that refer to elements of a resource 104167802Sjkim * descriptor. Each name and offset is defined in the ACPI specification. 105167802Sjkim * 106167802Sjkim * Each table entry contains the bit offset of the field and the associated 107167802Sjkim * name. 108167802Sjkim * 109167802Sjkim ******************************************************************************/ 110167802Sjkim 111228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmIrqTags[] = 112167802Sjkim{ 113167802Sjkim {( 1 * 8), ACPI_RESTAG_INTERRUPT}, 114167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_INTERRUPTTYPE}, 115167802Sjkim {( 3 * 8) + 3, ACPI_RESTAG_INTERRUPTLEVEL}, 116167802Sjkim {( 3 * 8) + 4, ACPI_RESTAG_INTERRUPTSHARE}, 117167802Sjkim {0, NULL} 118167802Sjkim}; 119167802Sjkim 120228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmDmaTags[] = 121167802Sjkim{ 122167802Sjkim {( 1 * 8), ACPI_RESTAG_DMA}, 123167802Sjkim {( 2 * 8) + 0, ACPI_RESTAG_XFERTYPE}, 124167802Sjkim {( 2 * 8) + 2, ACPI_RESTAG_BUSMASTER}, 125167802Sjkim {( 2 * 8) + 5, ACPI_RESTAG_DMATYPE}, 126167802Sjkim {0, NULL} 127167802Sjkim}; 128167802Sjkim 129228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmIoTags[] = 130167802Sjkim{ 131167802Sjkim {( 1 * 8) + 0, ACPI_RESTAG_DECODE}, 132167802Sjkim {( 2 * 8), ACPI_RESTAG_MINADDR}, 133167802Sjkim {( 4 * 8), ACPI_RESTAG_MAXADDR}, 134167802Sjkim {( 6 * 8), ACPI_RESTAG_ALIGNMENT}, 135167802Sjkim {( 7 * 8), ACPI_RESTAG_LENGTH}, 136167802Sjkim {0, NULL} 137167802Sjkim}; 138167802Sjkim 139228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmFixedIoTags[] = 140167802Sjkim{ 141167802Sjkim {( 1 * 8), ACPI_RESTAG_BASEADDRESS}, 142167802Sjkim {( 3 * 8), ACPI_RESTAG_LENGTH}, 143167802Sjkim {0, NULL} 144167802Sjkim}; 145167802Sjkim 146228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmFixedDmaTags[] = 147167802Sjkim{ 148228110Sjkim {( 1 * 8), ACPI_RESTAG_DMA}, 149228110Sjkim {( 3 * 8), ACPI_RESTAG_DMATYPE}, 150228110Sjkim {( 5 * 8), ACPI_RESTAG_XFERTYPE}, 151228110Sjkim {0, NULL} 152228110Sjkim}; 153228110Sjkim 154228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmMemory24Tags[] = 155228110Sjkim{ 156167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 157167802Sjkim {( 4 * 8), ACPI_RESTAG_MINADDR}, 158167802Sjkim {( 6 * 8), ACPI_RESTAG_MAXADDR}, 159167802Sjkim {( 8 * 8), ACPI_RESTAG_ALIGNMENT}, 160167802Sjkim {(10 * 8), ACPI_RESTAG_LENGTH}, 161167802Sjkim {0, NULL} 162167802Sjkim}; 163167802Sjkim 164228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmRegisterTags[] = 165167802Sjkim{ 166167802Sjkim {( 3 * 8), ACPI_RESTAG_ADDRESSSPACE}, 167167802Sjkim {( 4 * 8), ACPI_RESTAG_REGISTERBITWIDTH}, 168167802Sjkim {( 5 * 8), ACPI_RESTAG_REGISTERBITOFFSET}, 169167802Sjkim {( 6 * 8), ACPI_RESTAG_ACCESSSIZE}, 170167802Sjkim {( 7 * 8), ACPI_RESTAG_ADDRESS}, 171167802Sjkim {0, NULL} 172167802Sjkim}; 173167802Sjkim 174228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmMemory32Tags[] = 175167802Sjkim{ 176167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 177167802Sjkim {( 4 * 8), ACPI_RESTAG_MINADDR}, 178167802Sjkim {( 8 * 8), ACPI_RESTAG_MAXADDR}, 179167802Sjkim {(12 * 8), ACPI_RESTAG_ALIGNMENT}, 180167802Sjkim {(16 * 8), ACPI_RESTAG_LENGTH}, 181167802Sjkim {0, NULL} 182167802Sjkim}; 183167802Sjkim 184228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmFixedMemory32Tags[] = 185167802Sjkim{ 186167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 187167802Sjkim {( 4 * 8), ACPI_RESTAG_BASEADDRESS}, 188167802Sjkim {( 8 * 8), ACPI_RESTAG_LENGTH}, 189167802Sjkim {0, NULL} 190167802Sjkim}; 191167802Sjkim 192228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmInterruptTags[] = 193167802Sjkim{ 194167802Sjkim {( 3 * 8) + 1, ACPI_RESTAG_INTERRUPTTYPE}, 195167802Sjkim {( 3 * 8) + 2, ACPI_RESTAG_INTERRUPTLEVEL}, 196167802Sjkim {( 3 * 8) + 3, ACPI_RESTAG_INTERRUPTSHARE}, 197167802Sjkim {( 5 * 8), ACPI_RESTAG_INTERRUPT}, 198167802Sjkim {0, NULL} 199167802Sjkim}; 200167802Sjkim 201228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmAddress16Tags[] = 202167802Sjkim{ 203167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 204167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 205167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 206167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 207167802Sjkim {( 8 * 8), ACPI_RESTAG_MINADDR}, 208167802Sjkim {(10 * 8), ACPI_RESTAG_MAXADDR}, 209167802Sjkim {(12 * 8), ACPI_RESTAG_TRANSLATION}, 210167802Sjkim {(14 * 8), ACPI_RESTAG_LENGTH}, 211167802Sjkim {0, NULL} 212167802Sjkim}; 213167802Sjkim 214228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmAddress32Tags[] = 215167802Sjkim{ 216167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 217167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 218167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 219167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 220167802Sjkim {(10 * 8), ACPI_RESTAG_MINADDR}, 221167802Sjkim {(14 * 8), ACPI_RESTAG_MAXADDR}, 222167802Sjkim {(18 * 8), ACPI_RESTAG_TRANSLATION}, 223167802Sjkim {(22 * 8), ACPI_RESTAG_LENGTH}, 224167802Sjkim {0, NULL} 225167802Sjkim}; 226167802Sjkim 227228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmAddress64Tags[] = 228167802Sjkim{ 229167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 230167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 231167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 232167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 233167802Sjkim {(14 * 8), ACPI_RESTAG_MINADDR}, 234167802Sjkim {(22 * 8), ACPI_RESTAG_MAXADDR}, 235167802Sjkim {(30 * 8), ACPI_RESTAG_TRANSLATION}, 236167802Sjkim {(38 * 8), ACPI_RESTAG_LENGTH}, 237167802Sjkim {0, NULL} 238167802Sjkim}; 239167802Sjkim 240228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmExtendedAddressTags[] = 241167802Sjkim{ 242167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 243167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 244167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 245167802Sjkim {( 8 * 8), ACPI_RESTAG_GRANULARITY}, 246167802Sjkim {(16 * 8), ACPI_RESTAG_MINADDR}, 247167802Sjkim {(24 * 8), ACPI_RESTAG_MAXADDR}, 248167802Sjkim {(32 * 8), ACPI_RESTAG_TRANSLATION}, 249167802Sjkim {(40 * 8), ACPI_RESTAG_LENGTH}, 250167802Sjkim {(48 * 8), ACPI_RESTAG_TYPESPECIFICATTRIBUTES}, 251167802Sjkim {0, NULL} 252167802Sjkim}; 253167802Sjkim 254228110Sjkim/* Subtype tables for GPIO descriptors */ 255167802Sjkim 256228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmGpioIntTags[] = 257167802Sjkim{ 258228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_MODE}, 259228110Sjkim {( 7 * 8) + 1, ACPI_RESTAG_POLARITY}, 260228110Sjkim {( 7 * 8) + 3, ACPI_RESTAG_INTERRUPTSHARE}, 261228110Sjkim {( 9 * 8), ACPI_RESTAG_PINCONFIG}, 262228110Sjkim {(10 * 8), ACPI_RESTAG_DRIVESTRENGTH}, 263228110Sjkim {(12 * 8), ACPI_RESTAG_DEBOUNCETIME}, 264228110Sjkim {0, NULL} 265228110Sjkim}; 266228110Sjkim 267228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmGpioIoTags[] = 268228110Sjkim{ 269228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_IORESTRICTION}, 270228110Sjkim {( 7 * 8) + 3, ACPI_RESTAG_INTERRUPTSHARE}, 271228110Sjkim {( 9 * 8), ACPI_RESTAG_PINCONFIG}, 272228110Sjkim {(10 * 8), ACPI_RESTAG_DRIVESTRENGTH}, 273228110Sjkim {(12 * 8), ACPI_RESTAG_DEBOUNCETIME}, 274228110Sjkim {0, NULL} 275228110Sjkim}; 276228110Sjkim 277228110Sjkim/* Subtype tables for SerialBus descriptors */ 278228110Sjkim 279228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmI2cSerialBusTags[] = 280228110Sjkim{ 281228110Sjkim {( 6 * 8) + 0, ACPI_RESTAG_SLAVEMODE}, 282306536Sjkim {( 6 * 8) + 2, ACPI_RESTAG_INTERRUPTSHARE}, /* V2 - ACPI 6.0 */ 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}, 292306536Sjkim {( 6 * 8) + 2, ACPI_RESTAG_INTERRUPTSHARE}, /* V2 - ACPI 6.0 */ 293228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_MODE}, 294228110Sjkim {( 7 * 8) + 1, ACPI_RESTAG_DEVICEPOLARITY}, 295228110Sjkim {(12 * 8), ACPI_RESTAG_SPEED}, 296228110Sjkim {(16 * 8), ACPI_RESTAG_LENGTH}, 297228110Sjkim {(17 * 8), ACPI_RESTAG_PHASE}, 298228110Sjkim {(18 * 8), ACPI_RESTAG_POLARITY}, 299228110Sjkim {(19 * 8), ACPI_RESTAG_ADDRESS}, 300228110Sjkim {0, NULL} 301228110Sjkim}; 302228110Sjkim 303228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmUartSerialBusTags[] = 304228110Sjkim{ 305306536Sjkim {( 6 * 8) + 0, ACPI_RESTAG_SLAVEMODE}, /* Note: not part of original macro */ 306306536Sjkim {( 6 * 8) + 2, ACPI_RESTAG_INTERRUPTSHARE}, /* V2 - ACPI 6.0 */ 307228110Sjkim {( 7 * 8) + 0, ACPI_RESTAG_FLOWCONTROL}, 308228110Sjkim {( 7 * 8) + 2, ACPI_RESTAG_STOPBITS}, 309228110Sjkim {( 7 * 8) + 4, ACPI_RESTAG_LENGTH}, 310228110Sjkim {( 7 * 8) + 7, ACPI_RESTAG_ENDIANNESS}, 311228110Sjkim {(12 * 8), ACPI_RESTAG_SPEED}, 312228110Sjkim {(16 * 8), ACPI_RESTAG_LENGTH_RX}, 313228110Sjkim {(18 * 8), ACPI_RESTAG_LENGTH_TX}, 314228110Sjkim {(20 * 8), ACPI_RESTAG_PARITY}, 315228110Sjkim {(21 * 8), ACPI_RESTAG_LINE}, 316228110Sjkim {0, NULL} 317228110Sjkim}; 318228110Sjkim 319228110Sjkim/* Subtype tables for Address descriptor type-specific flags */ 320228110Sjkim 321228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmMemoryFlagTags[] = 322228110Sjkim{ 323167802Sjkim {( 5 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 324167802Sjkim {( 5 * 8) + 1, ACPI_RESTAG_MEMTYPE}, 325167802Sjkim {( 5 * 8) + 3, ACPI_RESTAG_MEMATTRIBUTES}, 326167802Sjkim {( 5 * 8) + 5, ACPI_RESTAG_TYPE}, 327167802Sjkim {0, NULL} 328167802Sjkim}; 329167802Sjkim 330228110Sjkimstatic const ACPI_RESOURCE_TAG AcpiDmIoFlagTags[] = 331167802Sjkim{ 332167802Sjkim {( 5 * 8) + 0, ACPI_RESTAG_RANGETYPE}, 333167802Sjkim {( 5 * 8) + 4, ACPI_RESTAG_TYPE}, 334167802Sjkim {( 5 * 8) + 5, ACPI_RESTAG_TRANSTYPE}, 335167802Sjkim {0, NULL} 336167802Sjkim}; 337167802Sjkim 338167802Sjkim 339228110Sjkim/* 340228110Sjkim * Dispatch table used to obtain the correct tag table for a descriptor. 341228110Sjkim * 342228110Sjkim * A NULL in this table means one of three things: 343228110Sjkim * 1) The descriptor ID is reserved and invalid 344228110Sjkim * 2) The descriptor has no tags associated with it 345228110Sjkim * 3) The descriptor has subtypes and a separate table will be used. 346228110Sjkim */ 347228110Sjkimstatic const ACPI_RESOURCE_TAG *AcpiGbl_ResourceTags[] = 348167802Sjkim{ 349167802Sjkim /* Small descriptors */ 350167802Sjkim 351167802Sjkim NULL, /* 0x00, Reserved */ 352167802Sjkim NULL, /* 0x01, Reserved */ 353167802Sjkim NULL, /* 0x02, Reserved */ 354167802Sjkim NULL, /* 0x03, Reserved */ 355167802Sjkim AcpiDmIrqTags, /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */ 356167802Sjkim AcpiDmDmaTags, /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */ 357167802Sjkim NULL, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */ 358167802Sjkim NULL, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */ 359167802Sjkim AcpiDmIoTags, /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */ 360167802Sjkim AcpiDmFixedIoTags, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */ 361228110Sjkim AcpiDmFixedDmaTags, /* 0x0A, ACPI_RESOURCE_NAME_FIXED_DMA */ 362167802Sjkim NULL, /* 0x0B, Reserved */ 363167802Sjkim NULL, /* 0x0C, Reserved */ 364167802Sjkim NULL, /* 0x0D, Reserved */ 365167802Sjkim NULL, /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */ 366167802Sjkim NULL, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */ 367167802Sjkim 368167802Sjkim /* Large descriptors */ 369167802Sjkim 370167802Sjkim NULL, /* 0x00, Reserved */ 371167802Sjkim AcpiDmMemory24Tags, /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */ 372167802Sjkim AcpiDmRegisterTags, /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */ 373167802Sjkim NULL, /* 0x03, Reserved */ 374167802Sjkim NULL, /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */ 375167802Sjkim AcpiDmMemory32Tags, /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */ 376167802Sjkim AcpiDmFixedMemory32Tags, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */ 377167802Sjkim AcpiDmAddress32Tags, /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */ 378167802Sjkim AcpiDmAddress16Tags, /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */ 379167802Sjkim AcpiDmInterruptTags, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */ 380167802Sjkim AcpiDmAddress64Tags, /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */ 381228110Sjkim AcpiDmExtendedAddressTags, /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */ 382228110Sjkim NULL, /* 0x0C, ACPI_RESOURCE_NAME_GPIO - Use Subtype table below */ 383228110Sjkim NULL, /* 0x0D, Reserved */ 384228110Sjkim NULL /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use Subtype table below */ 385167802Sjkim}; 386167802Sjkim 387228110Sjkim/* GPIO Subtypes */ 388167802Sjkim 389228110Sjkimstatic const ACPI_RESOURCE_TAG *AcpiGbl_GpioResourceTags[] = 390228110Sjkim{ 391228110Sjkim AcpiDmGpioIntTags, /* 0x00 Interrupt Connection */ 392228110Sjkim AcpiDmGpioIoTags /* 0x01 I/O Connection */ 393228110Sjkim}; 394228110Sjkim 395228110Sjkim/* Serial Bus Subtypes */ 396228110Sjkim 397228110Sjkimstatic const ACPI_RESOURCE_TAG *AcpiGbl_SerialResourceTags[] = 398228110Sjkim{ 399228110Sjkim NULL, /* 0x00 Reserved */ 400228110Sjkim AcpiDmI2cSerialBusTags, /* 0x01 I2C SerialBus */ 401228110Sjkim AcpiDmSpiSerialBusTags, /* 0x02 SPI SerialBus */ 402228110Sjkim AcpiDmUartSerialBusTags /* 0x03 UART SerialBus */ 403228110Sjkim}; 404228110Sjkim 405167802Sjkim/* 406167802Sjkim * Globals used to generate unique resource descriptor names. We use names that 407167802Sjkim * start with underscore and a prefix letter that is not used by other ACPI 408167802Sjkim * reserved names. To this, we append hex 0x00 through 0xFF. These 5 prefixes 409167802Sjkim * allow for 5*256 = 1280 unique names, probably sufficient for any single ASL 410167802Sjkim * file. If this becomes too small, we can use alpha+numerals for a total 411167802Sjkim * of 5*36*36 = 6480. 412167802Sjkim */ 413167802Sjkim#define ACPI_NUM_RES_PREFIX 5 414167802Sjkim 415167802Sjkimstatic UINT32 AcpiGbl_NextResourceId = 0; 416167802Sjkimstatic UINT8 AcpiGbl_NextPrefix = 0; 417197104Sjkimstatic char AcpiGbl_Prefix[ACPI_NUM_RES_PREFIX] = 418167802Sjkim {'Y','Z','J','K','X'}; 419167802Sjkim 420167802Sjkim 421167802Sjkim/******************************************************************************* 422167802Sjkim * 423167802Sjkim * FUNCTION: AcpiDmCheckResourceReference 424167802Sjkim * 425167802Sjkim * PARAMETERS: Op - Parse Op for the AML opcode 426167802Sjkim * WalkState - Current walk state (with valid scope) 427167802Sjkim * 428167802Sjkim * RETURN: None 429167802Sjkim * 430167802Sjkim * DESCRIPTION: Convert a reference to a resource descriptor to a symbolic 431167802Sjkim * reference if possible 432167802Sjkim * 433167802Sjkim * NOTE: Bit index is used to transparently handle both resource bit 434167802Sjkim * fields and byte fields. 435167802Sjkim * 436167802Sjkim ******************************************************************************/ 437167802Sjkim 438167802Sjkimvoid 439167802SjkimAcpiDmCheckResourceReference ( 440167802Sjkim ACPI_PARSE_OBJECT *Op, 441167802Sjkim ACPI_WALK_STATE *WalkState) 442167802Sjkim{ 443167802Sjkim ACPI_STATUS Status; 444167802Sjkim ACPI_PARSE_OBJECT *BufferNameOp; 445167802Sjkim ACPI_PARSE_OBJECT *IndexOp; 446167802Sjkim ACPI_NAMESPACE_NODE *BufferNode; 447167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode; 448167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 449167802Sjkim UINT32 BitIndex; 450167802Sjkim 451167802Sjkim 452167802Sjkim /* We are only interested in the CreateXxxxField opcodes */ 453167802Sjkim 454167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 455167802Sjkim if (OpInfo->Type != AML_TYPE_CREATE_FIELD) 456167802Sjkim { 457167802Sjkim return; 458167802Sjkim } 459167802Sjkim 460167802Sjkim /* Get the buffer term operand */ 461167802Sjkim 462167802Sjkim BufferNameOp = AcpiPsGetDepthNext (NULL, Op); 463167802Sjkim 464167802Sjkim /* Must be a named buffer, not an arg or local or method call */ 465167802Sjkim 466167802Sjkim if (BufferNameOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP) 467167802Sjkim { 468167802Sjkim return; 469167802Sjkim } 470167802Sjkim 471167802Sjkim /* Get the Index term, must be an integer constant to convert */ 472167802Sjkim 473167802Sjkim IndexOp = BufferNameOp->Common.Next; 474240716Sjkim 475240716Sjkim /* Major cheat: The Node field is also used for the Tag ptr. Clear it now */ 476240716Sjkim 477240716Sjkim IndexOp->Common.Node = NULL; 478240716Sjkim 479167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (IndexOp->Common.AmlOpcode); 480167802Sjkim if (OpInfo->ObjectType != ACPI_TYPE_INTEGER) 481167802Sjkim { 482167802Sjkim return; 483167802Sjkim } 484167802Sjkim 485167802Sjkim /* Get the bit offset of the descriptor within the buffer */ 486167802Sjkim 487167802Sjkim if ((Op->Common.AmlOpcode == AML_CREATE_BIT_FIELD_OP) || 488167802Sjkim (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)) 489167802Sjkim { 490167802Sjkim /* Index operand is a bit offset */ 491167802Sjkim 492167802Sjkim BitIndex = (UINT32) IndexOp->Common.Value.Integer; 493167802Sjkim } 494167802Sjkim else 495167802Sjkim { 496167802Sjkim /* Index operand is a byte offset, convert to bits */ 497167802Sjkim 498167802Sjkim BitIndex = (UINT32) ACPI_MUL_8 (IndexOp->Common.Value.Integer); 499167802Sjkim } 500167802Sjkim 501167802Sjkim /* Lookup the buffer in the namespace */ 502167802Sjkim 503167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, 504306536Sjkim BufferNameOp->Common.Value.String, ACPI_TYPE_BUFFER, 505306536Sjkim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, 506306536Sjkim &BufferNode); 507167802Sjkim if (ACPI_FAILURE (Status)) 508167802Sjkim { 509167802Sjkim return; 510167802Sjkim } 511167802Sjkim 512167802Sjkim /* Validate object type, we must have a buffer */ 513167802Sjkim 514167802Sjkim if (BufferNode->Type != ACPI_TYPE_BUFFER) 515167802Sjkim { 516167802Sjkim return; 517167802Sjkim } 518167802Sjkim 519167802Sjkim /* Find the resource descriptor node corresponding to the index */ 520167802Sjkim 521167802Sjkim ResourceNode = AcpiDmGetResourceNode (BufferNode, BitIndex); 522167802Sjkim if (!ResourceNode) 523167802Sjkim { 524167802Sjkim return; 525167802Sjkim } 526167802Sjkim 527167802Sjkim /* Translate the Index to a resource tag pathname */ 528167802Sjkim 529237412Sjkim AcpiGetTagPathname (IndexOp, BufferNode, ResourceNode, BitIndex); 530167802Sjkim} 531167802Sjkim 532167802Sjkim 533167802Sjkim/******************************************************************************* 534167802Sjkim * 535167802Sjkim * FUNCTION: AcpiDmGetResourceNode 536167802Sjkim * 537167802Sjkim * PARAMETERS: BufferNode - Node for the parent buffer 538167802Sjkim * BitIndex - Index into the resource descriptor 539167802Sjkim * 540167802Sjkim * RETURN: Namespace node for the resource descriptor. NULL if not found 541167802Sjkim * 542167802Sjkim * DESCRIPTION: Find a resource descriptor that corresponds to the bit index 543167802Sjkim * 544167802Sjkim ******************************************************************************/ 545167802Sjkim 546167802Sjkimstatic ACPI_NAMESPACE_NODE * 547167802SjkimAcpiDmGetResourceNode ( 548167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 549167802Sjkim UINT32 BitIndex) 550167802Sjkim{ 551167802Sjkim ACPI_NAMESPACE_NODE *Node; 552167802Sjkim UINT32 ByteIndex = ACPI_DIV_8 (BitIndex); 553167802Sjkim 554167802Sjkim 555167802Sjkim /* 556167802Sjkim * Child list contains an entry for each resource descriptor. Find 557167802Sjkim * the descriptor that corresponds to the Index. 558167802Sjkim * 559167802Sjkim * If there are no children, this is not a resource template 560167802Sjkim */ 561167802Sjkim Node = BufferNode->Child; 562167802Sjkim while (Node) 563167802Sjkim { 564167802Sjkim /* 565167802Sjkim * Check if the Index falls within this resource. 566167802Sjkim * 567167802Sjkim * Value contains the resource offset, Object contains the resource 568167802Sjkim * length (both in bytes) 569167802Sjkim */ 570167802Sjkim if ((ByteIndex >= Node->Value) && 571167802Sjkim (ByteIndex < (Node->Value + Node->Length))) 572167802Sjkim { 573167802Sjkim return (Node); 574167802Sjkim } 575167802Sjkim 576167802Sjkim Node = Node->Peer; 577167802Sjkim } 578167802Sjkim 579167802Sjkim return (NULL); 580167802Sjkim} 581167802Sjkim 582167802Sjkim 583167802Sjkim/******************************************************************************* 584167802Sjkim * 585167802Sjkim * FUNCTION: AcpiGetTagPathname 586167802Sjkim * 587167802Sjkim * PARAMETERS: BufferNode - Node for the parent buffer 588167802Sjkim * ResourceNode - Node for a resource descriptor 589167802Sjkim * BitIndex - Index into the resource descriptor 590167802Sjkim * 591167802Sjkim * RETURN: Full pathname for a resource tag. NULL if no match. 592167802Sjkim * Path is returned in AML (packed) format. 593167802Sjkim * 594167802Sjkim * DESCRIPTION: Convert a BitIndex into a symbolic resource tag (full pathname) 595167802Sjkim * 596167802Sjkim ******************************************************************************/ 597167802Sjkim 598167802Sjkimstatic char * 599167802SjkimAcpiGetTagPathname ( 600237412Sjkim ACPI_PARSE_OBJECT *IndexOp, 601167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 602167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode, 603167802Sjkim UINT32 BitIndex) 604167802Sjkim{ 605167802Sjkim ACPI_STATUS Status; 606167802Sjkim UINT32 ResourceBitIndex; 607167802Sjkim UINT8 ResourceTableIndex; 608167802Sjkim ACPI_SIZE RequiredSize; 609167802Sjkim char *Pathname; 610167802Sjkim AML_RESOURCE *Aml; 611167802Sjkim ACPI_PARSE_OBJECT *Op; 612167802Sjkim char *InternalPath; 613167802Sjkim char *Tag; 614167802Sjkim 615167802Sjkim 616167802Sjkim /* Get the Op that contains the actual buffer data */ 617167802Sjkim 618167802Sjkim Op = BufferNode->Op->Common.Value.Arg; 619167802Sjkim Op = Op->Common.Next; 620167802Sjkim if (!Op) 621167802Sjkim { 622167802Sjkim return (NULL); 623167802Sjkim } 624167802Sjkim 625167802Sjkim /* Get the individual resource descriptor and validate it */ 626167802Sjkim 627306536Sjkim Aml = ACPI_CAST_PTR ( 628306536Sjkim AML_RESOURCE, &Op->Named.Data[ResourceNode->Value]); 629167802Sjkim 630243347Sjkim Status = AcpiUtValidateResource (NULL, Aml, &ResourceTableIndex); 631167802Sjkim if (ACPI_FAILURE (Status)) 632167802Sjkim { 633167802Sjkim return (NULL); 634167802Sjkim } 635167802Sjkim 636167802Sjkim /* Get offset into this descriptor (from offset into entire buffer) */ 637167802Sjkim 638167802Sjkim ResourceBitIndex = BitIndex - ACPI_MUL_8 (ResourceNode->Value); 639167802Sjkim 640167802Sjkim /* Get the tag associated with this resource descriptor and offset */ 641167802Sjkim 642167802Sjkim Tag = AcpiDmGetResourceTag (ResourceBitIndex, Aml, ResourceTableIndex); 643167802Sjkim if (!Tag) 644167802Sjkim { 645167802Sjkim return (NULL); 646167802Sjkim } 647167802Sjkim 648167802Sjkim /* 649167802Sjkim * Now that we know that we have a reference that can be converted to a 650167802Sjkim * symbol, change the name of the resource to a unique name. 651167802Sjkim */ 652167802Sjkim AcpiDmUpdateResourceName (ResourceNode); 653167802Sjkim 654167802Sjkim /* Get the full pathname to the parent buffer */ 655167802Sjkim 656306536Sjkim RequiredSize = AcpiNsBuildNormalizedPath (BufferNode, NULL, 0, FALSE); 657193529Sjkim if (!RequiredSize) 658193529Sjkim { 659193529Sjkim return (NULL); 660193529Sjkim } 661193529Sjkim 662167802Sjkim Pathname = ACPI_ALLOCATE_ZEROED (RequiredSize + ACPI_PATH_SEGMENT_LENGTH); 663167802Sjkim if (!Pathname) 664167802Sjkim { 665167802Sjkim return (NULL); 666167802Sjkim } 667167802Sjkim 668306536Sjkim (void) AcpiNsBuildNormalizedPath (BufferNode, Pathname, 669306536Sjkim RequiredSize, FALSE); 670167802Sjkim 671167802Sjkim /* 672167802Sjkim * Create the full path to the resource and tag by: remove the buffer name, 673167802Sjkim * append the resource descriptor name, append a dot, append the tag name. 674167802Sjkim * 675167802Sjkim * TBD: Always using the full path is a bit brute force, the path can be 676167802Sjkim * often be optimized with carats (if the original buffer namepath is a 677167802Sjkim * single nameseg). This doesn't really matter, because these paths do not 678167802Sjkim * end up in the final compiled AML, it's just an appearance issue for the 679167802Sjkim * disassembled code. 680167802Sjkim */ 681306536Sjkim Pathname[strlen (Pathname) - ACPI_NAME_SIZE] = 0; 682306536Sjkim strncat (Pathname, ResourceNode->Name.Ascii, ACPI_NAME_SIZE); 683306536Sjkim strcat (Pathname, "."); 684306536Sjkim strncat (Pathname, Tag, ACPI_NAME_SIZE); 685167802Sjkim 686167802Sjkim /* Internalize the namepath to AML format */ 687167802Sjkim 688167802Sjkim AcpiNsInternalizeName (Pathname, &InternalPath); 689167802Sjkim ACPI_FREE (Pathname); 690237412Sjkim 691237412Sjkim /* Update the Op with the symbol */ 692237412Sjkim 693237412Sjkim AcpiPsInitOp (IndexOp, AML_INT_NAMEPATH_OP); 694237412Sjkim IndexOp->Common.Value.String = InternalPath; 695237412Sjkim 696237412Sjkim /* We will need the tag later. Cheat by putting it in the Node field */ 697237412Sjkim 698237412Sjkim IndexOp->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Tag); 699167802Sjkim return (InternalPath); 700167802Sjkim} 701167802Sjkim 702167802Sjkim 703167802Sjkim/******************************************************************************* 704167802Sjkim * 705167802Sjkim * FUNCTION: AcpiDmUpdateResourceName 706167802Sjkim * 707167802Sjkim * PARAMETERS: ResourceNode - Node for a resource descriptor 708167802Sjkim * 709167802Sjkim * RETURN: Stores new name in the ResourceNode 710167802Sjkim * 711167802Sjkim * DESCRIPTION: Create a new, unique name for a resource descriptor. Used by 712167802Sjkim * both the disassembly of the descriptor itself and any symbolic 713167802Sjkim * references to the descriptor. Ignored if a unique name has 714167802Sjkim * already been assigned to the resource. 715167802Sjkim * 716167802Sjkim * NOTE: Single threaded, suitable for applications only! 717167802Sjkim * 718167802Sjkim ******************************************************************************/ 719167802Sjkim 720167802Sjkimstatic void 721167802SjkimAcpiDmUpdateResourceName ( 722167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode) 723167802Sjkim{ 724167802Sjkim char Name[ACPI_NAME_SIZE]; 725167802Sjkim 726167802Sjkim 727167802Sjkim /* Ignore if a unique name has already been assigned */ 728167802Sjkim 729167802Sjkim if (ResourceNode->Name.Integer != ACPI_DEFAULT_RESNAME) 730167802Sjkim { 731167802Sjkim return; 732167802Sjkim } 733167802Sjkim 734167802Sjkim /* Generate a new ACPI name for the descriptor */ 735167802Sjkim 736167802Sjkim Name[0] = '_'; 737167802Sjkim Name[1] = AcpiGbl_Prefix[AcpiGbl_NextPrefix]; 738212761Sjkim Name[2] = AcpiUtHexToAsciiChar ((UINT64) AcpiGbl_NextResourceId, 4); 739212761Sjkim Name[3] = AcpiUtHexToAsciiChar ((UINT64) AcpiGbl_NextResourceId, 0); 740167802Sjkim 741167802Sjkim /* Update globals for next name */ 742167802Sjkim 743167802Sjkim AcpiGbl_NextResourceId++; 744167802Sjkim if (AcpiGbl_NextResourceId >= 256) 745167802Sjkim { 746167802Sjkim AcpiGbl_NextResourceId = 0; 747167802Sjkim AcpiGbl_NextPrefix++; 748306536Sjkim 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, 1035306536Sjkim ACPI_IMODE_LOAD_PASS2, 1036306536Sjkim ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_PREFIX_IS_SCOPE, 1037306536Sjkim 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