1207340Sjkim/****************************************************************************** 2207340Sjkim * 3207340Sjkim * Module Name: aslrestype2d - Large DWord 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 ("aslrestype2d") 50207340Sjkim 51207340Sjkim/* 52207340Sjkim * This module contains the Dword (32-bit) address space descriptors: 53207340Sjkim * 54207340Sjkim * DwordIO 55207340Sjkim * DwordMemory 56207340Sjkim * DwordSpace 57207340Sjkim */ 58207340Sjkim 59207340Sjkim/******************************************************************************* 60207340Sjkim * 61207340Sjkim * FUNCTION: RsDoDwordIoDescriptor 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 "DwordIO" descriptor 70207340Sjkim * 71207340Sjkim ******************************************************************************/ 72207340Sjkim 73207340SjkimASL_RESOURCE_NODE * 74207340SjkimRsDoDwordIoDescriptor ( 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 OptionIndex = 0; 87207340Sjkim UINT8 *OptionalFields; 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_ADDRESS32) + 1 + StringLength); 97207340Sjkim 98207340Sjkim Descriptor = Rnode->Buffer; 99207340Sjkim Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32; 100207340Sjkim Descriptor->Address32.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_ADDRESS32); 107207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 108207340Sjkim (sizeof (AML_RESOURCE_ADDRESS32) - 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->Address32.Flags, InitializerOp, 0, 1); 120207340Sjkim break; 121207340Sjkim 122207340Sjkim case 1: /* MinType */ 123207340Sjkim 124207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0); 125207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 126207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2); 127207340Sjkim break; 128207340Sjkim 129207340Sjkim case 2: /* MaxType */ 130207340Sjkim 131207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0); 132207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 133207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3); 134207340Sjkim break; 135207340Sjkim 136207340Sjkim case 3: /* DecodeType */ 137207340Sjkim 138207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0); 139207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 140207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1); 141207340Sjkim break; 142207340Sjkim 143207340Sjkim case 4: /* Range Type */ 144207340Sjkim 145207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 3); 146228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 147228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0, 2); 148207340Sjkim break; 149207340Sjkim 150207340Sjkim case 5: /* Address Granularity */ 151207340Sjkim 152207340Sjkim Descriptor->Address32.Granularity = 153207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 154228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 155207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); 156207340Sjkim GranOp = InitializerOp; 157207340Sjkim break; 158207340Sjkim 159207340Sjkim case 6: /* Address Min */ 160207340Sjkim 161207340Sjkim Descriptor->Address32.Minimum = 162207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 163228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR, 164207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); 165207340Sjkim MinOp = InitializerOp; 166207340Sjkim break; 167207340Sjkim 168207340Sjkim case 7: /* Address Max */ 169207340Sjkim 170207340Sjkim Descriptor->Address32.Maximum = 171207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 172228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 173207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); 174207340Sjkim MaxOp = InitializerOp; 175207340Sjkim break; 176207340Sjkim 177207340Sjkim case 8: /* Translation Offset */ 178207340Sjkim 179207340Sjkim Descriptor->Address32.TranslationOffset = 180207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 181228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 182207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); 183207340Sjkim break; 184207340Sjkim 185207340Sjkim case 9: /* Address Length */ 186207340Sjkim 187207340Sjkim Descriptor->Address32.AddressLength = 188207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 189228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, 190207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); 191207340Sjkim LengthOp = InitializerOp; 192207340Sjkim break; 193207340Sjkim 194207340Sjkim case 10: /* ResSourceIndex [Optional Field - BYTE] */ 195207340Sjkim 196207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 197207340Sjkim { 198207340Sjkim /* Found a valid ResourceSourceIndex */ 199207340Sjkim 200207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 201207340Sjkim OptionIndex++; 202207340Sjkim Descriptor->Address32.ResourceLength++; 203207340Sjkim ResSourceIndex = TRUE; 204207340Sjkim } 205207340Sjkim break; 206207340Sjkim 207207340Sjkim case 11: /* ResSource [Optional Field - STRING] */ 208207340Sjkim 209207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 210207340Sjkim (InitializerOp->Asl.Value.String)) 211207340Sjkim { 212207340Sjkim if (StringLength) 213207340Sjkim { 214207340Sjkim /* Found a valid ResourceSource */ 215207340Sjkim 216207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 217207340Sjkim (Descriptor->Address32.ResourceLength + StringLength); 218207340Sjkim 219207340Sjkim strcpy ((char *) 220207340Sjkim &OptionalFields[OptionIndex], 221207340Sjkim InitializerOp->Asl.Value.String); 222207340Sjkim 223207340Sjkim /* ResourceSourceIndex must also be valid */ 224207340Sjkim 225207340Sjkim if (!ResSourceIndex) 226207340Sjkim { 227207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 228207340Sjkim InitializerOp, NULL); 229207340Sjkim } 230207340Sjkim } 231207340Sjkim } 232207340Sjkim 233207340Sjkim#if 0 234207340Sjkim /* 235207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 236207340Sjkim * be invalid 237207340Sjkim */ 238207340Sjkim else if (ResSourceIndex) 239207340Sjkim { 240207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 241207340Sjkim InitializerOp, NULL); 242207340Sjkim } 243207340Sjkim#endif 244207340Sjkim break; 245207340Sjkim 246207340Sjkim case 12: /* ResourceTag */ 247207340Sjkim 248207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 249207340Sjkim break; 250207340Sjkim 251207340Sjkim case 13: /* Type */ 252207340Sjkim 253207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 4, 0); 254207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 255207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 4); 256207340Sjkim break; 257207340Sjkim 258207340Sjkim case 14: /* Translation Type */ 259207340Sjkim 260207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0); 261207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 262207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5); 263207340Sjkim break; 264207340Sjkim 265207340Sjkim default: 266207340Sjkim 267207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 268207340Sjkim break; 269207340Sjkim } 270207340Sjkim 271207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 272207340Sjkim } 273207340Sjkim 274207340Sjkim /* Validate the Min/Max/Len/Gran values */ 275207340Sjkim 276207340Sjkim RsLargeAddressCheck ( 277212761Sjkim (UINT64) Descriptor->Address32.Minimum, 278212761Sjkim (UINT64) Descriptor->Address32.Maximum, 279212761Sjkim (UINT64) Descriptor->Address32.AddressLength, 280212761Sjkim (UINT64) Descriptor->Address32.Granularity, 281207340Sjkim Descriptor->Address32.Flags, 282213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 283207340Sjkim 284207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + 285207340Sjkim OptionIndex + StringLength; 286207340Sjkim return (Rnode); 287207340Sjkim} 288207340Sjkim 289207340Sjkim 290207340Sjkim/******************************************************************************* 291207340Sjkim * 292207340Sjkim * FUNCTION: RsDoDwordMemoryDescriptor 293207340Sjkim * 294207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 295207340Sjkim * CurrentByteOffset - Offset into the resource template AML 296207340Sjkim * buffer (to track references to the desc) 297207340Sjkim * 298207340Sjkim * RETURN: Completed resource node 299207340Sjkim * 300207340Sjkim * DESCRIPTION: Construct a long "DwordMemory" descriptor 301207340Sjkim * 302207340Sjkim ******************************************************************************/ 303207340Sjkim 304207340SjkimASL_RESOURCE_NODE * 305207340SjkimRsDoDwordMemoryDescriptor ( 306207340Sjkim ACPI_PARSE_OBJECT *Op, 307207340Sjkim UINT32 CurrentByteOffset) 308207340Sjkim{ 309207340Sjkim AML_RESOURCE *Descriptor; 310207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 311207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 312207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 313207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 314207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 315207340Sjkim ASL_RESOURCE_NODE *Rnode; 316207340Sjkim UINT8 *OptionalFields; 317207340Sjkim UINT16 StringLength = 0; 318207340Sjkim UINT32 OptionIndex = 0; 319207340Sjkim UINT32 i; 320207340Sjkim BOOLEAN ResSourceIndex = FALSE; 321207340Sjkim 322207340Sjkim 323207340Sjkim InitializerOp = Op->Asl.Child; 324207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 325207340Sjkim 326207340Sjkim Rnode = RsAllocateResourceNode ( 327207340Sjkim sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength); 328207340Sjkim 329207340Sjkim Descriptor = Rnode->Buffer; 330207340Sjkim Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32; 331207340Sjkim Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 332207340Sjkim 333207340Sjkim /* 334207340Sjkim * Initial descriptor length -- may be enlarged if there are 335207340Sjkim * optional fields present 336207340Sjkim */ 337207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); 338207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 339207340Sjkim (sizeof (AML_RESOURCE_ADDRESS32) - 340207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 341207340Sjkim 342207340Sjkim 343207340Sjkim /* Process all child initialization nodes */ 344207340Sjkim 345207340Sjkim for (i = 0; InitializerOp; i++) 346207340Sjkim { 347207340Sjkim switch (i) 348207340Sjkim { 349207340Sjkim case 0: /* Resource Usage */ 350207340Sjkim 351207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1); 352207340Sjkim break; 353207340Sjkim 354207340Sjkim case 1: /* DecodeType */ 355207340Sjkim 356207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0); 357207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 358207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1); 359207340Sjkim break; 360207340Sjkim 361207340Sjkim case 2: /* MinType */ 362207340Sjkim 363207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0); 364207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 365207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2); 366207340Sjkim break; 367207340Sjkim 368207340Sjkim case 3: /* MaxType */ 369207340Sjkim 370207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0); 371207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 372207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3); 373207340Sjkim break; 374207340Sjkim 375207340Sjkim case 4: /* Memory Type */ 376207340Sjkim 377207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 1, 0); 378228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 379228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 1, 2); 380207340Sjkim break; 381207340Sjkim 382207340Sjkim case 5: /* Read/Write Type */ 383207340Sjkim 384207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 1); 385207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 386207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0); 387207340Sjkim break; 388207340Sjkim 389207340Sjkim case 6: /* Address Granularity */ 390207340Sjkim 391207340Sjkim Descriptor->Address32.Granularity = 392207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 393228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 394207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); 395207340Sjkim GranOp = InitializerOp; 396207340Sjkim break; 397207340Sjkim 398207340Sjkim case 7: /* Min Address */ 399207340Sjkim 400207340Sjkim Descriptor->Address32.Minimum = 401207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 402228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR, 403207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); 404207340Sjkim MinOp = InitializerOp; 405207340Sjkim break; 406207340Sjkim 407207340Sjkim case 8: /* Max Address */ 408207340Sjkim 409207340Sjkim Descriptor->Address32.Maximum = 410207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 411228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 412207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); 413207340Sjkim MaxOp = InitializerOp; 414207340Sjkim break; 415207340Sjkim 416207340Sjkim case 9: /* Translation Offset */ 417207340Sjkim 418207340Sjkim Descriptor->Address32.TranslationOffset = 419207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 420228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 421207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); 422207340Sjkim break; 423207340Sjkim 424207340Sjkim case 10: /* Address Length */ 425207340Sjkim 426207340Sjkim Descriptor->Address32.AddressLength = 427207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 428228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, 429207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); 430207340Sjkim LengthOp = InitializerOp; 431207340Sjkim break; 432207340Sjkim 433207340Sjkim case 11: /* ResSourceIndex [Optional Field - BYTE] */ 434207340Sjkim 435207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 436207340Sjkim { 437207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 438207340Sjkim OptionIndex++; 439207340Sjkim Descriptor->Address32.ResourceLength++; 440207340Sjkim ResSourceIndex = TRUE; 441207340Sjkim } 442207340Sjkim break; 443207340Sjkim 444207340Sjkim case 12: /* ResSource [Optional Field - STRING] */ 445207340Sjkim 446207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 447207340Sjkim (InitializerOp->Asl.Value.String)) 448207340Sjkim { 449207340Sjkim if (StringLength) 450207340Sjkim { 451207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 452207340Sjkim (Descriptor->Address32.ResourceLength + StringLength); 453207340Sjkim 454207340Sjkim strcpy ((char *) 455207340Sjkim &OptionalFields[OptionIndex], 456207340Sjkim InitializerOp->Asl.Value.String); 457207340Sjkim 458207340Sjkim /* ResourceSourceIndex must also be valid */ 459207340Sjkim 460207340Sjkim if (!ResSourceIndex) 461207340Sjkim { 462207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 463207340Sjkim InitializerOp, NULL); 464207340Sjkim } 465207340Sjkim } 466207340Sjkim } 467207340Sjkim 468207340Sjkim#if 0 469207340Sjkim /* 470207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 471207340Sjkim * be invalid 472207340Sjkim */ 473207340Sjkim else if (ResSourceIndex) 474207340Sjkim { 475207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 476207340Sjkim InitializerOp, NULL); 477207340Sjkim } 478207340Sjkim#endif 479207340Sjkim break; 480207340Sjkim 481207340Sjkim case 13: /* ResourceTag */ 482207340Sjkim 483207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 484207340Sjkim break; 485207340Sjkim 486207340Sjkim 487207340Sjkim case 14: /* Address Range */ 488207340Sjkim 489207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 3, 0); 490228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 491228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 3, 2); 492207340Sjkim break; 493207340Sjkim 494207340Sjkim case 15: /* Type */ 495207340Sjkim 496207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0); 497207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 498207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5); 499207340Sjkim break; 500207340Sjkim 501207340Sjkim default: 502207340Sjkim 503207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 504207340Sjkim break; 505207340Sjkim } 506207340Sjkim 507207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 508207340Sjkim } 509207340Sjkim 510207340Sjkim /* Validate the Min/Max/Len/Gran values */ 511207340Sjkim 512207340Sjkim RsLargeAddressCheck ( 513212761Sjkim (UINT64) Descriptor->Address32.Minimum, 514212761Sjkim (UINT64) Descriptor->Address32.Maximum, 515212761Sjkim (UINT64) Descriptor->Address32.AddressLength, 516212761Sjkim (UINT64) Descriptor->Address32.Granularity, 517207340Sjkim Descriptor->Address32.Flags, 518213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 519207340Sjkim 520207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + 521207340Sjkim OptionIndex + StringLength; 522207340Sjkim return (Rnode); 523207340Sjkim} 524207340Sjkim 525207340Sjkim 526207340Sjkim/******************************************************************************* 527207340Sjkim * 528207340Sjkim * FUNCTION: RsDoDwordSpaceDescriptor 529207340Sjkim * 530207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 531207340Sjkim * CurrentByteOffset - Offset into the resource template AML 532207340Sjkim * buffer (to track references to the desc) 533207340Sjkim * 534207340Sjkim * RETURN: Completed resource node 535207340Sjkim * 536207340Sjkim * DESCRIPTION: Construct a long "DwordSpace" descriptor 537207340Sjkim * 538207340Sjkim ******************************************************************************/ 539207340Sjkim 540207340SjkimASL_RESOURCE_NODE * 541207340SjkimRsDoDwordSpaceDescriptor ( 542207340Sjkim ACPI_PARSE_OBJECT *Op, 543207340Sjkim UINT32 CurrentByteOffset) 544207340Sjkim{ 545207340Sjkim AML_RESOURCE *Descriptor; 546207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 547207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 548207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 549207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 550207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 551207340Sjkim ASL_RESOURCE_NODE *Rnode; 552207340Sjkim UINT8 *OptionalFields; 553207340Sjkim UINT16 StringLength = 0; 554207340Sjkim UINT32 OptionIndex = 0; 555207340Sjkim UINT32 i; 556207340Sjkim BOOLEAN ResSourceIndex = FALSE; 557207340Sjkim 558207340Sjkim 559207340Sjkim InitializerOp = Op->Asl.Child; 560207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 561207340Sjkim 562207340Sjkim Rnode = RsAllocateResourceNode ( 563207340Sjkim sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength); 564207340Sjkim 565207340Sjkim Descriptor = Rnode->Buffer; 566207340Sjkim Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32; 567207340Sjkim 568207340Sjkim /* 569207340Sjkim * Initial descriptor length -- may be enlarged if there are 570207340Sjkim * optional fields present 571207340Sjkim */ 572207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); 573207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 574207340Sjkim (sizeof (AML_RESOURCE_ADDRESS32) - 575207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 576207340Sjkim 577207340Sjkim /* Process all child initialization nodes */ 578207340Sjkim 579207340Sjkim for (i = 0; InitializerOp; i++) 580207340Sjkim { 581207340Sjkim switch (i) 582207340Sjkim { 583207340Sjkim case 0: /* Resource Type */ 584207340Sjkim 585207340Sjkim Descriptor->Address32.ResourceType = 586207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 587207340Sjkim break; 588207340Sjkim 589207340Sjkim case 1: /* Resource Usage */ 590207340Sjkim 591207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1); 592207340Sjkim break; 593207340Sjkim 594207340Sjkim case 2: /* DecodeType */ 595207340Sjkim 596207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0); 597207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 598207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1); 599207340Sjkim break; 600207340Sjkim 601207340Sjkim case 3: /* MinType */ 602207340Sjkim 603207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0); 604207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 605207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2); 606207340Sjkim break; 607207340Sjkim 608207340Sjkim case 4: /* MaxType */ 609207340Sjkim 610207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0); 611207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 612207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3); 613207340Sjkim break; 614207340Sjkim 615207340Sjkim case 5: /* Type-Specific flags */ 616207340Sjkim 617207340Sjkim Descriptor->Address32.SpecificFlags = 618207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 619207340Sjkim break; 620207340Sjkim 621207340Sjkim case 6: /* Address Granularity */ 622207340Sjkim 623207340Sjkim Descriptor->Address32.Granularity = 624207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 625228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 626207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); 627207340Sjkim GranOp = InitializerOp; 628207340Sjkim break; 629207340Sjkim 630207340Sjkim case 7: /* Min Address */ 631207340Sjkim 632207340Sjkim Descriptor->Address32.Minimum = 633207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 634228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR, 635207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); 636207340Sjkim MinOp = InitializerOp; 637207340Sjkim break; 638207340Sjkim 639207340Sjkim case 8: /* Max Address */ 640207340Sjkim 641207340Sjkim Descriptor->Address32.Maximum = 642207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 643228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 644207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); 645207340Sjkim MaxOp = InitializerOp; 646207340Sjkim break; 647207340Sjkim 648207340Sjkim case 9: /* Translation Offset */ 649207340Sjkim 650207340Sjkim Descriptor->Address32.TranslationOffset = 651207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 652228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 653207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); 654207340Sjkim break; 655207340Sjkim 656207340Sjkim case 10: /* Address Length */ 657207340Sjkim 658207340Sjkim Descriptor->Address32.AddressLength = 659207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 660228110Sjkim RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH, 661207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); 662207340Sjkim LengthOp = InitializerOp; 663207340Sjkim break; 664207340Sjkim 665207340Sjkim case 11: /* ResSourceIndex [Optional Field - BYTE] */ 666207340Sjkim 667207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 668207340Sjkim { 669207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 670207340Sjkim OptionIndex++; 671207340Sjkim Descriptor->Address32.ResourceLength++; 672207340Sjkim ResSourceIndex = TRUE; 673207340Sjkim } 674207340Sjkim break; 675207340Sjkim 676207340Sjkim case 12: /* ResSource [Optional Field - STRING] */ 677207340Sjkim 678207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 679207340Sjkim (InitializerOp->Asl.Value.String)) 680207340Sjkim { 681207340Sjkim if (StringLength) 682207340Sjkim { 683207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 684207340Sjkim (Descriptor->Address32.ResourceLength + StringLength); 685207340Sjkim 686207340Sjkim strcpy ((char *) 687207340Sjkim &OptionalFields[OptionIndex], 688207340Sjkim InitializerOp->Asl.Value.String); 689207340Sjkim 690207340Sjkim /* ResourceSourceIndex must also be valid */ 691207340Sjkim 692207340Sjkim if (!ResSourceIndex) 693207340Sjkim { 694207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 695207340Sjkim InitializerOp, NULL); 696207340Sjkim } 697207340Sjkim } 698207340Sjkim } 699207340Sjkim 700207340Sjkim#if 0 701207340Sjkim /* 702207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 703207340Sjkim * be invalid 704207340Sjkim */ 705207340Sjkim else if (ResSourceIndex) 706207340Sjkim { 707207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 708207340Sjkim InitializerOp, NULL); 709207340Sjkim } 710207340Sjkim#endif 711207340Sjkim break; 712207340Sjkim 713207340Sjkim case 13: /* ResourceTag */ 714207340Sjkim 715207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 716207340Sjkim break; 717207340Sjkim 718207340Sjkim default: 719207340Sjkim 720207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, 721207340Sjkim InitializerOp, NULL); 722207340Sjkim break; 723207340Sjkim } 724207340Sjkim 725207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 726207340Sjkim } 727207340Sjkim 728207340Sjkim /* Validate the Min/Max/Len/Gran values */ 729207340Sjkim 730207340Sjkim RsLargeAddressCheck ( 731212761Sjkim (UINT64) Descriptor->Address32.Minimum, 732212761Sjkim (UINT64) Descriptor->Address32.Maximum, 733212761Sjkim (UINT64) Descriptor->Address32.AddressLength, 734212761Sjkim (UINT64) Descriptor->Address32.Granularity, 735207340Sjkim Descriptor->Address32.Flags, 736213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 737207340Sjkim 738207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + 739207340Sjkim OptionIndex + StringLength; 740207340Sjkim return (Rnode); 741207340Sjkim} 742