+/**\r
+\r
+ This function scan ACPI table in RSDT.\r
+\r
+ @param Rsdt ACPI RSDT\r
+ @param Signature ACPI table signature\r
+\r
+ @return ACPI table\r
+\r
+**/\r
+VOID *\r
+ScanTableInRSDT (\r
+ IN EFI_ACPI_DESCRIPTION_HEADER *Rsdt,\r
+ IN UINT32 Signature\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINT32 EntryCount;\r
+ UINT32 *EntryPtr;\r
+ EFI_ACPI_DESCRIPTION_HEADER *Table;\r
+\r
+ if (Rsdt == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ EntryCount = (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT32);\r
+ \r
+ EntryPtr = (UINT32 *)(Rsdt + 1);\r
+ for (Index = 0; Index < EntryCount; Index ++, EntryPtr ++) {\r
+ Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(*EntryPtr));\r
+ if (Table->Signature == Signature) {\r
+ return Table;\r
+ }\r
+ }\r
+ \r
+ return NULL;\r
+}\r
+\r
+/**\r
+\r
+ This function scan ACPI table in XSDT.\r
+\r
+ @param Xsdt ACPI XSDT\r
+ @param Signature ACPI table signature\r
+\r
+ @return ACPI table\r
+\r
+**/\r
+VOID *\r
+ScanTableInXSDT (\r
+ IN EFI_ACPI_DESCRIPTION_HEADER *Xsdt,\r
+ IN UINT32 Signature\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINT32 EntryCount;\r
+ UINT64 EntryPtr;\r
+ UINTN BasePtr;\r
+ EFI_ACPI_DESCRIPTION_HEADER *Table;\r
+\r
+ if (Xsdt == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ EntryCount = (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof(UINT64);\r
+ \r
+ BasePtr = (UINTN)(Xsdt + 1);\r
+ for (Index = 0; Index < EntryCount; Index ++) {\r
+ CopyMem (&EntryPtr, (VOID *)(BasePtr + Index * sizeof(UINT64)), sizeof(UINT64));\r
+ Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(EntryPtr));\r
+ if (Table->Signature == Signature) {\r
+ return Table;\r
+ }\r
+ }\r
+ \r
+ return NULL;\r
+}\r
+\r
+/**\r
+ To find Facs in FADT.\r
+\r
+ @param Fadt FADT table pointer\r
+ \r
+ @return Facs table pointer.\r
+**/\r
+EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *\r
+FindAcpiFacsFromFadt (\r
+ IN EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt\r
+ )\r
+{\r
+ EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs;\r
+ UINT64 Data64;\r
+\r
+ if (Fadt == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ if (Fadt->Header.Revision < EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) {\r
+ Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl;\r
+ } else {\r
+ if (Fadt->FirmwareCtrl != 0) {\r
+ Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl;\r
+ } else {\r
+ CopyMem (&Data64, &Fadt->XFirmwareCtrl, sizeof(UINT64));\r
+ Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Data64;\r
+ }\r
+ }\r
+ return Facs;\r
+}\r
+\r