]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigImpl.c
index 0d2956074a40554a9125411ea4ab3b068c8d15c6..6eb04c0144487372679031a111d9e951b3b7f975 100644 (file)
@@ -2,28 +2,28 @@
   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
-http://opensource.org/licenses/bsd-license.php\r
-\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
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #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
-#define EFI_TCG2_EVENT_LOG_FORMAT_ALL   (EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 | EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)\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
 \r
-TCG2_CONFIG_PRIVATE_DATA         *mTcg2ConfigPrivateDate;\r
-TCG2_CONFIG_PRIVATE_DATA         mTcg2ConfigPrivateDateTemplate = {\r
+TCG2_CONFIG_PRIVATE_DATA  *mTcg2ConfigPrivateDate;\r
+TCG2_CONFIG_PRIVATE_DATA  mTcg2ConfigPrivateDateTemplate = {\r
   TCG2_CONFIG_PRIVATE_DATA_SIGNATURE,\r
   {\r
     Tcg2ExtractConfig,\r
@@ -32,14 +32,14 @@ TCG2_CONFIG_PRIVATE_DATA         mTcg2ConfigPrivateDateTemplate = {
   }\r
 };\r
 \r
-HII_VENDOR_DEVICE_PATH          mTcg2HiiVendorDevicePath = {\r
+HII_VENDOR_DEVICE_PATH  mTcg2HiiVendorDevicePath = {\r
   {\r
     {\r
       HARDWARE_DEVICE_PATH,\r
       HW_VENDOR_DP,\r
       {\r
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+        (UINT8)(sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
       }\r
     },\r
     TCG2_CONFIG_FORM_SET_GUID\r
@@ -47,15 +47,130 @@ HII_VENDOR_DEVICE_PATH          mTcg2HiiVendorDevicePath = {
   {\r
     END_DEVICE_PATH_TYPE,\r
     END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    { \r
-      (UINT8) (END_DEVICE_PATH_LENGTH),\r
-      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+    {\r
+      (UINT8)(END_DEVICE_PATH_LENGTH),\r
+      (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)\r
     }\r
   }\r
 };\r
 \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
+  {\r
+    return TRUE;\r
+  }\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
+  {\r
+    return TRUE;\r
+  }\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
+  {\r
+    return EFI_UNSUPPORTED;\r
+  }\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
+\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
+\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
@@ -85,13 +200,13 @@ UINT8  mCurrentPpRequest;
 EFI_STATUS\r
 EFIAPI\r
 Tcg2ExtractConfig (\r
-  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL        *This,\r
-  IN CONST EFI_STRING                            Request,\r
-       OUT EFI_STRING                            *Progress,\r
-       OUT EFI_STRING                            *Results\r
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL  *This,\r
+  IN CONST EFI_STRING                      Request,\r
+  OUT EFI_STRING                           *Progress,\r
+  OUT EFI_STRING                           *Results\r
   )\r
 {\r
-  if (Progress == NULL || Results == NULL) {\r
+  if ((Progress == NULL) || (Results == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -110,7 +225,7 @@ Tcg2ExtractConfig (
 **/\r
 EFI_STATUS\r
 SaveTcg2PpRequest (\r
-  IN UINT8                         PpRequest\r
+  IN UINT8  PpRequest\r
   )\r
 {\r
   UINT32      ReturnCode;\r
@@ -119,7 +234,7 @@ SaveTcg2PpRequest (
   ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
   if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
     mCurrentPpRequest = PpRequest;\r
-    Status = EFI_SUCCESS;\r
+    Status            = EFI_SUCCESS;\r
   } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
   } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
@@ -142,7 +257,7 @@ SaveTcg2PpRequest (
 **/\r
 EFI_STATUS\r
 SaveTcg2PpRequestParameter (\r
-  IN UINT32                        PpRequestParameter\r
+  IN UINT32  PpRequestParameter\r
   )\r
 {\r
   UINT32      ReturnCode;\r
@@ -174,8 +289,8 @@ SaveTcg2PpRequestParameter (
 **/\r
 EFI_STATUS\r
 SaveTcg2PCRBanksRequest (\r
-  IN UINTN   PCRBankIndex,\r
-  IN BOOLEAN Enable\r
+  IN UINTN    PCRBankIndex,\r
+  IN BOOLEAN  Enable\r
   )\r
 {\r
   UINT32      ReturnCode;\r
@@ -186,7 +301,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
@@ -222,18 +337,171 @@ SaveTcg2PCRBanksRequest (
 EFI_STATUS\r
 EFIAPI\r
 Tcg2RouteConfig (\r
-  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL      *This,\r
-  IN CONST EFI_STRING                          Configuration,\r
-       OUT EFI_STRING                          *Progress\r
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL  *This,\r
+  IN CONST EFI_STRING                      Configuration,\r
+  OUT EFI_STRING                           *Progress\r
   )\r
 {\r
-  if (Configuration == NULL || Progress == NULL) {\r
+  if ((Configuration == NULL) || (Progress == NULL)) {\r
     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
+  } 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
@@ -259,30 +527,83 @@ Tcg2RouteConfig (
 EFI_STATUS\r
 EFIAPI\r
 Tcg2Callback (\r
-  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL      *This,\r
-  IN     EFI_BROWSER_ACTION                    Action,\r
-  IN     EFI_QUESTION_ID                       QuestionId,\r
-  IN     UINT8                                 Type,\r
-  IN     EFI_IFR_TYPE_VALUE                    *Value,\r
-     OUT EFI_BROWSER_ACTION_REQUEST            *ActionRequest\r
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL  *This,\r
+  IN     EFI_BROWSER_ACTION                Action,\r
+  IN     EFI_QUESTION_ID                   QuestionId,\r
+  IN     UINT8                             Type,\r
+  IN     EFI_IFR_TYPE_VALUE                *Value,\r
+  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
+\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
     }\r
+\r
     if (QuestionId == KEY_TPM2_OPERATION) {\r
       return SaveTcg2PpRequest (Value->u8);\r
     }\r
+\r
     if (QuestionId == KEY_TPM2_OPERATION_PARAMETER) {\r
       return SaveTcg2PpRequestParameter (Value->u32);\r
     }\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
@@ -305,36 +626,41 @@ AppendBufferWithTpmAlgHash (
   )\r
 {\r
   switch (TpmAlgHash) {\r
-  case TPM_ALG_SHA1:\r
-    if (Buffer[0] != 0) {\r
-      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
-    }\r
-    StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
-    break;\r
-  case TPM_ALG_SHA256:\r
-    if (Buffer[0] != 0) {\r
-      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
-    }\r
-    StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
-    break;\r
-  case TPM_ALG_SHA384:\r
-    if (Buffer[0] != 0) {\r
-      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
-    }\r
-    StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
-    break;\r
-  case TPM_ALG_SHA512:\r
-    if (Buffer[0] != 0) {\r
-      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
-    }\r
-    StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
-    break;\r
-  case TPM_ALG_SM3_256:\r
-    if (Buffer[0] != 0) {\r
-      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
-    }\r
-    StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
-    break;\r
+    case TPM_ALG_SHA1:\r
+      if (Buffer[0] != 0) {\r
+        StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+      }\r
+\r
+      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
+      break;\r
+    case TPM_ALG_SHA256:\r
+      if (Buffer[0] != 0) {\r
+        StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+      }\r
+\r
+      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
+      break;\r
+    case TPM_ALG_SHA384:\r
+      if (Buffer[0] != 0) {\r
+        StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+      }\r
+\r
+      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
+      break;\r
+    case TPM_ALG_SHA512:\r
+      if (Buffer[0] != 0) {\r
+        StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+      }\r
+\r
+      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
+      break;\r
+    case TPM_ALG_SM3_256:\r
+      if (Buffer[0] != 0) {\r
+        StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
+      }\r
+\r
+      StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
+      break;\r
   }\r
 }\r
 \r
@@ -358,30 +684,39 @@ FillBufferWithBootHashAlg (
     if (Buffer[0] != 0) {\r
       StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
     }\r
+\r
     StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
   }\r
+\r
   if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {\r
     if (Buffer[0] != 0) {\r
       StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
     }\r
+\r
     StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
   }\r
+\r
   if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {\r
     if (Buffer[0] != 0) {\r
       StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
     }\r
+\r
     StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
   }\r
+\r
   if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {\r
     if (Buffer[0] != 0) {\r
       StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
     }\r
+\r
     StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
   }\r
+\r
   if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {\r
     if (Buffer[0] != 0) {\r
       StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
     }\r
+\r
     StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
   }\r
 }\r
@@ -395,26 +730,26 @@ FillBufferWithBootHashAlg (
 **/\r
 VOID\r
 SetConfigInfo (\r
-  IN OUT TCG2_CONFIGURATION_INFO         *Tcg2ConfigInfo,\r
-  IN UINT32                              TpmAlgHash\r
+  IN OUT TCG2_CONFIGURATION_INFO  *Tcg2ConfigInfo,\r
+  IN UINT32                       TpmAlgHash\r
   )\r
 {\r
   switch (TpmAlgHash) {\r
-  case TPM_ALG_SHA1:\r
-    Tcg2ConfigInfo->Sha1Supported = TRUE;\r
-    break;\r
-  case TPM_ALG_SHA256:\r
-    Tcg2ConfigInfo->Sha256Supported = TRUE;\r
-    break;\r
-  case TPM_ALG_SHA384:\r
-    Tcg2ConfigInfo->Sha384Supported = TRUE;\r
-    break;\r
-  case TPM_ALG_SHA512:\r
-    Tcg2ConfigInfo->Sha512Supported = TRUE;\r
-    break;\r
-  case TPM_ALG_SM3_256:\r
-    Tcg2ConfigInfo->Sm3Supported = TRUE;\r
-    break;\r
+    case TPM_ALG_SHA1:\r
+      Tcg2ConfigInfo->Sha1Supported = TRUE;\r
+      break;\r
+    case TPM_ALG_SHA256:\r
+      Tcg2ConfigInfo->Sha256Supported = TRUE;\r
+      break;\r
+    case TPM_ALG_SHA384:\r
+      Tcg2ConfigInfo->Sha384Supported = TRUE;\r
+      break;\r
+    case TPM_ALG_SHA512:\r
+      Tcg2ConfigInfo->Sha512Supported = TRUE;\r
+      break;\r
+    case TPM_ALG_SM3_256:\r
+      Tcg2ConfigInfo->Sm3Supported = TRUE;\r
+      break;\r
   }\r
 }\r
 \r
@@ -438,47 +773,25 @@ FillBufferWithTCG2EventLogFormat (
     if (Buffer[0] != 0) {\r
       StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
     }\r
+\r
     StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"TCG_1_2");\r
   }\r
+\r
   if ((TCG2EventLogFormat & EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) != 0) {\r
     if (Buffer[0] != 0) {\r
       StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
     }\r
+\r
     StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"TCG_2");\r
   }\r
+\r
   if ((TCG2EventLogFormat & (~EFI_TCG2_EVENT_LOG_FORMAT_ALL)) != 0) {\r
     if (Buffer[0] != 0) {\r
       StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
     }\r
-    StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"UNKNOWN");\r
-  }\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
+    StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"UNKNOWN");\r
   }\r
-  return TRUE;\r
 }\r
 \r
 /**\r
@@ -504,17 +817,19 @@ InstallTcg2ConfigForm (
   TPML_PCR_SELECTION              Pcrs;\r
   CHAR16                          TempBuffer[1024];\r
   TCG2_CONFIGURATION_INFO         Tcg2ConfigInfo;\r
+  TPM2_PTP_INTERFACE_TYPE         TpmDeviceInterfaceDetected;\r
+  BOOLEAN                         IsCmdImp = FALSE;\r
 \r
   DriverHandle = NULL;\r
   ConfigAccess = &PrivateData->ConfigAccess;\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &DriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  &mTcg2HiiVendorDevicePath,\r
-                  &gEfiHiiConfigAccessProtocolGuid,\r
-                  ConfigAccess,\r
-                  NULL\r
-                  );\r
+  Status       = gBS->InstallMultipleProtocolInterfaces (\r
+                        &DriverHandle,\r
+                        &gEfiDevicePathProtocolGuid,\r
+                        &mTcg2HiiVendorDevicePath,\r
+                        &gEfiHiiConfigAccessProtocolGuid,\r
+                        ConfigAccess,\r
+                        NULL\r
+                        );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -539,32 +854,32 @@ 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
   // Update static data\r
   //\r
   switch (PrivateData->TpmDeviceDetected) {\r
-  case TPM_DEVICE_NULL:\r
-    HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Not Found", NULL);\r
-    break;\r
-  case TPM_DEVICE_1_2:\r
-    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
-    break;\r
-  default:\r
-    HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Unknown", NULL);\r
-    break;\r
-  }\r
-\r
-  ZeroMem (&Tcg2ConfigInfo, sizeof(Tcg2ConfigInfo));\r
+    case TPM_DEVICE_NULL:\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Not Found", NULL);\r
+      break;\r
+    case TPM_DEVICE_1_2:\r
+      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", NULL);\r
+      break;\r
+    default:\r
+      HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Unknown", NULL);\r
+      break;\r
+  }\r
+\r
+  ZeroMem (&Tcg2ConfigInfo, sizeof (Tcg2ConfigInfo));\r
   Status = Tpm2GetCapabilityPcrs (&Pcrs);\r
   if (EFI_ERROR (Status)) {\r
     HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACTIVE_HASH_ALGO_CONTENT), L"[Unknown]", NULL);\r
@@ -573,37 +888,104 @@ InstallTcg2ConfigForm (
     TempBuffer[0] = 0;\r
     for (Index = 0; Index < Pcrs.count; Index++) {\r
       if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
-        AppendBufferWithTpmAlgHash (TempBuffer, sizeof(TempBuffer), Pcrs.pcrSelections[Index].hash);\r
+        AppendBufferWithTpmAlgHash (TempBuffer, sizeof (TempBuffer), Pcrs.pcrSelections[Index].hash);\r
       }\r
     }\r
+\r
     HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACTIVE_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
 \r
     TempBuffer[0] = 0;\r
     for (Index = 0; Index < Pcrs.count; Index++) {\r
-      AppendBufferWithTpmAlgHash (TempBuffer, sizeof(TempBuffer), Pcrs.pcrSelections[Index].hash);\r
+      AppendBufferWithTpmAlgHash (TempBuffer, sizeof (TempBuffer), Pcrs.pcrSelections[Index].hash);\r
       SetConfigInfo (&Tcg2ConfigInfo, Pcrs.pcrSelections[Index].hash);\r
     }\r
+\r
     HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_SUPPORTED_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
   }\r
 \r
-  FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PcdGet32 (PcdTcg2HashAlgorithmBitmap));\r
+  Status = Tpm2GetCapabilityIsCommandImplemented (TPM_CC_ChangeEPS, &IsCmdImp);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "Tpm2GetCapabilityIsCmdImpl fails %r\n", Status));\r
+  }\r
+\r
+  Tcg2ConfigInfo.ChangeEPSSupported = IsCmdImp;\r
+\r
+  FillBufferWithBootHashAlg (TempBuffer, sizeof (TempBuffer), PcdGet32 (PcdTcg2HashAlgorithmBitmap));\r
   HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_BIOS_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
 \r
   //\r
   // Tcg2 Capability\r
   //\r
-  FillBufferWithTCG2EventLogFormat (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.SupportedEventLogs);\r
+  FillBufferWithTCG2EventLogFormat (TempBuffer, sizeof (TempBuffer), PrivateData->ProtocolCapability.SupportedEventLogs);\r
   HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_SUPPORTED_EVENT_LOG_FORMAT_CONTENT), TempBuffer, NULL);\r
 \r
-  FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.HashAlgorithmBitmap);\r
+  FillBufferWithBootHashAlg (TempBuffer, sizeof (TempBuffer), PrivateData->ProtocolCapability.HashAlgorithmBitmap);\r
   HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_HASH_ALGO_BITMAP_CONTENT), TempBuffer, NULL);\r
 \r
   UnicodeSPrint (TempBuffer, sizeof (TempBuffer), L"%d", PrivateData->ProtocolCapability.NumberOfPCRBanks);\r
   HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_NUMBER_OF_PCR_BANKS_CONTENT), TempBuffer, NULL);\r
 \r
-  FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.ActivePcrBanks);\r
+  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
+\r
+          StrCatS (TempBuffer, sizeof (TempBuffer) / sizeof (CHAR16), L"PTP FIFO");\r
+        }\r
+\r
+        if (Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported) {\r
+          if (TempBuffer[0] != 0) {\r
+            StrCatS (TempBuffer, sizeof (TempBuffer) / sizeof (CHAR16), L", ");\r
+          }\r
+\r
+          StrCatS (TempBuffer, sizeof (TempBuffer) / sizeof (CHAR16), L"PTP CRB");\r
+        }\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
@@ -611,13 +993,14 @@ InstallTcg2ConfigForm (
                   TCG2_STORAGE_INFO_NAME,\r
                   &gTcg2ConfigFormSetGuid,\r
                   EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                  sizeof(Tcg2ConfigInfo),\r
+                  sizeof (Tcg2ConfigInfo),\r
                   &Tcg2ConfigInfo\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_INFO_NAME\n"));\r
+    DEBUG ((DEBUG_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_INFO_NAME\n"));\r
   }\r
-  return EFI_SUCCESS;  \r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -628,7 +1011,7 @@ InstallTcg2ConfigForm (
 **/\r
 VOID\r
 UninstallTcg2ConfigForm (\r
-  IN OUT TCG2_CONFIG_PRIVATE_DATA    *PrivateData\r
+  IN OUT TCG2_CONFIG_PRIVATE_DATA  *PrivateData\r
   )\r
 {\r
   //\r
@@ -653,6 +1036,6 @@ UninstallTcg2ConfigForm (
            );\r
     PrivateData->DriverHandle = NULL;\r
   }\r
-  \r
+\r
   FreePool (PrivateData);\r
 }\r