]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c
SecurityPkg: Change use of EFI_D_* to DEBUG_*
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigPeim.c
CommitLineData
1abfa4ce
JY
1/** @file\r
2 The module entry point for Tcg2 configuration module.\r
3\r
b3548d32 4Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
289b714b 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
1abfa4ce
JY
6\r
7**/\r
8\r
9\r
10#include <PiPei.h>\r
11\r
12#include <Guid/TpmInstance.h>\r
13\r
14#include <Library/BaseLib.h>\r
15#include <Library/BaseMemoryLib.h>\r
16#include <Library/DebugLib.h>\r
17#include <Library/MemoryAllocationLib.h>\r
18#include <Library/PeiServicesLib.h>\r
19#include <Library/PcdLib.h>\r
20\r
21#include <Ppi/ReadOnlyVariable2.h>\r
22#include <Ppi/TpmInitialized.h>\r
23#include <Protocol/Tcg2Protocol.h>\r
24\r
25#include "Tcg2ConfigNvData.h"\r
26fc074a 26#include "Tcg2Internal.h"\r
1abfa4ce
JY
27\r
28TPM_INSTANCE_ID mTpmInstanceId[] = TPM_INSTANCE_ID_LIST;\r
29\r
30CONST EFI_PEI_PPI_DESCRIPTOR gTpmSelectedPpi = {\r
31 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
32 &gEfiTpmDeviceSelectedGuid,\r
33 NULL\r
34};\r
35\r
36EFI_PEI_PPI_DESCRIPTOR mTpmInitializationDonePpiList = {\r
37 EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
38 &gPeiTpmInitializationDonePpiGuid,\r
39 NULL\r
40};\r
41\r
42/**\r
43 This routine check both SetupVariable and real TPM device, and return final TpmDevice configuration.\r
44\r
45 @param SetupTpmDevice TpmDevice configuration in setup driver\r
46\r
47 @return TpmDevice configuration\r
48**/\r
49UINT8\r
50DetectTpmDevice (\r
51 IN UINT8 SetupTpmDevice\r
52 );\r
53\r
54/**\r
55 The entry point for Tcg2 configuration driver.\r
56\r
57 @param FileHandle Handle of the file being invoked.\r
58 @param PeiServices Describes the list of possible PEI Services.\r
59\r
d6b926e7 60 @retval EFI_SUCCESS Convert variable to PCD successfully.\r
1abfa4ce
JY
61 @retval Others Fail to convert variable to PCD.\r
62**/\r
63EFI_STATUS\r
64EFIAPI\r
65Tcg2ConfigPeimEntryPoint (\r
66 IN EFI_PEI_FILE_HANDLE FileHandle,\r
67 IN CONST EFI_PEI_SERVICES **PeiServices\r
68 )\r
69{\r
70 UINTN Size;\r
71 EFI_STATUS Status;\r
72 EFI_STATUS Status2;\r
73 EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi;\r
74 TCG2_CONFIGURATION Tcg2Configuration;\r
75 UINTN Index;\r
76 UINT8 TpmDevice;\r
77\r
78 Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi);\r
79 ASSERT_EFI_ERROR (Status);\r
80\r
81 Size = sizeof(Tcg2Configuration);\r
82 Status = VariablePpi->GetVariable (\r
83 VariablePpi,\r
84 TCG2_STORAGE_NAME,\r
85 &gTcg2ConfigFormSetGuid,\r
86 NULL,\r
87 &Size,\r
88 &Tcg2Configuration\r
89 );\r
90 if (EFI_ERROR (Status)) {\r
91 //\r
92 // Variable not ready, set default value\r
93 //\r
94 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
95 }\r
96\r
97 //\r
98 // Validation\r
99 //\r
100 if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) {\r
101 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
102 }\r
103\r
104 //\r
105 // Although we have SetupVariable info, we still need detect TPM device manually.\r
106 //\r
e905fbb0 107 DEBUG ((DEBUG_INFO, "Tcg2Configuration.TpmDevice from Setup: %x\n", Tcg2Configuration.TpmDevice));\r
1abfa4ce
JY
108\r
109 if (PcdGetBool (PcdTpmAutoDetection)) {\r
110 TpmDevice = DetectTpmDevice (Tcg2Configuration.TpmDevice);\r
e905fbb0 111 DEBUG ((DEBUG_INFO, "TpmDevice final: %x\n", TpmDevice));\r
1abfa4ce
JY
112 if (TpmDevice != TPM_DEVICE_NULL) {\r
113 Tcg2Configuration.TpmDevice = TpmDevice;\r
114 }\r
115 } else {\r
116 TpmDevice = Tcg2Configuration.TpmDevice;\r
117 }\r
118\r
119 //\r
120 // Convert variable to PCD.\r
d6b926e7 121 // This is work-around because there is no guarantee DynamicHiiPcd can return correct value in DXE phase.\r
1abfa4ce
JY
122 // Using DynamicPcd instead.\r
123 //\r
124 // NOTE: Tcg2Configuration variable contains the desired TpmDevice type,\r
125 // while PcdTpmInstanceGuid PCD contains the real detected TpmDevice type\r
126 //\r
127 for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
128 if (TpmDevice == mTpmInstanceId[Index].TpmDevice) {\r
129 Size = sizeof(mTpmInstanceId[Index].TpmInstanceGuid);\r
fe3ca12d
SZ
130 Status = PcdSetPtrS (PcdTpmInstanceGuid, &Size, &mTpmInstanceId[Index].TpmInstanceGuid);\r
131 ASSERT_EFI_ERROR (Status);\r
e905fbb0 132 DEBUG ((DEBUG_INFO, "TpmDevice PCD: %g\n", &mTpmInstanceId[Index].TpmInstanceGuid));\r
1abfa4ce
JY
133 break;\r
134 }\r
135 }\r
136\r
137 //\r
138 // Selection done\r
139 //\r
140 Status = PeiServicesInstallPpi (&gTpmSelectedPpi);\r
141 ASSERT_EFI_ERROR (Status);\r
142\r
143 //\r
dd40a1f8 144 // Even if no TPM is selected or detected, we still need install TpmInitializationDonePpi.\r
1abfa4ce
JY
145 // Because TcgPei or Tcg2Pei will not run, but we still need a way to notify other driver.\r
146 // Other driver can know TPM initialization state by TpmInitializedPpi.\r
147 //\r
148 if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceNoneGuid)) {\r
149 Status2 = PeiServicesInstallPpi (&mTpmInitializationDonePpiList);\r
150 ASSERT_EFI_ERROR (Status2);\r
151 }\r
152\r
153 return Status;\r
154}\r