]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigImpl.c
SecurityPkg Tcg2ConfigDxe: Add setup option to configure PPI version
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Config / Tcg2ConfigImpl.c
CommitLineData
1abfa4ce
JY
1/** @file\r
2 HII Config Access protocol implementation of TCG2 configuration module.\r
3 NOTE: This module is only for reference only, each platform should have its own setup page.\r
4\r
a6e0e994 5Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
1abfa4ce
JY
6This program and the accompanying materials \r
7are licensed and made available under the terms and conditions of the BSD License \r
8which accompanies this distribution. The full text of the license may be found at \r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "Tcg2ConfigImpl.h"\r
17#include <Library/PcdLib.h>\r
18#include <Library/Tpm2CommandLib.h>\r
518b6f65 19#include <Library/IoLib.h>\r
1abfa4ce
JY
20#include <Guid/TpmInstance.h>\r
21\r
518b6f65
JY
22#include <IndustryStandard/TpmPtp.h>\r
23\r
1abfa4ce
JY
24#define EFI_TCG2_EVENT_LOG_FORMAT_ALL (EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2 | EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)\r
25\r
26TPM_INSTANCE_ID mTpmInstanceId[TPM_DEVICE_MAX + 1] = TPM_INSTANCE_ID_LIST;\r
27\r
28TCG2_CONFIG_PRIVATE_DATA *mTcg2ConfigPrivateDate;\r
29TCG2_CONFIG_PRIVATE_DATA mTcg2ConfigPrivateDateTemplate = {\r
30 TCG2_CONFIG_PRIVATE_DATA_SIGNATURE,\r
31 {\r
32 Tcg2ExtractConfig,\r
33 Tcg2RouteConfig,\r
34 Tcg2Callback\r
35 }\r
36};\r
37\r
38HII_VENDOR_DEVICE_PATH mTcg2HiiVendorDevicePath = {\r
39 {\r
40 {\r
41 HARDWARE_DEVICE_PATH,\r
42 HW_VENDOR_DP,\r
43 {\r
44 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
45 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
46 }\r
47 },\r
48 TCG2_CONFIG_FORM_SET_GUID\r
49 },\r
50 {\r
51 END_DEVICE_PATH_TYPE,\r
52 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
53 { \r
54 (UINT8) (END_DEVICE_PATH_LENGTH),\r
55 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
56 }\r
57 }\r
58};\r
59\r
60UINT8 mCurrentPpRequest;\r
61\r
518b6f65
JY
62/**\r
63 Return PTP interface type.\r
64\r
65 @param[in] Register Pointer to PTP register.\r
66\r
67 @return PTP interface type.\r
68**/\r
69UINT8\r
70GetPtpInterface (\r
71 IN VOID *Register\r
72 )\r
73{\r
74 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
75 PTP_FIFO_INTERFACE_CAPABILITY InterfaceCapability;\r
76\r
77 //\r
78 // Check interface id\r
79 //\r
80 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
81 InterfaceCapability.Uint32 = MmioRead32 ((UINTN)&((PTP_FIFO_REGISTERS *)Register)->InterfaceCapability);\r
82\r
83 if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) &&\r
84 (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB) &&\r
85 (InterfaceId.Bits.CapCRB != 0)) {\r
86 return TPM_DEVICE_INTERFACE_PTP_CRB;\r
87 }\r
88 if ((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO) &&\r
89 (InterfaceId.Bits.InterfaceVersion == PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO) &&\r
90 (InterfaceId.Bits.CapFIFO != 0) &&\r
91 (InterfaceCapability.Bits.InterfaceVersion == INTERFACE_CAPABILITY_INTERFACE_VERSION_PTP)) {\r
92 return TPM_DEVICE_INTERFACE_PTP_FIFO;\r
93 }\r
94 return TPM_DEVICE_INTERFACE_TIS;\r
95}\r
96\r
97/**\r
98 Return if PTP CRB is supported.\r
99\r
100 @param[in] Register Pointer to PTP register.\r
101 \r
102 @retval TRUE PTP CRB is supported.\r
103 @retval FALSE PTP CRB is unsupported.\r
104**/\r
105BOOLEAN\r
106IsPtpCrbSupported (\r
107 IN VOID *Register\r
108 )\r
109{\r
110 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
111\r
112 //\r
113 // Check interface id\r
114 //\r
115 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
116\r
117 if (((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) ||\r
118 (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) &&\r
119 (InterfaceId.Bits.CapCRB != 0)) {\r
120 return TRUE;\r
121 }\r
122 return FALSE;\r
123}\r
124\r
125/**\r
126 Return if PTP FIFO is supported.\r
127\r
128 @param[in] Register Pointer to PTP register.\r
129 \r
130 @retval TRUE PTP FIFO is supported.\r
131 @retval FALSE PTP FIFO is unsupported.\r
132**/\r
133BOOLEAN\r
134IsPtpFifoSupported (\r
135 IN VOID *Register\r
136 )\r
137{\r
138 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
139\r
140 //\r
141 // Check interface id\r
142 //\r
143 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
144\r
145 if (((InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB) ||\r
146 (InterfaceId.Bits.InterfaceType == PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO)) &&\r
147 (InterfaceId.Bits.CapFIFO != 0)) {\r
148 return TRUE;\r
149 }\r
150 return FALSE;\r
151}\r
152\r
153/**\r
154 Set PTP interface type.\r
155\r
156 @param[in] Register Pointer to PTP register.\r
157 @param[in] PtpInterface PTP interface type.\r
158 \r
159 @retval EFI_SUCCESS PTP interface type is set.\r
160 @retval EFI_INVALID_PARAMETER PTP interface type is invalid.\r
161 @retval EFI_UNSUPPORTED PTP interface type is unsupported.\r
162 @retval EFI_WRITE_PROTECTED PTP interface is locked.\r
163**/\r
164EFI_STATUS\r
165SetPtpInterface (\r
166 IN VOID *Register,\r
167 IN UINT8 PtpInterface\r
168 )\r
169{\r
170 UINT8 PtpInterfaceCurrent;\r
171 PTP_CRB_INTERFACE_IDENTIFIER InterfaceId;\r
172\r
173 PtpInterfaceCurrent = GetPtpInterface (Register);\r
174 if ((PtpInterfaceCurrent != TPM_DEVICE_INTERFACE_PTP_FIFO) && \r
175 (PtpInterfaceCurrent != TPM_DEVICE_INTERFACE_PTP_CRB)) {\r
176 return EFI_UNSUPPORTED;\r
177 }\r
178 InterfaceId.Uint32 = MmioRead32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId);\r
179 if (InterfaceId.Bits.IntfSelLock != 0) {\r
180 return EFI_WRITE_PROTECTED;\r
181 }\r
182\r
183 switch (PtpInterface) {\r
184 case TPM_DEVICE_INTERFACE_PTP_FIFO:\r
185 if (InterfaceId.Bits.CapFIFO == 0) {\r
186 return EFI_UNSUPPORTED;\r
187 }\r
188 InterfaceId.Bits.InterfaceSelector = PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_FIFO;\r
189 MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId, InterfaceId.Uint32);\r
190 return EFI_SUCCESS;\r
191 case TPM_DEVICE_INTERFACE_PTP_CRB:\r
192 if (InterfaceId.Bits.CapCRB == 0) {\r
193 return EFI_UNSUPPORTED;\r
194 }\r
195 InterfaceId.Bits.InterfaceSelector = PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_CRB;\r
196 MmioWrite32 ((UINTN)&((PTP_CRB_REGISTERS *)Register)->InterfaceId, InterfaceId.Uint32);\r
197 return EFI_SUCCESS;\r
198 default:\r
199 return EFI_INVALID_PARAMETER;\r
200 }\r
201}\r
202\r
1abfa4ce
JY
203/**\r
204 This function allows a caller to extract the current configuration for one\r
205 or more named elements from the target driver.\r
206\r
207 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
208 @param[in] Request A null-terminated Unicode string in\r
209 <ConfigRequest> format.\r
210 @param[out] Progress On return, points to a character in the Request\r
211 string. Points to the string's null terminator if\r
212 request was successful. Points to the most recent\r
213 '&' before the first failing name/value pair (or\r
214 the beginning of the string if the failure is in\r
215 the first name/value pair) if the request was not\r
216 successful.\r
217 @param[out] Results A null-terminated Unicode string in\r
218 <ConfigAltResp> format which has all values filled\r
219 in for the names in the Request string. String to\r
220 be allocated by the called function.\r
221\r
222 @retval EFI_SUCCESS The Results is filled with the requested values.\r
223 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
224 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
225 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
226 driver.\r
227\r
228**/\r
229EFI_STATUS\r
230EFIAPI\r
231Tcg2ExtractConfig (\r
232 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
233 IN CONST EFI_STRING Request,\r
234 OUT EFI_STRING *Progress,\r
235 OUT EFI_STRING *Results\r
236 )\r
237{\r
238 if (Progress == NULL || Results == NULL) {\r
239 return EFI_INVALID_PARAMETER;\r
240 }\r
241\r
242 *Progress = Request;\r
243 return EFI_NOT_FOUND;\r
244}\r
245\r
246/**\r
247 Save TPM request to variable space.\r
248\r
249 @param[in] PpRequest Physical Presence request command.\r
250\r
251 @retval EFI_SUCCESS The operation is finished successfully.\r
252 @retval Others Other errors as indicated.\r
253\r
254**/\r
255EFI_STATUS\r
256SaveTcg2PpRequest (\r
257 IN UINT8 PpRequest\r
258 )\r
259{\r
260 UINT32 ReturnCode;\r
261 EFI_STATUS Status;\r
262\r
263 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
264 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
265 mCurrentPpRequest = PpRequest;\r
266 Status = EFI_SUCCESS;\r
267 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
268 Status = EFI_OUT_OF_RESOURCES;\r
269 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
270 Status = EFI_UNSUPPORTED;\r
271 } else {\r
272 Status = EFI_DEVICE_ERROR;\r
273 }\r
274\r
275 return Status;\r
276}\r
277\r
278/**\r
279 Save TPM request to variable space.\r
280\r
281 @param[in] PpRequestParameter Physical Presence request parameter.\r
282\r
283 @retval EFI_SUCCESS The operation is finished successfully.\r
284 @retval Others Other errors as indicated.\r
285\r
286**/\r
287EFI_STATUS\r
288SaveTcg2PpRequestParameter (\r
289 IN UINT32 PpRequestParameter\r
290 )\r
291{\r
292 UINT32 ReturnCode;\r
293 EFI_STATUS Status;\r
294\r
295 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (mCurrentPpRequest, PpRequestParameter);\r
296 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
297 Status = EFI_SUCCESS;\r
298 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
299 Status = EFI_OUT_OF_RESOURCES;\r
300 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
301 Status = EFI_UNSUPPORTED;\r
302 } else {\r
303 Status = EFI_DEVICE_ERROR;\r
304 }\r
305\r
306 return Status;\r
307}\r
308\r
309/**\r
310 Save Tcg2 PCR Banks request request to variable space.\r
311\r
312 @param[in] PCRBankIndex PCR Bank Index.\r
313 @param[in] Enable Enable or disable this PCR Bank.\r
314\r
315 @retval EFI_SUCCESS The operation is finished successfully.\r
316 @retval Others Other errors as indicated.\r
317\r
318**/\r
319EFI_STATUS\r
320SaveTcg2PCRBanksRequest (\r
321 IN UINTN PCRBankIndex,\r
322 IN BOOLEAN Enable\r
323 )\r
324{\r
325 UINT32 ReturnCode;\r
326 EFI_STATUS Status;\r
327\r
328 if (Enable) {\r
329 mTcg2ConfigPrivateDate->PCRBanksDesired |= (0x1 << PCRBankIndex);\r
330 } else {\r
331 mTcg2ConfigPrivateDate->PCRBanksDesired &= ~(0x1 << PCRBankIndex);\r
332 }\r
333 \r
334 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (TCG2_PHYSICAL_PRESENCE_SET_PCR_BANKS, mTcg2ConfigPrivateDate->PCRBanksDesired);\r
335 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
336 Status = EFI_SUCCESS;\r
337 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
338 Status = EFI_OUT_OF_RESOURCES;\r
339 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
340 Status = EFI_UNSUPPORTED;\r
341 } else {\r
342 Status = EFI_DEVICE_ERROR;\r
343 }\r
344\r
345 return Status;\r
346}\r
347\r
348/**\r
349 This function processes the results of changes in configuration.\r
350\r
351 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
352 @param[in] Configuration A null-terminated Unicode string in <ConfigResp>\r
353 format.\r
354 @param[out] Progress A pointer to a string filled in with the offset of\r
355 the most recent '&' before the first failing\r
356 name/value pair (or the beginning of the string if\r
357 the failure is in the first name/value pair) or\r
358 the terminating NULL if all was successful.\r
359\r
360 @retval EFI_SUCCESS The Results is processed successfully.\r
361 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
362 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
363 driver.\r
364\r
365**/\r
366EFI_STATUS\r
367EFIAPI\r
368Tcg2RouteConfig (\r
369 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
370 IN CONST EFI_STRING Configuration,\r
371 OUT EFI_STRING *Progress\r
372 )\r
373{\r
374 if (Configuration == NULL || Progress == NULL) {\r
375 return EFI_INVALID_PARAMETER;\r
376 }\r
377\r
378 return EFI_NOT_FOUND;\r
379}\r
380\r
a6e0e994
ZC
381/**\r
382 Get HID string of TPM2 ACPI device object\r
383\r
3304abc1 384 @param[in] Hid Points to HID String Buffer.\r
a6e0e994
ZC
385 @param[in] Size HID String size in bytes. Must >= TPM_HID_ACPI_SIZE\r
386\r
387 @return HID String get status.\r
388\r
389**/\r
390EFI_STATUS\r
391GetTpm2HID(\r
3304abc1 392 CHAR8 *Hid,\r
a6e0e994
ZC
393 UINTN Size\r
394 )\r
395{\r
396 EFI_STATUS Status;\r
397 UINT32 ManufacturerID;\r
398 UINT32 FirmwareVersion1;\r
399 UINT32 FirmwareVersion2;\r
400 BOOLEAN PnpHID;\r
401\r
402 PnpHID = TRUE;\r
403\r
3304abc1 404 ZeroMem(Hid, Size);\r
a6e0e994
ZC
405\r
406 //\r
407 // Get Manufacturer ID\r
408 //\r
409 Status = Tpm2GetCapabilityManufactureID(&ManufacturerID);\r
410 if (!EFI_ERROR(Status)) {\r
411 DEBUG((DEBUG_INFO, "TPM_PT_MANUFACTURER 0x%08x\n", ManufacturerID));\r
412 //\r
413 // ManufacturerID defined in TCG Vendor ID Registry\r
414 // may tailed with 0x00 or 0x20\r
415 //\r
416 if ((ManufacturerID >> 24) == 0x00 || ((ManufacturerID >> 24) == 0x20)) {\r
417 //\r
418 // HID containing PNP ID "NNN####"\r
419 // NNN is uppercase letter for Vendor ID specified by manufacturer\r
420 //\r
3304abc1 421 CopyMem(Hid, &ManufacturerID, 3);\r
a6e0e994
ZC
422 } else {\r
423 //\r
424 // HID containing ACP ID "NNNN####"\r
425 // NNNN is uppercase letter for Vendor ID specified by manufacturer\r
426 //\r
3304abc1 427 CopyMem(Hid, &ManufacturerID, 4);\r
a6e0e994
ZC
428 PnpHID = FALSE;\r
429 }\r
430 } else {\r
431 DEBUG ((DEBUG_ERROR, "Get TPM_PT_MANUFACTURER failed %x!\n", Status));\r
432 ASSERT(FALSE);\r
433 return Status;\r
434 }\r
435\r
436 Status = Tpm2GetCapabilityFirmwareVersion(&FirmwareVersion1, &FirmwareVersion2);\r
437 if (!EFI_ERROR(Status)) {\r
438 DEBUG((DEBUG_INFO, "TPM_PT_FIRMWARE_VERSION_1 0x%x\n", FirmwareVersion1));\r
439 DEBUG((DEBUG_INFO, "TPM_PT_FIRMWARE_VERSION_2 0x%x\n", FirmwareVersion2));\r
440 //\r
441 // #### is Firmware Version 1\r
442 //\r
443 if (PnpHID) {\r
3304abc1 444 AsciiSPrint(Hid + 3, TPM_HID_PNP_SIZE - 3, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 && 0x0000FFFF));\r
a6e0e994 445 } else {\r
3304abc1 446 AsciiSPrint(Hid + 4, TPM_HID_ACPI_SIZE - 4, "%02d%02d", ((FirmwareVersion1 & 0xFFFF0000) >> 16), (FirmwareVersion1 && 0x0000FFFF));\r
a6e0e994
ZC
447 }\r
448\r
449 } else {\r
450 DEBUG ((DEBUG_ERROR, "Get TPM_PT_FIRMWARE_VERSION_X failed %x!\n", Status));\r
451 ASSERT(FALSE);\r
452 return Status;\r
453 }\r
454\r
455 return EFI_SUCCESS;\r
456}\r
457\r
dd6d0a52
SZ
458/**\r
459 This function processes the results of changes in configuration\r
460 for TCG2 version information.\r
461\r
462 @param[in] Action Specifies the type of action taken by the browser.\r
463 ASSERT if the Action is not EFI_BROWSER_ACTION_SUBMITTED.\r
464 @param[in] QuestionId A unique value which is sent to the original\r
465 exporting driver so that it can identify the type\r
466 of data to expect.\r
467 @param[in] Type The type of value for the question.\r
468 @param[in] Value A pointer to the data being sent to the original\r
469 exporting driver.\r
470\r
471 @retval EFI_SUCCESS The callback successfully handled the action.\r
472\r
473**/\r
474EFI_STATUS\r
475Tcg2VersionInfoCallback (\r
476 IN EFI_BROWSER_ACTION Action,\r
477 IN EFI_QUESTION_ID QuestionId,\r
478 IN UINT8 Type,\r
479 IN EFI_IFR_TYPE_VALUE *Value\r
480 )\r
481{\r
482 EFI_INPUT_KEY Key;\r
483 UINT64 PcdTcg2PpiVersion;\r
484\r
485 ASSERT (Action == EFI_BROWSER_ACTION_SUBMITTED);\r
486\r
487 if (QuestionId == KEY_TCG2_PPI_VERSION) {\r
488 //\r
489 // Get the PCD value after EFI_BROWSER_ACTION_SUBMITTED,\r
490 // the SetVariable to TCG2_VERSION_NAME should have been done.\r
491 // If the PCD value is not equal to the value set to variable,\r
492 // the PCD is not DynamicHii type and maps to the setup option.\r
493 //\r
494 PcdTcg2PpiVersion = 0;\r
495 CopyMem (\r
496 &PcdTcg2PpiVersion,\r
497 PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer),\r
498 AsciiStrSize (PcdGetPtr (PcdTcgPhysicalPresenceInterfaceVer))\r
499 );\r
500 if (PcdTcg2PpiVersion != Value->u64) {\r
501 CreatePopUp (\r
502 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
503 &Key,\r
504 L"WARNING: PcdTcgPhysicalPresenceInterfaceVer is not DynamicHii type and maps to this option!",\r
505 L"The version configuring by this setup option will not work!",\r
506 NULL\r
507 );\r
508 }\r
509 }\r
510\r
511 return EFI_SUCCESS;\r
512}\r
513\r
1abfa4ce
JY
514/**\r
515 This function processes the results of changes in configuration.\r
516\r
517 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
518 @param[in] Action Specifies the type of action taken by the browser.\r
519 @param[in] QuestionId A unique value which is sent to the original\r
520 exporting driver so that it can identify the type\r
521 of data to expect.\r
522 @param[in] Type The type of value for the question.\r
523 @param[in] Value A pointer to the data being sent to the original\r
524 exporting driver.\r
525 @param[out] ActionRequest On return, points to the action requested by the\r
526 callback function.\r
527\r
528 @retval EFI_SUCCESS The callback successfully handled the action.\r
529 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
530 variable and its data.\r
531 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
532 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
533 callback.\r
534\r
535**/\r
536EFI_STATUS\r
537EFIAPI\r
538Tcg2Callback (\r
539 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
540 IN EFI_BROWSER_ACTION Action,\r
541 IN EFI_QUESTION_ID QuestionId,\r
542 IN UINT8 Type,\r
543 IN EFI_IFR_TYPE_VALUE *Value,\r
544 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
545 )\r
546{\r
a6e0e994
ZC
547 EFI_STATUS Status;\r
548 EFI_INPUT_KEY Key;\r
549 CHAR8 HidStr[16];\r
550 CHAR16 UnHidStr[16];\r
551 TCG2_CONFIG_PRIVATE_DATA *Private;\r
518b6f65 552\r
1abfa4ce
JY
553 if ((This == NULL) || (Value == NULL) || (ActionRequest == NULL)) {\r
554 return EFI_INVALID_PARAMETER;\r
555 }\r
518b6f65 556\r
a6e0e994
ZC
557 Private = TCG2_CONFIG_PRIVATE_DATA_FROM_THIS (This);\r
558\r
559 if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
560 //\r
561 // Update TPM2 HID info\r
562 //\r
563 if (QuestionId == KEY_TPM_DEVICE) {\r
564 Status = GetTpm2HID(HidStr, 16);\r
565\r
566 if (EFI_ERROR(Status)) {\r
567 //\r
568 // Fail to get TPM2 HID\r
569 //\r
570 HiiSetString (Private->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_HID_CONTENT), L"Unknown", NULL);\r
571 } else {\r
572 AsciiStrToUnicodeStrS(HidStr, UnHidStr, 16);\r
573 HiiSetString (Private->HiiHandle, STRING_TOKEN (STR_TPM2_ACPI_HID_CONTENT), UnHidStr, NULL);\r
574 }\r
575 }\r
576 return EFI_SUCCESS;\r
577 }\r
578\r
518b6f65
JY
579 if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
580 if (QuestionId == KEY_TPM_DEVICE_INTERFACE) {\r
518b6f65
JY
581 Status = SetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress), Value->u8);\r
582 if (EFI_ERROR (Status)) {\r
583 CreatePopUp (\r
584 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
585 &Key,\r
586 L"Error: Fail to set PTP interface!",\r
587 NULL\r
588 );\r
589 return EFI_DEVICE_ERROR;\r
590 }\r
591 }\r
592 }\r
1abfa4ce
JY
593 \r
594 if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
595 if (QuestionId == KEY_TPM_DEVICE) {\r
596 return EFI_SUCCESS;\r
597 }\r
598 if (QuestionId == KEY_TPM2_OPERATION) {\r
599 return SaveTcg2PpRequest (Value->u8);\r
600 }\r
601 if (QuestionId == KEY_TPM2_OPERATION_PARAMETER) {\r
602 return SaveTcg2PpRequestParameter (Value->u32);\r
603 }\r
604 if ((QuestionId >= KEY_TPM2_PCR_BANKS_REQUEST_0) && (QuestionId <= KEY_TPM2_PCR_BANKS_REQUEST_4)) {\r
dd6d0a52
SZ
605 return SaveTcg2PCRBanksRequest (QuestionId - KEY_TPM2_PCR_BANKS_REQUEST_0, Value->b);\r
606 }\r
607 }\r
608\r
609 if (Action == EFI_BROWSER_ACTION_SUBMITTED) {\r
610 if (QuestionId == KEY_TCG2_PPI_VERSION) {\r
611 return Tcg2VersionInfoCallback (Action, QuestionId, Type, Value);\r
1abfa4ce
JY
612 }\r
613 }\r
614\r
615 return EFI_UNSUPPORTED;\r
616}\r
617\r
618/**\r
619 Append Buffer With TpmAlgHash.\r
620\r
621 @param[in] Buffer Buffer to be appended.\r
622 @param[in] BufferSize Size of buffer.\r
623 @param[in] TpmAlgHash TpmAlgHash.\r
624\r
625**/\r
626VOID\r
627AppendBufferWithTpmAlgHash (\r
628 IN UINT16 *Buffer,\r
629 IN UINTN BufferSize,\r
630 IN UINT32 TpmAlgHash\r
631 )\r
632{\r
633 switch (TpmAlgHash) {\r
634 case TPM_ALG_SHA1:\r
635 if (Buffer[0] != 0) {\r
d2e8af97 636 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 637 }\r
d2e8af97 638 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
1abfa4ce
JY
639 break;\r
640 case TPM_ALG_SHA256:\r
641 if (Buffer[0] != 0) {\r
d2e8af97 642 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 643 }\r
d2e8af97 644 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
1abfa4ce
JY
645 break;\r
646 case TPM_ALG_SHA384:\r
647 if (Buffer[0] != 0) {\r
d2e8af97 648 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 649 }\r
d2e8af97 650 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
1abfa4ce
JY
651 break;\r
652 case TPM_ALG_SHA512:\r
653 if (Buffer[0] != 0) {\r
d2e8af97 654 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 655 }\r
d2e8af97 656 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
1abfa4ce
JY
657 break;\r
658 case TPM_ALG_SM3_256:\r
659 if (Buffer[0] != 0) {\r
d2e8af97 660 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 661 }\r
d2e8af97 662 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
1abfa4ce
JY
663 break;\r
664 }\r
665}\r
666\r
667/**\r
668 Fill Buffer With BootHashAlg.\r
669\r
670 @param[in] Buffer Buffer to be filled.\r
671 @param[in] BufferSize Size of buffer.\r
672 @param[in] BootHashAlg BootHashAlg.\r
673\r
674**/\r
675VOID\r
676FillBufferWithBootHashAlg (\r
677 IN UINT16 *Buffer,\r
678 IN UINTN BufferSize,\r
679 IN UINT32 BootHashAlg\r
680 )\r
681{\r
682 Buffer[0] = 0;\r
683 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA1) != 0) {\r
684 if (Buffer[0] != 0) {\r
d2e8af97 685 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 686 }\r
d2e8af97 687 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA1");\r
1abfa4ce
JY
688 }\r
689 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {\r
690 if (Buffer[0] != 0) {\r
d2e8af97 691 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 692 }\r
d2e8af97 693 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA256");\r
1abfa4ce
JY
694 }\r
695 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {\r
696 if (Buffer[0] != 0) {\r
d2e8af97 697 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 698 }\r
d2e8af97 699 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA384");\r
1abfa4ce
JY
700 }\r
701 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {\r
702 if (Buffer[0] != 0) {\r
d2e8af97 703 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 704 }\r
d2e8af97 705 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SHA512");\r
1abfa4ce
JY
706 }\r
707 if ((BootHashAlg & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {\r
708 if (Buffer[0] != 0) {\r
d2e8af97 709 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 710 }\r
d2e8af97 711 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"SM3_256");\r
1abfa4ce
JY
712 }\r
713}\r
714\r
c41eeb44
JY
715/**\r
716 Set ConfigInfo according to TpmAlgHash.\r
717\r
718 @param[in,out] Tcg2ConfigInfo TCG2 config info.\r
719 @param[in] TpmAlgHash TpmAlgHash.\r
720\r
721**/\r
722VOID\r
723SetConfigInfo (\r
724 IN OUT TCG2_CONFIGURATION_INFO *Tcg2ConfigInfo,\r
725 IN UINT32 TpmAlgHash\r
726 )\r
727{\r
728 switch (TpmAlgHash) {\r
729 case TPM_ALG_SHA1:\r
730 Tcg2ConfigInfo->Sha1Supported = TRUE;\r
731 break;\r
732 case TPM_ALG_SHA256:\r
733 Tcg2ConfigInfo->Sha256Supported = TRUE;\r
734 break;\r
735 case TPM_ALG_SHA384:\r
736 Tcg2ConfigInfo->Sha384Supported = TRUE;\r
737 break;\r
738 case TPM_ALG_SHA512:\r
739 Tcg2ConfigInfo->Sha512Supported = TRUE;\r
740 break;\r
741 case TPM_ALG_SM3_256:\r
742 Tcg2ConfigInfo->Sm3Supported = TRUE;\r
743 break;\r
744 }\r
745}\r
746\r
1abfa4ce
JY
747/**\r
748 Fill Buffer With TCG2EventLogFormat.\r
749\r
750 @param[in] Buffer Buffer to be filled.\r
751 @param[in] BufferSize Size of buffer.\r
752 @param[in] TCG2EventLogFormat TCG2EventLogFormat.\r
753\r
754**/\r
755VOID\r
756FillBufferWithTCG2EventLogFormat (\r
757 IN UINT16 *Buffer,\r
758 IN UINTN BufferSize,\r
759 IN UINT32 TCG2EventLogFormat\r
760 )\r
761{\r
762 Buffer[0] = 0;\r
763 if ((TCG2EventLogFormat & EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2) != 0) {\r
764 if (Buffer[0] != 0) {\r
d2e8af97 765 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 766 }\r
d2e8af97 767 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"TCG_1_2");\r
1abfa4ce
JY
768 }\r
769 if ((TCG2EventLogFormat & EFI_TCG2_EVENT_LOG_FORMAT_TCG_2) != 0) {\r
770 if (Buffer[0] != 0) {\r
d2e8af97 771 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 772 }\r
d2e8af97 773 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"TCG_2");\r
1abfa4ce
JY
774 }\r
775 if ((TCG2EventLogFormat & (~EFI_TCG2_EVENT_LOG_FORMAT_ALL)) != 0) {\r
776 if (Buffer[0] != 0) {\r
d2e8af97 777 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L", ");\r
1abfa4ce 778 }\r
d2e8af97 779 StrCatS (Buffer, BufferSize / sizeof (CHAR16), L"UNKNOWN");\r
1abfa4ce
JY
780 }\r
781}\r
782\r
1abfa4ce
JY
783/**\r
784 This function publish the TCG2 configuration Form for TPM device.\r
785\r
786 @param[in, out] PrivateData Points to TCG2 configuration private data.\r
787\r
788 @retval EFI_SUCCESS HII Form is installed for this network device.\r
789 @retval EFI_OUT_OF_RESOURCES Not enough resource for HII Form installation.\r
790 @retval Others Other errors as indicated.\r
791\r
792**/\r
793EFI_STATUS\r
794InstallTcg2ConfigForm (\r
795 IN OUT TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
796 )\r
797{\r
798 EFI_STATUS Status;\r
799 EFI_HII_HANDLE HiiHandle;\r
800 EFI_HANDLE DriverHandle;\r
801 EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
802 UINTN Index;\r
803 TPML_PCR_SELECTION Pcrs;\r
804 CHAR16 TempBuffer[1024];\r
c41eeb44 805 TCG2_CONFIGURATION_INFO Tcg2ConfigInfo;\r
518b6f65 806 UINT8 TpmDeviceInterfaceDetected;\r
1abfa4ce
JY
807\r
808 DriverHandle = NULL;\r
809 ConfigAccess = &PrivateData->ConfigAccess;\r
810 Status = gBS->InstallMultipleProtocolInterfaces (\r
811 &DriverHandle,\r
812 &gEfiDevicePathProtocolGuid,\r
813 &mTcg2HiiVendorDevicePath,\r
814 &gEfiHiiConfigAccessProtocolGuid,\r
815 ConfigAccess,\r
816 NULL\r
817 );\r
818 if (EFI_ERROR (Status)) {\r
819 return Status;\r
820 }\r
821\r
822 PrivateData->DriverHandle = DriverHandle;\r
823\r
824 //\r
825 // Publish the HII package list\r
826 //\r
827 HiiHandle = HiiAddPackages (\r
828 &gTcg2ConfigFormSetGuid,\r
829 DriverHandle,\r
830 Tcg2ConfigDxeStrings,\r
831 Tcg2ConfigBin,\r
832 NULL\r
833 );\r
834 if (HiiHandle == NULL) {\r
835 gBS->UninstallMultipleProtocolInterfaces (\r
836 DriverHandle,\r
837 &gEfiDevicePathProtocolGuid,\r
838 &mTcg2HiiVendorDevicePath,\r
839 &gEfiHiiConfigAccessProtocolGuid,\r
840 ConfigAccess,\r
841 NULL\r
842 ); \r
843\r
844 return EFI_OUT_OF_RESOURCES;\r
845 }\r
846 \r
847 PrivateData->HiiHandle = HiiHandle;\r
848\r
849 //\r
850 // Update static data\r
851 //\r
852 switch (PrivateData->TpmDeviceDetected) {\r
853 case TPM_DEVICE_NULL:\r
854 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Not Found", NULL);\r
855 break;\r
856 case TPM_DEVICE_1_2:\r
857 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 1.2", NULL);\r
858 break;\r
859 case TPM_DEVICE_2_0_DTPM:\r
518b6f65 860 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"TPM 2.0", NULL);\r
1abfa4ce
JY
861 break;\r
862 default:\r
863 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_STATE_CONTENT), L"Unknown", NULL);\r
864 break;\r
865 }\r
866\r
c41eeb44 867 ZeroMem (&Tcg2ConfigInfo, sizeof(Tcg2ConfigInfo));\r
1abfa4ce
JY
868 Status = Tpm2GetCapabilityPcrs (&Pcrs);\r
869 if (EFI_ERROR (Status)) {\r
870 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACTIVE_HASH_ALGO_CONTENT), L"[Unknown]", NULL);\r
871 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_SUPPORTED_HASH_ALGO_CONTENT), L"[Unknown]", NULL);\r
872 } else {\r
873 TempBuffer[0] = 0;\r
874 for (Index = 0; Index < Pcrs.count; Index++) {\r
72388f9c 875 if (!IsZeroBuffer (Pcrs.pcrSelections[Index].pcrSelect, Pcrs.pcrSelections[Index].sizeofSelect)) {\r
1abfa4ce
JY
876 AppendBufferWithTpmAlgHash (TempBuffer, sizeof(TempBuffer), Pcrs.pcrSelections[Index].hash);\r
877 }\r
878 }\r
879 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_ACTIVE_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
880\r
881 TempBuffer[0] = 0;\r
882 for (Index = 0; Index < Pcrs.count; Index++) {\r
883 AppendBufferWithTpmAlgHash (TempBuffer, sizeof(TempBuffer), Pcrs.pcrSelections[Index].hash);\r
c41eeb44 884 SetConfigInfo (&Tcg2ConfigInfo, Pcrs.pcrSelections[Index].hash);\r
1abfa4ce
JY
885 }\r
886 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TPM2_SUPPORTED_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
887 }\r
888\r
889 FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PcdGet32 (PcdTcg2HashAlgorithmBitmap));\r
890 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_BIOS_HASH_ALGO_CONTENT), TempBuffer, NULL);\r
891\r
892 //\r
893 // Tcg2 Capability\r
894 //\r
895 FillBufferWithTCG2EventLogFormat (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.SupportedEventLogs);\r
896 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_SUPPORTED_EVENT_LOG_FORMAT_CONTENT), TempBuffer, NULL);\r
897\r
898 FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.HashAlgorithmBitmap);\r
899 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_HASH_ALGO_BITMAP_CONTENT), TempBuffer, NULL);\r
900\r
901 UnicodeSPrint (TempBuffer, sizeof (TempBuffer), L"%d", PrivateData->ProtocolCapability.NumberOfPCRBanks);\r
902 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_NUMBER_OF_PCR_BANKS_CONTENT), TempBuffer, NULL);\r
903\r
904 FillBufferWithBootHashAlg (TempBuffer, sizeof(TempBuffer), PrivateData->ProtocolCapability.ActivePcrBanks);\r
905 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_ACTIVE_PCR_BANKS_CONTENT), TempBuffer, NULL);\r
906\r
518b6f65
JY
907 //\r
908 // Update TPM device interface type\r
909 //\r
910 if (PrivateData->TpmDeviceDetected == TPM_DEVICE_2_0_DTPM) {\r
911 TpmDeviceInterfaceDetected = GetPtpInterface ((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
912 switch (TpmDeviceInterfaceDetected) {\r
913 case TPM_DEVICE_INTERFACE_TIS:\r
914 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"TIS", NULL);\r
915 break;\r
916 case TPM_DEVICE_INTERFACE_PTP_FIFO:\r
917 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP FIFO", NULL);\r
918 break;\r
919 case TPM_DEVICE_INTERFACE_PTP_CRB:\r
920 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"PTP CRB", NULL);\r
921 break;\r
922 default:\r
923 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_STATE_CONTENT), L"Unknown", NULL);\r
924 break;\r
925 }\r
926\r
927 Tcg2ConfigInfo.TpmDeviceInterfaceAttempt = TpmDeviceInterfaceDetected;\r
928 switch (TpmDeviceInterfaceDetected) {\r
929 case TPM_DEVICE_INTERFACE_TIS:\r
930 Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;\r
931 Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = FALSE;\r
932 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"TIS", NULL);\r
933 break;\r
934 case TPM_DEVICE_INTERFACE_PTP_FIFO:\r
935 case TPM_DEVICE_INTERFACE_PTP_CRB:\r
936 Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = IsPtpFifoSupported((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
937 Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = IsPtpCrbSupported((VOID *) (UINTN) PcdGet64 (PcdTpmBaseAddress));\r
938 TempBuffer[0] = 0;\r
939 if (Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported) {\r
940 if (TempBuffer[0] != 0) {\r
941 StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L", ");\r
942 }\r
943 StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L"PTP FIFO");\r
944 }\r
945 if (Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported) {\r
946 if (TempBuffer[0] != 0) {\r
947 StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L", ");\r
948 }\r
949 StrCatS (TempBuffer, sizeof(TempBuffer) / sizeof (CHAR16), L"PTP CRB");\r
950 }\r
951 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), TempBuffer, NULL);\r
952 break;\r
953 default:\r
954 Tcg2ConfigInfo.TpmDeviceInterfacePtpFifoSupported = FALSE;\r
955 Tcg2ConfigInfo.TpmDeviceInterfacePtpCrbSupported = FALSE;\r
956 HiiSetString (PrivateData->HiiHandle, STRING_TOKEN (STR_TCG2_DEVICE_INTERFACE_CAPABILITY_CONTENT), L"Unknown", NULL);\r
957 break;\r
958 }\r
959 }\r
960\r
c41eeb44
JY
961 //\r
962 // Set ConfigInfo, to control the check box.\r
963 //\r
964 Status = gRT->SetVariable (\r
965 TCG2_STORAGE_INFO_NAME,\r
966 &gTcg2ConfigFormSetGuid,\r
967 EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
968 sizeof(Tcg2ConfigInfo),\r
969 &Tcg2ConfigInfo\r
970 );\r
971 if (EFI_ERROR (Status)) {\r
972 DEBUG ((EFI_D_ERROR, "Tcg2ConfigDriver: Fail to set TCG2_STORAGE_INFO_NAME\n"));\r
973 }\r
1abfa4ce
JY
974 return EFI_SUCCESS; \r
975}\r
976\r
977/**\r
978 This function removes TCG2 configuration Form.\r
979\r
980 @param[in, out] PrivateData Points to TCG2 configuration private data.\r
981\r
982**/\r
983VOID\r
984UninstallTcg2ConfigForm (\r
985 IN OUT TCG2_CONFIG_PRIVATE_DATA *PrivateData\r
986 )\r
987{\r
988 //\r
989 // Uninstall HII package list\r
990 //\r
991 if (PrivateData->HiiHandle != NULL) {\r
992 HiiRemovePackages (PrivateData->HiiHandle);\r
993 PrivateData->HiiHandle = NULL;\r
994 }\r
995\r
996 //\r
997 // Uninstall HII Config Access Protocol\r
998 //\r
999 if (PrivateData->DriverHandle != NULL) {\r
1000 gBS->UninstallMultipleProtocolInterfaces (\r
1001 PrivateData->DriverHandle,\r
1002 &gEfiDevicePathProtocolGuid,\r
1003 &mTcg2HiiVendorDevicePath,\r
1004 &gEfiHiiConfigAccessProtocolGuid,\r
1005 &PrivateData->ConfigAccess,\r
1006 NULL\r
1007 );\r
1008 PrivateData->DriverHandle = NULL;\r
1009 }\r
1010 \r
1011 FreePool (PrivateData);\r
1012}\r