1 /****************************************************************************** 2 * 3 * Module Name: aslrestype2q - Large QWord address resource descriptors 4 * 5 *****************************************************************************/ 6 7 /* 8 * Copyright (C) 2000 - 2023, 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 MERCHANTABILITY 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 #include "aslcompiler.h" 45 #include "aslcompiler.y.h" 46 47 #define _COMPONENT ACPI_COMPILER 48 ACPI_MODULE_NAME ("aslrestype2q") 49 50 /* 51 * This module contains the QWord (64-bit) address space descriptors: 52 * 53 * QWordIO 54 * QWordMemory 55 * QwordPcc 56 * QWordSpace 57 */ 58 59 /******************************************************************************* 60 * 61 * FUNCTION: RsDoQwordIoDescriptor 62 * 63 * PARAMETERS: Info - Parse Op and resource template offset 64 * 65 * RETURN: Completed resource node 66 * 67 * DESCRIPTION: Construct a long "QwordIO" descriptor 68 * 69 ******************************************************************************/ 70 71 ASL_RESOURCE_NODE * 72 RsDoQwordIoDescriptor ( 73 ASL_RESOURCE_INFO *Info) 74 { 75 AML_RESOURCE *Descriptor; 76 ACPI_PARSE_OBJECT *InitializerOp; 77 ACPI_PARSE_OBJECT *MinOp = NULL; 78 ACPI_PARSE_OBJECT *MaxOp = NULL; 79 ACPI_PARSE_OBJECT *LengthOp = NULL; 80 ACPI_PARSE_OBJECT *GranOp = NULL; 81 ASL_RESOURCE_NODE *Rnode; 82 UINT8 *OptionalFields; 83 UINT16 StringLength = 0; 84 UINT32 OptionIndex = 0; 85 UINT32 CurrentByteOffset; 86 UINT32 i; 87 BOOLEAN ResSourceIndex = FALSE; 88 89 90 InitializerOp = Info->DescriptorTypeOp->Asl.Child; 91 StringLength = RsGetStringDataLength (InitializerOp); 92 CurrentByteOffset = Info->CurrentByteOffset; 93 94 Rnode = RsAllocateResourceNode ( 95 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 96 97 Descriptor = Rnode->Buffer; 98 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 99 Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE; 100 101 /* 102 * Initial descriptor length -- may be enlarged if there are 103 * optional fields present 104 */ 105 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 106 Descriptor->Address64.ResourceLength = (UINT16) 107 (sizeof (AML_RESOURCE_ADDRESS64) - 108 sizeof (AML_RESOURCE_LARGE_HEADER)); 109 110 /* Process all child initialization nodes */ 111 112 for (i = 0; InitializerOp; i++) 113 { 114 switch (i) 115 { 116 case 0: /* Resource Usage */ 117 118 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 119 break; 120 121 case 1: /* MinType */ 122 123 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 124 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 125 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 126 break; 127 128 case 2: /* MaxType */ 129 130 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 131 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 132 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 133 break; 134 135 case 3: /* DecodeType */ 136 137 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 138 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 139 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 140 break; 141 142 case 4: /* Range Type */ 143 144 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3); 145 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_RANGETYPE, 146 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0, 2); 147 break; 148 149 case 5: /* Address Granularity */ 150 151 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 152 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 153 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 154 GranOp = InitializerOp; 155 break; 156 157 case 6: /* Address Min */ 158 159 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 160 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 161 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 162 MinOp = InitializerOp; 163 break; 164 165 case 7: /* Address Max */ 166 167 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 168 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 169 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 170 MaxOp = InitializerOp; 171 break; 172 173 case 8: /* Translation Offset */ 174 175 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 176 RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION, 177 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 178 break; 179 180 case 9: /* Address Length */ 181 182 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 183 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 184 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 185 LengthOp = InitializerOp; 186 break; 187 188 case 10: /* ResSourceIndex [Optional Field - BYTE] */ 189 190 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 191 { 192 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 193 OptionIndex++; 194 Descriptor->Address64.ResourceLength++; 195 ResSourceIndex = TRUE; 196 } 197 break; 198 199 case 11: /* ResSource [Optional Field - STRING] */ 200 201 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 202 (InitializerOp->Asl.Value.String)) 203 { 204 if (StringLength) 205 { 206 Descriptor->Address64.ResourceLength = (UINT16) 207 (Descriptor->Address64.ResourceLength + StringLength); 208 209 strcpy ((char *) 210 &OptionalFields[OptionIndex], 211 InitializerOp->Asl.Value.String); 212 213 /* ResourceSourceIndex must also be valid */ 214 215 if (!ResSourceIndex) 216 { 217 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 218 InitializerOp, NULL); 219 } 220 } 221 } 222 223 #if 0 224 /* 225 * Not a valid ResourceSource, ResourceSourceIndex must also 226 * be invalid 227 */ 228 else if (ResSourceIndex) 229 { 230 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 231 InitializerOp, NULL); 232 } 233 #endif 234 break; 235 236 case 12: /* ResourceTag */ 237 238 UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 239 break; 240 241 case 13: /* Type */ 242 243 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0); 244 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 245 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4); 246 break; 247 248 case 14: /* Translation Type */ 249 250 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0); 251 RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE, 252 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5); 253 break; 254 255 default: 256 257 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 258 break; 259 } 260 261 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 262 } 263 264 /* Validate the Min/Max/Len/Gran values */ 265 266 RsLargeAddressCheck ( 267 Descriptor->Address64.Minimum, 268 Descriptor->Address64.Maximum, 269 Descriptor->Address64.AddressLength, 270 Descriptor->Address64.Granularity, 271 Descriptor->Address64.Flags, 272 MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 273 274 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 275 OptionIndex + StringLength; 276 return (Rnode); 277 } 278 279 280 /******************************************************************************* 281 * 282 * FUNCTION: RsDoQwordMemoryDescriptor 283 * 284 * PARAMETERS: Info - Parse Op and resource template offset 285 * 286 * RETURN: Completed resource node 287 * 288 * DESCRIPTION: Construct a long "QwordMemory" descriptor 289 * 290 ******************************************************************************/ 291 292 ASL_RESOURCE_NODE * 293 RsDoQwordMemoryDescriptor ( 294 ASL_RESOURCE_INFO *Info) 295 { 296 AML_RESOURCE *Descriptor; 297 ACPI_PARSE_OBJECT *InitializerOp; 298 ACPI_PARSE_OBJECT *MinOp = NULL; 299 ACPI_PARSE_OBJECT *MaxOp = NULL; 300 ACPI_PARSE_OBJECT *LengthOp = NULL; 301 ACPI_PARSE_OBJECT *GranOp = NULL; 302 ASL_RESOURCE_NODE *Rnode; 303 UINT8 *OptionalFields; 304 UINT16 StringLength = 0; 305 UINT32 OptionIndex = 0; 306 UINT32 CurrentByteOffset; 307 UINT32 i; 308 BOOLEAN ResSourceIndex = FALSE; 309 310 311 InitializerOp = Info->DescriptorTypeOp->Asl.Child; 312 StringLength = RsGetStringDataLength (InitializerOp); 313 CurrentByteOffset = Info->CurrentByteOffset; 314 315 Rnode = RsAllocateResourceNode ( 316 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 317 318 Descriptor = Rnode->Buffer; 319 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 320 Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE; 321 322 /* 323 * Initial descriptor length -- may be enlarged if there are 324 * optional fields present 325 */ 326 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 327 Descriptor->Address64.ResourceLength = (UINT16) 328 (sizeof (AML_RESOURCE_ADDRESS64) - 329 sizeof (AML_RESOURCE_LARGE_HEADER)); 330 331 /* Process all child initialization nodes */ 332 333 for (i = 0; InitializerOp; i++) 334 { 335 switch (i) 336 { 337 case 0: /* Resource Usage */ 338 339 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 340 break; 341 342 case 1: /* DecodeType */ 343 344 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 345 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 346 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 347 break; 348 349 case 2: /* MinType */ 350 351 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 352 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 353 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 354 break; 355 356 case 3: /* MaxType */ 357 358 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 359 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 360 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 361 break; 362 363 case 4: /* Memory Type */ 364 365 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0); 366 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMTYPE, 367 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1, 2); 368 break; 369 370 case 5: /* Read/Write Type */ 371 372 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1); 373 RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE, 374 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0); 375 break; 376 377 case 6: /* Address Granularity */ 378 379 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 380 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 381 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 382 GranOp = InitializerOp; 383 break; 384 385 case 7: /* Min Address */ 386 387 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 388 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 389 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 390 MinOp = InitializerOp; 391 break; 392 393 case 8: /* Max Address */ 394 395 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 396 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 397 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 398 MaxOp = InitializerOp; 399 break; 400 401 case 9: /* Translation Offset */ 402 403 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 404 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 405 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 406 break; 407 408 case 10: /* Address Length */ 409 410 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 411 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 412 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 413 LengthOp = InitializerOp; 414 break; 415 416 case 11: /* ResSourceIndex [Optional Field - BYTE] */ 417 418 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 419 { 420 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 421 OptionIndex++; 422 Descriptor->Address64.ResourceLength++; 423 ResSourceIndex = TRUE; 424 } 425 break; 426 427 case 12: /* ResSource [Optional Field - STRING] */ 428 429 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 430 (InitializerOp->Asl.Value.String)) 431 { 432 if (StringLength) 433 { 434 Descriptor->Address64.ResourceLength = (UINT16) 435 (Descriptor->Address64.ResourceLength + StringLength); 436 437 strcpy ((char *) 438 &OptionalFields[OptionIndex], 439 InitializerOp->Asl.Value.String); 440 441 /* ResourceSourceIndex must also be valid */ 442 443 if (!ResSourceIndex) 444 { 445 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 446 InitializerOp, NULL); 447 } 448 } 449 } 450 451 #if 0 452 /* 453 * Not a valid ResourceSource, ResourceSourceIndex must also 454 * be invalid 455 */ 456 else if (ResSourceIndex) 457 { 458 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 459 InitializerOp, NULL); 460 } 461 #endif 462 break; 463 464 case 13: /* ResourceTag */ 465 466 UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 467 break; 468 469 470 case 14: /* Address Range */ 471 472 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0); 473 RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES, 474 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3, 2); 475 break; 476 477 case 15: /* Type */ 478 479 RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0); 480 RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE, 481 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5); 482 break; 483 484 default: 485 486 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 487 break; 488 } 489 490 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 491 } 492 493 /* Validate the Min/Max/Len/Gran values */ 494 495 RsLargeAddressCheck ( 496 Descriptor->Address64.Minimum, 497 Descriptor->Address64.Maximum, 498 Descriptor->Address64.AddressLength, 499 Descriptor->Address64.Granularity, 500 Descriptor->Address64.Flags, 501 MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 502 503 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 504 OptionIndex + StringLength; 505 return (Rnode); 506 } 507 508 509 /******************************************************************************* 510 * 511 * FUNCTION: RsDoQwordPccDescriptor 512 * 513 * PARAMETERS: Info - Parse Op and resource template offset 514 * 515 * RETURN: Completed resource node 516 * 517 * DESCRIPTION: Construct a long "QWordPcc" descriptor 518 * 519 ******************************************************************************/ 520 521 ASL_RESOURCE_NODE * 522 RsDoQwordPccDescriptor ( 523 ASL_RESOURCE_INFO *Info) 524 { 525 AML_RESOURCE *Descriptor; 526 ACPI_PARSE_OBJECT *InitializerOp; 527 ACPI_PARSE_OBJECT *MinOp = NULL; 528 ACPI_PARSE_OBJECT *MaxOp = NULL; 529 ACPI_PARSE_OBJECT *LengthOp = NULL; 530 ACPI_PARSE_OBJECT *GranOp = NULL; 531 ASL_RESOURCE_NODE *Rnode; 532 UINT16 StringLength = 0; 533 UINT32 OptionIndex = 0; 534 UINT8 *OptionalFields; 535 UINT32 i; 536 BOOLEAN ResSourceIndex = FALSE; 537 538 539 InitializerOp = Info->DescriptorTypeOp->Asl.Child; 540 StringLength = RsGetStringDataLength (InitializerOp); 541 542 Rnode = RsAllocateResourceNode ( 543 sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength); 544 545 Descriptor = Rnode->Buffer; 546 Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32; 547 Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_PCC_NUMBER; 548 549 /* 550 * Initial descriptor length -- may be enlarged if there are 551 * optional fields present 552 */ 553 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32); 554 Descriptor->Address32.ResourceLength = (UINT16) 555 (sizeof (AML_RESOURCE_ADDRESS32) - 556 sizeof (AML_RESOURCE_LARGE_HEADER)); 557 558 559 /* 560 * Bit [3] Max Address Fixed, _MAF: 1 (max address is fixed) 561 * Bit [2] Min Address Fixed,_MIF: 1 (min address is fixed) 562 * Bit [1] Decode Type, _DEC: 0 (do not care) 563 * BIT [0] Ignored (must be zero) 564 */ 565 Descriptor->Address32.Flags = 0b1100; 566 567 // No type specific flags. Set to 0. 568 Descriptor->Address32.SpecificFlags = 0; 569 570 // must be set to zero if _MAX == _MIN. 571 Descriptor->Address32.Granularity = 0x0; 572 /* Process all child initialization nodes */ 573 574 // No translation offset. 575 Descriptor->Address32.TranslationOffset = 0; 576 577 // Pcc is unique address. 578 Descriptor->Address32.AddressLength = 1; 579 580 for (i = 0; InitializerOp; i++) 581 { 582 switch (i) 583 { 584 585 case 0: /* Address Min = Max */ 586 587 Descriptor->Address32.Minimum = 588 (UINT32) InitializerOp->Asl.Value.Integer; 589 Descriptor->Address32.Maximum = 590 (UINT32) InitializerOp->Asl.Value.Integer; 591 592 break; 593 594 case 1: /* ResSourceIndex [Optional Field - BYTE] */ 595 596 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 597 { 598 /* Found a valid ResourceSourceIndex */ 599 600 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 601 OptionIndex++; 602 Descriptor->Address32.ResourceLength++; 603 ResSourceIndex = TRUE; 604 } 605 break; 606 607 case 2: /* ResSource [Optional Field - STRING] */ 608 609 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 610 (InitializerOp->Asl.Value.String)) 611 { 612 if (StringLength) 613 { 614 /* Found a valid ResourceSource */ 615 616 Descriptor->Address32.ResourceLength = (UINT16) 617 (Descriptor->Address32.ResourceLength + StringLength); 618 619 strcpy ((char *) 620 &OptionalFields[OptionIndex], 621 InitializerOp->Asl.Value.String); 622 623 /* ResourceSourceIndex must also be valid */ 624 625 if (!ResSourceIndex) 626 { 627 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 628 InitializerOp, NULL); 629 } 630 } 631 } 632 633 break; 634 635 case 3: // DescriptorName 636 UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 637 break; 638 639 default: 640 641 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 642 break; 643 } 644 645 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 646 } 647 648 /* Validate the Min/Max/Len/Gran values */ 649 650 RsLargeAddressCheck ( 651 (UINT64) Descriptor->Address32.Minimum, 652 (UINT64) Descriptor->Address32.Maximum, 653 (UINT64) Descriptor->Address32.AddressLength, 654 (UINT64) Descriptor->Address32.Granularity, 655 Descriptor->Address32.Flags, 656 MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 657 658 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) + 659 OptionIndex + StringLength; 660 return (Rnode); 661 } 662 663 664 /******************************************************************************* 665 * 666 * FUNCTION: RsDoQwordSpaceDescriptor 667 * 668 * PARAMETERS: Info - Parse Op and resource template offset 669 * 670 * RETURN: Completed resource node 671 * 672 * DESCRIPTION: Construct a long "QwordSpace" descriptor 673 * 674 ******************************************************************************/ 675 676 ASL_RESOURCE_NODE * 677 RsDoQwordSpaceDescriptor ( 678 ASL_RESOURCE_INFO *Info) 679 { 680 AML_RESOURCE *Descriptor; 681 ACPI_PARSE_OBJECT *InitializerOp; 682 ACPI_PARSE_OBJECT *MinOp = NULL; 683 ACPI_PARSE_OBJECT *MaxOp = NULL; 684 ACPI_PARSE_OBJECT *LengthOp = NULL; 685 ACPI_PARSE_OBJECT *GranOp = NULL; 686 ASL_RESOURCE_NODE *Rnode; 687 UINT8 *OptionalFields; 688 UINT16 StringLength = 0; 689 UINT32 OptionIndex = 0; 690 UINT32 CurrentByteOffset; 691 UINT32 i; 692 BOOLEAN ResSourceIndex = FALSE; 693 694 695 InitializerOp = Info->DescriptorTypeOp->Asl.Child; 696 StringLength = RsGetStringDataLength (InitializerOp); 697 CurrentByteOffset = Info->CurrentByteOffset; 698 699 Rnode = RsAllocateResourceNode ( 700 sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength); 701 702 Descriptor = Rnode->Buffer; 703 Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64; 704 705 /* 706 * Initial descriptor length -- may be enlarged if there are 707 * optional fields present 708 */ 709 OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64); 710 Descriptor->Address64.ResourceLength = (UINT16) 711 (sizeof (AML_RESOURCE_ADDRESS64) - 712 sizeof (AML_RESOURCE_LARGE_HEADER)); 713 714 /* Process all child initialization nodes */ 715 716 for (i = 0; InitializerOp; i++) 717 { 718 switch (i) 719 { 720 case 0: /* Resource Type */ 721 722 Descriptor->Address64.ResourceType = 723 (UINT8) InitializerOp->Asl.Value.Integer; 724 break; 725 726 case 1: /* Resource Usage */ 727 728 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1); 729 break; 730 731 case 2: /* DecodeType */ 732 733 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0); 734 RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE, 735 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1); 736 break; 737 738 case 3: /* MinType */ 739 740 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0); 741 RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE, 742 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2); 743 break; 744 745 case 4: /* MaxType */ 746 747 RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0); 748 RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE, 749 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3); 750 break; 751 752 case 5: /* Type-Specific flags */ 753 754 Descriptor->Address64.SpecificFlags = 755 (UINT8) InitializerOp->Asl.Value.Integer; 756 break; 757 758 case 6: /* Address Granularity */ 759 760 Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer; 761 RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY, 762 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity)); 763 GranOp = InitializerOp; 764 break; 765 766 case 7: /* Min Address */ 767 768 Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer; 769 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR, 770 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum)); 771 MinOp = InitializerOp; 772 break; 773 774 case 8: /* Max Address */ 775 776 Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer; 777 RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR, 778 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum)); 779 MaxOp = InitializerOp; 780 break; 781 782 case 9: /* Translation Offset */ 783 784 Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer; 785 RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION, 786 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset)); 787 break; 788 789 case 10: /* Address Length */ 790 791 Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer; 792 RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH, 793 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength)); 794 LengthOp = InitializerOp; 795 break; 796 797 case 11: /* ResSourceIndex [Optional Field - BYTE] */ 798 799 if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) 800 { 801 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer; 802 OptionIndex++; 803 Descriptor->Address64.ResourceLength++; 804 ResSourceIndex = TRUE; 805 } 806 break; 807 808 case 12: /* ResSource [Optional Field - STRING] */ 809 810 if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) && 811 (InitializerOp->Asl.Value.String)) 812 { 813 if (StringLength) 814 { 815 Descriptor->Address64.ResourceLength = (UINT16) 816 (Descriptor->Address64.ResourceLength + StringLength); 817 818 strcpy ((char *) 819 &OptionalFields[OptionIndex], 820 InitializerOp->Asl.Value.String); 821 822 /* ResourceSourceIndex must also be valid */ 823 824 if (!ResSourceIndex) 825 { 826 AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX, 827 InitializerOp, NULL); 828 } 829 } 830 } 831 832 #if 0 833 /* 834 * Not a valid ResourceSource, ResourceSourceIndex must also 835 * be invalid 836 */ 837 else if (ResSourceIndex) 838 { 839 AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE, 840 InitializerOp, NULL); 841 } 842 #endif 843 break; 844 845 case 13: /* ResourceTag */ 846 847 UtAttachNamepathToOwner (Info->DescriptorTypeOp, InitializerOp); 848 break; 849 850 default: 851 852 AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL); 853 break; 854 } 855 856 InitializerOp = RsCompleteNodeAndGetNext (InitializerOp); 857 } 858 859 /* Validate the Min/Max/Len/Gran values */ 860 861 RsLargeAddressCheck ( 862 Descriptor->Address64.Minimum, 863 Descriptor->Address64.Maximum, 864 Descriptor->Address64.AddressLength, 865 Descriptor->Address64.Granularity, 866 Descriptor->Address64.Flags, 867 MinOp, MaxOp, LengthOp, GranOp, Info->DescriptorTypeOp); 868 869 Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) + 870 OptionIndex + StringLength; 871 return (Rnode); 872 } 873