Deleted Added
full compact
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