#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
#define LEGACY_FD_VAR_OFFSET VAR_OFFSET (LegacyFD)\r
#define LEGACY_HD_VAR_OFFSET VAR_OFFSET (LegacyHD)\r
#define LEGACY_CD_VAR_OFFSET VAR_OFFSET (LegacyCD)\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
#define LEGACY_FD_QUESTION_ID QUESTION_ID (LegacyFD)\r
#define LEGACY_HD_QUESTION_ID QUESTION_ID (LegacyHD)\r
#define LEGACY_CD_QUESTION_ID QUESTION_ID (LegacyCD)\r
UINT8 ParityIndex;\r
UINT8 StopBitsIndex;\r
\r
+ UINT8 FlowControl;\r
+\r
UINT8 IsConIn;\r
UINT8 IsConOut;\r
UINT8 IsStdErr;\r
**/\r
EFI_STATUS\r
ChangeTerminalDevicePath (\r
- IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,\r
IN BOOLEAN ChangeTerminal\r
);\r
\r
extern STRING_DEPOSITORY *TerminalStrDepository;\r
extern EFI_DEVICE_PATH_PROTOCOL EndDevicePath[];\r
extern EFI_GUID EfiLegacyDevOrderGuid;\r
-\r
+extern UINT16 mFlowControlType[2];\r
+extern UINT32 mFlowControlValue[2];\r
//\r
// Shared IFR form update data\r
//\r
\r
#include "BootMaint.h"\r
\r
+UART_FLOW_CONTROL_DEVICE_PATH mFlowControlDevicePath =\r\r
+{ \r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ (UINT8)(sizeof(UART_FLOW_CONTROL_DEVICE_PATH)),\r
+ (UINT8)((sizeof(UART_FLOW_CONTROL_DEVICE_PATH)) >> 8),\r
+ DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL,\r
+ UART_FLOW_CONTROL_HARDWARE\r
+};\r
+\r
+/**\r
+ Check the device path node whether it's the Flow Control node or not.\r
+\r
+ @param[in] FlowControl The device path node to be checked.\r
+ \r
+ @retval TRUE It's the Flow Control node.\r
+ @retval FALSE It's not.\r
+\r
+**/\r
+BOOLEAN\r
+IsUartFlowControlNode (\r
+ IN UART_FLOW_CONTROL_DEVICE_PATH *FlowControl\r
+ )\r
+{\r
+ return (BOOLEAN) (\r
+ (DevicePathType (FlowControl) == MESSAGING_DEVICE_PATH) &&\r
+ (DevicePathSubType (FlowControl) == MSG_VENDOR_DP) &&\r
+ (CompareGuid (&FlowControl->Guid, &gEfiUartDevicePathGuid))\r
+ );\r
+}\r
+\r
/**\r
Check whether the device path node is ISA Serial Node.\r
\r
**/\r
EFI_STATUS\r
ChangeTerminalDevicePath (\r
- IN OUT EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,\r
IN BOOLEAN ChangeTerminal\r
)\r
{\r
UINTN Com;\r
BM_TERMINAL_CONTEXT *NewTerminalContext;\r
BM_MENU_ENTRY *NewMenuEntry;\r
+ UART_FLOW_CONTROL_DEVICE_PATH *FlowControlNode;\r
\r
- Node = DevicePath;\r
+ Node = *DevicePath;\r
Node = NextDevicePathNode (Node);\r
Com = 0;\r
while (!IsDevicePathEnd (Node)) {\r
&NewTerminalContext->StopBits,\r
sizeof (UINT8)\r
);\r
+\r
+ FlowControlNode = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Node);\r
+ if (IsUartFlowControlNode (FlowControlNode)) {\r
+ FlowControlNode->FlowControlMap = NewTerminalContext->FlowControl;\r
+ } else {\r
+ //\r
+ // Append the Flow control device node when user enable flow control.\r
+ //\r
+ if (NewTerminalContext->FlowControl != 0) {\r
+ mFlowControlDevicePath.FlowControlMap = NewTerminalContext->FlowControl;\r
+ *DevicePath = AppendDevicePathNode (\r
+ *DevicePath,\r
+ (EFI_DEVICE_PATH_PROTOCOL *) (&mFlowControlDevicePath)\r
+ );\r
+ }\r
+ }\r
+\r
//\r
// Change the device path in the ComPort\r
//\r
BM_TERMINAL_CONTEXT *NewTerminalContext;\r
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
VENDOR_DEVICE_PATH Vendor;\r
+ UINT32 FlowControl;\r
//\r
// Get all handles that have SerialIo protocol installed\r
//\r
&SerialIo->Mode->StopBits,\r
sizeof (UINT8)\r
);\r
+\r
+ NewTerminalContext->FlowControl = 0;\r
+ SerialIo->GetControl(SerialIo, &FlowControl);\r
+ if ((FlowControl & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) != 0) {\r
+ NewTerminalContext->FlowControl = UART_FLOW_CONTROL_HARDWARE;\r
+ }\r
+\r
InsertTailList (&TerminalMenu.Head, &NewMenuEntry->Link);\r
TerminalMenu.MenuNumber++;\r
}\r
BM_MENU_ENTRY *NewMenuEntry;\r
BM_TERMINAL_CONTEXT *NewTerminalContext;\r
UINTN Index;\r
+ UART_FLOW_CONTROL_DEVICE_PATH *FlowControlNode;\r
+ BOOLEAN HasFlowControlNode;\r
\r
+ HasFlowControlNode = FALSE;\r
Node = DevicePath;\r
Node = NextDevicePathNode (Node);\r
TerminalNumber = 0;\r
sizeof (UINT8)\r
);\r
\r
+ FlowControlNode = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (Node);\r
+ if (IsUartFlowControlNode (FlowControlNode)) {\r
+ HasFlowControlNode = TRUE;\r
+ NewTerminalContext->FlowControl = (UINT8) ReadUnaligned32 (&FlowControlNode->FlowControlMap);\r
+ } else if (NewTerminalContext->FlowControl != 0) {\r
+ //\r
+ // No Flow Control device path node, assumption no Flow control\r
+ //\r
+ NewTerminalContext->FlowControl = 0;\r
+ }\r
+\r
SerialNode = NewTerminalContext->DevicePath;\r
SerialNode = NextDevicePathNode (SerialNode);\r
while (!IsDevicePathEnd (SerialNode)) {\r
sizeof (UINT8)\r
);\r
\r
+ FlowControlNode = (UART_FLOW_CONTROL_DEVICE_PATH *) NextDevicePathNode (SerialNode);\r
+ if (IsUartFlowControlNode (FlowControlNode)) {\r
+ FlowControlNode->FlowControlMap = NewTerminalContext->FlowControl;\r
+ } else {\r
+ if (HasFlowControlNode) {\r
+ mFlowControlDevicePath.FlowControlMap = NewTerminalContext->FlowControl;\r
+ NewTerminalContext->DevicePath = AppendDevicePathNode (\r
+ NewTerminalContext->DevicePath,\r
+ (EFI_DEVICE_PATH_PROTOCOL *) (&mFlowControlDevicePath)\r
+ );\r
+ }\r
+ }\r
break;\r
}\r
\r
NULL\r
);\r
\r
+ HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+ OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+ CallbackData->BmmFakeNvData.COMFlowControl = NewTerminalContext->FlowControl;\r
+ for (Index = 0; Index < sizeof (mFlowControlType) / sizeof (mFlowControlType[0]); Index++) {\r
+ HiiCreateOneOfOptionOpCode (\r
+ OptionsOpCodeHandle,\r
+ (EFI_STRING_ID) mFlowControlType[Index],\r
+ 0,\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,\r
+ VARSTORE_ID_BOOT_MAINT,\r
+ COM_FLOWCONTROL_VAR_OFFSET,\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