1207340Sjkim/****************************************************************************** 2207340Sjkim * 3207340Sjkim * Module Name: aslrestype2e - Large Extended address resource descriptors 4207340Sjkim * 5207340Sjkim *****************************************************************************/ 6207340Sjkim 7217365Sjkim/* 8298714Sjkim * Copyright (C) 2000 - 2016, 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 44207344Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45207340Sjkim 46207340Sjkim#define _COMPONENT ACPI_COMPILER 47207340Sjkim ACPI_MODULE_NAME ("aslrestype2e") 48207340Sjkim 49207340Sjkim/* 50207340Sjkim * This module contains the Extended (64-bit) address space descriptors: 51207340Sjkim * 52207340Sjkim * ExtendedIO 53207340Sjkim * ExtendedMemory 54207340Sjkim * ExtendedSpace 55207340Sjkim */ 56207340Sjkim 57207340Sjkim/******************************************************************************* 58207340Sjkim * 59207340Sjkim * FUNCTION: RsDoExtendedIoDescriptor 60207340Sjkim * 61272444Sjkim * PARAMETERS: Info - Parse Op and resource template offset 62207340Sjkim * 63207340Sjkim * RETURN: Completed resource node 64207340Sjkim * 65207340Sjkim * DESCRIPTION: Construct a long "ExtendedIO" descriptor 66207340Sjkim * 67207340Sjkim ******************************************************************************/ 68207340Sjkim 69207340SjkimASL_RESOURCE_NODE * 70207340SjkimRsDoExtendedIoDescriptor ( 71272444Sjkim ASL_RESOURCE_INFO *Info) 72207340Sjkim{ 73207340Sjkim AML_RESOURCE *Descriptor; 74207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 75207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 76207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 77207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 78207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 79207340Sjkim ASL_RESOURCE_NODE *Rnode; 80207340Sjkim UINT16 StringLength = 0; 81272444Sjkim UINT32 CurrentByteOffset; 82207340Sjkim UINT32 i; 83207340Sjkim 84207340Sjkim 85272444Sjkim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 86207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 87272444Sjkim CurrentByteOffset = Info->CurrentByteOffset; 88207340Sjkim 89207340Sjkim Rnode = RsAllocateResourceNode ( 90298714Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 91207340Sjkim 92207340Sjkim Descriptor = Rnode->Buffer; 93298714Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 94298714Sjkim Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; 95298714Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 96207340Sjkim 97298714Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 98207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 99207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 100207340Sjkim 101207340Sjkim /* Process all child initialization nodes */ 102207340Sjkim 103207340Sjkim for (i = 0; InitializerOp; i++) 104207340Sjkim { 105207340Sjkim switch (i) 106207340Sjkim { 107207340Sjkim case 0: /* Resource Usage */ 108207340Sjkim 109207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 110207340Sjkim break; 111207340Sjkim 112207340Sjkim case 1: /* MinType */ 113207340Sjkim 114207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 115207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 116207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 117207340Sjkim break; 118207340Sjkim 119207340Sjkim case 2: /* MaxType */ 120207340Sjkim 121207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 122207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 123207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 124207340Sjkim break; 125207340Sjkim 126207340Sjkim case 3: /* DecodeType */ 127207340Sjkim 128207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 129207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 130207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 131207340Sjkim break; 132207340Sjkim 133207340Sjkim case 4: /* Range Type */ 134207340Sjkim 135207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 3); 136228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 137228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0, 2); 138207340Sjkim break; 139207340Sjkim 140207340Sjkim case 5: /* Address Granularity */ 141207340Sjkim 142207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 143228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 144207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 145207340Sjkim GranOp = InitializerOp; 146298714Sjkim break; 147207340Sjkim 148207340Sjkim case 6: /* Address Min */ 149207340Sjkim 150207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 151228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 152207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 153207340Sjkim MinOp = InitializerOp; 154207340Sjkim break; 155207340Sjkim 156207340Sjkim case 7: /* Address Max */ 157207340Sjkim 158207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 159228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 160207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 161207340Sjkim MaxOp = InitializerOp; 162207340Sjkim break; 163207340Sjkim 164207340Sjkim case 8: /* Translation Offset */ 165207340Sjkim 166207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 167228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 168207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 169207340Sjkim break; 170207340Sjkim 171207340Sjkim case 9: /* Address Length */ 172207340Sjkim 173207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 174228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 175207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 176207340Sjkim LengthOp = InitializerOp; 177207340Sjkim break; 178207340Sjkim 179207340Sjkim case 10: /* Type-Specific Attributes */ 180207340Sjkim 181207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 182228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 183207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 184207340Sjkim break; 185207340Sjkim 186207340Sjkim case 11: /* ResourceTag */ 187207340Sjkim 188272444Sjkim UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 189207340Sjkim break; 190207340Sjkim 191207340Sjkim case 12: /* Type */ 192207340Sjkim 193207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 4, 0); 194207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 195207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 4); 196207340Sjkim break; 197207340Sjkim 198207340Sjkim case 13: /* Translation Type */ 199207340Sjkim 200207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0); 201207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 202207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5); 203207340Sjkim break; 204207340Sjkim 205207340Sjkim default: 206207340Sjkim 207207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 208207340Sjkim break; 209207340Sjkim } 210207340Sjkim 211207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 212207340Sjkim } 213207340Sjkim 214207340Sjkim /* Validate the Min/Max/Len/Gran values */ 215207340Sjkim 216207340Sjkim RsLargeAddressCheck ( 217207340Sjkim Descriptor->ExtAddress64.Minimum, 218207340Sjkim Descriptor->ExtAddress64.Maximum, 219207340Sjkim Descriptor->ExtAddress64.AddressLength, 220207340Sjkim Descriptor->ExtAddress64.Granularity, 221207340Sjkim Descriptor->ExtAddress64.Flags, 222272444Sjkim MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 223207340Sjkim 224272444Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 225272444Sjkim StringLength; 226207340Sjkim return (Rnode); 227207340Sjkim} 228207340Sjkim 229207340Sjkim 230207340Sjkim/******************************************************************************* 231207340Sjkim * 232207340Sjkim * FUNCTION: RsDoExtendedMemoryDescriptor 233207340Sjkim * 234272444Sjkim * PARAMETERS: Info - Parse Op and resource template offset 235207340Sjkim * 236207340Sjkim * RETURN: Completed resource node 237207340Sjkim * 238207340Sjkim * DESCRIPTION: Construct a long "ExtendedMemory" descriptor 239207340Sjkim * 240207340Sjkim ******************************************************************************/ 241207340Sjkim 242207340SjkimASL_RESOURCE_NODE * 243207340SjkimRsDoExtendedMemoryDescriptor ( 244272444Sjkim ASL_RESOURCE_INFO *Info) 245207340Sjkim{ 246207340Sjkim AML_RESOURCE *Descriptor; 247207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 248207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 249207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 250207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 251207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 252207340Sjkim ASL_RESOURCE_NODE *Rnode; 253207340Sjkim UINT16 StringLength = 0; 254272444Sjkim UINT32 CurrentByteOffset; 255207340Sjkim UINT32 i; 256207340Sjkim 257207340Sjkim 258272444Sjkim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 259207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 260272444Sjkim CurrentByteOffset = Info->CurrentByteOffset; 261207340Sjkim 262207340Sjkim Rnode = RsAllocateResourceNode ( 263207340Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 264207340Sjkim 265207340Sjkim Descriptor = Rnode->Buffer; 266298714Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 267298714Sjkim Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 268298714Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 269207340Sjkim 270298714Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 271207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 272207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 273207340Sjkim 274207340Sjkim /* Process all child initialization nodes */ 275207340Sjkim 276207340Sjkim for (i = 0; InitializerOp; i++) 277207340Sjkim { 278207340Sjkim switch (i) 279207340Sjkim { 280207340Sjkim case 0: /* Resource Usage */ 281207340Sjkim 282207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 283207340Sjkim break; 284207340Sjkim 285207340Sjkim case 1: /* DecodeType */ 286207340Sjkim 287207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 288207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 289207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 290207340Sjkim break; 291207340Sjkim 292207340Sjkim case 2: /* MinType */ 293207340Sjkim 294207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 295207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 296207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 297207340Sjkim break; 298207340Sjkim 299207340Sjkim case 3: /* MaxType */ 300207340Sjkim 301207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 302207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 303207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 304207340Sjkim break; 305207340Sjkim 306207340Sjkim case 4: /* Memory Type */ 307207340Sjkim 308207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 1, 0); 309228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 310228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 1, 2); 311207340Sjkim break; 312207340Sjkim 313207340Sjkim case 5: /* Read/Write Type */ 314207340Sjkim 315207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 1); 316207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 317207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0); 318207340Sjkim break; 319207340Sjkim 320207340Sjkim case 6: /* Address Granularity */ 321207340Sjkim 322207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 323228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 324207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 325207340Sjkim GranOp = InitializerOp; 326207340Sjkim break; 327207340Sjkim 328207340Sjkim case 7: /* Min Address */ 329207340Sjkim 330207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 331228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 332207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 333207340Sjkim MinOp = InitializerOp; 334207340Sjkim break; 335207340Sjkim 336207340Sjkim case 8: /* Max Address */ 337207340Sjkim 338207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 339228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 340207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 341207340Sjkim MaxOp = InitializerOp; 342207340Sjkim break; 343207340Sjkim 344207340Sjkim case 9: /* Translation Offset */ 345207340Sjkim 346207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 347228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 348207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 349207340Sjkim break; 350207340Sjkim 351207340Sjkim case 10: /* Address Length */ 352207340Sjkim 353207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 354228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 355207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 356207340Sjkim LengthOp = InitializerOp; 357207340Sjkim break; 358207340Sjkim 359207340Sjkim case 11: /* Type-Specific Attributes */ 360207340Sjkim 361207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 362228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 363207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 364207340Sjkim break; 365207340Sjkim 366207340Sjkim case 12: /* ResourceTag */ 367207340Sjkim 368272444Sjkim UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 369207340Sjkim break; 370207340Sjkim 371207340Sjkim 372207340Sjkim case 13: /* Address Range */ 373207340Sjkim 374207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 3, 0); 375228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 376228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 3, 2); 377207340Sjkim break; 378207340Sjkim 379207340Sjkim case 14: /* Type */ 380207340Sjkim 381207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0); 382207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 383207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5); 384207340Sjkim break; 385207340Sjkim 386207340Sjkim default: 387207340Sjkim 388207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 389207340Sjkim break; 390207340Sjkim } 391207340Sjkim 392207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 393207340Sjkim } 394207340Sjkim 395207340Sjkim /* Validate the Min/Max/Len/Gran values */ 396207340Sjkim 397207340Sjkim RsLargeAddressCheck ( 398207340Sjkim Descriptor->ExtAddress64.Minimum, 399207340Sjkim Descriptor->ExtAddress64.Maximum, 400207340Sjkim Descriptor->ExtAddress64.AddressLength, 401207340Sjkim Descriptor->ExtAddress64.Granularity, 402207340Sjkim Descriptor->ExtAddress64.Flags, 403272444Sjkim MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 404207340Sjkim 405272444Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 406272444Sjkim StringLength; 407207340Sjkim return (Rnode); 408207340Sjkim} 409207340Sjkim 410207340Sjkim 411207340Sjkim/******************************************************************************* 412207340Sjkim * 413207340Sjkim * FUNCTION: RsDoExtendedSpaceDescriptor 414207340Sjkim * 415272444Sjkim * PARAMETERS: Info - Parse Op and resource template offset 416207340Sjkim * 417207340Sjkim * RETURN: Completed resource node 418207340Sjkim * 419207340Sjkim * DESCRIPTION: Construct a long "ExtendedSpace" descriptor 420207340Sjkim * 421207340Sjkim ******************************************************************************/ 422207340Sjkim 423207340SjkimASL_RESOURCE_NODE * 424207340SjkimRsDoExtendedSpaceDescriptor ( 425272444Sjkim ASL_RESOURCE_INFO *Info) 426207340Sjkim{ 427207340Sjkim AML_RESOURCE *Descriptor; 428207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 429207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 430207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 431207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 432207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 433207340Sjkim ASL_RESOURCE_NODE *Rnode; 434207340Sjkim UINT16 StringLength = 0; 435272444Sjkim UINT32 CurrentByteOffset; 436207340Sjkim UINT32 i; 437207340Sjkim 438207340Sjkim 439272444Sjkim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 440207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 441272444Sjkim CurrentByteOffset = Info->CurrentByteOffset; 442207340Sjkim 443207340Sjkim Rnode = RsAllocateResourceNode ( 444298714Sjkim sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength); 445207340Sjkim 446207340Sjkim Descriptor = Rnode->Buffer; 447298714Sjkim Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64; 448298714Sjkim Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION; 449207340Sjkim 450298714Sjkim Descriptor->ExtAddress64.ResourceLength = (UINT16) 451207340Sjkim (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) - 452207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 453207340Sjkim 454207340Sjkim /* Process all child initialization nodes */ 455207340Sjkim 456207340Sjkim for (i = 0; InitializerOp; i++) 457207340Sjkim { 458207340Sjkim switch (i) 459207340Sjkim { 460207340Sjkim case 0: /* Resource Type */ 461207340Sjkim 462207340Sjkim Descriptor->ExtAddress64.ResourceType = 463207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 464207340Sjkim break; 465207340Sjkim 466207340Sjkim case 1: /* Resource Usage */ 467207340Sjkim 468207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1); 469207340Sjkim break; 470207340Sjkim 471207340Sjkim case 2: /* DecodeType */ 472207340Sjkim 473207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0); 474207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 475207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1); 476207340Sjkim break; 477207340Sjkim 478207340Sjkim case 3: /* MinType */ 479207340Sjkim 480207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0); 481207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 482207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2); 483207340Sjkim break; 484207340Sjkim 485207340Sjkim case 4: /* MaxType */ 486207340Sjkim 487207340Sjkim RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0); 488207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 489207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3); 490207340Sjkim break; 491207340Sjkim 492207340Sjkim case 5: /* Type-Specific flags */ 493207340Sjkim 494207340Sjkim Descriptor->ExtAddress64.SpecificFlags = 495207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 496207340Sjkim break; 497207340Sjkim 498207340Sjkim case 6: /* Address Granularity */ 499207340Sjkim 500207340Sjkim Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer; 501228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 502207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity)); 503207340Sjkim GranOp = InitializerOp; 504207340Sjkim break; 505207340Sjkim 506207340Sjkim case 7: /* Min Address */ 507207340Sjkim 508207340Sjkim Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer; 509228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 510207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum)); 511207340Sjkim MinOp = InitializerOp; 512207340Sjkim break; 513207340Sjkim 514207340Sjkim case 8: /* Max Address */ 515207340Sjkim 516207340Sjkim Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer; 517228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 518207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum)); 519207340Sjkim MaxOp = InitializerOp; 520207340Sjkim break; 521207340Sjkim 522207340Sjkim case 9: /* Translation Offset */ 523207340Sjkim 524207340Sjkim Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer; 525228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 526207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset)); 527207340Sjkim break; 528207340Sjkim 529207340Sjkim case 10: /* Address Length */ 530207340Sjkim 531207340Sjkim Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer; 532228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 533207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength)); 534207340Sjkim LengthOp = InitializerOp; 535207340Sjkim break; 536207340Sjkim 537207340Sjkim case 11: /* Type-Specific Attributes */ 538207340Sjkim 539207340Sjkim Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer; 540228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES, 541207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific)); 542207340Sjkim break; 543207340Sjkim 544207340Sjkim case 12: /* ResourceTag */ 545207340Sjkim 546272444Sjkim UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 547207340Sjkim break; 548207340Sjkim 549207340Sjkim default: 550207340Sjkim 551207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 552207340Sjkim break; 553207340Sjkim } 554207340Sjkim 555207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 556207340Sjkim } 557207340Sjkim 558207340Sjkim /* Validate the Min/Max/Len/Gran values */ 559207340Sjkim 560207340Sjkim RsLargeAddressCheck ( 561207340Sjkim Descriptor->ExtAddress64.Minimum, 562207340Sjkim Descriptor->ExtAddress64.Maximum, 563207340Sjkim Descriptor->ExtAddress64.AddressLength, 564207340Sjkim Descriptor->ExtAddress64.Granularity, 565207340Sjkim Descriptor->ExtAddress64.Flags, 566272444Sjkim MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 567207340Sjkim 568272444Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 569272444Sjkim StringLength; 570207340Sjkim return (Rnode); 571207340Sjkim} 572