/** @file\r
The platform device manager reference implementation\r
\r
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
\r
#define MAX_MAC_ADDRESS_NODE_LIST_LEN 10\r
\r
-EFI_GUID mDeviceManagerGuid = DEVICE_MANAGER_FORMSET_GUID;\r
-EFI_GUID mDriverHealthGuid = DRIVER_HEALTH_FORMSET_GUID;\r
-\r
//\r
// Which Mac Address string is select\r
// it will decide what menu need to show in the NETWORK_DEVICE_FORM_ID form.\r
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
}\r
},\r
- //\r
- // {102579A0-3686-466e-ACD8-80C087044F4A}\r
- //\r
- { 0x102579a0, 0x3686, 0x466e, { 0xac, 0xd8, 0x80, 0xc0, 0x87, 0x4, 0x4f, 0x4a } }\r
+ DEVICE_MANAGER_FORMSET_GUID\r
},\r
{\r
END_DEVICE_PATH_TYPE,\r
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
}\r
},\r
- //\r
- // {D8F76651-1675-4986-BED4-3824B2F1F4C8}\r
- //\r
- { 0xd8f76651, 0x1675, 0x4986, { 0xbe, 0xd4, 0x38, 0x24, 0xb2, 0xf1, 0xf4, 0xc8 } }\r
+ DRIVER_HEALTH_FORMSET_GUID\r
},\r
{\r
END_DEVICE_PATH_TYPE,\r
)\r
{\r
UINTN CurIndex;\r
- \r
- if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {\r
+\r
+ if (Action != EFI_BROWSER_ACTION_CHANGING) {\r
//\r
- // Do nothing for UEFI OPEN/CLOSE Action\r
+ // All other action return unsupported.\r
//\r
- return EFI_SUCCESS;\r
+ return EFI_UNSUPPORTED;\r
}\r
\r
- if ((Value == NULL) || (ActionRequest == NULL)) {\r
+ if (Value == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
gCallbackKey = QuestionId;\r
-\r
if ((QuestionId < MAX_KEY_SECTION_LEN + NETWORK_DEVICE_LIST_KEY_OFFSET) && (QuestionId >= NETWORK_DEVICE_LIST_KEY_OFFSET)) {\r
//\r
// If user select the mac address, need to record mac address string to support next form show.\r
}\r
}\r
}\r
- \r
- //\r
- // Request to exit SendForm(), so as to switch to selected form\r
- //\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
\r
return EFI_SUCCESS;\r
}\r
Save question id and prompt id to the mac device list.\r
If the same mac address has saved yet, no need to add more.\r
\r
- @param NewQuestionId New question id.\r
@param MacAddrString Mac address string.\r
\r
@retval EFI_SUCCESS Add the item is successful.\r
EFI_STATUS Status;\r
UINTN EntryCount;\r
UINTN Index; \r
- EFI_HII_HANDLE HiiDeviceManagerHandle;\r
EFI_HANDLE DriverHandle;\r
EFI_HANDLE ControllerHandle;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
BOOLEAN IsNeedAdd;\r
\r
- HiiDeviceManagerHandle = gDeviceManagerPrivate.HiiHandle;\r
IsNeedAdd = FALSE;\r
OpenInfoBuffer = NULL;\r
if ((Handle == NULL) || (ItemCount == NULL)) {\r
// Publish our HII data.\r
//\r
HiiHandle = HiiAddPackages (\r
- &mDeviceManagerGuid,\r
+ &gDeviceManagerFormSetGuid,\r
gDeviceManagerPrivate.DriverHandle,\r
DeviceManagerVfrBin,\r
BdsDxeStrings,\r
//\r
if (mNextShowFormId == NETWORK_DEVICE_FORM_ID) {\r
String = HiiGetString (HiiHandle, STRING_TOKEN (STR_FORM_NETWORK_DEVICE_TITLE), NULL);\r
- NewStringLen = StrLen(mSelectedMacAddrString);\r
+ NewStringLen = StrLen(mSelectedMacAddrString) * 2;\r
NewStringLen += (StrLen(String) + 2) * 2;\r
NewStringTitle = AllocatePool (NewStringLen);\r
UnicodeSPrint (NewStringTitle, NewStringLen, L"%s %s", String, mSelectedMacAddrString);\r
//\r
if (!AddNetworkMenu) {\r
AddNetworkMenu = TRUE;\r
- HiiCreateActionOpCode (\r
+ HiiCreateGotoOpCode (\r
StartOpCodeHandle,\r
- (EFI_QUESTION_ID) QUESTION_NETWORK_DEVICE_ID,\r
+ INVALID_FORM_ID,\r
STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_TITLE),\r
STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_HELP),\r
EFI_IFR_FLAG_CALLBACK,\r
- 0\r
+ (EFI_QUESTION_ID) QUESTION_NETWORK_DEVICE_ID\r
);\r
}\r
} else if (mNextShowFormId == NETWORK_DEVICE_LIST_FORM_ID) {\r
// In network device list form, same mac address device only show one menu.\r
//\r
while (AddItemCount > 0) {\r
- HiiCreateActionOpCode (\r
+ HiiCreateGotoOpCode (\r
StartOpCodeHandle,\r
- mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].QuestionId,\r
+ INVALID_FORM_ID,\r
mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].PromptId,\r
STRING_TOKEN (STR_NETWORK_DEVICE_HELP),\r
EFI_IFR_FLAG_CALLBACK,\r
- 0\r
+ mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].QuestionId\r
);\r
AddItemCount -= 1;\r
}\r
//\r
// In network device form, only the selected mac address device need to be show.\r
//\r
- HiiCreateActionOpCode (\r
+ HiiCreateGotoOpCode (\r
StartOpCodeHandle,\r
- (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
+ INVALID_FORM_ID,\r
Token,\r
TokenHelp,\r
EFI_IFR_FLAG_CALLBACK,\r
- 0\r
+ (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET)\r
);\r
}\r
} else {\r
// Not network device process, only need to show at device manger form.\r
//\r
if (mNextShowFormId == DEVICE_MANAGER_FORM_ID) {\r
- HiiCreateActionOpCode (\r
+ HiiCreateGotoOpCode (\r
StartOpCodeHandle,\r
- (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
+ INVALID_FORM_ID,\r
Token,\r
TokenHelp,\r
EFI_IFR_FLAG_CALLBACK,\r
- 0\r
+ (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET)\r
);\r
}\r
}\r
// If driver health protocol is installed, create Driver Health subtitle and entry\r
//\r
HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_DM_DRIVER_HEALTH_TITLE), 0, 0, 0);\r
- HiiCreateActionOpCode (\r
- StartOpCodeHandle, // Container for dynamic created opcodes\r
- DEVICE_MANAGER_KEY_DRIVER_HEALTH, // Question ID\r
+ HiiCreateGotoOpCode (\r
+ StartOpCodeHandle,\r
+ DRIVER_HEALTH_FORM_ID,\r
STRING_TOKEN(STR_DRIVER_HEALTH_ALL_HEALTHY), // Prompt text\r
STRING_TOKEN(STR_DRIVER_HEALTH_STATUS_HELP), // Help text\r
- EFI_IFR_FLAG_CALLBACK, // Question flag\r
- 0 // Action String ID\r
- );\r
+ EFI_IFR_FLAG_CALLBACK,\r
+ DEVICE_MANAGER_KEY_DRIVER_HEALTH // Question ID\r
+ );\r
\r
//\r
// Check All Driver health status\r
\r
HiiUpdateForm (\r
HiiHandle,\r
- &mDeviceManagerGuid,\r
+ &gDeviceManagerFormSetGuid,\r
mNextShowFormId,\r
StartOpCodeHandle,\r
EndOpCodeHandle\r
gFormBrowser2,\r
&HiiHandle,\r
1,\r
- &mDeviceManagerGuid,\r
+ &gDeviceManagerFormSetGuid,\r
mNextShowFormId,\r
NULL,\r
&ActionRequest\r
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
)\r
{\r
- if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {\r
+ if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
+ if ((Value == NULL) || (ActionRequest == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ gCallbackKey = QuestionId;\r
+\r
//\r
- // Do nothing for UEFI OPEN/CLOSE Action\r
+ // Request to exit SendForm(), so as to switch to selected form\r
//\r
- return EFI_SUCCESS;\r
- }\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
\r
- if ((Value == NULL) || (ActionRequest == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
+ return EFI_SUCCESS;\r
}\r
\r
- gCallbackKey = QuestionId;\r
-\r
//\r
- // Request to exit SendForm(), so as to switch to selected form\r
+ // All other action return unsupported.\r
//\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-\r
- return EFI_SUCCESS;\r
+ return EFI_UNSUPPORTED;\r
}\r
\r
/**\r
DRIVER_HEALTH_INFO *DriverHealthInfo;\r
LIST_ENTRY *Link;\r
EFI_DEVICE_PATH_PROTOCOL *DriverDevicePath;\r
- UINTN Length;\r
+ BOOLEAN RebootRequired;\r
\r
Index = 0;\r
- Length = 0;\r
DriverHealthInfo = NULL; \r
DriverDevicePath = NULL;\r
InitializeListHead (&DriverHealthList);\r
// Publish Driver Health HII data.\r
//\r
HiiHandle = HiiAddPackages (\r
- &mDeviceManagerGuid,\r
+ &gDeviceManagerFormSetGuid,\r
gDeviceManagerPrivate.DriverHealthHandle,\r
DriverHealthVfrBin,\r
BdsDxeStrings,\r
DriverHealthInfo->MessageList->StringId, \r
NULL\r
);\r
- //\r
- // Assert if can not retrieve the message string\r
- //\r
- ASSERT (TmpString != NULL);\r
- StrnCat (String, TmpString, StrLen (TmpString));\r
- FreePool (TmpString);\r
} else {\r
//\r
// Update the string will be displayed base on the driver's health status\r
//\r
switch(DriverHealthInfo->HealthStatus) {\r
case EfiDriverHealthStatusRepairRequired:\r
- Length = StrLen (GetStringById (STRING_TOKEN (STR_REPAIR_REQUIRED)));\r
- StrnCat (String, GetStringById (STRING_TOKEN (STR_REPAIR_REQUIRED)), Length);\r
+ TmpString = GetStringById (STRING_TOKEN (STR_REPAIR_REQUIRED));\r
break;\r
case EfiDriverHealthStatusConfigurationRequired:\r
- Length = StrLen (GetStringById (STRING_TOKEN (STR_CONFIGURATION_REQUIRED)));\r
- StrnCat (String, GetStringById (STRING_TOKEN (STR_CONFIGURATION_REQUIRED)), Length);\r
+ TmpString = GetStringById (STRING_TOKEN (STR_CONFIGURATION_REQUIRED));\r
break;\r
case EfiDriverHealthStatusFailed:\r
- Length = StrLen (GetStringById (STRING_TOKEN (STR_OPERATION_FAILED)));\r
- StrnCat (String, GetStringById (STRING_TOKEN (STR_OPERATION_FAILED)), Length);\r
+ TmpString = GetStringById (STRING_TOKEN (STR_OPERATION_FAILED));\r
break;\r
case EfiDriverHealthStatusReconnectRequired:\r
- Length = StrLen (GetStringById (STRING_TOKEN (STR_RECONNECT_REQUIRED)));\r
- StrnCat (String, GetStringById (STRING_TOKEN (STR_RECONNECT_REQUIRED)), Length);\r
+ TmpString = GetStringById (STRING_TOKEN (STR_RECONNECT_REQUIRED));\r
break;\r
case EfiDriverHealthStatusRebootRequired:\r
- Length = StrLen (GetStringById (STRING_TOKEN (STR_REBOOT_REQUIRED)));\r
- StrnCat (String, GetStringById (STRING_TOKEN (STR_REBOOT_REQUIRED)), Length);\r
+ TmpString = GetStringById (STRING_TOKEN (STR_REBOOT_REQUIRED));\r
break;\r
default:\r
- Length = StrLen (GetStringById (STRING_TOKEN (STR_DRIVER_HEALTH_HEALTHY)));\r
- StrnCat (String, GetStringById (STRING_TOKEN (STR_DRIVER_HEALTH_HEALTHY)), Length);\r
+ TmpString = GetStringById (STRING_TOKEN (STR_DRIVER_HEALTH_HEALTHY));\r
break;\r
}\r
}\r
\r
+ ASSERT (TmpString != NULL);\r
+ StrCat (String, TmpString);\r
+ FreePool (TmpString);\r
+\r
Token = HiiSetString (HiiHandle, 0, String, NULL);\r
FreePool (String);\r
\r
\r
Status = HiiUpdateForm (\r
HiiHandle,\r
- &mDriverHealthGuid,\r
+ &gDriverHealthFormSetGuid,\r
DRIVER_HEALTH_FORM_ID,\r
StartOpCodeHandle,\r
EndOpCodeHandle\r
\r
Status = HiiUpdateForm (\r
HiiHandle,\r
- &mDriverHealthGuid,\r
+ &gDriverHealthFormSetGuid,\r
DRIVER_HEALTH_FORM_ID,\r
StartOpCodeHandleRepair,\r
EndOpCodeHandleRepair\r
gFormBrowser2,\r
&HiiHandle,\r
1,\r
- &mDriverHealthGuid,\r
+ &gDriverHealthFormSetGuid,\r
DRIVER_HEALTH_FORM_ID,\r
NULL,\r
&ActionRequest\r
//\r
// Process the driver's healthy status for the specify module\r
//\r
+ RebootRequired = FALSE;\r
ProcessSingleControllerHealth (\r
DriverHealthInfo->DriverHealth,\r
DriverHealthInfo->ControllerHandle, \r
DriverHealthInfo->ChildHandle,\r
DriverHealthInfo->HealthStatus,\r
&(DriverHealthInfo->MessageList),\r
- DriverHealthInfo->HiiHandle\r
- ); \r
- break;\r
+ DriverHealthInfo->HiiHandle,\r
+ &RebootRequired\r
+ );\r
+ if (RebootRequired) {\r
+ gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
+ }\r
+ break;\r
}\r
Index++;\r
Link = GetNextNode (&DriverHealthList, Link);\r
ChildHandle. This is an optional parameter that may be NULL.\r
@param FormHiiHandle The HII handle for an HII form associated with the \r
controller specified by ControllerHandle and ChildHandle.\r
+ @param RebootRequired Indicate whether a reboot is required to repair the controller.\r
**/\r
VOID\r
ProcessSingleControllerHealth (\r
- IN EFI_DRIVER_HEALTH_PROTOCOL *DriverHealth,\r
- IN EFI_HANDLE ControllerHandle, OPTIONAL\r
- IN EFI_HANDLE ChildHandle, OPTIONAL\r
- IN EFI_DRIVER_HEALTH_STATUS HealthStatus,\r
- IN EFI_DRIVER_HEALTH_HII_MESSAGE **MessageList, OPTIONAL\r
- IN EFI_HII_HANDLE FormHiiHandle\r
+ IN EFI_DRIVER_HEALTH_PROTOCOL *DriverHealth,\r
+ IN EFI_HANDLE ControllerHandle, OPTIONAL\r
+ IN EFI_HANDLE ChildHandle, OPTIONAL\r
+ IN EFI_DRIVER_HEALTH_STATUS HealthStatus,\r
+ IN EFI_DRIVER_HEALTH_HII_MESSAGE **MessageList, OPTIONAL\r
+ IN EFI_HII_HANDLE FormHiiHandle,\r
+ IN OUT BOOLEAN *RebootRequired\r
)\r
{\r
EFI_STATUS Status;\r
// reach a terminal status. The status from EfiDriverHealthStatusRepairRequired after repair \r
// will be in (Health, Failed, Configuration Required).\r
//\r
- while( LocalHealthStatus == EfiDriverHealthStatusConfigurationRequired ||\r
- LocalHealthStatus == EfiDriverHealthStatusRepairRequired) {\r
+ while(LocalHealthStatus == EfiDriverHealthStatusConfigurationRequired ||\r
+ LocalHealthStatus == EfiDriverHealthStatusRepairRequired) {\r
\r
if (LocalHealthStatus == EfiDriverHealthStatusRepairRequired) {\r
Status = DriverHealth->Repair (\r
DriverHealth,\r
ControllerHandle,\r
ChildHandle,\r
- (EFI_DRIVER_HEALTH_REPAIR_PROGRESS_NOTIFY) RepairNotify\r
+ RepairNotify\r
);\r
}\r
//\r
// (Healthy, Reboot Required, Failed, Reconnect Required, Repair Required). \r
//\r
if (LocalHealthStatus == EfiDriverHealthStatusConfigurationRequired) {\r
- Status = gFormBrowser2->SendForm (\r
- gFormBrowser2,\r
- &FormHiiHandle,\r
- 1,\r
- &gEfiHiiDriverHealthFormsetGuid,\r
- 0,\r
- NULL,\r
- NULL\r
- );\r
- ASSERT( !EFI_ERROR (Status));\r
+ if (FormHiiHandle != NULL) {\r
+ Status = gFormBrowser2->SendForm (\r
+ gFormBrowser2,\r
+ &FormHiiHandle,\r
+ 1,\r
+ &gEfiHiiDriverHealthFormsetGuid,\r
+ 0,\r
+ NULL,\r
+ NULL\r
+ );\r
+ ASSERT( !EFI_ERROR (Status));\r
+ } else {\r
+ //\r
+ // Exit the loop in case no FormHiiHandle is supplied to prevent dead-loop\r
+ //\r
+ break;\r
+ }\r
}\r
\r
Status = DriverHealth->GetHealthStatus (\r
NULL,\r
&FormHiiHandle\r
);\r
- ASSERT_EFI_ERROR (Status);\r
+ ASSERT_EFI_ERROR (Status);\r
\r
- if (*MessageList != NULL) {\r
+ if (*MessageList != NULL) {\r
ProcessMessages (*MessageList);\r
- } \r
+ } \r
}\r
\r
//\r
// Check for RebootRequired or ReconnectRequired\r
//\r
if (LocalHealthStatus == EfiDriverHealthStatusRebootRequired) {\r
- gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
+ *RebootRequired = TRUE;\r
}\r
\r
//\r
if (LocalHealthStatus == EfiDriverHealthStatusReconnectRequired) {\r
Status = gBS->DisconnectController (ControllerHandle, NULL, NULL);\r
if (EFI_ERROR (Status)) {\r
- //\r
- // Disconnect failed. Need to promote reconnect to a reboot.\r
- //\r
- gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
+ //\r
+ // Disconnect failed. Need to promote reconnect to a reboot.\r
+ //\r
+ *RebootRequired = TRUE;\r
+ } else {\r
+ gBS->ConnectController (ControllerHandle, NULL, NULL, TRUE);\r
}\r
- gBS->ConnectController (ControllerHandle, NULL, NULL, TRUE);\r
}\r
}\r
\r
\r
/**\r
- Platform specific notification function for controller repair operations.\r
-\r
- If the driver for a controller support the Driver Health Protocol and the\r
- current state of the controller is EfiDriverHealthStatusRepairRequired then\r
- when the Repair() service of the Driver Health Protocol is called, this \r
- platform specific notification function can display the progress of the repair\r
- operation. Some platforms may choose to not display anything, other may choose\r
- to show the percentage complete on text consoles, and other may choose to render\r
- a progress bar on text and graphical consoles.\r
-\r
- This function displays the percentage of the repair operation that has been\r
- completed on text consoles. The percentage is Value / Limit * 100%.\r
- \r
- @param Value Value in the range 0..Limit the the repair has completed..\r
- @param Limit The maximum value of Value\r
+ Reports the progress of a repair operation.\r
+\r
+ @param[in] Value A value between 0 and Limit that identifies the current \r
+ progress of the repair operation.\r
+\r
+ @param[in] Limit The maximum value of Value for the current repair operation.\r
+ For example, a driver that wants to specify progress in \r
+ percent would use a Limit value of 100.\r
+\r
+ @retval EFI_SUCCESS The progress of a repair operation is reported successfully.\r
\r
**/\r
-VOID\r
+EFI_STATUS\r
+EFIAPI\r
RepairNotify (\r
IN UINTN Value,\r
IN UINTN Limit\r
Percent = Value * 100 / Limit;\r
Print(L"Repair Progress = %3d%%\n\r", Percent);\r
}\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r
{ \r
DRIVER_HEALTH_INFO *DriverHealthInfo;\r
LIST_ENTRY *Link;\r
+ BOOLEAN RebootRequired;\r
\r
ASSERT (DriverHealthList != NULL);\r
\r
- Link = GetFirstNode (DriverHealthList);\r
+ RebootRequired = FALSE;\r
\r
- while (!IsNull (DriverHealthList, Link)) { \r
+ for ( Link = GetFirstNode (DriverHealthList)\r
+ ; !IsNull (DriverHealthList, Link)\r
+ ; Link = GetNextNode (DriverHealthList, Link)\r
+ ) {\r
DriverHealthInfo = DEVICE_MANAGER_HEALTH_INFO_FROM_LINK (Link);\r
//\r
// Do driver health status operation by each link node\r
ASSERT (DriverHealthInfo != NULL);\r
\r
ProcessSingleControllerHealth ( \r
- DriverHealthInfo->DriverHealth,\r
- DriverHealthInfo->ControllerHandle,\r
- DriverHealthInfo->ChildHandle,\r
- DriverHealthInfo->HealthStatus,\r
- &(DriverHealthInfo->MessageList),\r
- DriverHealthInfo->HiiHandle\r
- );\r
+ DriverHealthInfo->DriverHealth,\r
+ DriverHealthInfo->ControllerHandle,\r
+ DriverHealthInfo->ChildHandle,\r
+ DriverHealthInfo->HealthStatus,\r
+ &(DriverHealthInfo->MessageList),\r
+ DriverHealthInfo->HiiHandle,\r
+ &RebootRequired\r
+ );\r
+ }\r
\r
- Link = GetNextNode (DriverHealthList, Link);\r
+ if (RebootRequired) {\r
+ gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
}\r
}\r
\r
CHAR8 *LanguageVariable;\r
CHAR8 *BestLanguage;\r
\r
- LanguageVariable = GetEfiGlobalVariable (Iso639Language ? L"Lang" : L"PlatformLang");\r
+ GetEfiGlobalVariable2 (Iso639Language ? L"Lang" : L"PlatformLang", (VOID**)&LanguageVariable, NULL);\r
\r
BestLanguage = GetBestLanguage(\r
SupportedLanguages,\r