]> git.proxmox.com Git - mirror_edk2.git/blame - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c
Security/OpalPasswordDxe: Enhance the logic in RouteConfig/ExtractConfig
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordDxe / OpalHii.c
CommitLineData
a06875e1
ED
1/** @file\r
2 Implementation of the HII for the Opal UEFI Driver.\r
3\r
4Copyright (c) 2016, 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#include "OpalDriver.h"\r
17#include "OpalHiiPrivate.h"\r
18\r
19//\r
20// This is the generated IFR binary Data for each formset defined in VFR.\r
21// This Data array is ready to be used as input of HiiAddPackages() to\r
22// create a packagelist (which contains Form packages, String packages, etc).\r
23//\r
24extern UINT8 OpalPasswordFormBin[];\r
25\r
26//\r
27// This is the generated String package Data for all .UNI files.\r
28// This Data array is ready to be used as input of HiiAddPackages() to\r
29// create a packagelist (which contains Form packages, String packages, etc).\r
30//\r
31extern UINT8 OpalPasswordDxeStrings[];\r
32\r
eafbd7a2
DB
33CHAR16 OpalPasswordStorageName[] = L"OpalHiiConfig";\r
34\r
a06875e1
ED
35EFI_HII_CONFIG_ACCESS_PROTOCOL gHiiConfigAccessProtocol;\r
36\r
37//\r
38// Handle to the list of HII packages (forms and strings) for this driver\r
39//\r
40EFI_HII_HANDLE gHiiPackageListHandle = NULL;\r
41\r
42//\r
43// Package List GUID containing all form and string packages\r
44//\r
45const EFI_GUID gHiiPackageListGuid = PACKAGE_LIST_GUID;\r
46const EFI_GUID gHiiSetupVariableGuid = SETUP_VARIABLE_GUID;\r
47\r
48//\r
49// Structure that contains state of the HII\r
50// This structure is updated by Hii.cpp and its contents\r
51// is rendered in the HII.\r
52//\r
53OPAL_HII_CONFIGURATION gHiiConfiguration;\r
54\r
55CHAR8 gHiiOldPassword[MAX_PASSWORD_CHARACTER_LENGTH] = {0};\r
56UINT32 gHiiOldPasswordLength = 0;\r
57\r
58//\r
59// The device path containing the VENDOR_DEVICE_PATH and EFI_DEVICE_PATH_PROTOCOL\r
60//\r
61HII_VENDOR_DEVICE_PATH gHiiVendorDevicePath = {\r
62 {\r
63 {\r
64 HARDWARE_DEVICE_PATH,\r
65 HW_VENDOR_DP,\r
66 {\r
67 (UINT8)(sizeof(VENDOR_DEVICE_PATH)),\r
68 (UINT8)((sizeof(VENDOR_DEVICE_PATH)) >> 8)\r
69 }\r
70 },\r
71 OPAL_PASSWORD_CONFIG_GUID\r
72 },\r
73 {\r
74 END_DEVICE_PATH_TYPE,\r
75 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
76 {\r
77 (UINT8)(END_DEVICE_PATH_LENGTH),\r
78 (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)\r
79 }\r
80 }\r
81};\r
82\r
83\r
84/**\r
85 Sets the current system state of global config variables.\r
86\r
87**/\r
88VOID\r
89HiiSetCurrentConfiguration(\r
90 VOID\r
91 )\r
92{\r
93 EFI_STATUS Status;\r
94 OPAL_EXTRA_INFO_VAR OpalExtraInfo;\r
95 UINTN DataSize;\r
96\r
97 gHiiConfiguration.NumDisks = GetDeviceCount();\r
98\r
99 DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
100 Status = gRT->GetVariable (\r
101 OPAL_EXTRA_INFO_VAR_NAME,\r
102 &gOpalExtraInfoVariableGuid,\r
103 NULL,\r
104 &DataSize,\r
105 &OpalExtraInfo\r
106 );\r
a06875e1
ED
107 if (!EFI_ERROR (Status)) {\r
108 gHiiConfiguration.EnableBlockSid = OpalExtraInfo.EnableBlockSid;\r
109 }\r
110}\r
111\r
a06875e1
ED
112/**\r
113 Install the HII related resources.\r
114\r
115 @retval EFI_SUCCESS Install all the resources success.\r
116 @retval other Error occur when install the resources.\r
117**/\r
118EFI_STATUS\r
119HiiInstall(\r
120 VOID\r
121 )\r
122{\r
123 EFI_STATUS Status;\r
124 EFI_HANDLE DriverHandle;\r
125\r
a06875e1
ED
126 //\r
127 // Clear the global configuration.\r
128 //\r
129 ZeroMem(&gHiiConfiguration, sizeof(gHiiConfiguration));\r
130\r
131 //\r
132 // Obtain the driver handle that the BIOS assigned us\r
133 //\r
134 DriverHandle = HiiGetDriverImageHandleCB();\r
135\r
136 //\r
137 // Populate the config access protocol with the three functions we are publishing\r
138 //\r
139 gHiiConfigAccessProtocol.ExtractConfig = ExtractConfig;\r
140 gHiiConfigAccessProtocol.RouteConfig = RouteConfig;\r
141 gHiiConfigAccessProtocol.Callback = DriverCallback;\r
142\r
143 //\r
144 // Associate the required protocols with our driver handle\r
145 //\r
146 Status = gBS->InstallMultipleProtocolInterfaces(\r
147 &DriverHandle,\r
148 &gEfiHiiConfigAccessProtocolGuid,\r
149 &gHiiConfigAccessProtocol, // HII callback\r
150 &gEfiDevicePathProtocolGuid,\r
151 &gHiiVendorDevicePath, // required for HII callback allow all disks to be shown in same hii\r
152 NULL\r
153 );\r
154\r
155 if (EFI_ERROR(Status)) {\r
156 return Status;\r
157 }\r
158\r
159 return OpalHiiAddPackages();\r
160}\r
161\r
162/**\r
163 Install the HII form and string packages.\r
164\r
165 @retval EFI_SUCCESS Install all the resources success.\r
166 @retval EFI_OUT_OF_RESOURCES Out of resource error.\r
167**/\r
168EFI_STATUS\r
169OpalHiiAddPackages(\r
170 VOID\r
171 )\r
172{\r
173 EFI_HANDLE DriverHandle;\r
174 CHAR16 *NewString;\r
175\r
176 DriverHandle = HiiGetDriverImageHandleCB();\r
177\r
178 //\r
179 // Publish the HII form and HII string packages\r
180 //\r
181 gHiiPackageListHandle = HiiAddPackages(\r
182 &gHiiPackageListGuid,\r
183 DriverHandle,\r
184 OpalPasswordDxeStrings,\r
185 OpalPasswordFormBin,\r
186 (VOID*)NULL\r
187 );\r
188\r
189 //\r
190 // Make sure the packages installed successfully\r
191 //\r
192 if (gHiiPackageListHandle == NULL) {\r
193 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages failed\n"));\r
194 return EFI_OUT_OF_RESOURCES;\r
195 }\r
196\r
197 //\r
198 // Update Version String in main window\r
199 //\r
200 NewString = HiiGetDriverNameCB ();\r
201 if (HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_MAIN_OPAL_VERSION), NewString, NULL) == 0) {\r
202 DEBUG ((DEBUG_INFO, "OpalHiiAddPackages: HiiSetString( ) failed\n"));\r
203 return EFI_OUT_OF_RESOURCES;\r
204 }\r
205\r
206 return EFI_SUCCESS;\r
207}\r
208\r
209/**\r
210 Uninstall the HII capability.\r
211\r
212 @retval EFI_SUCCESS Uninstall all the resources success.\r
213 @retval others Other errors occur when unistall the hii resource.\r
214**/\r
215EFI_STATUS\r
216HiiUninstall(\r
217 VOID\r
218 )\r
219{\r
220 EFI_STATUS Status;\r
221\r
222 //\r
223 // Remove the packages we've provided to the BIOS\r
224 //\r
225 HiiRemovePackages(gHiiPackageListHandle);\r
226\r
227 //\r
228 // Remove the protocols from our driver handle\r
229 //\r
230 Status = gBS->UninstallMultipleProtocolInterfaces(\r
231 HiiGetDriverImageHandleCB(),\r
232 &gEfiHiiConfigAccessProtocolGuid,\r
233 &gHiiConfigAccessProtocol, // HII callback\r
234 &gEfiDevicePathProtocolGuid,\r
235 &gHiiVendorDevicePath, // required for HII callback\r
236 NULL\r
237 );\r
238 if (EFI_ERROR(Status)) {\r
239 DEBUG ((DEBUG_INFO, "Cannot uninstall Hii Protocols: %r\n", Status));\r
240 }\r
241\r
242 return Status;\r
243}\r
244\r
245/**\r
246 Updates the main menu form.\r
247\r
248 @retval EFI_SUCCESS update the main form success.\r
249**/\r
250EFI_STATUS\r
251HiiPopulateMainMenuForm (\r
252 VOID\r
253 )\r
254{\r
255 UINT8 Index;\r
256 CHAR8 *DiskName;\r
257 EFI_STRING_ID DiskNameId;\r
258 OPAL_DISK *OpalDisk;\r
259\r
260 HiiSetCurrentConfiguration();\r
261\r
262 gHiiConfiguration.SupportedDisks = 0;\r
263\r
264 for (Index = 0; Index < gHiiConfiguration.NumDisks; Index++) {\r
265 OpalDisk = HiiGetOpalDiskCB (Index);\r
266 if ((OpalDisk != NULL) && OpalFeatureSupported (&OpalDisk->SupportedAttributes)) {\r
267 gHiiConfiguration.SupportedDisks |= (1 << Index);\r
268 DiskNameId = GetDiskNameStringId (Index);\r
269 DiskName = HiiDiskGetNameCB (Index);\r
270 if ((DiskName == NULL) || (DiskNameId == 0)) {\r
271 return EFI_UNSUPPORTED;\r
272 }\r
273 HiiSetFormString(DiskNameId, DiskName);\r
274 }\r
275 }\r
276\r
277 OpalHiiSetBrowserData ();\r
278 return EFI_SUCCESS;\r
279}\r
280\r
281/**\r
282 Update the disk action info.\r
283\r
284 @param ActionString\r
285 @param SelectedAction\r
286\r
287 @retval EFI_SUCCESS Uninstall all the resources success.\r
288**/\r
289EFI_STATUS\r
290HiiSelectDiskAction (\r
291 CHAR8 *ActionString,\r
292 UINT8 SelectedAction\r
293 )\r
294{\r
295 OPAL_DISK *OpalDisk;\r
296 OPAL_DISK_ACTIONS AvailActions;\r
297\r
298 OpalHiiGetBrowserData ();\r
299\r
300 HiiSetFormString(STRING_TOKEN(STR_DISK_ACTION_LBL), ActionString);\r
301 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), " ");\r
302\r
303 gHiiConfiguration.SelectedAction = SelectedAction;\r
304 gHiiConfiguration.AvailableFields = 0;\r
305\r
306 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
307 if (OpalDisk == NULL) {\r
308 return EFI_INVALID_PARAMETER;\r
309 }\r
310\r
311 if (OpalSupportGetAvailableActions (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions) != TcgResultSuccess) {\r
312 return EFI_DEVICE_ERROR;\r
313 }\r
314\r
315 switch (SelectedAction) {\r
316 case HII_KEY_ID_GOTO_LOCK:\r
317 case HII_KEY_ID_GOTO_UNLOCK:\r
318 case HII_KEY_ID_GOTO_SET_ADMIN_PWD:\r
319 case HII_KEY_ID_GOTO_SET_USER_PWD:\r
320 case HII_KEY_ID_GOTO_SECURE_ERASE:\r
321 case HII_KEY_ID_GOTO_DISABLE_USER:\r
322 case HII_KEY_ID_GOTO_ENABLE_FEATURE: // User is required to enter Password to enable Feature\r
323 gHiiConfiguration.AvailableFields |= HII_FIELD_PASSWORD;\r
324 break;\r
325\r
326 case HII_KEY_ID_GOTO_PSID_REVERT:\r
327 gHiiConfiguration.AvailableFields |= HII_FIELD_PSID;\r
328 break;\r
329\r
330 case HII_KEY_ID_GOTO_REVERT:\r
331 gHiiConfiguration.AvailableFields |= HII_FIELD_PASSWORD;\r
ea2a6eb7
ED
332 if (OpalDisk->SupportedAttributes.PyriteSsc != 1) {\r
333 //\r
334 // According to current Pyrite SSC Spec 1.00, there is no parameter for RevertSP method.\r
335 // So issue RevertSP method without any parameter by suppress KeepUserData option.\r
336 //\r
337 gHiiConfiguration.AvailableFields |= HII_FIELD_KEEP_USER_DATA;\r
338 }\r
a06875e1
ED
339 if (AvailActions.RevertKeepDataForced) {\r
340 gHiiConfiguration.AvailableFields |= HII_FIELD_KEEP_USER_DATA_FORCED;\r
341 }\r
342 break;\r
343 }\r
344\r
345 OpalHiiSetBrowserData ();\r
346\r
347 return EFI_SUCCESS;\r
348}\r
349\r
350/**\r
351 Get disk name string id.\r
352\r
353 @param DiskIndex The input disk index info.\r
354\r
355 @retval The disk name string id.\r
356\r
357**/\r
358EFI_STRING_ID\r
359GetDiskNameStringId(\r
360 UINT8 DiskIndex\r
361 )\r
362{\r
363 switch (DiskIndex) {\r
364 case 0: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_0);\r
365 case 1: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_1);\r
366 case 2: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_2);\r
367 case 3: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_3);\r
368 case 4: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_4);\r
369 case 5: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_5);\r
370 }\r
371 return 0;\r
372}\r
373\r
374/**\r
375 This function processes the results of changes in configuration.\r
376\r
377 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
378 @param Action Specifies the type of action taken by the browser.\r
379 @param QuestionId A unique value which is sent to the original\r
380 exporting driver so that it can identify the type\r
381 of data to expect.\r
382 @param Type The type of value for the question.\r
383 @param Value A pointer to the data being sent to the original\r
384 exporting driver.\r
385 @param ActionRequest On return, points to the action requested by the\r
386 callback function.\r
387\r
388 @retval EFI_SUCCESS The callback successfully handled the action.\r
389 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
390 variable and its data.\r
391 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
392 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
393 callback.\r
394\r
395**/\r
396EFI_STATUS\r
397EFIAPI\r
398DriverCallback(\r
b4ddf0eb 399 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
a06875e1
ED
400 EFI_BROWSER_ACTION Action,\r
401 EFI_QUESTION_ID QuestionId,\r
402 UINT8 Type,\r
b4ddf0eb
ED
403 EFI_IFR_TYPE_VALUE *Value,\r
404 EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
a06875e1
ED
405 )\r
406{\r
407 HII_KEY HiiKey;\r
408 UINT8 HiiKeyId;\r
409\r
410 if (ActionRequest != NULL) {\r
411 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
b4ddf0eb
ED
412 } else {\r
413 return EFI_INVALID_PARAMETER;\r
a06875e1
ED
414 }\r
415\r
416 //\r
417 // If QuestionId is an auto-generated key (label, empty line, etc.), ignore it.\r
418 //\r
419 if ((QuestionId & HII_KEY_FLAG) == 0) {\r
420 return EFI_SUCCESS;\r
421 }\r
422\r
423 HiiKey.Raw = QuestionId;\r
424 HiiKeyId = (UINT8) HiiKey.KeyBits.Id;\r
425\r
426 if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
427 switch (HiiKeyId) {\r
428 case HII_KEY_ID_VAR_SUPPORTED_DISKS:\r
429 DEBUG ((DEBUG_INFO, "HII_KEY_ID_VAR_SUPPORTED_DISKS\n"));\r
430 return HiiPopulateMainMenuForm ();\r
431\r
432 case HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS:\r
433 return HiiPopulateDiskInfoForm();\r
434 }\r
435 } else if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
436 switch (HiiKeyId) {\r
437 case HII_KEY_ID_GOTO_DISK_INFO:\r
438 return HiiSelectDisk((UINT8)HiiKey.KeyBits.Index);\r
439\r
440 case HII_KEY_ID_GOTO_LOCK:\r
441 return HiiSelectDiskAction("Action: Lock", HiiKeyId);\r
442\r
443 case HII_KEY_ID_GOTO_UNLOCK:\r
444 return HiiSelectDiskAction("Action: Unlock", HiiKeyId);\r
445\r
446 case HII_KEY_ID_GOTO_SET_ADMIN_PWD:\r
447 return HiiSelectDiskAction("Action: Set Administrator Password", HiiKeyId);\r
448\r
449 case HII_KEY_ID_GOTO_SET_USER_PWD:\r
450 return HiiSelectDiskAction("Action: Set User Password", HiiKeyId);\r
451\r
452 case HII_KEY_ID_GOTO_SECURE_ERASE:\r
453 return HiiSelectDiskAction("Action: Secure Erase", HiiKeyId);\r
454\r
455 case HII_KEY_ID_GOTO_PSID_REVERT:\r
456 return HiiSelectDiskAction("Action: Revert to Factory Defaults with PSID", HiiKeyId);\r
457\r
458 case HII_KEY_ID_GOTO_REVERT:\r
459 return HiiSelectDiskAction("Action: Revert to Factory Defaults", HiiKeyId);\r
460\r
461 case HII_KEY_ID_GOTO_DISABLE_USER:\r
462 return HiiSelectDiskAction("Action: Disable User", HiiKeyId);\r
463\r
464 case HII_KEY_ID_GOTO_ENABLE_FEATURE:\r
465 return HiiSelectDiskAction("Action: Enable Feature", HiiKeyId);\r
466\r
467 case HII_KEY_ID_ENTER_PASSWORD:\r
468 return HiiPasswordEntered(Value->string);\r
a06875e1
ED
469 }\r
470 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
471 switch (HiiKeyId) {\r
472 case HII_KEY_ID_ENTER_PSID:\r
473 HiiPsidRevert();\r
474 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
475 return EFI_SUCCESS;\r
8d3d8450
ED
476\r
477 case HII_KEY_ID_BLOCKSID:\r
478 HiiSetBlockSid(Value->b);\r
479 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
480 return EFI_SUCCESS;\r
a06875e1
ED
481 }\r
482 }\r
483\r
484 return EFI_UNSUPPORTED;\r
485}\r
486\r
487/**\r
488 Update the global Disk index info.\r
489\r
490 @param Index The input disk index info.\r
491\r
492 @retval EFI_SUCCESS Update the disk index info success.\r
493\r
494**/\r
495EFI_STATUS\r
496HiiSelectDisk(\r
497 UINT8 Index\r
498 )\r
499{\r
500 OpalHiiGetBrowserData();\r
501 gHiiConfiguration.SelectedDiskIndex = Index;\r
502 OpalHiiSetBrowserData ();\r
503\r
504 return EFI_SUCCESS;\r
505}\r
506\r
507/**\r
508 Draws the disk info form.\r
509\r
510 @retval EFI_SUCCESS Draw the disk info success.\r
511\r
512**/\r
513EFI_STATUS\r
514HiiPopulateDiskInfoForm(\r
515 VOID\r
516 )\r
517{\r
518 OPAL_DISK* OpalDisk;\r
519 OPAL_DISK_ACTIONS AvailActions;\r
520 TCG_RESULT Ret;\r
521 CHAR8 *DiskName;\r
522\r
523 OpalHiiGetBrowserData();\r
524\r
525 DiskName = HiiDiskGetNameCB (gHiiConfiguration.SelectedDiskIndex);\r
526 if (DiskName == NULL) {\r
527 return EFI_UNSUPPORTED;\r
528 }\r
529 HiiSetFormString(STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME), DiskName);\r
530\r
531 ZeroMem(gHiiConfiguration.Psid, sizeof(gHiiConfiguration.Psid));\r
532\r
533 gHiiConfiguration.SelectedDiskAvailableActions = HII_ACTION_NONE;\r
534\r
535 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
536\r
537 if (OpalDisk != NULL) {\r
538 OpalDiskUpdateStatus (OpalDisk);\r
539 Ret = OpalSupportGetAvailableActions(&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions);\r
540 if (Ret == TcgResultSuccess) {\r
541 //\r
542 // Update actions, always allow PSID Revert\r
543 //\r
544 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.PsidRevert == 1) ? HII_ACTION_PSID_REVERT : HII_ACTION_NONE;\r
545\r
546 //\r
547 // Always allow unlock to handle device migration\r
548 //\r
549 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Unlock == 1) ? HII_ACTION_UNLOCK : HII_ACTION_NONE;\r
550\r
551 if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) {\r
552 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
553 gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_FEATURE;\r
554\r
555 //\r
556 // Update strings\r
557 //\r
558 HiiSetFormString( STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default");\r
559 } else {\r
560 DEBUG ((DEBUG_INFO, "Feature disabled but ownership != nobody\n"));\r
561 }\r
562 } else {\r
563 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Revert == 1) ? HII_ACTION_REVERT : HII_ACTION_NONE;\r
564 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.AdminPass == 1) ? HII_ACTION_SET_ADMIN_PWD : HII_ACTION_NONE;\r
565 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE;\r
566 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE;\r
567 gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE;\r
a06875e1
ED
568\r
569 HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable");\r
570\r
571 //\r
572 // Determine revert options for disk\r
573 // Default initialize keep user Data to be true\r
574 //\r
575 gHiiConfiguration.KeepUserData = 1;\r
ea2a6eb7
ED
576 if (OpalDisk->SupportedAttributes.PyriteSsc == 1) {\r
577 //\r
578 // According to current Pyrite SSC Spec 1.00, there is no parameter for RevertSP method.\r
579 // So issue RevertSP method without any parameter by set default value to FALSE.\r
580 //\r
581 gHiiConfiguration.KeepUserData = 0;\r
582 }\r
583\r
a06875e1
ED
584 }\r
585 }\r
586 }\r
587\r
588 //\r
589 // Pass the current configuration to the BIOS\r
590 //\r
591 OpalHiiSetBrowserData ();\r
592\r
593 return EFI_SUCCESS;\r
594}\r
595\r
596/**\r
597 Reverts the Opal disk to factory default.\r
598\r
599 @retval EFI_SUCCESS Do the required action success.\r
600\r
601**/\r
602EFI_STATUS\r
603HiiPsidRevert(\r
604 VOID\r
605 )\r
606{\r
607 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
608 TCG_PSID Psid;\r
609 OPAL_DISK *OpalDisk;\r
610 TCG_RESULT Ret;\r
611 OPAL_SESSION Session;\r
612\r
613 Ret = TcgResultFailure;\r
614\r
615 OpalHiiGetBrowserData();\r
616\r
617 UnicodeStrToAsciiStr(gHiiConfiguration.Psid, (CHAR8*)Psid.Psid);\r
618\r
b4ddf0eb 619 OpalDisk = HiiGetOpalDiskCB (gHiiConfiguration.SelectedDiskIndex);\r
a06875e1 620 if (OpalDisk != NULL) {\r
b4ddf0eb
ED
621 ZeroMem(&Session, sizeof(Session));\r
622 Session.Sscp = OpalDisk->Sscp;\r
623 Session.MediaId = OpalDisk->MediaId;\r
624 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
625\r
a06875e1
ED
626 Ret = OpalSupportPsidRevert(&Session, Psid.Psid, (UINT32)sizeof(Psid.Psid), OpalDisk->OpalDevicePath);\r
627 }\r
628\r
629 if (Ret == TcgResultSuccess) {\r
630 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" );\r
631 } else {\r
632 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Failure" );\r
633 }\r
634\r
635 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
636\r
637 return EFI_SUCCESS;\r
638}\r
639\r
640/**\r
641 Set password for the disk.\r
642\r
643 @param OpalDisk The disk need to set the password.\r
644 @param Password The input password.\r
645 @param PassLength The input password length.\r
646\r
647 @retval EFI_SUCCESS Do the required action success.\r
648\r
649**/\r
650EFI_STATUS\r
651HiiSetPassword(\r
652 OPAL_DISK *OpalDisk,\r
653 VOID *Password,\r
654 UINT32 PassLength\r
655 )\r
656{\r
657 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
658 TCG_RESULT Ret;\r
659 BOOLEAN ExistingPassword;\r
660 OPAL_SESSION Session;\r
661\r
662 ExistingPassword = FALSE;\r
663\r
664 //\r
665 // PassLength = 0 means check whether exist old password.\r
666 //\r
667 if (PassLength == 0) {\r
668 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
669 gHiiOldPasswordLength = 0;\r
670\r
671 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_ENABLE_FEATURE) {\r
672 ExistingPassword = FALSE;\r
673 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_ADMIN_PWD) {\r
674 ExistingPassword = OpalUtilAdminPasswordExists(OpalDisk->Owner, &OpalDisk->LockingFeature);\r
675 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
676 //\r
677 // Set user Password option shall only be shown if an Admin Password exists\r
678 // so a Password is always required (Admin or Existing User Password)\r
679 //\r
680 ExistingPassword = TRUE;\r
681 }\r
682\r
683 //\r
684 // Return error if there is a previous Password\r
685 // see UEFI 2.4 errata B, Figure 121. Password Flowchart\r
686 //\r
687 return ExistingPassword ? EFI_DEVICE_ERROR : EFI_SUCCESS;\r
688 }\r
689\r
690 ZeroMem(&Session, sizeof(Session));\r
691 Session.Sscp = OpalDisk->Sscp;\r
692 Session.MediaId = OpalDisk->MediaId;\r
693 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
694\r
695 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Failure");\r
696 //\r
697 // Password entered.\r
698 // No current Owner, so set new Password, must be admin Password\r
699 //\r
700 if (OpalDisk->Owner == OpalOwnershipNobody) {\r
701 Ret = OpalSupportEnableOpalFeature (&Session, OpalDisk->Msid, OpalDisk->MsidLength,Password, PassLength, OpalDisk->OpalDevicePath);\r
702 if (Ret == TcgResultSuccess) {\r
703 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
704 }\r
705\r
706 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
707 return EFI_SUCCESS;\r
708 }\r
709\r
710 //\r
711 // 1st Password entered\r
712 //\r
713 if (OpalDisk->Owner == OpalOwnershipUnknown && gHiiOldPasswordLength == 0) {\r
714\r
715 //\r
716 // Unknown ownership - prompt for old Password, then new\r
717 // old Password is not set yet - first time through\r
718 // assume authority provided is admin1, overwritten if user1 authority works below\r
719 //\r
720 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
721 //\r
722 // First try to login as USER1 to Locking SP to see if we're simply updating its Password\r
723 //\r
724 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_USER1_AUTHORITY);\r
725 if (Ret == TcgResultSuccess) {\r
726 //\r
727 // User1 worked so authority 1 means user 1\r
728 //\r
729 CopyMem(gHiiOldPassword, Password, PassLength);\r
730 gHiiOldPasswordLength = PassLength;\r
731\r
732 return EFI_SUCCESS;\r
733 }\r
734 }\r
735\r
736 //\r
737 // Else try admin1 below\r
738 //\r
739 Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_ADMIN1_AUTHORITY);\r
740 if (Ret == TcgResultSuccess) {\r
741 CopyMem(gHiiOldPassword, Password, PassLength);\r
742 gHiiOldPasswordLength = PassLength;\r
743\r
744 return EFI_SUCCESS;\r
745 } else {\r
746 DEBUG ((DEBUG_INFO, "start session with old PW failed - return EFI_NOT_READY - mistyped old PW\n"));\r
747 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Authentication Failure");\r
748\r
749 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
750 gHiiOldPasswordLength = 0;\r
751\r
752 return EFI_NOT_READY;\r
753 }\r
754 }\r
755\r
756 //\r
757 // New Password entered\r
758 //\r
759 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) {\r
760 Ret = OpalSupportSetPassword(\r
761 &Session,\r
762 gHiiOldPassword,\r
763 gHiiOldPasswordLength,\r
764 Password,\r
765 PassLength,\r
766 OpalDisk->OpalDevicePath,\r
767 FALSE\r
768 );\r
769 } else {\r
770 Ret = OpalSupportSetPassword(\r
771 &Session,\r
772 gHiiOldPassword,\r
773 gHiiOldPasswordLength,\r
774 Password,\r
775 PassLength,\r
776 OpalDisk->OpalDevicePath,\r
777 TRUE\r
778 );\r
779 }\r
780\r
781 if (Ret == TcgResultSuccess) {\r
782 AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success");\r
783 }\r
784\r
785 //\r
786 // Reset old Password storage\r
787 //\r
788 ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword));\r
789 gHiiOldPasswordLength = 0;\r
790\r
791 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
792 return Ret == TcgResultSuccess ? EFI_SUCCESS : EFI_NOT_READY;\r
793}\r
794\r
795/**\r
796 Secure Erases Opal Disk.\r
797\r
798 @param OpalDisk The disk need to erase data.\r
799 @param Password The input password.\r
800 @param PassLength The input password length.\r
801\r
802 @retval EFI_SUCCESS Do the required action success.\r
803\r
804**/\r
805EFI_STATUS\r
806HiiSecureErase(\r
807 OPAL_DISK *OpalDisk,\r
808 const VOID *Password,\r
809 UINT32 PassLength\r
810 )\r
811{\r
812 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
813 BOOLEAN PasswordFailed;\r
814 TCG_RESULT Ret;\r
815 OPAL_SESSION AdminSpSession;\r
816\r
817 if (PassLength == 0) {\r
818 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
819 }\r
820\r
821 ZeroMem(&AdminSpSession, sizeof(AdminSpSession));\r
822 AdminSpSession.Sscp = OpalDisk->Sscp;\r
823 AdminSpSession.MediaId = OpalDisk->MediaId;\r
824 AdminSpSession.OpalBaseComId = OpalDisk->OpalBaseComId;\r
825\r
826 Ret = OpalUtilSecureErase(&AdminSpSession, Password, PassLength, &PasswordFailed);\r
827 if (Ret == TcgResultSuccess) {\r
828 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Success" );\r
829 } else {\r
830 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Failure" );\r
831 }\r
832 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
833\r
834 //\r
835 // If Password failed, return invalid passowrd\r
836 //\r
837 if (PasswordFailed) {\r
838 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
839 return EFI_NOT_READY;\r
840 }\r
841\r
842 //\r
843 // Indicates Password was valid and is not changing to UEFI\r
844 // Response string will indicate action error\r
845 //\r
846 return EFI_DEVICE_ERROR;\r
847}\r
848\r
849\r
850/**\r
851 Disables User for Opal Disk.\r
852\r
853 @param OpalDisk The disk need to the action.\r
854 @param Password The input password.\r
855 @param PassLength The input password length.\r
856\r
857 @retval EFI_SUCCESS Do the required action success.\r
858\r
859**/\r
860EFI_STATUS\r
861HiiDisableUser(\r
862 OPAL_DISK *OpalDisk,\r
863 VOID *Password,\r
864 UINT32 PassLength\r
865 )\r
866{\r
867 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
868 BOOLEAN PasswordFailed;\r
869 TCG_RESULT Ret;\r
870 OPAL_SESSION Session;\r
871\r
872 if (PassLength == 0) {\r
873 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
874 }\r
875\r
876 ZeroMem(&Session, sizeof(Session));\r
877 Session.Sscp = OpalDisk->Sscp;\r
878 Session.MediaId = OpalDisk->MediaId;\r
879 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
880\r
881 Ret = OpalSupportDisableUser(&Session, Password, PassLength, &PasswordFailed, OpalDisk->OpalDevicePath);\r
882 if (Ret == TcgResultSuccess) {\r
883 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Success" );\r
884 } else {\r
885 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Failure" );\r
886 }\r
887 HiiSetFormString (STRING_TOKEN(STR_ACTION_STATUS), Response);\r
888\r
889 //\r
890 // If Password failed, return invalid passowrd\r
891 //\r
892 if (PasswordFailed) {\r
893 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
894 return EFI_NOT_READY;\r
895 }\r
896\r
897 //\r
898 // Indicates Password was valid and is not changing to UEFI\r
899 // Response string will indicate action error\r
900 //\r
901 return EFI_DEVICE_ERROR;\r
902}\r
903\r
904/**\r
905 Revert Opal Disk as Admin1.\r
906\r
907 @param OpalDisk The disk need to the action.\r
908 @param Password The input password.\r
909 @param PassLength The input password length.\r
910 @param KeepUserData Whether need to keey user data.\r
911\r
912 @retval EFI_SUCCESS Do the required action success.\r
913\r
914**/\r
915EFI_STATUS\r
916HiiRevert(\r
917 OPAL_DISK *OpalDisk,\r
918 VOID *Password,\r
919 UINT32 PassLength,\r
920 BOOLEAN KeepUserData\r
921 )\r
922{\r
923 CHAR8 Response[ DEFAULT_RESPONSE_SIZE ];\r
924 BOOLEAN PasswordFailed;\r
925 TCG_RESULT Ret;\r
926 OPAL_SESSION Session;\r
927\r
928 if (PassLength == 0) {\r
929 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
930 // return error to indicate there is an existing Password\r
931 return EFI_DEVICE_ERROR;\r
932 }\r
933\r
934 ZeroMem(&Session, sizeof(Session));\r
935 Session.Sscp = OpalDisk->Sscp;\r
936 Session.MediaId = OpalDisk->MediaId;\r
937 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
938\r
939 Ret = OpalSupportRevert(\r
940 &Session,\r
941 KeepUserData,\r
942 Password,\r
943 PassLength,\r
944 OpalDisk->Msid,\r
945 OpalDisk->MsidLength,\r
946 &PasswordFailed,\r
947 OpalDisk->OpalDevicePath\r
948 );\r
949 if (Ret == TcgResultSuccess) {\r
950 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Success" );\r
951 } else {\r
952 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Failure" );\r
953 }\r
954 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
955\r
956 //\r
957 // If Password failed, return invalid passowrd\r
958 //\r
959 if (PasswordFailed) {\r
960 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
961 return EFI_NOT_READY;\r
962 }\r
963\r
964 //\r
965 // Indicates Password was valid and is not changing to UEFI\r
966 // Response string will indicate action error\r
967 //\r
968 return EFI_DEVICE_ERROR;\r
969}\r
970\r
971/**\r
972 Unlocks Opal Disk.\r
973\r
974 @param OpalDisk The disk need to the action.\r
975 @param Password The input password.\r
976 @param PassLength The input password length.\r
977\r
978 @retval EFI_SUCCESS Do the required action success.\r
979\r
980**/\r
981EFI_STATUS\r
982HiiUnlock(\r
983 OPAL_DISK *OpalDisk,\r
984 VOID *Password,\r
985 UINT32 PassLength\r
986 )\r
987{\r
988 CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
989 TCG_RESULT Ret;\r
990 OPAL_SESSION Session;\r
991\r
992 if (PassLength == 0) {\r
993 DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n"));\r
994 return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password\r
995 }\r
996\r
997 ZeroMem(&Session, sizeof(Session));\r
998 Session.Sscp = OpalDisk->Sscp;\r
999 Session.MediaId = OpalDisk->MediaId;\r
1000 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1001\r
1002 Ret = OpalSupportUnlock(&Session, Password, PassLength, OpalDisk->OpalDevicePath);\r
1003 if (Ret == TcgResultSuccess) {\r
1004 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Success" );\r
1005 } else {\r
1006 AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Failure" );\r
1007 }\r
1008\r
1009 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response);\r
1010\r
1011 if (Ret == TcgResultSuccess) {\r
1012 DEBUG ((DEBUG_INFO, "returning error to indicate Password was correct but is not changing\n"));\r
1013 return EFI_DEVICE_ERROR;\r
1014 } else {\r
1015 DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n"));\r
1016 return EFI_NOT_READY;\r
1017 }\r
1018}\r
1019\r
1020/**\r
1021 Use the input password to do the specified action.\r
1022\r
1023 @param Str The input password saved in.\r
1024\r
1025 @retval EFI_SUCCESS Do the required action success.\r
1026 @retval Others Other error occur.\r
1027\r
1028**/\r
1029EFI_STATUS\r
1030HiiPasswordEntered(\r
1031 EFI_STRING_ID Str\r
1032 )\r
1033{\r
1034 OPAL_DISK* OpalDisk;\r
1035 CHAR8 Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
1036 CHAR16* UniStr;\r
1037 UINT32 PassLength;\r
1038 EFI_STATUS Status;\r
1039\r
1040 OpalHiiGetBrowserData();\r
1041\r
1042 OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
1043 if (OpalDisk == NULL) {\r
1044 DEBUG ((DEBUG_INFO, "ERROR: disk %u not found\n", gHiiConfiguration.SelectedDiskIndex));\r
1045 return EFI_NOT_FOUND;\r
1046 }\r
1047\r
1048 if (Str == 0) {\r
1049 DEBUG ((DEBUG_INFO, "ERROR: str=NULL\n"));\r
1050 return EFI_INVALID_PARAMETER;\r
1051 }\r
1052\r
1053 ZeroMem(Password, sizeof(Password));\r
1054\r
1055 UniStr = HiiGetString(gHiiPackageListHandle, Str, NULL);\r
1056 if (UniStr == NULL) {\r
1057 return EFI_NOT_FOUND;\r
1058 }\r
1059 PassLength = (UINT32) StrLen (UniStr);\r
1060 if (PassLength >= sizeof(Password)) {\r
1061 HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long");\r
1062 gBS->FreePool(UniStr);\r
1063 return EFI_BUFFER_TOO_SMALL;\r
1064 }\r
1065\r
1066 UnicodeStrToAsciiStr(UniStr, Password);\r
1067 gBS->FreePool(UniStr);\r
1068\r
a06875e1
ED
1069 if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) {\r
1070 Status = HiiUnlock (OpalDisk, Password, PassLength);\r
1071 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SECURE_ERASE) {\r
1072 Status = HiiSecureErase (OpalDisk, Password, PassLength);\r
1073 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_DISABLE_USER) {\r
1074 Status = HiiDisableUser (OpalDisk, Password, PassLength);\r
1075 } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_REVERT) {\r
1076 DEBUG ((DEBUG_INFO, "gHiiConfiguration.KeepUserData %u\n", gHiiConfiguration.KeepUserData));\r
1077 Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
1078 } else {\r
1079 Status = HiiSetPassword(OpalDisk, Password, PassLength);\r
1080 }\r
1081\r
1082 OpalHiiSetBrowserData ();\r
1083\r
1084 return Status;\r
1085}\r
1086\r
1087/**\r
1088 Update block sid info.\r
1089\r
1090 @param Enable Enable/disable BlockSid.\r
1091\r
1092 @retval EFI_SUCCESS Do the required action success.\r
1093 @retval Others Other error occur.\r
1094\r
1095**/\r
1096EFI_STATUS\r
1097HiiSetBlockSid (\r
1098 BOOLEAN Enable\r
1099 )\r
1100{\r
1101 EFI_STATUS Status;\r
1102 OPAL_EXTRA_INFO_VAR OpalExtraInfo;\r
1103 UINTN DataSize;\r
1104\r
1105 Status = EFI_SUCCESS;\r
1106\r
a06875e1
ED
1107 OpalExtraInfo.EnableBlockSid = Enable;\r
1108 DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
1109 Status = gRT->SetVariable (\r
1110 OPAL_EXTRA_INFO_VAR_NAME,\r
1111 &gOpalExtraInfoVariableGuid,\r
1112 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
1113 DataSize,\r
1114 &OpalExtraInfo\r
1115 );\r
a06875e1
ED
1116\r
1117 return Status;\r
1118}\r
1119\r
1120/**\r
1121 This function processes the results of changes in configuration.\r
1122\r
1123 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1124 @param Configuration A null-terminated Unicode string in <ConfigResp>\r
1125 format.\r
1126 @param Progress A pointer to a string filled in with the offset of\r
1127 the most recent '&' before the first failing\r
1128 name/value pair (or the beginning of the string if\r
1129 the failure is in the first name/value pair) or\r
1130 the terminating NULL if all was successful.\r
1131\r
1132 @retval EFI_SUCCESS The Results is processed successfully.\r
1133 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
1134 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1135 driver.\r
1136\r
1137**/\r
1138EFI_STATUS\r
1139EFIAPI\r
1140RouteConfig(\r
1141 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1142 CONST EFI_STRING Configuration,\r
1143 EFI_STRING *Progress\r
1144 )\r
1145{\r
a06875e1
ED
1146 if (Configuration == NULL || Progress == NULL) {\r
1147 return (EFI_INVALID_PARAMETER);\r
1148 }\r
1149\r
eafbd7a2
DB
1150 *Progress = Configuration;\r
1151 if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1152 return EFI_NOT_FOUND;\r
1153 }\r
1154\r
1155 *Progress = Configuration + StrLen (Configuration);\r
1156\r
a06875e1
ED
1157 return EFI_SUCCESS;\r
1158}\r
1159\r
1160/**\r
1161 This function allows a caller to extract the current configuration for one\r
1162 or more named elements from the target driver.\r
1163\r
1164 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
1165 @param Request A null-terminated Unicode string in\r
1166 <ConfigRequest> format.\r
1167 @param Progress On return, points to a character in the Request\r
1168 string. Points to the string's null terminator if\r
1169 request was successful. Points to the most recent\r
1170 '&' before the first failing name/value pair (or\r
1171 the beginning of the string if the failure is in\r
1172 the first name/value pair) if the request was not\r
1173 successful.\r
1174 @param Results A null-terminated Unicode string in\r
1175 <ConfigAltResp> format which has all values filled\r
1176 in for the names in the Request string. String to\r
1177 be allocated by the called function.\r
1178\r
1179 @retval EFI_SUCCESS The Results is filled with the requested values.\r
1180 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
1181 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
1182 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this\r
1183 driver.\r
1184\r
1185**/\r
1186EFI_STATUS\r
1187EFIAPI\r
1188ExtractConfig(\r
1189 CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
1190 CONST EFI_STRING Request,\r
1191 EFI_STRING *Progress,\r
1192 EFI_STRING *Results\r
1193 )\r
1194{\r
1195 EFI_STATUS Status;\r
1196\r
a06875e1
ED
1197 //\r
1198 // Check for valid parameters\r
1199 //\r
1200 if (Progress == NULL || Results == NULL) {\r
1201 return (EFI_INVALID_PARAMETER);\r
1202 }\r
1203\r
eafbd7a2
DB
1204 *Progress = Request;\r
1205 if ((Request != NULL) &&\r
1206 !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
1207 return EFI_NOT_FOUND;\r
1208 }\r
1209\r
a06875e1
ED
1210 //\r
1211 // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
1212 //\r
1213 Status = gHiiConfigRouting->BlockToConfig(\r
1214 gHiiConfigRouting,\r
1215 Request,\r
1216 (UINT8*)&gHiiConfiguration,\r
1217 sizeof(OPAL_HII_CONFIGURATION),\r
1218 Results,\r
1219 Progress\r
1220 );\r
1221\r
1222 return (Status);\r
1223}\r
1224\r
1225\r
1226/**\r
1227\r
1228 Pass the current system state to the bios via the hii_G_Configuration.\r
1229\r
1230**/\r
1231VOID\r
1232OpalHiiSetBrowserData (\r
1233 VOID\r
1234 )\r
1235{\r
a06875e1
ED
1236 HiiSetBrowserData(\r
1237 &gHiiSetupVariableGuid,\r
1238 (CHAR16*)L"OpalHiiConfig",\r
1239 sizeof(gHiiConfiguration),\r
1240 (UINT8*)&gHiiConfiguration,\r
1241 NULL\r
1242 );\r
1243}\r
1244\r
1245\r
1246/**\r
1247\r
1248 Populate the hii_g_Configuraton with the browser Data.\r
1249\r
1250**/\r
1251VOID\r
1252OpalHiiGetBrowserData (\r
1253 VOID\r
1254 )\r
1255{\r
a06875e1
ED
1256 HiiGetBrowserData(\r
1257 &gHiiSetupVariableGuid,\r
1258 (CHAR16*)L"OpalHiiConfig",\r
1259 sizeof(gHiiConfiguration),\r
1260 (UINT8*)&gHiiConfiguration\r
1261 );\r
1262}\r
1263\r
1264/**\r
1265 Set a string Value in a form.\r
1266\r
1267 @param DestStringId The stringid which need to update.\r
1268 @param SrcAsciiStr The string nned to update.\r
1269\r
1270 @retval EFI_SUCCESS Do the required action success.\r
1271 @retval Others Other error occur.\r
1272\r
1273**/\r
1274EFI_STATUS\r
1275HiiSetFormString(\r
1276 EFI_STRING_ID DestStringId,\r
1277 CHAR8 *SrcAsciiStr\r
1278 )\r
1279{\r
1280 UINT32 Len;\r
1281 UINT32 UniSize;\r
1282 CHAR16* UniStr;\r
1283\r
a06875e1
ED
1284 //\r
1285 // Determine the Length of the sting\r
1286 //\r
1287 Len = ( UINT32 )AsciiStrLen( SrcAsciiStr );\r
1288\r
1289 //\r
1290 // Allocate space for the unicode string, including terminator\r
1291 //\r
1292 UniSize = (Len + 1) * sizeof(CHAR16);\r
1293 UniStr = (CHAR16*)AllocateZeroPool(UniSize);\r
1294\r
1295 //\r
1296 // Copy into unicode string, then copy into string id\r
1297 //\r
1298 AsciiStrToUnicodeStr( SrcAsciiStr, UniStr );\r
1299\r
1300 //\r
1301 // Update the string in the form\r
1302 //\r
1303 if (HiiSetString(gHiiPackageListHandle, DestStringId, UniStr, NULL) == 0) {\r
1304 DEBUG ((DEBUG_INFO, "HiiSetFormString( ) failed\n"));\r
1305 FreePool(UniStr);\r
1306 return (EFI_OUT_OF_RESOURCES);\r
1307 }\r
1308\r
1309 //\r
1310 // Free the memory\r
1311 //\r
1312 FreePool(UniStr);\r
1313\r
1314 return (EFI_SUCCESS);\r
1315}\r
1316\r
1317/**\r
1318 Initialize the Opal disk base on the hardware info get from device.\r
1319\r
1320 @param Dev The Opal device.\r
1321\r
1322 @retval EFI_SUCESS Initialize the device success.\r
1323 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1324\r
1325**/\r
1326EFI_STATUS\r
1327OpalDiskInitialize (\r
1328 IN OPAL_DRIVER_DEVICE *Dev\r
1329 )\r
1330{\r
1331 TCG_RESULT TcgResult;\r
1332 OPAL_SESSION Session;\r
1333\r
1334 ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK));\r
1335 Dev->OpalDisk.Sscp = Dev->Sscp;\r
1336 Dev->OpalDisk.MediaId = Dev->MediaId;\r
1337 Dev->OpalDisk.OpalDevicePath = Dev->OpalDevicePath;\r
1338\r
1339 ZeroMem(&Session, sizeof(Session));\r
1340 Session.Sscp = Dev->Sscp;\r
1341 Session.MediaId = Dev->MediaId;\r
1342\r
1343 TcgResult = OpalGetSupportedAttributesInfo (&Session, &Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.OpalBaseComId);\r
1344 if (TcgResult != TcgResultSuccess) {\r
1345 return EFI_DEVICE_ERROR;\r
1346 }\r
1347 Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;\r
1348\r
1349 TcgResult = OpalUtilGetMsid (&Session, Dev->OpalDisk.Msid, OPAL_MSID_LENGHT, &Dev->OpalDisk.MsidLength);\r
1350 if (TcgResult != TcgResultSuccess) {\r
1351 return EFI_DEVICE_ERROR;\r
1352 }\r
1353\r
1354 return OpalDiskUpdateStatus (&Dev->OpalDisk);\r
1355}\r
1356\r
1357/**\r
1358 Update the device info.\r
1359\r
1360 @param OpalDisk The Opal device.\r
1361\r
1362 @retval EFI_SUCESS Initialize the device success.\r
1363 @retval EFI_DEVICE_ERROR Get info from device failed.\r
1364 @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info.\r
1365\r
1366**/\r
1367EFI_STATUS\r
1368OpalDiskUpdateStatus (\r
1369 OPAL_DISK *OpalDisk\r
1370 )\r
1371{\r
1372 TCG_RESULT TcgResult;\r
1373 OPAL_SESSION Session;\r
1374\r
1375 ZeroMem(&Session, sizeof(Session));\r
1376 Session.Sscp = OpalDisk->Sscp;\r
1377 Session.MediaId = OpalDisk->MediaId;\r
1378 Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
1379\r
1380 TcgResult = OpalGetLockingInfo(&Session, &OpalDisk->LockingFeature);\r
1381 if (TcgResult != TcgResultSuccess) {\r
1382 return EFI_DEVICE_ERROR;\r
1383 }\r
1384\r
1385 if (OpalDisk->MsidLength == 0) {\r
1386 return EFI_INVALID_PARAMETER;\r
1387 } else {\r
1388 //\r
1389 // Base on the Msid info to get the ownership, so Msid info must get first.\r
1390 //\r
1391 OpalDisk->Owner = OpalUtilDetermineOwnership(&Session, OpalDisk->Msid, OpalDisk->MsidLength);\r
1392 }\r
1393\r
1394 return EFI_SUCCESS;\r
1395}\r
1396\r