//\r
extern UINT8 OpalPasswordDxeStrings[];\r
\r
+CHAR16 OpalPasswordStorageName[] = L"OpalHiiConfig";\r
+\r
EFI_HII_CONFIG_ACCESS_PROTOCOL gHiiConfigAccessProtocol;\r
\r
//\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- OPAL_EXTRA_INFO_VAR OpalExtraInfo;\r
- UINTN DataSize;\r
+ UINT32 PpStorageFlag;\r
+ EFI_STRING NewString;\r
\r
gHiiConfiguration.NumDisks = GetDeviceCount();\r
\r
- DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
- Status = gRT->GetVariable (\r
- OPAL_EXTRA_INFO_VAR_NAME,\r
- &gOpalExtraInfoVariableGuid,\r
- NULL,\r
- &DataSize,\r
- &OpalExtraInfo\r
- );\r
- DEBUG ((DEBUG_INFO, "GetVariable for OpalExtraInfo @ HiiSetCurrentConfiguration, Status: %r\n", Status));\r
- if (!EFI_ERROR (Status)) {\r
- gHiiConfiguration.EnableBlockSid = OpalExtraInfo.EnableBlockSid;\r
- }\r
-}\r
-\r
-/**\r
- Check that all required protocols for HII are available.\r
-\r
- @retval EFI_SUCCESS All required protocols are installed.\r
- @retval EFI_NOT_FOUND One or more protocol are not installed.\r
-**/\r
-EFI_STATUS\r
-HiiCheckForRequiredProtocols (\r
- VOID\r
- )\r
-{\r
- VOID* TempProtocol;\r
- EFI_STATUS Status;\r
-\r
- Status = gBS->LocateProtocol(&gEfiHiiStringProtocolGuid, NULL, (VOID**)&TempProtocol );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
- }\r
+ //\r
+ // Update the BlockSID status string.\r
+ //\r
+ PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags ();\r
\r
- Status = gBS->LocateProtocol(&gEfiHiiDatabaseProtocolGuid, NULL, (VOID**)&TempProtocol );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
+ if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) {\r
+ NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_ENABLED), NULL);\r
+ if (NewString == NULL) {\r
+ DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+ return;\r
+ }\r
+ } else {\r
+ NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISABLED), NULL);\r
+ if (NewString == NULL) {\r
+ DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+ return;\r
+ }\r
}\r
-\r
- Status = gBS->LocateProtocol(&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID**)&TempProtocol );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
+ HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS1), NewString, NULL);\r
+ FreePool (NewString);\r
+\r
+ if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) != 0) {\r
+ NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_TRUE), NULL);\r
+ if (NewString == NULL) {\r
+ DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+ return;\r
+ }\r
+ } else {\r
+ NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_FALSE), NULL);\r
+ if (NewString == NULL) {\r
+ DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+ return;\r
+ }\r
}\r
-\r
- Status = gBS->LocateProtocol(&gEfiFormBrowser2ProtocolGuid, NULL, (VOID**)&TempProtocol );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
+ HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL);\r
+ FreePool (NewString);\r
+\r
+ if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) != 0) {\r
+ NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_TRUE), NULL);\r
+ if (NewString == NULL) {\r
+ DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+ return;\r
+ }\r
+ } else {\r
+ NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_FALSE), NULL);\r
+ if (NewString == NULL) {\r
+ DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+ return;\r
+ }\r
}\r
-\r
- return EFI_SUCCESS;\r
+ HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS3), NewString, NULL);\r
+ FreePool (NewString);\r
}\r
\r
/**\r
EFI_STATUS Status;\r
EFI_HANDLE DriverHandle;\r
\r
- //\r
- // Check that all required protocols are available for HII.\r
- // If not, fail the install\r
- //\r
- Status = HiiCheckForRequiredProtocols();\r
- if (EFI_ERROR(Status)) {\r
- return Status;\r
- }\r
-\r
//\r
// Clear the global configuration.\r
//\r
EFI_STATUS\r
EFIAPI\r
DriverCallback(\r
- CONST EFI_HII_CONFIG_ACCESS_PROTOCOL* This,\r
+ CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
EFI_BROWSER_ACTION Action,\r
EFI_QUESTION_ID QuestionId,\r
UINT8 Type,\r
- EFI_IFR_TYPE_VALUE* Value,\r
- EFI_BROWSER_ACTION_REQUEST* ActionRequest\r
+ EFI_IFR_TYPE_VALUE *Value,\r
+ EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
)\r
{\r
HII_KEY HiiKey;\r
UINT8 HiiKeyId;\r
+ UINT32 PpRequest;\r
\r
if (ActionRequest != NULL) {\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+ } else {\r
+ return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
case HII_KEY_ID_ENTER_PASSWORD:\r
return HiiPasswordEntered(Value->string);\r
\r
- case HII_KEY_ID_BLOCKSID:\r
- return HiiSetBlockSid(Value->b);\r
+ case HII_KEY_ID_ENTER_PSID:\r
+ return HiiPsidRevert(Value->string);\r
+\r
}\r
} else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
switch (HiiKeyId) {\r
- case HII_KEY_ID_ENTER_PSID:\r
- HiiPsidRevert();\r
+ case HII_KEY_ID_BLOCKSID:\r
+ switch (Value->u8) {\r
+ case 0:\r
+ PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
+ break;\r
+\r
+ case 1:\r
+ PpRequest = TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID;\r
+ break;\r
+\r
+ case 2:\r
+ PpRequest = TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID;\r
+ break;\r
+\r
+ case 3:\r
+ PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE;\r
+ break;\r
+\r
+ case 4:\r
+ PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE;\r
+ break;\r
+\r
+ case 5:\r
+ PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE;\r
+ break;\r
+\r
+ case 6:\r
+ PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE;\r
+ break;\r
+\r
+ default:\r
+ PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
+ DEBUG ((DEBUG_ERROR, "Invalid value input!\n"));\r
+ break;\r
+ }\r
+ HiiSetBlockSidAction(PpRequest);\r
+\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
return EFI_SUCCESS;\r
+\r
+ default:\r
+ break;\r
}\r
}\r
\r
gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE;\r
gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE;\r
gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE;\r
- gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_BLOCKSID;\r
\r
HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable");\r
\r
/**\r
Reverts the Opal disk to factory default.\r
\r
+ @param PsidStringId The string id for the PSID info.\r
+\r
@retval EFI_SUCCESS Do the required action success.\r
\r
**/\r
EFI_STATUS\r
HiiPsidRevert(\r
- VOID\r
+ EFI_STRING_ID PsidStringId\r
)\r
{\r
CHAR8 Response[DEFAULT_RESPONSE_SIZE];\r
OPAL_DISK *OpalDisk;\r
TCG_RESULT Ret;\r
OPAL_SESSION Session;\r
+ CHAR16 *UnicodeStr;\r
+ UINT8 TmpBuf[PSID_CHARACTER_STRING_END_LENGTH];\r
\r
Ret = TcgResultFailure;\r
\r
- OpalHiiGetBrowserData();\r
-\r
- UnicodeStrToAsciiStr(gHiiConfiguration.Psid, (CHAR8*)Psid.Psid);\r
-\r
- OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
-\r
- ZeroMem(&Session, sizeof(Session));\r
- Session.Sscp = OpalDisk->Sscp;\r
- Session.MediaId = OpalDisk->MediaId;\r
- Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
+ UnicodeStr = HiiGetString (gHiiPackageListHandle, PsidStringId, NULL);\r
+ ZeroMem (TmpBuf, sizeof (TmpBuf));\r
+ UnicodeStrToAsciiStrS (UnicodeStr, (CHAR8*)TmpBuf, PSID_CHARACTER_STRING_END_LENGTH);\r
+ CopyMem (Psid.Psid, TmpBuf, PSID_CHARACTER_LENGTH);\r
+ HiiSetString (gHiiPackageListHandle, PsidStringId, L"", NULL);\r
+ ZeroMem (TmpBuf, sizeof (TmpBuf));\r
+ ZeroMem (UnicodeStr, StrSize (UnicodeStr));\r
+ FreePool (UnicodeStr);\r
\r
+ OpalDisk = HiiGetOpalDiskCB (gHiiConfiguration.SelectedDiskIndex);\r
if (OpalDisk != NULL) {\r
+ ZeroMem(&Session, sizeof(Session));\r
+ Session.Sscp = OpalDisk->Sscp;\r
+ Session.MediaId = OpalDisk->MediaId;\r
+ Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
+\r
Ret = OpalSupportPsidRevert(&Session, Psid.Psid, (UINT32)sizeof(Psid.Psid), OpalDisk->OpalDevicePath);\r
}\r
\r
+ ZeroMem (Psid.Psid, PSID_CHARACTER_LENGTH);\r
+\r
if (Ret == TcgResultSuccess) {\r
AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" );\r
} else {\r
EFI_STRING_ID Str\r
)\r
{\r
- OPAL_DISK* OpalDisk;\r
- CHAR8 Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
+ OPAL_DISK* OpalDisk;\r
+ CHAR8 Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
CHAR16* UniStr;\r
UINT32 PassLength;\r
EFI_STATUS Status;\r
if (UniStr == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
+\r
+ HiiSetString(gHiiPackageListHandle, Str, L"", NULL);\r
+\r
PassLength = (UINT32) StrLen (UniStr);\r
if (PassLength >= sizeof(Password)) {\r
HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long");\r
- gBS->FreePool(UniStr);\r
+ ZeroMem (UniStr, StrSize (UniStr));\r
+ FreePool(UniStr);\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
\r
- UnicodeStrToAsciiStr(UniStr, Password);\r
- gBS->FreePool(UniStr);\r
-\r
- DEBUG ((DEBUG_INFO, "Password: '%s'\n", Password));\r
+ UnicodeStrToAsciiStrS (UniStr, Password, sizeof (Password));\r
+ ZeroMem (UniStr, StrSize (UniStr));\r
+ FreePool(UniStr);\r
\r
if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) {\r
Status = HiiUnlock (OpalDisk, Password, PassLength);\r
} else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_DISABLE_USER) {\r
Status = HiiDisableUser (OpalDisk, Password, PassLength);\r
} else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_REVERT) {\r
- DEBUG ((DEBUG_INFO, "gHiiConfiguration.KeepUserData %u\n", gHiiConfiguration.KeepUserData));\r
- Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
+ if (OpalDisk->SupportedAttributes.PyriteSsc == 1 && OpalDisk->LockingFeature.MediaEncryption == 0) {\r
+ //\r
+ // For pyrite type device which also not supports media encryption, it not accept "Keep User Data" parameter.\r
+ // So here hardcode a FALSE for this case.\r
+ //\r
+ Status = HiiRevert(OpalDisk, Password, PassLength, FALSE);\r
+ } else {\r
+ Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
+ }\r
} else {\r
Status = HiiSetPassword(OpalDisk, Password, PassLength);\r
}\r
\r
+ ZeroMem (Password, sizeof (Password));\r
+\r
OpalHiiSetBrowserData ();\r
\r
return Status;\r
}\r
\r
/**\r
- Update block sid info.\r
+ Send BlockSid request through TPM physical presence module.\r
\r
- @param Enable Enable/disable BlockSid.\r
+ @param PpRequest TPM physical presence operation request.\r
\r
@retval EFI_SUCCESS Do the required action success.\r
@retval Others Other error occur.\r
\r
**/\r
EFI_STATUS\r
-HiiSetBlockSid (\r
- BOOLEAN Enable\r
+HiiSetBlockSidAction (\r
+ IN UINT32 PpRequest\r
)\r
{\r
- EFI_STATUS Status;\r
- OPAL_EXTRA_INFO_VAR OpalExtraInfo;\r
- UINTN DataSize;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- DEBUG ((DEBUG_INFO, "HiiSetBlockSid(enable: %x)\n", Enable));\r
-\r
- OpalExtraInfo.EnableBlockSid = Enable;\r
- DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
- Status = gRT->SetVariable (\r
- OPAL_EXTRA_INFO_VAR_NAME,\r
- &gOpalExtraInfoVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- DataSize,\r
- &OpalExtraInfo\r
- );\r
- DEBUG ((DEBUG_INFO, "SetVariable, Status: %r\n", Status));\r
+ UINT32 ReturnCode;\r
+ EFI_STATUS Status;\r
+\r
+ ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
+ if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
+ Status = EFI_SUCCESS;\r
+ } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
+ Status = EFI_UNSUPPORTED;\r
+ } else {\r
+ Status = EFI_DEVICE_ERROR;\r
+ }\r
\r
return Status;\r
}\r
EFI_STRING *Progress\r
)\r
{\r
- DEBUG ((DEBUG_INFO, "RouteConfig( )\n"));\r
if (Configuration == NULL || Progress == NULL) {\r
return (EFI_INVALID_PARAMETER);\r
}\r
\r
+ *Progress = Configuration;\r
+ if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *Progress = Configuration + StrLen (Configuration);\r
+\r
return EFI_SUCCESS;\r
}\r
\r
)\r
{\r
EFI_STATUS Status;\r
-\r
- DEBUG ((DEBUG_INFO, "ExtractConfig( )\n"));\r
+ EFI_STRING ConfigRequest;\r
+ EFI_STRING ConfigRequestHdr;\r
+ UINTN BufferSize;\r
+ UINTN Size;\r
+ BOOLEAN AllocatedRequest;\r
+ EFI_HANDLE DriverHandle;\r
\r
//\r
// Check for valid parameters\r
return (EFI_INVALID_PARAMETER);\r
}\r
\r
+ *Progress = Request;\r
+ if ((Request != NULL) &&\r
+ !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ AllocatedRequest = FALSE;\r
+ BufferSize = sizeof (OPAL_HII_CONFIGURATION);\r
+ ConfigRequest = Request;\r
+ if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+ //\r
+ // Request has no request element, construct full request string.\r
+ // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
+ // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
+ //\r
+ DriverHandle = HiiGetDriverImageHandleCB();\r
+ ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle);\r
+ Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+ ConfigRequest = AllocateZeroPool (Size);\r
+ if (ConfigRequest == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ AllocatedRequest = TRUE;\r
+ UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+ FreePool (ConfigRequestHdr);\r
+ }\r
+\r
//\r
// Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
//\r
Status = gHiiConfigRouting->BlockToConfig(\r
gHiiConfigRouting,\r
- Request,\r
+ ConfigRequest,\r
(UINT8*)&gHiiConfiguration,\r
sizeof(OPAL_HII_CONFIGURATION),\r
Results,\r
Progress\r
);\r
\r
+ //\r
+ // Free the allocated config request string.\r
+ //\r
+ if (AllocatedRequest) {\r
+ FreePool (ConfigRequest);\r
+ ConfigRequest = NULL;\r
+ }\r
+\r
+ //\r
+ // Set Progress string to the original request string.\r
+ //\r
+ if (Request == NULL) {\r
+ *Progress = NULL;\r
+ } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+ *Progress = Request + StrLen (Request);\r
+ }\r
+\r
return (Status);\r
}\r
\r
VOID\r
)\r
{\r
- DEBUG ((DEBUG_INFO, "OpalHiiSetBrowserData( )\n"));\r
HiiSetBrowserData(\r
&gHiiSetupVariableGuid,\r
(CHAR16*)L"OpalHiiConfig",\r
VOID\r
)\r
{\r
- DEBUG ((DEBUG_INFO, "OpalHiiGetBrowserData( )\n"));\r
HiiGetBrowserData(\r
&gHiiSetupVariableGuid,\r
(CHAR16*)L"OpalHiiConfig",\r
UINT32 UniSize;\r
CHAR16* UniStr;\r
\r
- DEBUG ((DEBUG_INFO, "HiiSetFormString( )\n"));\r
-\r
//\r
// Determine the Length of the sting\r
//\r
//\r
// Copy into unicode string, then copy into string id\r
//\r
- AsciiStrToUnicodeStr( SrcAsciiStr, UniStr );\r
+ AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1);\r
\r
//\r
// Update the string in the form\r