]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/TrEEConfig/TpmDetection.c
Fix current TPM device string missing. Use efivarstore instead of varstor, remove...
[mirror_edk2.git] / SecurityPkg / Tcg / TrEEConfig / TpmDetection.c
index b8aab1ffd17d00e3c16bb07e3efddf69e51ac2f3..ce7a9a1974c77f098502e5b47e2aca264a300691 100644 (file)
@@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 \r
 #include <PiPei.h>\r
+#include <Ppi/ReadOnlyVariable2.h>\r
 \r
 #include <Library/BaseLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
@@ -64,25 +65,47 @@ DetectTpmDevice (
 {\r
   EFI_STATUS                        Status;\r
   EFI_BOOT_MODE                     BootMode;\r
+  TREE_DEVICE_DETECTION             TrEEDeviceDetection;\r
+  EFI_PEI_READ_ONLY_VARIABLE2_PPI   *VariablePpi;\r
+  UINTN                             Size;\r
+\r
+  if (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm)) {\r
+    DEBUG ((EFI_D_ERROR, "DetectTpmDevice: Tpm is hide\n"));\r
+    return TPM_DEVICE_NULL;\r
+  }\r
 \r
   Status = PeiServicesGetBootMode (&BootMode);\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
-  // In S3, we rely on Setup option, because we save to Setup in normal boot.\r
+  // In S3, we rely on normal boot Detection, because we save to ReadOnly Variable in normal boot.\r
   //\r
   if (BootMode == BOOT_ON_S3_RESUME) {\r
     DEBUG ((EFI_D_ERROR, "DetectTpmDevice: S3 mode\n"));\r
-    return SetupTpmDevice;\r
-  }\r
 \r
-  if (PcdGetBool (PcdHideTpmSupport) && PcdGetBool (PcdHideTpm)) {\r
-    DEBUG ((EFI_D_ERROR, "DetectTpmDevice: Tpm is hide\n"));\r
-    return TPM_DEVICE_NULL;\r
+    Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi);\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    Size = sizeof(TREE_DEVICE_DETECTION);\r
+    ZeroMem (&TrEEDeviceDetection, sizeof(TrEEDeviceDetection));\r
+    Status = VariablePpi->GetVariable (\r
+                            VariablePpi,\r
+                            TREE_DEVICE_DETECTION_NAME,\r
+                            &gTrEEConfigFormSetGuid,\r
+                            NULL,\r
+                            &Size,\r
+                            &TrEEDeviceDetection\r
+                            );\r
+    if (!EFI_ERROR (Status) &&\r
+        (TrEEDeviceDetection.TpmDeviceDetected >= TPM_DEVICE_MIN) &&\r
+        (TrEEDeviceDetection.TpmDeviceDetected <= TPM_DEVICE_MAX)) {\r
+      DEBUG ((EFI_D_ERROR, "TpmDevice from DeviceDetection: %x\n", TrEEDeviceDetection.TpmDeviceDetected));\r
+      return TrEEDeviceDetection.TpmDeviceDetected;\r
+    }\r
   }\r
 \r
   DEBUG ((EFI_D_ERROR, "DetectTpmDevice:\n"));\r
-  if ((!IsDtpmPresent ()) || (SetupTpmDevice == TPM_DEVICE_NULL)) {\r
+  if (!IsDtpmPresent ()) {\r
     // dTPM not available\r
     return TPM_DEVICE_NULL;\r
   }\r
@@ -96,7 +119,11 @@ DetectTpmDevice (
     return TPM_DEVICE_2_0_DTPM;\r
   }\r
 \r
-  Status = Tpm12Startup (TPM_ST_CLEAR);\r
+  if (BootMode == BOOT_ON_S3_RESUME) {\r
+    Status = Tpm12Startup (TPM_ST_STATE);\r
+  } else {\r
+    Status = Tpm12Startup (TPM_ST_CLEAR);\r
+  }\r
   if (EFI_ERROR (Status)) {\r
     return TPM_DEVICE_2_0_DTPM;\r
   }\r