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
{\r
UINT32 MostRecentRequest;\r
UINT32 Response;\r
+ UINT32 OperationRequest;\r
+ UINT32 RequestParameter;\r
+\r
\r
if (mTcgNvs->PhysicalPresence.Parameter == TCG_ACPI_FUNCTION_RETURN_REQUEST_RESPONSE_TO_OS) {\r
mTcgNvs->PhysicalPresence.ReturnCode = Tcg2PhysicalPresenceLibReturnOperationResponseToOsFunction (\r
return EFI_SUCCESS;\r
} else if ((mTcgNvs->PhysicalPresence.Parameter == TCG_ACPI_FUNCTION_SUBMIT_REQUEST_TO_BIOS) \r
|| (mTcgNvs->PhysicalPresence.Parameter == TCG_ACPI_FUNCTION_SUBMIT_REQUEST_TO_BIOS_2)) {\r
- mTcgNvs->PhysicalPresence.ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (\r
- mTcgNvs->PhysicalPresence.Request,\r
- mTcgNvs->PhysicalPresence.RequestParameter\r
+\r
+ OperationRequest = mTcgNvs->PhysicalPresence.Request;\r
+ RequestParameter = mTcgNvs->PhysicalPresence.RequestParameter;\r
+ mTcgNvs->PhysicalPresence.ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunctionEx (\r
+ &OperationRequest,\r
+ &RequestParameter\r
);\r
+ mTcgNvs->PhysicalPresence.Request = OperationRequest;\r
+ mTcgNvs->PhysicalPresence.RequestParameter = RequestParameter;\r
} else if (mTcgNvs->PhysicalPresence.Parameter == TCG_ACPI_FUNCTION_GET_USER_CONFIRMATION_STATUS_FOR_REQUEST) {\r
- mTcgNvs->PhysicalPresence.ReturnCode = Tcg2PhysicalPresenceLibGetUserConfirmationStatusFunction (mTcgNvs->PhysicalPresence.Request);\r
- } \r
+ mTcgNvs->PhysicalPresence.ReturnCode = Tcg2PhysicalPresenceLibGetUserConfirmationStatusFunction (mTcgNvs->PPRequestUserConfirm);\r
+ }\r
\r
return EFI_SUCCESS;\r
}\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