Remove the use of the IoLib and Mmioxx() calls to detect dTPM. This module calls the Tpm12DeviceLib to detect a TPM and the implementation of the Tpm12DeviceLib for dTPM performs the same Mmioxx() calls to detect a dTPM. This change makes this module more generic and portable by maximizing the use of the Tpm12DeviceLib abstraction for TPM detection. Cc: Chao Zhang <chao.b.zhang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Michael Kinney <michael.d.kinney@intel.com> Reviewed-by: Chao Zhang <chao.b.zhang@intel.com> Reviewed-by: Jiewen Yao <jiewen.yao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19724 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   TPM1.2/dTPM2.0 auto detection.
 | |
| 
 | |
| Copyright (c) 2013 - 2016, 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 
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| 
 | |
| #include <PiPei.h>
 | |
| #include <Ppi/ReadOnlyVariable2.h>
 | |
| 
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/PeiServicesLib.h>
 | |
| #include <Library/PcdLib.h>
 | |
| #include <Library/Tpm12DeviceLib.h>
 | |
| #include <Library/Tpm12CommandLib.h>
 | |
| #include <IndustryStandard/Tpm12.h>
 | |
| 
 | |
| #include "TrEEConfigNvData.h"
 | |
| 
 | |
| /**
 | |
|   This routine check both SetupVariable and real TPM device, and return final TpmDevice configuration.
 | |
| 
 | |
|   @param  SetupTpmDevice  TpmDevice configuration in setup driver
 | |
| 
 | |
|   @return TpmDevice configuration
 | |
| **/
 | |
| UINT8
 | |
| DetectTpmDevice (
 | |
|   IN UINT8 SetupTpmDevice
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS                        Status;
 | |
|   EFI_BOOT_MODE                     BootMode;
 | |
|   TREE_DEVICE_DETECTION             TrEEDeviceDetection;
 | |
|   EFI_PEI_READ_ONLY_VARIABLE2_PPI   *VariablePpi;
 | |
|   UINTN                             Size;
 | |
| 
 | |
|   Status = PeiServicesGetBootMode (&BootMode);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|   //
 | |
|   // In S3, we rely on normal boot Detection, because we save to ReadOnly Variable in normal boot.
 | |
|   //
 | |
|   if (BootMode == BOOT_ON_S3_RESUME) {
 | |
|     DEBUG ((EFI_D_INFO, "DetectTpmDevice: S3 mode\n"));
 | |
| 
 | |
|     Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi);
 | |
|     ASSERT_EFI_ERROR (Status);
 | |
| 
 | |
|     Size = sizeof(TREE_DEVICE_DETECTION);
 | |
|     ZeroMem (&TrEEDeviceDetection, sizeof(TrEEDeviceDetection));
 | |
|     Status = VariablePpi->GetVariable (
 | |
|                             VariablePpi,
 | |
|                             TREE_DEVICE_DETECTION_NAME,
 | |
|                             &gTrEEConfigFormSetGuid,
 | |
|                             NULL,
 | |
|                             &Size,
 | |
|                             &TrEEDeviceDetection
 | |
|                             );
 | |
|     if (!EFI_ERROR (Status) &&
 | |
|         (TrEEDeviceDetection.TpmDeviceDetected >= TPM_DEVICE_MIN) &&
 | |
|         (TrEEDeviceDetection.TpmDeviceDetected <= TPM_DEVICE_MAX)) {
 | |
|       DEBUG ((EFI_D_ERROR, "TpmDevice from DeviceDetection: %x\n", TrEEDeviceDetection.TpmDeviceDetected));
 | |
|       return TrEEDeviceDetection.TpmDeviceDetected;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   DEBUG ((EFI_D_INFO, "DetectTpmDevice:\n"));
 | |
| 
 | |
|   // dTPM available and not disabled by setup
 | |
|   // We need check if it is TPM1.2 or TPM2.0
 | |
|   // So try TPM1.2 command at first
 | |
| 
 | |
|   Status = Tpm12RequestUseTpm ();
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     //
 | |
|     // dTPM not available
 | |
|     //
 | |
|     return TPM_DEVICE_NULL;
 | |
|   }
 | |
| 
 | |
|   if (BootMode == BOOT_ON_S3_RESUME) {
 | |
|     Status = Tpm12Startup (TPM_ST_STATE);
 | |
|   } else {
 | |
|     Status = Tpm12Startup (TPM_ST_CLEAR);
 | |
|   }
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return TPM_DEVICE_2_0_DTPM;
 | |
|   }
 | |
| 
 | |
|   // NO initialization needed again.
 | |
|   Status = PcdSet8S (PcdTpmInitializationPolicy, 0);
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
|   return TPM_DEVICE_1_2;
 | |
| }
 |