- UINTN Idx;\r
- RETURN_STATUS Status;\r
- \r
- Rsdp = NULL;\r
- Status = RETURN_SUCCESS;\r
- \r
- Status = CbParseAcpiTable (&Rsdp, NULL);\r
- if (RETURN_ERROR(Status))\r
- return Status;\r
- \r
- if (!Rsdp)\r
- return RETURN_NOT_FOUND;\r
- \r
- DEBUG ((EFI_D_ERROR, "Find Rsdp at 0x%x\n", Rsdp));\r
- DEBUG ((EFI_D_ERROR, "Find Rsdt 0x%x, Xsdt 0x%x\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
- \r
- //\r
- // Search Rsdt First\r
- //\r
- Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress); \r
- if (Rsdt != NULL) {\r
- Entry32 = (UINT32 *)(Rsdt + 1);\r
- Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
- for (Idx = 0; Idx < Entry32Num; Idx++) {\r
- if (*(UINT32 *)(UINTN)(Entry32[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
- Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry32[Idx]); \r
- if (pPmCtrlReg)\r
- *pPmCtrlReg = Fadt->Pm1aCntBlk; \r
- DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
- \r
- if (pPmTimerReg) \r
- *pPmTimerReg = Fadt->PmTmrBlk; \r
- DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
- \r
- if (pResetReg) \r
- *pResetReg = (UINTN)Fadt->ResetReg.Address; \r
- DEBUG ((EFI_D_ERROR, "Reset Reg 0x%x\n", Fadt->ResetReg.Address));\r
- \r
- if (pResetValue) \r
- *pResetValue = Fadt->ResetValue;\r
- DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));\r
- \r
- return RETURN_SUCCESS; \r
- }\r
- }\r
- }\r
- \r
- //\r
- // Search Xsdt Second\r
- //\r
- Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress); \r
- if (Xsdt != NULL) {\r
- Entry64 = (UINT64 *)(Xsdt + 1);\r
- Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
- for (Idx = 0; Idx < Entry64Num; Idx++) {\r
- if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
- Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry64[Idx]); \r
- if (pPmCtrlReg)\r
- *pPmCtrlReg = Fadt->Pm1aCntBlk; \r
- DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
- \r
- if (pPmTimerReg) \r
- *pPmTimerReg = Fadt->PmTmrBlk; \r
- DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
- \r
- if (pResetReg) \r
- *pResetReg = (UINTN)Fadt->ResetReg.Address; \r
- DEBUG ((EFI_D_ERROR, "Reset Reg 0x%x\n", Fadt->ResetReg.Address));\r
- \r
- if (pResetValue) \r
- *pResetValue = Fadt->ResetValue;\r
- DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));\r
- \r
- return RETURN_SUCCESS; \r
- }\r
- }\r
- } \r
- \r
- return RETURN_NOT_FOUND;\r
+ UINTN Idx;\r
+ RETURN_STATUS Status;\r
+\r
+ Rsdp = NULL;\r
+ Status = RETURN_SUCCESS;\r
+\r
+ Status = CbParseAcpiTable ((VOID **)&Rsdp, NULL);\r
+ if (RETURN_ERROR(Status)) {\r
+ return Status;\r
+ }\r
+\r
+ if (Rsdp == NULL) {\r
+ return RETURN_NOT_FOUND;\r
+ }\r
+\r
+ DEBUG ((EFI_D_INFO, "Find Rsdp at %p\n", Rsdp));\r
+ DEBUG ((EFI_D_INFO, "Find Rsdt 0x%x, Xsdt 0x%lx\n", Rsdp->RsdtAddress, Rsdp->XsdtAddress));\r
+\r
+ //\r
+ // Search Rsdt First\r
+ //\r
+ Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->RsdtAddress);\r
+ if (Rsdt != NULL) {\r
+ Entry32 = (UINT32 *)(Rsdt + 1);\r
+ Entry32Num = (Rsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 2;\r
+ for (Idx = 0; Idx < Entry32Num; Idx++) {\r
+ if (*(UINT32 *)(UINTN)(Entry32[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
+ Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry32[Idx]);\r
+ if (pPmCtrlReg != NULL) {\r
+ *pPmCtrlReg = Fadt->Pm1aCntBlk;\r
+ }\r
+ DEBUG ((EFI_D_INFO, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
+\r
+ if (pPmTimerReg != NULL) {\r
+ *pPmTimerReg = Fadt->PmTmrBlk;\r
+ }\r
+ DEBUG ((EFI_D_INFO, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
+\r
+ if (pResetReg != NULL) {\r
+ *pResetReg = (UINTN)Fadt->ResetReg.Address;\r
+ }\r
+ DEBUG ((EFI_D_INFO, "Reset Reg 0x%lx\n", Fadt->ResetReg.Address));\r
+\r
+ if (pResetValue != NULL) {\r
+ *pResetValue = Fadt->ResetValue;\r
+ }\r
+ DEBUG ((EFI_D_INFO, "Reset Value 0x%x\n", Fadt->ResetValue));\r
+\r
+ if (pPmEvtReg != NULL) {\r
+ *pPmEvtReg = Fadt->Pm1aEvtBlk;\r
+ DEBUG ((EFI_D_INFO, "PmEvt Reg 0x%x\n", Fadt->Pm1aEvtBlk));\r
+ }\r
+\r
+ if (pPmGpeEnReg != NULL) {\r
+ *pPmGpeEnReg = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
+ DEBUG ((EFI_D_INFO, "PmGpeEn Reg 0x%x\n", *pPmGpeEnReg));\r
+ }\r
+\r
+ //\r
+ // Verify values for proper operation\r
+ //\r
+ ASSERT(Fadt->Pm1aCntBlk != 0);\r
+ ASSERT(Fadt->PmTmrBlk != 0);\r
+ ASSERT(Fadt->ResetReg.Address != 0);\r
+ ASSERT(Fadt->Pm1aEvtBlk != 0);\r
+ ASSERT(Fadt->Gpe0Blk != 0);\r
+\r
+ DEBUG_CODE_BEGIN ();\r
+ BOOLEAN SciEnabled;\r
+\r
+ //\r
+ // Check the consistency of SCI enabling\r
+ //\r
+\r
+ //\r
+ // Get SCI_EN value\r
+ //\r
+ if (Fadt->Pm1CntLen == 4) {\r
+ SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
+ } else {\r
+ //\r
+ // if (Pm1CntLen == 2), use 16 bit IO read;\r
+ // if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback\r
+ //\r
+ SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;\r
+ }\r
+\r
+ if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&\r
+ (Fadt->SmiCmd == 0) &&\r
+ !SciEnabled) {\r
+ //\r
+ // The ACPI enabling status is inconsistent: SCI is not enabled but ACPI\r
+ // table does not provide a means to enable it through FADT->SmiCmd\r
+ //\r
+ DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"\r
+ " enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."\r
+ " This may cause issues in OS.\n"));\r
+ ASSERT (FALSE);\r
+ }\r
+ DEBUG_CODE_END ();\r
+ return RETURN_SUCCESS;\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // Search Xsdt Second\r
+ //\r
+ Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)(Rsdp->XsdtAddress);\r
+ if (Xsdt != NULL) {\r
+ Entry64 = (UINT64 *)(Xsdt + 1);\r
+ Entry64Num = (Xsdt->Length - sizeof(EFI_ACPI_DESCRIPTION_HEADER)) >> 3;\r
+ for (Idx = 0; Idx < Entry64Num; Idx++) {\r
+ if (*(UINT32 *)(UINTN)(Entry64[Idx]) == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) {\r
+ Fadt = (EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)(Entry64[Idx]);\r
+ if (pPmCtrlReg)\r
+ *pPmCtrlReg = Fadt->Pm1aCntBlk;\r
+ DEBUG ((EFI_D_ERROR, "PmCtrl Reg 0x%x\n", Fadt->Pm1aCntBlk));\r
+\r
+ if (pPmTimerReg)\r
+ *pPmTimerReg = Fadt->PmTmrBlk;\r
+ DEBUG ((EFI_D_ERROR, "PmTimer Reg 0x%x\n", Fadt->PmTmrBlk));\r
+\r
+ if (pResetReg)\r
+ *pResetReg = (UINTN)Fadt->ResetReg.Address;\r
+ DEBUG ((EFI_D_ERROR, "Reset Reg 0x%lx\n", Fadt->ResetReg.Address));\r
+\r
+ if (pResetValue)\r
+ *pResetValue = Fadt->ResetValue;\r
+ DEBUG ((EFI_D_ERROR, "Reset Value 0x%x\n", Fadt->ResetValue));\r
+\r
+ if (pPmEvtReg != NULL) {\r
+ *pPmEvtReg = Fadt->Pm1aEvtBlk;\r
+ DEBUG ((EFI_D_INFO, "PmEvt Reg 0x%x\n", Fadt->Pm1aEvtBlk));\r
+ }\r
+\r
+ if (pPmGpeEnReg != NULL) {\r
+ *pPmGpeEnReg = Fadt->Gpe0Blk + Fadt->Gpe0BlkLen / 2;\r
+ DEBUG ((EFI_D_INFO, "PmGpeEn Reg 0x%x\n", *pPmGpeEnReg));\r
+ }\r
+ return RETURN_SUCCESS;\r
+ }\r
+ }\r
+ }\r
+\r
+ return RETURN_NOT_FOUND;\r