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