2 TPM1.2/dTPM2.0 auto detection.
4 Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include <Ppi/ReadOnlyVariable2.h>
13 #include <Library/BaseLib.h>
14 #include <Library/BaseMemoryLib.h>
15 #include <Library/DebugLib.h>
16 #include <Library/PeiServicesLib.h>
17 #include <Library/PcdLib.h>
18 #include <Library/Tpm12DeviceLib.h>
19 #include <Library/Tpm12CommandLib.h>
20 #include <IndustryStandard/Tpm12.h>
22 #include "Tcg2ConfigNvData.h"
23 #include "Tcg2Internal.h"
26 This routine check both SetupVariable and real TPM device, and return final TpmDevice configuration.
28 @param SetupTpmDevice TpmDevice configuration in setup driver
30 @return TpmDevice configuration
34 IN UINT8 SetupTpmDevice
38 EFI_BOOT_MODE BootMode
;
39 TCG2_DEVICE_DETECTION Tcg2DeviceDetection
;
40 EFI_PEI_READ_ONLY_VARIABLE2_PPI
*VariablePpi
;
43 Status
= PeiServicesGetBootMode (&BootMode
);
44 ASSERT_EFI_ERROR (Status
);
47 // In S3, we rely on normal boot Detection, because we save to ReadOnly Variable in normal boot.
49 if (BootMode
== BOOT_ON_S3_RESUME
) {
50 DEBUG ((EFI_D_INFO
, "DetectTpmDevice: S3 mode\n"));
52 Status
= PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid
, 0, NULL
, (VOID
**) &VariablePpi
);
53 ASSERT_EFI_ERROR (Status
);
55 Size
= sizeof(TCG2_DEVICE_DETECTION
);
56 ZeroMem (&Tcg2DeviceDetection
, sizeof(Tcg2DeviceDetection
));
57 Status
= VariablePpi
->GetVariable (
59 TCG2_DEVICE_DETECTION_NAME
,
60 &gTcg2ConfigFormSetGuid
,
65 if (!EFI_ERROR (Status
) &&
66 (Tcg2DeviceDetection
.TpmDeviceDetected
>= TPM_DEVICE_MIN
) &&
67 (Tcg2DeviceDetection
.TpmDeviceDetected
<= TPM_DEVICE_MAX
)) {
68 DEBUG ((EFI_D_ERROR
, "TpmDevice from DeviceDetection: %x\n", Tcg2DeviceDetection
.TpmDeviceDetected
));
69 return Tcg2DeviceDetection
.TpmDeviceDetected
;
73 DEBUG ((EFI_D_INFO
, "DetectTpmDevice:\n"));
75 // dTPM available and not disabled by setup
76 // We need check if it is TPM1.2 or TPM2.0
77 // So try TPM1.2 command at first
79 Status
= Tpm12RequestUseTpm ();
80 if (EFI_ERROR (Status
)) {
84 return TPM_DEVICE_NULL
;
87 if (BootMode
== BOOT_ON_S3_RESUME
) {
88 Status
= Tpm12Startup (TPM_ST_STATE
);
90 Status
= Tpm12Startup (TPM_ST_CLEAR
);
92 if (EFI_ERROR (Status
)) {
93 return TPM_DEVICE_2_0_DTPM
;
96 // NO initialization needed again.
97 Status
= PcdSet8S (PcdTpmInitializationPolicy
, 0);
98 ASSERT_EFI_ERROR (Status
);
99 return TPM_DEVICE_1_2
;