/**
  To find Facs in Acpi tables.
 
  To find Firmware ACPI control strutcure in Acpi Tables since the S3 waking vector is stored 
  in the table.

  @param AcpiTableGuid   The guid used to find ACPI table in UEFI ConfigurationTable.
  
  @return  Facs table pointer.
**/
EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *
FindAcpiFacsTableByAcpiGuid (
  IN EFI_GUID  *AcpiTableGuid
  )
{
  EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;
  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;
  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;
  EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;
  EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs;
  UINTN                                         Index;

  Rsdp  = NULL;
  //
  // found ACPI table RSD_PTR from system table
  //
  for (Index = 0; Index < gST->NumberOfTableEntries; Index++) {
    if (CompareGuid (&(gST->ConfigurationTable[Index].VendorGuid), AcpiTableGuid)) {
      //
      // A match was found.
      //
      Rsdp = gST->ConfigurationTable[Index].VendorTable;
      break;
    }
  }

  if (Rsdp == NULL) {
    return NULL;
  }

  //
  // Search XSDT
  //
  if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {
    Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->XsdtAddress;
    Fadt = ScanTableInXSDT (Xsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);
    if (Fadt != NULL) {
      Facs = FindAcpiFacsFromFadt (Fadt);
      if (Facs != NULL) {
        return Facs;
      }
    }
  }

  //
  // Search RSDT
  //
  Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress;
  Fadt = ScanTableInRSDT (Rsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);
  if (Fadt != NULL) {
    Facs = FindAcpiFacsFromFadt (Fadt);
    if (Facs != NULL) {
      return Facs;
    }
  }

  return NULL;
}
Exemple #2
0
VOID *
FindAcpiPtr (
    IN HOB_TEMPLATE  *Hob,
    UINT32           Signature
)
{
    EFI_ACPI_DESCRIPTION_HEADER                    *AcpiTable;
    EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER   *Rsdp;
    RSDT_TABLE                                     *Rsdt;
    XSDT_TABLE                                     *Xsdt;

    AcpiTable = NULL;

    //
    // Check ACPI2.0 table
    //
    if ((int)Hob->Acpi20.Table != -1) {
        Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)Hob->Acpi20.Table;
        Rsdt = (RSDT_TABLE *)(UINTN)Rsdp->RsdtAddress;
        Xsdt = NULL;
        if ((Rsdp->Revision >= 2) && (Rsdp->XsdtAddress < (UINT64)(UINTN)-1)) {
            Xsdt = (XSDT_TABLE *)(UINTN)Rsdp->XsdtAddress;
        }
        //
        // Check Xsdt
        //
        if (Xsdt != NULL) {
            ScanTableInXSDT (Xsdt, Signature, &AcpiTable);
        }
        //
        // Check Rsdt
        //
        if ((AcpiTable == NULL) && (Rsdt != NULL)) {
            ScanTableInRSDT (Rsdt, Signature, &AcpiTable);
        }
    }

    //
    // Check ACPI1.0 table
    //
    if ((AcpiTable == NULL) && ((int)Hob->Acpi.Table != -1)) {
        Rsdp = (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)Hob->Acpi.Table;
        Rsdt = (RSDT_TABLE *)(UINTN)Rsdp->RsdtAddress;
        //
        // Check Rsdt
        //
        if (Rsdt != NULL) {
            ScanTableInRSDT (Rsdt, Signature, &AcpiTable);
        }
    }

    return AcpiTable;
}