return Buffer;\r
}\r
\r
+/**\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
/**\r
To find Facs in Acpi tables.\r
\r
{\r
EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;\r
EFI_ACPI_DESCRIPTION_HEADER *Rsdt;\r
+ EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt;\r
EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs;\r
UINTN Index;\r
- UINT32 Data32;\r
+\r
Rsdp = NULL;\r
- Rsdt = NULL;\r
- Fadt = NULL;\r
//\r
// found ACPI table RSD_PTR from system table\r
//\r
return NULL;\r
}\r
\r
- Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress;\r
- if (Rsdt == NULL || Rsdt->Signature != EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) {\r
- return NULL;\r
- }\r
-\r
- for (Index = sizeof (EFI_ACPI_DESCRIPTION_HEADER); Index < Rsdt->Length; Index = Index + sizeof (UINT32)) {\r
-\r
- Data32 = *(UINT32 *) ((UINT8 *) Rsdt + Index);\r
- Fadt = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *) (UINT32 *) (UINTN) Data32;\r
- if (Fadt->Header.Signature == EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
- break;\r
+ //\r
+ // Search XSDT\r
+ //\r
+ if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {\r
+ Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->XsdtAddress;\r
+ Fadt = ScanTableInXSDT (Xsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);\r
+ if (Fadt != NULL) {\r
+ Facs = FindAcpiFacsFromFadt (Fadt);\r
+ if (Facs != NULL) {\r
+ return Facs;\r
+ }\r
}\r
}\r
\r
- if (Fadt == NULL || Fadt->Header.Signature != EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
- return NULL;\r
+ //\r
+ // Search RSDT\r
+ //\r
+ Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress;\r
+ Fadt = ScanTableInRSDT (Rsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);\r
+ if (Fadt != NULL) {\r
+ Facs = FindAcpiFacsFromFadt (Fadt);\r
+ if (Facs != NULL) {\r
+ return Facs;\r
+ }\r
}\r
\r
- Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)Fadt->FirmwareCtrl;\r
-\r
- return Facs;\r
+ return NULL;\r
}\r
\r
/**\r