Deleted Added
sdiff udiff text old ( 126372 ) new ( 131440 )
full compact
1/******************************************************************************
2 *
3 * Module Name: tbxfroot - Find the root ACPI table (RSDT)
4 * $Revision: 72 $
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
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).
497 *
498 ******************************************************************************/
499
500ACPI_STATUS
501AcpiTbFindRsdp (
502 ACPI_TABLE_DESC *TableInfo,
503 UINT32 Flags)
504{
505 UINT8 *TablePtr;
506 UINT8 *MemRover;
507 UINT64 PhysAddr;
508 ACPI_STATUS Status = AE_OK;
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 /*
520 * 1) Search EBDA (low memory) paragraphs
521 */
522 Status = AcpiOsMapMemory ((UINT64) ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE,
523 (void *) &TablePtr);
524 if (ACPI_FAILURE (Status))
525 {
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));
528 return_ACPI_STATUS (Status);
529 }
530
531 MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_LO_RSDP_WINDOW_SIZE);
532 AcpiOsUnmapMemory (TablePtr, ACPI_LO_RSDP_WINDOW_SIZE);
533
534 if (MemRover)
535 {
536 /* Found it, return the physical address */
537
538 PhysAddr = ACPI_LO_RSDP_WINDOW_BASE;
539 PhysAddr += ACPI_PTR_DIFF (MemRover,TablePtr);
540
541 TableInfo->PhysicalAddress = PhysAddr;
542 return_ACPI_STATUS (AE_OK);
543 }
544
545 /*
546 * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h
547 */
548 Status = AcpiOsMapMemory ((UINT64) ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE,
549 (void *) &TablePtr);
550 if (ACPI_FAILURE (Status))
551 {
552 ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X 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
564 PhysAddr = ACPI_HI_RSDP_WINDOW_BASE;
565 PhysAddr += ACPI_PTR_DIFF (MemRover, TablePtr);
566
567 TableInfo->PhysicalAddress = PhysAddr;
568 return_ACPI_STATUS (AE_OK);
569 }
570 }
571
572 /*
573 * Physical addressing
574 */
575 else
576 {
577 /*
578 * 1) Search EBDA (low memory) paragraphs
579 */
580 MemRover = AcpiTbScanMemoryForRsdp (ACPI_PHYSADDR_TO_PTR (ACPI_LO_RSDP_WINDOW_BASE),
581 ACPI_LO_RSDP_WINDOW_SIZE);
582 if (MemRover)
583 {
584 /* Found it, return the physical address */
585
586 TableInfo->PhysicalAddress = ACPI_TO_INTEGER (MemRover);
587 return_ACPI_STATUS (AE_OK);
588 }
589
590 /*
591 * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h
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