]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
SecurityPkg/Tcg: Add use case for new Perf macro
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigImpl.c
index 0d2956074a40554a9125411ea4ab3b068c8d15c6..24ce3d29e18f3120396f3d56bb4db43d3a1b02b4 100644 (file)
@@ -2,13 +2,14 @@
   HII Config Access protocol implementation of TCG2 configuration module.\r
   NOTE: This module is only for reference only, each platform should have its own setup page.\r
 \r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution.  The full text of the license may be found at \r
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
 \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 **/\r
@@ -16,8 +17,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "Tcg2ConfigImpl.h"\r
 #include <Library/PcdLib.h>\r
 #include <Library/Tpm2CommandLib.h>\r
+#include <Library/Tpm2DeviceLib.h>\r
+#include <Library/IoLib.h>\r
+\r
 #include <Guid/TpmInstance.h>\r
 \r
+#include <IndustryStandard/TpmPtp.h>\r
+\r
 #define EFI_TCG2_EVENT_LOG_FORMAT_ALL   (EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 | EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)\r
 \r
 TPM_INSTANCE_ID  mTpmInstanceId[TPM_DEVICE_MAX + 1] = TPM_INSTANCE_ID_LIST;\r
@@ -47,7 +53,7 @@ HII_VENDOR_DEVICE_PATH          mTcg2HiiVendorDevicePath = {
   {\r
     END_DEVICE_PATH_TYPE,\r
     END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    { \r
+    {\r
       (UINT8) (END_DEVICE_PATH_LENGTH),\r
       (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
     }\r
@@ -56,6 +62,113 @@ HII_VENDOR_DEVICE_PATH          mTcg2HiiVendorDevicePath = {
 \r
 UINT8  mCurrentPpRequest;\r
 \r
+/**\r
+  Return if PTP CRB is supported.\r
+\r
+  @param[in] Register                Pointer to PTP register.\r
+\r
+  @retval TRUE  PTP CRB is supported.\r
+  @retval FALSE PTP CRB is unsupported.\r
+**/\r
+BOOLEAN\r
+IsPtpCrbSupported (\r
+  IN VOID                 *Register\r
+  )\r
+{\r
+  PTP_CRB_INTERFACE_IDENTIFIER  InterfaceId;\r
+\r
+  //\r
+  // Check interface id\r
+  //\r
+  InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
+\r
+  if (((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) ||\r
+       (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) &&\r
+      (InterfaceId.Bits.CapCRB != 0)) {\r
+    return TRUE;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Return if PTP FIFO is supported.\r
+\r
+  @param[in] Register                Pointer to PTP register.\r
+\r
+  @retval TRUE  PTP FIFO is supported.\r
+  @retval FALSE PTP FIFO is unsupported.\r
+**/\r
+BOOLEAN\r
+IsPtpFifoSupported (\r
+  IN VOID                 *Register\r
+  )\r
+{\r
+  PTP_CRB_INTERFACE_IDENTIFIER  InterfaceId;\r
+\r
+  //\r
+  // Check interface id\r
+  //\r
+  InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
+\r
+  if (((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) ||\r
+       (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) &&\r
+      (InterfaceId.Bits.CapFIFO != 0)) {\r
+    return TRUE;\r
+  }\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Set PTP interface type.\r
+  Do not update PcdActiveTpmInterfaceType here because interface change only happens on next _TPM_INIT\r
+\r
+  @param[in] Register                Pointer to PTP register.\r
+  @param[in] PtpInterface            PTP interface type.\r
+\r
+  @retval EFI_SUCCESS                PTP interface type is set.\r
+  @retval EFI_INVALID_PARAMETER      PTP interface type is invalid.\r
+  @retval EFI_UNSUPPORTED            PTP interface type is unsupported.\r
+  @retval EFI_WRITE_PROTECTED        PTP interface is locked.\r
+**/\r
+EFI_STATUS\r
+SetPtpInterface (\r
+  IN VOID                 *Register,\r
+  IN UINT8                PtpInterface\r
+  )\r
+{\r
+  TPM2_PTP_INTERFACE_TYPE       PtpInterfaceCurrent;\r
+  PTP_CRB_INTERFACE_IDENTIFIER  InterfaceId;\r
+\r
+  PtpInterfaceCurrent = PcdGet8(PcdActiveTpmInterfaceType);\r
+  if ((PtpInterfaceCurrent != Tpm2PtpInterfaceFifo) &&\r
+      (PtpInterfaceCurrent != Tpm2PtpInterfaceCrb)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
+  if (InterfaceId.Bits.IntfSelLock != 0) {\r
+    return EFI_WRITE_PROTECTED;\r
+  }\r
+\r
+  switch (PtpInterface) {\r
+  case Tpm2PtpInterfaceFifo:\r
+    if (InterfaceId.Bits.CapFIFO == 0) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+    InterfaceId.Bits.InterfaceSelector = PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_FIFO;\r
+    MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId, InterfaceId.Uint32);\r
+    return EFI_SUCCESS;\r
+  case Tpm2PtpInterfaceCrb:\r
+    if (InterfaceId.Bits.CapCRB == 0) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+    InterfaceId.Bits.InterfaceSelector = PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_CRB;\r
+    MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId, InterfaceId.Uint32);\r
+    return EFI_SUCCESS;\r
+  default:\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+}\r
+\r
 /**\r
   This function allows a caller to extract the current configuration for one\r
   or more named elements from the target driver.\r
@@ -186,7 +299,7 @@ SaveTcg2PCRBanksRequest (
   } else {\r
     mTcg2ConfigPrivateDate->PCRBanksDesired &= ~(0x1 << PCRBankIndex);\r
   }\r
-  \r
+\r
   ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS, mTcg2ConfigPrivateDate->PCRBanksDesired);\r
   if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
     Status = EFI_SUCCESS;\r
@@ -231,9 +344,163 @@ Tcg2RouteConfig (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  *Progress = Configuration;\r
+\r
   return EFI_NOT_FOUND;\r
 }\r
 \r
+/**\r
+  Get HID string of TPM2 ACPI device object\r
+\r
+  @param[in]  Hid               Points to HID String Buffer.\r
+  @param[in]  Size              HID String size in bytes. Must >= TPM_HID_ACPI_SIZE\r
+\r
+  @return                       HID String get status.\r
+\r
+**/\r
+EFI_STATUS\r
+GetTpm2HID(\r
+   CHAR8 *Hid,\r
+   UINTN  Size\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINT32      ManufacturerID;\r
+  UINT32      FirmwareVersion1;\r
+  UINT32      FirmwareVersion2;\r
+  BOOLEAN     PnpHID;\r
+\r
+  PnpHID = TRUE;\r
+\r
+  ZeroMem(Hid, Size);\r
+\r
+  //\r
+  // Get Manufacturer ID\r
+  //\r
+  Status = Tpm2GetCapabilityManufactureID(&ManufacturerID);\r
+  if (!EFI_ERROR(Status)) {\r
+    DEBUG((DEBUG_INFO, "TPM_PT_MANUFACTURER 0x%08x\n", ManufacturerID));\r
+    //\r
+    // ManufacturerID defined in TCG Vendor ID Registry\r
+    // may tailed with 0x00 or 0x20\r
+    //\r
+    if ((ManufacturerID >> 24) == 0x00 || ((ManufacturerID >> 24) == 0x20)) {\r
+      //\r
+      //  HID containing PNP ID "NNN####"\r
+      //   NNN is uppercase letter for Vendor ID specified by manufacturer\r
+      //\r
+      CopyMem(Hid, &ManufacturerID, 3);\r
+    } else {\r
+      //\r
+      //  HID containing ACP ID "NNNN####"\r
+      //   NNNN is uppercase letter for Vendor ID specified by manufacturer\r
+      //\r
+      CopyMem(Hid, &ManufacturerID, 4);\r
+      PnpHID = FALSE;\r
+    }\r
+  } else {\r
+    DEBUG ((DEBUG_ERROR, "Get TPM_PT_MANUFACTURER failed %x!\n", Status));\r
+    ASSERT(FALSE);\r
+    return Status;\r
+  }\r
+\r
+  Status = Tpm2GetCapabilityFirmwareVersion(&FirmwareVersion1, &FirmwareVersion2);\r
+  if (!EFI_ERROR(Status)) {\r
+    DEBUG((DEBUG_INFO, "TPM_PT_FIRMWARE_VERSION_1 0x%x\n", FirmwareVersion1));\r
+    DEBUG((DEBUG_INFO, "TPM_PT_FIRMWARE_VERSION_2 0x%x\n", FirmwareVersion2));\r
+    //\r
+    //   #### is Firmware Version 1\r
+    //\r
+    if (PnpHID) {\r
+      AsciiSPrint(Hid + 3, TPM_HID_PNP_SIZE - 3, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 & 0x0000FFFF));\r
+    } else {\r
+      AsciiSPrint(Hid + 4, TPM_HID_ACPI_SIZE - 4, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 & 0x0000FFFF));\r
+    }\r
+\r
+  } else {\r
+    DEBUG ((DEBUG_ERROR, "Get TPM_PT_FIRMWARE_VERSION_X failed %x!\n", Status));\r
+    ASSERT(FALSE);\r
+    return Status;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  This function processes the results of changes in configuration\r
+  for TCG2 version information.\r
+\r
+  @param[in] Action             Specifies the type of action taken by the browser.\r
+                                ASSERT if the Action is not EFI_BROWSER_ACTION_SUBMITTED.\r
+  @param[in] QuestionId         A unique value which is sent to the original\r
+                                exporting driver so that it can identify the type\r
+                                of data to expect.\r
+  @param[in] Type               The type of value for the question.\r
+  @param[in] Value              A pointer to the data being sent to the original\r
+                                exporting driver.\r
+\r
+  @retval EFI_SUCCESS           The callback successfully handled the action.\r
+\r
+**/\r
+EFI_STATUS\r
+Tcg2VersionInfoCallback (\r
+  IN EFI_BROWSER_ACTION         Action,\r
+  IN EFI_QUESTION_ID            QuestionId,\r
+  IN UINT8                      Type,\r
+  IN EFI_IFR_TYPE_VALUE         *Value\r
+  )\r
+{\r
+  EFI_INPUT_KEY                 Key;\r
+  UINT64                        PcdTcg2PpiVersion;\r
+  UINT8                         PcdTpm2AcpiTableRev;\r
+\r
+  ASSERT (Action == EFI_BROWSER_ACTION_SUBMITTED);\r
+\r
+  if (QuestionId == KEY_TCG2_PPI_VERSION) {\r
+    //\r
+    // Get the PCD value after EFI_BROWSER_ACTION_SUBMITTED,\r
+    // the SetVariable to TCG2_VERSION_NAME should have been done.\r
+    // If the PCD value is not equal to the value set to variable,\r
+    // the PCD is not DynamicHii type and does not map to the setup option.\r
+    //\r
+    PcdTcg2PpiVersion = 0;\r
+    CopyMem (\r
+      &PcdTcg2PpiVersion,\r
+      PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
+      AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
+      );\r
+    if (PcdTcg2PpiVersion != Value->u64) {\r
+      CreatePopUp (\r
+        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+        &Key,\r
+        L"WARNING: PcdTcgPhysicalPresenceInterfaceVer is not DynamicHii type and does not map to this option!",\r
+        L"The version configuring by this setup option will not work!",\r
+        NULL\r
+        );\r
+    }\r
+  } else if (QuestionId == KEY_TPM2_ACPI_REVISION){\r
+    //\r
+    // Get the PCD value after EFI_BROWSER_ACTION_SUBMITTED,\r
+    // the SetVariable to TCG2_VERSION_NAME should have been done.\r
+    // If the PCD value is not equal to the value set to variable,\r
+    // the PCD is not DynamicHii type and does not map to the setup option.\r
+    //\r
+    PcdTpm2AcpiTableRev = PcdGet8 (PcdTpm2AcpiTableRev);\r
+\r
+    if (PcdTpm2AcpiTableRev != Value->u8) {\r
+      CreatePopUp (\r
+        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+        &Key,\r
+        L"WARNING: PcdTpm2AcpiTableRev is not DynamicHii type and does not map to this option!",\r
+        L"The Revision configuring by this setup option will not work!",\r
+        NULL\r
+        );\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   This function processes the results of changes in configuration.\r
 \r
@@ -267,10 +534,53 @@ Tcg2Callback (
      OUT EFI_BROWSER_ACTION_REQUEST            *ActionRequest\r
   )\r
 {\r
+  EFI_STATUS                 Status;\r
+  EFI_INPUT_KEY              Key;\r
+  CHAR8                      HidStr[16];\r
+  CHAR16                     UnHidStr[16];\r
+  TCG2_CONFIG_PRIVATE_DATA   *Private;\r
+\r
   if ((This == NULL) || (Value == NULL) || (ActionRequest == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
-  \r
+\r
+  Private = TCG2_CONFIG_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
+    //\r
+    // Update TPM2 HID info\r
+    //\r
+    if (QuestionId == KEY_TPM_DEVICE) {\r
+      Status = GetTpm2HID(HidStr, 16);\r
+\r
+      if (EFI_ERROR(Status)) {\r
+        //\r
+        //  Fail to get TPM2 HID\r
+        //\r
+        HiiSetString (Private->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_HID_CONTENT), L"Unknown", NULL);\r
+      } else {\r
+        AsciiStrToUnicodeStrS(HidStr, UnHidStr, 16);\r
+        HiiSetString (Private->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_HID_CONTENT), UnHidStr, NULL);\r
+      }\r
+    }\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
+    if (QuestionId == KEY_TPM_DEVICE_INTERFACE) {\r
+      Status = SetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress), Value->u8);\r
+      if (EFI_ERROR (Status)) {\r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"Error: Fail to set PTP interface!",\r
+          NULL\r
+          );\r
+        return EFI_DEVICE_ERROR;\r
+      }\r
+    }\r
+  }\r
+\r
   if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     if (QuestionId == KEY_TPM_DEVICE) {\r
       return EFI_SUCCESS;\r
@@ -282,7 +592,13 @@ Tcg2Callback (
       return SaveTcg2PpRequestParameter (Value->u32);\r
     }\r
     if ((QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
-      SaveTcg2PCRBanksRequest (QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0, Value->b);\r
+      return SaveTcg2PCRBanksRequest (QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0, Value->b);\r
+    }\r
+  }\r
+\r
+  if (Action == EFI_BROWSER_ACTION_SUBMITTED) {\r
+    if (QuestionId == KEY_TCG2_PPI_VERSION || QuestionId == KEY_TPM2_ACPI_REVISION) {\r
+      return Tcg2VersionInfoCallback (Action, QuestionId, Type, Value);\r
     }\r
   }\r
 \r
@@ -454,33 +770,6 @@ FillBufferWithTCG2EventLogFormat (
   }\r
 }\r
 \r
-/**\r
-  Check if buffer is all zero.\r
-\r
-  @param[in] Buffer      Buffer to be checked.\r
-  @param[in] BufferSize  Size of buffer to be checked.\r
-\r
-  @retval TRUE  Buffer is all zero.\r
-  @retval FALSE Buffer is not all zero.\r
-**/\r
-BOOLEAN\r
-IsZeroBuffer (\r
-  IN VOID  *Buffer,\r
-  IN UINTN BufferSize\r
-  )\r
-{\r
-  UINT8 *BufferData;\r
-  UINTN Index;\r
-\r
-  BufferData = Buffer;\r
-  for (Index = 0; Index < BufferSize; Index++) {\r
-    if (BufferData[Index] != 0) {\r
-      return FALSE;\r
-    }\r
-  }\r
-  return TRUE;\r
-}\r
-\r
 /**\r
   This function publish the TCG2 configuration Form for TPM device.\r
 \r
@@ -504,6 +793,7 @@ InstallTcg2ConfigForm (
   TPML_PCR_SELECTION              Pcrs;\r
   CHAR16                          TempBuffer[1024];\r
   TCG2_CONFIGURATION_INFO         Tcg2ConfigInfo;\r
+  TPM2_PTP_INTERFACE_TYPE         TpmDeviceInterfaceDetected;\r
 \r
   DriverHandle = NULL;\r
   ConfigAccess = &PrivateData->ConfigAccess;\r
@@ -539,11 +829,11 @@ InstallTcg2ConfigForm (
            &gEfiHiiConfigAccessProtocolGuid,\r
            ConfigAccess,\r
            NULL\r
-           );  \r
+           );\r
 \r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-  \r
+\r
   PrivateData->HiiHandle = HiiHandle;\r
 \r
   //\r
@@ -557,7 +847,7 @@ InstallTcg2ConfigForm (
     HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 1.2", NULL);\r
     break;\r
   case TPM_DEVICE_2_0_DTPM:\r
-    HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 2.0 (DTPM)", NULL);\r
+    HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 2.0", NULL);\r
     break;\r
   default:\r
     HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Unknown", NULL);\r
@@ -604,6 +894,60 @@ InstallTcg2ConfigForm (
   FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.ActivePcrBanks);\r
   HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_ACTIVE_PCR_BANKS_CONTENT), TempBuffer, NULL);\r
 \r
+  //\r
+  // Update TPM device interface type\r
+  //\r
+  if (PrivateData->TpmDeviceDetected == TPM_DEVICE_2_0_DTPM) {\r
+    TpmDeviceInterfaceDetected = PcdGet8(PcdActiveTpmInterfaceType);\r
+    switch (TpmDeviceInterfaceDetected) {\r
+    case Tpm2PtpInterfaceTis:\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"TIS", NULL);\r
+      break;\r
+    case Tpm2PtpInterfaceFifo:\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP FIFO", NULL);\r
+      break;\r
+    case Tpm2PtpInterfaceCrb:\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP CRB", NULL);\r
+      break;\r
+     default:\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"Unknown", NULL);\r
+      break;\r
+    }\r
+\r
+    Tcg2ConfigInfo.TpmDeviceInterfaceAttempt = TpmDeviceInterfaceDetected;\r
+    switch (TpmDeviceInterfaceDetected) {\r
+    case Tpm2PtpInterfaceTis:\r
+      Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;\r
+      Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported  = FALSE;\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"TIS", NULL);\r
+      break;\r
+    case Tpm2PtpInterfaceFifo:\r
+    case Tpm2PtpInterfaceCrb:\r
+      Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = IsPtpFifoSupported((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
+      Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported  = IsPtpCrbSupported((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
+      TempBuffer[0] = 0;\r
+      if (Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported) {\r
+        if (TempBuffer[0] != 0) {\r
+          StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L", ");\r
+        }\r
+        StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L"PTP FIFO");\r
+      }\r
+      if (Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported) {\r
+        if (TempBuffer[0] != 0) {\r
+          StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L", ");\r
+        }\r
+        StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L"PTP CRB");\r
+      }\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), TempBuffer, NULL);\r
+      break;\r
+    default:\r
+      Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;\r
+      Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported  = FALSE;\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"Unknown", NULL);\r
+      break;\r
+    }\r
+  }\r
+\r
   //\r
   // Set ConfigInfo, to control the check box.\r
   //\r
@@ -617,7 +961,8 @@ InstallTcg2ConfigForm (
   if (EFI_ERROR (Status)) {\r
     DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_INFO_NAME\n"));\r
   }\r
-  return EFI_SUCCESS;  \r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -653,6 +998,6 @@ UninstallTcg2ConfigForm (
            );\r
     PrivateData->DriverHandle = NULL;\r
   }\r
-  \r
+\r
   FreePool (PrivateData);\r
 }\r