aslrestype2d.c revision 217365
1207340Sjkim 2207340Sjkim/****************************************************************************** 3207340Sjkim * 4207340Sjkim * Module Name: aslrestype2d - Large DWord address resource descriptors 5207340Sjkim * 6207340Sjkim *****************************************************************************/ 7207340Sjkim 8217365Sjkim/* 9217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 10207340Sjkim * All rights reserved. 11207340Sjkim * 12217365Sjkim * Redistribution and use in source and binary forms, with or without 13217365Sjkim * modification, are permitted provided that the following conditions 14217365Sjkim * are met: 15217365Sjkim * 1. Redistributions of source code must retain the above copyright 16217365Sjkim * notice, this list of conditions, and the following disclaimer, 17217365Sjkim * without modification. 18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 20217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 21217365Sjkim * including a substantially similar Disclaimer requirement for further 22217365Sjkim * binary redistribution. 23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 24217365Sjkim * of any contributors may be used to endorse or promote products derived 25217365Sjkim * from this software without specific prior written permission. 26207340Sjkim * 27217365Sjkim * Alternatively, this software may be distributed under the terms of the 28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 29217365Sjkim * Software Foundation. 30207340Sjkim * 31217365Sjkim * NO WARRANTY 32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 43217365Sjkim */ 44207340Sjkim 45207340Sjkim 46207344Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 47207340Sjkim#include "aslcompiler.y.h" 48207340Sjkim 49207340Sjkim#define _COMPONENT ACPI_COMPILER 50207340Sjkim ACPI_MODULE_NAME ("aslrestype2d") 51207340Sjkim 52207340Sjkim/* 53207340Sjkim * This module contains the Dword (32-bit) address space descriptors: 54207340Sjkim * 55207340Sjkim * DwordIO 56207340Sjkim * DwordMemory 57207340Sjkim * DwordSpace 58207340Sjkim */ 59207340Sjkim 60207340Sjkim/******************************************************************************* 61207340Sjkim * 62207340Sjkim * FUNCTION: RsDoDwordIoDescriptor 63207340Sjkim * 64207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 65207340Sjkim * CurrentByteOffset - Offset into the resource template AML 66207340Sjkim * buffer (to track references to the desc) 67207340Sjkim * 68207340Sjkim * RETURN: Completed resource node 69207340Sjkim * 70207340Sjkim * DESCRIPTION: Construct a long "DwordIO" descriptor 71207340Sjkim * 72207340Sjkim ******************************************************************************/ 73207340Sjkim 74207340SjkimASL_RESOURCE_NODE * 75207340SjkimRsDoDwordIoDescriptor ( 76207340Sjkim ACPI_PARSE_OBJECT *Op, 77207340Sjkim UINT32 CurrentByteOffset) 78207340Sjkim{ 79207340Sjkim AML_RESOURCE *Descriptor; 80207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 81207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 82207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 83207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 84207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 85207340Sjkim ASL_RESOURCE_NODE *Rnode; 86207340Sjkim UINT16 StringLength = 0; 87207340Sjkim UINT32 OptionIndex = 0; 88207340Sjkim UINT8 *OptionalFields; 89207340Sjkim UINT32 i; 90207340Sjkim BOOLEAN ResSourceIndex = FALSE; 91207340Sjkim 92207340Sjkim 93207340Sjkim InitializerOp = Op->Asl.Child; 94207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 95207340Sjkim 96207340Sjkim Rnode = RsAllocateResourceNode ( 97207340Sjkim sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength); 98207340Sjkim 99207340Sjkim Descriptor = Rnode->Buffer; 100207340Sjkim Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32; 101207340Sjkim Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; 102207340Sjkim 103207340Sjkim /* 104207340Sjkim * Initial descriptor length -- may be enlarged if there are 105207340Sjkim * optional fields present 106207340Sjkim */ 107207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); 108207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 109207340Sjkim (sizeof (AML_RESOURCE_ADDRESS32) - 110207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 111207340Sjkim 112207340Sjkim /* Process all child initialization nodes */ 113207340Sjkim 114207340Sjkim for (i = 0; InitializerOp; i++) 115207340Sjkim { 116207340Sjkim switch (i) 117207340Sjkim { 118207340Sjkim case 0: /* Resource Usage */ 119207340Sjkim 120207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1); 121207340Sjkim break; 122207340Sjkim 123207340Sjkim case 1: /* MinType */ 124207340Sjkim 125207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0); 126207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 127207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2); 128207340Sjkim break; 129207340Sjkim 130207340Sjkim case 2: /* MaxType */ 131207340Sjkim 132207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0); 133207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 134207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3); 135207340Sjkim break; 136207340Sjkim 137207340Sjkim case 3: /* DecodeType */ 138207340Sjkim 139207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0); 140207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 141207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1); 142207340Sjkim break; 143207340Sjkim 144207340Sjkim case 4: /* Range Type */ 145207340Sjkim 146207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 3); 147207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 148207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0); 149207340Sjkim break; 150207340Sjkim 151207340Sjkim case 5: /* Address Granularity */ 152207340Sjkim 153207340Sjkim Descriptor->Address32.Granularity = 154207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 155207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, 156207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); 157207340Sjkim GranOp = InitializerOp; 158207340Sjkim break; 159207340Sjkim 160207340Sjkim case 6: /* Address Min */ 161207340Sjkim 162207340Sjkim Descriptor->Address32.Minimum = 163207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 164207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 165207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); 166207340Sjkim MinOp = InitializerOp; 167207340Sjkim break; 168207340Sjkim 169207340Sjkim case 7: /* Address Max */ 170207340Sjkim 171207340Sjkim Descriptor->Address32.Maximum = 172207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 173207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 174207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); 175207340Sjkim MaxOp = InitializerOp; 176207340Sjkim break; 177207340Sjkim 178207340Sjkim case 8: /* Translation Offset */ 179207340Sjkim 180207340Sjkim Descriptor->Address32.TranslationOffset = 181207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 182207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 183207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); 184207340Sjkim break; 185207340Sjkim 186207340Sjkim case 9: /* Address Length */ 187207340Sjkim 188207340Sjkim Descriptor->Address32.AddressLength = 189207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 190207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 191207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); 192207340Sjkim LengthOp = InitializerOp; 193207340Sjkim break; 194207340Sjkim 195207340Sjkim case 10: /* ResSourceIndex [Optional Field - BYTE] */ 196207340Sjkim 197207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 198207340Sjkim { 199207340Sjkim /* Found a valid ResourceSourceIndex */ 200207340Sjkim 201207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 202207340Sjkim OptionIndex++; 203207340Sjkim Descriptor->Address32.ResourceLength++; 204207340Sjkim ResSourceIndex = TRUE; 205207340Sjkim } 206207340Sjkim break; 207207340Sjkim 208207340Sjkim case 11: /* ResSource [Optional Field - STRING] */ 209207340Sjkim 210207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 211207340Sjkim (InitializerOp->Asl.Value.String)) 212207340Sjkim { 213207340Sjkim if (StringLength) 214207340Sjkim { 215207340Sjkim /* Found a valid ResourceSource */ 216207340Sjkim 217207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 218207340Sjkim (Descriptor->Address32.ResourceLength + StringLength); 219207340Sjkim 220207340Sjkim strcpy ((char *) 221207340Sjkim &OptionalFields[OptionIndex], 222207340Sjkim InitializerOp->Asl.Value.String); 223207340Sjkim 224207340Sjkim /* ResourceSourceIndex must also be valid */ 225207340Sjkim 226207340Sjkim if (!ResSourceIndex) 227207340Sjkim { 228207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 229207340Sjkim InitializerOp, NULL); 230207340Sjkim } 231207340Sjkim } 232207340Sjkim } 233207340Sjkim 234207340Sjkim#if 0 235207340Sjkim /* 236207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 237207340Sjkim * be invalid 238207340Sjkim */ 239207340Sjkim else if (ResSourceIndex) 240207340Sjkim { 241207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 242207340Sjkim InitializerOp, NULL); 243207340Sjkim } 244207340Sjkim#endif 245207340Sjkim break; 246207340Sjkim 247207340Sjkim case 12: /* ResourceTag */ 248207340Sjkim 249207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 250207340Sjkim break; 251207340Sjkim 252207340Sjkim case 13: /* Type */ 253207340Sjkim 254207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 4, 0); 255207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 256207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 4); 257207340Sjkim break; 258207340Sjkim 259207340Sjkim case 14: /* Translation Type */ 260207340Sjkim 261207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0); 262207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 263207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5); 264207340Sjkim break; 265207340Sjkim 266207340Sjkim default: 267207340Sjkim 268207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 269207340Sjkim break; 270207340Sjkim } 271207340Sjkim 272207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 273207340Sjkim } 274207340Sjkim 275207340Sjkim /* Validate the Min/Max/Len/Gran values */ 276207340Sjkim 277207340Sjkim RsLargeAddressCheck ( 278212761Sjkim (UINT64) Descriptor->Address32.Minimum, 279212761Sjkim (UINT64) Descriptor->Address32.Maximum, 280212761Sjkim (UINT64) Descriptor->Address32.AddressLength, 281212761Sjkim (UINT64) Descriptor->Address32.Granularity, 282207340Sjkim Descriptor->Address32.Flags, 283213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 284207340Sjkim 285207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + 286207340Sjkim OptionIndex + StringLength; 287207340Sjkim return (Rnode); 288207340Sjkim} 289207340Sjkim 290207340Sjkim 291207340Sjkim/******************************************************************************* 292207340Sjkim * 293207340Sjkim * FUNCTION: RsDoDwordMemoryDescriptor 294207340Sjkim * 295207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 296207340Sjkim * CurrentByteOffset - Offset into the resource template AML 297207340Sjkim * buffer (to track references to the desc) 298207340Sjkim * 299207340Sjkim * RETURN: Completed resource node 300207340Sjkim * 301207340Sjkim * DESCRIPTION: Construct a long "DwordMemory" descriptor 302207340Sjkim * 303207340Sjkim ******************************************************************************/ 304207340Sjkim 305207340SjkimASL_RESOURCE_NODE * 306207340SjkimRsDoDwordMemoryDescriptor ( 307207340Sjkim ACPI_PARSE_OBJECT *Op, 308207340Sjkim UINT32 CurrentByteOffset) 309207340Sjkim{ 310207340Sjkim AML_RESOURCE *Descriptor; 311207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 312207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 313207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 314207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 315207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 316207340Sjkim ASL_RESOURCE_NODE *Rnode; 317207340Sjkim UINT8 *OptionalFields; 318207340Sjkim UINT16 StringLength = 0; 319207340Sjkim UINT32 OptionIndex = 0; 320207340Sjkim UINT32 i; 321207340Sjkim BOOLEAN ResSourceIndex = FALSE; 322207340Sjkim 323207340Sjkim 324207340Sjkim InitializerOp = Op->Asl.Child; 325207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 326207340Sjkim 327207340Sjkim Rnode = RsAllocateResourceNode ( 328207340Sjkim sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength); 329207340Sjkim 330207340Sjkim Descriptor = Rnode->Buffer; 331207340Sjkim Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32; 332207340Sjkim Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 333207340Sjkim 334207340Sjkim /* 335207340Sjkim * Initial descriptor length -- may be enlarged if there are 336207340Sjkim * optional fields present 337207340Sjkim */ 338207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); 339207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 340207340Sjkim (sizeof (AML_RESOURCE_ADDRESS32) - 341207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 342207340Sjkim 343207340Sjkim 344207340Sjkim /* Process all child initialization nodes */ 345207340Sjkim 346207340Sjkim for (i = 0; InitializerOp; i++) 347207340Sjkim { 348207340Sjkim switch (i) 349207340Sjkim { 350207340Sjkim case 0: /* Resource Usage */ 351207340Sjkim 352207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1); 353207340Sjkim break; 354207340Sjkim 355207340Sjkim case 1: /* DecodeType */ 356207340Sjkim 357207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0); 358207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 359207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1); 360207340Sjkim break; 361207340Sjkim 362207340Sjkim case 2: /* MinType */ 363207340Sjkim 364207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0); 365207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 366207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2); 367207340Sjkim break; 368207340Sjkim 369207340Sjkim case 3: /* MaxType */ 370207340Sjkim 371207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0); 372207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 373207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3); 374207340Sjkim break; 375207340Sjkim 376207340Sjkim case 4: /* Memory Type */ 377207340Sjkim 378207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 1, 0); 379207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 380207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 1); 381207340Sjkim break; 382207340Sjkim 383207340Sjkim case 5: /* Read/Write Type */ 384207340Sjkim 385207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 1); 386207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 387207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0); 388207340Sjkim break; 389207340Sjkim 390207340Sjkim case 6: /* Address Granularity */ 391207340Sjkim 392207340Sjkim Descriptor->Address32.Granularity = 393207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 394207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, 395207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); 396207340Sjkim GranOp = InitializerOp; 397207340Sjkim break; 398207340Sjkim 399207340Sjkim case 7: /* Min Address */ 400207340Sjkim 401207340Sjkim Descriptor->Address32.Minimum = 402207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 403207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 404207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); 405207340Sjkim MinOp = InitializerOp; 406207340Sjkim break; 407207340Sjkim 408207340Sjkim case 8: /* Max Address */ 409207340Sjkim 410207340Sjkim Descriptor->Address32.Maximum = 411207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 412207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 413207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); 414207340Sjkim MaxOp = InitializerOp; 415207340Sjkim break; 416207340Sjkim 417207340Sjkim case 9: /* Translation Offset */ 418207340Sjkim 419207340Sjkim Descriptor->Address32.TranslationOffset = 420207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 421207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 422207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); 423207340Sjkim break; 424207340Sjkim 425207340Sjkim case 10: /* Address Length */ 426207340Sjkim 427207340Sjkim Descriptor->Address32.AddressLength = 428207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 429207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 430207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); 431207340Sjkim LengthOp = InitializerOp; 432207340Sjkim break; 433207340Sjkim 434207340Sjkim case 11: /* ResSourceIndex [Optional Field - BYTE] */ 435207340Sjkim 436207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 437207340Sjkim { 438207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 439207340Sjkim OptionIndex++; 440207340Sjkim Descriptor->Address32.ResourceLength++; 441207340Sjkim ResSourceIndex = TRUE; 442207340Sjkim } 443207340Sjkim break; 444207340Sjkim 445207340Sjkim case 12: /* ResSource [Optional Field - STRING] */ 446207340Sjkim 447207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 448207340Sjkim (InitializerOp->Asl.Value.String)) 449207340Sjkim { 450207340Sjkim if (StringLength) 451207340Sjkim { 452207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 453207340Sjkim (Descriptor->Address32.ResourceLength + StringLength); 454207340Sjkim 455207340Sjkim strcpy ((char *) 456207340Sjkim &OptionalFields[OptionIndex], 457207340Sjkim InitializerOp->Asl.Value.String); 458207340Sjkim 459207340Sjkim /* ResourceSourceIndex must also be valid */ 460207340Sjkim 461207340Sjkim if (!ResSourceIndex) 462207340Sjkim { 463207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 464207340Sjkim InitializerOp, NULL); 465207340Sjkim } 466207340Sjkim } 467207340Sjkim } 468207340Sjkim 469207340Sjkim#if 0 470207340Sjkim /* 471207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 472207340Sjkim * be invalid 473207340Sjkim */ 474207340Sjkim else if (ResSourceIndex) 475207340Sjkim { 476207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 477207340Sjkim InitializerOp, NULL); 478207340Sjkim } 479207340Sjkim#endif 480207340Sjkim break; 481207340Sjkim 482207340Sjkim case 13: /* ResourceTag */ 483207340Sjkim 484207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 485207340Sjkim break; 486207340Sjkim 487207340Sjkim 488207340Sjkim case 14: /* Address Range */ 489207340Sjkim 490207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 3, 0); 491207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 492207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 3); 493207340Sjkim break; 494207340Sjkim 495207340Sjkim case 15: /* Type */ 496207340Sjkim 497207340Sjkim RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0); 498207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 499207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5); 500207340Sjkim break; 501207340Sjkim 502207340Sjkim default: 503207340Sjkim 504207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 505207340Sjkim break; 506207340Sjkim } 507207340Sjkim 508207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 509207340Sjkim } 510207340Sjkim 511207340Sjkim /* Validate the Min/Max/Len/Gran values */ 512207340Sjkim 513207340Sjkim RsLargeAddressCheck ( 514212761Sjkim (UINT64) Descriptor->Address32.Minimum, 515212761Sjkim (UINT64) Descriptor->Address32.Maximum, 516212761Sjkim (UINT64) Descriptor->Address32.AddressLength, 517212761Sjkim (UINT64) Descriptor->Address32.Granularity, 518207340Sjkim Descriptor->Address32.Flags, 519213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 520207340Sjkim 521207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + 522207340Sjkim OptionIndex + StringLength; 523207340Sjkim return (Rnode); 524207340Sjkim} 525207340Sjkim 526207340Sjkim 527207340Sjkim/******************************************************************************* 528207340Sjkim * 529207340Sjkim * FUNCTION: RsDoDwordSpaceDescriptor 530207340Sjkim * 531207340Sjkim * PARAMETERS: Op - Parent resource descriptor parse node 532207340Sjkim * CurrentByteOffset - Offset into the resource template AML 533207340Sjkim * buffer (to track references to the desc) 534207340Sjkim * 535207340Sjkim * RETURN: Completed resource node 536207340Sjkim * 537207340Sjkim * DESCRIPTION: Construct a long "DwordSpace" descriptor 538207340Sjkim * 539207340Sjkim ******************************************************************************/ 540207340Sjkim 541207340SjkimASL_RESOURCE_NODE * 542207340SjkimRsDoDwordSpaceDescriptor ( 543207340Sjkim ACPI_PARSE_OBJECT *Op, 544207340Sjkim UINT32 CurrentByteOffset) 545207340Sjkim{ 546207340Sjkim AML_RESOURCE *Descriptor; 547207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 548207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 549207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 550207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 551207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 552207340Sjkim ASL_RESOURCE_NODE *Rnode; 553207340Sjkim UINT8 *OptionalFields; 554207340Sjkim UINT16 StringLength = 0; 555207340Sjkim UINT32 OptionIndex = 0; 556207340Sjkim UINT32 i; 557207340Sjkim BOOLEAN ResSourceIndex = FALSE; 558207340Sjkim 559207340Sjkim 560207340Sjkim InitializerOp = Op->Asl.Child; 561207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 562207340Sjkim 563207340Sjkim Rnode = RsAllocateResourceNode ( 564207340Sjkim sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength); 565207340Sjkim 566207340Sjkim Descriptor = Rnode->Buffer; 567207340Sjkim Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32; 568207340Sjkim 569207340Sjkim /* 570207340Sjkim * Initial descriptor length -- may be enlarged if there are 571207340Sjkim * optional fields present 572207340Sjkim */ 573207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); 574207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 575207340Sjkim (sizeof (AML_RESOURCE_ADDRESS32) - 576207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 577207340Sjkim 578207340Sjkim /* Process all child initialization nodes */ 579207340Sjkim 580207340Sjkim for (i = 0; InitializerOp; i++) 581207340Sjkim { 582207340Sjkim switch (i) 583207340Sjkim { 584207340Sjkim case 0: /* Resource Type */ 585207340Sjkim 586207340Sjkim Descriptor->Address32.ResourceType = 587207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 588207340Sjkim break; 589207340Sjkim 590207340Sjkim case 1: /* Resource Usage */ 591207340Sjkim 592207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1); 593207340Sjkim break; 594207340Sjkim 595207340Sjkim case 2: /* DecodeType */ 596207340Sjkim 597207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0); 598207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 599207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1); 600207340Sjkim break; 601207340Sjkim 602207340Sjkim case 3: /* MinType */ 603207340Sjkim 604207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0); 605207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 606207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2); 607207340Sjkim break; 608207340Sjkim 609207340Sjkim case 4: /* MaxType */ 610207340Sjkim 611207340Sjkim RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0); 612207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 613207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3); 614207340Sjkim break; 615207340Sjkim 616207340Sjkim case 5: /* Type-Specific flags */ 617207340Sjkim 618207340Sjkim Descriptor->Address32.SpecificFlags = 619207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 620207340Sjkim break; 621207340Sjkim 622207340Sjkim case 6: /* Address Granularity */ 623207340Sjkim 624207340Sjkim Descriptor->Address32.Granularity = 625207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 626207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY, 627207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity)); 628207340Sjkim GranOp = InitializerOp; 629207340Sjkim break; 630207340Sjkim 631207340Sjkim case 7: /* Min Address */ 632207340Sjkim 633207340Sjkim Descriptor->Address32.Minimum = 634207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 635207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR, 636207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum)); 637207340Sjkim MinOp = InitializerOp; 638207340Sjkim break; 639207340Sjkim 640207340Sjkim case 8: /* Max Address */ 641207340Sjkim 642207340Sjkim Descriptor->Address32.Maximum = 643207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 644207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR, 645207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum)); 646207340Sjkim MaxOp = InitializerOp; 647207340Sjkim break; 648207340Sjkim 649207340Sjkim case 9: /* Translation Offset */ 650207340Sjkim 651207340Sjkim Descriptor->Address32.TranslationOffset = 652207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 653207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 654207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset)); 655207340Sjkim break; 656207340Sjkim 657207340Sjkim case 10: /* Address Length */ 658207340Sjkim 659207340Sjkim Descriptor->Address32.AddressLength = 660207340Sjkim (UINT32) InitializerOp->Asl.Value.Integer; 661207340Sjkim RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH, 662207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength)); 663207340Sjkim LengthOp = InitializerOp; 664207340Sjkim break; 665207340Sjkim 666207340Sjkim case 11: /* ResSourceIndex [Optional Field - BYTE] */ 667207340Sjkim 668207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 669207340Sjkim { 670207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 671207340Sjkim OptionIndex++; 672207340Sjkim Descriptor->Address32.ResourceLength++; 673207340Sjkim ResSourceIndex = TRUE; 674207340Sjkim } 675207340Sjkim break; 676207340Sjkim 677207340Sjkim case 12: /* ResSource [Optional Field - STRING] */ 678207340Sjkim 679207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 680207340Sjkim (InitializerOp->Asl.Value.String)) 681207340Sjkim { 682207340Sjkim if (StringLength) 683207340Sjkim { 684207340Sjkim Descriptor->Address32.ResourceLength = (UINT16) 685207340Sjkim (Descriptor->Address32.ResourceLength + StringLength); 686207340Sjkim 687207340Sjkim strcpy ((char *) 688207340Sjkim &OptionalFields[OptionIndex], 689207340Sjkim InitializerOp->Asl.Value.String); 690207340Sjkim 691207340Sjkim /* ResourceSourceIndex must also be valid */ 692207340Sjkim 693207340Sjkim if (!ResSourceIndex) 694207340Sjkim { 695207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 696207340Sjkim InitializerOp, NULL); 697207340Sjkim } 698207340Sjkim } 699207340Sjkim } 700207340Sjkim 701207340Sjkim#if 0 702207340Sjkim /* 703207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 704207340Sjkim * be invalid 705207340Sjkim */ 706207340Sjkim else if (ResSourceIndex) 707207340Sjkim { 708207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 709207340Sjkim InitializerOp, NULL); 710207340Sjkim } 711207340Sjkim#endif 712207340Sjkim break; 713207340Sjkim 714207340Sjkim case 13: /* ResourceTag */ 715207340Sjkim 716207340Sjkim UtAttachNamepathToOwner (Op, InitializerOp); 717207340Sjkim break; 718207340Sjkim 719207340Sjkim default: 720207340Sjkim 721207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, 722207340Sjkim InitializerOp, NULL); 723207340Sjkim break; 724207340Sjkim } 725207340Sjkim 726207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 727207340Sjkim } 728207340Sjkim 729207340Sjkim /* Validate the Min/Max/Len/Gran values */ 730207340Sjkim 731207340Sjkim RsLargeAddressCheck ( 732212761Sjkim (UINT64) Descriptor->Address32.Minimum, 733212761Sjkim (UINT64) Descriptor->Address32.Maximum, 734212761Sjkim (UINT64) Descriptor->Address32.AddressLength, 735212761Sjkim (UINT64) Descriptor->Address32.Granularity, 736207340Sjkim Descriptor->Address32.Flags, 737213806Sjkim MinOp, MaxOp, LengthOp, GranOp, Op); 738207340Sjkim 739207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + 740207340Sjkim OptionIndex + StringLength; 741207340Sjkim return (Rnode); 742207340Sjkim} 743