]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
SecurityPkg OpalPasswordPei: Go next when AhciModeInitialize is failed
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPassword / OpalHii.c
CommitLineData
112e584b
SZ
1/** @file\r
2 Implementation of the HII for the Opal UEFI Driver.\r
3\r
4Copyright (c) 2016 - 2018, 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 "OpalHii.h"\r
16\r
17//\r
18// This is the generated IFR binary Data for each formset defined in VFR.\r
19// This Data array is ready to be used as input of HiiAddPackages() to\r
20// create a packagelist (which contains Form packages, String packages, etc).\r
21//\r
22extern UINT8 OpalPasswordFormBin[];\r
23\r
24//\r
25// This is the generated String package Data for all .UNI files.\r
26// This Data array is ready to be used as input of HiiAddPackages() to\r
27// create a packagelist (which contains Form packages, String packages, etc).\r
28//\r
29extern UINT8 OpalPasswordDxeStrings[];\r
30\r
31CHAR16 OpalPasswordStorageName[] = L"OpalHiiConfig";\r
32\r
33EFI_HII_CONFIG_ACCESS_PROTOCOL gHiiConfigAccessProtocol;\r
34\r
35//\r
36// Handle to the list of HII packages (forms and strings) for this driver\r
37//\r
38EFI_HII_HANDLE gHiiPackageListHandle = NULL;\r
39\r
40//\r
41// Package List GUID containing all form and string packages\r
42//\r
43const EFI_GUID gHiiPackageListGuid = PACKAGE_LIST_GUID;\r
44const EFI_GUID gHiiSetupVariableGuid = SETUP_VARIABLE_GUID;\r
45\r
46//\r
47// Structure that contains state of the HII\r
48// This structure is updated by Hii.cpp and its contents\r
49// is rendered in the HII.\r
50//\r
51OPAL_HII_CONFIGURATION gHiiConfiguration;\r
52\r
53//\r
54// The device path containing the VENDOR_DEVICE_PATH and EFI_DEVICE_PATH_PROTOCOL\r
55//\r
56HII_VENDOR_DEVICE_PATH gHiiVendorDevicePath = {\r
57 {\r
58 {\r
59 HARDWARE_DEVICE_PATH,\r
60 HW_VENDOR_DP,\r
61 {\r
62 (UINT8)(sizeof(VENDOR_DEVICE_PATH)),\r
63 (UINT8)((sizeof(VENDOR_DEVICE_PATH)) >> 8)\r
64 }\r
65 },\r
66 OPAL_PASSWORD_CONFIG_GUID\r
67 },\r
68 {\r
69 END_DEVICE_PATH_TYPE,\r
70 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
71 {\r
72 (UINT8)(END_DEVICE_PATH_LENGTH),\r
73 (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)\r
74 }\r
75 }\r
76};\r
77\r
78/**\r
79 Get saved OPAL request.\r
80\r
81 @param[in] OpalDisk The disk needs to get the saved OPAL request.\r
82 @param[out] OpalRequest OPAL request got.\r
83\r
84**/\r
85VOID\r
86GetSavedOpalRequest (\r
87 IN OPAL_DISK *OpalDisk,\r
88 OUT OPAL_REQUEST *OpalRequest\r
89 )\r
90{\r
91 EFI_STATUS Status;\r
92 OPAL_REQUEST_VARIABLE *TempVariable;\r
93 OPAL_REQUEST_VARIABLE *Variable;\r
94 UINTN VariableSize;\r
95 EFI_DEVICE_PATH_PROTOCOL *DevicePathInVariable;\r
96 UINTN DevicePathSizeInVariable;\r
97 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
98 UINTN DevicePathSize;\r
99\r
100 DEBUG ((DEBUG_INFO, "%a() - enter\n", __FUNCTION__));\r
101\r
102 Variable = NULL;\r
103 VariableSize = 0;\r
104\r
105 Status = GetVariable2 (\r
106 OPAL_REQUEST_VARIABLE_NAME,\r
107 &gHiiSetupVariableGuid,\r
108 (VOID **) &Variable,\r
109 &VariableSize\r
110 );\r
111 if (EFI_ERROR (Status) || (Variable == NULL)) {\r
112 return;\r
113 }\r
114\r
115 TempVariable = Variable;\r
116 while ((VariableSize > sizeof (OPAL_REQUEST_VARIABLE)) &&\r
117 (VariableSize >= TempVariable->Length) &&\r
118 (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) {\r
119 DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) TempVariable + sizeof (OPAL_REQUEST_VARIABLE));\r
120 DevicePathSizeInVariable = GetDevicePathSize (DevicePathInVariable);\r
121 DevicePath = OpalDisk->OpalDevicePath;\r
122 DevicePathSize = GetDevicePathSize (DevicePath);\r
123 if ((DevicePathSize == DevicePathSizeInVariable) &&\r
124 (CompareMem (DevicePath, DevicePathInVariable, DevicePathSize) == 0)) {\r
125 //\r
126 // Found the node for the OPAL device.\r
127 // Get the OPAL request.\r
128 //\r
129 CopyMem (OpalRequest, &TempVariable->OpalRequest, sizeof (OPAL_REQUEST));\r
130 DEBUG ((\r
131 DEBUG_INFO,\r
132 "OpalRequest got: 0x%x\n",\r
133 *OpalRequest\r
134 ));\r
135 break;\r
136 }\r
137 VariableSize -= TempVariable->Length;\r
138 TempVariable = (OPAL_REQUEST_VARIABLE *) ((UINTN) TempVariable + TempVariable->Length);\r
139 }\r
140\r
141 FreePool (Variable);\r
142\r
143 DEBUG ((DEBUG_INFO, "%a() - exit\n", __FUNCTION__));\r
144}\r
145\r
146/**\r
147 Save OPAL request.\r
148\r
149 @param[in] OpalDisk The disk has OPAL request to save.\r
150 @param[in] OpalRequest OPAL request to save.\r
151\r
152**/\r
153VOID\r
154SaveOpalRequest (\r
155 IN OPAL_DISK *OpalDisk,\r
156 IN OPAL_REQUEST OpalRequest\r
157 )\r
158{\r
159 EFI_STATUS Status;\r
160 OPAL_REQUEST_VARIABLE *TempVariable;\r
161 UINTN TempVariableSize;\r
162 OPAL_REQUEST_VARIABLE *Variable;\r
163 UINTN VariableSize;\r
164 OPAL_REQUEST_VARIABLE *NewVariable;\r
165 UINTN NewVariableSize;\r
166 EFI_DEVICE_PATH_PROTOCOL *DevicePathInVariable;\r
167 UINTN DevicePathSizeInVariable;\r
168 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
169 UINTN DevicePathSize;\r
170\r
171 DEBUG ((DEBUG_INFO, "%a() - enter\n", __FUNCTION__));\r
172\r
173 DEBUG ((\r
174 DEBUG_INFO,\r
175 "OpalRequest to save: 0x%x\n",\r
176 OpalRequest\r
177 ));\r
178\r
179 Variable = NULL;\r
180 VariableSize = 0;\r
181 NewVariable = NULL;\r
182 NewVariableSize = 0;\r
183\r
184 Status = GetVariable2 (\r
185 OPAL_REQUEST_VARIABLE_NAME,\r
186 &gHiiSetupVariableGuid,\r
187 (VOID **) &Variable,\r
188 &VariableSize\r
189 );\r
190 if (!EFI_ERROR (Status) && (Variable != NULL)) {\r
191 TempVariable = Variable;\r
192 TempVariableSize = VariableSize;\r
193 while ((TempVariableSize > sizeof (OPAL_REQUEST_VARIABLE)) &&\r
194 (TempVariableSize >= TempVariable->Length) &&\r
195 (TempVariable->Length > sizeof (OPAL_REQUEST_VARIABLE))) {\r
196 DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) TempVariable + sizeof (OPAL_REQUEST_VARIABLE));\r
197 DevicePathSizeInVariable = GetDevicePathSize (DevicePathInVariable);\r
198 DevicePath = OpalDisk->OpalDevicePath;\r
199 DevicePathSize = GetDevicePathSize (DevicePath);\r
200 if ((DevicePathSize == DevicePathSizeInVariable) &&\r
201 (CompareMem (DevicePath, DevicePathInVariable, DevicePathSize) == 0)) {\r
202 //\r
203 // Found the node for the OPAL device.\r
204 // Update the OPAL request.\r
205 //\r
206 CopyMem (&TempVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST));\r
207 NewVariable = Variable;\r
208 NewVariableSize = VariableSize;\r
209 break;\r
210 }\r
211 TempVariableSize -= TempVariable->Length;\r
212 TempVariable = (OPAL_REQUEST_VARIABLE *) ((UINTN) TempVariable + TempVariable->Length);\r
213 }\r
214 if (NewVariable == NULL) {\r
215 //\r
216 // The node for the OPAL device is not found.\r
217 // Create node for the OPAL device.\r
218 //\r
219 DevicePath = OpalDisk->OpalDevicePath;\r
220 DevicePathSize = GetDevicePathSize (DevicePath);\r
221 NewVariableSize = VariableSize + sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize;\r
222 NewVariable = AllocatePool (NewVariableSize);\r
223 ASSERT (NewVariable != NULL);\r
224 CopyMem (NewVariable, Variable, VariableSize);\r
225 TempVariable = (OPAL_REQUEST_VARIABLE *) ((UINTN) NewVariable + VariableSize);\r
226 TempVariable->Length = (UINT32) (sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize);\r
227 CopyMem (&TempVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST));\r
228 DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) TempVariable + sizeof (OPAL_REQUEST_VARIABLE));\r
229 CopyMem (DevicePathInVariable, DevicePath, DevicePathSize);\r
230 }\r
231 } else {\r
232 DevicePath = OpalDisk->OpalDevicePath;\r
233 DevicePathSize = GetDevicePathSize (DevicePath);\r
234 NewVariableSize = sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize;\r
235 NewVariable = AllocatePool (NewVariableSize);\r
236 ASSERT (NewVariable != NULL);\r
237 NewVariable->Length = (UINT32) (sizeof (OPAL_REQUEST_VARIABLE) + DevicePathSize);\r
238 CopyMem (&NewVariable->OpalRequest, &OpalRequest, sizeof (OPAL_REQUEST));\r
239 DevicePathInVariable = (EFI_DEVICE_PATH_PROTOCOL *) ((UINTN) NewVariable + sizeof (OPAL_REQUEST_VARIABLE));\r
240 CopyMem (DevicePathInVariable, DevicePath, DevicePathSize);\r
241 }\r
242 Status = gRT->SetVariable (\r
243 OPAL_REQUEST_VARIABLE_NAME,\r
244 (EFI_GUID *) &gHiiSetupVariableGuid,\r
245 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
246 NewVariableSize,\r
247 NewVariable\r
248 );\r
249 if (EFI_ERROR (Status)) {\r
250 DEBUG ((DEBUG_INFO, "OpalRequest variable set failed (%r)\n", Status));\r
251 }\r
252 if (NewVariable != Variable) {\r
253 FreePool (NewVariable);\r
254 }\r
255 if (Variable != NULL) {\r
256 FreePool (Variable);\r
257 }\r
258\r
259 DEBUG ((DEBUG_INFO, "%a() - exit\n", __FUNCTION__));\r
260}\r
261\r
262/**\r
263 Sets the current system state of global config variables.\r
264\r
265**/\r
266VOID\r
267HiiSetCurrentConfiguration(\r
268 VOID\r
269 )\r
270{\r
271 UINT32 PpStorageFlag;\r
272 EFI_STRING NewString;\r
273\r
274 gHiiConfiguration.NumDisks = GetDeviceCount();\r
275\r
276 //\r
277 // Update the BlockSID status string.\r
278 //\r
279 PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags ();\r
280\r
281 if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) {\r
282 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_ENABLED), NULL);\r
283 if (NewString == NULL) {\r
284 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
285 return;\r
286 }\r
287 } else {\r
288 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISABLED), NULL);\r
289 if (NewString == NULL) {\r
290 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
291 return;\r
292 }\r
293 }\r
294 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS1), NewString, NULL);\r
295 FreePool (NewString);\r
296\r
297 if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) != 0) {\r
298 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_TRUE), NULL);\r
299 if (NewString == NULL) {\r
300 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
301 return;\r
302 }\r
303 } else {\r
304 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_FALSE), NULL);\r
305 if (NewString == NULL) {\r
306 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
307 return;\r
308 }\r
309 }\r
310 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL);\r
311 FreePool (NewString);\r
312\r
313 if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) != 0) {\r
314 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_TRUE), NULL);\r
315 if (NewString == NULL) {\r
316 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
317 return;\r
318 }\r
319 } else {\r
320 NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_FALSE), NULL);\r
321 if (NewString == NULL) {\r
322 DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
323 return;\r
324 }\r
325 }\r
326 HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS3), NewString, NULL);\r
327 FreePool (NewString);\r
328}\r
329\r
330/**\r
331 Install the HII related resources.\r
332\r
333 @retval EFI_SUCCESS Install all the resources success.\r
334 @retval other Error occur when install the resources.\r
335**/\r
336EFI_STATUS\r
337HiiInstall(\r
338 VOID\r
339 )\r
340{\r
341 EFI_STATUS Status;\r
342 EFI_HANDLE DriverHandle;\r
343\r
344 //\r
345 // Clear the global configuration.\r
346 //\r
347 ZeroMem(&gHiiConfiguration, sizeof(gHiiConfiguration));\r
348\r
349 //\r
350 // Obtain the driver handle that the BIOS assigned us\r
351 //\r
352 DriverHandle = HiiGetDriverImageHandleCB();\r
353\r
354 //\r
355 // Populate the config access protocol with the three functions we are publishing\r
356 //\r
357 gHiiConfigAccessProtocol.ExtractConfig = ExtractConfig;\r
358 gHiiConfigAccessProtocol.RouteConfig = RouteConfig;\r
359 gHiiConfigAccessProtocol.Callback = DriverCallback;\r
360\r
361 //\r
362 // Associate the required protocols with our driver handle\r
363 //\r
364 Status = gBS->InstallMultipleProtocolInterfaces(\r
365 &DriverHandle,\r
366 &gEfiHiiConfigAccessProtocolGuid,\r
367 &gHiiConfigAccessProtocol, // HII callback\r
368 &gEfiDevicePathProtocolGuid,\r
369 &gHiiVendorDevicePath, // required for HII callback allow all disks to be shown in same hii\r
370 NULL\r
371 );\r
372\r
373 if (EFI_ERROR(Status)) {\r
374 return Status;\r
375 }\r
376\r
377 return OpalHiiAddPackages();\r
378}\r
379\r
380/**\r
381 Install the HII form and string packages.\r
382\r
383 @retval EFI_SUCCESS Install all the resources success.\r
384 @retval EFI_OUT_OF_RESOURCES Out of resource error.\r
385**/\r
386EFI_STATUS\r
387OpalHiiAddPackages(\r
388 VOID\r
389 )\r
390{\r
391 EFI_HANDLE DriverHandle;\r
392 CHAR16 *NewString;\r
393\r
394 DriverHandle = HiiGetDriverImageHandleCB();\r
395\r
396 //\r
397 // Publish the HII form and HII string packages\r
398 //\r
399 gHiiPackageListHandle = HiiAddPackages(\r
400 &gHiiPackageListGuid,\r
401 DriverHandle,\r
402 OpalPasswordDxeStrings,\r
403 OpalPasswordFormBin,\r
404 (VOID*)NULL\r
405 );\r
406\r
407 //\r
408 // Make sure the packages installed successfully\r
409 //\r
410 if (gHiiPackageListHandle == NULL) {\r
411 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages failed\n"));\r
412 return EFI_OUT_OF_RESOURCES;\r
413 }\r
414\r
415 //\r
416 // Update Version String in main window\r
417 //\r
418 NewString = HiiGetDriverNameCB ();\r
419 if (HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_MAIN_OPAL_VERSION), NewString, NULL) == 0) {\r
420 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages: HiiSetString( ) failed\n"));\r
421 return EFI_OUT_OF_RESOURCES;\r
422 }\r
423\r
424 return EFI_SUCCESS;\r
425}\r
426\r
427/**\r
428 Uninstall the HII capability.\r
429\r
430 @retval EFI_SUCCESS Uninstall all the resources success.\r
431 @retval others Other errors occur when unistall the hii resource.\r
432**/\r
433EFI_STATUS\r
434HiiUninstall(\r
435 VOID\r
436 )\r
437{\r
438 EFI_STATUS Status;\r
439\r
440 //\r
441 // Remove the packages we've provided to the BIOS\r
442 //\r
443 HiiRemovePackages(gHiiPackageListHandle);\r
444\r
445 //\r
446 // Remove the protocols from our driver handle\r
447 //\r
448 Status = gBS->UninstallMultipleProtocolInterfaces(\r
449 HiiGetDriverImageHandleCB(),\r
450 &gEfiHiiConfigAccessProtocolGuid,\r
451 &gHiiConfigAccessProtocol, // HII callback\r
452 &gEfiDevicePathProtocolGuid,\r
453 &gHiiVendorDevicePath, // required for HII callback\r
454 NULL\r
455 );\r
456 if (EFI_ERROR(Status)) {\r
457 DEBUG ((DEBUG_INFO, "Cannot uninstall Hii Protocols: %r\n", Status));\r
458 }\r
459\r
460 return Status;\r
461}\r
462\r
463/**\r
464 Updates the main menu form.\r
465\r
466 @retval EFI_SUCCESS update the main form success.\r
467**/\r
468EFI_STATUS\r
469HiiPopulateMainMenuForm (\r
470 VOID\r
471 )\r
472{\r
473 UINT8 Index;\r
474 CHAR8 *DiskName;\r
475 EFI_STRING_ID DiskNameId;\r
476 OPAL_DISK *OpalDisk;\r
477\r
478 HiiSetCurrentConfiguration();\r
479\r
480 gHiiConfiguration.SupportedDisks = 0;\r
481\r
482 for (Index = 0; Index < gHiiConfiguration.NumDisks; Index++) {\r
483 OpalDisk = HiiGetOpalDiskCB (Index);\r
484 if ((OpalDisk != NULL) && OpalFeatureSupported (&OpalDisk->SupportedAttributes)) {\r
485 gHiiConfiguration.SupportedDisks |= (1 << Index);\r
486 DiskNameId = GetDiskNameStringId (Index);\r
487 DiskName = HiiDiskGetNameCB (Index);\r
488 if ((DiskName == NULL) || (DiskNameId == 0)) {\r
489 return EFI_UNSUPPORTED;\r
490 }\r
491 HiiSetFormString(DiskNameId, DiskName);\r
492 }\r
493 }\r
494\r
495 OpalHiiSetBrowserData ();\r
496 return EFI_SUCCESS;\r
497}\r
498\r
499/**\r
500 Get disk name string id.\r
501\r
502 @param DiskIndex The input disk index info.\r
503\r
504 @retval The disk name string id.\r
505\r
506**/\r
507EFI_STRING_ID\r
508GetDiskNameStringId(\r
509 UINT8 DiskIndex\r
510 )\r
511{\r
512 switch (DiskIndex) {\r
513 case 0: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_0);\r
514 case 1: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_1);\r
515 case 2: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_2);\r
516 case 3: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_3);\r
517 case 4: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_4);\r
518 case 5: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_5);\r
519 }\r
520 return 0;\r
521}\r
522\r
523/**\r
524 This function processes the results of changes in configuration.\r
525\r
526 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
527 @param Action Specifies the type of action taken by the browser.\r
528 @param QuestionId A unique value which is sent to the original\r
529 exporting driver so that it can identify the type\r
530 of data to expect.\r
531 @param Type The type of value for the question.\r
532 @param Value A pointer to the data being sent to the original\r
533 exporting driver.\r
534 @param ActionRequest On return, points to the action requested by the\r
535 callback function.\r
536\r
537 @retval EFI_SUCCESS The callback successfully handled the action.\r
538 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
539 variable and its data.\r
540 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
541 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
542 callback.\r
543\r
544**/\r
545EFI_STATUS\r
546EFIAPI\r
547DriverCallback(\r
548 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
549 EFI_BROWSER_ACTION Action,\r
550 EFI_QUESTION_ID QuestionId,\r
551 UINT8 Type,\r
552 EFI_IFR_TYPE_VALUE *Value,\r
553 EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
554 )\r
555{\r
556 HII_KEY HiiKey;\r
557 UINT8 HiiKeyId;\r
558 UINT32 PpRequest;\r
559 OPAL_DISK *OpalDisk;\r
560\r
561 if (ActionRequest != NULL) {\r
562 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
563 } else {\r
564 return EFI_INVALID_PARAMETER;\r
565 }\r
566\r
567 //\r
568 // If QuestionId is an auto-generated key (label, empty line, etc.), ignore it.\r
569 //\r
570 if ((QuestionId & HII_KEY_FLAG) == 0) {\r
571 return EFI_SUCCESS;\r
572 }\r
573\r
574 HiiKey.Raw = QuestionId;\r
575 HiiKeyId = (UINT8) HiiKey.KeyBits.Id;\r
576\r
577 if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
578 switch (HiiKeyId) {\r
579 case HII_KEY_ID_VAR_SUPPORTED_DISKS:\r
580 DEBUG ((DEBUG_INFO, "HII_KEY_ID_VAR_SUPPORTED_DISKS\n"));\r
581 return HiiPopulateMainMenuForm ();\r
582\r
583 case HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS:\r
584 DEBUG ((DEBUG_INFO, "HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS\n"));\r
585 return HiiPopulateDiskInfoForm();\r
586 }\r
587 } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
588 switch (HiiKeyId) {\r
589 case HII_KEY_ID_GOTO_DISK_INFO:\r
590 return HiiSelectDisk((UINT8)HiiKey.KeyBits.Index);\r
591 }\r
592 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
593 switch (HiiKeyId) {\r
594 case HII_KEY_ID_BLOCKSID:\r
595 switch (Value->u8) {\r
596 case 0:\r
597 PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
598 break;\r
599\r
600 case 1:\r
601 PpRequest = TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID;\r
602 break;\r
603\r
604 case 2:\r
605 PpRequest = TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID;\r
606 break;\r
607\r
608 case 3:\r
609 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE;\r
610 break;\r
611\r
612 case 4:\r
613 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE;\r
614 break;\r
615\r
616 case 5:\r
617 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE;\r
618 break;\r
619\r
620 case 6:\r
621 PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE;\r
622 break;\r
623\r
624 default:\r
625 PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
626 DEBUG ((DEBUG_ERROR, "Invalid value input!\n"));\r
627 break;\r
628 }\r
629 HiiSetBlockSidAction(PpRequest);\r
630\r
631 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
632 return EFI_SUCCESS;\r
633\r
634 case HII_KEY_ID_SET_ADMIN_PWD:\r
635 DEBUG ((DEBUG_INFO, "HII_KEY_ID_SET_ADMIN_PWD\n"));\r
636 gHiiConfiguration.OpalRequest.SetAdminPwd = Value->b;\r
637 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
638 if (OpalDisk != NULL) {\r
639 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
640 }\r
641 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
642 return EFI_SUCCESS;\r
643\r
644 case HII_KEY_ID_SET_USER_PWD:\r
645 DEBUG ((DEBUG_INFO, "HII_KEY_ID_SET_USER_PWD\n"));\r
646 gHiiConfiguration.OpalRequest.SetUserPwd = Value->b;\r
647 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
648 if (OpalDisk != NULL) {\r
649 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
650 }\r
651 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
652 return EFI_SUCCESS;\r
653\r
654 case HII_KEY_ID_SECURE_ERASE:\r
655 DEBUG ((DEBUG_INFO, "HII_KEY_ID_SECURE_ERASE\n"));\r
656 gHiiConfiguration.OpalRequest.SecureErase = Value->b;\r
657 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
658 if (OpalDisk != NULL) {\r
659 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
660 }\r
661 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
662 return EFI_SUCCESS;\r
663 \r
664 case HII_KEY_ID_REVERT:\r
665 DEBUG ((DEBUG_INFO, "HII_KEY_ID_REVERT\n"));\r
666 gHiiConfiguration.OpalRequest.Revert = Value->b;\r
667 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
668 if (OpalDisk != NULL) {\r
669 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
670 }\r
671 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
672 return EFI_SUCCESS;\r
673 case HII_KEY_ID_KEEP_USER_DATA:\r
674 DEBUG ((DEBUG_INFO, "HII_KEY_ID_KEEP_USER_DATA\n"));\r
675 gHiiConfiguration.OpalRequest.KeepUserData = Value->b;\r
676 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
677 if (OpalDisk != NULL) {\r
678 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
679 }\r
680 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
681 return EFI_SUCCESS;\r
682\r
683 case HII_KEY_ID_PSID_REVERT:\r
684 DEBUG ((DEBUG_INFO, "HII_KEY_ID_PSID_REVERT\n"));\r
685 gHiiConfiguration.OpalRequest.PsidRevert = Value->b;\r
686 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
687 if (OpalDisk != NULL) {\r
688 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
689 }\r
690 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
691 return EFI_SUCCESS;\r
692\r
693 case HII_KEY_ID_DISABLE_USER:\r
694 DEBUG ((DEBUG_INFO, "HII_KEY_ID_DISABLE_USER\n"));\r
695 gHiiConfiguration.OpalRequest.DisableUser = Value->b;\r
696 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
697 if (OpalDisk != NULL) {\r
698 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
699 }\r
700 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
701 return EFI_SUCCESS;\r
702\r
703 case HII_KEY_ID_ENABLE_FEATURE:\r
704 DEBUG ((DEBUG_INFO, "HII_KEY_ID_ENABLE_FEATURE\n"));\r
705 gHiiConfiguration.OpalRequest.EnableFeature = Value->b;\r
706 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
707 if (OpalDisk != NULL) {\r
708 SaveOpalRequest (OpalDisk, gHiiConfiguration.OpalRequest);\r
709 }\r
710 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
711 return EFI_SUCCESS;\r
712\r
713 default:\r
714 break;\r
715 }\r
716 }\r
717\r
718 return EFI_UNSUPPORTED;\r
719}\r
720\r
721/**\r
722 Update the global Disk index info.\r
723\r
724 @param Index The input disk index info.\r
725\r
726 @retval EFI_SUCCESS Update the disk index info success.\r
727\r
728**/\r
729EFI_STATUS\r
730HiiSelectDisk(\r
731 UINT8 Index\r
732 )\r
733{\r
734 OpalHiiGetBrowserData();\r
735 gHiiConfiguration.SelectedDiskIndex = Index;\r
736 OpalHiiSetBrowserData ();\r
737\r
738 return EFI_SUCCESS;\r
739}\r
740\r
741/**\r
742 Draws the disk info form.\r
743\r
744 @retval EFI_SUCCESS Draw the disk info success.\r
745\r
746**/\r
747EFI_STATUS\r
748HiiPopulateDiskInfoForm(\r
749 VOID\r
750 )\r
751{\r
752 OPAL_DISK* OpalDisk;\r
753 OPAL_DISK_ACTIONS AvailActions;\r
754 TCG_RESULT Ret;\r
755 CHAR8 *DiskName;\r
756\r
757 OpalHiiGetBrowserData();\r
758\r
759 DiskName = HiiDiskGetNameCB (gHiiConfiguration.SelectedDiskIndex);\r
760 if (DiskName == NULL) {\r
761 return EFI_UNSUPPORTED;\r
762 }\r
763 HiiSetFormString(STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME), DiskName);\r
764\r
765 gHiiConfiguration.SelectedDiskAvailableActions = HII_ACTION_NONE;\r
766 ZeroMem (&gHiiConfiguration.OpalRequest, sizeof (OPAL_REQUEST));\r
767 gHiiConfiguration.KeepUserDataForced = FALSE;\r
768\r
769 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
770\r
771 if (OpalDisk != NULL) {\r
772 OpalDiskUpdateStatus (OpalDisk);\r
773 Ret = OpalSupportGetAvailableActions(&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions);\r
774 if (Ret == TcgResultSuccess) {\r
775 //\r
776 // Update actions, always allow PSID Revert\r
777 //\r
778 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.PsidRevert == 1) ? HII_ACTION_PSID_REVERT : HII_ACTION_NONE;\r
779\r
780 //\r
781 // Always allow unlock to handle device migration\r
782 //\r
783 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Unlock == 1) ? HII_ACTION_UNLOCK : HII_ACTION_NONE;\r
784\r
785 if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) {\r
786 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
787 gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_FEATURE;\r
788\r
789 //\r
790 // Update strings\r
791 //\r
792 HiiSetFormString( STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default");\r
793 } else {\r
794 DEBUG ((DEBUG_INFO, "Feature disabled but ownership != nobody\n"));\r
795 }\r
796 } else {\r
797 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Revert == 1) ? HII_ACTION_REVERT : HII_ACTION_NONE;\r
798 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.AdminPass == 1) ? HII_ACTION_SET_ADMIN_PWD : HII_ACTION_NONE;\r
799 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE;\r
800 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE;\r
801 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE;\r
802\r
803 HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable");\r
804\r
805 //\r
806 // Determine revert options for disk\r
807 // Default initialize keep user Data to be true\r
808 //\r
809 gHiiConfiguration.OpalRequest.KeepUserData = 1;\r
810 if (AvailActions.RevertKeepDataForced) {\r
811 gHiiConfiguration.KeepUserDataForced = TRUE;\r
812 }\r
813 }\r
814 }\r
815\r
816 GetSavedOpalRequest (OpalDisk, &gHiiConfiguration.OpalRequest);\r
817 }\r
818\r
819 //\r
820 // Pass the current configuration to the BIOS\r
821 //\r
822 OpalHiiSetBrowserData ();\r
823\r
824 return EFI_SUCCESS;\r
825}\r
826\r
827/**\r
828 Send BlockSid request through TPM physical presence module.\r
829\r
830 @param PpRequest TPM physical presence operation request.\r
831\r
832 @retval EFI_SUCCESS Do the required action success.\r
833 @retval Others Other error occur.\r
834\r
835**/\r
836EFI_STATUS\r
837HiiSetBlockSidAction (\r
838 IN UINT32 PpRequest\r
839 )\r
840{\r
841 UINT32 ReturnCode;\r
842 EFI_STATUS Status;\r
843\r
844 ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
845 if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
846 Status = EFI_SUCCESS;\r
847 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
848 Status = EFI_OUT_OF_RESOURCES;\r
849 } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
850 Status = EFI_UNSUPPORTED;\r
851 } else {\r
852 Status = EFI_DEVICE_ERROR;\r
853 }\r
854\r
855 return Status;\r
856}\r
857\r
858/**\r
859 This function processes the results of changes in configuration.\r
860\r
861 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
862 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
863 format.\r
864 @param Progress A pointer to a string filled in with the offset of\r
865 the most recent '&' before the first failing\r
866 name/value pair (or the beginning of the string if\r
867 the failure is in the first name/value pair) or\r
868 the terminating NULL if all was successful.\r
869\r
870 @retval EFI_SUCCESS The Results is processed successfully.\r
871 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
872 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
873 driver.\r
874\r
875**/\r
876EFI_STATUS\r
877EFIAPI\r
878RouteConfig(\r
879 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
880 CONST EFI_STRING Configuration,\r
881 EFI_STRING *Progress\r
882 )\r
883{\r
884 if (Configuration == NULL || Progress == NULL) {\r
885 return (EFI_INVALID_PARAMETER);\r
886 }\r
887\r
888 *Progress = Configuration;\r
889 if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
890 return EFI_NOT_FOUND;\r
891 }\r
892\r
893 *Progress = Configuration + StrLen (Configuration);\r
894\r
895 return EFI_SUCCESS;\r
896}\r
897\r
898/**\r
899 This function allows a caller to extract the current configuration for one\r
900 or more named elements from the target driver.\r
901\r
902 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
903 @param Request A null-terminated Unicode string in\r
904 <ConfigRequest> format.\r
905 @param Progress On return, points to a character in the Request\r
906 string. Points to the string's null terminator if\r
907 request was successful. Points to the most recent\r
908 '&' before the first failing name/value pair (or\r
909 the beginning of the string if the failure is in\r
910 the first name/value pair) if the request was not\r
911 successful.\r
912 @param Results A null-terminated Unicode string in\r
913 <ConfigAltResp> format which has all values filled\r
914 in for the names in the Request string. String to\r
915 be allocated by the called function.\r
916\r
917 @retval EFI_SUCCESS The Results is filled with the requested values.\r
918 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
919 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
920 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
921 driver.\r
922\r
923**/\r
924EFI_STATUS\r
925EFIAPI\r
926ExtractConfig(\r
927 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
928 CONST EFI_STRING Request,\r
929 EFI_STRING *Progress,\r
930 EFI_STRING *Results\r
931 )\r
932{\r
933 EFI_STATUS Status;\r
934 EFI_STRING ConfigRequest;\r
935 EFI_STRING ConfigRequestHdr;\r
936 UINTN BufferSize;\r
937 UINTN Size;\r
938 BOOLEAN AllocatedRequest;\r
939 EFI_HANDLE DriverHandle;\r
940\r
941 //\r
942 // Check for valid parameters\r
943 //\r
944 if (Progress == NULL || Results == NULL) {\r
945 return (EFI_INVALID_PARAMETER);\r
946 }\r
947\r
948 *Progress = Request;\r
949 if ((Request != NULL) &&\r
950 !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
951 return EFI_NOT_FOUND;\r
952 }\r
953\r
954 AllocatedRequest = FALSE;\r
955 BufferSize = sizeof (OPAL_HII_CONFIGURATION);\r
956 ConfigRequest = Request;\r
957 if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
958 //\r
959 // Request has no request element, construct full request string.\r
960 // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
961 // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
962 //\r
963 DriverHandle = HiiGetDriverImageHandleCB();\r
964 ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle);\r
965 Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
966 ConfigRequest = AllocateZeroPool (Size);\r
967 if (ConfigRequest == NULL) {\r
968 return EFI_OUT_OF_RESOURCES;\r
969 }\r
970 AllocatedRequest = TRUE;\r
971 UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
972 FreePool (ConfigRequestHdr);\r
973 }\r
974\r
975 //\r
976 // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
977 //\r
978 Status = gHiiConfigRouting->BlockToConfig(\r
979 gHiiConfigRouting,\r
980 ConfigRequest,\r
981 (UINT8*)&gHiiConfiguration,\r
982 sizeof(OPAL_HII_CONFIGURATION),\r
983 Results,\r
984 Progress\r
985 );\r
986\r
987 //\r
988 // Free the allocated config request string.\r
989 //\r
990 if (AllocatedRequest) {\r
991 FreePool (ConfigRequest);\r
992 ConfigRequest = NULL;\r
993 }\r
994\r
995 //\r
996 // Set Progress string to the original request string.\r
997 //\r
998 if (Request == NULL) {\r
999 *Progress = NULL;\r
1000 } else if (StrStr (Request, L"OFFSET") == NULL) {\r
1001 *Progress = Request + StrLen (Request);\r
1002 }\r
1003\r
1004 return (Status);\r
1005}\r
1006\r
1007\r
1008/**\r
1009\r
1010 Pass the current system state to the bios via the hii_G_Configuration.\r
1011\r
1012**/\r
1013VOID\r
1014OpalHiiSetBrowserData (\r
1015 VOID\r
1016 )\r
1017{\r
1018 HiiSetBrowserData(\r
1019 &gHiiSetupVariableGuid,\r
1020 (CHAR16*)L"OpalHiiConfig",\r
1021 sizeof(gHiiConfiguration),\r
1022 (UINT8*)&gHiiConfiguration,\r
1023 NULL\r
1024 );\r
1025}\r
1026\r
1027\r
1028/**\r
1029\r
1030 Populate the hii_g_Configuraton with the browser Data.\r
1031\r
1032**/\r
1033VOID\r
1034OpalHiiGetBrowserData (\r
1035 VOID\r
1036 )\r
1037{\r
1038 HiiGetBrowserData(\r
1039 &gHiiSetupVariableGuid,\r
1040 (CHAR16*)L"OpalHiiConfig",\r
1041 sizeof(gHiiConfiguration),\r
1042 (UINT8*)&gHiiConfiguration\r
1043 );\r
1044}\r
1045\r
1046/**\r
1047 Set a string Value in a form.\r
1048\r
1049 @param DestStringId The stringid which need to update.\r
1050 @param SrcAsciiStr The string nned to update.\r
1051\r
1052 @retval EFI_SUCCESS Do the required action success.\r
1053 @retval Others Other error occur.\r
1054\r
1055**/\r
1056EFI_STATUS\r
1057HiiSetFormString(\r
1058 EFI_STRING_ID DestStringId,\r
1059 CHAR8 *SrcAsciiStr\r
1060 )\r
1061{\r
1062 UINT32 Len;\r
1063 UINT32 UniSize;\r
1064 CHAR16* UniStr;\r
1065\r
1066 //\r
1067 // Determine the Length of the sting\r
1068 //\r
1069 Len = ( UINT32 )AsciiStrLen( SrcAsciiStr );\r
1070\r
1071 //\r
1072 // Allocate space for the unicode string, including terminator\r
1073 //\r
1074 UniSize = (Len + 1) * sizeof(CHAR16);\r
1075 UniStr = (CHAR16*)AllocateZeroPool(UniSize);\r
1076\r
1077 //\r
1078 // Copy into unicode string, then copy into string id\r
1079 //\r
1080 AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1);\r
1081\r
1082 //\r
1083 // Update the string in the form\r
1084 //\r
1085 if (HiiSetString(gHiiPackageListHandle, DestStringId, UniStr, NULL) == 0) {\r
1086 DEBUG ((DEBUG_INFO, "HiiSetFormString( ) failed\n"));\r
1087 FreePool(UniStr);\r
1088 return (EFI_OUT_OF_RESOURCES);\r
1089 }\r
1090\r
1091 //\r
1092 // Free the memory\r
1093 //\r
1094 FreePool(UniStr);\r
1095\r
1096 return (EFI_SUCCESS);\r
1097}\r
1098\r
1099/**\r
1100 Initialize the Opal disk base on the hardware info get from device.\r
1101\r
1102 @param Dev The Opal device.\r
1103\r
1104 @retval EFI_SUCESS Initialize the device success.\r
1105 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1106\r
1107**/\r
1108EFI_STATUS\r
1109OpalDiskInitialize (\r
1110 IN OPAL_DRIVER_DEVICE *Dev\r
1111 )\r
1112{\r
1113 TCG_RESULT TcgResult;\r
1114 OPAL_SESSION Session;\r
1115\r
1116 ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK));\r
1117 Dev->OpalDisk.Sscp = Dev->Sscp;\r
1118 Dev->OpalDisk.MediaId = Dev->MediaId;\r
1119 Dev->OpalDisk.OpalDevicePath = Dev->OpalDevicePath;\r
1120\r
1121 ZeroMem(&Session, sizeof(Session));\r
1122 Session.Sscp = Dev->Sscp;\r
1123 Session.MediaId = Dev->MediaId;\r
1124\r
1125 TcgResult = OpalGetSupportedAttributesInfo (&Session, &Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.OpalBaseComId);\r
1126 if (TcgResult != TcgResultSuccess) {\r
1127 return EFI_DEVICE_ERROR;\r
1128 }\r
1129 Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;\r
1130\r
1131 TcgResult = OpalUtilGetMsid (&Session, Dev->OpalDisk.Msid, OPAL_MSID_LENGHT, &Dev->OpalDisk.MsidLength);\r
1132 if (TcgResult != TcgResultSuccess) {\r
1133 return EFI_DEVICE_ERROR;\r
1134 }\r
1135\r
1136 return OpalDiskUpdateStatus (&Dev->OpalDisk);\r
1137}\r
1138\r
1139/**\r
1140 Update the device info.\r
1141\r
1142 @param OpalDisk The Opal device.\r
1143\r
1144 @retval EFI_SUCESS Initialize the device success.\r
1145 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1146 @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info.\r
1147\r
1148**/\r
1149EFI_STATUS\r
1150OpalDiskUpdateStatus (\r
1151 OPAL_DISK *OpalDisk\r
1152 )\r
1153{\r
1154 TCG_RESULT TcgResult;\r
1155 OPAL_SESSION Session;\r
1156\r
1157 ZeroMem(&Session, sizeof(Session));\r
1158 Session.Sscp = OpalDisk->Sscp;\r
1159 Session.MediaId = OpalDisk->MediaId;\r
1160 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1161\r
1162 TcgResult = OpalGetLockingInfo(&Session, &OpalDisk->LockingFeature);\r
1163 if (TcgResult != TcgResultSuccess) {\r
1164 return EFI_DEVICE_ERROR;\r
1165 }\r
1166\r
1167 if (OpalDisk->MsidLength == 0) {\r
1168 return EFI_INVALID_PARAMETER;\r
1169 } else {\r
1170 //\r
1171 // Base on the Msid info to get the ownership, so Msid info must get first.\r
1172 //\r
1173 OpalDisk->Owner = OpalUtilDetermineOwnership(&Session, OpalDisk->Msid, OpalDisk->MsidLength);\r
1174 }\r
1175\r
1176 return EFI_SUCCESS;\r
1177}\r
1178\r