1207340Sjkim 2207340Sjkim/****************************************************************************** 3207340Sjkim * 4207340Sjkim * Module Name: aslrestype2e - Large Extended address resource descriptors 5207340Sjkim * 6207340Sjkim *****************************************************************************/ 7207340Sjkim 8217365Sjkim/* 9217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 10207340Sjkim * All rights reserved. 11207340Sjkim * 12217365Sjkim * Redistribution and use in source and binary forms, with or without 13217365Sjkim * modification, are permitted provided that the following conditions 14217365Sjkim * are met: 15217365Sjkim * 1. Redistributions of source code must retain the above copyright 16217365Sjkim * notice, this list of conditions, and the following disclaimer, 17217365Sjkim * without modification. 18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 20217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 21217365Sjkim * including a substantially similar Disclaimer requirement for further 22217365Sjkim * binary redistribution. 23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 24217365Sjkim * of any contributors may be used to endorse or promote products derived 25217365Sjkim * from this software without specific prior written permission. 26207340Sjkim * 27217365Sjkim * Alternatively, this software may be distributed under the terms of the 28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 29217365Sjkim * Software Foundation. 30207340Sjkim * 31217365Sjkim * NO WARRANTY 32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 43217365Sjkim */ 44207340Sjkim 45207340Sjkim 46207344Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 47207340Sjkim 48207340Sjkim#define _COMPONENT ACPI_COMPILER 49207340Sjkim ACPI_MODULE_NAME ("aslrestype2e") 50207340Sjkim 51207340Sjkim/* 52207340Sjkim * This module contains the Extended (64-bit) address space descriptors: 53207340Sjkim * 54207340Sjkim * ExtendedIO 55207340Sjkim * ExtendedMemory 56207340Sjkim * ExtendedSpace 57207340Sjkim */ 58207340Sjkim 59207340Sjkim/******************************************************************************* 60207340Sjkim * 61207340Sjkim * FUNCTION: RsDoExtendedIoDescriptor 62207340Sjkim * 63207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 64207340Sjkim * CurrentByteOffset - Offset into the resource template AML 65207340Sjkim * buffer (to track references to the desc) 66207340Sjkim * 67207340Sjkim * RETURN: Completed resource node 68207340Sjkim * 69207340Sjkim * DESCRIPTION: Construct a long "ExtendedIO" descriptor 70207340Sjkim * 71207340Sjkim ******************************************************************************/ 72207340Sjkim 73207340SjkimASL_RESOURCE_NODE * 74207340SjkimRsDoExtendedIoDescriptor ( 75207340Sjkim ACPI_PARSE_OBJECT *Op, 76207340Sjkim UINT32 CurrentByteOffset) 77207340Sjkim{ 78207340Sjkim AML_RESOURCE *Descriptor; 79207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 80207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 81207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 82207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 83207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 84207340Sjkim ASL_RESOURCE_NODE *Rnode; 85207340Sjkim UINT16 StringLength = 0; 86207340Sjkim UINT32 i; 87207340Sjkim 88207340Sjkim 89207340Sjkim InitializerOp = Op->Asl.Child; 90207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 91207340Sjkim 92207340Sjkim Rnode = RsAllocateResourceNode ( 93207340Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 94207340Sjkim 95207340Sjkim Descriptor = Rnode->Buffer; 96207340Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 97207340Sjkim Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; 98207340Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 99207340Sjkim 100207340Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 101207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 102207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 103207340Sjkim 104207340Sjkim /* Process all child initialization nodes */ 105207340Sjkim 106207340Sjkim for (i = 0; InitializerOp; i++) 107207340Sjkim { 108207340Sjkim switch (i) 109207340Sjkim { 110207340Sjkim case 0: /* Resource Usage */ 111207340Sjkim 112207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 113207340Sjkim break; 114207340Sjkim 115207340Sjkim case 1: /* MinType */ 116207340Sjkim 117207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 118207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 119207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 120207340Sjkim break; 121207340Sjkim 122207340Sjkim case 2: /* MaxType */ 123207340Sjkim 124207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 125207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 126207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 127207340Sjkim break; 128207340Sjkim 129207340Sjkim case 3: /* DecodeType */ 130207340Sjkim 131207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 132207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 133207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 134207340Sjkim break; 135207340Sjkim 136207340Sjkim case 4: /* Range Type */ 137207340Sjkim 138207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 3); 139207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 140207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0); 141207340Sjkim break; 142207340Sjkim 143207340Sjkim case 5: /* Address Granularity */ 144207340Sjkim 145207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 146207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, 147207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 148207340Sjkim GranOp = InitializerOp; 149207340Sjkim break; 150207340Sjkim 151207340Sjkim case 6: /* Address Min */ 152207340Sjkim 153207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 154207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 155207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 156207340Sjkim MinOp = InitializerOp; 157207340Sjkim break; 158207340Sjkim 159207340Sjkim case 7: /* Address Max */ 160207340Sjkim 161207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 162207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 163207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 164207340Sjkim MaxOp = InitializerOp; 165207340Sjkim break; 166207340Sjkim 167207340Sjkim case 8: /* Translation Offset */ 168207340Sjkim 169207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 170207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 171207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 172207340Sjkim break; 173207340Sjkim 174207340Sjkim case 9: /* Address Length */ 175207340Sjkim 176207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 177207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 178207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 179207340Sjkim LengthOp = InitializerOp; 180207340Sjkim break; 181207340Sjkim 182207340Sjkim case 10: /* Type-Specific Attributes */ 183207340Sjkim 184207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 185207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 186207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 187207340Sjkim break; 188207340Sjkim 189207340Sjkim case 11: /* ResourceTag */ 190207340Sjkim 191207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 192207340Sjkim break; 193207340Sjkim 194207340Sjkim case 12: /* Type */ 195207340Sjkim 196207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 4, 0); 197207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 198207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 4); 199207340Sjkim break; 200207340Sjkim 201207340Sjkim case 13: /* Translation Type */ 202207340Sjkim 203207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0); 204207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 205207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5); 206207340Sjkim break; 207207340Sjkim 208207340Sjkim default: 209207340Sjkim 210207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 211207340Sjkim break; 212207340Sjkim } 213207340Sjkim 214207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 215207340Sjkim } 216207340Sjkim 217207340Sjkim /* Validate the Min/Max/Len/Gran values */ 218207340Sjkim 219207340Sjkim RsLargeAddressCheck ( 220207340Sjkim Descriptor->ExtAddress64.Minimum, 221207340Sjkim Descriptor->ExtAddress64.Maximum, 222207340Sjkim Descriptor->ExtAddress64.AddressLength, 223207340Sjkim Descriptor->ExtAddress64.Granularity, 224207340Sjkim Descriptor->ExtAddress64.Flags, 225213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 226207340Sjkim 227207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; 228207340Sjkim return (Rnode); 229207340Sjkim} 230207340Sjkim 231207340Sjkim 232207340Sjkim/******************************************************************************* 233207340Sjkim * 234207340Sjkim * FUNCTION: RsDoExtendedMemoryDescriptor 235207340Sjkim * 236207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 237207340Sjkim * CurrentByteOffset - Offset into the resource template AML 238207340Sjkim * buffer (to track references to the desc) 239207340Sjkim * 240207340Sjkim * RETURN: Completed resource node 241207340Sjkim * 242207340Sjkim * DESCRIPTION: Construct a long "ExtendedMemory" descriptor 243207340Sjkim * 244207340Sjkim ******************************************************************************/ 245207340Sjkim 246207340SjkimASL_RESOURCE_NODE * 247207340SjkimRsDoExtendedMemoryDescriptor ( 248207340Sjkim ACPI_PARSE_OBJECT *Op, 249207340Sjkim UINT32 CurrentByteOffset) 250207340Sjkim{ 251207340Sjkim AML_RESOURCE *Descriptor; 252207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 253207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 254207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 255207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 256207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 257207340Sjkim ASL_RESOURCE_NODE *Rnode; 258207340Sjkim UINT16 StringLength = 0; 259207340Sjkim UINT32 i; 260207340Sjkim 261207340Sjkim 262207340Sjkim InitializerOp = Op->Asl.Child; 263207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 264207340Sjkim 265207340Sjkim Rnode = RsAllocateResourceNode ( 266207340Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 267207340Sjkim 268207340Sjkim Descriptor = Rnode->Buffer; 269207340Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 270207340Sjkim Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 271207340Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 272207340Sjkim 273207340Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 274207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 275207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 276207340Sjkim 277207340Sjkim /* Process all child initialization nodes */ 278207340Sjkim 279207340Sjkim for (i = 0; InitializerOp; i++) 280207340Sjkim { 281207340Sjkim switch (i) 282207340Sjkim { 283207340Sjkim case 0: /* Resource Usage */ 284207340Sjkim 285207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 286207340Sjkim break; 287207340Sjkim 288207340Sjkim case 1: /* DecodeType */ 289207340Sjkim 290207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 291207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 292207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 293207340Sjkim break; 294207340Sjkim 295207340Sjkim case 2: /* MinType */ 296207340Sjkim 297207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 298207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 299207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 300207340Sjkim break; 301207340Sjkim 302207340Sjkim case 3: /* MaxType */ 303207340Sjkim 304207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 305207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 306207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 307207340Sjkim break; 308207340Sjkim 309207340Sjkim case 4: /* Memory Type */ 310207340Sjkim 311207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 1, 0); 312207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 313207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 1); 314207340Sjkim break; 315207340Sjkim 316207340Sjkim case 5: /* Read/Write Type */ 317207340Sjkim 318207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 1); 319207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 320207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0); 321207340Sjkim break; 322207340Sjkim 323207340Sjkim case 6: /* Address Granularity */ 324207340Sjkim 325207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 326207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, 327207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 328207340Sjkim GranOp = InitializerOp; 329207340Sjkim break; 330207340Sjkim 331207340Sjkim case 7: /* Min Address */ 332207340Sjkim 333207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 334207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 335207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 336207340Sjkim MinOp = InitializerOp; 337207340Sjkim break; 338207340Sjkim 339207340Sjkim case 8: /* Max Address */ 340207340Sjkim 341207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 342207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 343207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 344207340Sjkim MaxOp = InitializerOp; 345207340Sjkim break; 346207340Sjkim 347207340Sjkim case 9: /* Translation Offset */ 348207340Sjkim 349207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 350207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 351207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 352207340Sjkim break; 353207340Sjkim 354207340Sjkim case 10: /* Address Length */ 355207340Sjkim 356207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 357207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 358207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 359207340Sjkim LengthOp = InitializerOp; 360207340Sjkim break; 361207340Sjkim 362207340Sjkim case 11: /* Type-Specific Attributes */ 363207340Sjkim 364207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 365207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 366207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 367207340Sjkim break; 368207340Sjkim 369207340Sjkim case 12: /* ResourceTag */ 370207340Sjkim 371207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 372207340Sjkim break; 373207340Sjkim 374207340Sjkim 375207340Sjkim case 13: /* Address Range */ 376207340Sjkim 377207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 3, 0); 378207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 379207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 3); 380207340Sjkim break; 381207340Sjkim 382207340Sjkim case 14: /* Type */ 383207340Sjkim 384207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0); 385207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 386207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5); 387207340Sjkim break; 388207340Sjkim 389207340Sjkim default: 390207340Sjkim 391207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 392207340Sjkim break; 393207340Sjkim } 394207340Sjkim 395207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 396207340Sjkim } 397207340Sjkim 398207340Sjkim /* Validate the Min/Max/Len/Gran values */ 399207340Sjkim 400207340Sjkim RsLargeAddressCheck ( 401207340Sjkim Descriptor->ExtAddress64.Minimum, 402207340Sjkim Descriptor->ExtAddress64.Maximum, 403207340Sjkim Descriptor->ExtAddress64.AddressLength, 404207340Sjkim Descriptor->ExtAddress64.Granularity, 405207340Sjkim Descriptor->ExtAddress64.Flags, 406213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 407207340Sjkim 408207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; 409207340Sjkim return (Rnode); 410207340Sjkim} 411207340Sjkim 412207340Sjkim 413207340Sjkim/******************************************************************************* 414207340Sjkim * 415207340Sjkim * FUNCTION: RsDoExtendedSpaceDescriptor 416207340Sjkim * 417207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 418207340Sjkim * CurrentByteOffset - Offset into the resource template AML 419207340Sjkim * buffer (to track references to the desc) 420207340Sjkim * 421207340Sjkim * RETURN: Completed resource node 422207340Sjkim * 423207340Sjkim * DESCRIPTION: Construct a long "ExtendedSpace" descriptor 424207340Sjkim * 425207340Sjkim ******************************************************************************/ 426207340Sjkim 427207340SjkimASL_RESOURCE_NODE * 428207340SjkimRsDoExtendedSpaceDescriptor ( 429207340Sjkim ACPI_PARSE_OBJECT *Op, 430207340Sjkim UINT32 CurrentByteOffset) 431207340Sjkim{ 432207340Sjkim AML_RESOURCE *Descriptor; 433207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 434207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 435207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 436207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 437207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 438207340Sjkim ASL_RESOURCE_NODE *Rnode; 439207340Sjkim UINT16 StringLength = 0; 440207340Sjkim UINT32 i; 441207340Sjkim 442207340Sjkim 443207340Sjkim InitializerOp = Op->Asl.Child; 444207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 445207340Sjkim 446207340Sjkim Rnode = RsAllocateResourceNode ( 447207340Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 448207340Sjkim 449207340Sjkim Descriptor = Rnode->Buffer; 450207340Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 451207340Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 452207340Sjkim 453207340Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 454207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 455207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 456207340Sjkim 457207340Sjkim /* Process all child initialization nodes */ 458207340Sjkim 459207340Sjkim for (i = 0; InitializerOp; i++) 460207340Sjkim { 461207340Sjkim switch (i) 462207340Sjkim { 463207340Sjkim case 0: /* Resource Type */ 464207340Sjkim 465207340Sjkim Descriptor->ExtAddress64.ResourceType = 466207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 467207340Sjkim break; 468207340Sjkim 469207340Sjkim case 1: /* Resource Usage */ 470207340Sjkim 471207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 472207340Sjkim break; 473207340Sjkim 474207340Sjkim case 2: /* DecodeType */ 475207340Sjkim 476207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 477207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 478207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 479207340Sjkim break; 480207340Sjkim 481207340Sjkim case 3: /* MinType */ 482207340Sjkim 483207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 484207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 485207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 486207340Sjkim break; 487207340Sjkim 488207340Sjkim case 4: /* MaxType */ 489207340Sjkim 490207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 491207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 492207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 493207340Sjkim break; 494207340Sjkim 495207340Sjkim case 5: /* Type-Specific flags */ 496207340Sjkim 497207340Sjkim Descriptor->ExtAddress64.SpecificFlags = 498207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 499207340Sjkim break; 500207340Sjkim 501207340Sjkim case 6: /* Address Granularity */ 502207340Sjkim 503207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 504207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, 505207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 506207340Sjkim GranOp = InitializerOp; 507207340Sjkim break; 508207340Sjkim 509207340Sjkim case 7: /* Min Address */ 510207340Sjkim 511207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 512207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 513207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 514207340Sjkim MinOp = InitializerOp; 515207340Sjkim break; 516207340Sjkim 517207340Sjkim case 8: /* Max Address */ 518207340Sjkim 519207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 520207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 521207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 522207340Sjkim MaxOp = InitializerOp; 523207340Sjkim break; 524207340Sjkim 525207340Sjkim case 9: /* Translation Offset */ 526207340Sjkim 527207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 528207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 529207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 530207340Sjkim break; 531207340Sjkim 532207340Sjkim case 10: /* Address Length */ 533207340Sjkim 534207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 535207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 536207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 537207340Sjkim LengthOp = InitializerOp; 538207340Sjkim break; 539207340Sjkim 540207340Sjkim case 11: /* Type-Specific Attributes */ 541207340Sjkim 542207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 543207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 544207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 545207340Sjkim break; 546207340Sjkim 547207340Sjkim case 12: /* ResourceTag */ 548207340Sjkim 549207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 550207340Sjkim break; 551207340Sjkim 552207340Sjkim default: 553207340Sjkim 554207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 555207340Sjkim break; 556207340Sjkim } 557207340Sjkim 558207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 559207340Sjkim } 560207340Sjkim 561207340Sjkim /* Validate the Min/Max/Len/Gran values */ 562207340Sjkim 563207340Sjkim RsLargeAddressCheck ( 564207340Sjkim Descriptor->ExtAddress64.Minimum, 565207340Sjkim Descriptor->ExtAddress64.Maximum, 566207340Sjkim Descriptor->ExtAddress64.AddressLength, 567207340Sjkim Descriptor->ExtAddress64.Granularity, 568207340Sjkim Descriptor->ExtAddress64.Flags, 569213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 570207340Sjkim 571207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength; 572207340Sjkim return (Rnode); 573207340Sjkim} 574