/** 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; }
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; }