1207340Sjkim/****************************************************************************** 2207340Sjkim * 3207340Sjkim * Module Name: aslrestype2q - Large QWord 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#include "aslcompiler.y.h" 47207340Sjkim 48207340Sjkim#define _COMPONENT ACPI_COMPILER 49207340Sjkim ACPI_MODULE_NAME ("aslrestype2q") 50207340Sjkim 51207340Sjkim/* 52207340Sjkim * This module contains the QWord (64-bit) address space descriptors: 53207340Sjkim * 54207340Sjkim * QWordIO 55207340Sjkim * QWordMemory 56207340Sjkim * QWordSpace 57207340Sjkim */ 58207340Sjkim 59207340Sjkim/******************************************************************************* 60207340Sjkim * 61207340Sjkim * FUNCTION: RsDoQwordIoDescriptor 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 "QwordIO" descriptor 70207340Sjkim * 71207340Sjkim ******************************************************************************/ 72207340Sjkim 73207340SjkimASL_RESOURCE_NODE * 74207340SjkimRsDoQwordIoDescriptor ( 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 UINT8 *OptionalFields; 86207340Sjkim UINT16 StringLength = 0; 87207340Sjkim UINT32 OptionIndex = 0; 88207340Sjkim UINT32 i; 89207340Sjkim BOOLEAN ResSourceIndex = FALSE; 90207340Sjkim 91207340Sjkim 92207340Sjkim InitializerOp = Op->Asl.Child; 93207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 94207340Sjkim 95207340Sjkim Rnode = RsAllocateResourceNode ( 96207340Sjkim sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 97207340Sjkim 98207340Sjkim Descriptor = Rnode->Buffer; 99207340Sjkim Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 100207340Sjkim Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; 101207340Sjkim 102207340Sjkim /* 103207340Sjkim * Initial descriptor length -- may be enlarged if there are 104207340Sjkim * optional fields present 105207340Sjkim */ 106207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 107207340Sjkim Descriptor->Address64.ResourceLength = (UINT16) 108207340Sjkim (sizeof (AML_RESOURCE_ADDRESS64) - 109207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 110207340Sjkim 111207340Sjkim /* Process all child initialization nodes */ 112207340Sjkim 113207340Sjkim for (i = 0; InitializerOp; i++) 114207340Sjkim { 115207340Sjkim switch (i) 116207340Sjkim { 117207340Sjkim case 0: /* Resource Usage */ 118207340Sjkim 119207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 120207340Sjkim break; 121207340Sjkim 122207340Sjkim case 1: /* MinType */ 123207340Sjkim 124207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 125207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 126207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 127207340Sjkim break; 128207340Sjkim 129207340Sjkim case 2: /* MaxType */ 130207340Sjkim 131207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 132207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 133207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 134207340Sjkim break; 135207340Sjkim 136207340Sjkim case 3: /* DecodeType */ 137207340Sjkim 138207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 139207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 140207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 141207340Sjkim break; 142207340Sjkim 143207340Sjkim case 4: /* Range Type */ 144207340Sjkim 145207340Sjkim RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3); 146228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 147228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2); 148207340Sjkim break; 149207340Sjkim 150207340Sjkim case 5: /* Address Granularity */ 151207340Sjkim 152207340Sjkim Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 153228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 154207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 155207340Sjkim GranOp = InitializerOp; 156207340Sjkim break; 157207340Sjkim 158207340Sjkim case 6: /* Address Min */ 159207340Sjkim 160207340Sjkim Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 161228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 162207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 163207340Sjkim MinOp = InitializerOp; 164207340Sjkim break; 165207340Sjkim 166207340Sjkim case 7: /* Address Max */ 167207340Sjkim 168207340Sjkim Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 169228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 170207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 171207340Sjkim MaxOp = InitializerOp; 172207340Sjkim break; 173207340Sjkim 174207340Sjkim case 8: /* Translation Offset */ 175207340Sjkim 176207340Sjkim Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 177207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 178207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 179207340Sjkim break; 180207340Sjkim 181207340Sjkim case 9: /* Address Length */ 182207340Sjkim 183207340Sjkim Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 184228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 185207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 186207340Sjkim LengthOp = InitializerOp; 187207340Sjkim break; 188207340Sjkim 189207340Sjkim case 10: /* ResSourceIndex [Optional Field - BYTE] */ 190207340Sjkim 191207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 192207340Sjkim { 193207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 194207340Sjkim OptionIndex++; 195207340Sjkim Descriptor->Address64.ResourceLength++; 196207340Sjkim ResSourceIndex = TRUE; 197207340Sjkim } 198207340Sjkim break; 199207340Sjkim 200207340Sjkim case 11: /* ResSource [Optional Field - STRING] */ 201207340Sjkim 202207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 203207340Sjkim (InitializerOp->Asl.Value.String)) 204207340Sjkim { 205207340Sjkim if (StringLength) 206207340Sjkim { 207207340Sjkim Descriptor->Address64.ResourceLength = (UINT16) 208207340Sjkim (Descriptor->Address64.ResourceLength + StringLength); 209207340Sjkim 210207340Sjkim strcpy ((char *) 211207340Sjkim &OptionalFields[OptionIndex], 212207340Sjkim InitializerOp->Asl.Value.String); 213207340Sjkim 214207340Sjkim /* ResourceSourceIndex must also be valid */ 215207340Sjkim 216207340Sjkim if (!ResSourceIndex) 217207340Sjkim { 218207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 219207340Sjkim InitializerOp, NULL); 220207340Sjkim } 221207340Sjkim } 222207340Sjkim } 223207340Sjkim 224207340Sjkim#if 0 225207340Sjkim /* 226207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 227207340Sjkim * be invalid 228207340Sjkim */ 229207340Sjkim else if (ResSourceIndex) 230207340Sjkim { 231207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 232207340Sjkim InitializerOp, NULL); 233207340Sjkim } 234207340Sjkim#endif 235207340Sjkim break; 236207340Sjkim 237207340Sjkim case 12: /* ResourceTag */ 238207340Sjkim 239207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 240207340Sjkim break; 241207340Sjkim 242207340Sjkim case 13: /* Type */ 243207340Sjkim 244207340Sjkim RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0); 245207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 246207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4); 247207340Sjkim break; 248207340Sjkim 249207340Sjkim case 14: /* Translation Type */ 250207340Sjkim 251207340Sjkim RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0); 252207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 253207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5); 254207340Sjkim break; 255207340Sjkim 256207340Sjkim default: 257207340Sjkim 258207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 259207340Sjkim break; 260207340Sjkim } 261207340Sjkim 262207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 263207340Sjkim } 264207340Sjkim 265207340Sjkim /* Validate the Min/Max/Len/Gran values */ 266207340Sjkim 267207340Sjkim RsLargeAddressCheck ( 268207340Sjkim Descriptor->Address64.Minimum, 269207340Sjkim Descriptor->Address64.Maximum, 270207340Sjkim Descriptor->Address64.AddressLength, 271207340Sjkim Descriptor->Address64.Granularity, 272207340Sjkim Descriptor->Address64.Flags, 273213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 274207340Sjkim 275207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 276207340Sjkim OptionIndex + StringLength; 277207340Sjkim return (Rnode); 278207340Sjkim} 279207340Sjkim 280207340Sjkim 281207340Sjkim/******************************************************************************* 282207340Sjkim * 283207340Sjkim * FUNCTION: RsDoQwordMemoryDescriptor 284207340Sjkim * 285207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 286207340Sjkim * CurrentByteOffset - Offset into the resource template AML 287207340Sjkim * buffer (to track references to the desc) 288207340Sjkim * 289207340Sjkim * RETURN: Completed resource node 290207340Sjkim * 291207340Sjkim * DESCRIPTION: Construct a long "QwordMemory" descriptor 292207340Sjkim * 293207340Sjkim ******************************************************************************/ 294207340Sjkim 295207340SjkimASL_RESOURCE_NODE * 296207340SjkimRsDoQwordMemoryDescriptor ( 297207340Sjkim ACPI_PARSE_OBJECT *Op, 298207340Sjkim UINT32 CurrentByteOffset) 299207340Sjkim{ 300207340Sjkim AML_RESOURCE *Descriptor; 301207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 302207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 303207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 304207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 305207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 306207340Sjkim ASL_RESOURCE_NODE *Rnode; 307207340Sjkim UINT8 *OptionalFields; 308207340Sjkim UINT16 StringLength = 0; 309207340Sjkim UINT32 OptionIndex = 0; 310207340Sjkim UINT32 i; 311207340Sjkim BOOLEAN ResSourceIndex = FALSE; 312207340Sjkim 313207340Sjkim 314207340Sjkim InitializerOp = Op->Asl.Child; 315207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 316207340Sjkim 317207340Sjkim Rnode = RsAllocateResourceNode ( 318207340Sjkim sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 319207340Sjkim 320207340Sjkim Descriptor = Rnode->Buffer; 321207340Sjkim Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 322207340Sjkim Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 323207340Sjkim 324207340Sjkim /* 325207340Sjkim * Initial descriptor length -- may be enlarged if there are 326207340Sjkim * optional fields present 327207340Sjkim */ 328207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 329207340Sjkim Descriptor->Address64.ResourceLength = (UINT16) 330207340Sjkim (sizeof (AML_RESOURCE_ADDRESS64) - 331207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 332207340Sjkim 333207340Sjkim /* Process all child initialization nodes */ 334207340Sjkim 335207340Sjkim for (i = 0; InitializerOp; i++) 336207340Sjkim { 337207340Sjkim switch (i) 338207340Sjkim { 339207340Sjkim case 0: /* Resource Usage */ 340207340Sjkim 341207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 342207340Sjkim break; 343207340Sjkim 344207340Sjkim case 1: /* DecodeType */ 345207340Sjkim 346207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 347207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 348207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 349207340Sjkim break; 350207340Sjkim 351207340Sjkim case 2: /* MinType */ 352207340Sjkim 353207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 354207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 355207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 356207340Sjkim break; 357207340Sjkim 358207340Sjkim case 3: /* MaxType */ 359207340Sjkim 360207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 361207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 362207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 363207340Sjkim break; 364207340Sjkim 365207340Sjkim case 4: /* Memory Type */ 366207340Sjkim 367207340Sjkim RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0); 368228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 369228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2); 370207340Sjkim break; 371207340Sjkim 372207340Sjkim case 5: /* Read/Write Type */ 373207340Sjkim 374207340Sjkim RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1); 375207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 376207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0); 377207340Sjkim break; 378207340Sjkim 379207340Sjkim case 6: /* Address Granularity */ 380207340Sjkim 381207340Sjkim Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 382228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 383207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 384207340Sjkim GranOp = InitializerOp; 385207340Sjkim break; 386207340Sjkim 387207340Sjkim case 7: /* Min Address */ 388207340Sjkim 389207340Sjkim Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 390228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 391207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 392207340Sjkim MinOp = InitializerOp; 393207340Sjkim break; 394207340Sjkim 395207340Sjkim case 8: /* Max Address */ 396207340Sjkim 397207340Sjkim Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 398228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 399207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 400207340Sjkim MaxOp = InitializerOp; 401207340Sjkim break; 402207340Sjkim 403207340Sjkim case 9: /* Translation Offset */ 404207340Sjkim 405207340Sjkim Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 406228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 407207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 408207340Sjkim break; 409207340Sjkim 410207340Sjkim case 10: /* Address Length */ 411207340Sjkim 412207340Sjkim Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 413228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 414207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 415207340Sjkim LengthOp = InitializerOp; 416207340Sjkim break; 417207340Sjkim 418207340Sjkim case 11: /* ResSourceIndex [Optional Field - BYTE] */ 419207340Sjkim 420207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 421207340Sjkim { 422207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 423207340Sjkim OptionIndex++; 424207340Sjkim Descriptor->Address64.ResourceLength++; 425207340Sjkim ResSourceIndex = TRUE; 426207340Sjkim } 427207340Sjkim break; 428207340Sjkim 429207340Sjkim case 12: /* ResSource [Optional Field - STRING] */ 430207340Sjkim 431207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 432207340Sjkim (InitializerOp->Asl.Value.String)) 433207340Sjkim { 434207340Sjkim if (StringLength) 435207340Sjkim { 436207340Sjkim Descriptor->Address64.ResourceLength = (UINT16) 437207340Sjkim (Descriptor->Address64.ResourceLength + StringLength); 438207340Sjkim 439207340Sjkim strcpy ((char *) 440207340Sjkim &OptionalFields[OptionIndex], 441207340Sjkim InitializerOp->Asl.Value.String); 442207340Sjkim 443207340Sjkim /* ResourceSourceIndex must also be valid */ 444207340Sjkim 445207340Sjkim if (!ResSourceIndex) 446207340Sjkim { 447207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 448207340Sjkim InitializerOp, NULL); 449207340Sjkim } 450207340Sjkim } 451207340Sjkim } 452207340Sjkim 453207340Sjkim#if 0 454207340Sjkim /* 455207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 456207340Sjkim * be invalid 457207340Sjkim */ 458207340Sjkim else if (ResSourceIndex) 459207340Sjkim { 460207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 461207340Sjkim InitializerOp, NULL); 462207340Sjkim } 463207340Sjkim#endif 464207340Sjkim break; 465207340Sjkim 466207340Sjkim case 13: /* ResourceTag */ 467207340Sjkim 468207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 469207340Sjkim break; 470207340Sjkim 471207340Sjkim 472207340Sjkim case 14: /* Address Range */ 473207340Sjkim 474207340Sjkim RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0); 475228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 476228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2); 477207340Sjkim break; 478207340Sjkim 479207340Sjkim case 15: /* Type */ 480207340Sjkim 481207340Sjkim RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0); 482207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 483207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5); 484207340Sjkim break; 485207340Sjkim 486207340Sjkim default: 487207340Sjkim 488207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 489207340Sjkim break; 490207340Sjkim } 491207340Sjkim 492207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 493207340Sjkim } 494207340Sjkim 495207340Sjkim /* Validate the Min/Max/Len/Gran values */ 496207340Sjkim 497207340Sjkim RsLargeAddressCheck ( 498207340Sjkim Descriptor->Address64.Minimum, 499207340Sjkim Descriptor->Address64.Maximum, 500207340Sjkim Descriptor->Address64.AddressLength, 501207340Sjkim Descriptor->Address64.Granularity, 502207340Sjkim Descriptor->Address64.Flags, 503213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 504207340Sjkim 505207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 506207340Sjkim OptionIndex + StringLength; 507207340Sjkim return (Rnode); 508207340Sjkim} 509207340Sjkim 510207340Sjkim 511207340Sjkim/******************************************************************************* 512207340Sjkim * 513207340Sjkim * FUNCTION: RsDoQwordSpaceDescriptor 514207340Sjkim * 515207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 516207340Sjkim * CurrentByteOffset - Offset into the resource template AML 517207340Sjkim * buffer (to track references to the desc) 518207340Sjkim * 519207340Sjkim * RETURN: Completed resource node 520207340Sjkim * 521207340Sjkim * DESCRIPTION: Construct a long "QwordSpace" descriptor 522207340Sjkim * 523207340Sjkim ******************************************************************************/ 524207340Sjkim 525207340SjkimASL_RESOURCE_NODE * 526207340SjkimRsDoQwordSpaceDescriptor ( 527207340Sjkim ACPI_PARSE_OBJECT *Op, 528207340Sjkim UINT32 CurrentByteOffset) 529207340Sjkim{ 530207340Sjkim AML_RESOURCE *Descriptor; 531207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 532207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 533207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 534207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 535207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 536207340Sjkim ASL_RESOURCE_NODE *Rnode; 537207340Sjkim UINT8 *OptionalFields; 538207340Sjkim UINT16 StringLength = 0; 539207340Sjkim UINT32 OptionIndex = 0; 540207340Sjkim UINT32 i; 541207340Sjkim BOOLEAN ResSourceIndex = FALSE; 542207340Sjkim 543207340Sjkim 544207340Sjkim InitializerOp = Op->Asl.Child; 545207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 546207340Sjkim 547207340Sjkim Rnode = RsAllocateResourceNode ( 548207340Sjkim sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 549207340Sjkim 550207340Sjkim Descriptor = Rnode->Buffer; 551207340Sjkim Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 552207340Sjkim 553207340Sjkim /* 554207340Sjkim * Initial descriptor length -- may be enlarged if there are 555207340Sjkim * optional fields present 556207340Sjkim */ 557207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 558207340Sjkim Descriptor->Address64.ResourceLength = (UINT16) 559207340Sjkim (sizeof (AML_RESOURCE_ADDRESS64) - 560207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 561207340Sjkim 562207340Sjkim /* Process all child initialization nodes */ 563207340Sjkim 564207340Sjkim for (i = 0; InitializerOp; i++) 565207340Sjkim { 566207340Sjkim switch (i) 567207340Sjkim { 568207340Sjkim case 0: /* Resource Type */ 569207340Sjkim 570207340Sjkim Descriptor->Address64.ResourceType = 571207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 572207340Sjkim break; 573207340Sjkim 574207340Sjkim case 1: /* Resource Usage */ 575207340Sjkim 576207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 577207340Sjkim break; 578207340Sjkim 579207340Sjkim case 2: /* DecodeType */ 580207340Sjkim 581207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 582207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 583207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 584207340Sjkim break; 585207340Sjkim 586207340Sjkim case 3: /* MinType */ 587207340Sjkim 588207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 589207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 590207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 591207340Sjkim break; 592207340Sjkim 593207340Sjkim case 4: /* MaxType */ 594207340Sjkim 595207340Sjkim RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 596207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 597207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 598207340Sjkim break; 599207340Sjkim 600207340Sjkim case 5: /* Type-Specific flags */ 601207340Sjkim 602207340Sjkim Descriptor->Address64.SpecificFlags = 603207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 604207340Sjkim break; 605207340Sjkim 606207340Sjkim case 6: /* Address Granularity */ 607207340Sjkim 608207340Sjkim Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 609228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 610207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 611207340Sjkim GranOp = InitializerOp; 612207340Sjkim break; 613207340Sjkim 614207340Sjkim case 7: /* Min Address */ 615207340Sjkim 616207340Sjkim Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 617228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 618207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 619207340Sjkim MinOp = InitializerOp; 620207340Sjkim break; 621207340Sjkim 622207340Sjkim case 8: /* Max Address */ 623207340Sjkim 624207340Sjkim Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 625228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 626207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 627207340Sjkim MaxOp = InitializerOp; 628207340Sjkim break; 629207340Sjkim 630207340Sjkim case 9: /* Translation Offset */ 631207340Sjkim 632207340Sjkim Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 633228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 634207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 635207340Sjkim break; 636207340Sjkim 637207340Sjkim case 10: /* Address Length */ 638207340Sjkim 639207340Sjkim Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 640228110Sjkim RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 641207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 642207340Sjkim LengthOp = InitializerOp; 643207340Sjkim break; 644207340Sjkim 645207340Sjkim case 11: /* ResSourceIndex [Optional Field - BYTE] */ 646207340Sjkim 647207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 648207340Sjkim { 649207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 650207340Sjkim OptionIndex++; 651207340Sjkim Descriptor->Address64.ResourceLength++; 652207340Sjkim ResSourceIndex = TRUE; 653207340Sjkim } 654207340Sjkim break; 655207340Sjkim 656207340Sjkim case 12: /* ResSource [Optional Field - STRING] */ 657207340Sjkim 658207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 659207340Sjkim (InitializerOp->Asl.Value.String)) 660207340Sjkim { 661207340Sjkim if (StringLength) 662207340Sjkim { 663207340Sjkim Descriptor->Address64.ResourceLength = (UINT16) 664207340Sjkim (Descriptor->Address64.ResourceLength + StringLength); 665207340Sjkim 666207340Sjkim strcpy ((char *) 667207340Sjkim &OptionalFields[OptionIndex], 668207340Sjkim InitializerOp->Asl.Value.String); 669207340Sjkim 670207340Sjkim /* ResourceSourceIndex must also be valid */ 671207340Sjkim 672207340Sjkim if (!ResSourceIndex) 673207340Sjkim { 674207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 675207340Sjkim InitializerOp, NULL); 676207340Sjkim } 677207340Sjkim } 678207340Sjkim } 679207340Sjkim 680207340Sjkim#if 0 681207340Sjkim /* 682207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 683207340Sjkim * be invalid 684207340Sjkim */ 685207340Sjkim else if (ResSourceIndex) 686207340Sjkim { 687207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 688207340Sjkim InitializerOp, NULL); 689207340Sjkim } 690207340Sjkim#endif 691207340Sjkim break; 692207340Sjkim 693207340Sjkim case 13: /* ResourceTag */ 694207340Sjkim 695207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 696207340Sjkim break; 697207340Sjkim 698207340Sjkim default: 699207340Sjkim 700207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 701207340Sjkim break; 702207340Sjkim } 703207340Sjkim 704207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 705207340Sjkim } 706207340Sjkim 707207340Sjkim /* Validate the Min/Max/Len/Gran values */ 708207340Sjkim 709207340Sjkim RsLargeAddressCheck ( 710207340Sjkim Descriptor->Address64.Minimum, 711207340Sjkim Descriptor->Address64.Maximum, 712207340Sjkim Descriptor->Address64.AddressLength, 713207340Sjkim Descriptor->Address64.Granularity, 714207340Sjkim Descriptor->Address64.Flags, 715213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 716207340Sjkim 717207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 718207340Sjkim OptionIndex + StringLength; 719207340Sjkim return (Rnode); 720207340Sjkim} 721