1207340Sjkim/****************************************************************************** 2207340Sjkim * 3207340Sjkim * Module Name: aslrestype2e - Large Extended address resource descriptors 4207340Sjkim * 5207340Sjkim *****************************************************************************/ 6207340Sjkim 7217365Sjkim/* 8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp. 9207340Sjkim * All rights reserved. 10207340Sjkim * 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. 25207340Sjkim * 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. 29207340Sjkim * 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 */ 43207340Sjkim 44207340Sjkim 45207344Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 46207340Sjkim 47207340Sjkim#define _COMPONENT ACPI_COMPILER 48207340Sjkim ACPI_MODULE_NAME ("aslrestype2e") 49207340Sjkim 50207340Sjkim/* 51207340Sjkim * This module contains the Extended (64-bit) address space descriptors: 52207340Sjkim * 53207340Sjkim * ExtendedIO 54207340Sjkim * ExtendedMemory 55207340Sjkim * ExtendedSpace 56207340Sjkim */ 57207340Sjkim 58207340Sjkim/******************************************************************************* 59207340Sjkim * 60207340Sjkim * FUNCTION: RsDoExtendedIoDescriptor 61207340Sjkim * 62207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 63207340Sjkim * CurrentByteOffset - Offset into the resource template AML 64207340Sjkim * buffer (to track references to the desc) 65207340Sjkim * 66207340Sjkim * RETURN: Completed resource node 67207340Sjkim * 68207340Sjkim * DESCRIPTION: Construct a long "ExtendedIO" descriptor 69207340Sjkim * 70207340Sjkim ******************************************************************************/ 71207340Sjkim 72207340SjkimASL_RESOURCE_NODE * 73207340SjkimRsDoExtendedIoDescriptor ( 74207340Sjkim ACPI_PARSE_OBJECT *Op, 75207340Sjkim UINT32 CurrentByteOffset) 76207340Sjkim{ 77207340Sjkim AML_RESOURCE *Descriptor; 78207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 79207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 80207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 81207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 82207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 83207340Sjkim ASL_RESOURCE_NODE *Rnode; 84207340Sjkim UINT16 StringLength = 0; 85207340Sjkim UINT32 i; 86207340Sjkim 87207340Sjkim 88207340Sjkim InitializerOp = Op->Asl.Child; 89207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 90207340Sjkim 91207340Sjkim Rnode = RsAllocateResourceNode ( 92207340Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 93207340Sjkim 94207340Sjkim Descriptor = Rnode->Buffer; 95207340Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 96207340Sjkim Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; 97207340Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 98207340Sjkim 99207340Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 100207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 101207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 102207340Sjkim 103207340Sjkim /* Process all child initialization nodes */ 104207340Sjkim 105207340Sjkim for (i = 0; InitializerOp; i++) 106207340Sjkim { 107207340Sjkim switch (i) 108207340Sjkim { 109207340Sjkim case 0: /* Resource Usage */ 110207340Sjkim 111207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 112207340Sjkim break; 113207340Sjkim 114207340Sjkim case 1: /* MinType */ 115207340Sjkim 116207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 117207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 118207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 119207340Sjkim break; 120207340Sjkim 121207340Sjkim case 2: /* MaxType */ 122207340Sjkim 123207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 124207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 125207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 126207340Sjkim break; 127207340Sjkim 128207340Sjkim case 3: /* DecodeType */ 129207340Sjkim 130207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 131207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 132207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 133207340Sjkim break; 134207340Sjkim 135207340Sjkim case 4: /* Range Type */ 136207340Sjkim 137207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 3); 138228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 139228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0, 2); 140207340Sjkim break; 141207340Sjkim 142207340Sjkim case 5: /* Address Granularity */ 143207340Sjkim 144207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 145228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 146207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 147207340Sjkim GranOp = InitializerOp; 148207340Sjkim break; 149207340Sjkim 150207340Sjkim case 6: /* Address Min */ 151207340Sjkim 152207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 153228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 154207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 155207340Sjkim MinOp = InitializerOp; 156207340Sjkim break; 157207340Sjkim 158207340Sjkim case 7: /* Address Max */ 159207340Sjkim 160207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 161228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 162207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 163207340Sjkim MaxOp = InitializerOp; 164207340Sjkim break; 165207340Sjkim 166207340Sjkim case 8: /* Translation Offset */ 167207340Sjkim 168207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 169228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 170207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 171207340Sjkim break; 172207340Sjkim 173207340Sjkim case 9: /* Address Length */ 174207340Sjkim 175207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 176228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 177207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 178207340Sjkim LengthOp = InitializerOp; 179207340Sjkim break; 180207340Sjkim 181207340Sjkim case 10: /* Type-Specific Attributes */ 182207340Sjkim 183207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 184228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 185207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 186207340Sjkim break; 187207340Sjkim 188207340Sjkim case 11: /* ResourceTag */ 189207340Sjkim 190207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 191207340Sjkim break; 192207340Sjkim 193207340Sjkim case 12: /* Type */ 194207340Sjkim 195207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 4, 0); 196207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 197207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 4); 198207340Sjkim break; 199207340Sjkim 200207340Sjkim case 13: /* Translation Type */ 201207340Sjkim 202207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0); 203207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 204207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5); 205207340Sjkim break; 206207340Sjkim 207207340Sjkim default: 208207340Sjkim 209207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 210207340Sjkim break; 211207340Sjkim } 212207340Sjkim 213207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 214207340Sjkim } 215207340Sjkim 216207340Sjkim /* Validate the Min/Max/Len/Gran values */ 217207340Sjkim 218207340Sjkim RsLargeAddressCheck ( 219207340Sjkim Descriptor->ExtAddress64.Minimum, 220207340Sjkim Descriptor->ExtAddress64.Maximum, 221207340Sjkim Descriptor->ExtAddress64.AddressLength, 222207340Sjkim Descriptor->ExtAddress64.Granularity, 223207340Sjkim Descriptor->ExtAddress64.Flags, 224213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 225207340Sjkim 226207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; 227207340Sjkim return (Rnode); 228207340Sjkim} 229207340Sjkim 230207340Sjkim 231207340Sjkim/******************************************************************************* 232207340Sjkim * 233207340Sjkim * FUNCTION: RsDoExtendedMemoryDescriptor 234207340Sjkim * 235207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 236207340Sjkim * CurrentByteOffset - Offset into the resource template AML 237207340Sjkim * buffer (to track references to the desc) 238207340Sjkim * 239207340Sjkim * RETURN: Completed resource node 240207340Sjkim * 241207340Sjkim * DESCRIPTION: Construct a long "ExtendedMemory" descriptor 242207340Sjkim * 243207340Sjkim ******************************************************************************/ 244207340Sjkim 245207340SjkimASL_RESOURCE_NODE * 246207340SjkimRsDoExtendedMemoryDescriptor ( 247207340Sjkim ACPI_PARSE_OBJECT *Op, 248207340Sjkim UINT32 CurrentByteOffset) 249207340Sjkim{ 250207340Sjkim AML_RESOURCE *Descriptor; 251207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 252207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 253207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 254207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 255207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 256207340Sjkim ASL_RESOURCE_NODE *Rnode; 257207340Sjkim UINT16 StringLength = 0; 258207340Sjkim UINT32 i; 259207340Sjkim 260207340Sjkim 261207340Sjkim InitializerOp = Op->Asl.Child; 262207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 263207340Sjkim 264207340Sjkim Rnode = RsAllocateResourceNode ( 265207340Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 266207340Sjkim 267207340Sjkim Descriptor = Rnode->Buffer; 268207340Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 269207340Sjkim Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 270207340Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 271207340Sjkim 272207340Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 273207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 274207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 275207340Sjkim 276207340Sjkim /* Process all child initialization nodes */ 277207340Sjkim 278207340Sjkim for (i = 0; InitializerOp; i++) 279207340Sjkim { 280207340Sjkim switch (i) 281207340Sjkim { 282207340Sjkim case 0: /* Resource Usage */ 283207340Sjkim 284207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 285207340Sjkim break; 286207340Sjkim 287207340Sjkim case 1: /* DecodeType */ 288207340Sjkim 289207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 290207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 291207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 292207340Sjkim break; 293207340Sjkim 294207340Sjkim case 2: /* MinType */ 295207340Sjkim 296207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 297207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 298207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 299207340Sjkim break; 300207340Sjkim 301207340Sjkim case 3: /* MaxType */ 302207340Sjkim 303207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 304207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 305207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 306207340Sjkim break; 307207340Sjkim 308207340Sjkim case 4: /* Memory Type */ 309207340Sjkim 310207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 1, 0); 311228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 312228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 1, 2); 313207340Sjkim break; 314207340Sjkim 315207340Sjkim case 5: /* Read/Write Type */ 316207340Sjkim 317207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 1); 318207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 319207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0); 320207340Sjkim break; 321207340Sjkim 322207340Sjkim case 6: /* Address Granularity */ 323207340Sjkim 324207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 325228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 326207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 327207340Sjkim GranOp = InitializerOp; 328207340Sjkim break; 329207340Sjkim 330207340Sjkim case 7: /* Min Address */ 331207340Sjkim 332207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 333228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 334207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 335207340Sjkim MinOp = InitializerOp; 336207340Sjkim break; 337207340Sjkim 338207340Sjkim case 8: /* Max Address */ 339207340Sjkim 340207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 341228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 342207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 343207340Sjkim MaxOp = InitializerOp; 344207340Sjkim break; 345207340Sjkim 346207340Sjkim case 9: /* Translation Offset */ 347207340Sjkim 348207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 349228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 350207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 351207340Sjkim break; 352207340Sjkim 353207340Sjkim case 10: /* Address Length */ 354207340Sjkim 355207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 356228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 357207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 358207340Sjkim LengthOp = InitializerOp; 359207340Sjkim break; 360207340Sjkim 361207340Sjkim case 11: /* Type-Specific Attributes */ 362207340Sjkim 363207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 364228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 365207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 366207340Sjkim break; 367207340Sjkim 368207340Sjkim case 12: /* ResourceTag */ 369207340Sjkim 370207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 371207340Sjkim break; 372207340Sjkim 373207340Sjkim 374207340Sjkim case 13: /* Address Range */ 375207340Sjkim 376207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 3, 0); 377228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 378228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 3, 2); 379207340Sjkim break; 380207340Sjkim 381207340Sjkim case 14: /* Type */ 382207340Sjkim 383207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0); 384207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 385207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5); 386207340Sjkim break; 387207340Sjkim 388207340Sjkim default: 389207340Sjkim 390207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 391207340Sjkim break; 392207340Sjkim } 393207340Sjkim 394207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 395207340Sjkim } 396207340Sjkim 397207340Sjkim /* Validate the Min/Max/Len/Gran values */ 398207340Sjkim 399207340Sjkim RsLargeAddressCheck ( 400207340Sjkim Descriptor->ExtAddress64.Minimum, 401207340Sjkim Descriptor->ExtAddress64.Maximum, 402207340Sjkim Descriptor->ExtAddress64.AddressLength, 403207340Sjkim Descriptor->ExtAddress64.Granularity, 404207340Sjkim Descriptor->ExtAddress64.Flags, 405213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 406207340Sjkim 407207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; 408207340Sjkim return (Rnode); 409207340Sjkim} 410207340Sjkim 411207340Sjkim 412207340Sjkim/******************************************************************************* 413207340Sjkim * 414207340Sjkim * FUNCTION: RsDoExtendedSpaceDescriptor 415207340Sjkim * 416207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 417207340Sjkim * CurrentByteOffset - Offset into the resource template AML 418207340Sjkim * buffer (to track references to the desc) 419207340Sjkim * 420207340Sjkim * RETURN: Completed resource node 421207340Sjkim * 422207340Sjkim * DESCRIPTION: Construct a long "ExtendedSpace" descriptor 423207340Sjkim * 424207340Sjkim ******************************************************************************/ 425207340Sjkim 426207340SjkimASL_RESOURCE_NODE * 427207340SjkimRsDoExtendedSpaceDescriptor ( 428207340Sjkim ACPI_PARSE_OBJECT *Op, 429207340Sjkim UINT32 CurrentByteOffset) 430207340Sjkim{ 431207340Sjkim AML_RESOURCE *Descriptor; 432207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 433207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 434207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 435207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 436207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 437207340Sjkim ASL_RESOURCE_NODE *Rnode; 438207340Sjkim UINT16 StringLength = 0; 439207340Sjkim UINT32 i; 440207340Sjkim 441207340Sjkim 442207340Sjkim InitializerOp = Op->Asl.Child; 443207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 444207340Sjkim 445207340Sjkim Rnode = RsAllocateResourceNode ( 446207340Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 447207340Sjkim 448207340Sjkim Descriptor = Rnode->Buffer; 449207340Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 450207340Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 451207340Sjkim 452207340Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 453207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 454207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 455207340Sjkim 456207340Sjkim /* Process all child initialization nodes */ 457207340Sjkim 458207340Sjkim for (i = 0; InitializerOp; i++) 459207340Sjkim { 460207340Sjkim switch (i) 461207340Sjkim { 462207340Sjkim case 0: /* Resource Type */ 463207340Sjkim 464207340Sjkim Descriptor->ExtAddress64.ResourceType = 465207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 466207340Sjkim break; 467207340Sjkim 468207340Sjkim case 1: /* Resource Usage */ 469207340Sjkim 470207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 471207340Sjkim break; 472207340Sjkim 473207340Sjkim case 2: /* DecodeType */ 474207340Sjkim 475207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 476207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 477207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 478207340Sjkim break; 479207340Sjkim 480207340Sjkim case 3: /* MinType */ 481207340Sjkim 482207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 483207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 484207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 485207340Sjkim break; 486207340Sjkim 487207340Sjkim case 4: /* MaxType */ 488207340Sjkim 489207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 490207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 491207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 492207340Sjkim break; 493207340Sjkim 494207340Sjkim case 5: /* Type-Specific flags */ 495207340Sjkim 496207340Sjkim Descriptor->ExtAddress64.SpecificFlags = 497207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 498207340Sjkim break; 499207340Sjkim 500207340Sjkim case 6: /* Address Granularity */ 501207340Sjkim 502207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 503228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 504207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 505207340Sjkim GranOp = InitializerOp; 506207340Sjkim break; 507207340Sjkim 508207340Sjkim case 7: /* Min Address */ 509207340Sjkim 510207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 511228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 512207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 513207340Sjkim MinOp = InitializerOp; 514207340Sjkim break; 515207340Sjkim 516207340Sjkim case 8: /* Max Address */ 517207340Sjkim 518207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 519228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 520207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 521207340Sjkim MaxOp = InitializerOp; 522207340Sjkim break; 523207340Sjkim 524207340Sjkim case 9: /* Translation Offset */ 525207340Sjkim 526207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 527228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 528207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 529207340Sjkim break; 530207340Sjkim 531207340Sjkim case 10: /* Address Length */ 532207340Sjkim 533207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 534228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 535207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 536207340Sjkim LengthOp = InitializerOp; 537207340Sjkim break; 538207340Sjkim 539207340Sjkim case 11: /* Type-Specific Attributes */ 540207340Sjkim 541207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 542228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 543207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 544207340Sjkim break; 545207340Sjkim 546207340Sjkim case 12: /* ResourceTag */ 547207340Sjkim 548207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 549207340Sjkim break; 550207340Sjkim 551207340Sjkim default: 552207340Sjkim 553207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 554207340Sjkim break; 555207340Sjkim } 556207340Sjkim 557207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 558207340Sjkim } 559207340Sjkim 560207340Sjkim /* Validate the Min/Max/Len/Gran values */ 561207340Sjkim 562207340Sjkim RsLargeAddressCheck ( 563207340Sjkim Descriptor->ExtAddress64.Minimum, 564207340Sjkim Descriptor->ExtAddress64.Maximum, 565207340Sjkim Descriptor->ExtAddress64.AddressLength, 566207340Sjkim Descriptor->ExtAddress64.Granularity, 567207340Sjkim Descriptor->ExtAddress64.Flags, 568213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 569207340Sjkim 570207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; 571207340Sjkim return (Rnode); 572207340Sjkim} 573