1 /****************************************************************************** 2 * 3 * Module Name: aslrestype2q - Large QWord address resource descriptors 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2013, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44 45 #include "aslcompiler.h" 46 #include "aslcompiler.y.h" 47 48 #define _COMPONENT ACPI_COMPILER 49 ACPI_MODULE_NAME ("aslrestype2q") 50 51 /* 52 * This module contains the QWord (64-bit) address space descriptors: 53 * 54 * QWordIO 55 * QWordMemory 56 * QWordSpace 57 */ 58 59 /******************************************************************************* 60 * 61 * FUNCTION: RsDoQwordIoDescriptor 62 * 63 * PARAMETERS: Op - Parent resource descriptor parse node 64 * CurrentByteOffset - Offset into the resource template AML 65 * buffer (to track references to the desc) 66 * 67 * RETURN: Completed resource node 68 * 69 * DESCRIPTION: Construct a long "QwordIO" descriptor 70 * 71 ******************************************************************************/ 72 73 ASL_RESOURCE_NODE * 74 RsDoQwordIoDescriptor ( 75 ACPI_PARSE_OBJECT *Op, 76 UINT32 CurrentByteOffset) 77 { 78 AML_RESOURCE *Descriptor; 79 ACPI_PARSE_OBJECT *InitializerOp; 80 ACPI_PARSE_OBJECT *MinOp = NULL; 81 ACPI_PARSE_OBJECT *MaxOp = NULL; 82 ACPI_PARSE_OBJECT *LengthOp = NULL; 83 ACPI_PARSE_OBJECT *GranOp = NULL; 84 ASL_RESOURCE_NODE *Rnode; 85 UINT8 *OptionalFields; 86 UINT16 StringLength = 0; 87 UINT32 OptionIndex = 0; 88 UINT32 i; 89 BOOLEAN ResSourceIndex = FALSE; 90 91 92 InitializerOp = Op->Asl.Child; 93 StringLength = RsGetStringDataLength (InitializerOp); 94 95 Rnode = RsAllocateResourceNode ( 96 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 97 98 Descriptor = Rnode->Buffer; 99 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 100 Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; 101 102 /* 103 * Initial descriptor length -- may be enlarged if there are 104 * optional fields present 105 */ 106 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 107 Descriptor->Address64.ResourceLength = (UINT16) 108 (sizeof (AML_RESOURCE_ADDRESS64) - 109 sizeof (AML_RESOURCE_LARGE_HEADER)); 110 111 /* Process all child initialization nodes */ 112 113 for (i = 0; InitializerOp; i++) 114 { 115 switch (i) 116 { 117 case 0: /* Resource Usage */ 118 119 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 120 break; 121 122 case 1: /* MinType */ 123 124 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 125 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 126 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 127 break; 128 129 case 2: /* MaxType */ 130 131 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 132 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 133 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 134 break; 135 136 case 3: /* DecodeType */ 137 138 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 139 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 140 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 141 break; 142 143 case 4: /* Range Type */ 144 145 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3); 146 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 147 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2); 148 break; 149 150 case 5: /* Address Granularity */ 151 152 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 153 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 154 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 155 GranOp = InitializerOp; 156 break; 157 158 case 6: /* Address Min */ 159 160 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 161 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 162 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 163 MinOp = InitializerOp; 164 break; 165 166 case 7: /* Address Max */ 167 168 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 169 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 170 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 171 MaxOp = InitializerOp; 172 break; 173 174 case 8: /* Translation Offset */ 175 176 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 177 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 178 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 179 break; 180 181 case 9: /* Address Length */ 182 183 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 184 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 185 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 186 LengthOp = InitializerOp; 187 break; 188 189 case 10: /* ResSourceIndex [Optional Field - BYTE] */ 190 191 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 192 { 193 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 194 OptionIndex++; 195 Descriptor->Address64.ResourceLength++; 196 ResSourceIndex = TRUE; 197 } 198 break; 199 200 case 11: /* ResSource [Optional Field - STRING] */ 201 202 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 203 (InitializerOp->Asl.Value.String)) 204 { 205 if (StringLength) 206 { 207 Descriptor->Address64.ResourceLength = (UINT16) 208 (Descriptor->Address64.ResourceLength + StringLength); 209 210 strcpy ((char *) 211 &OptionalFields[OptionIndex], 212 InitializerOp->Asl.Value.String); 213 214 /* ResourceSourceIndex must also be valid */ 215 216 if (!ResSourceIndex) 217 { 218 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 219 InitializerOp, NULL); 220 } 221 } 222 } 223 224 #if 0 225 /* 226 * Not a valid ResourceSource, ResourceSourceIndex must also 227 * be invalid 228 */ 229 else if (ResSourceIndex) 230 { 231 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 232 InitializerOp, NULL); 233 } 234 #endif 235 break; 236 237 case 12: /* ResourceTag */ 238 239 UtAttachNamepathToOwner (Op, InitializerOp); 240 break; 241 242 case 13: /* Type */ 243 244 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0); 245 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 246 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4); 247 break; 248 249 case 14: /* Translation Type */ 250 251 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0); 252 RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 253 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5); 254 break; 255 256 default: 257 258 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 259 break; 260 } 261 262 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 263 } 264 265 /* Validate the Min/Max/Len/Gran values */ 266 267 RsLargeAddressCheck ( 268 Descriptor->Address64.Minimum, 269 Descriptor->Address64.Maximum, 270 Descriptor->Address64.AddressLength, 271 Descriptor->Address64.Granularity, 272 Descriptor->Address64.Flags, 273 MinOp, MaxOp, LengthOp, GranOp, Op); 274 275 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 276 OptionIndex + StringLength; 277 return (Rnode); 278 } 279 280 281 /******************************************************************************* 282 * 283 * FUNCTION: RsDoQwordMemoryDescriptor 284 * 285 * PARAMETERS: Op - Parent resource descriptor parse node 286 * CurrentByteOffset - Offset into the resource template AML 287 * buffer (to track references to the desc) 288 * 289 * RETURN: Completed resource node 290 * 291 * DESCRIPTION: Construct a long "QwordMemory" descriptor 292 * 293 ******************************************************************************/ 294 295 ASL_RESOURCE_NODE * 296 RsDoQwordMemoryDescriptor ( 297 ACPI_PARSE_OBJECT *Op, 298 UINT32 CurrentByteOffset) 299 { 300 AML_RESOURCE *Descriptor; 301 ACPI_PARSE_OBJECT *InitializerOp; 302 ACPI_PARSE_OBJECT *MinOp = NULL; 303 ACPI_PARSE_OBJECT *MaxOp = NULL; 304 ACPI_PARSE_OBJECT *LengthOp = NULL; 305 ACPI_PARSE_OBJECT *GranOp = NULL; 306 ASL_RESOURCE_NODE *Rnode; 307 UINT8 *OptionalFields; 308 UINT16 StringLength = 0; 309 UINT32 OptionIndex = 0; 310 UINT32 i; 311 BOOLEAN ResSourceIndex = FALSE; 312 313 314 InitializerOp = Op->Asl.Child; 315 StringLength = RsGetStringDataLength (InitializerOp); 316 317 Rnode = RsAllocateResourceNode ( 318 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 319 320 Descriptor = Rnode->Buffer; 321 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 322 Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 323 324 /* 325 * Initial descriptor length -- may be enlarged if there are 326 * optional fields present 327 */ 328 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 329 Descriptor->Address64.ResourceLength = (UINT16) 330 (sizeof (AML_RESOURCE_ADDRESS64) - 331 sizeof (AML_RESOURCE_LARGE_HEADER)); 332 333 /* Process all child initialization nodes */ 334 335 for (i = 0; InitializerOp; i++) 336 { 337 switch (i) 338 { 339 case 0: /* Resource Usage */ 340 341 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 342 break; 343 344 case 1: /* DecodeType */ 345 346 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 347 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 348 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 349 break; 350 351 case 2: /* MinType */ 352 353 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 354 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 355 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 356 break; 357 358 case 3: /* MaxType */ 359 360 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 361 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 362 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 363 break; 364 365 case 4: /* Memory Type */ 366 367 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0); 368 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 369 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2); 370 break; 371 372 case 5: /* Read/Write Type */ 373 374 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1); 375 RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 376 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0); 377 break; 378 379 case 6: /* Address Granularity */ 380 381 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 382 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 383 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 384 GranOp = InitializerOp; 385 break; 386 387 case 7: /* Min Address */ 388 389 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 390 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 391 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 392 MinOp = InitializerOp; 393 break; 394 395 case 8: /* Max Address */ 396 397 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 398 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 399 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 400 MaxOp = InitializerOp; 401 break; 402 403 case 9: /* Translation Offset */ 404 405 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 406 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 407 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 408 break; 409 410 case 10: /* Address Length */ 411 412 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 413 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 414 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 415 LengthOp = InitializerOp; 416 break; 417 418 case 11: /* ResSourceIndex [Optional Field - BYTE] */ 419 420 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 421 { 422 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 423 OptionIndex++; 424 Descriptor->Address64.ResourceLength++; 425 ResSourceIndex = TRUE; 426 } 427 break; 428 429 case 12: /* ResSource [Optional Field - STRING] */ 430 431 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 432 (InitializerOp->Asl.Value.String)) 433 { 434 if (StringLength) 435 { 436 Descriptor->Address64.ResourceLength = (UINT16) 437 (Descriptor->Address64.ResourceLength + StringLength); 438 439 strcpy ((char *) 440 &OptionalFields[OptionIndex], 441 InitializerOp->Asl.Value.String); 442 443 /* ResourceSourceIndex must also be valid */ 444 445 if (!ResSourceIndex) 446 { 447 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 448 InitializerOp, NULL); 449 } 450 } 451 } 452 453 #if 0 454 /* 455 * Not a valid ResourceSource, ResourceSourceIndex must also 456 * be invalid 457 */ 458 else if (ResSourceIndex) 459 { 460 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 461 InitializerOp, NULL); 462 } 463 #endif 464 break; 465 466 case 13: /* ResourceTag */ 467 468 UtAttachNamepathToOwner (Op, InitializerOp); 469 break; 470 471 472 case 14: /* Address Range */ 473 474 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0); 475 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 476 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2); 477 break; 478 479 case 15: /* Type */ 480 481 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0); 482 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 483 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5); 484 break; 485 486 default: 487 488 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 489 break; 490 } 491 492 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 493 } 494 495 /* Validate the Min/Max/Len/Gran values */ 496 497 RsLargeAddressCheck ( 498 Descriptor->Address64.Minimum, 499 Descriptor->Address64.Maximum, 500 Descriptor->Address64.AddressLength, 501 Descriptor->Address64.Granularity, 502 Descriptor->Address64.Flags, 503 MinOp, MaxOp, LengthOp, GranOp, Op); 504 505 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 506 OptionIndex + StringLength; 507 return (Rnode); 508 } 509 510 511 /******************************************************************************* 512 * 513 * FUNCTION: RsDoQwordSpaceDescriptor 514 * 515 * PARAMETERS: Op - Parent resource descriptor parse node 516 * CurrentByteOffset - Offset into the resource template AML 517 * buffer (to track references to the desc) 518 * 519 * RETURN: Completed resource node 520 * 521 * DESCRIPTION: Construct a long "QwordSpace" descriptor 522 * 523 ******************************************************************************/ 524 525 ASL_RESOURCE_NODE * 526 RsDoQwordSpaceDescriptor ( 527 ACPI_PARSE_OBJECT *Op, 528 UINT32 CurrentByteOffset) 529 { 530 AML_RESOURCE *Descriptor; 531 ACPI_PARSE_OBJECT *InitializerOp; 532 ACPI_PARSE_OBJECT *MinOp = NULL; 533 ACPI_PARSE_OBJECT *MaxOp = NULL; 534 ACPI_PARSE_OBJECT *LengthOp = NULL; 535 ACPI_PARSE_OBJECT *GranOp = NULL; 536 ASL_RESOURCE_NODE *Rnode; 537 UINT8 *OptionalFields; 538 UINT16 StringLength = 0; 539 UINT32 OptionIndex = 0; 540 UINT32 i; 541 BOOLEAN ResSourceIndex = FALSE; 542 543 544 InitializerOp = Op->Asl.Child; 545 StringLength = RsGetStringDataLength (InitializerOp); 546 547 Rnode = RsAllocateResourceNode ( 548 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 549 550 Descriptor = Rnode->Buffer; 551 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 552 553 /* 554 * Initial descriptor length -- may be enlarged if there are 555 * optional fields present 556 */ 557 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 558 Descriptor->Address64.ResourceLength = (UINT16) 559 (sizeof (AML_RESOURCE_ADDRESS64) - 560 sizeof (AML_RESOURCE_LARGE_HEADER)); 561 562 /* Process all child initialization nodes */ 563 564 for (i = 0; InitializerOp; i++) 565 { 566 switch (i) 567 { 568 case 0: /* Resource Type */ 569 570 Descriptor->Address64.ResourceType = 571 (UINT8) InitializerOp->Asl.Value.Integer; 572 break; 573 574 case 1: /* Resource Usage */ 575 576 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 577 break; 578 579 case 2: /* DecodeType */ 580 581 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 582 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 583 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 584 break; 585 586 case 3: /* MinType */ 587 588 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 589 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 590 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 591 break; 592 593 case 4: /* MaxType */ 594 595 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 596 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 597 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 598 break; 599 600 case 5: /* Type-Specific flags */ 601 602 Descriptor->Address64.SpecificFlags = 603 (UINT8) InitializerOp->Asl.Value.Integer; 604 break; 605 606 case 6: /* Address Granularity */ 607 608 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 609 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 610 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 611 GranOp = InitializerOp; 612 break; 613 614 case 7: /* Min Address */ 615 616 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 617 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 618 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 619 MinOp = InitializerOp; 620 break; 621 622 case 8: /* Max Address */ 623 624 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 625 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 626 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 627 MaxOp = InitializerOp; 628 break; 629 630 case 9: /* Translation Offset */ 631 632 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 633 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 634 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 635 break; 636 637 case 10: /* Address Length */ 638 639 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 640 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 641 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 642 LengthOp = InitializerOp; 643 break; 644 645 case 11: /* ResSourceIndex [Optional Field - BYTE] */ 646 647 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 648 { 649 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 650 OptionIndex++; 651 Descriptor->Address64.ResourceLength++; 652 ResSourceIndex = TRUE; 653 } 654 break; 655 656 case 12: /* ResSource [Optional Field - STRING] */ 657 658 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 659 (InitializerOp->Asl.Value.String)) 660 { 661 if (StringLength) 662 { 663 Descriptor->Address64.ResourceLength = (UINT16) 664 (Descriptor->Address64.ResourceLength + StringLength); 665 666 strcpy ((char *) 667 &OptionalFields[OptionIndex], 668 InitializerOp->Asl.Value.String); 669 670 /* ResourceSourceIndex must also be valid */ 671 672 if (!ResSourceIndex) 673 { 674 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 675 InitializerOp, NULL); 676 } 677 } 678 } 679 680 #if 0 681 /* 682 * Not a valid ResourceSource, ResourceSourceIndex must also 683 * be invalid 684 */ 685 else if (ResSourceIndex) 686 { 687 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 688 InitializerOp, NULL); 689 } 690 #endif 691 break; 692 693 case 13: /* ResourceTag */ 694 695 UtAttachNamepathToOwner (Op, InitializerOp); 696 break; 697 698 default: 699 700 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 701 break; 702 } 703 704 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 705 } 706 707 /* Validate the Min/Max/Len/Gran values */ 708 709 RsLargeAddressCheck ( 710 Descriptor->Address64.Minimum, 711 Descriptor->Address64.Maximum, 712 Descriptor->Address64.AddressLength, 713 Descriptor->Address64.Granularity, 714 Descriptor->Address64.Flags, 715 MinOp, MaxOp, LengthOp, GranOp, Op); 716 717 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 718 OptionIndex + StringLength; 719 return (Rnode); 720 }