Revision: 16776
          http://sourceforge.net/p/edk2/code/16776
Author:   vanjeff
Date:     2015-02-05 08:14:14 +0000 (Thu, 05 Feb 2015)
Log Message:
-----------
Add TpmInitializationDonePpi to TPM PEI module.

This PPI will always be installed to notify other drivers that TPM 
initialization action is done. TPM initialization may success or fail, or even 
not present.

(Sync patch r16638 from main trunk.)

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: "Yao, Jiewen" <[email protected]>
Reviewed-by: "Dong, Guo" <[email protected]>
Reviewed-by: "Chiu, Chasel" <[email protected]>

Revision Links:
--------------
    http://sourceforge.net/p/edk2/code/16638

Modified Paths:
--------------
    branches/UDK2014.SP1/SecurityPkg/Include/Ppi/TpmInitialized.h
    branches/UDK2014.SP1/SecurityPkg/SecurityPkg.dec
    branches/UDK2014.SP1/SecurityPkg/Tcg/TcgPei/TcgPei.c
    branches/UDK2014.SP1/SecurityPkg/Tcg/TcgPei/TcgPei.inf
    branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEConfig/TrEEConfigPei.inf
    branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEConfig/TrEEConfigPeim.c
    branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEPei/TrEEPei.c
    branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEPei/TrEEPei.inf

Modified: branches/UDK2014.SP1/SecurityPkg/Include/Ppi/TpmInitialized.h
===================================================================
--- branches/UDK2014.SP1/SecurityPkg/Include/Ppi/TpmInitialized.h       
2015-02-05 07:56:44 UTC (rev 16775)
+++ branches/UDK2014.SP1/SecurityPkg/Include/Ppi/TpmInitialized.h       
2015-02-05 08:14:14 UTC (rev 16776)
@@ -3,7 +3,7 @@
   initialized.  PEIMs that must execute after TPM hardware initialization
   may use this GUID in their dependency expressions.
     
-Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials 
 are licensed and made available under the terms and conditions of the BSD 
License 
 which accompanies this distribution.  The full text of the license may be 
found at 
@@ -27,4 +27,14 @@
 
 extern EFI_GUID gPeiTpmInitializedPpiGuid;
 
+///
+/// Global ID for the PEI_TPM_INITIALIZATION_DONE_PPI which always uses a NULL 
interface. 
+///
+#define PEI_TPM_INITIALIZATION_DONE_PPI_GUID \
+  { \
+    0xa030d115, 0x54dd, 0x447b, { 0x90, 0x64, 0xf2, 0x6, 0x88, 0x3d, 0x7c, 
0xcc \
+  }
+
+extern EFI_GUID gPeiTpmInitializationDonePpiGuid;
+
 #endif

Modified: branches/UDK2014.SP1/SecurityPkg/SecurityPkg.dec
===================================================================
--- branches/UDK2014.SP1/SecurityPkg/SecurityPkg.dec    2015-02-05 07:56:44 UTC 
(rev 16775)
+++ branches/UDK2014.SP1/SecurityPkg/SecurityPkg.dec    2015-02-05 08:14:14 UTC 
(rev 16776)
@@ -181,6 +181,10 @@
   # Include/Ppi/TpmInitialized.h
   gPeiTpmInitializedPpiGuid      = { 0xe9db0d58, 0xd48d, 0x47f6, { 0x9c, 0x6e, 
0x6f, 0x40, 0xe8, 0x6c, 0x7b, 0x41 }}
 
+  ## The PPI GUID for that TPM initialization is done. TPM initialization may 
be success or fail.
+  # Include/Ppi/TpmInitialized.h
+  gPeiTpmInitializationDonePpiGuid = { 0xa030d115, 0x54dd, 0x447b, { 0x90, 
0x64, 0xf2, 0x6, 0x88, 0x3d, 0x7c, 0xcc }}
+
   ## Include/Ppi/FirmwareVolumeInfoMeasurementExcluded.h
   gEfiPeiFirmwareVolumeInfoMeasurementExcludedPpiGuid = { 0x6e056ff9, 0xc695, 
0x4364, { 0x9e, 0x2c, 0x61, 0x26, 0xf5, 0xce, 0xea, 0xae } }
 

Modified: branches/UDK2014.SP1/SecurityPkg/Tcg/TcgPei/TcgPei.c
===================================================================
--- branches/UDK2014.SP1/SecurityPkg/Tcg/TcgPei/TcgPei.c        2015-02-05 
07:56:44 UTC (rev 16775)
+++ branches/UDK2014.SP1/SecurityPkg/Tcg/TcgPei/TcgPei.c        2015-02-05 
08:14:14 UTC (rev 16776)
@@ -50,6 +50,12 @@
   NULL
 };
 
+EFI_PEI_PPI_DESCRIPTOR  mTpmInitializationDonePpiList = {
+  EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
+  &gPeiTpmInitializationDonePpiGuid,
+  NULL
+};
+
 EFI_PLATFORM_FIRMWARE_BLOB *mMeasuredBaseFvInfo;
 UINT32 mMeasuredBaseFvIndex = 0;
 
@@ -737,6 +743,7 @@
   )
 {
   EFI_STATUS                        Status;
+  EFI_STATUS                        Status2;
   EFI_BOOT_MODE                     BootMode;
   TIS_TPM_HANDLE                    TpmHandle;
 
@@ -768,13 +775,13 @@
     Status = TisPcRequestUseTpm ((TIS_PC_REGISTERS_PTR)TpmHandle);
     if (EFI_ERROR (Status)) {
       DEBUG ((DEBUG_ERROR, "TPM not detected!\n"));
-      return Status;
+      goto Done;
     }
 
     if (PcdGet8 (PcdTpmInitializationPolicy) == 1) {
       Status = TpmCommStartup ((EFI_PEI_SERVICES**)PeiServices, TpmHandle, 
BootMode);
       if (EFI_ERROR (Status) ) {
-        return Status;
+        goto Done;
       }
     }
 
@@ -784,20 +791,29 @@
     if (BootMode != BOOT_ON_S3_RESUME) {
       Status = TpmCommContinueSelfTest ((EFI_PEI_SERVICES**)PeiServices, 
TpmHandle);
       if (EFI_ERROR (Status)) {
-        return Status;
+        goto Done;
       }
     }
 
+    //
+    // Only intall TpmInitializedPpi on success
+    //
     Status = PeiServicesInstallPpi (&mTpmInitializedPpiList);
     ASSERT_EFI_ERROR (Status);
   }
 
   if (mImageInMemory) {
     Status = PeimEntryMP ((EFI_PEI_SERVICES**)PeiServices);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
+    return Status;
   }
 
+Done:
+  //
+  // Always intall TpmInitializationDonePpi no matter success or fail.
+  // Other driver can know TPM initialization state by TpmInitializedPpi.
+  //
+  Status2 = PeiServicesInstallPpi (&mTpmInitializationDonePpiList);
+  ASSERT_EFI_ERROR (Status2);
+
   return Status;
 }

Modified: branches/UDK2014.SP1/SecurityPkg/Tcg/TcgPei/TcgPei.inf
===================================================================
--- branches/UDK2014.SP1/SecurityPkg/Tcg/TcgPei/TcgPei.inf      2015-02-05 
07:56:44 UTC (rev 16775)
+++ branches/UDK2014.SP1/SecurityPkg/Tcg/TcgPei/TcgPei.inf      2015-02-05 
08:14:14 UTC (rev 16776)
@@ -69,7 +69,8 @@
   gEfiPeiFirmwareVolumeInfoPpiGuid                                    ## 
SOMETIMES_CONSUMES     ## NOTIFY
   gEfiPeiFirmwareVolumeInfo2PpiGuid                                   ## 
SOMETIMES_CONSUMES     ## NOTIFY
   gEfiPeiFirmwareVolumeInfoMeasurementExcludedPpiGuid                 ## 
SOMETIMES_CONSUMES
-  gPeiTpmInitializedPpiGuid                                           ## 
PRODUCES
+  gPeiTpmInitializedPpiGuid                                           ## 
SOMETIMES_PRODUCES
+  gPeiTpmInitializationDonePpiGuid                                    ## 
PRODUCES
   gEfiEndOfPeiSignalPpiGuid                                           ## 
SOMETIMES_CONSUMES     ## NOTIFY
 
 [Pcd]

Modified: branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEConfig/TrEEConfigPei.inf
===================================================================
--- branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEConfig/TrEEConfigPei.inf   
2015-02-05 07:56:44 UTC (rev 16775)
+++ branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEConfig/TrEEConfigPei.inf   
2015-02-05 08:14:14 UTC (rev 16776)
@@ -4,7 +4,7 @@
 #  This module initializes TPM device type based on variable and detection.
 #  NOTE: This module is only for reference only, each platform should have its 
own setup page.
 #
-# Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
 # This program and the accompanying materials
 # are licensed and made available under the terms and conditions of the BSD 
License
 # which accompanies this distribution. The full text of the license may be 
found at
@@ -58,9 +58,11 @@
   ## SOMETIMES_CONSUMES ## Variable:L"TREE_DEVICE_DETECTION"
   gTrEEConfigFormSetGuid
   gEfiTpmDeviceSelectedGuid           ## PRODUCES             ## GUID    # 
Used as a PPI GUID
+  gEfiTpmDeviceInstanceNoneGuid       ## SOMETIMES_CONSUMES   ## GUID    # TPM 
device identifier
 
 [Ppis]
   gEfiPeiReadOnlyVariable2PpiGuid     ## CONSUMES
+  gPeiTpmInitializationDonePpiGuid    ## SOMETIMES_PRODUCES
 
 [Pcd]
   gEfiSecurityPkgTokenSpaceGuid.PcdTpmInstanceGuid                 ## PRODUCES

Modified: branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEConfig/TrEEConfigPeim.c
===================================================================
--- branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEConfig/TrEEConfigPeim.c    
2015-02-05 07:56:44 UTC (rev 16775)
+++ branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEConfig/TrEEConfigPeim.c    
2015-02-05 08:14:14 UTC (rev 16776)
@@ -1,7 +1,7 @@
 /** @file
   The module entry point for TrEE configuration module.
 
-Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
 This program and the accompanying materials 
 are licensed and made available under the terms and conditions of the BSD 
License 
 which accompanies this distribution.  The full text of the license may be 
found at 
@@ -25,6 +25,7 @@
 #include <Library/PcdLib.h>
 
 #include <Ppi/ReadOnlyVariable2.h>
+#include <Ppi/TpmInitialized.h>
 #include <Protocol/TrEEProtocol.h>
 
 #include "TrEEConfigNvData.h"
@@ -37,6 +38,12 @@
   NULL
 };
 
+EFI_PEI_PPI_DESCRIPTOR  mTpmInitializationDonePpiList = {
+  EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
+  &gPeiTpmInitializationDonePpiGuid,
+  NULL
+};
+
 /**
   This routine check both SetupVariable and real TPM device, and return final 
TpmDevice configuration.
 
@@ -67,6 +74,7 @@
 {
   UINTN                           Size;
   EFI_STATUS                      Status;
+  EFI_STATUS                      Status2;
   EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi;
   TREE_CONFIGURATION              TrEEConfiguration;
   UINTN                           Index;
@@ -136,5 +144,15 @@
   Status = PeiServicesInstallPpi (&gTpmSelectedPpi);
   ASSERT_EFI_ERROR (Status);
 
+  //
+  // Even if no TPM is selected or detected, we still need intall 
TpmInitializationDonePpi.
+  // Because TcgPei or TrEEPei will not run, but we still need a way to notify 
other driver.
+  // Other driver can know TPM initialization state by TpmInitializedPpi.
+  //
+  if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), 
&gEfiTpmDeviceInstanceNoneGuid)) {
+    Status2 = PeiServicesInstallPpi (&mTpmInitializationDonePpiList);
+    ASSERT_EFI_ERROR (Status2);
+  }
+
   return Status;
 }

Modified: branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEPei/TrEEPei.c
===================================================================
--- branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEPei/TrEEPei.c      2015-02-05 
07:56:44 UTC (rev 16775)
+++ branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEPei/TrEEPei.c      2015-02-05 
08:14:14 UTC (rev 16776)
@@ -62,6 +62,12 @@
   NULL
 };
 
+EFI_PEI_PPI_DESCRIPTOR  mTpmInitializationDonePpiList = {
+  EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
+  &gPeiTpmInitializationDonePpiGuid,
+  NULL
+};
+
 EFI_PLATFORM_FIRMWARE_BLOB *mMeasuredBaseFvInfo;
 UINT32 mMeasuredBaseFvIndex = 0;
 
@@ -621,6 +627,7 @@
   )
 {
   EFI_STATUS                        Status;
+  EFI_STATUS                        Status2;
   EFI_BOOT_MODE                     BootMode;
 
   if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), 
&gEfiTpmDeviceInstanceNoneGuid) ||
@@ -629,15 +636,6 @@
     return EFI_UNSUPPORTED;
   }
 
-  //
-  // Update for Performance optimization
-  //
-  Status = Tpm2RequestUseTpm ();
-  if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "TPM not detected!\n"));
-    return Status;
-  }
-
   Status = PeiServicesGetBootMode (&BootMode);
   ASSERT_EFI_ERROR (Status);
 
@@ -658,6 +656,12 @@
     //
     // Initialize TPM device
     //
+    Status = Tpm2RequestUseTpm ();
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "TPM2 not detected!\n"));
+      goto Done;
+    }
+
     if (PcdGet8 (PcdTpm2InitializationPolicy) == 1) {
       if (BootMode == BOOT_ON_S3_RESUME) {
         Status = Tpm2Startup (TPM_SU_STATE);
@@ -668,7 +672,7 @@
         Status = Tpm2Startup (TPM_SU_CLEAR);
       }
       if (EFI_ERROR (Status) ) {
-        return Status;
+        goto Done;
       }
     }
 
@@ -679,21 +683,30 @@
       if (PcdGet8 (PcdTpm2SelfTestPolicy) == 1) {
         Status = Tpm2SelfTest (NO);
         if (EFI_ERROR (Status)) {
-          return Status;
+          goto Done;
         }
       }
     }
 
+    //
+    // Only intall TpmInitializedPpi on success
+    //
     Status = PeiServicesInstallPpi (&mTpmInitializedPpiList);
     ASSERT_EFI_ERROR (Status);
   }
 
   if (mImageInMemory) {
     Status = PeimEntryMP ((EFI_PEI_SERVICES**)PeiServices);
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
+    return Status;
   }
 
+Done:
+  //
+  // Always intall TpmInitializationDonePpi no matter success or fail.
+  // Other driver can know TPM initialization state by TpmInitializedPpi.
+  //
+  Status2 = PeiServicesInstallPpi (&mTpmInitializationDonePpiList);
+  ASSERT_EFI_ERROR (Status2);
+
   return Status;
 }

Modified: branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEPei/TrEEPei.inf
===================================================================
--- branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEPei/TrEEPei.inf    2015-02-05 
07:56:44 UTC (rev 16775)
+++ branches/UDK2014.SP1/SecurityPkg/Tcg/TrEEPei/TrEEPei.inf    2015-02-05 
08:14:14 UTC (rev 16776)
@@ -64,7 +64,8 @@
   gEfiPeiFirmwareVolumeInfoPpiGuid                                     ## 
SOMETIMES_CONSUMES     ## NOTIFY
   gEfiPeiFirmwareVolumeInfo2PpiGuid                                    ## 
SOMETIMES_CONSUMES     ## NOTIFY
   gEfiPeiFirmwareVolumeInfoMeasurementExcludedPpiGuid                  ## 
SOMETIMES_CONSUMES
-  gPeiTpmInitializedPpiGuid                                            ## 
PRODUCES
+  gPeiTpmInitializedPpiGuid                                            ## 
SOMETIMES_PRODUCES
+  gPeiTpmInitializationDonePpiGuid                                     ## 
PRODUCES
   gEfiEndOfPeiSignalPpiGuid                                            ## 
SOMETIMES_CONSUMES     ## NOTIFY
 
 [Pcd]


------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to