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