]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
OvmfPkg/Csm/LegacyBiosDxe: Update to make it build for OVMF
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigImpl.c
index ecd7ab981a3d126f465de3c3dcef3ff12b80fee9..baa8fcd08d89a0819fe24c73873bbf4f0c5fa58b 100644 (file)
@@ -2,21 +2,18 @@
   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 - 2017, 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
 #include <IndustryStandard/TpmPtp.h>\r
@@ -50,7 +47,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
@@ -59,46 +56,11 @@ HII_VENDOR_DEVICE_PATH          mTcg2HiiVendorDevicePath = {
 \r
 UINT8  mCurrentPpRequest;\r
 \r
-/**\r
-  Return PTP interface type.\r
-\r
-  @param[in] Register                Pointer to PTP register.\r
-\r
-  @return PTP interface type.\r
-**/\r
-UINT8\r
-GetPtpInterface (\r
-  IN VOID *Register\r
-  )\r
-{\r
-  PTP_CRB_INTERFACE_IDENTIFIER  InterfaceId;\r
-  PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;\r
-\r
-  //\r
-  // Check interface id\r
-  //\r
-  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_CRB) &&\r
-      (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) &&\r
-      (InterfaceId.Bits.CapCRB != 0)) {\r
-    return TPM_DEVICE_INTERFACE_PTP_CRB;\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 TPM_DEVICE_INTERFACE_PTP_FIFO;\r
-  }\r
-  return TPM_DEVICE_INTERFACE_TIS;\r
-}\r
-\r
 /**\r
   Return if PTP CRB is supported.\r
 \r
   @param[in] Register                Pointer to PTP register.\r
-  \r
+\r
   @retval TRUE  PTP CRB is supported.\r
   @retval FALSE PTP CRB is unsupported.\r
 **/\r
@@ -126,7 +88,7 @@ IsPtpCrbSupported (
   Return if PTP FIFO is supported.\r
 \r
   @param[in] Register                Pointer to PTP register.\r
-  \r
+\r
   @retval TRUE  PTP FIFO is supported.\r
   @retval FALSE PTP FIFO is unsupported.\r
 **/\r
@@ -152,10 +114,11 @@ IsPtpFifoSupported (
 \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
+\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
@@ -167,12 +130,12 @@ SetPtpInterface (
   IN UINT8                PtpInterface\r
   )\r
 {\r
-  UINT8                         PtpInterfaceCurrent;\r
+  TPM2_PTP_INTERFACE_TYPE       PtpInterfaceCurrent;\r
   PTP_CRB_INTERFACE_IDENTIFIER  InterfaceId;\r
 \r
-  PtpInterfaceCurrent = GetPtpInterface (Register);\r
-  if ((PtpInterfaceCurrent != TPM_DEVICE_INTERFACE_PTP_FIFO) && \r
-      (PtpInterfaceCurrent != TPM_DEVICE_INTERFACE_PTP_CRB)) {\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
@@ -181,14 +144,14 @@ SetPtpInterface (
   }\r
 \r
   switch (PtpInterface) {\r
-  case TPM_DEVICE_INTERFACE_PTP_FIFO:\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 TPM_DEVICE_INTERFACE_PTP_CRB:\r
+  case Tpm2PtpInterfaceCrb:\r
     if (InterfaceId.Bits.CapCRB == 0) {\r
       return EFI_UNSUPPORTED;\r
     }\r
@@ -330,7 +293,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
@@ -375,6 +338,8 @@ Tcg2RouteConfig (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  *Progress = Configuration;\r
+\r
   return EFI_NOT_FOUND;\r
 }\r
 \r
@@ -441,9 +406,9 @@ GetTpm2HID(
     //   #### 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
+      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
+      AsciiSPrint(Hid + 4, TPM_HID_ACPI_SIZE - 4, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 & 0x0000FFFF));\r
     }\r
 \r
   } else {\r
@@ -481,6 +446,7 @@ Tcg2VersionInfoCallback (
 {\r
   EFI_INPUT_KEY                 Key;\r
   UINT64                        PcdTcg2PpiVersion;\r
+  UINT8                         PcdTpm2AcpiTableRev;\r
 \r
   ASSERT (Action == EFI_BROWSER_ACTION_SUBMITTED);\r
 \r
@@ -489,23 +455,41 @@ Tcg2VersionInfoCallback (
     // 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 maps to the setup option.\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 (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 maps to this option!",\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
@@ -590,7 +574,7 @@ Tcg2Callback (
       }\r
     }\r
   }\r
-  \r
+\r
   if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     if (QuestionId == KEY_TPM_DEVICE) {\r
       return EFI_SUCCESS;\r
@@ -607,7 +591,7 @@ Tcg2Callback (
   }\r
 \r
   if (Action == EFI_BROWSER_ACTION_SUBMITTED) {\r
-    if (QuestionId == KEY_TCG2_PPI_VERSION) {\r
+    if (QuestionId == KEY_TCG2_PPI_VERSION || QuestionId == KEY_TPM2_ACPI_REVISION) {\r
       return Tcg2VersionInfoCallback (Action, QuestionId, Type, Value);\r
     }\r
   }\r
@@ -803,7 +787,7 @@ InstallTcg2ConfigForm (
   TPML_PCR_SELECTION              Pcrs;\r
   CHAR16                          TempBuffer[1024];\r
   TCG2_CONFIGURATION_INFO         Tcg2ConfigInfo;\r
-  UINT8                           TpmDeviceInterfaceDetected;\r
+  TPM2_PTP_INTERFACE_TYPE         TpmDeviceInterfaceDetected;\r
 \r
   DriverHandle = NULL;\r
   ConfigAccess = &PrivateData->ConfigAccess;\r
@@ -839,11 +823,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
@@ -908,15 +892,15 @@ InstallTcg2ConfigForm (
   // Update TPM device interface type\r
   //\r
   if (PrivateData->TpmDeviceDetected == TPM_DEVICE_2_0_DTPM) {\r
-    TpmDeviceInterfaceDetected = GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
+    TpmDeviceInterfaceDetected = PcdGet8(PcdActiveTpmInterfaceType);\r
     switch (TpmDeviceInterfaceDetected) {\r
-    case TPM_DEVICE_INTERFACE_TIS:\r
+    case Tpm2PtpInterfaceTis:\r
       HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"TIS", NULL);\r
       break;\r
-    case TPM_DEVICE_INTERFACE_PTP_FIFO:\r
+    case Tpm2PtpInterfaceFifo:\r
       HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP FIFO", NULL);\r
       break;\r
-    case TPM_DEVICE_INTERFACE_PTP_CRB:\r
+    case Tpm2PtpInterfaceCrb:\r
       HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP CRB", NULL);\r
       break;\r
      default:\r
@@ -926,13 +910,13 @@ InstallTcg2ConfigForm (
 \r
     Tcg2ConfigInfo.TpmDeviceInterfaceAttempt = TpmDeviceInterfaceDetected;\r
     switch (TpmDeviceInterfaceDetected) {\r
-    case TPM_DEVICE_INTERFACE_TIS:\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 TPM_DEVICE_INTERFACE_PTP_FIFO:\r
-    case TPM_DEVICE_INTERFACE_PTP_CRB:\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
@@ -971,7 +955,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
@@ -1007,6 +992,6 @@ UninstallTcg2ConfigForm (
            );\r
     PrivateData->DriverHandle = NULL;\r
   }\r
-  \r
+\r
   FreePool (PrivateData);\r
 }\r