]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDriver.c
SecurityPkg: Add TPM PTP detection in TPM12 device lib.
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigDriver.c
CommitLineData
1abfa4ce
JY
1/** @file\r
2 The module entry point for Tcg2 configuration module.\r
3\r
4Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials \r
6are licensed and made available under the terms and conditions of the BSD License \r
7which accompanies this distribution. The full text of the license may be found at \r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "Tcg2ConfigImpl.h"\r
16\r
17extern TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1];\r
18\r
19/**\r
20 Update default PCR banks data.\r
21\r
22 @param[in] HiiPackage HII Package.\r
23 @param[in] HiiPackageSize HII Package size.\r
24 @param[in] PCRBanks PCR Banks data.\r
25\r
26**/\r
27VOID\r
28UpdateDefaultPCRBanks (\r
29 IN VOID *HiiPackage,\r
30 IN UINTN HiiPackageSize,\r
31 IN UINT32 PCRBanks\r
32 )\r
33{\r
34 EFI_HII_PACKAGE_HEADER *HiiPackageHeader;\r
35 EFI_IFR_OP_HEADER *IfrOpCodeHeader;\r
36 EFI_IFR_CHECKBOX *IfrCheckBox;\r
37 EFI_IFR_DEFAULT *IfrDefault;\r
38\r
39 HiiPackageHeader = (EFI_HII_PACKAGE_HEADER *)HiiPackage;\r
40\r
41 switch (HiiPackageHeader->Type) {\r
42 case EFI_HII_PACKAGE_FORMS:\r
43 IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)(HiiPackageHeader + 1);\r
44 while ((UINTN)IfrOpCodeHeader < (UINTN)HiiPackageHeader + HiiPackageHeader->Length) {\r
45 switch (IfrOpCodeHeader->OpCode) {\r
46 case EFI_IFR_CHECKBOX_OP:\r
47 IfrCheckBox = (EFI_IFR_CHECKBOX *)IfrOpCodeHeader;\r
48 if ((IfrCheckBox->Question.QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (IfrCheckBox->Question.QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
49 IfrDefault = (EFI_IFR_DEFAULT *)(IfrCheckBox + 1);\r
50 ASSERT (IfrDefault->Header.OpCode == EFI_IFR_DEFAULT_OP);\r
51 ASSERT (IfrDefault->Type == EFI_IFR_TYPE_BOOLEAN);\r
52 IfrDefault->Value.b = (BOOLEAN)((PCRBanks >> (IfrCheckBox->Question.QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0)) & 0x1);\r
53 }\r
54 break;\r
55 }\r
56 IfrOpCodeHeader = (EFI_IFR_OP_HEADER *)((UINTN)IfrOpCodeHeader + IfrOpCodeHeader->Length);\r
57 }\r
58 break;\r
59 }\r
60 return ;\r
61}\r
62\r
63/**\r
64 The entry point for Tcg2 configuration driver.\r
65\r
66 @param[in] ImageHandle The image handle of the driver.\r
67 @param[in] SystemTable The system table.\r
68\r
69 @retval EFI_ALREADY_STARTED The driver already exists in system.\r
70 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of resources.\r
71 @retval EFI_SUCCES All the related protocols are installed on the driver.\r
72 @retval Others Fail to install protocols as indicated.\r
73\r
74**/\r
75EFI_STATUS\r
76EFIAPI\r
77Tcg2ConfigDriverEntryPoint (\r
78 IN EFI_HANDLE ImageHandle,\r
79 IN EFI_SYSTEM_TABLE *SystemTable\r
80 )\r
81{\r
82 EFI_STATUS Status;\r
83 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
84 TCG2_CONFIGURATION Tcg2Configuration;\r
85 TCG2_DEVICE_DETECTION Tcg2DeviceDetection;\r
86 UINTN Index;\r
87 UINTN DataSize;\r
88 EDKII_VARIABLE_LOCK_PROTOCOL *VariableLockProtocol;\r
89 UINT32 CurrentActivePCRBanks;\r
90\r
91 Status = gBS->OpenProtocol (\r
92 ImageHandle,\r
93 &gEfiCallerIdGuid,\r
94 NULL,\r
95 ImageHandle,\r
96 ImageHandle,\r
97 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
98 );\r
99 if (!EFI_ERROR (Status)) {\r
100 return EFI_ALREADY_STARTED;\r
101 }\r
102 \r
103 //\r
104 // Create a private data structure.\r
105 //\r
106 PrivateData = AllocateCopyPool (sizeof (TCG2_CONFIG_PRIVATE_DATA), &mTcg2ConfigPrivateDateTemplate);\r
107 ASSERT (PrivateData != NULL);\r
108 mTcg2ConfigPrivateDate = PrivateData;\r
109 //\r
110 // Install private GUID.\r
111 // \r
112 Status = gBS->InstallMultipleProtocolInterfaces (\r
113 &ImageHandle,\r
114 &gEfiCallerIdGuid,\r
115 PrivateData,\r
116 NULL\r
117 );\r
118 ASSERT_EFI_ERROR (Status);\r
119\r
120 Status = gBS->LocateProtocol (&gEfiTcg2ProtocolGuid, NULL, (VOID **) &PrivateData->Tcg2Protocol);\r
121 ASSERT_EFI_ERROR (Status);\r
122\r
123 PrivateData->ProtocolCapability.Size = sizeof(PrivateData->ProtocolCapability);\r
124 Status = PrivateData->Tcg2Protocol->GetCapability (\r
125 PrivateData->Tcg2Protocol,\r
126 &PrivateData->ProtocolCapability\r
127 );\r
128 ASSERT_EFI_ERROR (Status);\r
129\r
130 DataSize = sizeof(Tcg2Configuration);\r
131 Status = gRT->GetVariable (\r
132 TCG2_STORAGE_NAME,\r
133 &gTcg2ConfigFormSetGuid,\r
134 NULL,\r
135 &DataSize,\r
136 &Tcg2Configuration\r
137 );\r
138 if (EFI_ERROR (Status)) {\r
139 //\r
140 // Variable not ready, set default value\r
141 //\r
142 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
143 }\r
144\r
145 //\r
146 // Validation\r
147 //\r
148 if ((Tcg2Configuration.TpmDevice > TPM_DEVICE_MAX) || (Tcg2Configuration.TpmDevice < TPM_DEVICE_MIN)) {\r
149 Tcg2Configuration.TpmDevice = TPM_DEVICE_DEFAULT;\r
150 }\r
151\r
152 //\r
153 // Set value for Tcg2CurrentActivePCRBanks\r
154 // Search Tcg2ConfigBin[] and update default value there\r
155 //\r
156 Status = PrivateData->Tcg2Protocol->GetActivePcrBanks (PrivateData->Tcg2Protocol, &CurrentActivePCRBanks);\r
157 ASSERT_EFI_ERROR (Status);\r
158 PrivateData->PCRBanksDesired = CurrentActivePCRBanks;\r
159 UpdateDefaultPCRBanks (Tcg2ConfigBin + sizeof(UINT32), ReadUnaligned32((UINT32 *)Tcg2ConfigBin) - sizeof(UINT32), CurrentActivePCRBanks);\r
160\r
161 //\r
162 // Save to variable so platform driver can get it.\r
163 //\r
164 Status = gRT->SetVariable (\r
165 TCG2_STORAGE_NAME,\r
166 &gTcg2ConfigFormSetGuid,\r
167 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
168 sizeof(Tcg2Configuration),\r
169 &Tcg2Configuration\r
170 );\r
171 if (EFI_ERROR (Status)) {\r
172 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_NAME\n"));\r
173 }\r
174\r
175 //\r
176 // Sync data from PCD to variable, so that we do not need detect again in S3 phase.\r
177 //\r
178 Tcg2DeviceDetection.TpmDeviceDetected = TPM_DEVICE_NULL;\r
179 for (Index = 0; Index < sizeof(mTpmInstanceId)/sizeof(mTpmInstanceId[0]); Index++) {\r
180 if (CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &mTpmInstanceId[Index].TpmInstanceGuid)) {\r
181 Tcg2DeviceDetection.TpmDeviceDetected = mTpmInstanceId[Index].TpmDevice;\r
182 break;\r
183 }\r
184 }\r
185\r
186 PrivateData->TpmDeviceDetected = Tcg2DeviceDetection.TpmDeviceDetected;\r
187\r
188 //\r
189 // Save to variable so platform driver can get it.\r
190 //\r
191 Status = gRT->SetVariable (\r
192 TCG2_DEVICE_DETECTION_NAME,\r
193 &gTcg2ConfigFormSetGuid,\r
194 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
195 sizeof(Tcg2DeviceDetection),\r
196 &Tcg2DeviceDetection\r
197 );\r
198 if (EFI_ERROR (Status)) {\r
199 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_DEVICE_DETECTION_NAME\n"));\r
200 Status = gRT->SetVariable (\r
201 TCG2_DEVICE_DETECTION_NAME,\r
202 &gTcg2ConfigFormSetGuid,\r
203 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
204 0,\r
205 NULL\r
206 );\r
207 ASSERT_EFI_ERROR (Status);\r
208 }\r
209\r
210 //\r
211 // We should lock Tcg2DeviceDetection, because it contains information needed at S3.\r
212 //\r
213 Status = gBS->LocateProtocol (&gEdkiiVariableLockProtocolGuid, NULL, (VOID **)&VariableLockProtocol);\r
214 if (!EFI_ERROR (Status)) {\r
215 Status = VariableLockProtocol->RequestToLock (\r
216 VariableLockProtocol,\r
217 TCG2_DEVICE_DETECTION_NAME,\r
218 &gTcg2ConfigFormSetGuid\r
219 );\r
220 ASSERT_EFI_ERROR (Status);\r
221 }\r
222 \r
223 //\r
224 // Install Tcg2 configuration form\r
225 //\r
226 Status = InstallTcg2ConfigForm (PrivateData);\r
227 if (EFI_ERROR (Status)) {\r
228 goto ErrorExit;\r
229 }\r
230\r
231 return EFI_SUCCESS;\r
232\r
233ErrorExit:\r
234 if (PrivateData != NULL) {\r
235 UninstallTcg2ConfigForm (PrivateData);\r
236 } \r
237 \r
238 return Status;\r
239}\r
240\r
241/**\r
242 Unload the Tcg2 configuration form.\r
243\r
244 @param[in] ImageHandle The driver's image handle.\r
245\r
246 @retval EFI_SUCCESS The Tcg2 configuration form is unloaded.\r
247 @retval Others Failed to unload the form.\r
248\r
249**/\r
250EFI_STATUS\r
251EFIAPI\r
252Tcg2ConfigDriverUnload (\r
253 IN EFI_HANDLE ImageHandle\r
254 )\r
255{\r
256 EFI_STATUS Status;\r
257 TCG2_CONFIG_PRIVATE_DATA *PrivateData;\r
258\r
259 Status = gBS->HandleProtocol (\r
260 ImageHandle,\r
261 &gEfiCallerIdGuid,\r
262 (VOID **) &PrivateData\r
263 ); \r
264 if (EFI_ERROR (Status)) {\r
265 return Status; \r
266 }\r
267 \r
268 ASSERT (PrivateData->Signature == TCG2_CONFIG_PRIVATE_DATA_SIGNATURE);\r
269\r
270 gBS->UninstallMultipleProtocolInterfaces (\r
271 &ImageHandle,\r
272 &gEfiCallerIdGuid,\r
273 PrivateData,\r
274 NULL\r
275 );\r
276 \r
277 UninstallTcg2ConfigForm (PrivateData);\r
278\r
279 return EFI_SUCCESS;\r
280}\r