tbxfroot.c (126372) | tbxfroot.c (131440) |
---|---|
1/****************************************************************************** 2 * 3 * Module Name: tbxfroot - Find the root ACPI table (RSDT) | 1/****************************************************************************** 2 * 3 * Module Name: tbxfroot - Find the root ACPI table (RSDT) |
4 * $Revision: 72 $ | 4 * $Revision: 73 $ |
5 * 6 *****************************************************************************/ 7 8/****************************************************************************** 9 * 10 * 1. Copyright Notice 11 * 12 * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp. --- 468 unchanged lines hidden (view full) --- 481/******************************************************************************* 482 * 483 * FUNCTION: AcpiTbFindRsdp 484 * 485 * PARAMETERS: *TableInfo - Where the table info is returned 486 * Flags - Current memory mode (logical vs. 487 * physical addressing) 488 * | 5 * 6 *****************************************************************************/ 7 8/****************************************************************************** 9 * 10 * 1. Copyright Notice 11 * 12 * Some or all of this work - Copyright (c) 1999 - 2004, Intel Corp. --- 468 unchanged lines hidden (view full) --- 481/******************************************************************************* 482 * 483 * FUNCTION: AcpiTbFindRsdp 484 * 485 * PARAMETERS: *TableInfo - Where the table info is returned 486 * Flags - Current memory mode (logical vs. 487 * physical addressing) 488 * |
489 * RETURN: Status | 489 * RETURN: Status, RSDP physical address |
490 * 491 * DESCRIPTION: Search lower 1Mbyte of memory for the root system descriptor 492 * pointer structure. If it is found, set *RSDP to point to it. 493 * | 490 * 491 * DESCRIPTION: Search lower 1Mbyte of memory for the root system descriptor 492 * pointer structure. If it is found, set *RSDP to point to it. 493 * |
494 * NOTE: The RSDP must be either in the first 1K of the Extended 495 * BIOS Data Area or between E0000 and FFFFF (ACPI 1.0 section 496 * 5.2.2; assertion #421). | 494 * NOTE1: The RSDP must be either in the first 1K of the Extended 495 * BIOS Data Area or between E0000 and FFFFF (From ACPI Spec.) 496 * Only a 32-bit physical address is necessary. |
497 * | 497 * |
498 * NOTE2: This function is always available, regardless of the 499 * initialization state of the rest of ACPI. 500 * |
|
498 ******************************************************************************/ 499 500ACPI_STATUS 501AcpiTbFindRsdp ( 502 ACPI_TABLE_DESC *TableInfo, 503 UINT32 Flags) 504{ 505 UINT8 *TablePtr; 506 UINT8 *MemRover; | 501 ******************************************************************************/ 502 503ACPI_STATUS 504AcpiTbFindRsdp ( 505 ACPI_TABLE_DESC *TableInfo, 506 UINT32 Flags) 507{ 508 UINT8 *TablePtr; 509 UINT8 *MemRover; |
507 UINT64 PhysAddr; 508 ACPI_STATUS Status = AE_OK; | 510 UINT32 PhysicalAddress; 511 ACPI_STATUS Status; |
509 510 511 ACPI_FUNCTION_TRACE ("TbFindRsdp"); 512 513 514 /* 515 * Scan supports either 1) Logical addressing or 2) Physical addressing 516 */ 517 if ((Flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) 518 { 519 /* | 512 513 514 ACPI_FUNCTION_TRACE ("TbFindRsdp"); 515 516 517 /* 518 * Scan supports either 1) Logical addressing or 2) Physical addressing 519 */ 520 if ((Flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) 521 { 522 /* |
520 * 1) Search EBDA (low memory) paragraphs | 523 * 1a) Get the location of the EBDA |
521 */ | 524 */ |
522 Status = AcpiOsMapMemory ((UINT64) ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE, | 525 Status = AcpiOsMapMemory ((ACPI_PHYSICAL_ADDRESS) ACPI_EBDA_PTR_LOCATION, 526 ACPI_EBDA_PTR_LENGTH, |
523 (void *) &TablePtr); 524 if (ACPI_FAILURE (Status)) 525 { | 527 (void *) &TablePtr); 528 if (ACPI_FAILURE (Status)) 529 { |
526 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X for length %X\n", 527 ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE)); | 530 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %8.8X for length %X\n", 531 ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH)); |
528 return_ACPI_STATUS (Status); 529 } 530 | 532 return_ACPI_STATUS (Status); 533 } 534 |
531 MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_LO_RSDP_WINDOW_SIZE); 532 AcpiOsUnmapMemory (TablePtr, ACPI_LO_RSDP_WINDOW_SIZE); | 535 ACPI_MOVE_16_TO_32 (&PhysicalAddress, TablePtr); 536 PhysicalAddress <<= 4; /* Convert segment to physical address */ 537 AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_PTR_LENGTH); |
533 | 538 |
534 if (MemRover) | 539 /* EBDA present? */ 540 541 if (PhysicalAddress > 0x400) |
535 { | 542 { |
536 /* Found it, return the physical address */ | 543 /* 544 * 1b) Search EBDA paragraphs (EBDA is required to be a minimum of 1K length) 545 */ 546 Status = AcpiOsMapMemory ((ACPI_PHYSICAL_ADDRESS) PhysicalAddress, 547 ACPI_EBDA_WINDOW_SIZE, 548 (void *) &TablePtr); 549 if (ACPI_FAILURE (Status)) 550 { 551 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %8.8X for length %X\n", 552 PhysicalAddress, ACPI_EBDA_WINDOW_SIZE)); 553 return_ACPI_STATUS (Status); 554 } |
537 | 555 |
538 PhysAddr = ACPI_LO_RSDP_WINDOW_BASE; 539 PhysAddr += ACPI_PTR_DIFF (MemRover,TablePtr); | 556 MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_EBDA_WINDOW_SIZE); 557 AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_WINDOW_SIZE); |
540 | 558 |
541 TableInfo->PhysicalAddress = PhysAddr; 542 return_ACPI_STATUS (AE_OK); | 559 if (MemRover) 560 { 561 /* Found it, return the physical address */ 562 563 PhysicalAddress += ACPI_PTR_DIFF (MemRover, TablePtr); 564 565 TableInfo->PhysicalAddress = (ACPI_PHYSICAL_ADDRESS) PhysicalAddress; 566 return_ACPI_STATUS (AE_OK); 567 } |
543 } 544 545 /* | 568 } 569 570 /* |
546 * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h | 571 * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh |
547 */ | 572 */ |
548 Status = AcpiOsMapMemory ((UINT64) ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE, | 573 Status = AcpiOsMapMemory ((ACPI_PHYSICAL_ADDRESS) ACPI_HI_RSDP_WINDOW_BASE, 574 ACPI_HI_RSDP_WINDOW_SIZE, |
549 (void *) &TablePtr); 550 if (ACPI_FAILURE (Status)) 551 { | 575 (void *) &TablePtr); 576 if (ACPI_FAILURE (Status)) 577 { |
552 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X for length %X\n", | 578 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %8.8X for length %X\n", |
553 ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE)); 554 return_ACPI_STATUS (Status); 555 } 556 557 MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE); 558 AcpiOsUnmapMemory (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE); 559 560 if (MemRover) 561 { 562 /* Found it, return the physical address */ 563 | 579 ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE)); 580 return_ACPI_STATUS (Status); 581 } 582 583 MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE); 584 AcpiOsUnmapMemory (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE); 585 586 if (MemRover) 587 { 588 /* Found it, return the physical address */ 589 |
564 PhysAddr = ACPI_HI_RSDP_WINDOW_BASE; 565 PhysAddr += ACPI_PTR_DIFF (MemRover, TablePtr); | 590 PhysicalAddress = ACPI_HI_RSDP_WINDOW_BASE + ACPI_PTR_DIFF (MemRover, TablePtr); |
566 | 591 |
567 TableInfo->PhysicalAddress = PhysAddr; | 592 TableInfo->PhysicalAddress = (ACPI_PHYSICAL_ADDRESS) PhysicalAddress; |
568 return_ACPI_STATUS (AE_OK); 569 } 570 } 571 572 /* 573 * Physical addressing 574 */ 575 else 576 { 577 /* | 593 return_ACPI_STATUS (AE_OK); 594 } 595 } 596 597 /* 598 * Physical addressing 599 */ 600 else 601 { 602 /* |
578 * 1) Search EBDA (low memory) paragraphs | 603 * 1a) Get the location of the EBDA |
579 */ | 604 */ |
580 MemRover = AcpiTbScanMemoryForRsdp (ACPI_PHYSADDR_TO_PTR (ACPI_LO_RSDP_WINDOW_BASE), 581 ACPI_LO_RSDP_WINDOW_SIZE); 582 if (MemRover) | 605 ACPI_MOVE_16_TO_32 (&PhysicalAddress, ACPI_EBDA_PTR_LOCATION); 606 PhysicalAddress <<= 4; /* Convert segment to physical address */ 607 608 /* EBDA present? */ 609 610 if (PhysicalAddress > 0x400) |
583 { | 611 { |
584 /* Found it, return the physical address */ | 612 /* 613 * 1b) Search EBDA paragraphs (EBDA is required to be a minimum of 1K length) 614 */ 615 MemRover = AcpiTbScanMemoryForRsdp (ACPI_PHYSADDR_TO_PTR (PhysicalAddress), 616 ACPI_EBDA_WINDOW_SIZE); 617 if (MemRover) 618 { 619 /* Found it, return the physical address */ |
585 | 620 |
586 TableInfo->PhysicalAddress = ACPI_TO_INTEGER (MemRover); 587 return_ACPI_STATUS (AE_OK); | 621 TableInfo->PhysicalAddress = ACPI_TO_INTEGER (MemRover); 622 return_ACPI_STATUS (AE_OK); 623 } |
588 } 589 590 /* | 624 } 625 626 /* |
591 * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h | 627 * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh |
592 */ 593 MemRover = AcpiTbScanMemoryForRsdp (ACPI_PHYSADDR_TO_PTR (ACPI_HI_RSDP_WINDOW_BASE), 594 ACPI_HI_RSDP_WINDOW_SIZE); 595 if (MemRover) 596 { 597 /* Found it, return the physical address */ 598 599 TableInfo->PhysicalAddress = ACPI_TO_INTEGER (MemRover); 600 return_ACPI_STATUS (AE_OK); 601 } 602 } 603 604 /* RSDP signature was not found */ 605 606 return_ACPI_STATUS (AE_NOT_FOUND); 607} 608 609#endif 610 | 628 */ 629 MemRover = AcpiTbScanMemoryForRsdp (ACPI_PHYSADDR_TO_PTR (ACPI_HI_RSDP_WINDOW_BASE), 630 ACPI_HI_RSDP_WINDOW_SIZE); 631 if (MemRover) 632 { 633 /* Found it, return the physical address */ 634 635 TableInfo->PhysicalAddress = ACPI_TO_INTEGER (MemRover); 636 return_ACPI_STATUS (AE_OK); 637 } 638 } 639 640 /* RSDP signature was not found */ 641 642 return_ACPI_STATUS (AE_NOT_FOUND); 643} 644 645#endif 646 |