]> git.proxmox.com Git - mirror_edk2.git/blob - SecurityPkg/Tcg/Tcg2Config/TpmDetection.c
SecurityPkg: Tcg2Dxe: Report correct FinalEventLog size
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / TpmDetection.c
1 /** @file
2 TPM1.2/dTPM2.0 auto detection.
3
4 Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15
16 #include <PiPei.h>
17 #include <Ppi/ReadOnlyVariable2.h>
18
19 #include <Library/BaseLib.h>
20 #include <Library/BaseMemoryLib.h>
21 #include <Library/DebugLib.h>
22 #include <Library/PeiServicesLib.h>
23 #include <Library/PcdLib.h>
24 #include <Library/Tpm12DeviceLib.h>
25 #include <Library/Tpm12CommandLib.h>
26 #include <IndustryStandard/Tpm12.h>
27
28 #include "Tcg2ConfigNvData.h"
29
30 /**
31 This routine check both SetupVariable and real TPM device, and return final TpmDevice configuration.
32
33 @param SetupTpmDevice TpmDevice configuration in setup driver
34
35 @return TpmDevice configuration
36 **/
37 UINT8
38 DetectTpmDevice (
39 IN UINT8 SetupTpmDevice
40 )
41 {
42 EFI_STATUS Status;
43 EFI_BOOT_MODE BootMode;
44 TCG2_DEVICE_DETECTION Tcg2DeviceDetection;
45 EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi;
46 UINTN Size;
47
48 Status = PeiServicesGetBootMode (&BootMode);
49 ASSERT_EFI_ERROR (Status);
50
51 //
52 // In S3, we rely on normal boot Detection, because we save to ReadOnly Variable in normal boot.
53 //
54 if (BootMode == BOOT_ON_S3_RESUME) {
55 DEBUG ((EFI_D_INFO, "DetectTpmDevice: S3 mode\n"));
56
57 Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi);
58 ASSERT_EFI_ERROR (Status);
59
60 Size = sizeof(TCG2_DEVICE_DETECTION);
61 ZeroMem (&Tcg2DeviceDetection, sizeof(Tcg2DeviceDetection));
62 Status = VariablePpi->GetVariable (
63 VariablePpi,
64 TCG2_DEVICE_DETECTION_NAME,
65 &gTcg2ConfigFormSetGuid,
66 NULL,
67 &Size,
68 &Tcg2DeviceDetection
69 );
70 if (!EFI_ERROR (Status) &&
71 (Tcg2DeviceDetection.TpmDeviceDetected >= TPM_DEVICE_MIN) &&
72 (Tcg2DeviceDetection.TpmDeviceDetected <= TPM_DEVICE_MAX)) {
73 DEBUG ((EFI_D_ERROR, "TpmDevice from DeviceDetection: %x\n", Tcg2DeviceDetection.TpmDeviceDetected));
74 return Tcg2DeviceDetection.TpmDeviceDetected;
75 }
76 }
77
78 DEBUG ((EFI_D_INFO, "DetectTpmDevice:\n"));
79
80 // dTPM available and not disabled by setup
81 // We need check if it is TPM1.2 or TPM2.0
82 // So try TPM1.2 command at first
83
84 Status = Tpm12RequestUseTpm ();
85 if (EFI_ERROR (Status)) {
86 //
87 // dTPM not available
88 //
89 return TPM_DEVICE_NULL;
90 }
91
92 if (BootMode == BOOT_ON_S3_RESUME) {
93 Status = Tpm12Startup (TPM_ST_STATE);
94 } else {
95 Status = Tpm12Startup (TPM_ST_CLEAR);
96 }
97 if (EFI_ERROR (Status)) {
98 return TPM_DEVICE_2_0_DTPM;
99 }
100
101 // NO initialization needed again.
102 Status = PcdSet8S (PcdTpmInitializationPolicy, 0);
103 ASSERT_EFI_ERROR (Status);
104 return TPM_DEVICE_1_2;
105 }