EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;\r
BMM_FAKE_NV_DATA *NewBmmData;\r
BMM_FAKE_NV_DATA *OldBmmData;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext;\r
BM_MENU_ENTRY *NewMenuEntry;\r
BM_LOAD_CONTEXT *NewLoadContext;\r
- UINT16 Index; \r
+ UINT16 Index;\r
+ BOOLEAN TerminalAttChange;\r
BMM_CALLBACK_DATA *Private; \r
\r
if (Progress == NULL) {\r
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];\r
NewBmmData->BootOptionDel[Index] = FALSE;\r
+ NewBmmData->BootOptionDelMark[Index] = FALSE;\r
}\r
\r
Var_DelBootOption ();\r
\r
if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, sizeof (NewBmmData->BootOptionOrder)) != 0) { \r
Status = Var_UpdateBootOrder (Private);\r
- } \r
+ }\r
+\r
+ if (CompareMem (&NewBmmData->BootTimeOut, &OldBmmData->BootTimeOut, sizeof (NewBmmData->BootTimeOut)) != 0){\r
+ Status = gRT->SetVariable(\r
+ L"Timeout",\r
+ &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+ sizeof(UINT16),\r
+ &(NewBmmData->BootTimeOut)\r
+ );\r
+ ASSERT_EFI_ERROR(Status);\r
+\r
+ Private->BmmOldFakeNVData.BootTimeOut = NewBmmData->BootTimeOut;\r
+ }\r
\r
//\r
// Check data which located in Driver Options Menu and save the settings if need\r
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];\r
NewBmmData->DriverOptionDel[Index] = FALSE;\r
+ NewBmmData->DriverOptionDelMark[Index] = FALSE;\r
}\r
Var_DelDriverOption (); \r
}\r
\r
if (CompareMem (NewBmmData->DriverOptionOrder, OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) { \r
Status = Var_UpdateDriverOrder (Private);\r
- } \r
+ }\r
+\r
+ if (CompareMem (&NewBmmData->ConsoleOutMode, &OldBmmData->ConsoleOutMode, sizeof (NewBmmData->ConsoleOutMode)) != 0){\r
+ Var_UpdateConMode(Private);\r
+ }\r
+\r
+ TerminalAttChange = FALSE;\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+\r
+ //\r
+ // only need update modified items\r
+ //\r
+ if (CompareMem (&NewBmmData->COMBaudRate[Index], &OldBmmData->COMBaudRate[Index], sizeof (NewBmmData->COMBaudRate[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMDataRate[Index], &OldBmmData->COMDataRate[Index], sizeof (NewBmmData->COMDataRate[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMStopBits[Index], &OldBmmData->COMStopBits[Index], sizeof (NewBmmData->COMStopBits[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMParity[Index], &OldBmmData->COMParity[Index], sizeof (NewBmmData->COMParity[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMTerminalType[Index], &OldBmmData->COMTerminalType[Index], sizeof (NewBmmData->COMTerminalType[Index])) == 0 &&\r
+ CompareMem (&NewBmmData->COMFlowControl[Index], &OldBmmData->COMFlowControl[Index], sizeof (NewBmmData->COMFlowControl[Index])) == 0) {\r
+ continue;\r
+ }\r
+\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ ASSERT (NewMenuEntry != NULL);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ NewTerminalContext->BaudRateIndex = NewBmmData->COMBaudRate[Index];\r
+ ASSERT (NewBmmData->COMBaudRate[Index] < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
+ NewTerminalContext->BaudRate = BaudRateList[NewBmmData->COMBaudRate[Index]].Value;\r
+ NewTerminalContext->DataBitsIndex = NewBmmData->COMDataRate[Index];\r
+ ASSERT (NewBmmData->COMDataRate[Index] < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
+ NewTerminalContext->DataBits = (UINT8) DataBitsList[NewBmmData->COMDataRate[Index]].Value;\r
+ NewTerminalContext->StopBitsIndex = NewBmmData->COMStopBits[Index];\r
+ ASSERT (NewBmmData->COMStopBits[Index] < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
+ NewTerminalContext->StopBits = (UINT8) StopBitsList[NewBmmData->COMStopBits[Index]].Value;\r
+ NewTerminalContext->ParityIndex = NewBmmData->COMParity[Index];\r
+ ASSERT (NewBmmData->COMParity[Index] < (sizeof (ParityList) / sizeof (ParityList[0])));\r
+ NewTerminalContext->Parity = (UINT8) ParityList[NewBmmData->COMParity[Index]].Value;\r
+ NewTerminalContext->TerminalType = NewBmmData->COMTerminalType[Index];\r
+ NewTerminalContext->FlowControl = NewBmmData->COMFlowControl[Index];\r
+ ChangeTerminalDevicePath (\r
+ NewTerminalContext->DevicePath,\r
+ FALSE\r
+ );\r
+ TerminalAttChange = TRUE;\r
+ }\r
+ if (TerminalAttChange) {\r
+ Var_UpdateConsoleInpOption ();\r
+ Var_UpdateConsoleOutOption ();\r
+ Var_UpdateErrorOutOption ();\r
+ }\r
+ //\r
+ // Check data which located in Console Options Menu and save the settings if need\r
+ //\r
+ if (CompareMem (NewBmmData->ConsoleInCheck, OldBmmData->ConsoleInCheck, sizeof (NewBmmData->ConsoleInCheck)) != 0){\r
+ for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleInpMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = NewBmmData->ConsoleInCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsConIn = NewBmmData->ConsoleInCheck[Index + ConsoleInpMenu.MenuNumber];\r
+ }\r
+ Var_UpdateConsoleInpOption();\r
+ }\r
+\r
+ if (CompareMem (NewBmmData->ConsoleOutCheck, OldBmmData->ConsoleOutCheck, sizeof (NewBmmData->ConsoleOutCheck)) != 0){\r
+ for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleOutMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = NewBmmData->ConsoleOutCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsConOut = NewBmmData->ConsoleOutCheck[Index + ConsoleOutMenu.MenuNumber];\r
+ }\r
+ Var_UpdateConsoleOutOption();\r
+ }\r
+\r
+ if (CompareMem (NewBmmData->ConsoleErrCheck, OldBmmData->ConsoleErrCheck, sizeof (NewBmmData->ConsoleErrCheck)) != 0){\r
+ for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++){\r
+ NewMenuEntry = BOpt_GetMenuEntry(&ConsoleErrMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *)NewMenuEntry->VariableContext;\r
+ ASSERT (Index < MAX_MENU_NUMBER);\r
+ NewConsoleContext->IsActive = NewBmmData->ConsoleErrCheck[Index];\r
+ }\r
+ for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
+ NewTerminalContext->IsStdErr = NewBmmData->ConsoleErrCheck[Index + ConsoleErrMenu.MenuNumber];\r
+ }\r
+ Var_UpdateErrorOutOption();\r
+ }\r
\r
//\r
// After user do the save action, need to update OldBmmData.\r
BMM_CALLBACK_DATA *Private;\r
BM_MENU_ENTRY *NewMenuEntry;\r
BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
- EFI_STATUS Status;\r
UINTN OldValue;\r
UINTN NewValue;\r
UINTN Number;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- switch (QuestionId) {\r
- case KEY_VALUE_SAVE_AND_EXIT:\r
- case KEY_VALUE_NO_SAVE_AND_EXIT:\r
- if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
- Status = ApplyChangeHandler (Private, CurrentFakeNVMap, Private->BmmPreviousPageId);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
- DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+ if ((QuestionId >= BOOT_OPTION_DEL_QUESTION_ID) && (QuestionId < BOOT_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ if (Value->b){\r
+ //\r
+ // Means user try to delete this boot option but not press F10 or "Commit Changes and Exit" menu.\r
+ //\r
+ CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = TRUE;\r
+ } else {\r
+ //\r
+ // Means user remove the old check status.\r
+ //\r
+ CurrentFakeNVMap->BootOptionDelMark[QuestionId - BOOT_OPTION_DEL_QUESTION_ID] = FALSE;\r
}\r
+ } else if ((QuestionId >= DRIVER_OPTION_DEL_QUESTION_ID) && (QuestionId < DRIVER_OPTION_DEL_QUESTION_ID + MAX_MENU_NUMBER)) {\r
+ if (Value->b){\r
+ CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = TRUE;\r
+ } else {\r
+ CurrentFakeNVMap->DriverOptionDelMark[QuestionId - DRIVER_OPTION_DEL_QUESTION_ID] = FALSE;\r
+ }\r
+ } else {\r
+ switch (QuestionId) {\r
+ case KEY_VALUE_SAVE_AND_EXIT:\r
+ case KEY_VALUE_NO_SAVE_AND_EXIT:\r
+ if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+ } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {\r
+ DiscardChangeHandler (Private, CurrentFakeNVMap);\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+ }\r
\r
- //\r
- // Tell browser not to ask for confirmation of changes,\r
- // since we have already applied or discarded.\r
- //\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
-\r
- break;\r
+ break;\r
\r
- case FORM_RESET:\r
- gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
- return EFI_UNSUPPORTED;\r
+ case FORM_RESET:\r
+ gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
+ return EFI_UNSUPPORTED;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
-/**\r
- Function handling request to apply changes for BMM pages.\r
-\r
- @param Private Pointer to callback data buffer.\r
- @param CurrentFakeNVMap Pointer to buffer holding data of various values used by BMM\r
- @param FormId ID of the form which has sent the request to apply change.\r
-\r
- @retval EFI_SUCCESS Change successfully applied.\r
- @retval Other Error occurs while trying to apply changes.\r
-\r
-**/\r
-EFI_STATUS\r
-ApplyChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap,\r
- IN EFI_FORM_ID FormId\r
- )\r
-{\r
- BM_CONSOLE_CONTEXT *NewConsoleContext;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
- BM_LOAD_CONTEXT *NewLoadContext;\r
- BM_MENU_ENTRY *NewMenuEntry;\r
- EFI_STATUS Status;\r
- UINT16 Index;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- switch (FormId) {\r
- case FORM_BOOT_DEL_ID:\r
- for (Index = 0; \r
- ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->BootOptionDel) / sizeof (CurrentFakeNVMap->BootOptionDel[0])))); \r
- Index ++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];\r
- CurrentFakeNVMap->BootOptionDel[Index] = FALSE;\r
- }\r
-\r
- Var_DelBootOption ();\r
- break;\r
-\r
- case FORM_DRV_DEL_ID:\r
- for (Index = 0; \r
- ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof (CurrentFakeNVMap->DriverOptionDel) / sizeof (CurrentFakeNVMap->DriverOptionDel[0])))); \r
- Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
- NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
- NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];\r
- CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;\r
- }\r
-\r
- Var_DelDriverOption ();\r
- break;\r
-\r
- case FORM_BOOT_CHG_ID:\r
- Status = Var_UpdateBootOrder (Private);\r
- break;\r
-\r
- case FORM_DRV_CHG_ID:\r
- Status = Var_UpdateDriverOrder (Private);\r
- break;\r
-\r
- case FORM_TIME_OUT_ID:\r
- Status = gRT->SetVariable (\r
- L"Timeout",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
- sizeof (UINT16),\r
- &(CurrentFakeNVMap->BootTimeOut)\r
- );\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;\r
- break;\r
-\r
- case FORM_BOOT_NEXT_ID:\r
- Status = Var_UpdateBootNext (Private);\r
- break;\r
-\r
- case FORM_CON_MODE_ID:\r
- Status = Var_UpdateConMode (Private);\r
- break;\r
-\r
- case FORM_CON_COM_SETUP_ID:\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal);\r
-\r
- ASSERT (NewMenuEntry != NULL);\r
-\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
- NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;\r
- ASSERT (CurrentFakeNVMap->COMBaudRate < (sizeof (BaudRateList) / sizeof (BaudRateList[0])));\r
- NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;\r
- NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;\r
- ASSERT (CurrentFakeNVMap->COMDataRate < (sizeof (DataBitsList) / sizeof (DataBitsList[0])));\r
- NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value;\r
- NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;\r
- ASSERT (CurrentFakeNVMap->COMStopBits < (sizeof (StopBitsList) / sizeof (StopBitsList[0])));\r
- NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value;\r
- NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity;\r
- ASSERT (CurrentFakeNVMap->COMParity < (sizeof (ParityList) / sizeof (ParityList[0])));\r
- NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value;\r
- NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType;\r
-\r
- ChangeTerminalDevicePath (\r
- NewTerminalContext->DevicePath,\r
- FALSE\r
- );\r
-\r
- Var_UpdateConsoleInpOption ();\r
- Var_UpdateConsoleOutOption ();\r
- Var_UpdateErrorOutOption ();\r
- break;\r
-\r
- case FORM_CON_IN_ID:\r
- for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateConsoleInpOption ();\r
- break;\r
-\r
- case FORM_CON_OUT_ID:\r
- for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateConsoleOutOption ();\r
- break;\r
-\r
- case FORM_CON_ERR_ID:\r
- for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
- NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index < MAX_MENU_NUMBER);\r
- NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];\r
- }\r
-\r
- for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
- ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);\r
- NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber];\r
- }\r
-\r
- Var_UpdateErrorOutOption ();\r
- break;\r
-\r
- case FORM_DRV_ADD_HANDLE_DESC_ID:\r
- Status = Var_UpdateDriverOption (\r
- Private,\r
- Private->BmmHiiHandle,\r
- CurrentFakeNVMap->DriverAddHandleDesc,\r
- CurrentFakeNVMap->DriverAddHandleOptionalData,\r
- CurrentFakeNVMap->DriverAddForceReconnect\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
- }\r
-\r
- BOpt_GetDriverOptions (Private);\r
- CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
-Error:\r
- return Status;\r
-}\r
-\r
/**\r
Discard all changes done to the BMM pages such as Boot Order change,\r
Driver order change.\r
FreePool (HiiHandles);\r
}\r
\r
-\r
/**\r
- Create dynamic code for BMM.\r
+ Create dynamic code for BMM and initialize all of BMM configuration data in BmmFakeNvData and\r
+ BmmOldFakeNVData member in BMM context data.\r
\r
- @param BmmCallbackInfo The BMM context data.\r
+ @param CallbackData The BMM context data.\r
\r
**/\r
VOID\r
-InitializeBmmConfig(\r
- IN BMM_CALLBACK_DATA *BmmCallbackInfo\r
+InitializeBmmConfig (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
)\r
{\r
- UpdateBootDelPage (BmmCallbackInfo);\r
- UpdateDrvDelPage (BmmCallbackInfo);\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_LOAD_CONTEXT *NewLoadContext;\r
+ UINT16 Index;\r
\r
- if (TerminalMenu.MenuNumber > 0) {\r
- BmmCallbackInfo->CurrentTerminal = 0;\r
- UpdateTerminalPage (BmmCallbackInfo);\r
+ ASSERT (CallbackData != NULL);\r
+\r
+ InitializeDrivers (CallbackData);\r
+\r
+ //\r
+ // Initialize data which located in BMM main page\r
+ //\r
+ CallbackData->BmmFakeNvData.BootNext = (UINT16) (BootOptionMenu.MenuNumber);\r
+ for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
+ NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
+ NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
+\r
+ if (NewLoadContext->IsBootNext) {\r
+ CallbackData->BmmFakeNvData.BootNext = Index;\r
+ break;\r
+ }\r
}\r
\r
- InitializeDrivers (BmmCallbackInfo);\r
+ CallbackData->BmmFakeNvData.BootTimeOut = PcdGet16 (PcdPlatformBootTimeOut);\r
+\r
+ //\r
+ // Initialize data which located in Boot Options Menu\r
+ //\r
+ GetBootOrder (CallbackData);\r
+\r
+ //\r
+ // Initialize data which located in Driver Options Menu\r
+ //\r
+ GetDriverOrder (CallbackData);\r
+\r
+ //\r
+ // Initialize data which located in Console Options Menu\r
+ // \r
+ GetConsoleOutMode (CallbackData);\r
+ GetConsoleInCheck (CallbackData);\r
+ GetConsoleOutCheck (CallbackData);\r
+ GetConsoleErrCheck (CallbackData);\r
+ GetTerminalAttribute (CallbackData);\r
+\r
+ //\r
+ // Backup Initialize BMM configuartion data to BmmOldFakeNVData\r
+ //\r
+ CopyMem (&CallbackData->BmmOldFakeNVData, &CallbackData->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));\r
}\r
\r
/**\r
BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;\r
BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;\r
BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig;\r
- BmmCallbackInfo->FeConfigAccess.RouteConfig = FakeRouteConfig;\r
+ BmmCallbackInfo->FeConfigAccess.RouteConfig = FileExplorerRouteConfig;\r
BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback;\r
BmmCallbackInfo->FeCurrentState = FileExplorerStateInActive;\r
BmmCallbackInfo->FeDisplayContext = FileExplorerDisplayUnknown;\r
#define CON_ERR_COM2_VAR_OFFSET VAR_OFFSET (ConsoleErrorCOM2)\r
#define CON_MODE_VAR_OFFSET VAR_OFFSET (ConsoleOutMode)\r
#define CON_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleCheck)\r
+#define CON_IN_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleInCheck)\r
+#define CON_OUT_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleOutCheck)\r
+#define CON_ERR_DEVICE_VAR_OFFSET VAR_OFFSET (ConsoleErrCheck)\r
#define BOOT_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (BootOptionOrder)\r
#define DRIVER_OPTION_ORDER_VAR_OFFSET VAR_OFFSET (DriverOptionOrder)\r
#define BOOT_OPTION_DEL_VAR_OFFSET VAR_OFFSET (BootOptionDel)\r
#define COM_STOP_BITS_VAR_OFFSET VAR_OFFSET (COMStopBits)\r
#define COM_PARITY_VAR_OFFSET VAR_OFFSET (COMParity)\r
#define COM_TERMINAL_VAR_OFFSET VAR_OFFSET (COMTerminalType)\r
+#define COM_FLOWCONTROL_VAR_OFFSET VAR_OFFSET (COMFlowControl)\r
\r
#define BOOT_TIME_OUT_QUESTION_ID QUESTION_ID (BootTimeOut)\r
#define BOOT_NEXT_QUESTION_ID QUESTION_ID (BootNext)\r
#define CON_ERR_COM2_QUESTION_ID QUESTION_ID (ConsoleErrorCOM2)\r
#define CON_MODE_QUESTION_ID QUESTION_ID (ConsoleOutMode)\r
#define CON_DEVICE_QUESTION_ID QUESTION_ID (ConsoleCheck)\r
+#define CON_IN_DEVICE_QUESTION_ID QUESTION_ID (ConsoleInCheck)\r
+#define CON_OUT_DEVICE_QUESTION_ID QUESTION_ID (ConsoleOutCheck)\r
+#define CON_ERR_DEVICE_QUESTION_ID QUESTION_ID (ConsoleErrCheck)\r
#define BOOT_OPTION_ORDER_QUESTION_ID QUESTION_ID (BootOptionOrder)\r
#define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder)\r
#define BOOT_OPTION_DEL_QUESTION_ID QUESTION_ID (BootOptionDel)\r
#define COM_STOP_BITS_QUESTION_ID QUESTION_ID (COMStopBits)\r
#define COM_PARITY_QUESTION_ID QUESTION_ID (COMParity)\r
#define COM_TERMINAL_QUESTION_ID QUESTION_ID (COMTerminalType)\r
+#define COM_FLOWCONTROL_QUESTION_ID QUESTION_ID (COMFlowControl)\r
\r
#define STRING_DEPOSITORY_NUMBER 8\r
\r
UINT8 ParityIndex;\r
UINT8 StopBitsIndex;\r
\r
+ UINT8 FlowControl;\r
+\r
UINT8 IsConIn;\r
UINT8 IsConOut;\r
UINT8 IsStdErr;\r
VOID\r
);\r
\r
-/**\r
- Function handling request to apply changes for BMM pages.\r
-\r
- @param Private Pointer to callback data buffer.\r
- @param CurrentFakeNVMap Pointer to buffer holding data of various values used by BMM\r
- @param FormId ID of the form which has sent the request to apply change.\r
-\r
- @retval EFI_SUCCESS Change successfully applied.\r
- @retval Other Error occurs while trying to apply changes.\r
-\r
-**/\r
-EFI_STATUS\r
-ApplyChangeHandler (\r
- IN BMM_CALLBACK_DATA *Private,\r
- IN BMM_FAKE_NV_DATA *CurrentFakeNVMap,\r
- IN EFI_FORM_ID FormId\r
- );\r
-\r
/**\r
Discard all changes done to the BMM pages such as Boot Order change,\r
Driver order change.\r
IN UINT16 KeyValue\r
);\r
\r
+/**\r
+ This function applies changes in a driver's configuration.\r
+ Input is a Configuration, which has the routing data for this\r
+ driver followed by name / value configuration pairs. The driver\r
+ must apply those pairs to its configurable storage. If the\r
+ driver's configuration is stored in a linear block of data\r
+ and the driver's name / value pairs are in <BlockConfig>\r
+ format, it may use the ConfigToBlock helper function (above) to\r
+ simplify the job. Currently not implemented.\r
+\r
+ @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param[in] Configuration A null-terminated Unicode string in\r
+ <ConfigString> format. \r
+ @param[out] Progress A pointer to a string filled in with the\r
+ offset of the most recent '&' before the\r
+ first failing name / value pair (or the\r
+ beginn ing of the string if the failure\r
+ is in the first name / value pair) or\r
+ the terminating NULL if all was\r
+ successful.\r
+\r
+ @retval EFI_SUCCESS The results have been distributed or are\r
+ awaiting distribution. \r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to store the\r
+ parts of the results that must be\r
+ stored awaiting possible future\r
+ protocols.\r
+ @retval EFI_INVALID_PARAMETERS Passing in a NULL for the\r
+ Results parameter would result\r
+ in this type of error.\r
+ @retval EFI_NOT_FOUND Target for the specified routing data\r
+ was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FileExplorerRouteConfig (\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN CONST EFI_STRING Configuration,\r
+ OUT EFI_STRING *Progress\r
+ );\r
+\r
/**\r
This function processes the results of changes in configuration.\r
When user select a interactive opcode, this callback will be triggered.\r
VOID\r
);\r
\r
+/**\r
+\r
+ Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleInCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+\r
+ Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleOutCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+\r
+ Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleErrCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
+/**\r
+\r
+ Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
+ to BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetTerminalAttribute (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ );\r
+\r
//\r
// Global variable in this program (defined in data.c)\r
//\r
extern STRING_DEPOSITORY *DriverOptionHelpStrDepository;\r
extern STRING_DEPOSITORY *TerminalStrDepository;\r
extern EFI_DEVICE_PATH_PROTOCOL EndDevicePath[];\r
+extern UINT16 mFlowControlType[2];\r
+extern UINT32 mFlowControlValue[2];\r
\r
//\r
// Shared IFR form update data\r
}\r
}\r
}\r
+\r
+/**\r
+\r
+ Initialize console input device check box to ConsoleInCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleInCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_MENU_ENTRY *NewMenuEntry; \r
+ UINT8 *ConInCheck;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+\r
+ ASSERT (CallbackData != NULL);\r
+\r
+ ConInCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+ for (Index = 0; ((Index < ConsoleInpMenu.MenuNumber) && \\r
+ (Index < MAX_MENU_NUMBER)) ; Index++) { \r
+ NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
+ ConInCheck[Index] = NewConsoleContext->IsActive;\r
+ }\r
+}\r
+\r
+/**\r
+\r
+ Initialize console output device check box to ConsoleOutCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleOutCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_MENU_ENTRY *NewMenuEntry; \r
+ UINT8 *ConOutCheck;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+ \r
+ ASSERT (CallbackData != NULL);\r
+ ConOutCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+ for (Index = 0; ((Index < ConsoleOutMenu.MenuNumber) && \\r
+ (Index < MAX_MENU_NUMBER)) ; Index++) { \r
+ NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
+ ConOutCheck[Index] = NewConsoleContext->IsActive;\r
+ }\r
+}\r
+\r
+/**\r
+\r
+ Initialize standard error output device check box to ConsoleErrCheck[MAX_MENU_NUMBER]\r
+ in BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/ \r
+VOID \r
+GetConsoleErrCheck (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ UINT16 Index;\r
+ BM_MENU_ENTRY *NewMenuEntry; \r
+ UINT8 *ConErrCheck;\r
+ BM_CONSOLE_CONTEXT *NewConsoleContext;\r
+\r
+ ASSERT (CallbackData != NULL);\r
+ ConErrCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+ for (Index = 0; ((Index < ConsoleErrMenu.MenuNumber) && \\r
+ (Index < MAX_MENU_NUMBER)) ; Index++) { \r
+ NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);\r
+ NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext; \r
+ ConErrCheck[Index] = NewConsoleContext->IsActive;\r
+ }\r
+}\r
+\r
+/**\r
+\r
+ Initialize terminal attributes (baudrate, data rate, stop bits, parity and terminal type)\r
+ to BMM_FAKE_NV_DATA structure.\r
+\r
+ @param CallbackData The BMM context data.\r
+\r
+**/\r
+VOID \r
+GetTerminalAttribute (\r
+ IN BMM_CALLBACK_DATA *CallbackData\r
+ )\r
+{\r
+ BMM_FAKE_NV_DATA *CurrentFakeNVMap;\r
+ BM_MENU_ENTRY *NewMenuEntry;\r
+ BM_TERMINAL_CONTEXT *NewTerminalContext; \r
+ UINT16 TerminalIndex; \r
+ UINT8 AttributeIndex;\r
+\r
+ ASSERT (CallbackData != NULL);\r
+\r
+ CurrentFakeNVMap = &CallbackData->BmmFakeNvData; \r
+ for (TerminalIndex = 0; ((TerminalIndex < TerminalMenu.MenuNumber) && \\r
+ (TerminalIndex < MAX_MENU_NUMBER)); TerminalIndex++) { \r
+ NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, TerminalIndex);\r
+ NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
+ for (AttributeIndex = 0; AttributeIndex < sizeof (BaudRateList) / sizeof (BaudRateList [0]); AttributeIndex++) {\r
+ if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[AttributeIndex].Value)) {\r
+ NewTerminalContext->BaudRateIndex = AttributeIndex;\r
+ break;\r
+ }\r
+ }\r
+ for (AttributeIndex = 0; AttributeIndex < sizeof (DataBitsList) / sizeof (DataBitsList[0]); AttributeIndex++) {\r
+ if (NewTerminalContext->DataBits == (UINT64) (DataBitsList[AttributeIndex].Value)) {\r
+ NewTerminalContext->DataBitsIndex = AttributeIndex;\r
+ break;\r
+ }\r
+ } \r
+\r
+ for (AttributeIndex = 0; AttributeIndex < sizeof (ParityList) / sizeof (ParityList[0]); AttributeIndex++) {\r
+ if (NewTerminalContext->Parity == (UINT64) (ParityList[AttributeIndex].Value)) {\r
+ NewTerminalContext->ParityIndex = AttributeIndex;\r
+ break;\r
+ }\r
+ }\r
+\r
+ for (AttributeIndex = 0; AttributeIndex < sizeof (StopBitsList) / sizeof (StopBitsList[0]); AttributeIndex++) {\r
+ if (NewTerminalContext->StopBits == (UINT64) (StopBitsList[AttributeIndex].Value)) {\r
+ NewTerminalContext->StopBitsIndex = AttributeIndex;\r
+ break;\r
+ }\r
+ }\r
+ CurrentFakeNVMap->COMBaudRate[TerminalIndex] = NewTerminalContext->BaudRateIndex;\r
+ CurrentFakeNVMap->COMDataRate[TerminalIndex] = NewTerminalContext->DataBitsIndex;\r
+ CurrentFakeNVMap->COMStopBits[TerminalIndex] = NewTerminalContext->StopBitsIndex;\r
+ CurrentFakeNVMap->COMParity[TerminalIndex] = NewTerminalContext->ParityIndex; \r
+ CurrentFakeNVMap->COMTerminalType[TerminalIndex] = NewTerminalContext->TerminalType;\r
+ CurrentFakeNVMap->COMFlowControl[TerminalIndex] = NewTerminalContext->FlowControl;\r
+ }\r
+}\r
+\r
STRING_TOKEN(STR_COM_TYPE_4),\r
};\r
\r
+///\r
+/// Flow Control type string token storage\r
+///\r
+UINT16 mFlowControlType[2] = {\r
+ STRING_TOKEN(STR_NONE_FLOW_CONTROL),\r
+ STRING_TOKEN(STR_HARDWARE_FLOW_CONTROL)\r
+};\r
+\r
+UINT32 mFlowControlValue[2] = {\r
+ 0,\r
+ UART_FLOW_CONTROL_HARDWARE\r
+};\r
+\r
///\r
/// File system selection menu\r
///\r
\r
subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
\r
- string varid = FeData.DescriptionData,\r
+ string varid = FeData.BootDescriptionData,\r
+ questionid = KEY_VALUE_BOOT_DESCRIPTION,\r
prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
help = STRING_TOKEN(STR_NULL_STRING),\r
+ flags = INTERACTIVE,\r
minsize = 6,\r
maxsize = 75,\r
endstring;\r
\r
- string varid = FeData.OptionalData,\r
- prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
- help = STRING_TOKEN(STR_NULL_STRING),\r
- minsize = 0,\r
- maxsize = 120,\r
+ string varid = FeData.BootOptionalData,\r
+ questionid = KEY_VALUE_BOOT_OPTION,\r
+ prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
+ help = STRING_TOKEN(STR_NULL_STRING),\r
+ flags = INTERACTIVE,\r
+ minsize = 0,\r
+ maxsize = 120,\r
endstring;\r
\r
subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
\r
subtitle text = STRING_TOKEN(STR_NULL_STRING);\r
\r
- string varid = FeData.DescriptionData,\r
+ string varid = FeData.DriverDescriptionData,\r
+ questionid = KEY_VALUE_DRIVER_DESCRIPTION,\r
prompt = STRING_TOKEN(STR_LOAD_OPTION_DESC),\r
help = STRING_TOKEN(STR_NULL_STRING),\r
+ flags = INTERACTIVE,\r
minsize = 6,\r
maxsize = 75,\r
endstring;\r
\r
- string varid = FeData.OptionalData,\r
+ string varid = FeData.DriverOptionalData,\r
+ questionid = KEY_VALUE_DRIVER_OPTION,\r
prompt = STRING_TOKEN(STR_OPTIONAL_DATA),\r
help = STRING_TOKEN(STR_NULL_STRING),\r
+ flags = INTERACTIVE,\r
minsize = 0,\r
maxsize = 120,\r
endstring;\r
case FileExplorerStateAddDriverOptionState:\r
if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) {\r
FormId = FORM_BOOT_ADD_DESCRIPTION_ID;\r
+ if (!CallbackData->FeFakeNvData.BootOptionChanged) {\r
+ ZeroMem (CallbackData->FeFakeNvData.BootDescriptionData, sizeof (CallbackData->FeFakeNvData.BootDescriptionData));\r
+ ZeroMem (CallbackData->FeFakeNvData.BootOptionalData, sizeof (CallbackData->FeFakeNvData.BootOptionalData));\r
+ }\r
} else {\r
FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID;\r
+ if (!CallbackData->FeFakeNvData.DriverOptionChanged) {\r
+ ZeroMem (CallbackData->FeFakeNvData.DriverDescriptionData, sizeof (CallbackData->FeFakeNvData.DriverDescriptionData));\r
+ ZeroMem (CallbackData->FeFakeNvData.DriverOptionalData, sizeof (CallbackData->FeFakeNvData.DriverOptionalData));\r
+ }\r
}\r
\r
CallbackData->MenuEntry = NewMenuEntry;\r
return ExitFileExplorer;\r
}\r
\r
+/**\r
+ This function applies changes in a driver's configuration.\r
+ Input is a Configuration, which has the routing data for this\r
+ driver followed by name / value configuration pairs. The driver\r
+ must apply those pairs to its configurable storage. If the\r
+ driver's configuration is stored in a linear block of data\r
+ and the driver's name / value pairs are in <BlockConfig>\r
+ format, it may use the ConfigToBlock helper function (above) to\r
+ simplify the job. Currently not implemented.\r
+\r
+ @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+ @param[in] Configuration A null-terminated Unicode string in\r
+ <ConfigString> format. \r
+ @param[out] Progress A pointer to a string filled in with the\r
+ offset of the most recent '&' before the\r
+ first failing name / value pair (or the\r
+ beginn ing of the string if the failure\r
+ is in the first name / value pair) or\r
+ the terminating NULL if all was\r
+ successful.\r
+\r
+ @retval EFI_SUCCESS The results have been distributed or are\r
+ awaiting distribution. \r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to store the\r
+ parts of the results that must be\r
+ stored awaiting possible future\r
+ protocols.\r
+ @retval EFI_INVALID_PARAMETERS Passing in a NULL for the\r
+ Results parameter would result\r
+ in this type of error.\r
+ @retval EFI_NOT_FOUND Target for the specified routing data\r
+ was not found.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FileExplorerRouteConfig (\r
+ IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
+ IN CONST EFI_STRING Configuration,\r
+ OUT EFI_STRING *Progress\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN BufferSize;\r
+ EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;\r
+ FILE_EXPLORER_NV_DATA *FeData;\r
+ BMM_CALLBACK_DATA *Private;\r
+\r
+ if (Progress == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ *Progress = Configuration;\r
+\r
+ if (Configuration == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Check routing data in <ConfigHdr>.\r
+ // Note: there is no name for Name/Value storage, only GUID will be checked\r
+ //\r
+ if (!HiiIsConfigHdrMatch (Configuration, &mFileExplorerGuid, mFileExplorerStorageName)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiHiiConfigRoutingProtocolGuid, \r
+ NULL, \r
+ (VOID**) &ConfigRouting\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Private = FE_CALLBACK_DATA_FROM_THIS (This);\r
+ //\r
+ // Get Buffer Storage data from EFI variable\r
+ //\r
+ BufferSize = sizeof (FILE_EXPLORER_NV_DATA );\r
+ FeData = &Private->FeFakeNvData;\r
+\r
+ //\r
+ // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()\r
+ //\r
+ Status = ConfigRouting->ConfigToBlock (\r
+ ConfigRouting,\r
+ Configuration,\r
+ (UINT8 *) FeData,\r
+ &BufferSize,\r
+ Progress\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ if (FeData->BootDescriptionData[0] != 0x00 || FeData->BootOptionalData[0] != 0x00) {\r
+ Status = Var_UpdateBootOption (Private, FeData);\r
+ Private->FeFakeNvData.BootOptionChanged = FALSE;\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ BOpt_GetBootOptions (Private);\r
+ CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
+ }\r
+\r
+ if (FeData->DriverDescriptionData[0] != 0x00 || FeData->DriverOptionalData[0] != 0x00) {\r
+ Status = Var_UpdateDriverOption (\r
+ Private,\r
+ Private->FeHiiHandle,\r
+ FeData->DriverDescriptionData,\r
+ FeData->DriverOptionalData,\r
+ FeData->ForceReconnect\r
+ );\r
+ Private->FeFakeNvData.DriverOptionChanged = FALSE;\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ BOpt_GetDriverOptions (Private);\r
+ CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
This function processes the results of changes in configuration.\r
When user select a interactive opcode, this callback will be triggered.\r
if ((Value == NULL) || (ActionRequest == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
- if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER) {\r
- //\r
- // Apply changes and exit formset\r
- //\r
- if (FileExplorerStateAddBootOption == Private->FeCurrentState) {\r
- Status = Var_UpdateBootOption (Private, NvRamMap);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_GetBootOptions (Private);\r
- CreateMenuStringToken (Private, Private->FeHiiHandle, &BootOptionMenu);\r
- } else if (FileExplorerStateAddDriverOptionState == Private->FeCurrentState) {\r
- Status = Var_UpdateDriverOption (\r
- Private,\r
- Private->FeHiiHandle,\r
- NvRamMap->DescriptionData,\r
- NvRamMap->OptionalData,\r
- NvRamMap->ForceReconnect\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- BOpt_GetDriverOptions (Private);\r
- CreateMenuStringToken (Private, Private->FeHiiHandle, &DriverOptionMenu);\r
- }\r
\r
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
- } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT || QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER) {\r
+ if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_BOOT){\r
+ NvRamMap->BootOptionChanged = FALSE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+ } else if (QuestionId == KEY_VALUE_SAVE_AND_EXIT_DRIVER){\r
+ NvRamMap->DriverOptionChanged = FALSE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+ } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_BOOT) {\r
//\r
// Discard changes and exit formset\r
//\r
- NvRamMap->OptionalData[0] = 0x0000;\r
- NvRamMap->DescriptionData[0] = 0x0000;\r
+ NvRamMap->BootOptionalData[0] = 0x0000;\r
+ NvRamMap->BootDescriptionData[0] = 0x0000;\r
+ NvRamMap->BootOptionChanged = FALSE;\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+ } else if ( QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT_DRIVER){\r
+ NvRamMap->BootOptionalData[0] = 0x0000;\r
+ NvRamMap->BootDescriptionData[0] = 0x0000;\r
+ NvRamMap->DriverOptionChanged = FALSE;\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+ } else if (QuestionId == KEY_VALUE_BOOT_DESCRIPTION || QuestionId == KEY_VALUE_BOOT_OPTION){\r
+ NvRamMap->BootOptionChanged = TRUE;\r
+ } else if (QuestionId == KEY_VALUE_DRIVER_DESCRIPTION || QuestionId == KEY_VALUE_DRIVER_OPTION){\r
+ NvRamMap->DriverOptionChanged = TRUE;\r
} else if (QuestionId < FILE_OPTION_OFFSET) {\r
//\r
// Exit File Explorer formset\r
}\r
}\r
\r
+ //\r
+ // Pass changed uncommitted data back to Form Browser\r
+ //\r
+ HiiSetBrowserData (&mFileExplorerGuid, mFileExplorerStorageName, sizeof (FILE_EXPLORER_NV_DATA), (UINT8 *) NvRamMap, NULL);\r
+\r
return Status;\r
}\r
#define KEY_VALUE_NO_SAVE_AND_EXIT 0x110C\r
#define KEY_VALUE_BOOT_FROM_FILE 0x110D\r
#define FORM_RESET 0x110E\r
+#define KEY_VALUE_BOOT_DESCRIPTION 0x110F\r
+#define KEY_VALUE_BOOT_OPTION 0x1110\r
+#define KEY_VALUE_DRIVER_DESCRIPTION 0x1111\r
+#define KEY_VALUE_DRIVER_OPTION 0x1112\r
\r
#define MAXIMUM_NORMAL_KEY_VALUE 0x11FF\r
\r
// At most 100 input/output/errorout device for console storage\r
//\r
UINT8 ConsoleCheck[MAX_MENU_NUMBER];\r
+ \r
+ //\r
+ // At most 100 input/output/errorout device for console storage\r
+ //\r
+ UINT8 ConsoleInCheck[MAX_MENU_NUMBER];\r
+ UINT8 ConsoleOutCheck[MAX_MENU_NUMBER];\r
+ UINT8 ConsoleErrCheck[MAX_MENU_NUMBER];\r
\r
//\r
// Boot or Driver Option Order storage\r
//\r
BOOLEAN BootOptionDel[MAX_MENU_NUMBER];\r
BOOLEAN DriverOptionDel[MAX_MENU_NUMBER];\r
+ BOOLEAN BootOptionDelMark[MAX_MENU_NUMBER];\r
+ BOOLEAN DriverOptionDelMark[MAX_MENU_NUMBER];\r
\r
//\r
// This is the Terminal Attributes value storage\r
//\r
- UINT8 COMBaudRate;\r
- UINT8 COMDataRate;\r
- UINT8 COMStopBits;\r
- UINT8 COMParity;\r
- UINT8 COMTerminalType;\r
+ UINT8 COMBaudRate[MAX_MENU_NUMBER];\r
+ UINT8 COMDataRate[MAX_MENU_NUMBER];\r
+ UINT8 COMStopBits[MAX_MENU_NUMBER];\r
+ UINT8 COMParity[MAX_MENU_NUMBER];\r
+ UINT8 COMTerminalType[MAX_MENU_NUMBER];\r
+ UINT8 COMFlowControl[MAX_MENU_NUMBER];\r
\r
//\r
// We use DisableMap array to record the enable/disable state of each boot device\r
/// This is the data structure used by File Explorer formset\r
///\r
typedef struct {\r
- UINT16 DescriptionData[MAX_MENU_NUMBER];\r
- UINT16 OptionalData[127];\r
+ UINT16 BootDescriptionData[MAX_MENU_NUMBER];\r
+ UINT16 BootOptionalData[127];\r
+ UINT16 DriverDescriptionData[MAX_MENU_NUMBER];\r
+ UINT16 DriverOptionalData[127];\r
+ BOOLEAN BootOptionChanged;\r
+ BOOLEAN DriverOptionChanged;\r
UINT8 Active;\r
UINT8 ForceReconnect;\r
} FILE_EXPLORER_NV_DATA;\r
BM_MENU_ENTRY *NewMenuEntry;\r
UINT16 Index;\r
\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
+\r
UpdatePageStart (CallbackData);\r
\r
for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
BM_LOAD_CONTEXT *NewLoadContext;\r
UINT16 Index;\r
\r
- //CallbackData->BmmAskSaveOrNot = TRUE;\r
+ CallbackData->BmmAskSaveOrNot = TRUE;\r
\r
UpdatePageStart (CallbackData);\r
CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);\r
continue;\r
}\r
\r
+ NewLoadContext->Deleted = FALSE;\r
+\r
+ if (CallbackData->BmmFakeNvData.BootOptionDel[Index] && !CallbackData->BmmFakeNvData.BootOptionDelMark[Index]) {\r
+ //\r
+ // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+ // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+ // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+ // through HiiSetBrowserData function.\r
+ //\r
+ CallbackData->BmmFakeNvData.BootOptionDel[Index] = FALSE;\r
+ }\r
+\r
//\r
// Check to see if the current boot option devicepath is the ShellDevice \r
// path. If it is keep only UEFI Shell in the delete boot option list \r
(UINT16) (BOOT_OPTION_DEL_VAR_OFFSET + Index),\r
NewMenuEntry->DisplayStringToken,\r
NewMenuEntry->HelpStringToken,\r
- 0,\r
+ EFI_IFR_FLAG_CALLBACK,\r
0,\r
NULL\r
);\r
\r
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
NewLoadContext->Deleted = FALSE;\r
- CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
\r
+ if (CallbackData->BmmFakeNvData.DriverOptionDel[Index] && !CallbackData->BmmFakeNvData.DriverOptionDelMark[Index]) {\r
+ //\r
+ // CallbackData->BmmFakeNvData.BootOptionDel[Index] == TRUE means browser knows this boot option is selected\r
+ // CallbackData->BmmFakeNvData.BootOptionDelMark[Index] = FALSE means BDS knows the selected boot option has\r
+ // deleted, browser maintains old useless info. So clear this info here, and later update this info to browser\r
+ // through HiiSetBrowserData function.\r
+ //\r
+ CallbackData->BmmFakeNvData.DriverOptionDel[Index] = FALSE;\r
+ }\r
HiiCreateCheckBoxOpCode (\r
mStartOpCodeHandle,\r
(EFI_QUESTION_ID) (DRIVER_OPTION_DEL_QUESTION_ID + Index),\r
(UINT16) (DRIVER_OPTION_DEL_VAR_OFFSET + Index),\r
NewMenuEntry->DisplayStringToken,\r
NewMenuEntry->HelpStringToken,\r
- 0,\r
+ EFI_IFR_FLAG_CALLBACK,\r
0,\r
NULL\r
);\r
UINT16 Index;\r
UINT16 Index2;\r
UINT8 CheckFlags;\r
- \r
+ UINT8 *ConsoleCheck;\r
+ UINT8 *OldConsoleCheck;\r
+ UINTN ConsoleCheckSize;\r
+ EFI_QUESTION_ID QuestionIdBase;\r
+ UINT16 VariableOffsetBase;\r
+\r
CallbackData->BmmAskSaveOrNot = TRUE;\r
\r
UpdatePageStart (CallbackData);\r
\r
+ ConsoleCheck = NULL;\r
+ QuestionIdBase = 0;\r
+ VariableOffsetBase = 0;\r
+\r
+ switch (UpdatePageId) {\r
+ case FORM_CON_IN_ID:\r
+ ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleInCheck[0];\r
+ OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleInCheck[0];\r
+ ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleInCheck);\r
+ QuestionIdBase = CON_IN_DEVICE_QUESTION_ID;\r
+ VariableOffsetBase = CON_IN_DEVICE_VAR_OFFSET;\r
+ break;\r
+\r
+ case FORM_CON_OUT_ID:\r
+ ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleOutCheck[0];\r
+ OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleOutCheck[0];\r
+ ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleOutCheck);\r
+ QuestionIdBase = CON_OUT_DEVICE_QUESTION_ID;\r
+ VariableOffsetBase = CON_OUT_DEVICE_VAR_OFFSET;\r
+ break;\r
+\r
+ case FORM_CON_ERR_ID:\r
+ ConsoleCheck = &CallbackData->BmmFakeNvData.ConsoleErrCheck[0];\r
+ OldConsoleCheck = &CallbackData->BmmOldFakeNVData.ConsoleErrCheck[0];\r
+ ConsoleCheckSize = sizeof (CallbackData->BmmFakeNvData.ConsoleErrCheck);\r
+ QuestionIdBase = CON_ERR_DEVICE_QUESTION_ID;\r
+ VariableOffsetBase = CON_ERR_DEVICE_VAR_OFFSET;\r
+ break;\r
+ }\r
+ ASSERT (ConsoleCheck != NULL);\r
+\r
for (Index = 0; ((Index < ConsoleMenu->MenuNumber) && \\r
- (Index < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))) ; Index++) {\r
- NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
+ (Index < MAX_MENU_NUMBER)) ; Index++) {\r
+ CheckFlags = 0;\r
+ NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
- CheckFlags = 0;\r
if (NewConsoleContext->IsActive) {\r
CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
- CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
+ ConsoleCheck[Index] = TRUE;\r
} else {\r
- CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
+ ConsoleCheck[Index] = FALSE;\r
}\r
-\r
HiiCreateCheckBoxOpCode (\r
mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
+ (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
+ (UINT16) (VariableOffsetBase + Index),\r
NewMenuEntry->DisplayStringToken,\r
NewMenuEntry->HelpStringToken,\r
0,\r
}\r
\r
for (Index2 = 0; ((Index2 < TerminalMenu.MenuNumber) && \\r
- (Index2 < (sizeof (CallbackData->BmmFakeNvData.ConsoleCheck) / sizeof (UINT8)))); Index2++) {\r
+ (Index2 < MAX_MENU_NUMBER)); Index2++) {\r
CheckFlags = 0;\r
NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);\r
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
((NewTerminalContext->IsStdErr != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
) {\r
CheckFlags |= EFI_IFR_CHECKBOX_DEFAULT;\r
- CallbackData->BmmFakeNvData.ConsoleCheck[Index] = TRUE;\r
+ ConsoleCheck[Index] = TRUE;\r
} else {\r
- CallbackData->BmmFakeNvData.ConsoleCheck[Index] = FALSE;\r
+ ConsoleCheck[Index] = FALSE;\r
}\r
-\r
HiiCreateCheckBoxOpCode (\r
mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) (CON_DEVICE_QUESTION_ID + Index),\r
+ (EFI_QUESTION_ID) (QuestionIdBase + Index),\r
VARSTORE_ID_BOOT_MAINT,\r
- (UINT16) (CON_DEVICE_VAR_OFFSET + Index),\r
+ (UINT16) (VariableOffsetBase + Index),\r
NewMenuEntry->DisplayStringToken,\r
NewMenuEntry->HelpStringToken,\r
0,\r
Index++;\r
}\r
\r
+ CopyMem (OldConsoleCheck, ConsoleCheck, ConsoleCheckSize);\r
+\r
UpdatePageEnd (CallbackData);\r
}\r
\r
UpdatePageEnd (CallbackData);\r
}\r
\r
-/**\r
+ /**\r
Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
Parity, Stop Bits, Terminal Type.\r
\r
UINT8 Index;\r
UINT8 CheckFlags;\r
BM_MENU_ENTRY *NewMenuEntry;\r
- BM_TERMINAL_CONTEXT *NewTerminalContext;\r
VOID *OptionsOpCodeHandle;\r
+ UINTN CurrentTerminal;\r
\r
CallbackData->BmmAskSaveOrNot = TRUE;\r
\r
UpdatePageStart (CallbackData);\r
\r
+ CurrentTerminal = CallbackData->CurrentTerminal;\r
NewMenuEntry = BOpt_GetMenuEntry (\r
&TerminalMenu,\r
- CallbackData->CurrentTerminal\r
+ CurrentTerminal\r
);\r
\r
if (NewMenuEntry == NULL) {\r
return ;\r
}\r
\r
- NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-\r
OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
ASSERT (OptionsOpCodeHandle != NULL);\r
\r
for (Index = 0; Index < sizeof (BaudRateList) / sizeof (BaudRateList [0]); Index++) {\r
CheckFlags = 0;\r
- if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {\r
+ if (BaudRateList[Index].Value == 115200) {\r
CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- NewTerminalContext->BaudRateIndex = Index;\r
- CallbackData->BmmFakeNvData.COMBaudRate = NewTerminalContext->BaudRateIndex;\r
}\r
-\r
HiiCreateOneOfOptionOpCode (\r
OptionsOpCodeHandle,\r
BaudRateList[Index].StringToken,\r
\r
HiiCreateOneOfOpCode (\r
mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) COM_BAUD_RATE_QUESTION_ID,\r
+ (EFI_QUESTION_ID) (COM_BAUD_RATE_QUESTION_ID + CurrentTerminal),\r
VARSTORE_ID_BOOT_MAINT,\r
- COM_BAUD_RATE_VAR_OFFSET,\r
+ (UINT16) (COM_BAUD_RATE_VAR_OFFSET + CurrentTerminal),\r
STRING_TOKEN (STR_COM_BAUD_RATE),\r
STRING_TOKEN (STR_COM_BAUD_RATE),\r
0,\r
for (Index = 0; Index < sizeof (DataBitsList) / sizeof (DataBitsList[0]); Index++) {\r
CheckFlags = 0;\r
\r
- if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {\r
- NewTerminalContext->DataBitsIndex = Index;\r
- CallbackData->BmmFakeNvData.COMDataRate = NewTerminalContext->DataBitsIndex;\r
+ if (DataBitsList[Index].Value == 8) {\r
CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
}\r
\r
\r
HiiCreateOneOfOpCode (\r
mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) COM_DATA_RATE_QUESTION_ID,\r
+ (EFI_QUESTION_ID) (COM_DATA_RATE_QUESTION_ID + CurrentTerminal),\r
VARSTORE_ID_BOOT_MAINT,\r
- COM_DATA_RATE_VAR_OFFSET,\r
+ (UINT16) (COM_DATA_RATE_VAR_OFFSET + CurrentTerminal),\r
STRING_TOKEN (STR_COM_DATA_BITS),\r
STRING_TOKEN (STR_COM_DATA_BITS),\r
0,\r
\r
for (Index = 0; Index < sizeof (ParityList) / sizeof (ParityList[0]); Index++) {\r
CheckFlags = 0;\r
- if (NewTerminalContext->Parity == ParityList[Index].Value) {\r
+ if (ParityList[Index].Value == NoParity) {\r
CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- NewTerminalContext->ParityIndex = (UINT8) Index;\r
- CallbackData->BmmFakeNvData.COMParity = NewTerminalContext->ParityIndex;\r
}\r
\r
HiiCreateOneOfOptionOpCode (\r
\r
HiiCreateOneOfOpCode (\r
mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) COM_PARITY_QUESTION_ID,\r
+ (EFI_QUESTION_ID) (COM_PARITY_QUESTION_ID + CurrentTerminal),\r
VARSTORE_ID_BOOT_MAINT,\r
- COM_PARITY_VAR_OFFSET,\r
+ (UINT16) (COM_PARITY_VAR_OFFSET + CurrentTerminal),\r
STRING_TOKEN (STR_COM_PARITY),\r
STRING_TOKEN (STR_COM_PARITY),\r
0,\r
\r
for (Index = 0; Index < sizeof (StopBitsList) / sizeof (StopBitsList[0]); Index++) {\r
CheckFlags = 0;\r
- if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {\r
+ if (StopBitsList[Index].Value == OneStopBit) {\r
CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- NewTerminalContext->StopBitsIndex = (UINT8) Index;\r
- CallbackData->BmmFakeNvData.COMStopBits = NewTerminalContext->StopBitsIndex;\r
}\r
\r
HiiCreateOneOfOptionOpCode (\r
\r
HiiCreateOneOfOpCode (\r
mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) COM_STOP_BITS_QUESTION_ID,\r
+ (EFI_QUESTION_ID) (COM_STOP_BITS_QUESTION_ID + CurrentTerminal),\r
VARSTORE_ID_BOOT_MAINT,\r
- COM_STOP_BITS_VAR_OFFSET,\r
+ (UINT16) (COM_STOP_BITS_VAR_OFFSET + CurrentTerminal),\r
STRING_TOKEN (STR_COM_STOP_BITS),\r
STRING_TOKEN (STR_COM_STOP_BITS),\r
0,\r
\r
for (Index = 0; Index < sizeof (TerminalType) / sizeof (TerminalType[0]); Index++) {\r
CheckFlags = 0;\r
- if (NewTerminalContext->TerminalType == Index) {\r
+ if (Index == 0) {\r
CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
- CallbackData->BmmFakeNvData.COMTerminalType = NewTerminalContext->TerminalType;\r
}\r
\r
HiiCreateOneOfOptionOpCode (\r
\r
HiiCreateOneOfOpCode (\r
mStartOpCodeHandle,\r
- (EFI_QUESTION_ID) COM_TERMINAL_QUESTION_ID,\r
+ (EFI_QUESTION_ID) (COM_TERMINAL_QUESTION_ID + CurrentTerminal),\r
VARSTORE_ID_BOOT_MAINT,\r
- COM_TERMINAL_VAR_OFFSET,\r
+ (UINT16) (COM_TERMINAL_VAR_OFFSET + CurrentTerminal),\r
STRING_TOKEN (STR_COM_TERMI_TYPE),\r
STRING_TOKEN (STR_COM_TERMI_TYPE),\r
0,\r
NULL\r
);\r
\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
+ CheckFlags = 0;\r
+ if (Index == 0) {\r
+ CheckFlags |= EFI_IFR_OPTION_DEFAULT;\r
+ }\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ (EFI_STRING_ID) mFlowControlType[Index],\r
+ CheckFlags,\r
+ EFI_IFR_TYPE_NUM_SIZE_8,\r
+ mFlowControlValue[Index]\r
+ );\r
+ }\r
+\r
+ HiiCreateOneOfOpCode (\r
+ mStartOpCodeHandle,\r
+ (EFI_QUESTION_ID) (COM_FLOWCONTROL_QUESTION_ID + CurrentTerminal),\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ (UINT16) (COM_FLOWCONTROL_VAR_OFFSET + CurrentTerminal),\r
+ STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
+ STRING_TOKEN (STR_COM_FLOW_CONTROL),\r
+ 0,\r
+ EFI_IFR_NUMERIC_SIZE_1,\r
+ OptionsOpCodeHandle,\r
+ NULL\r
+ );\r
+\r
HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
\r
UpdatePageEnd (CallbackData);\r
Index = BOpt_GetBootOptionNumber () ;\r
UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
\r
- if (NvRamMap->DescriptionData[0] == 0x0000) {\r
- StrCpyS (NvRamMap->DescriptionData, sizeof (NvRamMap->DescriptionData) / sizeof (NvRamMap->DescriptionData[0]), BootString);\r
+ if (NvRamMap->BootDescriptionData[0] == 0x0000) {\r
+ StrCpyS (NvRamMap->BootDescriptionData, sizeof (NvRamMap->BootDescriptionData) / sizeof (NvRamMap->BootDescriptionData[0]), BootString);\r
}\r
\r
- BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->DescriptionData);\r
+ BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->BootDescriptionData);\r
BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
\r
- if (NvRamMap->OptionalData[0] != 0x0000) {\r
+ if (NvRamMap->BootOptionalData[0] != 0x0000) {\r
OptionalDataExist = TRUE;\r
- BufferSize += StrSize (NvRamMap->OptionalData);\r
+ BufferSize += StrSize (NvRamMap->BootOptionalData);\r
}\r
\r
Buffer = AllocateZeroPool (BufferSize);\r
\r
CopyMem (\r
Ptr,\r
- NvRamMap->DescriptionData,\r
- StrSize (NvRamMap->DescriptionData)\r
+ NvRamMap->BootDescriptionData,\r
+ StrSize (NvRamMap->BootDescriptionData)\r
);\r
\r
- NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->DescriptionData));\r
+ NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->BootDescriptionData));\r
ASSERT (NewLoadContext->Description != NULL);\r
\r
NewMenuEntry->DisplayString = NewLoadContext->Description;\r
CopyMem (\r
NewLoadContext->Description,\r
(VOID *) Ptr,\r
- StrSize (NvRamMap->DescriptionData)\r
+ StrSize (NvRamMap->BootDescriptionData)\r
);\r
\r
- Ptr += StrSize (NvRamMap->DescriptionData);\r
+ Ptr += StrSize (NvRamMap->BootDescriptionData);\r
CopyMem (\r
Ptr,\r
CallbackData->LoadContext->FilePathList,\r
if (OptionalDataExist) {\r
Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
\r
- CopyMem (Ptr, NvRamMap->OptionalData, StrSize (NvRamMap->OptionalData));\r
+ CopyMem (Ptr, NvRamMap->BootOptionalData, StrSize (NvRamMap->BootOptionalData));\r
}\r
\r
Status = gRT->SetVariable (\r
InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
BootOptionMenu.MenuNumber++;\r
\r
- NvRamMap->DescriptionData[0] = 0x0000;\r
- NvRamMap->OptionalData[0] = 0x0000;\r
+ NvRamMap->BootDescriptionData[0] = 0x0000;\r
+ NvRamMap->BootOptionalData[0] = 0x0000;\r
return EFI_SUCCESS;\r
}\r
\r