1207340Sjkim/****************************************************************************** 2207340Sjkim * 3207340Sjkim * Module Name: aslrestype2w - Large Word address resource descriptors 4207340Sjkim * 5207340Sjkim *****************************************************************************/ 6207340Sjkim 7217365Sjkim/* 8281075Sdim * Copyright (C) 2000 - 2015, 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 ("aslrestype2w") 49207340Sjkim 50207340Sjkim/* 51207340Sjkim * This module contains the Word (16-bit) address space descriptors: 52207340Sjkim * 53207340Sjkim * WordIO 54207340Sjkim * WordMemory 55207340Sjkim * WordSpace 56207340Sjkim */ 57207340Sjkim 58207340Sjkim/******************************************************************************* 59207340Sjkim * 60207340Sjkim * FUNCTION: RsDoWordIoDescriptor 61207340Sjkim * 62281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 63207340Sjkim * 64207340Sjkim * RETURN: Completed resource node 65207340Sjkim * 66207340Sjkim * DESCRIPTION: Construct a long "WordIO" descriptor 67207340Sjkim * 68207340Sjkim ******************************************************************************/ 69207340Sjkim 70207340SjkimASL_RESOURCE_NODE * 71207340SjkimRsDoWordIoDescriptor ( 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 ( 94207340Sjkim sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength); 95207340Sjkim 96207340Sjkim Descriptor = Rnode->Buffer; 97207340Sjkim Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16; 98207340Sjkim Descriptor->Address16.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_ADDRESS16); 105207340Sjkim Descriptor->Address16.ResourceLength = (UINT16) 106207340Sjkim (sizeof (AML_RESOURCE_ADDRESS16) - 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->Address16.Flags, InitializerOp, 0, 1); 118207340Sjkim break; 119207340Sjkim 120207340Sjkim case 1: /* MinType */ 121207340Sjkim 122207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0); 123207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 124207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2); 125207340Sjkim break; 126207340Sjkim 127207340Sjkim case 2: /* MaxType */ 128207340Sjkim 129207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0); 130207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 131207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3); 132207340Sjkim break; 133207340Sjkim 134207340Sjkim case 3: /* DecodeType */ 135207340Sjkim 136207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0); 137207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 138207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1); 139207340Sjkim break; 140207340Sjkim 141207340Sjkim case 4: /* Range Type */ 142207340Sjkim 143207340Sjkim RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 0, 3); 144228110Sjkim RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 145228110Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 0, 2); 146207340Sjkim break; 147207340Sjkim 148207340Sjkim case 5: /* Address Granularity */ 149207340Sjkim 150207340Sjkim Descriptor->Address16.Granularity = (UINT16) InitializerOp->Asl.Value.Integer; 151228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 152207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); 153207340Sjkim GranOp = InitializerOp; 154207340Sjkim break; 155207340Sjkim 156207340Sjkim case 6: /* Address Min */ 157207340Sjkim 158207340Sjkim Descriptor->Address16.Minimum = (UINT16) InitializerOp->Asl.Value.Integer; 159228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, 160207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); 161207340Sjkim MinOp = InitializerOp; 162207340Sjkim break; 163207340Sjkim 164207340Sjkim case 7: /* Address Max */ 165207340Sjkim 166207340Sjkim Descriptor->Address16.Maximum = (UINT16) InitializerOp->Asl.Value.Integer; 167228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, 168207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); 169207340Sjkim MaxOp = InitializerOp; 170207340Sjkim break; 171207340Sjkim 172207340Sjkim case 8: /* Translation Offset */ 173207340Sjkim 174207340Sjkim Descriptor->Address16.TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer; 175228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 176207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); 177207340Sjkim break; 178207340Sjkim 179207340Sjkim case 9: /* Address Length */ 180207340Sjkim 181207340Sjkim Descriptor->Address16.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer; 182228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH, 183207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.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->Address16.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->Address16.ResourceLength = (UINT16) 206207340Sjkim (Descriptor->Address16.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->Address16.SpecificFlags, InitializerOp, 4, 0); 243207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 244207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 4); 245207340Sjkim break; 246207340Sjkim 247207340Sjkim case 14: /* Translation Type */ 248207340Sjkim 249207340Sjkim RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 5, 0); 250207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 251207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.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 ( 266212761Sjkim (UINT64) Descriptor->Address16.Minimum, 267212761Sjkim (UINT64) Descriptor->Address16.Maximum, 268212761Sjkim (UINT64) Descriptor->Address16.AddressLength, 269212761Sjkim (UINT64) Descriptor->Address16.Granularity, 270207340Sjkim Descriptor->Address16.Flags, 271281075Sdim MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 272207340Sjkim 273207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + 274281075Sdim OptionIndex + StringLength; 275207340Sjkim return (Rnode); 276207340Sjkim} 277207340Sjkim 278207340Sjkim 279207340Sjkim/******************************************************************************* 280207340Sjkim * 281207340Sjkim * FUNCTION: RsDoWordBusNumberDescriptor 282207340Sjkim * 283281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 284207340Sjkim * 285207340Sjkim * RETURN: Completed resource node 286207340Sjkim * 287207340Sjkim * DESCRIPTION: Construct a long "WordBusNumber" descriptor 288207340Sjkim * 289207340Sjkim ******************************************************************************/ 290207340Sjkim 291207340SjkimASL_RESOURCE_NODE * 292207340SjkimRsDoWordBusNumberDescriptor ( 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 ( 315207340Sjkim sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength); 316207340Sjkim 317207340Sjkim Descriptor = Rnode->Buffer; 318207340Sjkim Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16; 319207340Sjkim Descriptor->Address16.ResourceType = ACPI_ADDRESS_TYPE_BUS_NUMBER_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_ADDRESS16); 326207340Sjkim Descriptor->Address16.ResourceLength = (UINT16) 327207340Sjkim (sizeof (AML_RESOURCE_ADDRESS16) - 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->Address16.Flags, InitializerOp, 0, 1); 339207340Sjkim break; 340207340Sjkim 341207340Sjkim case 1: /* MinType */ 342207340Sjkim 343207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0); 344207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 345207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2); 346207340Sjkim break; 347207340Sjkim 348207340Sjkim case 2: /* MaxType */ 349207340Sjkim 350207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0); 351207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 352207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3); 353207340Sjkim break; 354207340Sjkim 355207340Sjkim case 3: /* DecodeType */ 356207340Sjkim 357207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0); 358207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 359207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1); 360207340Sjkim break; 361207340Sjkim 362207340Sjkim case 4: /* Address Granularity */ 363207340Sjkim 364207340Sjkim Descriptor->Address16.Granularity = 365207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 366228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 367207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); 368207340Sjkim GranOp = InitializerOp; 369207340Sjkim break; 370207340Sjkim 371207340Sjkim case 5: /* Min Address */ 372207340Sjkim 373207340Sjkim Descriptor->Address16.Minimum = 374207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 375228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, 376207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); 377207340Sjkim MinOp = InitializerOp; 378207340Sjkim break; 379207340Sjkim 380207340Sjkim case 6: /* Max Address */ 381207340Sjkim 382207340Sjkim Descriptor->Address16.Maximum = 383207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 384228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, 385207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); 386207340Sjkim MaxOp = InitializerOp; 387207340Sjkim break; 388207340Sjkim 389207340Sjkim case 7: /* Translation Offset */ 390207340Sjkim 391207340Sjkim Descriptor->Address16.TranslationOffset = 392207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 393228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 394207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); 395207340Sjkim break; 396207340Sjkim 397207340Sjkim case 8: /* Address Length */ 398207340Sjkim 399207340Sjkim Descriptor->Address16.AddressLength = 400207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 401228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH, 402207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength)); 403207340Sjkim LengthOp = InitializerOp; 404207340Sjkim break; 405207340Sjkim 406207340Sjkim case 9: /* ResSourceIndex [Optional Field - BYTE] */ 407207340Sjkim 408207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 409207340Sjkim { 410207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 411207340Sjkim OptionIndex++; 412207340Sjkim Descriptor->Address16.ResourceLength++; 413207340Sjkim ResSourceIndex = TRUE; 414207340Sjkim } 415207340Sjkim break; 416207340Sjkim 417207340Sjkim case 10: /* ResSource [Optional Field - STRING] */ 418207340Sjkim 419207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 420207340Sjkim (InitializerOp->Asl.Value.String)) 421207340Sjkim { 422207340Sjkim if (StringLength) 423207340Sjkim { 424207340Sjkim Descriptor->Address16.ResourceLength = (UINT16) 425207340Sjkim (Descriptor->Address16.ResourceLength + StringLength); 426207340Sjkim 427207340Sjkim strcpy ((char *) 428207340Sjkim &OptionalFields[OptionIndex], 429207340Sjkim InitializerOp->Asl.Value.String); 430207340Sjkim 431207340Sjkim /* ResourceSourceIndex must also be valid */ 432207340Sjkim 433207340Sjkim if (!ResSourceIndex) 434207340Sjkim { 435207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 436207340Sjkim InitializerOp, NULL); 437207340Sjkim } 438207340Sjkim } 439207340Sjkim } 440207340Sjkim 441207340Sjkim#if 0 442207340Sjkim /* 443207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 444207340Sjkim * be invalid 445207340Sjkim */ 446207340Sjkim else if (ResSourceIndex) 447207340Sjkim { 448207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 449207340Sjkim InitializerOp, NULL); 450207340Sjkim } 451207340Sjkim#endif 452207340Sjkim break; 453207340Sjkim 454207340Sjkim case 11: /* ResourceTag */ 455207340Sjkim 456281075Sdim UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 457207340Sjkim break; 458207340Sjkim 459207340Sjkim default: 460207340Sjkim 461207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 462207340Sjkim break; 463207340Sjkim } 464207340Sjkim 465207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 466207340Sjkim } 467207340Sjkim 468207340Sjkim /* Validate the Min/Max/Len/Gran values */ 469207340Sjkim 470207340Sjkim RsLargeAddressCheck ( 471212761Sjkim (UINT64) Descriptor->Address16.Minimum, 472212761Sjkim (UINT64) Descriptor->Address16.Maximum, 473212761Sjkim (UINT64) Descriptor->Address16.AddressLength, 474212761Sjkim (UINT64) Descriptor->Address16.Granularity, 475207340Sjkim Descriptor->Address16.Flags, 476281075Sdim MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 477207340Sjkim 478207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + 479281075Sdim OptionIndex + StringLength; 480207340Sjkim return (Rnode); 481207340Sjkim} 482207340Sjkim 483207340Sjkim 484207340Sjkim/******************************************************************************* 485207340Sjkim * 486207340Sjkim * FUNCTION: RsDoWordSpaceDescriptor 487207340Sjkim * 488281075Sdim * PARAMETERS: Info - Parse Op and resource template offset 489207340Sjkim * 490207340Sjkim * RETURN: Completed resource node 491207340Sjkim * 492207340Sjkim * DESCRIPTION: Construct a long "WordSpace" descriptor 493207340Sjkim * 494207340Sjkim ******************************************************************************/ 495207340Sjkim 496207340SjkimASL_RESOURCE_NODE * 497207340SjkimRsDoWordSpaceDescriptor ( 498281075Sdim ASL_RESOURCE_INFO *Info) 499207340Sjkim{ 500207340Sjkim AML_RESOURCE *Descriptor; 501207340Sjkim ACPI_PARSE_OBJECT *InitializerOp; 502207340Sjkim ACPI_PARSE_OBJECT *MinOp = NULL; 503207340Sjkim ACPI_PARSE_OBJECT *MaxOp = NULL; 504207340Sjkim ACPI_PARSE_OBJECT *LengthOp = NULL; 505207340Sjkim ACPI_PARSE_OBJECT *GranOp = NULL; 506207340Sjkim ASL_RESOURCE_NODE *Rnode; 507207340Sjkim UINT8 *OptionalFields; 508207340Sjkim UINT16 StringLength = 0; 509207340Sjkim UINT32 OptionIndex = 0; 510281075Sdim UINT32 CurrentByteOffset; 511207340Sjkim UINT32 i; 512207340Sjkim BOOLEAN ResSourceIndex = FALSE; 513207340Sjkim 514207340Sjkim 515281075Sdim InitializerOp = Info->DescriptorTypeOp->Asl.Child; 516207340Sjkim StringLength = RsGetStringDataLength (InitializerOp); 517281075Sdim CurrentByteOffset = Info->CurrentByteOffset; 518207340Sjkim 519207340Sjkim Rnode = RsAllocateResourceNode ( 520207340Sjkim sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength); 521207340Sjkim 522207340Sjkim Descriptor = Rnode->Buffer; 523207340Sjkim Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16; 524207340Sjkim 525207340Sjkim /* 526207340Sjkim * Initial descriptor length -- may be enlarged if there are 527207340Sjkim * optional fields present 528207340Sjkim */ 529207340Sjkim OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16); 530207340Sjkim Descriptor->Address16.ResourceLength = (UINT16) 531207340Sjkim (sizeof (AML_RESOURCE_ADDRESS16) - 532207340Sjkim sizeof (AML_RESOURCE_LARGE_HEADER)); 533207340Sjkim 534207340Sjkim /* Process all child initialization nodes */ 535207340Sjkim 536207340Sjkim for (i = 0; InitializerOp; i++) 537207340Sjkim { 538207340Sjkim switch (i) 539207340Sjkim { 540207340Sjkim case 0: /* Resource Type */ 541207340Sjkim 542207340Sjkim Descriptor->Address16.ResourceType = 543207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 544207340Sjkim break; 545207340Sjkim 546207340Sjkim case 1: /* Resource Usage */ 547207340Sjkim 548207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1); 549207340Sjkim break; 550207340Sjkim 551207340Sjkim case 2: /* DecodeType */ 552207340Sjkim 553207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0); 554207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 555207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1); 556207340Sjkim break; 557207340Sjkim 558207340Sjkim case 3: /* MinType */ 559207340Sjkim 560207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0); 561207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 562207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2); 563207340Sjkim break; 564207340Sjkim 565207340Sjkim case 4: /* MaxType */ 566207340Sjkim 567207340Sjkim RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0); 568207340Sjkim RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 569207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3); 570207340Sjkim break; 571207340Sjkim 572207340Sjkim case 5: /* Type-Specific flags */ 573207340Sjkim 574207340Sjkim Descriptor->Address16.SpecificFlags = 575207340Sjkim (UINT8) InitializerOp->Asl.Value.Integer; 576207340Sjkim break; 577207340Sjkim 578207340Sjkim case 6: /* Address Granularity */ 579207340Sjkim 580207340Sjkim Descriptor->Address16.Granularity = 581207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 582228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 583207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity)); 584207340Sjkim GranOp = InitializerOp; 585207340Sjkim break; 586207340Sjkim 587207340Sjkim case 7: /* Min Address */ 588207340Sjkim 589207340Sjkim Descriptor->Address16.Minimum = 590207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 591228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR, 592207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum)); 593207340Sjkim MinOp = InitializerOp; 594207340Sjkim break; 595207340Sjkim 596207340Sjkim case 8: /* Max Address */ 597207340Sjkim 598207340Sjkim Descriptor->Address16.Maximum = 599207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 600228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR, 601207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum)); 602207340Sjkim MaxOp = InitializerOp; 603207340Sjkim break; 604207340Sjkim 605207340Sjkim case 9: /* Translation Offset */ 606207340Sjkim 607207340Sjkim Descriptor->Address16.TranslationOffset = 608207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 609228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 610207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset)); 611207340Sjkim break; 612207340Sjkim 613207340Sjkim case 10: /* Address Length */ 614207340Sjkim 615207340Sjkim Descriptor->Address16.AddressLength = 616207340Sjkim (UINT16) InitializerOp->Asl.Value.Integer; 617228110Sjkim RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH, 618207340Sjkim CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength)); 619207340Sjkim LengthOp = InitializerOp; 620207340Sjkim break; 621207340Sjkim 622207340Sjkim case 11: /* ResSourceIndex [Optional Field - BYTE] */ 623207340Sjkim 624207340Sjkim if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 625207340Sjkim { 626207340Sjkim OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 627207340Sjkim OptionIndex++; 628207340Sjkim Descriptor->Address16.ResourceLength++; 629207340Sjkim ResSourceIndex = TRUE; 630207340Sjkim } 631207340Sjkim break; 632207340Sjkim 633207340Sjkim case 12: /* ResSource [Optional Field - STRING] */ 634207340Sjkim 635207340Sjkim if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 636207340Sjkim (InitializerOp->Asl.Value.String)) 637207340Sjkim { 638207340Sjkim if (StringLength) 639207340Sjkim { 640207340Sjkim Descriptor->Address16.ResourceLength = (UINT16) 641207340Sjkim (Descriptor->Address16.ResourceLength + StringLength); 642207340Sjkim 643207340Sjkim strcpy ((char *) 644207340Sjkim &OptionalFields[OptionIndex], 645207340Sjkim InitializerOp->Asl.Value.String); 646207340Sjkim 647207340Sjkim /* ResourceSourceIndex must also be valid */ 648207340Sjkim 649207340Sjkim if (!ResSourceIndex) 650207340Sjkim { 651207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 652207340Sjkim InitializerOp, NULL); 653207340Sjkim } 654207340Sjkim } 655207340Sjkim } 656207340Sjkim 657207340Sjkim#if 0 658207340Sjkim /* 659207340Sjkim * Not a valid ResourceSource, ResourceSourceIndex must also 660207340Sjkim * be invalid 661207340Sjkim */ 662207340Sjkim else if (ResSourceIndex) 663207340Sjkim { 664207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 665207340Sjkim InitializerOp, NULL); 666207340Sjkim } 667207340Sjkim#endif 668207340Sjkim break; 669207340Sjkim 670207340Sjkim case 13: /* ResourceTag */ 671207340Sjkim 672281075Sdim UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 673207340Sjkim break; 674207340Sjkim 675207340Sjkim default: 676207340Sjkim 677207340Sjkim AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 678207340Sjkim break; 679207340Sjkim } 680207340Sjkim 681207340Sjkim InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 682207340Sjkim } 683207340Sjkim 684207340Sjkim /* Validate the Min/Max/Len/Gran values */ 685207340Sjkim 686207340Sjkim RsLargeAddressCheck ( 687212761Sjkim (UINT64) Descriptor->Address16.Minimum, 688212761Sjkim (UINT64) Descriptor->Address16.Maximum, 689212761Sjkim (UINT64) Descriptor->Address16.AddressLength, 690212761Sjkim (UINT64) Descriptor->Address16.Granularity, 691207340Sjkim Descriptor->Address16.Flags, 692281075Sdim MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 693207340Sjkim 694207340Sjkim Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) + 695281075Sdim OptionIndex + StringLength; 696207340Sjkim return (Rnode); 697207340Sjkim} 698