1167802Sjkim/****************************************************************************** 2167802Sjkim * 3167802Sjkim * Module Name: dmrestag - Add tags to resource descriptors (Application-level) 4167802Sjkim * 5167802Sjkim *****************************************************************************/ 6167802Sjkim 7217365Sjkim/* 8217365Sjkim * Copyright (C) 2000 - 2011, 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, 66167802Sjkim ACPI_RESOURCE_TAG *TagList); 67167802Sjkim 68167802Sjkimstatic char * 69167802SjkimAcpiDmGetResourceTag ( 70167802Sjkim UINT32 BitIndex, 71167802Sjkim AML_RESOURCE *Resource, 72167802Sjkim UINT8 ResourceIndex); 73167802Sjkim 74167802Sjkimstatic char * 75167802SjkimAcpiGetTagPathname ( 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, 91167802Sjkim 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 111167802Sjkimstatic 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 120167802Sjkimstatic 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 129167802Sjkimstatic 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 139167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmFixedIoTags[] = 140167802Sjkim{ 141167802Sjkim {( 1 * 8), ACPI_RESTAG_BASEADDRESS}, 142167802Sjkim {( 3 * 8), ACPI_RESTAG_LENGTH}, 143167802Sjkim {0, NULL} 144167802Sjkim}; 145167802Sjkim 146167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmMemory24Tags[] = 147167802Sjkim{ 148167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 149167802Sjkim {( 4 * 8), ACPI_RESTAG_MINADDR}, 150167802Sjkim {( 6 * 8), ACPI_RESTAG_MAXADDR}, 151167802Sjkim {( 8 * 8), ACPI_RESTAG_ALIGNMENT}, 152167802Sjkim {(10 * 8), ACPI_RESTAG_LENGTH}, 153167802Sjkim {0, NULL} 154167802Sjkim}; 155167802Sjkim 156167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmRegisterTags[] = 157167802Sjkim{ 158167802Sjkim {( 3 * 8), ACPI_RESTAG_ADDRESSSPACE}, 159167802Sjkim {( 4 * 8), ACPI_RESTAG_REGISTERBITWIDTH}, 160167802Sjkim {( 5 * 8), ACPI_RESTAG_REGISTERBITOFFSET}, 161167802Sjkim {( 6 * 8), ACPI_RESTAG_ACCESSSIZE}, 162167802Sjkim {( 7 * 8), ACPI_RESTAG_ADDRESS}, 163167802Sjkim {0, NULL} 164167802Sjkim}; 165167802Sjkim 166167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmMemory32Tags[] = 167167802Sjkim{ 168167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 169167802Sjkim {( 4 * 8), ACPI_RESTAG_MINADDR}, 170167802Sjkim {( 8 * 8), ACPI_RESTAG_MAXADDR}, 171167802Sjkim {(12 * 8), ACPI_RESTAG_ALIGNMENT}, 172167802Sjkim {(16 * 8), ACPI_RESTAG_LENGTH}, 173167802Sjkim {0, NULL} 174167802Sjkim}; 175167802Sjkim 176167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmFixedMemory32Tags[] = 177167802Sjkim{ 178167802Sjkim {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 179167802Sjkim {( 4 * 8), ACPI_RESTAG_BASEADDRESS}, 180167802Sjkim {( 8 * 8), ACPI_RESTAG_LENGTH}, 181167802Sjkim {0, NULL} 182167802Sjkim}; 183167802Sjkim 184167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmInterruptTags[] = 185167802Sjkim{ 186167802Sjkim {( 3 * 8) + 1, ACPI_RESTAG_INTERRUPTTYPE}, 187167802Sjkim {( 3 * 8) + 2, ACPI_RESTAG_INTERRUPTLEVEL}, 188167802Sjkim {( 3 * 8) + 3, ACPI_RESTAG_INTERRUPTSHARE}, 189167802Sjkim {( 5 * 8), ACPI_RESTAG_INTERRUPT}, 190167802Sjkim {0, NULL} 191167802Sjkim}; 192167802Sjkim 193167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmAddress16Tags[] = 194167802Sjkim{ 195167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 196167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 197167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 198167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 199167802Sjkim {( 8 * 8), ACPI_RESTAG_MINADDR}, 200167802Sjkim {(10 * 8), ACPI_RESTAG_MAXADDR}, 201167802Sjkim {(12 * 8), ACPI_RESTAG_TRANSLATION}, 202167802Sjkim {(14 * 8), ACPI_RESTAG_LENGTH}, 203167802Sjkim {0, NULL} 204167802Sjkim}; 205167802Sjkim 206167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmAddress32Tags[] = 207167802Sjkim{ 208167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 209167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 210167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 211167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 212167802Sjkim {(10 * 8), ACPI_RESTAG_MINADDR}, 213167802Sjkim {(14 * 8), ACPI_RESTAG_MAXADDR}, 214167802Sjkim {(18 * 8), ACPI_RESTAG_TRANSLATION}, 215167802Sjkim {(22 * 8), ACPI_RESTAG_LENGTH}, 216167802Sjkim {0, NULL} 217167802Sjkim}; 218167802Sjkim 219167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmAddress64Tags[] = 220167802Sjkim{ 221167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 222167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 223167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 224167802Sjkim {( 6 * 8), ACPI_RESTAG_GRANULARITY}, 225167802Sjkim {(14 * 8), ACPI_RESTAG_MINADDR}, 226167802Sjkim {(22 * 8), ACPI_RESTAG_MAXADDR}, 227167802Sjkim {(30 * 8), ACPI_RESTAG_TRANSLATION}, 228167802Sjkim {(38 * 8), ACPI_RESTAG_LENGTH}, 229167802Sjkim {0, NULL} 230167802Sjkim}; 231167802Sjkim 232167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmExtendedAddressTags[] = 233167802Sjkim{ 234167802Sjkim {( 4 * 8) + 1, ACPI_RESTAG_DECODE}, 235167802Sjkim {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE}, 236167802Sjkim {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE}, 237167802Sjkim {( 8 * 8), ACPI_RESTAG_GRANULARITY}, 238167802Sjkim {(16 * 8), ACPI_RESTAG_MINADDR}, 239167802Sjkim {(24 * 8), ACPI_RESTAG_MAXADDR}, 240167802Sjkim {(32 * 8), ACPI_RESTAG_TRANSLATION}, 241167802Sjkim {(40 * 8), ACPI_RESTAG_LENGTH}, 242167802Sjkim {(48 * 8), ACPI_RESTAG_TYPESPECIFICATTRIBUTES}, 243167802Sjkim {0, NULL} 244167802Sjkim}; 245167802Sjkim 246167802Sjkim/* Special-case tables for the type-specific flags */ 247167802Sjkim 248167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmMemoryFlagTags[] = 249167802Sjkim{ 250167802Sjkim {( 5 * 8) + 0, ACPI_RESTAG_READWRITETYPE}, 251167802Sjkim {( 5 * 8) + 1, ACPI_RESTAG_MEMTYPE}, 252167802Sjkim {( 5 * 8) + 3, ACPI_RESTAG_MEMATTRIBUTES}, 253167802Sjkim {( 5 * 8) + 5, ACPI_RESTAG_TYPE}, 254167802Sjkim {0, NULL} 255167802Sjkim}; 256167802Sjkim 257167802Sjkimstatic ACPI_RESOURCE_TAG AcpiDmIoFlagTags[] = 258167802Sjkim{ 259167802Sjkim {( 5 * 8) + 0, ACPI_RESTAG_RANGETYPE}, 260167802Sjkim {( 5 * 8) + 4, ACPI_RESTAG_TYPE}, 261167802Sjkim {( 5 * 8) + 5, ACPI_RESTAG_TRANSTYPE}, 262167802Sjkim {0, NULL} 263167802Sjkim}; 264167802Sjkim 265167802Sjkim 266167802Sjkim/* Dispatch table used to obtain the correct tag table for a descriptor */ 267167802Sjkim 268167802Sjkimstatic ACPI_RESOURCE_TAG *AcpiGbl_ResourceTags [] = 269167802Sjkim{ 270167802Sjkim /* Small descriptors */ 271167802Sjkim 272167802Sjkim NULL, /* 0x00, Reserved */ 273167802Sjkim NULL, /* 0x01, Reserved */ 274167802Sjkim NULL, /* 0x02, Reserved */ 275167802Sjkim NULL, /* 0x03, Reserved */ 276167802Sjkim AcpiDmIrqTags, /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */ 277167802Sjkim AcpiDmDmaTags, /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */ 278167802Sjkim NULL, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */ 279167802Sjkim NULL, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */ 280167802Sjkim AcpiDmIoTags, /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */ 281167802Sjkim AcpiDmFixedIoTags, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */ 282167802Sjkim NULL, /* 0x0A, Reserved */ 283167802Sjkim NULL, /* 0x0B, Reserved */ 284167802Sjkim NULL, /* 0x0C, Reserved */ 285167802Sjkim NULL, /* 0x0D, Reserved */ 286167802Sjkim NULL, /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */ 287167802Sjkim NULL, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */ 288167802Sjkim 289167802Sjkim /* Large descriptors */ 290167802Sjkim 291167802Sjkim NULL, /* 0x00, Reserved */ 292167802Sjkim AcpiDmMemory24Tags, /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */ 293167802Sjkim AcpiDmRegisterTags, /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */ 294167802Sjkim NULL, /* 0x03, Reserved */ 295167802Sjkim NULL, /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */ 296167802Sjkim AcpiDmMemory32Tags, /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */ 297167802Sjkim AcpiDmFixedMemory32Tags, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */ 298167802Sjkim AcpiDmAddress32Tags, /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */ 299167802Sjkim AcpiDmAddress16Tags, /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */ 300167802Sjkim AcpiDmInterruptTags, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */ 301167802Sjkim AcpiDmAddress64Tags, /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */ 302167802Sjkim AcpiDmExtendedAddressTags /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */ 303167802Sjkim}; 304167802Sjkim 305167802Sjkim 306167802Sjkim/* 307167802Sjkim * Globals used to generate unique resource descriptor names. We use names that 308167802Sjkim * start with underscore and a prefix letter that is not used by other ACPI 309167802Sjkim * reserved names. To this, we append hex 0x00 through 0xFF. These 5 prefixes 310167802Sjkim * allow for 5*256 = 1280 unique names, probably sufficient for any single ASL 311167802Sjkim * file. If this becomes too small, we can use alpha+numerals for a total 312167802Sjkim * of 5*36*36 = 6480. 313167802Sjkim */ 314167802Sjkim#define ACPI_NUM_RES_PREFIX 5 315167802Sjkim 316167802Sjkimstatic UINT32 AcpiGbl_NextResourceId = 0; 317167802Sjkimstatic UINT8 AcpiGbl_NextPrefix = 0; 318197104Sjkimstatic char AcpiGbl_Prefix[ACPI_NUM_RES_PREFIX] = 319167802Sjkim {'Y','Z','J','K','X'}; 320167802Sjkim 321167802Sjkim 322167802Sjkim/******************************************************************************* 323167802Sjkim * 324167802Sjkim * FUNCTION: AcpiDmCheckResourceReference 325167802Sjkim * 326167802Sjkim * PARAMETERS: Op - Parse Op for the AML opcode 327167802Sjkim * WalkState - Current walk state (with valid scope) 328167802Sjkim * 329167802Sjkim * RETURN: None 330167802Sjkim * 331167802Sjkim * DESCRIPTION: Convert a reference to a resource descriptor to a symbolic 332167802Sjkim * reference if possible 333167802Sjkim * 334167802Sjkim * NOTE: Bit index is used to transparently handle both resource bit 335167802Sjkim * fields and byte fields. 336167802Sjkim * 337167802Sjkim ******************************************************************************/ 338167802Sjkim 339167802Sjkimvoid 340167802SjkimAcpiDmCheckResourceReference ( 341167802Sjkim ACPI_PARSE_OBJECT *Op, 342167802Sjkim ACPI_WALK_STATE *WalkState) 343167802Sjkim{ 344167802Sjkim ACPI_STATUS Status; 345167802Sjkim ACPI_PARSE_OBJECT *BufferNameOp; 346167802Sjkim ACPI_PARSE_OBJECT *IndexOp; 347167802Sjkim ACPI_NAMESPACE_NODE *BufferNode; 348167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode; 349167802Sjkim const ACPI_OPCODE_INFO *OpInfo; 350167802Sjkim char *Pathname; 351167802Sjkim UINT32 BitIndex; 352167802Sjkim 353167802Sjkim 354167802Sjkim /* We are only interested in the CreateXxxxField opcodes */ 355167802Sjkim 356167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode); 357167802Sjkim if (OpInfo->Type != AML_TYPE_CREATE_FIELD) 358167802Sjkim { 359167802Sjkim return; 360167802Sjkim } 361167802Sjkim 362167802Sjkim /* Get the buffer term operand */ 363167802Sjkim 364167802Sjkim BufferNameOp = AcpiPsGetDepthNext (NULL, Op); 365167802Sjkim 366167802Sjkim /* Must be a named buffer, not an arg or local or method call */ 367167802Sjkim 368167802Sjkim if (BufferNameOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP) 369167802Sjkim { 370167802Sjkim return; 371167802Sjkim } 372167802Sjkim 373167802Sjkim /* Get the Index term, must be an integer constant to convert */ 374167802Sjkim 375167802Sjkim IndexOp = BufferNameOp->Common.Next; 376167802Sjkim OpInfo = AcpiPsGetOpcodeInfo (IndexOp->Common.AmlOpcode); 377167802Sjkim if (OpInfo->ObjectType != ACPI_TYPE_INTEGER) 378167802Sjkim { 379167802Sjkim return; 380167802Sjkim } 381167802Sjkim 382167802Sjkim /* Get the bit offset of the descriptor within the buffer */ 383167802Sjkim 384167802Sjkim if ((Op->Common.AmlOpcode == AML_CREATE_BIT_FIELD_OP) || 385167802Sjkim (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)) 386167802Sjkim { 387167802Sjkim /* Index operand is a bit offset */ 388167802Sjkim 389167802Sjkim BitIndex = (UINT32) IndexOp->Common.Value.Integer; 390167802Sjkim } 391167802Sjkim else 392167802Sjkim { 393167802Sjkim /* Index operand is a byte offset, convert to bits */ 394167802Sjkim 395167802Sjkim BitIndex = (UINT32) ACPI_MUL_8 (IndexOp->Common.Value.Integer); 396167802Sjkim } 397167802Sjkim 398167802Sjkim /* Lookup the buffer in the namespace */ 399167802Sjkim 400167802Sjkim Status = AcpiNsLookup (WalkState->ScopeInfo, 401167802Sjkim BufferNameOp->Common.Value.String, ACPI_TYPE_BUFFER, 402167802Sjkim ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, 403167802Sjkim &BufferNode); 404167802Sjkim if (ACPI_FAILURE (Status)) 405167802Sjkim { 406167802Sjkim return; 407167802Sjkim } 408167802Sjkim 409167802Sjkim /* Validate object type, we must have a buffer */ 410167802Sjkim 411167802Sjkim if (BufferNode->Type != ACPI_TYPE_BUFFER) 412167802Sjkim { 413167802Sjkim return; 414167802Sjkim } 415167802Sjkim 416167802Sjkim /* Find the resource descriptor node corresponding to the index */ 417167802Sjkim 418167802Sjkim ResourceNode = AcpiDmGetResourceNode (BufferNode, BitIndex); 419167802Sjkim if (!ResourceNode) 420167802Sjkim { 421167802Sjkim return; 422167802Sjkim } 423167802Sjkim 424167802Sjkim /* Translate the Index to a resource tag pathname */ 425167802Sjkim 426167802Sjkim Pathname = AcpiGetTagPathname (BufferNode, ResourceNode, BitIndex); 427167802Sjkim if (Pathname) 428167802Sjkim { 429167802Sjkim /* Complete the conversion of the Index to a symbol */ 430167802Sjkim 431167802Sjkim IndexOp->Common.AmlOpcode = AML_INT_NAMEPATH_OP; 432167802Sjkim IndexOp->Common.Value.String = Pathname; 433167802Sjkim } 434167802Sjkim} 435167802Sjkim 436167802Sjkim 437167802Sjkim/******************************************************************************* 438167802Sjkim * 439167802Sjkim * FUNCTION: AcpiDmGetResourceNode 440167802Sjkim * 441167802Sjkim * PARAMETERS: BufferNode - Node for the parent buffer 442167802Sjkim * BitIndex - Index into the resource descriptor 443167802Sjkim * 444167802Sjkim * RETURN: Namespace node for the resource descriptor. NULL if not found 445167802Sjkim * 446167802Sjkim * DESCRIPTION: Find a resource descriptor that corresponds to the bit index 447167802Sjkim * 448167802Sjkim ******************************************************************************/ 449167802Sjkim 450167802Sjkimstatic ACPI_NAMESPACE_NODE * 451167802SjkimAcpiDmGetResourceNode ( 452167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 453167802Sjkim UINT32 BitIndex) 454167802Sjkim{ 455167802Sjkim ACPI_NAMESPACE_NODE *Node; 456167802Sjkim UINT32 ByteIndex = ACPI_DIV_8 (BitIndex); 457167802Sjkim 458167802Sjkim 459167802Sjkim /* 460167802Sjkim * Child list contains an entry for each resource descriptor. Find 461167802Sjkim * the descriptor that corresponds to the Index. 462167802Sjkim * 463167802Sjkim * If there are no children, this is not a resource template 464167802Sjkim */ 465167802Sjkim Node = BufferNode->Child; 466167802Sjkim while (Node) 467167802Sjkim { 468167802Sjkim /* 469167802Sjkim * Check if the Index falls within this resource. 470167802Sjkim * 471167802Sjkim * Value contains the resource offset, Object contains the resource 472167802Sjkim * length (both in bytes) 473167802Sjkim */ 474167802Sjkim if ((ByteIndex >= Node->Value) && 475167802Sjkim (ByteIndex < (Node->Value + Node->Length))) 476167802Sjkim { 477167802Sjkim return (Node); 478167802Sjkim } 479167802Sjkim 480167802Sjkim Node = Node->Peer; 481167802Sjkim } 482167802Sjkim 483167802Sjkim return (NULL); 484167802Sjkim} 485167802Sjkim 486167802Sjkim 487167802Sjkim/******************************************************************************* 488167802Sjkim * 489167802Sjkim * FUNCTION: AcpiGetTagPathname 490167802Sjkim * 491167802Sjkim * PARAMETERS: BufferNode - Node for the parent buffer 492167802Sjkim * ResourceNode - Node for a resource descriptor 493167802Sjkim * BitIndex - Index into the resource descriptor 494167802Sjkim * 495167802Sjkim * RETURN: Full pathname for a resource tag. NULL if no match. 496167802Sjkim * Path is returned in AML (packed) format. 497167802Sjkim * 498167802Sjkim * DESCRIPTION: Convert a BitIndex into a symbolic resource tag (full pathname) 499167802Sjkim * 500167802Sjkim ******************************************************************************/ 501167802Sjkim 502167802Sjkimstatic char * 503167802SjkimAcpiGetTagPathname ( 504167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 505167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode, 506167802Sjkim UINT32 BitIndex) 507167802Sjkim{ 508167802Sjkim ACPI_STATUS Status; 509167802Sjkim UINT32 ResourceBitIndex; 510167802Sjkim UINT8 ResourceTableIndex; 511167802Sjkim ACPI_SIZE RequiredSize; 512167802Sjkim char *Pathname; 513167802Sjkim AML_RESOURCE *Aml; 514167802Sjkim ACPI_PARSE_OBJECT *Op; 515167802Sjkim char *InternalPath; 516167802Sjkim char *Tag; 517167802Sjkim 518167802Sjkim 519167802Sjkim /* Get the Op that contains the actual buffer data */ 520167802Sjkim 521167802Sjkim Op = BufferNode->Op->Common.Value.Arg; 522167802Sjkim Op = Op->Common.Next; 523167802Sjkim if (!Op) 524167802Sjkim { 525167802Sjkim return (NULL); 526167802Sjkim } 527167802Sjkim 528167802Sjkim /* Get the individual resource descriptor and validate it */ 529167802Sjkim 530167802Sjkim Aml = ACPI_CAST_PTR (AML_RESOURCE, 531167802Sjkim &Op->Named.Data[ResourceNode->Value]); 532167802Sjkim 533167802Sjkim Status = AcpiUtValidateResource (Aml, &ResourceTableIndex); 534167802Sjkim if (ACPI_FAILURE (Status)) 535167802Sjkim { 536167802Sjkim return (NULL); 537167802Sjkim } 538167802Sjkim 539167802Sjkim /* Get offset into this descriptor (from offset into entire buffer) */ 540167802Sjkim 541167802Sjkim ResourceBitIndex = BitIndex - ACPI_MUL_8 (ResourceNode->Value); 542167802Sjkim 543167802Sjkim /* Get the tag associated with this resource descriptor and offset */ 544167802Sjkim 545167802Sjkim Tag = AcpiDmGetResourceTag (ResourceBitIndex, Aml, ResourceTableIndex); 546167802Sjkim if (!Tag) 547167802Sjkim { 548167802Sjkim return (NULL); 549167802Sjkim } 550167802Sjkim 551167802Sjkim /* 552167802Sjkim * Now that we know that we have a reference that can be converted to a 553167802Sjkim * symbol, change the name of the resource to a unique name. 554167802Sjkim */ 555167802Sjkim AcpiDmUpdateResourceName (ResourceNode); 556167802Sjkim 557167802Sjkim /* Get the full pathname to the parent buffer */ 558167802Sjkim 559167802Sjkim RequiredSize = AcpiNsGetPathnameLength (BufferNode); 560193529Sjkim if (!RequiredSize) 561193529Sjkim { 562193529Sjkim return (NULL); 563193529Sjkim } 564193529Sjkim 565167802Sjkim Pathname = ACPI_ALLOCATE_ZEROED (RequiredSize + ACPI_PATH_SEGMENT_LENGTH); 566167802Sjkim if (!Pathname) 567167802Sjkim { 568167802Sjkim return (NULL); 569167802Sjkim } 570167802Sjkim 571193529Sjkim Status = AcpiNsBuildExternalPath (BufferNode, RequiredSize, Pathname); 572193529Sjkim if (ACPI_FAILURE (Status)) 573193529Sjkim { 574193529Sjkim return (NULL); 575193529Sjkim } 576167802Sjkim 577167802Sjkim /* 578167802Sjkim * Create the full path to the resource and tag by: remove the buffer name, 579167802Sjkim * append the resource descriptor name, append a dot, append the tag name. 580167802Sjkim * 581167802Sjkim * TBD: Always using the full path is a bit brute force, the path can be 582167802Sjkim * often be optimized with carats (if the original buffer namepath is a 583167802Sjkim * single nameseg). This doesn't really matter, because these paths do not 584167802Sjkim * end up in the final compiled AML, it's just an appearance issue for the 585167802Sjkim * disassembled code. 586167802Sjkim */ 587167802Sjkim Pathname[ACPI_STRLEN (Pathname) - ACPI_NAME_SIZE] = 0; 588167802Sjkim ACPI_STRNCAT (Pathname, ResourceNode->Name.Ascii, ACPI_NAME_SIZE); 589167802Sjkim ACPI_STRCAT (Pathname, "."); 590167802Sjkim ACPI_STRNCAT (Pathname, Tag, ACPI_NAME_SIZE); 591167802Sjkim 592167802Sjkim /* Internalize the namepath to AML format */ 593167802Sjkim 594167802Sjkim AcpiNsInternalizeName (Pathname, &InternalPath); 595167802Sjkim ACPI_FREE (Pathname); 596167802Sjkim return (InternalPath); 597167802Sjkim} 598167802Sjkim 599167802Sjkim 600167802Sjkim/******************************************************************************* 601167802Sjkim * 602167802Sjkim * FUNCTION: AcpiDmUpdateResourceName 603167802Sjkim * 604167802Sjkim * PARAMETERS: ResourceNode - Node for a resource descriptor 605167802Sjkim * 606167802Sjkim * RETURN: Stores new name in the ResourceNode 607167802Sjkim * 608167802Sjkim * DESCRIPTION: Create a new, unique name for a resource descriptor. Used by 609167802Sjkim * both the disassembly of the descriptor itself and any symbolic 610167802Sjkim * references to the descriptor. Ignored if a unique name has 611167802Sjkim * already been assigned to the resource. 612167802Sjkim * 613167802Sjkim * NOTE: Single threaded, suitable for applications only! 614167802Sjkim * 615167802Sjkim ******************************************************************************/ 616167802Sjkim 617167802Sjkimstatic void 618167802SjkimAcpiDmUpdateResourceName ( 619167802Sjkim ACPI_NAMESPACE_NODE *ResourceNode) 620167802Sjkim{ 621167802Sjkim char Name[ACPI_NAME_SIZE]; 622167802Sjkim 623167802Sjkim 624167802Sjkim /* Ignore if a unique name has already been assigned */ 625167802Sjkim 626167802Sjkim if (ResourceNode->Name.Integer != ACPI_DEFAULT_RESNAME) 627167802Sjkim { 628167802Sjkim return; 629167802Sjkim } 630167802Sjkim 631167802Sjkim /* Generate a new ACPI name for the descriptor */ 632167802Sjkim 633167802Sjkim Name[0] = '_'; 634167802Sjkim Name[1] = AcpiGbl_Prefix[AcpiGbl_NextPrefix]; 635212761Sjkim Name[2] = AcpiUtHexToAsciiChar ((UINT64) AcpiGbl_NextResourceId, 4); 636212761Sjkim Name[3] = AcpiUtHexToAsciiChar ((UINT64) AcpiGbl_NextResourceId, 0); 637167802Sjkim 638167802Sjkim /* Update globals for next name */ 639167802Sjkim 640167802Sjkim AcpiGbl_NextResourceId++; 641167802Sjkim if (AcpiGbl_NextResourceId >= 256) 642167802Sjkim { 643167802Sjkim AcpiGbl_NextResourceId = 0; 644167802Sjkim AcpiGbl_NextPrefix++; 645167802Sjkim if (AcpiGbl_NextPrefix > ACPI_NUM_RES_PREFIX) 646167802Sjkim { 647167802Sjkim AcpiGbl_NextPrefix = 0; 648167802Sjkim } 649167802Sjkim } 650167802Sjkim 651167802Sjkim /* Change the resource descriptor name */ 652167802Sjkim 653193529Sjkim ResourceNode->Name.Integer = *ACPI_CAST_PTR (UINT32, &Name[0]); 654167802Sjkim} 655167802Sjkim 656167802Sjkim 657167802Sjkim/******************************************************************************* 658167802Sjkim * 659167802Sjkim * FUNCTION: AcpiDmGetResourceTag 660167802Sjkim * 661167802Sjkim * PARAMETERS: BitIndex - Index into the resource descriptor 662167802Sjkim * Resource - Pointer to the raw resource data 663167802Sjkim * ResourceIndex - Index correspoinding to the resource type 664167802Sjkim * 665167802Sjkim * RETURN: Pointer to the resource tag (ACPI_NAME). NULL if no match. 666167802Sjkim * 667167802Sjkim * DESCRIPTION: Convert a BitIndex into a symbolic resource tag. 668167802Sjkim * 669167802Sjkim ******************************************************************************/ 670167802Sjkim 671167802Sjkimstatic char * 672167802SjkimAcpiDmGetResourceTag ( 673167802Sjkim UINT32 BitIndex, 674167802Sjkim AML_RESOURCE *Resource, 675167802Sjkim UINT8 ResourceIndex) 676167802Sjkim{ 677167802Sjkim ACPI_RESOURCE_TAG *TagList; 678167802Sjkim char *Tag = NULL; 679167802Sjkim 680167802Sjkim 681167802Sjkim /* Get the tag list for this resource descriptor type */ 682167802Sjkim 683167802Sjkim TagList = AcpiGbl_ResourceTags[ResourceIndex]; 684167802Sjkim if (!TagList) 685167802Sjkim { 686167802Sjkim /* There are no tags for this resource type */ 687167802Sjkim 688167802Sjkim return (NULL); 689167802Sjkim } 690167802Sjkim 691167802Sjkim /* 692167802Sjkim * Handle the type-specific flags field for the address descriptors. 693167802Sjkim * Kindof brute force, but just blindly search for an index match. 694167802Sjkim */ 695167802Sjkim switch (Resource->DescriptorType) 696167802Sjkim { 697167802Sjkim case ACPI_RESOURCE_NAME_ADDRESS16: 698167802Sjkim case ACPI_RESOURCE_NAME_ADDRESS32: 699167802Sjkim case ACPI_RESOURCE_NAME_ADDRESS64: 700167802Sjkim case ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64: 701167802Sjkim 702167802Sjkim if (Resource->Address.ResourceType == ACPI_ADDRESS_TYPE_MEMORY_RANGE) 703167802Sjkim { 704167802Sjkim Tag = AcpiDmSearchTagList (BitIndex, AcpiDmMemoryFlagTags); 705167802Sjkim } 706167802Sjkim else if (Resource->Address.ResourceType == ACPI_ADDRESS_TYPE_IO_RANGE) 707167802Sjkim { 708167802Sjkim Tag = AcpiDmSearchTagList (BitIndex, AcpiDmIoFlagTags); 709167802Sjkim } 710167802Sjkim 711167802Sjkim /* If we found a match, all done. Else, drop to normal search below */ 712167802Sjkim 713167802Sjkim if (Tag) 714167802Sjkim { 715167802Sjkim return (Tag); 716167802Sjkim } 717167802Sjkim break; 718167802Sjkim 719167802Sjkim default: 720167802Sjkim break; 721167802Sjkim } 722167802Sjkim 723167802Sjkim /* Search the tag list for this descriptor type */ 724167802Sjkim 725167802Sjkim Tag = AcpiDmSearchTagList (BitIndex, TagList); 726167802Sjkim return (Tag); 727167802Sjkim} 728167802Sjkim 729167802Sjkim 730167802Sjkim/******************************************************************************* 731167802Sjkim * 732167802Sjkim * FUNCTION: AcpiDmSearchTagList 733167802Sjkim * 734167802Sjkim * PARAMETERS: BitIndex - Index into the resource descriptor 735167802Sjkim * TagList - List to search 736167802Sjkim * 737167802Sjkim * RETURN: Pointer to a tag (ACPI_NAME). NULL if no match found. 738167802Sjkim * 739167802Sjkim * DESCRIPTION: Search a tag list for a match to the input BitIndex. Matches 740167802Sjkim * a fixed offset to a symbolic resource tag name. 741167802Sjkim * 742167802Sjkim ******************************************************************************/ 743167802Sjkim 744167802Sjkimstatic char * 745167802SjkimAcpiDmSearchTagList ( 746167802Sjkim UINT32 BitIndex, 747167802Sjkim ACPI_RESOURCE_TAG *TagList) 748167802Sjkim{ 749167802Sjkim 750167802Sjkim /* 751167802Sjkim * Walk the null-terminated tag list to find a matching bit offset. 752167802Sjkim * We are looking for an exact match. 753167802Sjkim */ 754167802Sjkim for ( ; TagList->Tag; TagList++) 755167802Sjkim { 756167802Sjkim if (BitIndex == TagList->BitIndex) 757167802Sjkim { 758167802Sjkim return (TagList->Tag); 759167802Sjkim } 760167802Sjkim } 761167802Sjkim 762167802Sjkim /* A matching offset was not found */ 763167802Sjkim 764167802Sjkim return (NULL); 765167802Sjkim} 766167802Sjkim 767167802Sjkim 768167802Sjkim/******************************************************************************* 769167802Sjkim * 770167802Sjkim * FUNCTION: AcpiDmFindResources 771167802Sjkim * 772167802Sjkim * PARAMETERS: Root - Root of the parse tree 773167802Sjkim * 774167802Sjkim * RETURN: None 775167802Sjkim * 776167802Sjkim * DESCRIPTION: Add all ResourceTemplate declarations to the namespace. Each 777167802Sjkim * resource descriptor in each template is given a node -- used 778167802Sjkim * for later conversion of resource references to symbolic refs. 779167802Sjkim * 780167802Sjkim ******************************************************************************/ 781167802Sjkim 782167802Sjkimvoid 783167802SjkimAcpiDmFindResources ( 784167802Sjkim ACPI_PARSE_OBJECT *Root) 785167802Sjkim{ 786167802Sjkim ACPI_PARSE_OBJECT *Op = Root; 787167802Sjkim ACPI_PARSE_OBJECT *Parent; 788167802Sjkim 789167802Sjkim 790167802Sjkim /* Walk the entire parse tree */ 791167802Sjkim 792167802Sjkim while (Op) 793167802Sjkim { 794167802Sjkim /* We are interested in Buffer() declarations */ 795167802Sjkim 796167802Sjkim if (Op->Common.AmlOpcode == AML_BUFFER_OP) 797167802Sjkim { 798167802Sjkim /* And only declarations of the form Name (XXXX, Buffer()... ) */ 799167802Sjkim 800167802Sjkim Parent = Op->Common.Parent; 801167802Sjkim if (Parent->Common.AmlOpcode == AML_NAME_OP) 802167802Sjkim { 803167802Sjkim /* 804167802Sjkim * If the buffer is a resource template, add the individual 805167802Sjkim * resource descriptors to the namespace, as children of the 806167802Sjkim * buffer node. 807167802Sjkim */ 808167802Sjkim if (ACPI_SUCCESS (AcpiDmIsResourceTemplate (Op))) 809167802Sjkim { 810167802Sjkim Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE; 811167802Sjkim AcpiDmAddResourcesToNamespace (Parent->Common.Node, Op); 812167802Sjkim } 813167802Sjkim } 814167802Sjkim } 815167802Sjkim 816167802Sjkim Op = AcpiPsGetDepthNext (Root, Op); 817167802Sjkim } 818167802Sjkim} 819167802Sjkim 820167802Sjkim 821167802Sjkim/******************************************************************************* 822167802Sjkim * 823167802Sjkim * FUNCTION: AcpiDmAddResourcesToNamespace 824167802Sjkim * 825167802Sjkim * PARAMETERS: BufferNode - Node for the parent buffer 826167802Sjkim * Op - Parse op for the buffer 827167802Sjkim * 828167802Sjkim * RETURN: None 829167802Sjkim * 830167802Sjkim * DESCRIPTION: Add an entire resource template to the namespace. Each 831167802Sjkim * resource descriptor is added as a namespace node. 832167802Sjkim * 833167802Sjkim ******************************************************************************/ 834167802Sjkim 835167802Sjkimstatic void 836167802SjkimAcpiDmAddResourcesToNamespace ( 837167802Sjkim ACPI_NAMESPACE_NODE *BufferNode, 838167802Sjkim ACPI_PARSE_OBJECT *Op) 839167802Sjkim{ 840167802Sjkim ACPI_PARSE_OBJECT *NextOp; 841167802Sjkim 842167802Sjkim 843167802Sjkim /* Get to the ByteData list */ 844167802Sjkim 845167802Sjkim NextOp = Op->Common.Value.Arg; 846167802Sjkim NextOp = NextOp->Common.Next; 847167802Sjkim if (!NextOp) 848167802Sjkim { 849167802Sjkim return; 850167802Sjkim } 851167802Sjkim 852167802Sjkim /* Set Node and Op to point to each other */ 853167802Sjkim 854167802Sjkim BufferNode->Op = Op; 855167802Sjkim Op->Common.Node = BufferNode; 856167802Sjkim 857167802Sjkim /* 858167802Sjkim * Insert each resource into the namespace 859167802Sjkim * NextOp contains the Aml pointer and the Aml length 860167802Sjkim */ 861167802Sjkim AcpiUtWalkAmlResources ((UINT8 *) NextOp->Named.Data, 862167802Sjkim (ACPI_SIZE) NextOp->Common.Value.Integer, 863167802Sjkim AcpiDmAddResourceToNamespace, BufferNode); 864167802Sjkim} 865167802Sjkim 866167802Sjkim 867167802Sjkim/******************************************************************************* 868167802Sjkim * 869167802Sjkim * FUNCTION: AcpiDmAddResourceToNamespace 870167802Sjkim * 871167802Sjkim * PARAMETERS: ACPI_WALK_AML_CALLBACK 872167802Sjkim * BufferNode - Node for the parent buffer 873167802Sjkim * 874167802Sjkim * RETURN: Status 875167802Sjkim * 876167802Sjkim * DESCRIPTION: Add one resource descriptor to the namespace as a child of the 877167802Sjkim * parent buffer. The same name is used for each descriptor. This 878167802Sjkim * is changed later to a unique name if the resource is actually 879167802Sjkim * referenced by an AML operator. 880167802Sjkim * 881167802Sjkim ******************************************************************************/ 882167802Sjkim 883167802Sjkimstatic ACPI_STATUS 884167802SjkimAcpiDmAddResourceToNamespace ( 885167802Sjkim UINT8 *Aml, 886167802Sjkim UINT32 Length, 887167802Sjkim UINT32 Offset, 888167802Sjkim UINT8 ResourceIndex, 889167802Sjkim void *Context) 890167802Sjkim{ 891167802Sjkim ACPI_STATUS Status; 892167802Sjkim ACPI_GENERIC_STATE ScopeInfo; 893167802Sjkim ACPI_NAMESPACE_NODE *Node; 894167802Sjkim 895167802Sjkim 896167802Sjkim /* TBD: Don't need to add descriptors that have no tags defined? */ 897167802Sjkim 898167802Sjkim /* Add the resource to the namespace, as child of the buffer */ 899167802Sjkim 900167802Sjkim ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Context); 901167802Sjkim Status = AcpiNsLookup (&ScopeInfo, "_TMP", ACPI_TYPE_LOCAL_RESOURCE, 902167802Sjkim ACPI_IMODE_LOAD_PASS2, 903167802Sjkim ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_PREFIX_IS_SCOPE, 904167802Sjkim NULL, &Node); 905167802Sjkim if (ACPI_FAILURE (Status)) 906167802Sjkim { 907167802Sjkim return (AE_OK); 908167802Sjkim } 909167802Sjkim 910167802Sjkim /* Set the name to the default, changed later if resource is referenced */ 911167802Sjkim 912167802Sjkim Node->Name.Integer = ACPI_DEFAULT_RESNAME; 913167802Sjkim 914167802Sjkim /* Save the offset of the descriptor (within the original buffer) */ 915167802Sjkim 916167802Sjkim Node->Value = Offset; 917167802Sjkim Node->Length = Length; 918167802Sjkim return (AE_OK); 919167802Sjkim} 920167802Sjkim 921