InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
InterfaceCapability.Uint32 = MmioRead32 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);\r
\r
+ if (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_TIS) {\r
+ return PtpInterfaceTis;\r
+ }\r
+\r
if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) &&\r
(InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) &&\r
(InterfaceId.Bits.CapCRB != 0)) {\r
return PtpInterfaceCrb;\r
}\r
+\r
if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO) &&\r
(InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO) &&\r
(InterfaceId.Bits.CapFIFO != 0) &&\r
(InterfaceCapability.Bits.InterfaceVersion == INTERFACE_CAPABILITY_INTERFACE_VERSION_PTP)) {\r
return PtpInterfaceFifo;\r
}\r
- return PtpInterfaceTis;\r
+\r
+ //\r
+ // No Ptp interface available\r
+ //\r
+ return PtpInterfaceMax;\r
}\r
\r
EFI_TPM2_ACPI_TABLE mTpm2AcpiTemplate = {\r
return (VOID *) (UINTN) MemoryAddress;\r
}\r
\r
+/**\r
+ Patch version string of Physical Presence interface supported by platform. The initial string tag in TPM \r
+ACPI table is "$PV".\r
+\r
+ @param[in, out] Table The TPM item in ACPI table.\r
+ @param[in] PPVer Version string of Physical Presence interface supported by platform.\r
+\r
+ @return The allocated address for the found region.\r
+\r
+**/\r
+EFI_STATUS\r
+UpdatePPVersion (\r
+ EFI_ACPI_DESCRIPTION_HEADER *Table,\r
+ CHAR8 *PPVer\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINT8 *DataPtr;\r
+\r
+ //\r
+ // Patch some pointers for the ASL code before loading the SSDT.\r
+ //\r
+ for (DataPtr = (UINT8 *)(Table + 1);\r
+ DataPtr <= (UINT8 *) ((UINT8 *) Table + Table->Length - PHYSICAL_PRESENCE_VERSION_SIZE);\r
+ DataPtr += 1) {\r
+ if (AsciiStrCmp((CHAR8 *)DataPtr, PHYSICAL_PRESENCE_VERSION_TAG) == 0) {\r
+ Status = AsciiStrCpyS((CHAR8 *)DataPtr, PHYSICAL_PRESENCE_VERSION_SIZE, PPVer);\r
+ DEBUG((EFI_D_INFO, "TPM2 Physical Presence Interface Version update status 0x%x\n", Status));\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ return EFI_NOT_FOUND;\r
+}\r
+\r
/**\r
Initialize and publish TPM items in ACPI table.\r
\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
ASSERT (mTcgNvs != NULL);\r
\r
//\r
- // Publish the TPM ACPI table\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
case PtpInterfaceTis:\r
break;\r
default:\r
+ DEBUG((EFI_D_ERROR, "TPM2 InterfaceType get error! %d\n", InterfaceType));\r
break;\r
}\r
\r