-**/\r
-EFI_STATUS\r
-PublishAcpiTable (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_TABLE_PROTOCOL *AcpiTable;\r
- UINTN TableKey;\r
- EFI_ACPI_DESCRIPTION_HEADER *Table;\r
- UINTN TableSize;\r
-\r
- Status = GetSectionFromFv (\r
- &gEfiCallerIdGuid,\r
- EFI_SECTION_RAW,\r
- 0,\r
- (VOID **) &Table,\r
- &TableSize\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Update Table version before measuring it to PCR\r
- //\r
- Status = UpdatePPVersion(Table, (CHAR8 *)PcdGetPtr(PcdTcgPhysicalPresenceInterfaceVer));\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Measure to PCR[0] with event EV_POST_CODE ACPI DATA\r
- //\r
- TpmMeasureAndLogData(\r
- 0,\r
- EV_POST_CODE,\r
- EV_POSTCODE_INFO_ACPI_DATA,\r
- ACPI_DATA_LEN,\r
- Table,\r
- TableSize\r
- );\r
-\r
-\r
- ASSERT (Table->OemTableId == SIGNATURE_64 ('T', 'p', 'm', '2', 'T', 'a', 'b', 'l'));\r
- CopyMem (Table->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (Table->OemId) );\r
- mTcgNvs = AssignOpRegion (Table, SIGNATURE_32 ('T', 'N', 'V', 'S'), (UINT16) sizeof (TCG_NVS));\r
- ASSERT (mTcgNvs != NULL);\r
-\r
- //\r
- // Publish the TPM ACPI table. Table is re-checksumed.\r
- //\r
- Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTable);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- TableKey = 0;\r
- Status = AcpiTable->InstallAcpiTable (\r
- AcpiTable,\r
- Table,\r
- TableSize,\r
- &TableKey\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Publish TPM2 ACPI table\r
-\r
- @retval EFI_SUCCESS The TPM2 ACPI table is published successfully.\r
- @retval Others The TPM2 ACPI table is not published.\r
-\r
-**/\r
-EFI_STATUS\r
-PublishTpm2 (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_ACPI_TABLE_PROTOCOL *AcpiTable;\r
- UINTN TableKey;\r
- UINT64 OemTableId;\r
- EFI_TPM2_ACPI_CONTROL_AREA *ControlArea;\r
- PTP_INTERFACE_TYPE InterfaceType;\r
-\r
- //\r
- // Measure to PCR[0] with event EV_POST_CODE ACPI DATA\r
- //\r
- TpmMeasureAndLogData(\r
- 0,\r
- EV_POST_CODE,\r
- EV_POSTCODE_INFO_ACPI_DATA,\r
- ACPI_DATA_LEN,\r
- &mTpm2AcpiTemplate,\r
- sizeof(mTpm2AcpiTemplate)\r
- );\r
-\r
- InterfaceType = GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
- switch (InterfaceType) {\r
- case PtpInterfaceCrb:\r
- mTpm2AcpiTemplate.StartMethod = EFI_TPM2_ACPI_TABLE_START_METHOD_COMMAND_RESPONSE_BUFFER_INTERFACE;\r
- mTpm2AcpiTemplate.AddressOfControlArea = PcdGet64 (PcdTpmBaseAddress) + 0x40;\r
- ControlArea = (EFI_TPM2_ACPI_CONTROL_AREA *)(UINTN)mTpm2AcpiTemplate.AddressOfControlArea;\r
- ControlArea->CommandSize = 0xF80;\r
- ControlArea->ResponseSize = 0xF80;\r
- ControlArea->Command = PcdGet64 (PcdTpmBaseAddress) + 0x80;\r
- ControlArea->Response = PcdGet64 (PcdTpmBaseAddress) + 0x80;\r
- break;\r
- case PtpInterfaceFifo:\r
- case PtpInterfaceTis:\r
- break;\r
- default:\r
- DEBUG((EFI_D_ERROR, "TPM2 InterfaceType get error! %d\n", InterfaceType));\r
- break;\r