aslrestype2q.c revision 228110
1247738Sbapt 2247738Sbapt/****************************************************************************** 3247738Sbapt * 4247738Sbapt * Module Name: aslrestype2q - Large QWord address resource descriptors 5247738Sbapt * 6247738Sbapt *****************************************************************************/ 7247738Sbapt 8247738Sbapt/* 9247738Sbapt * Copyright (C) 2000 - 2011, Intel Corp. 10247738Sbapt * All rights reserved. 11247738Sbapt * 12247738Sbapt * Redistribution and use in source and binary forms, with or without 13247738Sbapt * modification, are permitted provided that the following conditions 14247738Sbapt * are met: 15247738Sbapt * 1. Redistributions of source code must retain the above copyright 16247738Sbapt * notice, this list of conditions, and the following disclaimer, 17247738Sbapt * without modification. 18247738Sbapt * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19247738Sbapt * substantially similar to the "NO WARRANTY" disclaimer below 20247738Sbapt * ("Disclaimer") and any redistribution must be conditioned upon 21247738Sbapt * including a substantially similar Disclaimer requirement for further 22247738Sbapt * binary redistribution. 23247738Sbapt * 3. Neither the names of the above-listed copyright holders nor the names 24247738Sbapt * of any contributors may be used to endorse or promote products derived 25247738Sbapt * from this software without specific prior written permission. 26247738Sbapt * 27247738Sbapt * Alternatively, this software may be distributed under the terms of the 28247738Sbapt * GNU General Public License ("GPL") version 2 as published by the Free 29247738Sbapt * Software Foundation. 30247738Sbapt * 31247738Sbapt * NO WARRANTY 32247738Sbapt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33247738Sbapt * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34247738Sbapt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35247738Sbapt * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36247738Sbapt * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37247738Sbapt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38247738Sbapt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39247738Sbapt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40247738Sbapt * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41247738Sbapt * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42247738Sbapt * POSSIBILITY OF SUCH DAMAGES. 43247738Sbapt */ 44247738Sbapt 45247738Sbapt 46247738Sbapt#include <contrib/dev/acpica/compiler/aslcompiler.h> 47247738Sbapt#include "aslcompiler.y.h" 48247738Sbapt 49247738Sbapt#define _COMPONENT ACPI_COMPILER 50247738Sbapt ACPI_MODULE_NAME ("aslrestype2q") 51247738Sbapt 52247738Sbapt/* 53247738Sbapt * This module contains the QWord (64-bit) address space descriptors: 54247738Sbapt * 55247738Sbapt * QWordIO 56247738Sbapt * QWordMemory 57247738Sbapt * QWordSpace 58247738Sbapt */ 59247738Sbapt 60247738Sbapt/******************************************************************************* 61247738Sbapt * 62247738Sbapt * FUNCTION: RsDoQwordIoDescriptor 63247738Sbapt * 64247738Sbapt * PARAMETERS: Op - Parent resource descriptor parse node 65247738Sbapt * CurrentByteOffset - Offset into the resource template AML 66247738Sbapt * buffer (to track references to the desc) 67247738Sbapt * 68247738Sbapt * RETURN: Completed resource node 69247738Sbapt * 70247738Sbapt * DESCRIPTION: Construct a long "QwordIO" descriptor 71247738Sbapt * 72247738Sbapt ******************************************************************************/ 73247738Sbapt 74247738SbaptASL_RESOURCE_NODE * 75247738SbaptRsDoQwordIoDescriptor ( 76247738Sbapt ACPI_PARSE_OBJECT *Op, 77247738Sbapt UINT32 CurrentByteOffset) 78247738Sbapt{ 79247738Sbapt AML_RESOURCE *Descriptor; 80247738Sbapt ACPI_PARSE_OBJECT *InitializerOp; 81247738Sbapt ACPI_PARSE_OBJECT *MinOp = NULL; 82247738Sbapt ACPI_PARSE_OBJECT *MaxOp = NULL; 83247738Sbapt ACPI_PARSE_OBJECT *LengthOp = NULL; 84247738Sbapt ACPI_PARSE_OBJECT *GranOp = NULL; 85247738Sbapt ASL_RESOURCE_NODE *Rnode; 86247738Sbapt UINT8 *OptionalFields; 87247738Sbapt UINT16 StringLength = 0; 88247738Sbapt UINT32 OptionIndex = 0; 89247738Sbapt UINT32 i; 90247738Sbapt BOOLEAN ResSourceIndex = FALSE; 91247738Sbapt 92247738Sbapt 93247738Sbapt InitializerOp = Op->Asl.Child; 94247738Sbapt StringLength = RsGetStringDataLength (InitializerOp); 95247738Sbapt 96247738Sbapt Rnode = RsAllocateResourceNode ( 97247738Sbapt sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 98247738Sbapt 99247738Sbapt Descriptor = Rnode->Buffer; 100247738Sbapt Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 101247738Sbapt Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; 102247738Sbapt 103247738Sbapt /* 104247738Sbapt * Initial descriptor length -- may be enlarged if there are 105247738Sbapt * optional fields present 106247738Sbapt */ 107247738Sbapt OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 108247738Sbapt Descriptor->Address64.ResourceLength = (UINT16) 109247738Sbapt (sizeof (AML_RESOURCE_ADDRESS64) - 110247738Sbapt sizeof (AML_RESOURCE_LARGE_HEADER)); 111247738Sbapt 112247738Sbapt /* Process all child initialization nodes */ 113247738Sbapt 114247738Sbapt for (i = 0; InitializerOp; i++) 115247738Sbapt { 116247738Sbapt switch (i) 117247738Sbapt { 118247738Sbapt case 0: /* Resource Usage */ 119247738Sbapt 120247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 121247738Sbapt break; 122247738Sbapt 123247738Sbapt case 1: /* MinType */ 124247738Sbapt 125247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 126247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 127247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 128247738Sbapt break; 129247738Sbapt 130247738Sbapt case 2: /* MaxType */ 131247738Sbapt 132247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 133247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 134247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 135247738Sbapt break; 136247738Sbapt 137247738Sbapt case 3: /* DecodeType */ 138247738Sbapt 139247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 140247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 141247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 142247738Sbapt break; 143247738Sbapt 144247738Sbapt case 4: /* Range Type */ 145247738Sbapt 146247738Sbapt RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3); 147247738Sbapt RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 148247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2); 149247738Sbapt break; 150247738Sbapt 151247738Sbapt case 5: /* Address Granularity */ 152247738Sbapt 153247738Sbapt Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 154247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 155247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 156247738Sbapt GranOp = InitializerOp; 157247738Sbapt break; 158247738Sbapt 159247738Sbapt case 6: /* Address Min */ 160247738Sbapt 161247738Sbapt Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 162247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 163247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 164247738Sbapt MinOp = InitializerOp; 165247738Sbapt break; 166247738Sbapt 167247738Sbapt case 7: /* Address Max */ 168247738Sbapt 169247738Sbapt Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 170247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 171247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 172247738Sbapt MaxOp = InitializerOp; 173247738Sbapt break; 174247738Sbapt 175247738Sbapt case 8: /* Translation Offset */ 176247738Sbapt 177247738Sbapt Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 178247738Sbapt RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 179247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 180247738Sbapt break; 181247738Sbapt 182247738Sbapt case 9: /* Address Length */ 183247738Sbapt 184247738Sbapt Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 185247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 186247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 187247738Sbapt LengthOp = InitializerOp; 188247738Sbapt break; 189247738Sbapt 190247738Sbapt case 10: /* ResSourceIndex [Optional Field - BYTE] */ 191247738Sbapt 192247738Sbapt if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 193247738Sbapt { 194247738Sbapt OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 195247738Sbapt OptionIndex++; 196247738Sbapt Descriptor->Address64.ResourceLength++; 197247738Sbapt ResSourceIndex = TRUE; 198247738Sbapt } 199247738Sbapt break; 200247738Sbapt 201247738Sbapt case 11: /* ResSource [Optional Field - STRING] */ 202247738Sbapt 203247738Sbapt if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 204247738Sbapt (InitializerOp->Asl.Value.String)) 205247738Sbapt { 206247738Sbapt if (StringLength) 207247738Sbapt { 208247738Sbapt Descriptor->Address64.ResourceLength = (UINT16) 209247738Sbapt (Descriptor->Address64.ResourceLength + StringLength); 210247738Sbapt 211247738Sbapt strcpy ((char *) 212247738Sbapt &OptionalFields[OptionIndex], 213247738Sbapt InitializerOp->Asl.Value.String); 214247738Sbapt 215247738Sbapt /* ResourceSourceIndex must also be valid */ 216247738Sbapt 217247738Sbapt if (!ResSourceIndex) 218247738Sbapt { 219247738Sbapt AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 220247738Sbapt InitializerOp, NULL); 221247738Sbapt } 222247738Sbapt } 223247738Sbapt } 224247738Sbapt 225247738Sbapt#if 0 226247738Sbapt /* 227247738Sbapt * Not a valid ResourceSource, ResourceSourceIndex must also 228247738Sbapt * be invalid 229247738Sbapt */ 230247738Sbapt else if (ResSourceIndex) 231247738Sbapt { 232247738Sbapt AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 233247738Sbapt InitializerOp, NULL); 234247738Sbapt } 235247738Sbapt#endif 236247738Sbapt break; 237247738Sbapt 238247738Sbapt case 12: /* ResourceTag */ 239247738Sbapt 240247738Sbapt UtAttachNamepathToOwner (Op, InitializerOp); 241247738Sbapt break; 242247738Sbapt 243247738Sbapt case 13: /* Type */ 244247738Sbapt 245247738Sbapt RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0); 246247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 247247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4); 248247738Sbapt break; 249247738Sbapt 250247738Sbapt case 14: /* Translation Type */ 251247738Sbapt 252247738Sbapt RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0); 253247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 254247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5); 255247738Sbapt break; 256247738Sbapt 257247738Sbapt default: 258247738Sbapt 259247738Sbapt AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 260247738Sbapt break; 261247738Sbapt } 262247738Sbapt 263247738Sbapt InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 264247738Sbapt } 265247738Sbapt 266247738Sbapt /* Validate the Min/Max/Len/Gran values */ 267247738Sbapt 268247738Sbapt RsLargeAddressCheck ( 269247738Sbapt Descriptor->Address64.Minimum, 270247738Sbapt Descriptor->Address64.Maximum, 271247738Sbapt Descriptor->Address64.AddressLength, 272247738Sbapt Descriptor->Address64.Granularity, 273247738Sbapt Descriptor->Address64.Flags, 274247738Sbapt MinOp, MaxOp, LengthOp, GranOp, Op); 275247738Sbapt 276247738Sbapt Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 277247738Sbapt OptionIndex + StringLength; 278247738Sbapt return (Rnode); 279247738Sbapt} 280247738Sbapt 281247738Sbapt 282247738Sbapt/******************************************************************************* 283247738Sbapt * 284247738Sbapt * FUNCTION: RsDoQwordMemoryDescriptor 285247738Sbapt * 286247738Sbapt * PARAMETERS: Op - Parent resource descriptor parse node 287247738Sbapt * CurrentByteOffset - Offset into the resource template AML 288247738Sbapt * buffer (to track references to the desc) 289247738Sbapt * 290247738Sbapt * RETURN: Completed resource node 291247738Sbapt * 292247738Sbapt * DESCRIPTION: Construct a long "QwordMemory" descriptor 293247738Sbapt * 294247738Sbapt ******************************************************************************/ 295247738Sbapt 296247738SbaptASL_RESOURCE_NODE * 297247738SbaptRsDoQwordMemoryDescriptor ( 298247738Sbapt ACPI_PARSE_OBJECT *Op, 299247738Sbapt UINT32 CurrentByteOffset) 300247738Sbapt{ 301247738Sbapt AML_RESOURCE *Descriptor; 302247738Sbapt ACPI_PARSE_OBJECT *InitializerOp; 303247738Sbapt ACPI_PARSE_OBJECT *MinOp = NULL; 304247738Sbapt ACPI_PARSE_OBJECT *MaxOp = NULL; 305247738Sbapt ACPI_PARSE_OBJECT *LengthOp = NULL; 306247738Sbapt ACPI_PARSE_OBJECT *GranOp = NULL; 307247738Sbapt ASL_RESOURCE_NODE *Rnode; 308247738Sbapt UINT8 *OptionalFields; 309247738Sbapt UINT16 StringLength = 0; 310247738Sbapt UINT32 OptionIndex = 0; 311247738Sbapt UINT32 i; 312247738Sbapt BOOLEAN ResSourceIndex = FALSE; 313247738Sbapt 314247738Sbapt 315247738Sbapt InitializerOp = Op->Asl.Child; 316247738Sbapt StringLength = RsGetStringDataLength (InitializerOp); 317247738Sbapt 318247738Sbapt Rnode = RsAllocateResourceNode ( 319247738Sbapt sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 320247738Sbapt 321247738Sbapt Descriptor = Rnode->Buffer; 322247738Sbapt Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 323247738Sbapt Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 324247738Sbapt 325247738Sbapt /* 326247738Sbapt * Initial descriptor length -- may be enlarged if there are 327247738Sbapt * optional fields present 328247738Sbapt */ 329247738Sbapt OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 330247738Sbapt Descriptor->Address64.ResourceLength = (UINT16) 331247738Sbapt (sizeof (AML_RESOURCE_ADDRESS64) - 332247738Sbapt sizeof (AML_RESOURCE_LARGE_HEADER)); 333247738Sbapt 334247738Sbapt /* Process all child initialization nodes */ 335247738Sbapt 336247738Sbapt for (i = 0; InitializerOp; i++) 337247738Sbapt { 338247738Sbapt switch (i) 339247738Sbapt { 340247738Sbapt case 0: /* Resource Usage */ 341247738Sbapt 342247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 343247738Sbapt break; 344247738Sbapt 345247738Sbapt case 1: /* DecodeType */ 346247738Sbapt 347247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 348247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 349247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 350247738Sbapt break; 351247738Sbapt 352247738Sbapt case 2: /* MinType */ 353247738Sbapt 354247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 355247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 356247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 357247738Sbapt break; 358247738Sbapt 359247738Sbapt case 3: /* MaxType */ 360247738Sbapt 361247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 362247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 363247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 364247738Sbapt break; 365247738Sbapt 366247738Sbapt case 4: /* Memory Type */ 367247738Sbapt 368247738Sbapt RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0); 369247738Sbapt RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 370247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2); 371247738Sbapt break; 372247738Sbapt 373247738Sbapt case 5: /* Read/Write Type */ 374247738Sbapt 375247738Sbapt RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1); 376247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 377247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0); 378247738Sbapt break; 379247738Sbapt 380247738Sbapt case 6: /* Address Granularity */ 381247738Sbapt 382247738Sbapt Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 383247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 384247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 385247738Sbapt GranOp = InitializerOp; 386247738Sbapt break; 387247738Sbapt 388247738Sbapt case 7: /* Min Address */ 389247738Sbapt 390247738Sbapt Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 391247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 392247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 393247738Sbapt MinOp = InitializerOp; 394247738Sbapt break; 395247738Sbapt 396247738Sbapt case 8: /* Max Address */ 397247738Sbapt 398247738Sbapt Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 399247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 400247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 401247738Sbapt MaxOp = InitializerOp; 402247738Sbapt break; 403247738Sbapt 404247738Sbapt case 9: /* Translation Offset */ 405247738Sbapt 406247738Sbapt Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 407247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 408247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 409247738Sbapt break; 410247738Sbapt 411247738Sbapt case 10: /* Address Length */ 412247738Sbapt 413247738Sbapt Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 414247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 415247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 416247738Sbapt LengthOp = InitializerOp; 417247738Sbapt break; 418247738Sbapt 419247738Sbapt case 11: /* ResSourceIndex [Optional Field - BYTE] */ 420247738Sbapt 421247738Sbapt if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 422247738Sbapt { 423247738Sbapt OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 424247738Sbapt OptionIndex++; 425247738Sbapt Descriptor->Address64.ResourceLength++; 426247738Sbapt ResSourceIndex = TRUE; 427247738Sbapt } 428247738Sbapt break; 429247738Sbapt 430247738Sbapt case 12: /* ResSource [Optional Field - STRING] */ 431247738Sbapt 432247738Sbapt if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 433247738Sbapt (InitializerOp->Asl.Value.String)) 434247738Sbapt { 435247738Sbapt if (StringLength) 436247738Sbapt { 437247738Sbapt Descriptor->Address64.ResourceLength = (UINT16) 438247738Sbapt (Descriptor->Address64.ResourceLength + StringLength); 439247738Sbapt 440247738Sbapt strcpy ((char *) 441247738Sbapt &OptionalFields[OptionIndex], 442247738Sbapt InitializerOp->Asl.Value.String); 443247738Sbapt 444247738Sbapt /* ResourceSourceIndex must also be valid */ 445247738Sbapt 446247738Sbapt if (!ResSourceIndex) 447247738Sbapt { 448247738Sbapt AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 449247738Sbapt InitializerOp, NULL); 450247738Sbapt } 451247738Sbapt } 452247738Sbapt } 453247738Sbapt 454247738Sbapt#if 0 455247738Sbapt /* 456247738Sbapt * Not a valid ResourceSource, ResourceSourceIndex must also 457247738Sbapt * be invalid 458247738Sbapt */ 459247738Sbapt else if (ResSourceIndex) 460247738Sbapt { 461247738Sbapt AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 462247738Sbapt InitializerOp, NULL); 463247738Sbapt } 464247738Sbapt#endif 465247738Sbapt break; 466247738Sbapt 467247738Sbapt case 13: /* ResourceTag */ 468247738Sbapt 469247738Sbapt UtAttachNamepathToOwner (Op, InitializerOp); 470247738Sbapt break; 471247738Sbapt 472247738Sbapt 473247738Sbapt case 14: /* Address Range */ 474247738Sbapt 475247738Sbapt RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0); 476247738Sbapt RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 477247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2); 478247738Sbapt break; 479247738Sbapt 480247738Sbapt case 15: /* Type */ 481247738Sbapt 482247738Sbapt RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0); 483247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 484247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5); 485247738Sbapt break; 486247738Sbapt 487247738Sbapt default: 488247738Sbapt 489247738Sbapt AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 490247738Sbapt break; 491247738Sbapt } 492247738Sbapt 493247738Sbapt InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 494247738Sbapt } 495247738Sbapt 496247738Sbapt /* Validate the Min/Max/Len/Gran values */ 497247738Sbapt 498247738Sbapt RsLargeAddressCheck ( 499247738Sbapt Descriptor->Address64.Minimum, 500247738Sbapt Descriptor->Address64.Maximum, 501247738Sbapt Descriptor->Address64.AddressLength, 502247738Sbapt Descriptor->Address64.Granularity, 503247738Sbapt Descriptor->Address64.Flags, 504247738Sbapt MinOp, MaxOp, LengthOp, GranOp, Op); 505247738Sbapt 506247738Sbapt Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 507247738Sbapt OptionIndex + StringLength; 508247738Sbapt return (Rnode); 509247738Sbapt} 510247738Sbapt 511247738Sbapt 512247738Sbapt/******************************************************************************* 513247738Sbapt * 514247738Sbapt * FUNCTION: RsDoQwordSpaceDescriptor 515247738Sbapt * 516247738Sbapt * PARAMETERS: Op - Parent resource descriptor parse node 517247738Sbapt * CurrentByteOffset - Offset into the resource template AML 518247738Sbapt * buffer (to track references to the desc) 519247738Sbapt * 520247738Sbapt * RETURN: Completed resource node 521247738Sbapt * 522247738Sbapt * DESCRIPTION: Construct a long "QwordSpace" descriptor 523247738Sbapt * 524247738Sbapt ******************************************************************************/ 525247738Sbapt 526247738SbaptASL_RESOURCE_NODE * 527247738SbaptRsDoQwordSpaceDescriptor ( 528247738Sbapt ACPI_PARSE_OBJECT *Op, 529247738Sbapt UINT32 CurrentByteOffset) 530247738Sbapt{ 531247738Sbapt AML_RESOURCE *Descriptor; 532247738Sbapt ACPI_PARSE_OBJECT *InitializerOp; 533247738Sbapt ACPI_PARSE_OBJECT *MinOp = NULL; 534247738Sbapt ACPI_PARSE_OBJECT *MaxOp = NULL; 535247738Sbapt ACPI_PARSE_OBJECT *LengthOp = NULL; 536247738Sbapt ACPI_PARSE_OBJECT *GranOp = NULL; 537247738Sbapt ASL_RESOURCE_NODE *Rnode; 538247738Sbapt UINT8 *OptionalFields; 539247738Sbapt UINT16 StringLength = 0; 540247738Sbapt UINT32 OptionIndex = 0; 541247738Sbapt UINT32 i; 542247738Sbapt BOOLEAN ResSourceIndex = FALSE; 543247738Sbapt 544247738Sbapt 545247738Sbapt InitializerOp = Op->Asl.Child; 546247738Sbapt StringLength = RsGetStringDataLength (InitializerOp); 547247738Sbapt 548247738Sbapt Rnode = RsAllocateResourceNode ( 549247738Sbapt sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 550247738Sbapt 551247738Sbapt Descriptor = Rnode->Buffer; 552247738Sbapt Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 553247738Sbapt 554247738Sbapt /* 555247738Sbapt * Initial descriptor length -- may be enlarged if there are 556247738Sbapt * optional fields present 557247738Sbapt */ 558247738Sbapt OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 559247738Sbapt Descriptor->Address64.ResourceLength = (UINT16) 560247738Sbapt (sizeof (AML_RESOURCE_ADDRESS64) - 561247738Sbapt sizeof (AML_RESOURCE_LARGE_HEADER)); 562247738Sbapt 563247738Sbapt /* Process all child initialization nodes */ 564247738Sbapt 565247738Sbapt for (i = 0; InitializerOp; i++) 566247738Sbapt { 567247738Sbapt switch (i) 568247738Sbapt { 569247738Sbapt case 0: /* Resource Type */ 570247738Sbapt 571247738Sbapt Descriptor->Address64.ResourceType = 572247738Sbapt (UINT8) InitializerOp->Asl.Value.Integer; 573247738Sbapt break; 574247738Sbapt 575247738Sbapt case 1: /* Resource Usage */ 576247738Sbapt 577247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 578247738Sbapt break; 579247738Sbapt 580247738Sbapt case 2: /* DecodeType */ 581247738Sbapt 582247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 583247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 584247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 585247738Sbapt break; 586247738Sbapt 587247738Sbapt case 3: /* MinType */ 588247738Sbapt 589247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 590247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 591247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 592247738Sbapt break; 593247738Sbapt 594247738Sbapt case 4: /* MaxType */ 595247738Sbapt 596247738Sbapt RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 597247738Sbapt RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 598247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 599247738Sbapt break; 600247738Sbapt 601247738Sbapt case 5: /* Type-Specific flags */ 602247738Sbapt 603247738Sbapt Descriptor->Address64.SpecificFlags = 604247738Sbapt (UINT8) InitializerOp->Asl.Value.Integer; 605247738Sbapt break; 606247738Sbapt 607247738Sbapt case 6: /* Address Granularity */ 608247738Sbapt 609247738Sbapt Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 610247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 611247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 612247738Sbapt GranOp = InitializerOp; 613247738Sbapt break; 614247738Sbapt 615247738Sbapt case 7: /* Min Address */ 616247738Sbapt 617247738Sbapt Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 618247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 619247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 620247738Sbapt MinOp = InitializerOp; 621247738Sbapt break; 622247738Sbapt 623247738Sbapt case 8: /* Max Address */ 624247738Sbapt 625247738Sbapt Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 626247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 627247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 628247738Sbapt MaxOp = InitializerOp; 629247738Sbapt break; 630247738Sbapt 631247738Sbapt case 9: /* Translation Offset */ 632247738Sbapt 633247738Sbapt Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 634247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 635247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 636247738Sbapt break; 637247738Sbapt 638247738Sbapt case 10: /* Address Length */ 639247738Sbapt 640247738Sbapt Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 641247738Sbapt RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 642247738Sbapt CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 643247738Sbapt LengthOp = InitializerOp; 644247738Sbapt break; 645247738Sbapt 646247738Sbapt case 11: /* ResSourceIndex [Optional Field - BYTE] */ 647247738Sbapt 648247738Sbapt if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 649247738Sbapt { 650247738Sbapt OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 651247738Sbapt OptionIndex++; 652247738Sbapt Descriptor->Address64.ResourceLength++; 653247738Sbapt ResSourceIndex = TRUE; 654247738Sbapt } 655247738Sbapt break; 656247738Sbapt 657247738Sbapt case 12: /* ResSource [Optional Field - STRING] */ 658247738Sbapt 659247738Sbapt if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 660247738Sbapt (InitializerOp->Asl.Value.String)) 661247738Sbapt { 662247738Sbapt if (StringLength) 663247738Sbapt { 664247738Sbapt Descriptor->Address64.ResourceLength = (UINT16) 665247738Sbapt (Descriptor->Address64.ResourceLength + StringLength); 666247738Sbapt 667247738Sbapt strcpy ((char *) 668247738Sbapt &OptionalFields[OptionIndex], 669247738Sbapt InitializerOp->Asl.Value.String); 670247738Sbapt 671247738Sbapt /* ResourceSourceIndex must also be valid */ 672247738Sbapt 673 if (!ResSourceIndex) 674 { 675 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 676 InitializerOp, NULL); 677 } 678 } 679 } 680 681#if 0 682 /* 683 * Not a valid ResourceSource, ResourceSourceIndex must also 684 * be invalid 685 */ 686 else if (ResSourceIndex) 687 { 688 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 689 InitializerOp, NULL); 690 } 691#endif 692 break; 693 694 case 13: /* ResourceTag */ 695 696 UtAttachNamepathToOwner (Op, InitializerOp); 697 break; 698 699 default: 700 701 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 702 break; 703 } 704 705 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 706 } 707 708 /* Validate the Min/Max/Len/Gran values */ 709 710 RsLargeAddressCheck ( 711 Descriptor->Address64.Minimum, 712 Descriptor->Address64.Maximum, 713 Descriptor->Address64.AddressLength, 714 Descriptor->Address64.Granularity, 715 Descriptor->Address64.Flags, 716 MinOp, MaxOp, LengthOp, GranOp, Op); 717 718 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 719 OptionIndex + StringLength; 720 return (Rnode); 721} 722