1a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/** @file
2fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Console Splitter Driver. Any Handle that attatched console I/O protocols
3fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  (Console In device, Console Out device, Console Error device, Simple Pointer
4fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  protocol, Absolute Pointer protocol) can be bound by this driver.
595276127e373f2e2fb2a208ff77267422a197d9fxgu
695276127e373f2e2fb2a208ff77267422a197d9fxgu  So far it works like any other driver by opening a SimpleTextIn and/or
795276127e373f2e2fb2a208ff77267422a197d9fxgu  SimpleTextOut protocol with EFI_OPEN_PROTOCOL_BY_DRIVER attributes. The big
895276127e373f2e2fb2a208ff77267422a197d9fxgu  difference is this driver does not layer a protocol on the passed in
995276127e373f2e2fb2a208ff77267422a197d9fxgu  handle, or construct a child handle like a standard device or bus driver.
1095276127e373f2e2fb2a208ff77267422a197d9fxgu  This driver produces three virtual handles as children, one for console input
1195276127e373f2e2fb2a208ff77267422a197d9fxgu  splitter, one for console output splitter and one for error output splitter.
12fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  These 3 virtual handles would be installed on gST.
1395276127e373f2e2fb2a208ff77267422a197d9fxgu
14fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Each virtual handle, that supports the Console I/O protocol, will be produced
15c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  in the driver entry point. The virtual handle are added on driver entry and
16c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  never removed. Such design ensures sytem function well during none console
17fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  device situation.
1895276127e373f2e2fb2a208ff77267422a197d9fxgu
19377680ae64bd6f702bfac7c98e65f73019b7d285Eric DongCopyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
20e5eed7d3641d71d7ea539e5379ea9c6a5cd97004hhtianThis program and the accompanying materials
2195276127e373f2e2fb2a208ff77267422a197d9fxguare licensed and made available under the terms and conditions of the BSD License
2295276127e373f2e2fb2a208ff77267422a197d9fxguwhich accompanies this distribution.  The full text of the license may be found at
2395276127e373f2e2fb2a208ff77267422a197d9fxguhttp://opensource.org/licenses/bsd-license.php
2495276127e373f2e2fb2a208ff77267422a197d9fxgu
2595276127e373f2e2fb2a208ff77267422a197d9fxguTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
2695276127e373f2e2fb2a208ff77267422a197d9fxguWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
2795276127e373f2e2fb2a208ff77267422a197d9fxgu
2895276127e373f2e2fb2a208ff77267422a197d9fxgu**/
2995276127e373f2e2fb2a208ff77267422a197d9fxgu
3095276127e373f2e2fb2a208ff77267422a197d9fxgu#include "ConSplitter.h"
3195276127e373f2e2fb2a208ff77267422a197d9fxgu
3295276127e373f2e2fb2a208ff77267422a197d9fxgu//
33838a9c58c949a47194f507561eb44f9b1b7499acczhang// Identify if ConIn is connected in PcdConInConnectOnDemand enabled mode.
34838a9c58c949a47194f507561eb44f9b1b7499acczhang// default not connect
35838a9c58c949a47194f507561eb44f9b1b7499acczhang//
36838a9c58c949a47194f507561eb44f9b1b7499acczhangBOOLEAN  mConInIsConnect = FALSE;
37838a9c58c949a47194f507561eb44f9b1b7499acczhang
38838a9c58c949a47194f507561eb44f9b1b7499acczhang//
39fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Text In Splitter Private Data template
4095276127e373f2e2fb2a208ff77267422a197d9fxgu//
41fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeffGLOBAL_REMOVE_IF_UNREFERENCED TEXT_IN_SPLITTER_PRIVATE_DATA  mConIn = {
4295276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE,
4395276127e373f2e2fb2a208ff77267422a197d9fxgu  (EFI_HANDLE) NULL,
449937b36506924de4b721f03addc50ed318474a5evanjeff
4595276127e373f2e2fb2a208ff77267422a197d9fxgu  {
4695276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextInReset,
4795276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextInReadKeyStroke,
4895276127e373f2e2fb2a208ff77267422a197d9fxgu    (EFI_EVENT) NULL
4995276127e373f2e2fb2a208ff77267422a197d9fxgu  },
5095276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
5195276127e373f2e2fb2a208ff77267422a197d9fxgu  (EFI_SIMPLE_TEXT_INPUT_PROTOCOL **) NULL,
5295276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
539937b36506924de4b721f03addc50ed318474a5evanjeff
5466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  {
5566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    ConSplitterTextInResetEx,
5666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    ConSplitterTextInReadKeyStrokeEx,
5766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    (EFI_EVENT) NULL,
5866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    ConSplitterTextInSetState,
5966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    ConSplitterTextInRegisterKeyNotify,
6066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    ConSplitterTextInUnregisterKeyNotify
6166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  },
6266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  0,
6366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  (EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL **) NULL,
6466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  0,
6566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  {
66a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff    (LIST_ENTRY *) NULL,
67a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff    (LIST_ENTRY *) NULL
6866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  },
6995276127e373f2e2fb2a208ff77267422a197d9fxgu
7095276127e373f2e2fb2a208ff77267422a197d9fxgu  {
7195276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterSimplePointerReset,
7295276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterSimplePointerGetState,
7395276127e373f2e2fb2a208ff77267422a197d9fxgu    (EFI_EVENT) NULL,
7495276127e373f2e2fb2a208ff77267422a197d9fxgu    (EFI_SIMPLE_POINTER_MODE *) NULL
7595276127e373f2e2fb2a208ff77267422a197d9fxgu  },
7695276127e373f2e2fb2a208ff77267422a197d9fxgu  {
7795276127e373f2e2fb2a208ff77267422a197d9fxgu    0x10000,
7895276127e373f2e2fb2a208ff77267422a197d9fxgu    0x10000,
7995276127e373f2e2fb2a208ff77267422a197d9fxgu    0x10000,
8095276127e373f2e2fb2a208ff77267422a197d9fxgu    TRUE,
8195276127e373f2e2fb2a208ff77267422a197d9fxgu    TRUE
8295276127e373f2e2fb2a208ff77267422a197d9fxgu  },
8395276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
8495276127e373f2e2fb2a208ff77267422a197d9fxgu  (EFI_SIMPLE_POINTER_PROTOCOL **) NULL,
8595276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
8695276127e373f2e2fb2a208ff77267422a197d9fxgu
878ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  {
888ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    ConSplitterAbsolutePointerReset,
898ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    ConSplitterAbsolutePointerGetState,
908ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    (EFI_EVENT) NULL,
918ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    (EFI_ABSOLUTE_POINTER_MODE *) NULL
928ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  },
938ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  {
94fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    0,       // AbsoluteMinX
95fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    0,       // AbsoluteMinY
96fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    0,       // AbsoluteMinZ
97fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    0x10000, // AbsoluteMaxX
98fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    0x10000, // AbsoluteMaxY
99fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    0x10000, // AbsoluteMaxZ
100fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    0        // Attributes
1018ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  },
1028ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  0,
1038ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  (EFI_ABSOLUTE_POINTER_PROTOCOL **) NULL,
1048ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  0,
1058ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  FALSE,
1068ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
10795276127e373f2e2fb2a208ff77267422a197d9fxgu  FALSE,
10895276127e373f2e2fb2a208ff77267422a197d9fxgu  FALSE
10995276127e373f2e2fb2a208ff77267422a197d9fxgu};
11095276127e373f2e2fb2a208ff77267422a197d9fxgu
111fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
1124b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
113fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Uga Draw Protocol Private Data template
1144b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
1154b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeffGLOBAL_REMOVE_IF_UNREFERENCED EFI_UGA_DRAW_PROTOCOL mUgaDrawProtocolTemplate = {
116d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff  ConSplitterUgaDrawGetMode,
117d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff  ConSplitterUgaDrawSetMode,
118d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff  ConSplitterUgaDrawBlt
1197a5064ce425f85da87deaabc726945d1c980aafbvanjeff};
1207a5064ce425f85da87deaabc726945d1c980aafbvanjeff
1214b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
122fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Graphics Output Protocol Private Data template
1234b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
1244b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeffGLOBAL_REMOVE_IF_UNREFERENCED EFI_GRAPHICS_OUTPUT_PROTOCOL mGraphicsOutputProtocolTemplate = {
125d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff  ConSplitterGraphicsOutputQueryMode,
126d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff  ConSplitterGraphicsOutputSetMode,
127d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff  ConSplitterGraphicsOutputBlt,
1287a5064ce425f85da87deaabc726945d1c980aafbvanjeff  NULL
1297a5064ce425f85da87deaabc726945d1c980aafbvanjeff};
1307a5064ce425f85da87deaabc726945d1c980aafbvanjeff
131fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
1324b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
133fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Text Out Splitter Private Data template
1344b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
135fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeffGLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = {
13695276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE,
13795276127e373f2e2fb2a208ff77267422a197d9fxgu  (EFI_HANDLE) NULL,
13895276127e373f2e2fb2a208ff77267422a197d9fxgu  {
13995276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutReset,
14095276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutOutputString,
14195276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutTestString,
14295276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutQueryMode,
14395276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutSetMode,
14495276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutSetAttribute,
14595276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutClearScreen,
14695276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutSetCursorPosition,
14795276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutEnableCursor,
14895276127e373f2e2fb2a208ff77267422a197d9fxgu    (EFI_SIMPLE_TEXT_OUTPUT_MODE *) NULL
14995276127e373f2e2fb2a208ff77267422a197d9fxgu  },
15095276127e373f2e2fb2a208ff77267422a197d9fxgu  {
15195276127e373f2e2fb2a208ff77267422a197d9fxgu    1,
15295276127e373f2e2fb2a208ff77267422a197d9fxgu    0,
15395276127e373f2e2fb2a208ff77267422a197d9fxgu    0,
15495276127e373f2e2fb2a208ff77267422a197d9fxgu    0,
15595276127e373f2e2fb2a208ff77267422a197d9fxgu    0,
15695276127e373f2e2fb2a208ff77267422a197d9fxgu    FALSE,
15795276127e373f2e2fb2a208ff77267422a197d9fxgu  },
1589937b36506924de4b721f03addc50ed318474a5evanjeff
15995276127e373f2e2fb2a208ff77267422a197d9fxgu  {
1607a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
1617a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
1627a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL
163d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  },
164d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  0,
165d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  0,
166d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  0,
167d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  0,
1689937b36506924de4b721f03addc50ed318474a5evanjeff
169d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  {
1707a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
1717a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
1727a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
17395276127e373f2e2fb2a208ff77267422a197d9fxgu    NULL
17495276127e373f2e2fb2a208ff77267422a197d9fxgu  },
175aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *) NULL,
176aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  0,
17795276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
17895276127e373f2e2fb2a208ff77267422a197d9fxgu
17995276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
18095276127e373f2e2fb2a208ff77267422a197d9fxgu  (TEXT_OUT_AND_GOP_DATA *) NULL,
18195276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
18295276127e373f2e2fb2a208ff77267422a197d9fxgu  (TEXT_OUT_SPLITTER_QUERY_DATA *) NULL,
18395276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
18495276127e373f2e2fb2a208ff77267422a197d9fxgu  (INT32 *) NULL
18595276127e373f2e2fb2a208ff77267422a197d9fxgu};
18695276127e373f2e2fb2a208ff77267422a197d9fxgu
1874b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
188fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Standard Error Text Out Splitter Data Template
1894b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
190fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeffGLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = {
19195276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE,
19295276127e373f2e2fb2a208ff77267422a197d9fxgu  (EFI_HANDLE) NULL,
19395276127e373f2e2fb2a208ff77267422a197d9fxgu  {
19495276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutReset,
19595276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutOutputString,
19695276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutTestString,
19795276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutQueryMode,
19895276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutSetMode,
19995276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutSetAttribute,
20095276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutClearScreen,
20195276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutSetCursorPosition,
20295276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterTextOutEnableCursor,
20395276127e373f2e2fb2a208ff77267422a197d9fxgu    (EFI_SIMPLE_TEXT_OUTPUT_MODE *) NULL
20495276127e373f2e2fb2a208ff77267422a197d9fxgu  },
20595276127e373f2e2fb2a208ff77267422a197d9fxgu  {
20695276127e373f2e2fb2a208ff77267422a197d9fxgu    1,
20795276127e373f2e2fb2a208ff77267422a197d9fxgu    0,
20895276127e373f2e2fb2a208ff77267422a197d9fxgu    0,
20995276127e373f2e2fb2a208ff77267422a197d9fxgu    0,
21095276127e373f2e2fb2a208ff77267422a197d9fxgu    0,
21195276127e373f2e2fb2a208ff77267422a197d9fxgu    FALSE,
21295276127e373f2e2fb2a208ff77267422a197d9fxgu  },
2139937b36506924de4b721f03addc50ed318474a5evanjeff
21495276127e373f2e2fb2a208ff77267422a197d9fxgu  {
2157a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
2167a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
2177a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL
218d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  },
219d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  0,
220d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  0,
221d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  0,
222d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  0,
2239937b36506924de4b721f03addc50ed318474a5evanjeff
224d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  {
2257a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
2267a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
2277a5064ce425f85da87deaabc726945d1c980aafbvanjeff    NULL,
22895276127e373f2e2fb2a208ff77267422a197d9fxgu    NULL
22995276127e373f2e2fb2a208ff77267422a197d9fxgu  },
230aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *) NULL,
231aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  0,
23295276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
23395276127e373f2e2fb2a208ff77267422a197d9fxgu
23495276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
23595276127e373f2e2fb2a208ff77267422a197d9fxgu  (TEXT_OUT_AND_GOP_DATA *) NULL,
23695276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
23795276127e373f2e2fb2a208ff77267422a197d9fxgu  (TEXT_OUT_SPLITTER_QUERY_DATA *) NULL,
23895276127e373f2e2fb2a208ff77267422a197d9fxgu  0,
23995276127e373f2e2fb2a208ff77267422a197d9fxgu  (INT32 *) NULL
24095276127e373f2e2fb2a208ff77267422a197d9fxgu};
24195276127e373f2e2fb2a208ff77267422a197d9fxgu
2424b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
2434b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff// Driver binding instance for Console Input Device
2444b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
24595276127e373f2e2fb2a208ff77267422a197d9fxguEFI_DRIVER_BINDING_PROTOCOL           gConSplitterConInDriverBinding = {
24695276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterConInDriverBindingSupported,
24795276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterConInDriverBindingStart,
24895276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterConInDriverBindingStop,
24995276127e373f2e2fb2a208ff77267422a197d9fxgu  0xa,
25095276127e373f2e2fb2a208ff77267422a197d9fxgu  NULL,
25195276127e373f2e2fb2a208ff77267422a197d9fxgu  NULL
25295276127e373f2e2fb2a208ff77267422a197d9fxgu};
25395276127e373f2e2fb2a208ff77267422a197d9fxgu
2544b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
255fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Driver binding instance for Console Out device
2564b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
257fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeffEFI_DRIVER_BINDING_PROTOCOL           gConSplitterConOutDriverBinding = {
258fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterConOutDriverBindingSupported,
259fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterConOutDriverBindingStart,
260fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterConOutDriverBindingStop,
26195276127e373f2e2fb2a208ff77267422a197d9fxgu  0xa,
26295276127e373f2e2fb2a208ff77267422a197d9fxgu  NULL,
26395276127e373f2e2fb2a208ff77267422a197d9fxgu  NULL
26495276127e373f2e2fb2a208ff77267422a197d9fxgu};
26595276127e373f2e2fb2a208ff77267422a197d9fxgu
2668ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian//
267fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Driver binding instance for Standard Error device
2688ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian//
269fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeffEFI_DRIVER_BINDING_PROTOCOL           gConSplitterStdErrDriverBinding = {
270fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterStdErrDriverBindingSupported,
271fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterStdErrDriverBindingStart,
272fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterStdErrDriverBindingStop,
2738ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  0xa,
2748ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  NULL,
2758ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  NULL
2768ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian};
2778ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
2784b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
279fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Driver binding instance for Simple Pointer protocol
2804b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
281fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeffEFI_DRIVER_BINDING_PROTOCOL           gConSplitterSimplePointerDriverBinding = {
282fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterSimplePointerDriverBindingSupported,
283fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterSimplePointerDriverBindingStart,
284fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterSimplePointerDriverBindingStop,
28595276127e373f2e2fb2a208ff77267422a197d9fxgu  0xa,
28695276127e373f2e2fb2a208ff77267422a197d9fxgu  NULL,
28795276127e373f2e2fb2a208ff77267422a197d9fxgu  NULL
28895276127e373f2e2fb2a208ff77267422a197d9fxgu};
28995276127e373f2e2fb2a208ff77267422a197d9fxgu
2904b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
291fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff// Driver binding instance for Absolute Pointer protocol
2924b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff//
293fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeffEFI_DRIVER_BINDING_PROTOCOL           gConSplitterAbsolutePointerDriverBinding = {
294fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterAbsolutePointerDriverBindingSupported,
295fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterAbsolutePointerDriverBindingStart,
296fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConSplitterAbsolutePointerDriverBindingStop,
29795276127e373f2e2fb2a208ff77267422a197d9fxgu  0xa,
29895276127e373f2e2fb2a208ff77267422a197d9fxgu  NULL,
29995276127e373f2e2fb2a208ff77267422a197d9fxgu  NULL
30095276127e373f2e2fb2a208ff77267422a197d9fxgu};
30195276127e373f2e2fb2a208ff77267422a197d9fxgu
30295276127e373f2e2fb2a208ff77267422a197d9fxgu/**
303fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  The Entry Point for module ConSplitter. The user code starts with this function.
30495276127e373f2e2fb2a208ff77267422a197d9fxgu
305415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Installs driver module protocols and. Creates virtual device handles for ConIn,
306415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  ConOut, and StdErr. Installs Simple Text In protocol, Simple Text In Ex protocol,
307c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Simple Pointer protocol, Absolute Pointer protocol on those virtual handlers.
308415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Installs Graphics Output protocol and/or UGA Draw protocol if needed.
309415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
310d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
31195276127e373f2e2fb2a208ff77267422a197d9fxgu  @param[in] SystemTable    A pointer to the EFI System Table.
312d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff
31395276127e373f2e2fb2a208ff77267422a197d9fxgu  @retval EFI_SUCCESS       The entry point is executed successfully.
31495276127e373f2e2fb2a208ff77267422a197d9fxgu  @retval other             Some error occurs when executing this entry point.
31595276127e373f2e2fb2a208ff77267422a197d9fxgu
31695276127e373f2e2fb2a208ff77267422a197d9fxgu**/
31795276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
31895276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
319415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeffConSplitterDriverEntry(
32095276127e373f2e2fb2a208ff77267422a197d9fxgu  IN EFI_HANDLE           ImageHandle,
32195276127e373f2e2fb2a208ff77267422a197d9fxgu  IN EFI_SYSTEM_TABLE     *SystemTable
32295276127e373f2e2fb2a208ff77267422a197d9fxgu  )
32395276127e373f2e2fb2a208ff77267422a197d9fxgu{
32495276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS              Status;
32595276127e373f2e2fb2a208ff77267422a197d9fxgu
32695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
32795276127e373f2e2fb2a208ff77267422a197d9fxgu  // Install driver model protocol(s).
32895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
3295bca971e545e01271c6ae5b1b66ee9f281123bf2qhuang  Status = EfiLibInstallDriverBindingComponentName2 (
33095276127e373f2e2fb2a208ff77267422a197d9fxgu             ImageHandle,
33195276127e373f2e2fb2a208ff77267422a197d9fxgu             SystemTable,
33295276127e373f2e2fb2a208ff77267422a197d9fxgu             &gConSplitterConInDriverBinding,
33395276127e373f2e2fb2a208ff77267422a197d9fxgu             ImageHandle,
33495276127e373f2e2fb2a208ff77267422a197d9fxgu             &gConSplitterConInComponentName,
3355bca971e545e01271c6ae5b1b66ee9f281123bf2qhuang             &gConSplitterConInComponentName2
33695276127e373f2e2fb2a208ff77267422a197d9fxgu             );
33795276127e373f2e2fb2a208ff77267422a197d9fxgu  ASSERT_EFI_ERROR (Status);
33895276127e373f2e2fb2a208ff77267422a197d9fxgu
3395bca971e545e01271c6ae5b1b66ee9f281123bf2qhuang  Status = EfiLibInstallDriverBindingComponentName2 (
34095276127e373f2e2fb2a208ff77267422a197d9fxgu             ImageHandle,
34195276127e373f2e2fb2a208ff77267422a197d9fxgu             SystemTable,
34295276127e373f2e2fb2a208ff77267422a197d9fxgu             &gConSplitterSimplePointerDriverBinding,
34395276127e373f2e2fb2a208ff77267422a197d9fxgu             NULL,
34495276127e373f2e2fb2a208ff77267422a197d9fxgu             &gConSplitterSimplePointerComponentName,
3455bca971e545e01271c6ae5b1b66ee9f281123bf2qhuang             &gConSplitterSimplePointerComponentName2
34695276127e373f2e2fb2a208ff77267422a197d9fxgu             );
34795276127e373f2e2fb2a208ff77267422a197d9fxgu  ASSERT_EFI_ERROR (Status);
34895276127e373f2e2fb2a208ff77267422a197d9fxgu
3495bca971e545e01271c6ae5b1b66ee9f281123bf2qhuang  Status = EfiLibInstallDriverBindingComponentName2 (
35095276127e373f2e2fb2a208ff77267422a197d9fxgu             ImageHandle,
35195276127e373f2e2fb2a208ff77267422a197d9fxgu             SystemTable,
3528ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             &gConSplitterAbsolutePointerDriverBinding,
3538ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             NULL,
3548ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             &gConSplitterAbsolutePointerComponentName,
3558ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             &gConSplitterAbsolutePointerComponentName2
3568ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             );
3578ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  ASSERT_EFI_ERROR (Status);
3588ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
3598ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Status = EfiLibInstallDriverBindingComponentName2 (
3608ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             ImageHandle,
3618ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             SystemTable,
36295276127e373f2e2fb2a208ff77267422a197d9fxgu             &gConSplitterConOutDriverBinding,
36395276127e373f2e2fb2a208ff77267422a197d9fxgu             NULL,
36495276127e373f2e2fb2a208ff77267422a197d9fxgu             &gConSplitterConOutComponentName,
3655bca971e545e01271c6ae5b1b66ee9f281123bf2qhuang             &gConSplitterConOutComponentName2
36695276127e373f2e2fb2a208ff77267422a197d9fxgu             );
36795276127e373f2e2fb2a208ff77267422a197d9fxgu  ASSERT_EFI_ERROR (Status);
36895276127e373f2e2fb2a208ff77267422a197d9fxgu
3695bca971e545e01271c6ae5b1b66ee9f281123bf2qhuang  Status = EfiLibInstallDriverBindingComponentName2 (
37095276127e373f2e2fb2a208ff77267422a197d9fxgu             ImageHandle,
37195276127e373f2e2fb2a208ff77267422a197d9fxgu             SystemTable,
37295276127e373f2e2fb2a208ff77267422a197d9fxgu             &gConSplitterStdErrDriverBinding,
37395276127e373f2e2fb2a208ff77267422a197d9fxgu             NULL,
37495276127e373f2e2fb2a208ff77267422a197d9fxgu             &gConSplitterStdErrComponentName,
3755bca971e545e01271c6ae5b1b66ee9f281123bf2qhuang             &gConSplitterStdErrComponentName2
37695276127e373f2e2fb2a208ff77267422a197d9fxgu             );
37795276127e373f2e2fb2a208ff77267422a197d9fxgu  ASSERT_EFI_ERROR (Status);
37895276127e373f2e2fb2a208ff77267422a197d9fxgu
379fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
3802da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  // Either Graphics Output protocol or UGA Draw protocol must be supported.
381fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
382d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  ASSERT (FeaturePcdGet (PcdConOutGopSupport) ||
383d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff          FeaturePcdGet (PcdConOutUgaSupport));
384fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
38595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
386fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  // The driver creates virtual handles for ConIn, ConOut, StdErr.
38795276127e373f2e2fb2a208ff77267422a197d9fxgu  // The virtual handles will always exist even if no console exist in the
38895276127e373f2e2fb2a208ff77267422a197d9fxgu  // system. This is need to support hotplug devices like USB.
38995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
39095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
39195276127e373f2e2fb2a208ff77267422a197d9fxgu  // Create virtual device handle for ConIn Splitter
39295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
39395276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterTextInConstructor (&mConIn);
39495276127e373f2e2fb2a208ff77267422a197d9fxgu  if (!EFI_ERROR (Status)) {
39595276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = gBS->InstallMultipleProtocolInterfaces (
39695276127e373f2e2fb2a208ff77267422a197d9fxgu                    &mConIn.VirtualHandle,
39795276127e373f2e2fb2a208ff77267422a197d9fxgu                    &gEfiSimpleTextInProtocolGuid,
39895276127e373f2e2fb2a208ff77267422a197d9fxgu                    &mConIn.TextIn,
39966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                    &gEfiSimpleTextInputExProtocolGuid,
40066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                    &mConIn.TextInEx,
40195276127e373f2e2fb2a208ff77267422a197d9fxgu                    &gEfiSimplePointerProtocolGuid,
40295276127e373f2e2fb2a208ff77267422a197d9fxgu                    &mConIn.SimplePointer,
403b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian                    &gEfiAbsolutePointerProtocolGuid,
404b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian                    &mConIn.AbsolutePointer,
40595276127e373f2e2fb2a208ff77267422a197d9fxgu                    NULL
40695276127e373f2e2fb2a208ff77267422a197d9fxgu                    );
40795276127e373f2e2fb2a208ff77267422a197d9fxgu    if (!EFI_ERROR (Status)) {
40895276127e373f2e2fb2a208ff77267422a197d9fxgu      //
40995276127e373f2e2fb2a208ff77267422a197d9fxgu      // Update the EFI System Table with new virtual console
410fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff      // and update the pointer to Simple Text Input protocol.
41195276127e373f2e2fb2a208ff77267422a197d9fxgu      //
41295276127e373f2e2fb2a208ff77267422a197d9fxgu      gST->ConsoleInHandle  = mConIn.VirtualHandle;
41395276127e373f2e2fb2a208ff77267422a197d9fxgu      gST->ConIn            = &mConIn.TextIn;
41495276127e373f2e2fb2a208ff77267422a197d9fxgu    }
41595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
41695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
41795276127e373f2e2fb2a208ff77267422a197d9fxgu  // Create virtual device handle for ConOut Splitter
41895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
41995276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterTextOutConstructor (&mConOut);
42095276127e373f2e2fb2a208ff77267422a197d9fxgu  if (!EFI_ERROR (Status)) {
421f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin    Status = gBS->InstallMultipleProtocolInterfaces (
422f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                    &mConOut.VirtualHandle,
423f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                    &gEfiSimpleTextOutProtocolGuid,
424f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                    &mConOut.TextOut,
425f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                    NULL
426f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                    );
42795276127e373f2e2fb2a208ff77267422a197d9fxgu    if (!EFI_ERROR (Status)) {
42895276127e373f2e2fb2a208ff77267422a197d9fxgu      //
42995276127e373f2e2fb2a208ff77267422a197d9fxgu      // Update the EFI System Table with new virtual console
430fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff      // and Update the pointer to Text Output protocol.
43195276127e373f2e2fb2a208ff77267422a197d9fxgu      //
43295276127e373f2e2fb2a208ff77267422a197d9fxgu      gST->ConsoleOutHandle = mConOut.VirtualHandle;
43395276127e373f2e2fb2a208ff77267422a197d9fxgu      gST->ConOut           = &mConOut.TextOut;
43495276127e373f2e2fb2a208ff77267422a197d9fxgu    }
43595276127e373f2e2fb2a208ff77267422a197d9fxgu
43695276127e373f2e2fb2a208ff77267422a197d9fxgu  }
437fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin
438fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  //
439fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  // Create virtual device handle for StdErr Splitter
440fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  //
441fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  Status = ConSplitterTextOutConstructor (&mStdErr);
442fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  if (!EFI_ERROR (Status)) {
443fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    Status = gBS->InstallMultipleProtocolInterfaces (
444fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                    &mStdErr.VirtualHandle,
445fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                    &gEfiSimpleTextOutProtocolGuid,
446fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                    &mStdErr.TextOut,
447fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                    NULL
448fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                    );
449fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    if (!EFI_ERROR (Status)) {
450fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      //
451fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      // Update the EFI System Table with new virtual console
452fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      // and update the pointer to Text Output protocol.
453fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      //
454fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      gST->StandardErrorHandle  = mStdErr.VirtualHandle;
455fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      gST->StdErr               = &mStdErr.TextOut;
456fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    }
457fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  }
458fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin
45995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
46095276127e373f2e2fb2a208ff77267422a197d9fxgu  // Update the CRC32 in the EFI System Table header
46195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
46295276127e373f2e2fb2a208ff77267422a197d9fxgu  gST->Hdr.CRC32 = 0;
46395276127e373f2e2fb2a208ff77267422a197d9fxgu  gBS->CalculateCrc32 (
46495276127e373f2e2fb2a208ff77267422a197d9fxgu        (UINT8 *) &gST->Hdr,
46595276127e373f2e2fb2a208ff77267422a197d9fxgu        gST->Hdr.HeaderSize,
46695276127e373f2e2fb2a208ff77267422a197d9fxgu        &gST->Hdr.CRC32
46795276127e373f2e2fb2a208ff77267422a197d9fxgu        );
46895276127e373f2e2fb2a208ff77267422a197d9fxgu
46995276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
470415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
47195276127e373f2e2fb2a208ff77267422a197d9fxgu}
47295276127e373f2e2fb2a208ff77267422a197d9fxgu
473a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
474415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Construct console input devices' private data.
47595276127e373f2e2fb2a208ff77267422a197d9fxgu
476a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  ConInPrivate             A pointer to the TEXT_IN_SPLITTER_PRIVATE_DATA
477a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   structure.
47895276127e373f2e2fb2a208ff77267422a197d9fxgu
479a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_OUT_OF_RESOURCES     Out of resources.
4804b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval EFI_SUCCESS              Text Input Devcie's private data has been constructed.
4814b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval other                    Failed to construct private data.
48295276127e373f2e2fb2a208ff77267422a197d9fxgu
483a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
484a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffEFI_STATUS
485a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffConSplitterTextInConstructor (
486a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  TEXT_IN_SPLITTER_PRIVATE_DATA       *ConInPrivate
487a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  )
48895276127e373f2e2fb2a208ff77267422a197d9fxgu{
48995276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS  Status;
49095276127e373f2e2fb2a208ff77267422a197d9fxgu
49195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
492c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  // Allocate buffer for Simple Text Input device
49395276127e373f2e2fb2a208ff77267422a197d9fxgu  //
49495276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterGrowBuffer (
49595276127e373f2e2fb2a208ff77267422a197d9fxgu            sizeof (EFI_SIMPLE_TEXT_INPUT_PROTOCOL *),
49695276127e373f2e2fb2a208ff77267422a197d9fxgu            &ConInPrivate->TextInListCount,
49795276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &ConInPrivate->TextInList
49895276127e373f2e2fb2a208ff77267422a197d9fxgu            );
49995276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
50095276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
50195276127e373f2e2fb2a208ff77267422a197d9fxgu  }
5029937b36506924de4b721f03addc50ed318474a5evanjeff
503fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
504c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  // Create Event to wait for a key
505fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
50695276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = gBS->CreateEvent (
50795276127e373f2e2fb2a208ff77267422a197d9fxgu                  EVT_NOTIFY_WAIT,
50895276127e373f2e2fb2a208ff77267422a197d9fxgu                  TPL_NOTIFY,
50995276127e373f2e2fb2a208ff77267422a197d9fxgu                  ConSplitterTextInWaitForKey,
51095276127e373f2e2fb2a208ff77267422a197d9fxgu                  ConInPrivate,
51195276127e373f2e2fb2a208ff77267422a197d9fxgu                  &ConInPrivate->TextIn.WaitForKey
51295276127e373f2e2fb2a208ff77267422a197d9fxgu                  );
51395276127e373f2e2fb2a208ff77267422a197d9fxgu  ASSERT_EFI_ERROR (Status);
51495276127e373f2e2fb2a208ff77267422a197d9fxgu
51566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
516c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  // Allocate buffer for Simple Text Input Ex device
5177a5064ce425f85da87deaabc726945d1c980aafbvanjeff  //
51866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Status = ConSplitterGrowBuffer (
51966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang             sizeof (EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *),
52066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang             &ConInPrivate->TextInExListCount,
52166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang             (VOID **) &ConInPrivate->TextInExList
52266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang             );
52366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (EFI_ERROR (Status)) {
52466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    return EFI_OUT_OF_RESOURCES;
52566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
526fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
527fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Create Event to wait for a key Ex
528fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
52966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Status = gBS->CreateEvent (
53066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  EVT_NOTIFY_WAIT,
53166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  TPL_NOTIFY,
53266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  ConSplitterTextInWaitForKey,
53366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  ConInPrivate,
53466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  &ConInPrivate->TextInEx.WaitForKeyEx
53566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  );
53666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  ASSERT_EFI_ERROR (Status);
53766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
5387a5064ce425f85da87deaabc726945d1c980aafbvanjeff  InitializeListHead (&ConInPrivate->NotifyList);
53966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
540fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  ConInPrivate->AbsolutePointer.Mode = &ConInPrivate->AbsolutePointerMode;
5418ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
542c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  // Allocate buffer for Absolute Pointer device
5438ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
5448ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Status = ConSplitterGrowBuffer (
545b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            sizeof (EFI_ABSOLUTE_POINTER_PROTOCOL *),
546b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            &ConInPrivate->AbsolutePointerListCount,
547b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            (VOID **) &ConInPrivate->AbsolutePointerList
548b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            );
5498ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  if (EFI_ERROR (Status)) {
550b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian    return EFI_OUT_OF_RESOURCES;
5518ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
552fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
553fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Create Event to wait for device input for Absolute pointer device
554fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
5558ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Status = gBS->CreateEvent (
556b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            EVT_NOTIFY_WAIT,
557b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            TPL_NOTIFY,
558b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            ConSplitterAbsolutePointerWaitForInput,
559b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            ConInPrivate,
560b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian            &ConInPrivate->AbsolutePointer.WaitForInput
561b819abbb7f011f70b2346f713eb69f7d36c0756feric_tian        );
5628ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  ASSERT_EFI_ERROR (Status);
56366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
56495276127e373f2e2fb2a208ff77267422a197d9fxgu  ConInPrivate->SimplePointer.Mode = &ConInPrivate->SimplePointerMode;
565fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
566c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  // Allocate buffer for Simple Pointer device
567fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
56895276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterGrowBuffer (
56995276127e373f2e2fb2a208ff77267422a197d9fxgu            sizeof (EFI_SIMPLE_POINTER_PROTOCOL *),
57095276127e373f2e2fb2a208ff77267422a197d9fxgu            &ConInPrivate->PointerListCount,
57195276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &ConInPrivate->PointerList
57295276127e373f2e2fb2a208ff77267422a197d9fxgu            );
57395276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
57495276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
57595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
576fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
577fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Create Event to wait for device input for Simple pointer device
578fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
57995276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = gBS->CreateEvent (
58095276127e373f2e2fb2a208ff77267422a197d9fxgu                  EVT_NOTIFY_WAIT,
58195276127e373f2e2fb2a208ff77267422a197d9fxgu                  TPL_NOTIFY,
58295276127e373f2e2fb2a208ff77267422a197d9fxgu                  ConSplitterSimplePointerWaitForInput,
58395276127e373f2e2fb2a208ff77267422a197d9fxgu                  ConInPrivate,
58495276127e373f2e2fb2a208ff77267422a197d9fxgu                  &ConInPrivate->SimplePointer.WaitForInput
58595276127e373f2e2fb2a208ff77267422a197d9fxgu                  );
586f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  ASSERT_EFI_ERROR (Status);
587f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  //
588f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  // Create Event to signal ConIn connection request
589f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  //
590f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  Status = gBS->CreateEventEx (
591f58f3de07ef4531828c108ea099ff637f8c52d1fczhang                  EVT_NOTIFY_SIGNAL,
592f58f3de07ef4531828c108ea099ff637f8c52d1fczhang                  TPL_CALLBACK,
593f58f3de07ef4531828c108ea099ff637f8c52d1fczhang                  ConSplitterEmptyCallbackFunction,
594f58f3de07ef4531828c108ea099ff637f8c52d1fczhang                  NULL,
595f58f3de07ef4531828c108ea099ff637f8c52d1fczhang                  &gConnectConInEventGuid,
59689b5f4b33fd5f4ec9cf6b7c341d47f912ad5c7b7czhang                  &ConInPrivate->ConnectConInEvent
597f58f3de07ef4531828c108ea099ff637f8c52d1fczhang                  );
59895276127e373f2e2fb2a208ff77267422a197d9fxgu
59995276127e373f2e2fb2a208ff77267422a197d9fxgu  return Status;
60095276127e373f2e2fb2a208ff77267422a197d9fxgu}
60195276127e373f2e2fb2a208ff77267422a197d9fxgu
602415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff/**
603415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Construct console output devices' private data.
604415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
605fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  ConOutPrivate            A pointer to the TEXT_OUT_SPLITTER_PRIVATE_DATA
606415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                                   structure.
607415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
608415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES     Out of resources.
6094b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval EFI_SUCCESS              Text Input Devcie's private data has been constructed.
610415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
611415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff**/
61295276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
61395276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutConstructor (
61495276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA      *ConOutPrivate
61595276127e373f2e2fb2a208ff77267422a197d9fxgu  )
61695276127e373f2e2fb2a208ff77267422a197d9fxgu{
61795276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS  Status;
618aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;
61995276127e373f2e2fb2a208ff77267422a197d9fxgu
62095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
6217a5064ce425f85da87deaabc726945d1c980aafbvanjeff  // Copy protocols template
6227a5064ce425f85da87deaabc726945d1c980aafbvanjeff  //
6237a5064ce425f85da87deaabc726945d1c980aafbvanjeff  if (FeaturePcdGet (PcdConOutUgaSupport)) {
6244b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff    CopyMem (&ConOutPrivate->UgaDraw, &mUgaDrawProtocolTemplate, sizeof (EFI_UGA_DRAW_PROTOCOL));
6257a5064ce425f85da87deaabc726945d1c980aafbvanjeff  }
6267a5064ce425f85da87deaabc726945d1c980aafbvanjeff  if (FeaturePcdGet (PcdConOutGopSupport)) {
6274b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff    CopyMem (&ConOutPrivate->GraphicsOutput, &mGraphicsOutputProtocolTemplate, sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL));
6287a5064ce425f85da87deaabc726945d1c980aafbvanjeff  }
6297a5064ce425f85da87deaabc726945d1c980aafbvanjeff
6307a5064ce425f85da87deaabc726945d1c980aafbvanjeff  //
63195276127e373f2e2fb2a208ff77267422a197d9fxgu  // Initilize console output splitter's private data.
63295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
63395276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutPrivate->TextOut.Mode = &ConOutPrivate->TextOutMode;
63495276127e373f2e2fb2a208ff77267422a197d9fxgu
635189eac2199940cdc1265503ba4854ea947042424qwang  //
636189eac2199940cdc1265503ba4854ea947042424qwang  // When new console device is added, the new mode will be set later,
637189eac2199940cdc1265503ba4854ea947042424qwang  // so put current mode back to init state.
6388541adab27901906118876f1acd3555666677ff9vanjeff  //
639189eac2199940cdc1265503ba4854ea947042424qwang  ConOutPrivate->TextOutMode.Mode = 0xFF;
640fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
641c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  // Allocate buffer for Console Out device
642fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
64395276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterGrowBuffer (
64495276127e373f2e2fb2a208ff77267422a197d9fxgu            sizeof (TEXT_OUT_AND_GOP_DATA),
64595276127e373f2e2fb2a208ff77267422a197d9fxgu            &ConOutPrivate->TextOutListCount,
64695276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &ConOutPrivate->TextOutList
64795276127e373f2e2fb2a208ff77267422a197d9fxgu            );
64895276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
64995276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
65095276127e373f2e2fb2a208ff77267422a197d9fxgu  }
651fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
652fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Allocate buffer for Text Out query data
653fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
65495276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterGrowBuffer (
65595276127e373f2e2fb2a208ff77267422a197d9fxgu            sizeof (TEXT_OUT_SPLITTER_QUERY_DATA),
65695276127e373f2e2fb2a208ff77267422a197d9fxgu            &ConOutPrivate->TextOutQueryDataCount,
65795276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &ConOutPrivate->TextOutQueryData
65895276127e373f2e2fb2a208ff77267422a197d9fxgu            );
65995276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
66095276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
66195276127e373f2e2fb2a208ff77267422a197d9fxgu  }
662fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
66395276127e373f2e2fb2a208ff77267422a197d9fxgu  //
6649937b36506924de4b721f03addc50ed318474a5evanjeff  // Setup the default console to 80 x 25 and mode to 0
66595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
66695276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutPrivate->TextOutQueryData[0].Columns  = 80;
66795276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutPrivate->TextOutQueryData[0].Rows     = 25;
6689937b36506924de4b721f03addc50ed318474a5evanjeff  TextOutSetMode (ConOutPrivate, 0);
6699937b36506924de4b721f03addc50ed318474a5evanjeff
67095276127e373f2e2fb2a208ff77267422a197d9fxgu
671d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  if (FeaturePcdGet (PcdConOutUgaSupport)) {
672d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
6739937b36506924de4b721f03addc50ed318474a5evanjeff    // Setup the UgaDraw to 800 x 600 x 32 bits per pixel, 60Hz.
674d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
675d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff    ConSplitterUgaDrawSetMode (&ConOutPrivate->UgaDraw, 800, 600, 32, 60);
67695276127e373f2e2fb2a208ff77267422a197d9fxgu  }
677d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  if (FeaturePcdGet (PcdConOutGopSupport)) {
678d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
679d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    // Setup resource for mode information in Graphics Output Protocol interface
680d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
681d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    if ((ConOutPrivate->GraphicsOutput.Mode = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE))) == NULL) {
682d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff      return EFI_OUT_OF_RESOURCES;
683d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    }
684d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    if ((ConOutPrivate->GraphicsOutput.Mode->Info = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION))) == NULL) {
685d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff      return EFI_OUT_OF_RESOURCES;
686d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    }
687d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
688d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    // Setup the DevNullGraphicsOutput to 800 x 600 x 32 bits per pixel
689aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    // DevNull will be updated to user-defined mode after driver has started.
690d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
691aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    if ((ConOutPrivate->GraphicsOutputModeBuffer = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION))) == NULL) {
692d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff      return EFI_OUT_OF_RESOURCES;
693d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    }
694aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Info = &ConOutPrivate->GraphicsOutputModeBuffer[0];
695aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Info->Version = 0;
696aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Info->HorizontalResolution = 800;
697aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Info->VerticalResolution = 600;
698aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Info->PixelFormat = PixelBltOnly;
699aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Info->PixelsPerScanLine = 800;
700aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    CopyMem (ConOutPrivate->GraphicsOutput.Mode->Info, Info, sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
701aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    ConOutPrivate->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
70295276127e373f2e2fb2a208ff77267422a197d9fxgu
703d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
704d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    // Initialize the following items, theset items remain unchanged in GraphicsOutput->SetMode()
705aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    // GraphicsOutputMode->FrameBufferBase, GraphicsOutputMode->FrameBufferSize
706d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
7071be0dda62d546b09d6892e09c48910ace6d57f01jljusten    ConOutPrivate->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
708d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    ConOutPrivate->GraphicsOutput.Mode->FrameBufferSize = 0;
70995276127e373f2e2fb2a208ff77267422a197d9fxgu
710d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    ConOutPrivate->GraphicsOutput.Mode->MaxMode = 1;
711d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
7124b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff    // Initial current mode to unknown state, and then set to mode 0
713d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
714d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    ConOutPrivate->GraphicsOutput.Mode->Mode = 0xffff;
715d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    ConOutPrivate->GraphicsOutput.SetMode (&ConOutPrivate->GraphicsOutput, 0);
716d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  }
71795276127e373f2e2fb2a208ff77267422a197d9fxgu
7184b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  return EFI_SUCCESS;
71995276127e373f2e2fb2a208ff77267422a197d9fxgu}
72095276127e373f2e2fb2a208ff77267422a197d9fxgu
721a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
722a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
723c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Test to see if the specified protocol could be supported on the specified device.
724a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
725fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                Driver Binding protocol pointer.
726415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle    Handle of device to test.
727fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  Guid                The specified protocol.
728a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
729415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS         The specified protocol is supported on this device.
730fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @retval EFI_UNSUPPORTED     The specified protocol attempts to be installed on virtul handle.
731fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @retval other               Failed to open specified protocol on this device.
732a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
733a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
73495276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
73595276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSupported (
73695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
73795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
73895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_GUID                        *Guid
73995276127e373f2e2fb2a208ff77267422a197d9fxgu  )
74095276127e373f2e2fb2a208ff77267422a197d9fxgu{
74195276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS  Status;
74295276127e373f2e2fb2a208ff77267422a197d9fxgu  VOID        *Instance;
74395276127e373f2e2fb2a208ff77267422a197d9fxgu
74495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
74595276127e373f2e2fb2a208ff77267422a197d9fxgu  // Make sure the Console Splitter does not attempt to attach to itself
74695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
747fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  if (ControllerHandle == mConIn.VirtualHandle  ||
748fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff      ControllerHandle == mConOut.VirtualHandle ||
749c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff      ControllerHandle == mStdErr.VirtualHandle
750fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff      ) {
75195276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_UNSUPPORTED;
75295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
75395276127e373f2e2fb2a208ff77267422a197d9fxgu
75495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
755fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Check to see whether the specific protocol could be opened BY_DRIVER
75695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
75795276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = gBS->OpenProtocol (
75895276127e373f2e2fb2a208ff77267422a197d9fxgu                  ControllerHandle,
75995276127e373f2e2fb2a208ff77267422a197d9fxgu                  Guid,
76095276127e373f2e2fb2a208ff77267422a197d9fxgu                  &Instance,
76195276127e373f2e2fb2a208ff77267422a197d9fxgu                  This->DriverBindingHandle,
76295276127e373f2e2fb2a208ff77267422a197d9fxgu                  ControllerHandle,
76395276127e373f2e2fb2a208ff77267422a197d9fxgu                  EFI_OPEN_PROTOCOL_BY_DRIVER
76495276127e373f2e2fb2a208ff77267422a197d9fxgu                  );
76595276127e373f2e2fb2a208ff77267422a197d9fxgu
76695276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
76795276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
76895276127e373f2e2fb2a208ff77267422a197d9fxgu  }
76995276127e373f2e2fb2a208ff77267422a197d9fxgu
77095276127e373f2e2fb2a208ff77267422a197d9fxgu  gBS->CloseProtocol (
77195276127e373f2e2fb2a208ff77267422a197d9fxgu        ControllerHandle,
77295276127e373f2e2fb2a208ff77267422a197d9fxgu        Guid,
77395276127e373f2e2fb2a208ff77267422a197d9fxgu        This->DriverBindingHandle,
77495276127e373f2e2fb2a208ff77267422a197d9fxgu        ControllerHandle
77595276127e373f2e2fb2a208ff77267422a197d9fxgu        );
77695276127e373f2e2fb2a208ff77267422a197d9fxgu
77795276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
77895276127e373f2e2fb2a208ff77267422a197d9fxgu}
77995276127e373f2e2fb2a208ff77267422a197d9fxgu
780a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
781c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Test to see if Console In Device could be supported on the Controller.
782a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
783fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                Driver Binding protocol instance pointer.
784415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle    Handle of device to test.
785415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath Optional parameter use to pick a specific child
786415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                              device to start.
787a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
7884b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval EFI_SUCCESS         This driver supports this device.
7894b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval other               This driver does not support this device.
790a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
791a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
79295276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
79395276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
79495276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterConInDriverBindingSupported (
79595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
79695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
79795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
79895276127e373f2e2fb2a208ff77267422a197d9fxgu  )
79995276127e373f2e2fb2a208ff77267422a197d9fxgu{
80095276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterSupported (
80195276127e373f2e2fb2a208ff77267422a197d9fxgu          This,
80295276127e373f2e2fb2a208ff77267422a197d9fxgu          ControllerHandle,
80395276127e373f2e2fb2a208ff77267422a197d9fxgu          &gEfiConsoleInDeviceGuid
80495276127e373f2e2fb2a208ff77267422a197d9fxgu          );
80595276127e373f2e2fb2a208ff77267422a197d9fxgu}
80695276127e373f2e2fb2a208ff77267422a197d9fxgu
807a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
808c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Test to see if Simple Pointer protocol could be supported on the Controller.
809a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
810fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                Driver Binding protocol instance pointer.
811415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle    Handle of device to test.
812415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath Optional parameter use to pick a specific child
813415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                              device to start.
814a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
8154b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval EFI_SUCCESS         This driver supports this device.
8164b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval other               This driver does not support this device.
817a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
818a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
81995276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
82095276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
82195276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSimplePointerDriverBindingSupported (
82295276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
82395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
82495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
82595276127e373f2e2fb2a208ff77267422a197d9fxgu  )
82695276127e373f2e2fb2a208ff77267422a197d9fxgu{
82795276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterSupported (
82895276127e373f2e2fb2a208ff77267422a197d9fxgu          This,
82995276127e373f2e2fb2a208ff77267422a197d9fxgu          ControllerHandle,
83095276127e373f2e2fb2a208ff77267422a197d9fxgu          &gEfiSimplePointerProtocolGuid
83195276127e373f2e2fb2a208ff77267422a197d9fxgu          );
83295276127e373f2e2fb2a208ff77267422a197d9fxgu}
83395276127e373f2e2fb2a208ff77267422a197d9fxgu
834a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
835c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Test to see if Absolute Pointer protocol could be supported on the Controller.
836a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
837fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                Driver Binding protocol instance pointer.
838415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle    Handle of device to test.
839415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath Optional parameter use to pick a specific child
840415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                              device to start.
841a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
8424b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval EFI_SUCCESS         This driver supports this device.
8434b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval other               This driver does not support this device.
844a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
845a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
84695276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
84795276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
8488ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianConSplitterAbsolutePointerDriverBindingSupported (
8498ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
8508ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_HANDLE                      ControllerHandle,
8518ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
8528ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  )
8538ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian{
8548ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  return ConSplitterSupported (
8558ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian          This,
8568ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian          ControllerHandle,
8578ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian          &gEfiAbsolutePointerProtocolGuid
8588ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian          );
8598ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian}
8608ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
861a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
862a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
863c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Test to see if Console Out Device could be supported on the Controller.
864a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
865fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                Driver Binding protocol instance pointer.
866415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle    Handle of device to test.
867415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath Optional parameter use to pick a specific child
868415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                              device to start.
869a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
8704b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval EFI_SUCCESS         This driver supports this device.
8714b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval other               This driver does not support this device.
872a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
873a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
8748ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFI_STATUS
8758ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFIAPI
87695276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterConOutDriverBindingSupported (
87795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
87895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
87995276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
88095276127e373f2e2fb2a208ff77267422a197d9fxgu  )
88195276127e373f2e2fb2a208ff77267422a197d9fxgu{
88295276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterSupported (
88395276127e373f2e2fb2a208ff77267422a197d9fxgu          This,
88495276127e373f2e2fb2a208ff77267422a197d9fxgu          ControllerHandle,
88595276127e373f2e2fb2a208ff77267422a197d9fxgu          &gEfiConsoleOutDeviceGuid
88695276127e373f2e2fb2a208ff77267422a197d9fxgu          );
88795276127e373f2e2fb2a208ff77267422a197d9fxgu}
88895276127e373f2e2fb2a208ff77267422a197d9fxgu
889a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
890c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Test to see if Standard Error Device could be supported on the Controller.
891a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
892fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                Driver Binding protocol instance pointer.
893415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle    Handle of device to test.
894415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath Optional parameter use to pick a specific child
895415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                              device to start.
896a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
8974b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval EFI_SUCCESS         This driver supports this device.
8984b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval other               This driver does not support this device.
899a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
900a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
90195276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
90295276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
90395276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterStdErrDriverBindingSupported (
90495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
90595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
90695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
90795276127e373f2e2fb2a208ff77267422a197d9fxgu  )
90895276127e373f2e2fb2a208ff77267422a197d9fxgu{
90995276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterSupported (
91095276127e373f2e2fb2a208ff77267422a197d9fxgu          This,
91195276127e373f2e2fb2a208ff77267422a197d9fxgu          ControllerHandle,
91295276127e373f2e2fb2a208ff77267422a197d9fxgu          &gEfiStandardErrorDeviceGuid
91395276127e373f2e2fb2a208ff77267422a197d9fxgu          );
91495276127e373f2e2fb2a208ff77267422a197d9fxgu}
91595276127e373f2e2fb2a208ff77267422a197d9fxgu
916a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
917a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
918c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Start ConSplitter on devcie handle by opening Console Device Guid on device handle
919415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  and the console virtual handle. And Get the console interface on controller handle.
920c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
921fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                      Driver Binding protocol instance pointer.
922415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle          Handle of device.
923415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ConSplitterVirtualHandle  Console virtual Handle.
924415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  DeviceGuid                The specified Console Device, such as ConInDev,
925415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                                    ConOutDev.
926415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  InterfaceGuid             The specified protocol to be opened.
927415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Interface                 Protocol interface returned.
928415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
9294b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  @retval EFI_SUCCESS               This driver supports this device.
930415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other                     Failed to open the specified Console Device Guid
931415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                                    or specified protocol.
932a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
933a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
93495276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
93595276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterStart (
93695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
93795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
93895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ConSplitterVirtualHandle,
93995276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_GUID                        *DeviceGuid,
94095276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_GUID                        *InterfaceGuid,
941415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  OUT VOID                            **Interface
94295276127e373f2e2fb2a208ff77267422a197d9fxgu  )
94395276127e373f2e2fb2a208ff77267422a197d9fxgu{
94495276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS  Status;
94595276127e373f2e2fb2a208ff77267422a197d9fxgu  VOID        *Instance;
94695276127e373f2e2fb2a208ff77267422a197d9fxgu
94795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
948fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Check to see whether the ControllerHandle has the DeviceGuid on it.
94995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
95095276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = gBS->OpenProtocol (
95195276127e373f2e2fb2a208ff77267422a197d9fxgu                  ControllerHandle,
95295276127e373f2e2fb2a208ff77267422a197d9fxgu                  DeviceGuid,
95395276127e373f2e2fb2a208ff77267422a197d9fxgu                  &Instance,
95495276127e373f2e2fb2a208ff77267422a197d9fxgu                  This->DriverBindingHandle,
95595276127e373f2e2fb2a208ff77267422a197d9fxgu                  ControllerHandle,
95695276127e373f2e2fb2a208ff77267422a197d9fxgu                  EFI_OPEN_PROTOCOL_BY_DRIVER
95795276127e373f2e2fb2a208ff77267422a197d9fxgu                  );
95895276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
95995276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
96095276127e373f2e2fb2a208ff77267422a197d9fxgu  }
961c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
962fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
96376649bf4d80e1d2ed062846c2960292fb63de08dvanjeff  // Open the Parent Handle for the child.
964fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
96595276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = gBS->OpenProtocol (
96695276127e373f2e2fb2a208ff77267422a197d9fxgu                  ControllerHandle,
96795276127e373f2e2fb2a208ff77267422a197d9fxgu                  DeviceGuid,
96895276127e373f2e2fb2a208ff77267422a197d9fxgu                  &Instance,
96995276127e373f2e2fb2a208ff77267422a197d9fxgu                  This->DriverBindingHandle,
97095276127e373f2e2fb2a208ff77267422a197d9fxgu                  ConSplitterVirtualHandle,
97195276127e373f2e2fb2a208ff77267422a197d9fxgu                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
97295276127e373f2e2fb2a208ff77267422a197d9fxgu                  );
97395276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
974fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    goto Err;
97595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
97695276127e373f2e2fb2a208ff77267422a197d9fxgu
977fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
978fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Open InterfaceGuid on the virtul handle.
979fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
980fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Status =  gBS->OpenProtocol (
98195276127e373f2e2fb2a208ff77267422a197d9fxgu                ControllerHandle,
98295276127e373f2e2fb2a208ff77267422a197d9fxgu                InterfaceGuid,
98395276127e373f2e2fb2a208ff77267422a197d9fxgu                Interface,
98495276127e373f2e2fb2a208ff77267422a197d9fxgu                This->DriverBindingHandle,
98595276127e373f2e2fb2a208ff77267422a197d9fxgu                ConSplitterVirtualHandle,
98695276127e373f2e2fb2a208ff77267422a197d9fxgu                EFI_OPEN_PROTOCOL_GET_PROTOCOL
98795276127e373f2e2fb2a208ff77267422a197d9fxgu                );
988fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
989fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  if (!EFI_ERROR (Status)) {
990fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    return EFI_SUCCESS;
991fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  }
992fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
993fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
994fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // close the DeviceGuid on ConSplitter VirtualHandle.
995fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
996fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  gBS->CloseProtocol (
997fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        ControllerHandle,
998fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        DeviceGuid,
999fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        This->DriverBindingHandle,
1000fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        ConSplitterVirtualHandle
1001fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        );
1002fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
1003fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeffErr:
1004fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
1005fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // close the DeviceGuid on ControllerHandle.
1006fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
1007fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  gBS->CloseProtocol (
1008fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        ControllerHandle,
1009fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        DeviceGuid,
1010fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        This->DriverBindingHandle,
1011fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        ControllerHandle
1012fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        );
1013fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
1014fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  return Status;
101595276127e373f2e2fb2a208ff77267422a197d9fxgu}
101695276127e373f2e2fb2a208ff77267422a197d9fxgu
1017a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1018a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1019c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Start Console In Consplitter on device handle.
1020c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
1021fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                 Driver Binding protocol instance pointer.
1022415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle     Handle of device to bind driver to.
1023415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath  Optional parameter use to pick a specific child
1024415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                               device to start.
1025a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1026415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS          Console In Consplitter is added to ControllerHandle.
1027415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other                Console In Consplitter does not support this device.
1028a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1029a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
103095276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
103195276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
103295276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterConInDriverBindingStart (
103395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
103495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
103595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
103695276127e373f2e2fb2a208ff77267422a197d9fxgu  )
103795276127e373f2e2fb2a208ff77267422a197d9fxgu{
1038415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  EFI_STATUS                          Status;
1039415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  EFI_SIMPLE_TEXT_INPUT_PROTOCOL      *TextIn;
1040415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL   *TextInEx;
104195276127e373f2e2fb2a208ff77267422a197d9fxgu
104295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
104395276127e373f2e2fb2a208ff77267422a197d9fxgu  // Start ConSplitter on ControllerHandle, and create the virtual
104495276127e373f2e2fb2a208ff77267422a197d9fxgu  // agrogated console device on first call Start for a SimpleTextIn handle.
104595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
104695276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterStart (
104795276127e373f2e2fb2a208ff77267422a197d9fxgu            This,
104895276127e373f2e2fb2a208ff77267422a197d9fxgu            ControllerHandle,
104995276127e373f2e2fb2a208ff77267422a197d9fxgu            mConIn.VirtualHandle,
105095276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiConsoleInDeviceGuid,
105195276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimpleTextInProtocolGuid,
105295276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &TextIn
105395276127e373f2e2fb2a208ff77267422a197d9fxgu            );
105495276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
105595276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
105695276127e373f2e2fb2a208ff77267422a197d9fxgu  }
105795276127e373f2e2fb2a208ff77267422a197d9fxgu
10584b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
10594b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Add this device into Text In devices list.
10604b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
10610cadafc8822c57fe1482f8f795a920e5b31271a6qhuang  Status = ConSplitterTextInAddDevice (&mConIn, TextIn);
10620cadafc8822c57fe1482f8f795a920e5b31271a6qhuang  if (EFI_ERROR (Status)) {
10630cadafc8822c57fe1482f8f795a920e5b31271a6qhuang    return Status;
10640cadafc8822c57fe1482f8f795a920e5b31271a6qhuang  }
10650cadafc8822c57fe1482f8f795a920e5b31271a6qhuang
106666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Status = gBS->OpenProtocol (
106766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  ControllerHandle,
106866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  &gEfiSimpleTextInputExProtocolGuid,
106966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  (VOID **) &TextInEx,
107066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  This->DriverBindingHandle,
107166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  mConIn.VirtualHandle,
107266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
107366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  );
107404b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff  if (!EFI_ERROR (Status)) {
107504b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    //
107604b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    // If Simple Text Input Ex protocol exists,
107704b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    // add this device into Text In Ex devices list.
107804b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    //
107904b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    Status = ConSplitterTextInExAddDevice (&mConIn, TextInEx);
108066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
108166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
10820cadafc8822c57fe1482f8f795a920e5b31271a6qhuang  return Status;
108395276127e373f2e2fb2a208ff77267422a197d9fxgu}
108495276127e373f2e2fb2a208ff77267422a197d9fxgu
1085a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1086a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1087c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Start Simple Pointer Consplitter on device handle.
1088c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
1089fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                 Driver Binding protocol instance pointer.
1090415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle     Handle of device to bind driver to.
1091415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath  Optional parameter use to pick a specific child
1092415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                               device to start.
1093a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1094415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS          Simple Pointer Consplitter is added to ControllerHandle.
1095415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other                Simple Pointer Consplitter does not support this device.
1096a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1097a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
109895276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
109995276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
110095276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSimplePointerDriverBindingStart (
110195276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
110295276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
110395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
110495276127e373f2e2fb2a208ff77267422a197d9fxgu  )
110595276127e373f2e2fb2a208ff77267422a197d9fxgu{
110695276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                  Status;
110795276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_SIMPLE_POINTER_PROTOCOL *SimplePointer;
110895276127e373f2e2fb2a208ff77267422a197d9fxgu
11094b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
11104b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Start ConSplitter on ControllerHandle, and create the virtual
11114b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // agrogated console device on first call Start for a SimplePointer handle.
11124b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
111395276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterStart (
111495276127e373f2e2fb2a208ff77267422a197d9fxgu            This,
111595276127e373f2e2fb2a208ff77267422a197d9fxgu            ControllerHandle,
111695276127e373f2e2fb2a208ff77267422a197d9fxgu            mConIn.VirtualHandle,
111795276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimplePointerProtocolGuid,
111895276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimplePointerProtocolGuid,
111995276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &SimplePointer
112095276127e373f2e2fb2a208ff77267422a197d9fxgu            );
112195276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
112295276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
112395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
112495276127e373f2e2fb2a208ff77267422a197d9fxgu
11254b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
11264b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Add this devcie into Simple Pointer devices list.
11274b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
112895276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterSimplePointerAddDevice (&mConIn, SimplePointer);
112995276127e373f2e2fb2a208ff77267422a197d9fxgu}
113095276127e373f2e2fb2a208ff77267422a197d9fxgu
1131a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1132a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1133c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Start Absolute Pointer Consplitter on device handle.
1134c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
1135fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                 Driver Binding protocol instance pointer.
1136415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle     Handle of device to bind driver to.
1137415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath  Optional parameter use to pick a specific child
1138415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                               device to start.
1139a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1140415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS          Absolute Pointer Consplitter is added to ControllerHandle.
1141415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other                Absolute Pointer Consplitter does not support this device.
1142a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1143a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
114495276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
114595276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
11468ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianConSplitterAbsolutePointerDriverBindingStart (
11478ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
11488ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_HANDLE                      ControllerHandle,
11498ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
11508ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  )
11518ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian{
11528ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_STATUS                        Status;
11538ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_ABSOLUTE_POINTER_PROTOCOL     *AbsolutePointer;
11548ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
11554b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
11564b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Start ConSplitter on ControllerHandle, and create the virtual
11574b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // agrogated console device on first call Start for a AbsolutePointer handle.
11584b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
11598ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Status = ConSplitterStart (
11608ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             This,
11618ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             ControllerHandle,
11628ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             mConIn.VirtualHandle,
11638ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             &gEfiAbsolutePointerProtocolGuid,
11648ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             &gEfiAbsolutePointerProtocolGuid,
11658ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             (VOID **) &AbsolutePointer
11668ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             );
11677a5064ce425f85da87deaabc726945d1c980aafbvanjeff
11688ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  if (EFI_ERROR (Status)) {
11698ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    return Status;
11708ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
11718ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
11724b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
11734b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Add this devcie into Absolute Pointer devices list.
11744b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
11758ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  return ConSplitterAbsolutePointerAddDevice (&mConIn, AbsolutePointer);
11768ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian}
11778ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
1178a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1179a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1180c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Start Console Out Consplitter on device handle.
1181c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
1182fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                 Driver Binding protocol instance pointer.
1183415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle     Handle of device to bind driver to.
1184415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath  Optional parameter use to pick a specific child
1185415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                               device to start.
1186a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1187415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS          Console Out Consplitter is added to ControllerHandle.
1188415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other                Console Out Consplitter does not support this device.
1189a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1190a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
11918ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFI_STATUS
11928ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFIAPI
119395276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterConOutDriverBindingStart (
119495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
119595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
119695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
119795276127e373f2e2fb2a208ff77267422a197d9fxgu  )
119895276127e373f2e2fb2a208ff77267422a197d9fxgu{
11992da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  EFI_STATUS                           Status;
12002da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL      *TextOut;
12012da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  EFI_GRAPHICS_OUTPUT_PROTOCOL         *GraphicsOutput;
12022da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  EFI_UGA_DRAW_PROTOCOL                *UgaDraw;
12032da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                                SizeOfInfo;
12042da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
120595276127e373f2e2fb2a208ff77267422a197d9fxgu
12064b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
12074b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Start ConSplitter on ControllerHandle, and create the virtual
12084b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // agrogated console device on first call Start for a ConsoleOut handle.
12094b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
121095276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterStart (
121195276127e373f2e2fb2a208ff77267422a197d9fxgu            This,
121295276127e373f2e2fb2a208ff77267422a197d9fxgu            ControllerHandle,
121395276127e373f2e2fb2a208ff77267422a197d9fxgu            mConOut.VirtualHandle,
121495276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiConsoleOutDeviceGuid,
121595276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimpleTextOutProtocolGuid,
121695276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &TextOut
121795276127e373f2e2fb2a208ff77267422a197d9fxgu            );
121895276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
121995276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
122095276127e373f2e2fb2a208ff77267422a197d9fxgu  }
12218541adab27901906118876f1acd3555666677ff9vanjeff
12228541adab27901906118876f1acd3555666677ff9vanjeff  GraphicsOutput = NULL;
12238541adab27901906118876f1acd3555666677ff9vanjeff  UgaDraw        = NULL;
122495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
122595276127e373f2e2fb2a208ff77267422a197d9fxgu  // Try to Open Graphics Output protocol
122695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
122795276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = gBS->OpenProtocol (
122895276127e373f2e2fb2a208ff77267422a197d9fxgu                  ControllerHandle,
122995276127e373f2e2fb2a208ff77267422a197d9fxgu                  &gEfiGraphicsOutputProtocolGuid,
123095276127e373f2e2fb2a208ff77267422a197d9fxgu                  (VOID **) &GraphicsOutput,
123195276127e373f2e2fb2a208ff77267422a197d9fxgu                  This->DriverBindingHandle,
123295276127e373f2e2fb2a208ff77267422a197d9fxgu                  mConOut.VirtualHandle,
123395276127e373f2e2fb2a208ff77267422a197d9fxgu                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
123495276127e373f2e2fb2a208ff77267422a197d9fxgu                  );
12358541adab27901906118876f1acd3555666677ff9vanjeff
12368541adab27901906118876f1acd3555666677ff9vanjeff  if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {
12378541adab27901906118876f1acd3555666677ff9vanjeff    //
12384b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff    // Open UGA DRAW protocol
12398541adab27901906118876f1acd3555666677ff9vanjeff    //
12402da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    gBS->OpenProtocol (
12412da292f637e506a7cfb6bce738cb5741671d8f68vanjeff           ControllerHandle,
12422da292f637e506a7cfb6bce738cb5741671d8f68vanjeff           &gEfiUgaDrawProtocolGuid,
12432da292f637e506a7cfb6bce738cb5741671d8f68vanjeff           (VOID **) &UgaDraw,
12442da292f637e506a7cfb6bce738cb5741671d8f68vanjeff           This->DriverBindingHandle,
12452da292f637e506a7cfb6bce738cb5741671d8f68vanjeff           mConOut.VirtualHandle,
12462da292f637e506a7cfb6bce738cb5741671d8f68vanjeff           EFI_OPEN_PROTOCOL_GET_PROTOCOL
12472da292f637e506a7cfb6bce738cb5741671d8f68vanjeff           );
124895276127e373f2e2fb2a208ff77267422a197d9fxgu  }
1249189eac2199940cdc1265503ba4854ea947042424qwang
1250189eac2199940cdc1265503ba4854ea947042424qwang  //
1251189eac2199940cdc1265503ba4854ea947042424qwang  // When new console device is added, the new mode will be set later,
1252189eac2199940cdc1265503ba4854ea947042424qwang  // so put current mode back to init state.
1253189eac2199940cdc1265503ba4854ea947042424qwang  //
1254189eac2199940cdc1265503ba4854ea947042424qwang  mConOut.TextOutMode.Mode = 0xFF;
12558541adab27901906118876f1acd3555666677ff9vanjeff
125695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
125795276127e373f2e2fb2a208ff77267422a197d9fxgu  // If both ConOut and StdErr incorporate the same Text Out device,
125895276127e373f2e2fb2a208ff77267422a197d9fxgu  // their MaxMode and QueryData should be the intersection of both.
125995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
126095276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterTextOutAddDevice (&mConOut, TextOut, GraphicsOutput, UgaDraw);
126195276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterTextOutSetAttribute (&mConOut.TextOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
126295276127e373f2e2fb2a208ff77267422a197d9fxgu
12632da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  if (FeaturePcdGet (PcdConOutUgaSupport)) {
1264d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
12652da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    // Get the UGA mode data of ConOut from the current mode
1266d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    //
12672da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    if (GraphicsOutput != NULL) {
12682da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info);
12692da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      if (EFI_ERROR (Status)) {
12702da292f637e506a7cfb6bce738cb5741671d8f68vanjeff        return Status;
12712da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      }
12722da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
1273c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
12742da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      mConOut.UgaHorizontalResolution = Info->HorizontalResolution;
12752da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      mConOut.UgaVerticalResolution   = Info->VerticalResolution;
1276c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff      mConOut.UgaColorDepth           = 32;
12772da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      mConOut.UgaRefreshRate          = 60;
12782da292f637e506a7cfb6bce738cb5741671d8f68vanjeff
12792da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      FreePool (Info);
12802da292f637e506a7cfb6bce738cb5741671d8f68vanjeff
1281f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin    } else if (UgaDraw != NULL) {
12822da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      Status = UgaDraw->GetMode (
1283d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff                 UgaDraw,
1284d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff                 &mConOut.UgaHorizontalResolution,
1285d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff                 &mConOut.UgaVerticalResolution,
1286d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff                 &mConOut.UgaColorDepth,
1287d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff                 &mConOut.UgaRefreshRate
1288d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff                 );
1289d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff    }
1290d0c64728d4f5cc3502615ea0f014a8ad5269b8abvanjeff  }
12912da292f637e506a7cfb6bce738cb5741671d8f68vanjeff
129295276127e373f2e2fb2a208ff77267422a197d9fxgu  return Status;
129395276127e373f2e2fb2a208ff77267422a197d9fxgu}
129495276127e373f2e2fb2a208ff77267422a197d9fxgu
1295a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1296a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1297c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Start Standard Error Consplitter on device handle.
1298c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
1299fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This                 Driver Binding protocol instance pointer.
1300415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle     Handle of device to bind driver to.
1301415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  RemainingDevicePath  Optional parameter use to pick a specific child
1302415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                               device to start.
1303a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1304415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS          Standard Error Consplitter is added to ControllerHandle.
1305415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other                Standard Error Consplitter does not support this device.
1306a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1307a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
130895276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
130995276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
131095276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterStdErrDriverBindingStart (
131195276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
131295276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
131395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
131495276127e373f2e2fb2a208ff77267422a197d9fxgu  )
131595276127e373f2e2fb2a208ff77267422a197d9fxgu{
131695276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                       Status;
131795276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;
131895276127e373f2e2fb2a208ff77267422a197d9fxgu
13194b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
13204b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Start ConSplitter on ControllerHandle, and create the virtual
13214b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // agrogated console device on first call Start for a StandardError handle.
13224b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
132395276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterStart (
132495276127e373f2e2fb2a208ff77267422a197d9fxgu            This,
132595276127e373f2e2fb2a208ff77267422a197d9fxgu            ControllerHandle,
132695276127e373f2e2fb2a208ff77267422a197d9fxgu            mStdErr.VirtualHandle,
132795276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiStandardErrorDeviceGuid,
132895276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimpleTextOutProtocolGuid,
132995276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &TextOut
133095276127e373f2e2fb2a208ff77267422a197d9fxgu            );
133195276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
133295276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
133395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
13348541adab27901906118876f1acd3555666677ff9vanjeff
1335189eac2199940cdc1265503ba4854ea947042424qwang  //
1336189eac2199940cdc1265503ba4854ea947042424qwang  // When new console device is added, the new mode will be set later,
1337189eac2199940cdc1265503ba4854ea947042424qwang  // so put current mode back to init state.
1338189eac2199940cdc1265503ba4854ea947042424qwang  //
1339189eac2199940cdc1265503ba4854ea947042424qwang  mStdErr.TextOutMode.Mode = 0xFF;
13408541adab27901906118876f1acd3555666677ff9vanjeff
134195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
134295276127e373f2e2fb2a208ff77267422a197d9fxgu  // If both ConOut and StdErr incorporate the same Text Out device,
134395276127e373f2e2fb2a208ff77267422a197d9fxgu  // their MaxMode and QueryData should be the intersection of both.
134495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
134595276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterTextOutAddDevice (&mStdErr, TextOut, NULL, NULL);
134695276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterTextOutSetAttribute (&mStdErr.TextOut, EFI_TEXT_ATTR (EFI_MAGENTA, EFI_BLACK));
134795276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
134895276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
134995276127e373f2e2fb2a208ff77267422a197d9fxgu  }
135095276127e373f2e2fb2a208ff77267422a197d9fxgu
135195276127e373f2e2fb2a208ff77267422a197d9fxgu  return Status;
135295276127e373f2e2fb2a208ff77267422a197d9fxgu}
135395276127e373f2e2fb2a208ff77267422a197d9fxgu
1354a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1355a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1356c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  Stop ConSplitter on device handle by closing Console Device Guid on device handle
1357415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  and the console virtual handle.
1358c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
1359415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  This                      Protocol instance pointer.
1360415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle          Handle of device.
1361415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ConSplitterVirtualHandle  Console virtual Handle.
1362415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  DeviceGuid                The specified Console Device, such as ConInDev,
1363415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                                    ConOutDev.
1364415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  InterfaceGuid             The specified protocol to be opened.
1365415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Interface                 Protocol interface returned.
1366415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
1367415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS               Stop ConSplitter on ControllerHandle successfully.
1368415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other                     Failed to Stop ConSplitter on ControllerHandle.
1369a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1370a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
137195276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
137295276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterStop (
137395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
137495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
137595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ConSplitterVirtualHandle,
137695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_GUID                        *DeviceGuid,
137795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_GUID                        *InterfaceGuid,
137895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  VOID                            **Interface
137995276127e373f2e2fb2a208ff77267422a197d9fxgu  )
138095276127e373f2e2fb2a208ff77267422a197d9fxgu{
138195276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS  Status;
138295276127e373f2e2fb2a208ff77267422a197d9fxgu
138395276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = gBS->OpenProtocol (
138495276127e373f2e2fb2a208ff77267422a197d9fxgu                  ControllerHandle,
138595276127e373f2e2fb2a208ff77267422a197d9fxgu                  InterfaceGuid,
138695276127e373f2e2fb2a208ff77267422a197d9fxgu                  Interface,
138795276127e373f2e2fb2a208ff77267422a197d9fxgu                  This->DriverBindingHandle,
138895276127e373f2e2fb2a208ff77267422a197d9fxgu                  ControllerHandle,
138995276127e373f2e2fb2a208ff77267422a197d9fxgu                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
139095276127e373f2e2fb2a208ff77267422a197d9fxgu                  );
139195276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
139295276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
139395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
139495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
139595276127e373f2e2fb2a208ff77267422a197d9fxgu  // close the protocol refered.
139695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
139795276127e373f2e2fb2a208ff77267422a197d9fxgu  gBS->CloseProtocol (
139895276127e373f2e2fb2a208ff77267422a197d9fxgu        ControllerHandle,
139995276127e373f2e2fb2a208ff77267422a197d9fxgu        DeviceGuid,
140095276127e373f2e2fb2a208ff77267422a197d9fxgu        This->DriverBindingHandle,
140195276127e373f2e2fb2a208ff77267422a197d9fxgu        ConSplitterVirtualHandle
140295276127e373f2e2fb2a208ff77267422a197d9fxgu        );
14034b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff
140495276127e373f2e2fb2a208ff77267422a197d9fxgu  gBS->CloseProtocol (
140595276127e373f2e2fb2a208ff77267422a197d9fxgu        ControllerHandle,
140695276127e373f2e2fb2a208ff77267422a197d9fxgu        DeviceGuid,
140795276127e373f2e2fb2a208ff77267422a197d9fxgu        This->DriverBindingHandle,
140895276127e373f2e2fb2a208ff77267422a197d9fxgu        ControllerHandle
140995276127e373f2e2fb2a208ff77267422a197d9fxgu        );
141095276127e373f2e2fb2a208ff77267422a197d9fxgu
141195276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
141295276127e373f2e2fb2a208ff77267422a197d9fxgu}
141395276127e373f2e2fb2a208ff77267422a197d9fxgu
1414a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1415a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1416415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Stop Console In ConSplitter on ControllerHandle by closing Console In Devcice GUID.
1417a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1418fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This              Driver Binding protocol instance pointer.
1419415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle  Handle of device to stop driver on
1420415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
1421415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                            children is zero stop the entire bus driver.
1422415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ChildHandleBuffer List of Child Handles to Stop.
1423a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1424415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS       This driver is removed ControllerHandle
1425415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other             This driver was not removed from this device
1426a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1427a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
142895276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
142995276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
143095276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterConInDriverBindingStop (
143195276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
143295276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
143395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                           NumberOfChildren,
143495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      *ChildHandleBuffer
143595276127e373f2e2fb2a208ff77267422a197d9fxgu  )
143695276127e373f2e2fb2a208ff77267422a197d9fxgu{
143704b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff  EFI_STATUS                        Status;
143804b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff  EFI_SIMPLE_TEXT_INPUT_PROTOCOL    *TextIn;
143966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx;
144004b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff
144195276127e373f2e2fb2a208ff77267422a197d9fxgu  if (NumberOfChildren == 0) {
144295276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_SUCCESS;
144395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
144495276127e373f2e2fb2a208ff77267422a197d9fxgu
144566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Status = gBS->OpenProtocol (
144666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  ControllerHandle,
144766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  &gEfiSimpleTextInputExProtocolGuid,
144866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  (VOID **) &TextInEx,
144966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  This->DriverBindingHandle,
145066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  ControllerHandle,
145166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
145266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                  );
145304b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff  if (!EFI_ERROR (Status)) {
145404b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    //
145504b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    // If Simple Text Input Ex protocol exists,
145604b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    // remove device from Text Input Ex devices list.
1457c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff    //
145804b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    Status = ConSplitterTextInExDeleteDevice (&mConIn, TextInEx);
145904b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    if (EFI_ERROR (Status)) {
146004b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff      return Status;
146104b9f7631327ef09701b9ff7a86d53fa51a70b50vanjeff    }
146266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
14637a5064ce425f85da87deaabc726945d1c980aafbvanjeff
14644b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
14654b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Close Simple Text In protocol on controller handle and virtual handle.
14664b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
146795276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterStop (
146895276127e373f2e2fb2a208ff77267422a197d9fxgu            This,
146995276127e373f2e2fb2a208ff77267422a197d9fxgu            ControllerHandle,
147095276127e373f2e2fb2a208ff77267422a197d9fxgu            mConIn.VirtualHandle,
147195276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiConsoleInDeviceGuid,
147295276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimpleTextInProtocolGuid,
147395276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &TextIn
147495276127e373f2e2fb2a208ff77267422a197d9fxgu            );
147595276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
147695276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
147795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
14784b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff
147995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
14804b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Remove device from Text Input devices list.
1481c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff  //
148295276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterTextInDeleteDevice (&mConIn, TextIn);
148395276127e373f2e2fb2a208ff77267422a197d9fxgu}
148495276127e373f2e2fb2a208ff77267422a197d9fxgu
1485a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1486a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1487415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Stop Simple Pointer protocol ConSplitter on ControllerHandle by closing
1488415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Simple Pointer protocol.
1489a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1490fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This              Driver Binding protocol instance pointer.
1491415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle  Handle of device to stop driver on
1492415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
1493415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                            children is zero stop the entire bus driver.
1494415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ChildHandleBuffer List of Child Handles to Stop.
1495a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1496415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS       This driver is removed ControllerHandle
1497415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other             This driver was not removed from this device
1498a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1499a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
150095276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
150195276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
150295276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSimplePointerDriverBindingStop (
150395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
150495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
150595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                           NumberOfChildren,
150695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      *ChildHandleBuffer
150795276127e373f2e2fb2a208ff77267422a197d9fxgu  )
150895276127e373f2e2fb2a208ff77267422a197d9fxgu{
150995276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                  Status;
151095276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_SIMPLE_POINTER_PROTOCOL *SimplePointer;
151195276127e373f2e2fb2a208ff77267422a197d9fxgu
151295276127e373f2e2fb2a208ff77267422a197d9fxgu  if (NumberOfChildren == 0) {
151395276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_SUCCESS;
151495276127e373f2e2fb2a208ff77267422a197d9fxgu  }
151595276127e373f2e2fb2a208ff77267422a197d9fxgu
15164b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
15174b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Close Simple Pointer protocol on controller handle and virtual handle.
15184b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
151995276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterStop (
152095276127e373f2e2fb2a208ff77267422a197d9fxgu            This,
152195276127e373f2e2fb2a208ff77267422a197d9fxgu            ControllerHandle,
152295276127e373f2e2fb2a208ff77267422a197d9fxgu            mConIn.VirtualHandle,
152395276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimplePointerProtocolGuid,
152495276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimplePointerProtocolGuid,
152595276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &SimplePointer
152695276127e373f2e2fb2a208ff77267422a197d9fxgu            );
152795276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
152895276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
152995276127e373f2e2fb2a208ff77267422a197d9fxgu  }
15304b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff
153195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
15324b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Remove this device from Simple Pointer device list.
153395276127e373f2e2fb2a208ff77267422a197d9fxgu  //
153495276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterSimplePointerDeleteDevice (&mConIn, SimplePointer);
153595276127e373f2e2fb2a208ff77267422a197d9fxgu}
153695276127e373f2e2fb2a208ff77267422a197d9fxgu
1537a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1538a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1539415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Stop Absolute Pointer protocol ConSplitter on ControllerHandle by closing
1540415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Absolute Pointer protocol.
1541a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1542fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This              Driver Binding protocol instance pointer.
1543415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle  Handle of device to stop driver on
1544415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
1545415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                            children is zero stop the entire bus driver.
1546415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ChildHandleBuffer List of Child Handles to Stop.
1547a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1548415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS       This driver is removed ControllerHandle
1549415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other             This driver was not removed from this device
1550a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1551a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
155295276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
155395276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
15548ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianConSplitterAbsolutePointerDriverBindingStop (
15558ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
15568ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_HANDLE                      ControllerHandle,
15578ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  UINTN                           NumberOfChildren,
15588ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_HANDLE                      *ChildHandleBuffer
15598ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  )
15608ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian{
15618ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_STATUS                        Status;
15628ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_ABSOLUTE_POINTER_PROTOCOL     *AbsolutePointer;
15638ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
15648ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  if (NumberOfChildren == 0) {
15658ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    return EFI_SUCCESS;
15668ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
15678ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
15684b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
15694b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Close Absolute Pointer protocol on controller handle and virtual handle.
15704b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
15718ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Status = ConSplitterStop (
15728ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             This,
15738ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             ControllerHandle,
15748ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             mConIn.VirtualHandle,
15758ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             &gEfiAbsolutePointerProtocolGuid,
15768ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             &gEfiAbsolutePointerProtocolGuid,
15778ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             (VOID **) &AbsolutePointer
15788ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian             );
15798ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  if (EFI_ERROR (Status)) {
15808ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    return Status;
15818ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
15824b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff
15838ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
15844b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Remove this device from Absolute Pointer device list.
15858ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
15868ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  return ConSplitterAbsolutePointerDeleteDevice (&mConIn, AbsolutePointer);
15878ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian}
15888ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
1589a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1590a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1591415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Stop Console Out ConSplitter on device handle by closing Console Out Devcice GUID.
1592a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1593fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This              Driver Binding protocol instance pointer.
1594415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle  Handle of device to stop driver on
1595415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
1596415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                            children is zero stop the entire bus driver.
1597415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ChildHandleBuffer List of Child Handles to Stop.
1598a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1599415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS       This driver is removed ControllerHandle
1600415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other             This driver was not removed from this device
1601a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1602a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
16038ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFI_STATUS
16048ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFIAPI
160595276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterConOutDriverBindingStop (
160695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
160795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
160895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                           NumberOfChildren,
160995276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      *ChildHandleBuffer
161095276127e373f2e2fb2a208ff77267422a197d9fxgu  )
161195276127e373f2e2fb2a208ff77267422a197d9fxgu{
161295276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                       Status;
161395276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;
161495276127e373f2e2fb2a208ff77267422a197d9fxgu
161595276127e373f2e2fb2a208ff77267422a197d9fxgu  if (NumberOfChildren == 0) {
161695276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_SUCCESS;
161795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
161895276127e373f2e2fb2a208ff77267422a197d9fxgu
16194b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
16204b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Close Absolute Pointer protocol on controller handle and virtual handle.
16214b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
162295276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterStop (
162395276127e373f2e2fb2a208ff77267422a197d9fxgu            This,
162495276127e373f2e2fb2a208ff77267422a197d9fxgu            ControllerHandle,
162595276127e373f2e2fb2a208ff77267422a197d9fxgu            mConOut.VirtualHandle,
162695276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiConsoleOutDeviceGuid,
162795276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimpleTextOutProtocolGuid,
162895276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &TextOut
162995276127e373f2e2fb2a208ff77267422a197d9fxgu            );
163095276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
163195276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
163295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
163395276127e373f2e2fb2a208ff77267422a197d9fxgu
163495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
16354b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Remove this device from Text Out device list.
163695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
163795276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterTextOutDeleteDevice (&mConOut, TextOut);
163895276127e373f2e2fb2a208ff77267422a197d9fxgu}
163995276127e373f2e2fb2a208ff77267422a197d9fxgu
1640a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1641a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1642415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Stop Standard Error ConSplitter on ControllerHandle by closing Standard Error GUID.
1643a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1644fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  This              Driver Binding protocol instance pointer.
1645415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ControllerHandle  Handle of device to stop driver on
1646415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
1647415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff                            children is zero stop the entire bus driver.
1648415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  ChildHandleBuffer List of Child Handles to Stop.
1649a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1650415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS       This driver is removed ControllerHandle
1651415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other             This driver was not removed from this device
1652a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1653a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
165495276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
165595276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
165695276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterStdErrDriverBindingStop (
165795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
165895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      ControllerHandle,
165995276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                           NumberOfChildren,
166095276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_HANDLE                      *ChildHandleBuffer
166195276127e373f2e2fb2a208ff77267422a197d9fxgu  )
166295276127e373f2e2fb2a208ff77267422a197d9fxgu{
166395276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                       Status;
166495276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;
166595276127e373f2e2fb2a208ff77267422a197d9fxgu
166695276127e373f2e2fb2a208ff77267422a197d9fxgu  if (NumberOfChildren == 0) {
166795276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_SUCCESS;
166895276127e373f2e2fb2a208ff77267422a197d9fxgu  }
166995276127e373f2e2fb2a208ff77267422a197d9fxgu
16704b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
16714b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  // Close Standard Error Device on controller handle and virtual handle.
16724b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  //
167395276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterStop (
167495276127e373f2e2fb2a208ff77267422a197d9fxgu            This,
167595276127e373f2e2fb2a208ff77267422a197d9fxgu            ControllerHandle,
167695276127e373f2e2fb2a208ff77267422a197d9fxgu            mStdErr.VirtualHandle,
167795276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiStandardErrorDeviceGuid,
167895276127e373f2e2fb2a208ff77267422a197d9fxgu            &gEfiSimpleTextOutProtocolGuid,
167995276127e373f2e2fb2a208ff77267422a197d9fxgu            (VOID **) &TextOut
168095276127e373f2e2fb2a208ff77267422a197d9fxgu            );
168195276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
168295276127e373f2e2fb2a208ff77267422a197d9fxgu    return Status;
168395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
168495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
168595276127e373f2e2fb2a208ff77267422a197d9fxgu  // Delete this console error out device's data structures.
168695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
1687fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  return ConSplitterTextOutDeleteDevice (&mStdErr, TextOut);
168895276127e373f2e2fb2a208ff77267422a197d9fxgu}
168995276127e373f2e2fb2a208ff77267422a197d9fxgu
169095276127e373f2e2fb2a208ff77267422a197d9fxgu
1691a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1692a974619978dff4528e810f74fb736cb474db65c1niruiyu  Take the passed in Buffer of size ElementSize and grow the buffer
1693a974619978dff4528e810f74fb736cb474db65c1niruiyu  by CONSOLE_SPLITTER_ALLOC_UNIT * ElementSize bytes.
1694a974619978dff4528e810f74fb736cb474db65c1niruiyu  Copy the current data in Buffer to the new version of Buffer and
1695a974619978dff4528e810f74fb736cb474db65c1niruiyu  free the old version of buffer.
169695276127e373f2e2fb2a208ff77267422a197d9fxgu
1697a974619978dff4528e810f74fb736cb474db65c1niruiyu  @param  ElementSize              Size of element in array.
1698fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  Count                    Current number of elements in array.
1699a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Buffer                   Bigger version of passed in Buffer with all the
1700fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff                                   data.
170195276127e373f2e2fb2a208ff77267422a197d9fxgu
1702fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @retval EFI_SUCCESS              Buffer size has grown.
1703415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
170495276127e373f2e2fb2a208ff77267422a197d9fxgu
1705a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
1706a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffEFI_STATUS
1707a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffConSplitterGrowBuffer (
1708a974619978dff4528e810f74fb736cb474db65c1niruiyu  IN      UINTN                       ElementSize,
1709406ddad31b58d7a47927c3fa132657705816b65fvanjeff  IN OUT  UINTN                       *Count,
1710a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN OUT  VOID                        **Buffer
1711a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  )
171295276127e373f2e2fb2a208ff77267422a197d9fxgu{
171395276127e373f2e2fb2a208ff77267422a197d9fxgu  VOID  *Ptr;
171495276127e373f2e2fb2a208ff77267422a197d9fxgu
171595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
171695276127e373f2e2fb2a208ff77267422a197d9fxgu  // grow the buffer to new buffer size,
171795276127e373f2e2fb2a208ff77267422a197d9fxgu  // copy the old buffer's content to the new-size buffer,
171895276127e373f2e2fb2a208ff77267422a197d9fxgu  // then free the old buffer.
171995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
1720c46484952ad23fca742f8e6add49d78bda702d58mdkinney  Ptr = ReallocatePool (
1721a974619978dff4528e810f74fb736cb474db65c1niruiyu          ElementSize * (*Count),
1722a974619978dff4528e810f74fb736cb474db65c1niruiyu          ElementSize * ((*Count) + CONSOLE_SPLITTER_ALLOC_UNIT),
1723c46484952ad23fca742f8e6add49d78bda702d58mdkinney          *Buffer
1724c46484952ad23fca742f8e6add49d78bda702d58mdkinney          );
172595276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Ptr == NULL) {
172695276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
172795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
1728a974619978dff4528e810f74fb736cb474db65c1niruiyu  *Count += CONSOLE_SPLITTER_ALLOC_UNIT;
172995276127e373f2e2fb2a208ff77267422a197d9fxgu  *Buffer = Ptr;
173095276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
173195276127e373f2e2fb2a208ff77267422a197d9fxgu}
173295276127e373f2e2fb2a208ff77267422a197d9fxgu
1733a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1734a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1735415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Add Text Input Device in Consplitter Text Input list.
1736a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1737415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text In Splitter pointer.
1738415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  TextIn                   Simple Text Input protocol pointer.
1739a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1740415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Text Input Device added successfully.
1741415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
1742a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1743a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
174495276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
174595276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextInAddDevice (
174695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
174795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *TextIn
174895276127e373f2e2fb2a208ff77267422a197d9fxgu  )
174995276127e373f2e2fb2a208ff77267422a197d9fxgu{
175095276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS  Status;
175195276127e373f2e2fb2a208ff77267422a197d9fxgu
175295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
1753fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // If the Text In List is full, enlarge it by calling ConSplitterGrowBuffer().
175495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
175595276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Private->CurrentNumberOfConsoles >= Private->TextInListCount) {
175695276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = ConSplitterGrowBuffer (
175795276127e373f2e2fb2a208ff77267422a197d9fxgu              sizeof (EFI_SIMPLE_TEXT_INPUT_PROTOCOL *),
175895276127e373f2e2fb2a208ff77267422a197d9fxgu              &Private->TextInListCount,
175995276127e373f2e2fb2a208ff77267422a197d9fxgu              (VOID **) &Private->TextInList
176095276127e373f2e2fb2a208ff77267422a197d9fxgu              );
176195276127e373f2e2fb2a208ff77267422a197d9fxgu    if (EFI_ERROR (Status)) {
176295276127e373f2e2fb2a208ff77267422a197d9fxgu      return EFI_OUT_OF_RESOURCES;
176395276127e373f2e2fb2a208ff77267422a197d9fxgu    }
176495276127e373f2e2fb2a208ff77267422a197d9fxgu  }
176595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
176695276127e373f2e2fb2a208ff77267422a197d9fxgu  // Add the new text-in device data structure into the Text In List.
176795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
176895276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->TextInList[Private->CurrentNumberOfConsoles] = TextIn;
176995276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->CurrentNumberOfConsoles++;
177095276127e373f2e2fb2a208ff77267422a197d9fxgu
177195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
1772fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Extra CheckEvent added to reduce the double CheckEvent().
177395276127e373f2e2fb2a208ff77267422a197d9fxgu  //
177495276127e373f2e2fb2a208ff77267422a197d9fxgu  gBS->CheckEvent (TextIn->WaitForKey);
177595276127e373f2e2fb2a208ff77267422a197d9fxgu
177695276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
177795276127e373f2e2fb2a208ff77267422a197d9fxgu}
177895276127e373f2e2fb2a208ff77267422a197d9fxgu
1779a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1780a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1781fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Remove Text Input Device from Consplitter Text Input list.
1782a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1783415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text In Splitter pointer.
1784415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  TextIn                   Simple Text protocol pointer.
1785a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1786415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Simple Text Device removed successfully.
1787415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_NOT_FOUND            No Simple Text Device found.
1788a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1789a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
179095276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
179195276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextInDeleteDevice (
179295276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
179395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *TextIn
179495276127e373f2e2fb2a208ff77267422a197d9fxgu  )
179595276127e373f2e2fb2a208ff77267422a197d9fxgu{
179695276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN Index;
179795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
179895276127e373f2e2fb2a208ff77267422a197d9fxgu  // Remove the specified text-in device data structure from the Text In List,
179995276127e373f2e2fb2a208ff77267422a197d9fxgu  // and rearrange the remaining data structures in the Text In List.
180095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
180195276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {
180295276127e373f2e2fb2a208ff77267422a197d9fxgu    if (Private->TextInList[Index] == TextIn) {
180363e78d5254338fe4b622e3037d1291af9dcb6198andrewfish      for (; Index < Private->CurrentNumberOfConsoles - 1; Index++) {
180495276127e373f2e2fb2a208ff77267422a197d9fxgu        Private->TextInList[Index] = Private->TextInList[Index + 1];
180595276127e373f2e2fb2a208ff77267422a197d9fxgu      }
180695276127e373f2e2fb2a208ff77267422a197d9fxgu
180795276127e373f2e2fb2a208ff77267422a197d9fxgu      Private->CurrentNumberOfConsoles--;
180895276127e373f2e2fb2a208ff77267422a197d9fxgu      return EFI_SUCCESS;
180995276127e373f2e2fb2a208ff77267422a197d9fxgu    }
181095276127e373f2e2fb2a208ff77267422a197d9fxgu  }
181195276127e373f2e2fb2a208ff77267422a197d9fxgu
181295276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_NOT_FOUND;
181395276127e373f2e2fb2a208ff77267422a197d9fxgu}
181495276127e373f2e2fb2a208ff77267422a197d9fxgu
1815415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff/**
1816415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Add Text Input Ex Device in Consplitter Text Input Ex list.
1817415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
1818415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text In Splitter pointer.
1819fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param  TextInEx                 Simple Text Input Ex Input protocol pointer.
1820415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
1821415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Text Input Ex Device added successfully.
1822415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
1823415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
1824415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff**/
182595276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
182666aa04e4e3a0b84369cbb483a78c4113b619663aqhuangConSplitterTextInExAddDevice (
182766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN  TEXT_IN_SPLITTER_PRIVATE_DATA         *Private,
182866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL     *TextInEx
182966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  )
183066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang{
1831a974619978dff4528e810f74fb736cb474db65c1niruiyu  EFI_STATUS                  Status;
1832a974619978dff4528e810f74fb736cb474db65c1niruiyu  LIST_ENTRY                  *Link;
1833a974619978dff4528e810f74fb736cb474db65c1niruiyu  TEXT_IN_EX_SPLITTER_NOTIFY  *CurrentNotify;
1834a974619978dff4528e810f74fb736cb474db65c1niruiyu  UINTN                       TextInExListCount;
183566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
183666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
1837a974619978dff4528e810f74fb736cb474db65c1niruiyu  // Enlarge the NotifyHandleList and the TextInExList
183866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
183966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (Private->CurrentNumberOfExConsoles >= Private->TextInExListCount) {
1840a974619978dff4528e810f74fb736cb474db65c1niruiyu    for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
1841a974619978dff4528e810f74fb736cb474db65c1niruiyu      CurrentNotify     = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);
1842a974619978dff4528e810f74fb736cb474db65c1niruiyu      TextInExListCount = Private->TextInExListCount;
1843a974619978dff4528e810f74fb736cb474db65c1niruiyu
1844a974619978dff4528e810f74fb736cb474db65c1niruiyu      Status = ConSplitterGrowBuffer (
1845a974619978dff4528e810f74fb736cb474db65c1niruiyu                 sizeof (EFI_HANDLE),
1846a974619978dff4528e810f74fb736cb474db65c1niruiyu                 &TextInExListCount,
1847a974619978dff4528e810f74fb736cb474db65c1niruiyu                 (VOID **) &CurrentNotify->NotifyHandleList
1848a974619978dff4528e810f74fb736cb474db65c1niruiyu                 );
1849a974619978dff4528e810f74fb736cb474db65c1niruiyu      if (EFI_ERROR (Status)) {
1850a974619978dff4528e810f74fb736cb474db65c1niruiyu        return EFI_OUT_OF_RESOURCES;
1851a974619978dff4528e810f74fb736cb474db65c1niruiyu      }
1852a974619978dff4528e810f74fb736cb474db65c1niruiyu    }
185366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    Status = ConSplitterGrowBuffer (
185466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang              sizeof (EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *),
185566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang              &Private->TextInExListCount,
185666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang              (VOID **) &Private->TextInExList
185766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang              );
185866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    if (EFI_ERROR (Status)) {
185966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      return EFI_OUT_OF_RESOURCES;
186066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    }
186166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
1862a974619978dff4528e810f74fb736cb474db65c1niruiyu
1863a974619978dff4528e810f74fb736cb474db65c1niruiyu  //
1864a974619978dff4528e810f74fb736cb474db65c1niruiyu  // Register the key notify in the new text-in device
1865a974619978dff4528e810f74fb736cb474db65c1niruiyu  //
1866a974619978dff4528e810f74fb736cb474db65c1niruiyu  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
1867a974619978dff4528e810f74fb736cb474db65c1niruiyu    CurrentNotify = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);
1868a974619978dff4528e810f74fb736cb474db65c1niruiyu    Status = TextInEx->RegisterKeyNotify (
1869a974619978dff4528e810f74fb736cb474db65c1niruiyu                         TextInEx,
1870a974619978dff4528e810f74fb736cb474db65c1niruiyu                         &CurrentNotify->KeyData,
1871a974619978dff4528e810f74fb736cb474db65c1niruiyu                         CurrentNotify->KeyNotificationFn,
1872a974619978dff4528e810f74fb736cb474db65c1niruiyu                         &CurrentNotify->NotifyHandleList[Private->CurrentNumberOfExConsoles]
1873a974619978dff4528e810f74fb736cb474db65c1niruiyu                         );
1874a974619978dff4528e810f74fb736cb474db65c1niruiyu    if (EFI_ERROR (Status)) {
1875a974619978dff4528e810f74fb736cb474db65c1niruiyu      for (Link = Link->BackLink; Link != &Private->NotifyList; Link = Link->BackLink) {
1876a974619978dff4528e810f74fb736cb474db65c1niruiyu        CurrentNotify = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);
1877a974619978dff4528e810f74fb736cb474db65c1niruiyu        TextInEx->UnregisterKeyNotify (
1878a974619978dff4528e810f74fb736cb474db65c1niruiyu                    TextInEx,
1879a974619978dff4528e810f74fb736cb474db65c1niruiyu                    CurrentNotify->NotifyHandleList[Private->CurrentNumberOfExConsoles]
1880a974619978dff4528e810f74fb736cb474db65c1niruiyu                    );
1881a974619978dff4528e810f74fb736cb474db65c1niruiyu      }
1882a974619978dff4528e810f74fb736cb474db65c1niruiyu      return Status;
1883a974619978dff4528e810f74fb736cb474db65c1niruiyu    }
1884a974619978dff4528e810f74fb736cb474db65c1niruiyu  }
1885a974619978dff4528e810f74fb736cb474db65c1niruiyu
188666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
1887fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Add the new text-in device data structure into the Text Input Ex List.
188866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
188966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private->TextInExList[Private->CurrentNumberOfExConsoles] = TextInEx;
189066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private->CurrentNumberOfExConsoles++;
189166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
189266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
1893fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Extra CheckEvent added to reduce the double CheckEvent().
189466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
189566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  gBS->CheckEvent (TextInEx->WaitForKeyEx);
189666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
189766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  return EFI_SUCCESS;
189866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang}
189966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
1900415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff/**
1901fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Remove Text Ex Device from Consplitter Text Input Ex list.
1902415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
1903415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text In Splitter pointer.
1904415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  TextInEx                 Simple Text Ex protocol pointer.
1905415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
1906fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @retval EFI_SUCCESS              Simple Text Input Ex Device removed successfully.
1907fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @retval EFI_NOT_FOUND            No Simple Text Input Ex Device found.
1908415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff
1909415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff**/
191066aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFI_STATUS
191166aa04e4e3a0b84369cbb483a78c4113b619663aqhuangConSplitterTextInExDeleteDevice (
191266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN  TEXT_IN_SPLITTER_PRIVATE_DATA         *Private,
191366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL     *TextInEx
191466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  )
191566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang{
191666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  UINTN Index;
191766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
1918fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Remove the specified text-in device data structure from the Text Input Ex List,
191966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // and rearrange the remaining data structures in the Text In List.
192066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
192166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {
192266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    if (Private->TextInExList[Index] == TextInEx) {
192363e78d5254338fe4b622e3037d1291af9dcb6198andrewfish      for (; Index < Private->CurrentNumberOfExConsoles - 1; Index++) {
192466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang        Private->TextInExList[Index] = Private->TextInExList[Index + 1];
192566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      }
192666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
192766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      Private->CurrentNumberOfExConsoles--;
192866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      return EFI_SUCCESS;
192966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    }
193066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
193166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
193266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  return EFI_NOT_FOUND;
193366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang}
193466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
1935a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1936a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1937415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Add Simple Pointer Device in Consplitter Simple Pointer list.
1938a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1939415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text In Splitter pointer.
1940415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  SimplePointer            Simple Pointer protocol pointer.
1941a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1942415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Simple Pointer Device added successfully.
1943415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
1944a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1945a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
194666aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFI_STATUS
194795276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSimplePointerAddDevice (
194895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
194995276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_POINTER_PROTOCOL     *SimplePointer
195095276127e373f2e2fb2a208ff77267422a197d9fxgu  )
195195276127e373f2e2fb2a208ff77267422a197d9fxgu{
195295276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS  Status;
195395276127e373f2e2fb2a208ff77267422a197d9fxgu
195495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
1955fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // If the Simple Pointer List is full, enlarge it by calling ConSplitterGrowBuffer().
195695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
195795276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Private->CurrentNumberOfPointers >= Private->PointerListCount) {
195895276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = ConSplitterGrowBuffer (
195995276127e373f2e2fb2a208ff77267422a197d9fxgu              sizeof (EFI_SIMPLE_POINTER_PROTOCOL *),
196095276127e373f2e2fb2a208ff77267422a197d9fxgu              &Private->PointerListCount,
196195276127e373f2e2fb2a208ff77267422a197d9fxgu              (VOID **) &Private->PointerList
196295276127e373f2e2fb2a208ff77267422a197d9fxgu              );
196395276127e373f2e2fb2a208ff77267422a197d9fxgu    if (EFI_ERROR (Status)) {
196495276127e373f2e2fb2a208ff77267422a197d9fxgu      return EFI_OUT_OF_RESOURCES;
196595276127e373f2e2fb2a208ff77267422a197d9fxgu    }
196695276127e373f2e2fb2a208ff77267422a197d9fxgu  }
196795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
1968fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Add the new text-in device data structure into the Simple Pointer List.
196995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
197095276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->PointerList[Private->CurrentNumberOfPointers] = SimplePointer;
197195276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->CurrentNumberOfPointers++;
1972fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
197395276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
197495276127e373f2e2fb2a208ff77267422a197d9fxgu}
197595276127e373f2e2fb2a208ff77267422a197d9fxgu
1976a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1977a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
1978fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Remove Simple Pointer Device from Consplitter Simple Pointer list.
1979a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1980415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text In Splitter pointer.
1981415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  SimplePointer            Simple Pointer protocol pointer.
1982a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1983415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Simple Pointer Device removed successfully.
1984415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_NOT_FOUND            No Simple Pointer Device found.
1985a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
1986a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
198795276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
198895276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSimplePointerDeleteDevice (
198995276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
199095276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_POINTER_PROTOCOL     *SimplePointer
199195276127e373f2e2fb2a208ff77267422a197d9fxgu  )
199295276127e373f2e2fb2a208ff77267422a197d9fxgu{
199395276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN Index;
199495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
1995fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Remove the specified text-in device data structure from the Simple Pointer List,
199695276127e373f2e2fb2a208ff77267422a197d9fxgu  // and rearrange the remaining data structures in the Text In List.
199795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
199895276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0; Index < Private->CurrentNumberOfPointers; Index++) {
199995276127e373f2e2fb2a208ff77267422a197d9fxgu    if (Private->PointerList[Index] == SimplePointer) {
200063e78d5254338fe4b622e3037d1291af9dcb6198andrewfish      for (; Index < Private->CurrentNumberOfPointers - 1; Index++) {
200195276127e373f2e2fb2a208ff77267422a197d9fxgu        Private->PointerList[Index] = Private->PointerList[Index + 1];
200295276127e373f2e2fb2a208ff77267422a197d9fxgu      }
200395276127e373f2e2fb2a208ff77267422a197d9fxgu
200495276127e373f2e2fb2a208ff77267422a197d9fxgu      Private->CurrentNumberOfPointers--;
200595276127e373f2e2fb2a208ff77267422a197d9fxgu      return EFI_SUCCESS;
200695276127e373f2e2fb2a208ff77267422a197d9fxgu    }
200795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
200895276127e373f2e2fb2a208ff77267422a197d9fxgu
200995276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_NOT_FOUND;
201095276127e373f2e2fb2a208ff77267422a197d9fxgu}
201195276127e373f2e2fb2a208ff77267422a197d9fxgu
2012a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2013a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
2014415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Add Absolute Pointer Device in Consplitter Absolute Pointer list.
2015a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2016415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text In Splitter pointer.
2017415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  AbsolutePointer          Absolute Pointer protocol pointer.
2018a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2019415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Absolute Pointer Device added successfully.
2020415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
2021a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2022a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
20238ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFI_STATUS
20248ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianConSplitterAbsolutePointerAddDevice (
20258ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  TEXT_IN_SPLITTER_PRIVATE_DATA     *Private,
20268ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_ABSOLUTE_POINTER_PROTOCOL     *AbsolutePointer
20278ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  )
20288ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian{
20298ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_STATUS  Status;
20308ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
20318ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
2032fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // If the Absolute Pointer List is full, enlarge it by calling ConSplitterGrowBuffer().
20338ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
20348ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  if (Private->CurrentNumberOfAbsolutePointers >= Private->AbsolutePointerListCount) {
20358ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    Status = ConSplitterGrowBuffer (
20368ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian              sizeof (EFI_ABSOLUTE_POINTER_PROTOCOL *),
20378ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian              &Private->AbsolutePointerListCount,
20388ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian              (VOID **) &Private->AbsolutePointerList
20398ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian              );
20408ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    if (EFI_ERROR (Status)) {
20418ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      return EFI_OUT_OF_RESOURCES;
20428ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    }
20438ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
20448ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
2045fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Add the new text-in device data structure into the Absolute Pointer List.
20468ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
20478ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Private->AbsolutePointerList[Private->CurrentNumberOfAbsolutePointers] = AbsolutePointer;
20488ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Private->CurrentNumberOfAbsolutePointers++;
2049fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
20508ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  return EFI_SUCCESS;
20518ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian}
20528ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
2053a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2054a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
2055fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Remove Absolute Pointer Device from Consplitter Absolute Pointer list.
2056a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2057415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text In Splitter pointer.
2058415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  AbsolutePointer          Absolute Pointer protocol pointer.
2059a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2060415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Absolute Pointer Device removed successfully.
2061415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_NOT_FOUND            No Absolute Pointer Device found.
2062a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2063a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
20648ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFI_STATUS
20658ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianConSplitterAbsolutePointerDeleteDevice (
20668ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  TEXT_IN_SPLITTER_PRIVATE_DATA     *Private,
20678ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN  EFI_ABSOLUTE_POINTER_PROTOCOL     *AbsolutePointer
20688ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  )
20698ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian{
20708ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  UINTN Index;
20718ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
2072fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Remove the specified text-in device data structure from the Absolute Pointer List,
2073fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // and rearrange the remaining data structures from the Absolute Pointer List.
20748ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
20758ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  for (Index = 0; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {
20768ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    if (Private->AbsolutePointerList[Index] == AbsolutePointer) {
207763e78d5254338fe4b622e3037d1291af9dcb6198andrewfish      for (; Index < Private->CurrentNumberOfAbsolutePointers - 1; Index++) {
20788ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian        Private->AbsolutePointerList[Index] = Private->AbsolutePointerList[Index + 1];
20798ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      }
20808ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
20818ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      Private->CurrentNumberOfAbsolutePointers--;
20828ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      return EFI_SUCCESS;
20838ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    }
20848ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
20858ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
20868ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  return EFI_NOT_FOUND;
20878ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian}
20888ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
208933019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff/**
209033019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  Reallocate Text Out mode map.
209133019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff
2092fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Allocate new buffer and copy original buffer into the new buffer.
2093fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
209433019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Private                  Consplitter Text Out pointer.
209533019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff
209633019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @retval EFI_SUCCESS              Buffer size has grown
209733019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
209833019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff
209933019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff**/
2100a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffEFI_STATUS
2101a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffConSplitterGrowMapTable (
2102a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private
2103a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  )
210495276127e373f2e2fb2a208ff77267422a197d9fxgu{
210595276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN Size;
210695276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN NewSize;
210795276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN TotalSize;
210895276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 *TextOutModeMap;
210995276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 *OldTextOutModeMap;
211095276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 *SrcAddress;
211195276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 Index;
211224ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin  UINTN OldStepSize;
211324ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin  UINTN NewStepSize;
211495276127e373f2e2fb2a208ff77267422a197d9fxgu
211595276127e373f2e2fb2a208ff77267422a197d9fxgu  NewSize           = Private->TextOutListCount * sizeof (INT32);
211695276127e373f2e2fb2a208ff77267422a197d9fxgu  OldTextOutModeMap = Private->TextOutModeMap;
2117fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  TotalSize         = NewSize * (Private->TextOutQueryDataCount);
211895276127e373f2e2fb2a208ff77267422a197d9fxgu
2119fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
2120fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // Allocate new buffer for Text Out List.
2121fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  //
2122fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  TextOutModeMap    = AllocatePool (TotalSize);
212395276127e373f2e2fb2a208ff77267422a197d9fxgu  if (TextOutModeMap == NULL) {
212495276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
212595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
212695276127e373f2e2fb2a208ff77267422a197d9fxgu
212795276127e373f2e2fb2a208ff77267422a197d9fxgu  SetMem (TextOutModeMap, TotalSize, 0xFF);
212895276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->TextOutModeMap = TextOutModeMap;
212995276127e373f2e2fb2a208ff77267422a197d9fxgu
213095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
213195276127e373f2e2fb2a208ff77267422a197d9fxgu  // If TextOutList has been enlarged, need to realloc the mode map table
213295276127e373f2e2fb2a208ff77267422a197d9fxgu  // The mode map table is regarded as a two dimension array.
213395276127e373f2e2fb2a208ff77267422a197d9fxgu  //
213495276127e373f2e2fb2a208ff77267422a197d9fxgu  //                         Old                    New
213595276127e373f2e2fb2a208ff77267422a197d9fxgu  //  0   ---------> TextOutListCount ----> TextOutListCount
213695276127e373f2e2fb2a208ff77267422a197d9fxgu  //  |   -------------------------------------------
213795276127e373f2e2fb2a208ff77267422a197d9fxgu  //  |  |                    |                      |
213895276127e373f2e2fb2a208ff77267422a197d9fxgu  //  |  |                    |                      |
213995276127e373f2e2fb2a208ff77267422a197d9fxgu  //  |  |                    |                      |
214095276127e373f2e2fb2a208ff77267422a197d9fxgu  //  |  |                    |                      |
214195276127e373f2e2fb2a208ff77267422a197d9fxgu  //  |  |                    |                      |
214295276127e373f2e2fb2a208ff77267422a197d9fxgu  // \/  |                    |                      |
214395276127e373f2e2fb2a208ff77267422a197d9fxgu  //      -------------------------------------------
214495276127e373f2e2fb2a208ff77267422a197d9fxgu  // QueryDataCount
214595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
214695276127e373f2e2fb2a208ff77267422a197d9fxgu  if (OldTextOutModeMap != NULL) {
214795276127e373f2e2fb2a208ff77267422a197d9fxgu
214895276127e373f2e2fb2a208ff77267422a197d9fxgu    Size        = Private->CurrentNumberOfConsoles * sizeof (INT32);
214995276127e373f2e2fb2a208ff77267422a197d9fxgu    Index       = 0;
215095276127e373f2e2fb2a208ff77267422a197d9fxgu    SrcAddress  = OldTextOutModeMap;
215124ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin    NewStepSize = NewSize / sizeof(INT32);
215224ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin    // If Private->CurrentNumberOfConsoles is not zero and OldTextOutModeMap
215324ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin    // is not NULL, it indicates that the original TextOutModeMap is not enough
215424ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin    // for the new console devices and has been enlarged by CONSOLE_SPLITTER_ALLOC_UNIT columns.
215524ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin    //
215624ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin    OldStepSize = NewStepSize - CONSOLE_SPLITTER_ALLOC_UNIT;
215795276127e373f2e2fb2a208ff77267422a197d9fxgu
215895276127e373f2e2fb2a208ff77267422a197d9fxgu    //
215995276127e373f2e2fb2a208ff77267422a197d9fxgu    // Copy the old data to the new one
216095276127e373f2e2fb2a208ff77267422a197d9fxgu    //
216195276127e373f2e2fb2a208ff77267422a197d9fxgu    while (Index < Private->TextOutMode.MaxMode) {
216295276127e373f2e2fb2a208ff77267422a197d9fxgu      CopyMem (TextOutModeMap, SrcAddress, Size);
216324ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin      //
216424ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin      // Go to next row of new TextOutModeMap.
216524ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin      //
216624ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin      TextOutModeMap += NewStepSize;
216724ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin      //
216824ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin      // Go to next row of old TextOutModeMap.
216924ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin      //
217024ee1ccaf8310dd4f0bf591de7b71175cad5c865li-elvin      SrcAddress += OldStepSize;
217195276127e373f2e2fb2a208ff77267422a197d9fxgu      Index++;
217295276127e373f2e2fb2a208ff77267422a197d9fxgu    }
217395276127e373f2e2fb2a208ff77267422a197d9fxgu    //
217495276127e373f2e2fb2a208ff77267422a197d9fxgu    // Free the old buffer
217595276127e373f2e2fb2a208ff77267422a197d9fxgu    //
217695276127e373f2e2fb2a208ff77267422a197d9fxgu    FreePool (OldTextOutModeMap);
217795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
217895276127e373f2e2fb2a208ff77267422a197d9fxgu
217995276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
218095276127e373f2e2fb2a208ff77267422a197d9fxgu}
218195276127e373f2e2fb2a208ff77267422a197d9fxgu
2182a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2183a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
2184fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  Add new device's output mode to console splitter's mode list.
2185a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2186415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private               Text Out Splitter pointer
2187415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  TextOut               Simple Text Output protocol pointer.
2188c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
2189415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS           Device added successfully.
2190415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES  Could not grow the buffer size.
2191a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2192a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
219395276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
219495276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterAddOutputMode (
219595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA     *Private,
219695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *TextOut
219795276127e373f2e2fb2a208ff77267422a197d9fxgu  )
219895276127e373f2e2fb2a208ff77267422a197d9fxgu{
219995276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS  Status;
220095276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32       MaxMode;
220195276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32       Mode;
220295276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN       Index;
220395276127e373f2e2fb2a208ff77267422a197d9fxgu
220495276127e373f2e2fb2a208ff77267422a197d9fxgu  MaxMode                       = TextOut->Mode->MaxMode;
220595276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->TextOutMode.MaxMode  = MaxMode;
220695276127e373f2e2fb2a208ff77267422a197d9fxgu
220795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
220895276127e373f2e2fb2a208ff77267422a197d9fxgu  // Grow the buffer if query data buffer is not large enough to
220995276127e373f2e2fb2a208ff77267422a197d9fxgu  // hold all the mode supported by the first console.
221095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
221195276127e373f2e2fb2a208ff77267422a197d9fxgu  while (MaxMode > (INT32) Private->TextOutQueryDataCount) {
221295276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = ConSplitterGrowBuffer (
221395276127e373f2e2fb2a208ff77267422a197d9fxgu              sizeof (TEXT_OUT_SPLITTER_QUERY_DATA),
221495276127e373f2e2fb2a208ff77267422a197d9fxgu              &Private->TextOutQueryDataCount,
221595276127e373f2e2fb2a208ff77267422a197d9fxgu              (VOID **) &Private->TextOutQueryData
221695276127e373f2e2fb2a208ff77267422a197d9fxgu              );
221795276127e373f2e2fb2a208ff77267422a197d9fxgu    if (EFI_ERROR (Status)) {
221895276127e373f2e2fb2a208ff77267422a197d9fxgu      return EFI_OUT_OF_RESOURCES;
221995276127e373f2e2fb2a208ff77267422a197d9fxgu    }
222095276127e373f2e2fb2a208ff77267422a197d9fxgu  }
222195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
222295276127e373f2e2fb2a208ff77267422a197d9fxgu  // Allocate buffer for the output mode map
222395276127e373f2e2fb2a208ff77267422a197d9fxgu  //
222495276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterGrowMapTable (Private);
222595276127e373f2e2fb2a208ff77267422a197d9fxgu  if (EFI_ERROR (Status)) {
222695276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
222795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
222895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
222995276127e373f2e2fb2a208ff77267422a197d9fxgu  // As the first textout device, directly add the mode in to QueryData
223095276127e373f2e2fb2a208ff77267422a197d9fxgu  // and at the same time record the mapping between QueryData and TextOut.
223195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
223295276127e373f2e2fb2a208ff77267422a197d9fxgu  Mode  = 0;
223395276127e373f2e2fb2a208ff77267422a197d9fxgu  Index = 0;
223495276127e373f2e2fb2a208ff77267422a197d9fxgu  while (Mode < MaxMode) {
22357347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    Status = TextOut->QueryMode (
22367347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff                  TextOut,
22377347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff                  Mode,
22387347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff                  &Private->TextOutQueryData[Mode].Columns,
22397347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff                  &Private->TextOutQueryData[Mode].Rows
22407347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff                  );
22417347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    //
22427347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    // If mode 1 (80x50) is not supported, make sure mode 1 in TextOutQueryData
22437347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    // is clear to 0x0.
22447347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    //
22457347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    if ((EFI_ERROR(Status)) && (Mode == 1)) {
22467347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff      Private->TextOutQueryData[Mode].Columns = 0;
22477347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff      Private->TextOutQueryData[Mode].Rows = 0;
22487347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    }
224995276127e373f2e2fb2a208ff77267422a197d9fxgu    Private->TextOutModeMap[Index] = Mode;
225095276127e373f2e2fb2a208ff77267422a197d9fxgu    Mode++;
225195276127e373f2e2fb2a208ff77267422a197d9fxgu    Index += Private->TextOutListCount;
225295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
225395276127e373f2e2fb2a208ff77267422a197d9fxgu
225495276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
225595276127e373f2e2fb2a208ff77267422a197d9fxgu}
225695276127e373f2e2fb2a208ff77267422a197d9fxgu
22577347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff/**
22589e604fe42d90c05adb08cf86bc1843c436f523dcvanjeff  Reconstruct TextOutModeMap to get intersection of modes.
22597347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff
22607347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  This routine reconstruct TextOutModeMap to get the intersection
22617347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  of modes for all console out devices. Because EFI/UEFI spec require
22627347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  mode 0 is 80x25, mode 1 is 80x50, this routine will not check the
22637347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  intersection for mode 0 and mode 1.
22647347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff
2265a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param TextOutModeMap  Current text out mode map, begin with the mode 80x25
2266a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param NewlyAddedMap   New text out mode map, begin with the mode 80x25
2267a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param MapStepSize     Mode step size for one console device
2268fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param NewMapStepSize  New Mode step size for one console device
2269fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param MaxMode         IN: Current max text mode, OUT: Updated max text mode.
2270fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  @param CurrentMode     IN: Current text mode,     OUT: Updated current text mode.
22717347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff
22727347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff**/
227395276127e373f2e2fb2a208ff77267422a197d9fxguVOID
227495276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterGetIntersection (
2275fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  IN     INT32                        *TextOutModeMap,
2276fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  IN     INT32                        *NewlyAddedMap,
2277fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  IN     UINTN                        MapStepSize,
2278fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  IN     UINTN                        NewMapStepSize,
2279fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  IN OUT INT32                        *MaxMode,
2280fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  IN OUT INT32                        *CurrentMode
228195276127e373f2e2fb2a208ff77267422a197d9fxgu  )
228295276127e373f2e2fb2a208ff77267422a197d9fxgu{
228395276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 Index;
228495276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 *CurrentMapEntry;
228595276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 *NextMapEntry;
2286fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  INT32 *NewMapEntry;
228795276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 CurrentMaxMode;
228895276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32 Mode;
228995276127e373f2e2fb2a208ff77267422a197d9fxgu
22907347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  //
22917347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  // According to EFI/UEFI spec, mode 0 and mode 1 have been reserved
22927347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  // for 80x25 and 80x50 in Simple Text Out protocol, so don't make intersection
22937347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  // for mode 0 and mode 1, mode number starts from 2.
22947347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  //
22957347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  Index           = 2;
22967347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  CurrentMapEntry = &TextOutModeMap[MapStepSize * 2];
2297fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  NextMapEntry    = CurrentMapEntry;
2298fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  NewMapEntry     = &NewlyAddedMap[NewMapStepSize * 2];
22997347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff
230095276127e373f2e2fb2a208ff77267422a197d9fxgu  CurrentMaxMode  = *MaxMode;
230195276127e373f2e2fb2a208ff77267422a197d9fxgu  Mode            = *CurrentMode;
230295276127e373f2e2fb2a208ff77267422a197d9fxgu
230395276127e373f2e2fb2a208ff77267422a197d9fxgu  while (Index < CurrentMaxMode) {
2304fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    if (*NewMapEntry == -1) {
230595276127e373f2e2fb2a208ff77267422a197d9fxgu      //
230695276127e373f2e2fb2a208ff77267422a197d9fxgu      // This mode is not supported any more. Remove it. Special care
230795276127e373f2e2fb2a208ff77267422a197d9fxgu      // must be taken as this remove will also affect current mode;
230895276127e373f2e2fb2a208ff77267422a197d9fxgu      //
230995276127e373f2e2fb2a208ff77267422a197d9fxgu      if (Index == *CurrentMode) {
231095276127e373f2e2fb2a208ff77267422a197d9fxgu        Mode = -1;
231195276127e373f2e2fb2a208ff77267422a197d9fxgu      } else if (Index < *CurrentMode) {
231295276127e373f2e2fb2a208ff77267422a197d9fxgu        Mode--;
231395276127e373f2e2fb2a208ff77267422a197d9fxgu      }
231495276127e373f2e2fb2a208ff77267422a197d9fxgu      (*MaxMode)--;
231595276127e373f2e2fb2a208ff77267422a197d9fxgu    } else {
231695276127e373f2e2fb2a208ff77267422a197d9fxgu      if (CurrentMapEntry != NextMapEntry) {
231795276127e373f2e2fb2a208ff77267422a197d9fxgu        CopyMem (NextMapEntry, CurrentMapEntry, MapStepSize * sizeof (INT32));
231895276127e373f2e2fb2a208ff77267422a197d9fxgu      }
231995276127e373f2e2fb2a208ff77267422a197d9fxgu
232095276127e373f2e2fb2a208ff77267422a197d9fxgu      NextMapEntry += MapStepSize;
232195276127e373f2e2fb2a208ff77267422a197d9fxgu    }
232295276127e373f2e2fb2a208ff77267422a197d9fxgu
232395276127e373f2e2fb2a208ff77267422a197d9fxgu    CurrentMapEntry += MapStepSize;
2324fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    NewMapEntry     += NewMapStepSize;
232595276127e373f2e2fb2a208ff77267422a197d9fxgu    Index++;
232695276127e373f2e2fb2a208ff77267422a197d9fxgu  }
232795276127e373f2e2fb2a208ff77267422a197d9fxgu
232895276127e373f2e2fb2a208ff77267422a197d9fxgu  *CurrentMode = Mode;
232995276127e373f2e2fb2a208ff77267422a197d9fxgu
233095276127e373f2e2fb2a208ff77267422a197d9fxgu  return ;
233195276127e373f2e2fb2a208ff77267422a197d9fxgu}
233295276127e373f2e2fb2a208ff77267422a197d9fxgu
2333a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
23342da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  Sync the device's output mode to console splitter's mode list.
2335a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
233633019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Private               Text Out Splitter pointer.
2337415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  TextOut               Simple Text Output protocol pointer.
2338c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
2339a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
234095276127e373f2e2fb2a208ff77267422a197d9fxguVOID
234195276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSyncOutputMode (
234295276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA     *Private,
234395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *TextOut
234495276127e373f2e2fb2a208ff77267422a197d9fxgu  )
234595276127e373f2e2fb2a208ff77267422a197d9fxgu{
234695276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         CurrentMaxMode;
234795276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         Mode;
234895276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         Index;
234995276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         *TextOutModeMap;
235095276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         *MapTable;
23513012ce5cf75f938a79c70568595454e27b2f014avanjeff  INT32                         QueryMode;
235295276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_QUERY_DATA  *TextOutQueryData;
235395276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         Rows;
235495276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         Columns;
235595276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         StepSize;
23567347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff  EFI_STATUS                    Status;
235795276127e373f2e2fb2a208ff77267422a197d9fxgu
235895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
235995276127e373f2e2fb2a208ff77267422a197d9fxgu  // Must make sure that current mode won't change even if mode number changes
236095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
236195276127e373f2e2fb2a208ff77267422a197d9fxgu  CurrentMaxMode    = Private->TextOutMode.MaxMode;
236295276127e373f2e2fb2a208ff77267422a197d9fxgu  TextOutModeMap    = Private->TextOutModeMap;
236395276127e373f2e2fb2a208ff77267422a197d9fxgu  StepSize          = Private->TextOutListCount;
236495276127e373f2e2fb2a208ff77267422a197d9fxgu  TextOutQueryData  = Private->TextOutQueryData;
236595276127e373f2e2fb2a208ff77267422a197d9fxgu
236695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
236795276127e373f2e2fb2a208ff77267422a197d9fxgu  // Query all the mode that the newly added TextOut supports
236895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
236995276127e373f2e2fb2a208ff77267422a197d9fxgu  Mode      = 0;
237095276127e373f2e2fb2a208ff77267422a197d9fxgu  MapTable  = TextOutModeMap + Private->CurrentNumberOfConsoles;
237195276127e373f2e2fb2a208ff77267422a197d9fxgu  while (Mode < TextOut->Mode->MaxMode) {
23727347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    Status = TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);
2373fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
23747347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    if (EFI_ERROR(Status)) {
23757347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff      if (Mode == 1) {
2376fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        //
2377fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        // If mode 1 (80x50) is not supported, make sure mode 1 in TextOutQueryData
2378fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        // is clear to 0x0.
2379fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        //
23803012ce5cf75f938a79c70568595454e27b2f014avanjeff        MapTable[StepSize] = Mode;
23817347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff        TextOutQueryData[Mode].Columns = 0;
23827347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff        TextOutQueryData[Mode].Rows = 0;
23837347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff      }
23847347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff      Mode++;
23857347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff      continue;
23867347d5d6e62ddd214f6bee9dbf8074a11015ece5vanjeff    }
238795276127e373f2e2fb2a208ff77267422a197d9fxgu    //
23883012ce5cf75f938a79c70568595454e27b2f014avanjeff    // Search the intersection map and QueryData database to see if they intersects
238995276127e373f2e2fb2a208ff77267422a197d9fxgu    //
239095276127e373f2e2fb2a208ff77267422a197d9fxgu    Index = 0;
239195276127e373f2e2fb2a208ff77267422a197d9fxgu    while (Index < CurrentMaxMode) {
23923012ce5cf75f938a79c70568595454e27b2f014avanjeff      QueryMode = *(TextOutModeMap + Index * StepSize);
23933012ce5cf75f938a79c70568595454e27b2f014avanjeff      if ((TextOutQueryData[QueryMode].Rows == Rows) && (TextOutQueryData[QueryMode].Columns == Columns)) {
239495276127e373f2e2fb2a208ff77267422a197d9fxgu        MapTable[Index * StepSize] = Mode;
239595276127e373f2e2fb2a208ff77267422a197d9fxgu        break;
239695276127e373f2e2fb2a208ff77267422a197d9fxgu      }
239795276127e373f2e2fb2a208ff77267422a197d9fxgu      Index++;
239895276127e373f2e2fb2a208ff77267422a197d9fxgu    }
239995276127e373f2e2fb2a208ff77267422a197d9fxgu    Mode++;
240095276127e373f2e2fb2a208ff77267422a197d9fxgu  }
240195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
240295276127e373f2e2fb2a208ff77267422a197d9fxgu  // Now search the TextOutModeMap table to find the intersection of supported
240395276127e373f2e2fb2a208ff77267422a197d9fxgu  // mode between ConSplitter and the newly added device.
240495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
240595276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterGetIntersection (
240695276127e373f2e2fb2a208ff77267422a197d9fxgu    TextOutModeMap,
240795276127e373f2e2fb2a208ff77267422a197d9fxgu    MapTable,
240895276127e373f2e2fb2a208ff77267422a197d9fxgu    StepSize,
240995276127e373f2e2fb2a208ff77267422a197d9fxgu    StepSize,
241095276127e373f2e2fb2a208ff77267422a197d9fxgu    &Private->TextOutMode.MaxMode,
241195276127e373f2e2fb2a208ff77267422a197d9fxgu    &Private->TextOutMode.Mode
241295276127e373f2e2fb2a208ff77267422a197d9fxgu    );
241395276127e373f2e2fb2a208ff77267422a197d9fxgu
241495276127e373f2e2fb2a208ff77267422a197d9fxgu  return ;
241595276127e373f2e2fb2a208ff77267422a197d9fxgu}
241695276127e373f2e2fb2a208ff77267422a197d9fxgu
241795276127e373f2e2fb2a208ff77267422a197d9fxgu
2418a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
2419415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Sync output device between ConOut and StdErr output.
242095276127e373f2e2fb2a208ff77267422a197d9fxgu
2421415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Sync implemented successfully.
2422415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
242395276127e373f2e2fb2a208ff77267422a197d9fxgu
2424a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
2425a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffEFI_STATUS
2426a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffConSplitterGetIntersectionBetweenConOutAndStrErr (
2427a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  VOID
2428a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  )
242995276127e373f2e2fb2a208ff77267422a197d9fxgu{
243095276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         ConOutNumOfConsoles;
243195276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         StdErrNumOfConsoles;
243295276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_AND_GOP_DATA         *ConOutTextOutList;
243395276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_AND_GOP_DATA         *StdErrTextOutList;
243495276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         Indexi;
243595276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         Indexj;
24363012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINTN                         ConOutRows;
24373012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINTN                         ConOutColumns;
24383012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINTN                         StdErrRows;
24393012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINTN                         StdErrColumns;
244095276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         ConOutMaxMode;
244195276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         StdErrMaxMode;
24423012ce5cf75f938a79c70568595454e27b2f014avanjeff  INT32                         ConOutMode;
24433012ce5cf75f938a79c70568595454e27b2f014avanjeff  INT32                         StdErrMode;
244495276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         Mode;
244595276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         Index;
244695276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         *ConOutModeMap;
244795276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         *StdErrModeMap;
244895276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         *ConOutMapTable;
244995276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                         *StdErrMapTable;
245095276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_QUERY_DATA  *ConOutQueryData;
245195276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_QUERY_DATA  *StdErrQueryData;
24523012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINTN                         ConOutStepSize;
24533012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINTN                         StdErrStepSize;
245495276127e373f2e2fb2a208ff77267422a197d9fxgu  BOOLEAN                       FoundTheSameTextOut;
245595276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         ConOutMapTableSize;
245695276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         StdErrMapTableSize;
245795276127e373f2e2fb2a208ff77267422a197d9fxgu
245895276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutNumOfConsoles = mConOut.CurrentNumberOfConsoles;
245995276127e373f2e2fb2a208ff77267422a197d9fxgu  StdErrNumOfConsoles = mStdErr.CurrentNumberOfConsoles;
246095276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutTextOutList   = mConOut.TextOutList;
246195276127e373f2e2fb2a208ff77267422a197d9fxgu  StdErrTextOutList   = mStdErr.TextOutList;
246295276127e373f2e2fb2a208ff77267422a197d9fxgu
246395276127e373f2e2fb2a208ff77267422a197d9fxgu  Indexi              = 0;
246495276127e373f2e2fb2a208ff77267422a197d9fxgu  FoundTheSameTextOut = FALSE;
246595276127e373f2e2fb2a208ff77267422a197d9fxgu  while ((Indexi < ConOutNumOfConsoles) && (!FoundTheSameTextOut)) {
246695276127e373f2e2fb2a208ff77267422a197d9fxgu    Indexj = 0;
246795276127e373f2e2fb2a208ff77267422a197d9fxgu    while (Indexj < StdErrNumOfConsoles) {
246895276127e373f2e2fb2a208ff77267422a197d9fxgu      if (ConOutTextOutList->TextOut == StdErrTextOutList->TextOut) {
246995276127e373f2e2fb2a208ff77267422a197d9fxgu        FoundTheSameTextOut = TRUE;
247095276127e373f2e2fb2a208ff77267422a197d9fxgu        break;
247195276127e373f2e2fb2a208ff77267422a197d9fxgu      }
247295276127e373f2e2fb2a208ff77267422a197d9fxgu
247395276127e373f2e2fb2a208ff77267422a197d9fxgu      Indexj++;
247495276127e373f2e2fb2a208ff77267422a197d9fxgu      StdErrTextOutList++;
247595276127e373f2e2fb2a208ff77267422a197d9fxgu    }
247695276127e373f2e2fb2a208ff77267422a197d9fxgu
247795276127e373f2e2fb2a208ff77267422a197d9fxgu    Indexi++;
247895276127e373f2e2fb2a208ff77267422a197d9fxgu    ConOutTextOutList++;
247995276127e373f2e2fb2a208ff77267422a197d9fxgu  }
248095276127e373f2e2fb2a208ff77267422a197d9fxgu
248195276127e373f2e2fb2a208ff77267422a197d9fxgu  if (!FoundTheSameTextOut) {
248295276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_SUCCESS;
248395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
248495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
248595276127e373f2e2fb2a208ff77267422a197d9fxgu  // Must make sure that current mode won't change even if mode number changes
248695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
248795276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutMaxMode     = mConOut.TextOutMode.MaxMode;
248895276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutModeMap     = mConOut.TextOutModeMap;
24893012ce5cf75f938a79c70568595454e27b2f014avanjeff  ConOutStepSize    = mConOut.TextOutListCount;
249095276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutQueryData   = mConOut.TextOutQueryData;
249195276127e373f2e2fb2a208ff77267422a197d9fxgu
249295276127e373f2e2fb2a208ff77267422a197d9fxgu  StdErrMaxMode     = mStdErr.TextOutMode.MaxMode;
249395276127e373f2e2fb2a208ff77267422a197d9fxgu  StdErrModeMap     = mStdErr.TextOutModeMap;
24943012ce5cf75f938a79c70568595454e27b2f014avanjeff  StdErrStepSize    = mStdErr.TextOutListCount;
249595276127e373f2e2fb2a208ff77267422a197d9fxgu  StdErrQueryData   = mStdErr.TextOutQueryData;
249695276127e373f2e2fb2a208ff77267422a197d9fxgu
249795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
249895276127e373f2e2fb2a208ff77267422a197d9fxgu  // Allocate the map table and set the map table's index to -1.
249995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
250095276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutMapTableSize  = ConOutMaxMode * sizeof (INT32);
250195276127e373f2e2fb2a208ff77267422a197d9fxgu  ConOutMapTable      = AllocateZeroPool (ConOutMapTableSize);
250295276127e373f2e2fb2a208ff77267422a197d9fxgu  if (ConOutMapTable == NULL) {
250395276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
250495276127e373f2e2fb2a208ff77267422a197d9fxgu  }
250595276127e373f2e2fb2a208ff77267422a197d9fxgu
250695276127e373f2e2fb2a208ff77267422a197d9fxgu  SetMem (ConOutMapTable, ConOutMapTableSize, 0xFF);
250795276127e373f2e2fb2a208ff77267422a197d9fxgu
250895276127e373f2e2fb2a208ff77267422a197d9fxgu  StdErrMapTableSize  = StdErrMaxMode * sizeof (INT32);
250995276127e373f2e2fb2a208ff77267422a197d9fxgu  StdErrMapTable      = AllocateZeroPool (StdErrMapTableSize);
251095276127e373f2e2fb2a208ff77267422a197d9fxgu  if (StdErrMapTable == NULL) {
251195276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_OUT_OF_RESOURCES;
251295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
251395276127e373f2e2fb2a208ff77267422a197d9fxgu
251495276127e373f2e2fb2a208ff77267422a197d9fxgu  SetMem (StdErrMapTable, StdErrMapTableSize, 0xFF);
251595276127e373f2e2fb2a208ff77267422a197d9fxgu
251695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
251795276127e373f2e2fb2a208ff77267422a197d9fxgu  // Find the intersection of the two set of modes. If they actually intersect, the
251895276127e373f2e2fb2a208ff77267422a197d9fxgu  // correponding entry in the map table is set to 1.
251995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
252095276127e373f2e2fb2a208ff77267422a197d9fxgu  Mode = 0;
252195276127e373f2e2fb2a208ff77267422a197d9fxgu  while (Mode < ConOutMaxMode) {
252295276127e373f2e2fb2a208ff77267422a197d9fxgu    //
25233012ce5cf75f938a79c70568595454e27b2f014avanjeff    // Search the intersection map and QueryData database to see if they intersect
252495276127e373f2e2fb2a208ff77267422a197d9fxgu    //
25253012ce5cf75f938a79c70568595454e27b2f014avanjeff    Index = 0;
25263012ce5cf75f938a79c70568595454e27b2f014avanjeff    ConOutMode    = *(ConOutModeMap + Mode * ConOutStepSize);
25273012ce5cf75f938a79c70568595454e27b2f014avanjeff    ConOutRows    = ConOutQueryData[ConOutMode].Rows;
25283012ce5cf75f938a79c70568595454e27b2f014avanjeff    ConOutColumns = ConOutQueryData[ConOutMode].Columns;
252995276127e373f2e2fb2a208ff77267422a197d9fxgu    while (Index < StdErrMaxMode) {
25303012ce5cf75f938a79c70568595454e27b2f014avanjeff      StdErrMode    = *(StdErrModeMap + Index * StdErrStepSize);
25313012ce5cf75f938a79c70568595454e27b2f014avanjeff      StdErrRows    = StdErrQueryData[StdErrMode].Rows;
25323012ce5cf75f938a79c70568595454e27b2f014avanjeff      StdErrColumns = StdErrQueryData[StdErrMode].Columns;
25333012ce5cf75f938a79c70568595454e27b2f014avanjeff      if ((StdErrRows == ConOutRows) && (StdErrColumns == ConOutColumns)) {
253495276127e373f2e2fb2a208ff77267422a197d9fxgu        ConOutMapTable[Mode]  = 1;
253595276127e373f2e2fb2a208ff77267422a197d9fxgu        StdErrMapTable[Index] = 1;
253695276127e373f2e2fb2a208ff77267422a197d9fxgu        break;
253795276127e373f2e2fb2a208ff77267422a197d9fxgu      }
253895276127e373f2e2fb2a208ff77267422a197d9fxgu
253995276127e373f2e2fb2a208ff77267422a197d9fxgu      Index++;
254095276127e373f2e2fb2a208ff77267422a197d9fxgu    }
254195276127e373f2e2fb2a208ff77267422a197d9fxgu
254295276127e373f2e2fb2a208ff77267422a197d9fxgu    Mode++;
254395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
254495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
254595276127e373f2e2fb2a208ff77267422a197d9fxgu  // Now search the TextOutModeMap table to find the intersection of supported
254695276127e373f2e2fb2a208ff77267422a197d9fxgu  // mode between ConSplitter and the newly added device.
254795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
254895276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterGetIntersection (
254995276127e373f2e2fb2a208ff77267422a197d9fxgu    ConOutModeMap,
255095276127e373f2e2fb2a208ff77267422a197d9fxgu    ConOutMapTable,
255195276127e373f2e2fb2a208ff77267422a197d9fxgu    mConOut.TextOutListCount,
255295276127e373f2e2fb2a208ff77267422a197d9fxgu    1,
255395276127e373f2e2fb2a208ff77267422a197d9fxgu    &(mConOut.TextOutMode.MaxMode),
255495276127e373f2e2fb2a208ff77267422a197d9fxgu    &(mConOut.TextOutMode.Mode)
255595276127e373f2e2fb2a208ff77267422a197d9fxgu    );
2556fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
255795276127e373f2e2fb2a208ff77267422a197d9fxgu  if (mConOut.TextOutMode.Mode < 0) {
255895276127e373f2e2fb2a208ff77267422a197d9fxgu    mConOut.TextOut.SetMode (&(mConOut.TextOut), 0);
255995276127e373f2e2fb2a208ff77267422a197d9fxgu  }
256095276127e373f2e2fb2a208ff77267422a197d9fxgu
256195276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterGetIntersection (
256295276127e373f2e2fb2a208ff77267422a197d9fxgu    StdErrModeMap,
256395276127e373f2e2fb2a208ff77267422a197d9fxgu    StdErrMapTable,
256495276127e373f2e2fb2a208ff77267422a197d9fxgu    mStdErr.TextOutListCount,
256595276127e373f2e2fb2a208ff77267422a197d9fxgu    1,
256695276127e373f2e2fb2a208ff77267422a197d9fxgu    &(mStdErr.TextOutMode.MaxMode),
256795276127e373f2e2fb2a208ff77267422a197d9fxgu    &(mStdErr.TextOutMode.Mode)
256895276127e373f2e2fb2a208ff77267422a197d9fxgu    );
2569fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff
257095276127e373f2e2fb2a208ff77267422a197d9fxgu  if (mStdErr.TextOutMode.Mode < 0) {
257195276127e373f2e2fb2a208ff77267422a197d9fxgu    mStdErr.TextOut.SetMode (&(mStdErr.TextOut), 0);
257295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
257395276127e373f2e2fb2a208ff77267422a197d9fxgu
257495276127e373f2e2fb2a208ff77267422a197d9fxgu  FreePool (ConOutMapTable);
257595276127e373f2e2fb2a208ff77267422a197d9fxgu  FreePool (StdErrMapTable);
257695276127e373f2e2fb2a208ff77267422a197d9fxgu
257795276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
257895276127e373f2e2fb2a208ff77267422a197d9fxgu}
257995276127e373f2e2fb2a208ff77267422a197d9fxgu
2580a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2581a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
25822da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  Add Grahpics Output modes into Consplitter Text Out list.
2583a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2584415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private               Text Out Splitter pointer.
2585415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  GraphicsOutput        Graphics Output protocol pointer.
2586415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  UgaDraw               UGA Draw protocol pointer.
2587a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2588415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS           Output mode added successfully.
2589415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval other                 Failed to add output mode.
2590a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2591a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
259295276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
25932da292f637e506a7cfb6bce738cb5741671d8f68vanjeffConSplitterAddGraphicsOutputMode (
259495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private,
259595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL    *GraphicsOutput,
259695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_UGA_DRAW_PROTOCOL           *UgaDraw
259795276127e373f2e2fb2a208ff77267422a197d9fxgu  )
259895276127e373f2e2fb2a208ff77267422a197d9fxgu{
259995276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                           Status;
260095276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                                Index;
26013012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINTN                                CurrentIndex;
2602aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Mode;
260395276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                                SizeOfInfo;
260495276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
260595276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE    *CurrentGraphicsOutputMode;
2606aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *ModeBuffer;
2607aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *MatchedMode;
260895276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                                NumberIndex;
260995276127e373f2e2fb2a208ff77267422a197d9fxgu  BOOLEAN                              Match;
2610aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  BOOLEAN                              AlreadyExist;
26113012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINT32                               UgaHorizontalResolution;
26123012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINT32                               UgaVerticalResolution;
26133012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINT32                               UgaColorDepth;
26143012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINT32                               UgaRefreshRate;
261595276127e373f2e2fb2a208ff77267422a197d9fxgu
26162da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  ASSERT (GraphicsOutput != NULL || UgaDraw != NULL);
261795276127e373f2e2fb2a208ff77267422a197d9fxgu
261895276127e373f2e2fb2a208ff77267422a197d9fxgu  CurrentGraphicsOutputMode = Private->GraphicsOutput.Mode;
261995276127e373f2e2fb2a208ff77267422a197d9fxgu
2620aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  Index        = 0;
26213012ce5cf75f938a79c70568595454e27b2f014avanjeff  CurrentIndex = 0;
262246f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin  Status       = EFI_SUCCESS;
2623aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff
2624aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  if (Private->CurrentNumberOfUgaDraw != 0) {
2625aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    //
2626aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    // If any UGA device has already been added, then there is no need to
2627aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    // calculate intersection of display mode of different GOP/UGA device,
2628aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    // since only one display mode will be exported (i.e. user-defined mode)
2629aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    //
2630aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    goto Done;
2631aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  }
2632aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff
263395276127e373f2e2fb2a208ff77267422a197d9fxgu  if (GraphicsOutput != NULL) {
263495276127e373f2e2fb2a208ff77267422a197d9fxgu    if (Private->CurrentNumberOfGraphicsOutput == 0) {
263595276127e373f2e2fb2a208ff77267422a197d9fxgu        //
263695276127e373f2e2fb2a208ff77267422a197d9fxgu        // This is the first Graphics Output device added
263795276127e373f2e2fb2a208ff77267422a197d9fxgu        //
2638f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff        CurrentGraphicsOutputMode->MaxMode = GraphicsOutput->Mode->MaxMode;
2639f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff        CurrentGraphicsOutputMode->Mode = GraphicsOutput->Mode->Mode;
264095276127e373f2e2fb2a208ff77267422a197d9fxgu        CopyMem (CurrentGraphicsOutputMode->Info, GraphicsOutput->Mode->Info, GraphicsOutput->Mode->SizeOfInfo);
2641f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff        CurrentGraphicsOutputMode->SizeOfInfo = GraphicsOutput->Mode->SizeOfInfo;
2642f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff        CurrentGraphicsOutputMode->FrameBufferBase = GraphicsOutput->Mode->FrameBufferBase;
2643f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff        CurrentGraphicsOutputMode->FrameBufferSize = GraphicsOutput->Mode->FrameBufferSize;
264476649bf4d80e1d2ed062846c2960292fb63de08dvanjeff
264595276127e373f2e2fb2a208ff77267422a197d9fxgu        //
264695276127e373f2e2fb2a208ff77267422a197d9fxgu        // Allocate resource for the private mode buffer
264795276127e373f2e2fb2a208ff77267422a197d9fxgu        //
2648fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff        ModeBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION) * GraphicsOutput->Mode->MaxMode);
264995276127e373f2e2fb2a208ff77267422a197d9fxgu        if (ModeBuffer == NULL) {
265095276127e373f2e2fb2a208ff77267422a197d9fxgu          return EFI_OUT_OF_RESOURCES;
265195276127e373f2e2fb2a208ff77267422a197d9fxgu        }
265295276127e373f2e2fb2a208ff77267422a197d9fxgu        FreePool (Private->GraphicsOutputModeBuffer);
265395276127e373f2e2fb2a208ff77267422a197d9fxgu        Private->GraphicsOutputModeBuffer = ModeBuffer;
265495276127e373f2e2fb2a208ff77267422a197d9fxgu
265595276127e373f2e2fb2a208ff77267422a197d9fxgu        //
265695276127e373f2e2fb2a208ff77267422a197d9fxgu        // Store all supported display modes to the private mode buffer
265795276127e373f2e2fb2a208ff77267422a197d9fxgu        //
265895276127e373f2e2fb2a208ff77267422a197d9fxgu        Mode = ModeBuffer;
265995276127e373f2e2fb2a208ff77267422a197d9fxgu        for (Index = 0; Index < GraphicsOutput->Mode->MaxMode; Index++) {
2660fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          //
2661fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          // The Info buffer would be allocated by callee
2662fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          //
266395276127e373f2e2fb2a208ff77267422a197d9fxgu          Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) Index, &SizeOfInfo, &Info);
266495276127e373f2e2fb2a208ff77267422a197d9fxgu          if (EFI_ERROR (Status)) {
266595276127e373f2e2fb2a208ff77267422a197d9fxgu            return Status;
266695276127e373f2e2fb2a208ff77267422a197d9fxgu          }
2667fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
2668aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff          CopyMem (Mode, Info, SizeOfInfo);
266995276127e373f2e2fb2a208ff77267422a197d9fxgu          Mode++;
267095276127e373f2e2fb2a208ff77267422a197d9fxgu          FreePool (Info);
267195276127e373f2e2fb2a208ff77267422a197d9fxgu        }
267295276127e373f2e2fb2a208ff77267422a197d9fxgu    } else {
267395276127e373f2e2fb2a208ff77267422a197d9fxgu      //
267495276127e373f2e2fb2a208ff77267422a197d9fxgu      // Check intersection of display mode
267595276127e373f2e2fb2a208ff77267422a197d9fxgu      //
2676aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff      ModeBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION) * CurrentGraphicsOutputMode->MaxMode);
267795276127e373f2e2fb2a208ff77267422a197d9fxgu      if (ModeBuffer == NULL) {
267895276127e373f2e2fb2a208ff77267422a197d9fxgu        return EFI_OUT_OF_RESOURCES;
267995276127e373f2e2fb2a208ff77267422a197d9fxgu      }
268095276127e373f2e2fb2a208ff77267422a197d9fxgu
268195276127e373f2e2fb2a208ff77267422a197d9fxgu      MatchedMode = ModeBuffer;
268295276127e373f2e2fb2a208ff77267422a197d9fxgu      Mode = &Private->GraphicsOutputModeBuffer[0];
268395276127e373f2e2fb2a208ff77267422a197d9fxgu      for (Index = 0; Index < CurrentGraphicsOutputMode->MaxMode; Index++) {
268495276127e373f2e2fb2a208ff77267422a197d9fxgu        Match = FALSE;
268595276127e373f2e2fb2a208ff77267422a197d9fxgu
268695276127e373f2e2fb2a208ff77267422a197d9fxgu        for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex++) {
2687fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          //
2688fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          // The Info buffer would be allocated by callee
2689fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          //
269095276127e373f2e2fb2a208ff77267422a197d9fxgu          Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info);
269195276127e373f2e2fb2a208ff77267422a197d9fxgu          if (EFI_ERROR (Status)) {
269295276127e373f2e2fb2a208ff77267422a197d9fxgu            return Status;
269395276127e373f2e2fb2a208ff77267422a197d9fxgu          }
269495276127e373f2e2fb2a208ff77267422a197d9fxgu          if ((Info->HorizontalResolution == Mode->HorizontalResolution) &&
2695aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff              (Info->VerticalResolution == Mode->VerticalResolution)) {
2696fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff            //
2697c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff            // If GOP device supports one mode in current mode buffer,
2698fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff            // it will be added into matched mode buffer
2699fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff            //
270095276127e373f2e2fb2a208ff77267422a197d9fxgu            Match = TRUE;
270195276127e373f2e2fb2a208ff77267422a197d9fxgu            FreePool (Info);
270295276127e373f2e2fb2a208ff77267422a197d9fxgu            break;
270395276127e373f2e2fb2a208ff77267422a197d9fxgu          }
270495276127e373f2e2fb2a208ff77267422a197d9fxgu          FreePool (Info);
270595276127e373f2e2fb2a208ff77267422a197d9fxgu        }
270695276127e373f2e2fb2a208ff77267422a197d9fxgu
270795276127e373f2e2fb2a208ff77267422a197d9fxgu        if (Match) {
2708aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff          AlreadyExist = FALSE;
2709c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
2710fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          //
2711fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          // Check if GOP mode has been in the mode buffer, ModeBuffer = MatchedMode at begin.
2712fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff          //
2713aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff          for (Info = ModeBuffer; Info < MatchedMode; Info++) {
2714aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            if ((Info->HorizontalResolution == Mode->HorizontalResolution) &&
2715aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff                (Info->VerticalResolution == Mode->VerticalResolution)) {
2716aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff              AlreadyExist = TRUE;
2717aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff              break;
2718aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            }
2719aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff          }
2720aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff
2721aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff          if (!AlreadyExist) {
2722aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            CopyMem (MatchedMode, Mode, sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
2723aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff
2724aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            //
2725aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            // Physical frame buffer is no longer available, change PixelFormat to PixelBltOnly
2726aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            //
2727aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            MatchedMode->Version = 0;
2728aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            MatchedMode->PixelFormat = PixelBltOnly;
2729aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            ZeroMem (&MatchedMode->PixelInformation, sizeof (EFI_PIXEL_BITMASK));
2730aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff
2731aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff            MatchedMode++;
2732aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff          }
273395276127e373f2e2fb2a208ff77267422a197d9fxgu        }
273495276127e373f2e2fb2a208ff77267422a197d9fxgu
273595276127e373f2e2fb2a208ff77267422a197d9fxgu        Mode++;
273695276127e373f2e2fb2a208ff77267422a197d9fxgu      }
273795276127e373f2e2fb2a208ff77267422a197d9fxgu
273895276127e373f2e2fb2a208ff77267422a197d9fxgu      //
273995276127e373f2e2fb2a208ff77267422a197d9fxgu      // Drop the old mode buffer, assign it to a new one
274095276127e373f2e2fb2a208ff77267422a197d9fxgu      //
274195276127e373f2e2fb2a208ff77267422a197d9fxgu      FreePool (Private->GraphicsOutputModeBuffer);
274295276127e373f2e2fb2a208ff77267422a197d9fxgu      Private->GraphicsOutputModeBuffer = ModeBuffer;
274395276127e373f2e2fb2a208ff77267422a197d9fxgu
274495276127e373f2e2fb2a208ff77267422a197d9fxgu      //
274595276127e373f2e2fb2a208ff77267422a197d9fxgu      // Physical frame buffer is no longer available when there are more than one physical GOP devices
274695276127e373f2e2fb2a208ff77267422a197d9fxgu      //
2747aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff      CurrentGraphicsOutputMode->MaxMode = (UINT32) (((UINTN) MatchedMode - (UINTN) ModeBuffer) / sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
274895276127e373f2e2fb2a208ff77267422a197d9fxgu      CurrentGraphicsOutputMode->Info->PixelFormat = PixelBltOnly;
274995276127e373f2e2fb2a208ff77267422a197d9fxgu      ZeroMem (&CurrentGraphicsOutputMode->Info->PixelInformation, sizeof (EFI_PIXEL_BITMASK));
275095276127e373f2e2fb2a208ff77267422a197d9fxgu      CurrentGraphicsOutputMode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
27511be0dda62d546b09d6892e09c48910ace6d57f01jljusten      CurrentGraphicsOutputMode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
275295276127e373f2e2fb2a208ff77267422a197d9fxgu      CurrentGraphicsOutputMode->FrameBufferSize = 0;
275395276127e373f2e2fb2a208ff77267422a197d9fxgu    }
275495276127e373f2e2fb2a208ff77267422a197d9fxgu
275595276127e373f2e2fb2a208ff77267422a197d9fxgu    //
27563012ce5cf75f938a79c70568595454e27b2f014avanjeff    // Graphics console driver can ensure the same mode for all GOP devices
275795276127e373f2e2fb2a208ff77267422a197d9fxgu    //
275895276127e373f2e2fb2a208ff77267422a197d9fxgu    for (Index = 0; Index < CurrentGraphicsOutputMode->MaxMode; Index++) {
275995276127e373f2e2fb2a208ff77267422a197d9fxgu      Mode = &Private->GraphicsOutputModeBuffer[Index];
27603012ce5cf75f938a79c70568595454e27b2f014avanjeff      if ((Mode->HorizontalResolution == GraphicsOutput->Mode->Info->HorizontalResolution) &&
27613012ce5cf75f938a79c70568595454e27b2f014avanjeff         (Mode->VerticalResolution == GraphicsOutput->Mode->Info->VerticalResolution)) {
27623012ce5cf75f938a79c70568595454e27b2f014avanjeff        CurrentIndex = Index;
276395276127e373f2e2fb2a208ff77267422a197d9fxgu        break;
276495276127e373f2e2fb2a208ff77267422a197d9fxgu      }
276595276127e373f2e2fb2a208ff77267422a197d9fxgu    }
276695276127e373f2e2fb2a208ff77267422a197d9fxgu    if (Index >= CurrentGraphicsOutputMode->MaxMode) {
27673012ce5cf75f938a79c70568595454e27b2f014avanjeff      //
27683012ce5cf75f938a79c70568595454e27b2f014avanjeff      // if user defined mode is not found, set to default mode 800x600
27693012ce5cf75f938a79c70568595454e27b2f014avanjeff      //
27703012ce5cf75f938a79c70568595454e27b2f014avanjeff      for (Index = 0; Index < CurrentGraphicsOutputMode->MaxMode; Index++) {
27713012ce5cf75f938a79c70568595454e27b2f014avanjeff        Mode = &Private->GraphicsOutputModeBuffer[Index];
27723012ce5cf75f938a79c70568595454e27b2f014avanjeff        if ((Mode->HorizontalResolution == 800) && (Mode->VerticalResolution == 600)) {
27733012ce5cf75f938a79c70568595454e27b2f014avanjeff          CurrentIndex = Index;
27743012ce5cf75f938a79c70568595454e27b2f014avanjeff          break;
27753012ce5cf75f938a79c70568595454e27b2f014avanjeff        }
27763012ce5cf75f938a79c70568595454e27b2f014avanjeff      }
277795276127e373f2e2fb2a208ff77267422a197d9fxgu    }
2778f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  } else if (UgaDraw != NULL) {
277995276127e373f2e2fb2a208ff77267422a197d9fxgu    //
27803012ce5cf75f938a79c70568595454e27b2f014avanjeff    // Graphics console driver can ensure the same mode for all GOP devices
27813012ce5cf75f938a79c70568595454e27b2f014avanjeff    // so we can get the current mode from this video device
278295276127e373f2e2fb2a208ff77267422a197d9fxgu    //
27833012ce5cf75f938a79c70568595454e27b2f014avanjeff    UgaDraw->GetMode (
27843012ce5cf75f938a79c70568595454e27b2f014avanjeff               UgaDraw,
27853012ce5cf75f938a79c70568595454e27b2f014avanjeff               &UgaHorizontalResolution,
27863012ce5cf75f938a79c70568595454e27b2f014avanjeff               &UgaVerticalResolution,
27873012ce5cf75f938a79c70568595454e27b2f014avanjeff               &UgaColorDepth,
27883012ce5cf75f938a79c70568595454e27b2f014avanjeff               &UgaRefreshRate
27893012ce5cf75f938a79c70568595454e27b2f014avanjeff               );
27903012ce5cf75f938a79c70568595454e27b2f014avanjeff
279195276127e373f2e2fb2a208ff77267422a197d9fxgu    CurrentGraphicsOutputMode->MaxMode = 1;
2792aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Info = CurrentGraphicsOutputMode->Info;
2793aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Info->Version = 0;
27942da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    Info->HorizontalResolution                 = UgaHorizontalResolution;
27952da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    Info->VerticalResolution                   = UgaVerticalResolution;
27962da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    Info->PixelFormat                          = PixelBltOnly;
27972da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    Info->PixelsPerScanLine                    = UgaHorizontalResolution;
27982da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    CurrentGraphicsOutputMode->SizeOfInfo      = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
27991be0dda62d546b09d6892e09c48910ace6d57f01jljusten    CurrentGraphicsOutputMode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
280095276127e373f2e2fb2a208ff77267422a197d9fxgu    CurrentGraphicsOutputMode->FrameBufferSize = 0;
280195276127e373f2e2fb2a208ff77267422a197d9fxgu
280295276127e373f2e2fb2a208ff77267422a197d9fxgu    //
280395276127e373f2e2fb2a208ff77267422a197d9fxgu    // Update the private mode buffer
280495276127e373f2e2fb2a208ff77267422a197d9fxgu    //
2805aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    CopyMem (&Private->GraphicsOutputModeBuffer[0], Info, sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
280695276127e373f2e2fb2a208ff77267422a197d9fxgu
280795276127e373f2e2fb2a208ff77267422a197d9fxgu    //
2808aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    // Only mode 0 is available to be set
280995276127e373f2e2fb2a208ff77267422a197d9fxgu    //
28103012ce5cf75f938a79c70568595454e27b2f014avanjeff    CurrentIndex = 0;
281195276127e373f2e2fb2a208ff77267422a197d9fxgu  }
281295276127e373f2e2fb2a208ff77267422a197d9fxgu
2813aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeffDone:
2814aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff
2815aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  if (GraphicsOutput != NULL) {
2816aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Private->CurrentNumberOfGraphicsOutput++;
2817aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  }
2818f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  if (UgaDraw != NULL) {
2819aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff    Private->CurrentNumberOfUgaDraw++;
2820aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff  }
2821aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff
282295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
282395276127e373f2e2fb2a208ff77267422a197d9fxgu  // Force GraphicsOutput mode to be set,
282495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
282546f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin
282646f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin  Mode = &Private->GraphicsOutputModeBuffer[CurrentIndex];
282746f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin  if ((GraphicsOutput != NULL) &&
282846f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      (Mode->HorizontalResolution == CurrentGraphicsOutputMode->Info->HorizontalResolution) &&
282946f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      (Mode->VerticalResolution == CurrentGraphicsOutputMode->Info->VerticalResolution)) {
283046f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    CurrentGraphicsOutputMode->Mode = (UINT32) CurrentIndex;
283146f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    if ((Mode->HorizontalResolution != GraphicsOutput->Mode->Info->HorizontalResolution) ||
283246f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin        (Mode->VerticalResolution != GraphicsOutput->Mode->Info->VerticalResolution)) {
283346f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      //
283446f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      // If all existing video device has been set to common mode, only set new GOP device to
283546f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      // the common mode
283646f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      //
283746f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex ++) {
283846f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin        Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info);
283946f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin        if (EFI_ERROR (Status)) {
284046f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin          return Status;
284146f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin        }
284246f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin        if ((Info->HorizontalResolution == Mode->HorizontalResolution) && (Info->VerticalResolution == Mode->VerticalResolution)) {
284346f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin          FreePool (Info);
284446f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin          break;
284546f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin        }
284646f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin        FreePool (Info);
284746f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      }
284846f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32) NumberIndex);
284946f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    }
285046f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin  } else {
285146f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    //
285246f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    // Current mode number may need update now, so set it to an invalid mode number
2853fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    //
285446f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    CurrentGraphicsOutputMode->Mode = 0xffff;
2855fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    //
285646f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    // Graphics console can ensure all GOP devices have the same mode which can be taken as current mode.
285746f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    //
285846f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    Status = Private->GraphicsOutput.SetMode (&Private->GraphicsOutput, (UINT32) CurrentIndex);
285946f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    if (EFI_ERROR(Status)) {
286046f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      //
286146f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      // If user defined mode is not valid for display device, set to the default mode 800x600.
286246f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      //
286346f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      (Private->GraphicsOutputModeBuffer[0]).HorizontalResolution = 800;
286446f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      (Private->GraphicsOutputModeBuffer[0]).VerticalResolution   = 600;
286546f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin      Status = Private->GraphicsOutput.SetMode (&Private->GraphicsOutput, 0);
286646f0e2a9eeb384eeff020b69a95b9277ee7c5a16li-elvin    }
28673012ce5cf75f938a79c70568595454e27b2f014avanjeff  }
286895276127e373f2e2fb2a208ff77267422a197d9fxgu
286995276127e373f2e2fb2a208ff77267422a197d9fxgu  return Status;
287095276127e373f2e2fb2a208ff77267422a197d9fxgu}
287195276127e373f2e2fb2a208ff77267422a197d9fxgu
2872a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
28732da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  Set the current console out mode.
28742da292f637e506a7cfb6bce738cb5741671d8f68vanjeff
2875189eac2199940cdc1265503ba4854ea947042424qwang  This routine will get the current console mode information (column, row)
2876189eac2199940cdc1265503ba4854ea947042424qwang  from ConsoleOutMode variable and set it; if the variable does not exist,
2877189eac2199940cdc1265503ba4854ea947042424qwang  set to user defined console mode.
2878189eac2199940cdc1265503ba4854ea947042424qwang
287933019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Private            Consplitter Text Out pointer.
2880189eac2199940cdc1265503ba4854ea947042424qwang
2881a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
2882a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffVOID
2883a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffConsplitterSetConsoleOutMode (
2884a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private
2885a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  )
2886189eac2199940cdc1265503ba4854ea947042424qwang{
28872da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                            Col;
28882da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                            Row;
28892da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                            Mode;
28902da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                            PreferMode;
28912da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                            BaseMode;
28922da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                            MaxMode;
28932da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  EFI_STATUS                       Status;
28942da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  CONSOLE_OUT_MODE                 ModeInfo;
2895b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin  CONSOLE_OUT_MODE                 MaxModeInfo;
2896189eac2199940cdc1265503ba4854ea947042424qwang  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;
28978541adab27901906118876f1acd3555666677ff9vanjeff
2898189eac2199940cdc1265503ba4854ea947042424qwang  PreferMode   = 0xFF;
2899189eac2199940cdc1265503ba4854ea947042424qwang  BaseMode     = 0xFF;
2900189eac2199940cdc1265503ba4854ea947042424qwang  TextOut      = &Private->TextOut;
2901189eac2199940cdc1265503ba4854ea947042424qwang  MaxMode      = (UINTN) (TextOut->Mode->MaxMode);
2902189eac2199940cdc1265503ba4854ea947042424qwang
2903b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin  MaxModeInfo.Column = 0;
2904b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin  MaxModeInfo.Row    = 0;
2905b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin  ModeInfo.Column    = PcdGet32 (PcdConOutColumn);
2906b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin  ModeInfo.Row       = PcdGet32 (PcdConOutRow);
29078541adab27901906118876f1acd3555666677ff9vanjeff
29082da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  //
29092da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  // To find the prefer mode and basic mode from Text Out mode list
29102da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  //
2911189eac2199940cdc1265503ba4854ea947042424qwang  for (Mode = 0; Mode < MaxMode; Mode++) {
2912189eac2199940cdc1265503ba4854ea947042424qwang    Status = TextOut->QueryMode (TextOut, Mode, &Col, &Row);
2913189eac2199940cdc1265503ba4854ea947042424qwang    if (!EFI_ERROR(Status)) {
2914b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin      if ((ModeInfo.Column != 0) && (ModeInfo.Row != 0)) {
2915b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        //
2916b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        // Use user defined column and row
2917b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        //
2918b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        if (Col == ModeInfo.Column && Row == ModeInfo.Row) {
2919b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin          PreferMode = Mode;
2920b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        }
2921b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin      } else {
2922b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        //
2923b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        // If user sets PcdConOutColumn or PcdConOutRow to 0,
2924b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        // find and set the highest text mode.
2925b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        //
2926b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        if ((Col >= MaxModeInfo.Column) && (Row >= MaxModeInfo.Row)) {
2927b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin          MaxModeInfo.Column  = Col;
2928b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin          MaxModeInfo.Row     = Row;
2929b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin          PreferMode          = Mode;
2930b9b5e3078dfdcf0f9a8515f55a4eb44b6c55a9f5li-elvin        }
2931189eac2199940cdc1265503ba4854ea947042424qwang      }
2932189eac2199940cdc1265503ba4854ea947042424qwang      if (Col == 80 && Row == 25) {
2933189eac2199940cdc1265503ba4854ea947042424qwang        BaseMode = Mode;
2934189eac2199940cdc1265503ba4854ea947042424qwang      }
2935189eac2199940cdc1265503ba4854ea947042424qwang    }
2936189eac2199940cdc1265503ba4854ea947042424qwang  }
29378541adab27901906118876f1acd3555666677ff9vanjeff
2938189eac2199940cdc1265503ba4854ea947042424qwang  //
2939589f16d2bf12d0ec08ab877361f624838edf0ebfqhuang  // Set prefer mode to Text Out devices.
2940189eac2199940cdc1265503ba4854ea947042424qwang  //
29412da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  Status = TextOut->SetMode (TextOut, PreferMode);
2942189eac2199940cdc1265503ba4854ea947042424qwang  if (EFI_ERROR(Status)) {
29432da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    //
29442da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    // if current mode setting is failed, default 80x25 mode will be set.
29452da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    //
2946189eac2199940cdc1265503ba4854ea947042424qwang    Status = TextOut->SetMode (TextOut, BaseMode);
2947189eac2199940cdc1265503ba4854ea947042424qwang    ASSERT(!EFI_ERROR(Status));
294876649bf4d80e1d2ed062846c2960292fb63de08dvanjeff
2949377680ae64bd6f702bfac7c98e65f73019b7d285Eric Dong    Status = PcdSet32S (PcdConOutColumn, 80);
2950377680ae64bd6f702bfac7c98e65f73019b7d285Eric Dong    ASSERT(!EFI_ERROR(Status));
2951377680ae64bd6f702bfac7c98e65f73019b7d285Eric Dong    Status = PcdSet32S (PcdConOutRow, 25);
2952377680ae64bd6f702bfac7c98e65f73019b7d285Eric Dong    ASSERT(!EFI_ERROR(Status));
2953189eac2199940cdc1265503ba4854ea947042424qwang  }
2954189eac2199940cdc1265503ba4854ea947042424qwang
29552da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  return ;
2956189eac2199940cdc1265503ba4854ea947042424qwang}
2957189eac2199940cdc1265503ba4854ea947042424qwang
2958189eac2199940cdc1265503ba4854ea947042424qwang
2959a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
2960415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Add Text Output Device in Consplitter Text Output list.
2961a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2962415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text Out Splitter pointer.
2963415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  TextOut                  Simple Text Output protocol pointer.
2964415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  GraphicsOutput           Graphics Output protocol pointer.
2965415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  UgaDraw                  UGA Draw protocol pointer.
2966a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2967415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Text Output Device added successfully.
2968415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
2969a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
2970a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
297195276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
297295276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutAddDevice (
297395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA     *Private,
297495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *TextOut,
297595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL       *GraphicsOutput,
297695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_UGA_DRAW_PROTOCOL              *UgaDraw
297795276127e373f2e2fb2a208ff77267422a197d9fxgu  )
297895276127e373f2e2fb2a208ff77267422a197d9fxgu{
29792da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  EFI_STATUS                           Status;
29802da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                                CurrentNumOfConsoles;
29812da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  INT32                                MaxMode;
29822da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINT32                               UgaHorizontalResolution;
29832da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINT32                               UgaVerticalResolution;
29842da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINT32                               UgaColorDepth;
29852da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINT32                               UgaRefreshRate;
29862da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  TEXT_OUT_AND_GOP_DATA                *TextAndGop;
29872da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  UINTN                                SizeOfInfo;
29882da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
2989d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff  EFI_STATUS                           DeviceStatus;
299095276127e373f2e2fb2a208ff77267422a197d9fxgu
299195276127e373f2e2fb2a208ff77267422a197d9fxgu  Status                = EFI_SUCCESS;
299295276127e373f2e2fb2a208ff77267422a197d9fxgu  CurrentNumOfConsoles  = Private->CurrentNumberOfConsoles;
299395276127e373f2e2fb2a208ff77267422a197d9fxgu
299495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
2995fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff  // If the Text Out List is full, enlarge it by calling ConSplitterGrowBuffer().
299695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
299795276127e373f2e2fb2a208ff77267422a197d9fxgu  while (CurrentNumOfConsoles >= Private->TextOutListCount) {
299895276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = ConSplitterGrowBuffer (
299995276127e373f2e2fb2a208ff77267422a197d9fxgu              sizeof (TEXT_OUT_AND_GOP_DATA),
300095276127e373f2e2fb2a208ff77267422a197d9fxgu              &Private->TextOutListCount,
300195276127e373f2e2fb2a208ff77267422a197d9fxgu              (VOID **) &Private->TextOutList
300295276127e373f2e2fb2a208ff77267422a197d9fxgu              );
300395276127e373f2e2fb2a208ff77267422a197d9fxgu    if (EFI_ERROR (Status)) {
300495276127e373f2e2fb2a208ff77267422a197d9fxgu      return EFI_OUT_OF_RESOURCES;
300595276127e373f2e2fb2a208ff77267422a197d9fxgu    }
300695276127e373f2e2fb2a208ff77267422a197d9fxgu    //
300795276127e373f2e2fb2a208ff77267422a197d9fxgu    // Also need to reallocate the TextOutModeMap table
300895276127e373f2e2fb2a208ff77267422a197d9fxgu    //
300995276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = ConSplitterGrowMapTable (Private);
301095276127e373f2e2fb2a208ff77267422a197d9fxgu    if (EFI_ERROR (Status)) {
301195276127e373f2e2fb2a208ff77267422a197d9fxgu      return EFI_OUT_OF_RESOURCES;
301295276127e373f2e2fb2a208ff77267422a197d9fxgu    }
301395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
301495276127e373f2e2fb2a208ff77267422a197d9fxgu
301595276127e373f2e2fb2a208ff77267422a197d9fxgu  TextAndGop          = &Private->TextOutList[CurrentNumOfConsoles];
301695276127e373f2e2fb2a208ff77267422a197d9fxgu
30172da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  TextAndGop->TextOut        = TextOut;
301895276127e373f2e2fb2a208ff77267422a197d9fxgu  TextAndGop->GraphicsOutput = GraphicsOutput;
30192da292f637e506a7cfb6bce738cb5741671d8f68vanjeff  TextAndGop->UgaDraw        = UgaDraw;
302095276127e373f2e2fb2a208ff77267422a197d9fxgu
302195276127e373f2e2fb2a208ff77267422a197d9fxgu  if (CurrentNumOfConsoles == 0) {
302295276127e373f2e2fb2a208ff77267422a197d9fxgu    //
302395276127e373f2e2fb2a208ff77267422a197d9fxgu    // Add the first device's output mode to console splitter's mode list
302495276127e373f2e2fb2a208ff77267422a197d9fxgu    //
302595276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = ConSplitterAddOutputMode (Private, TextOut);
302695276127e373f2e2fb2a208ff77267422a197d9fxgu  } else {
302795276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterSyncOutputMode (Private, TextOut);
302895276127e373f2e2fb2a208ff77267422a197d9fxgu  }
302995276127e373f2e2fb2a208ff77267422a197d9fxgu
303095276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->CurrentNumberOfConsoles++;
303195276127e373f2e2fb2a208ff77267422a197d9fxgu
303295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
303395276127e373f2e2fb2a208ff77267422a197d9fxgu  // Scan both TextOutList, for the intersection TextOut device
303495276127e373f2e2fb2a208ff77267422a197d9fxgu  // maybe both ConOut and StdErr incorporate the same Text Out
303595276127e373f2e2fb2a208ff77267422a197d9fxgu  // device in them, thus the output of both should be synced.
303695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
303795276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterGetIntersectionBetweenConOutAndStrErr ();
303895276127e373f2e2fb2a208ff77267422a197d9fxgu
303995276127e373f2e2fb2a208ff77267422a197d9fxgu  MaxMode     = Private->TextOutMode.MaxMode;
304095276127e373f2e2fb2a208ff77267422a197d9fxgu  ASSERT (MaxMode >= 1);
304195276127e373f2e2fb2a208ff77267422a197d9fxgu
3042d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff  DeviceStatus = EFI_DEVICE_ERROR;
3043f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  Status       = EFI_DEVICE_ERROR;
3044f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin
3045f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  //
3046f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  // This device display mode will be added into Graphics Ouput modes.
3047f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  //
3048f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  if ((GraphicsOutput != NULL) || (UgaDraw != NULL)) {
3049f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin    DeviceStatus = ConSplitterAddGraphicsOutputMode (Private, GraphicsOutput, UgaDraw);
305095276127e373f2e2fb2a208ff77267422a197d9fxgu  }
30512da292f637e506a7cfb6bce738cb5741671d8f68vanjeff
30523012ce5cf75f938a79c70568595454e27b2f014avanjeff  if (FeaturePcdGet (PcdConOutUgaSupport)) {
30532da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    //
30542da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    // If UGA is produced by Consplitter
30552da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    //
30562da292f637e506a7cfb6bce738cb5741671d8f68vanjeff    if (GraphicsOutput != NULL) {
30572da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info);
30582da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      if (EFI_ERROR (Status)) {
30592da292f637e506a7cfb6bce738cb5741671d8f68vanjeff        return Status;
30602da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      }
30612da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
30622da292f637e506a7cfb6bce738cb5741671d8f68vanjeff
30632da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      UgaHorizontalResolution = Info->HorizontalResolution;
30642da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      UgaVerticalResolution   = Info->VerticalResolution;
30652da292f637e506a7cfb6bce738cb5741671d8f68vanjeff
30662da292f637e506a7cfb6bce738cb5741671d8f68vanjeff      FreePool (Info);
3067c33add6776cbbe39f11df3343f6d73bb3a306163vanjeff
3068f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin    } else if (UgaDraw != NULL) {
30693012ce5cf75f938a79c70568595454e27b2f014avanjeff      Status = UgaDraw->GetMode (
30703012ce5cf75f938a79c70568595454e27b2f014avanjeff                    UgaDraw,
30713012ce5cf75f938a79c70568595454e27b2f014avanjeff                    &UgaHorizontalResolution,
30723012ce5cf75f938a79c70568595454e27b2f014avanjeff                    &UgaVerticalResolution,
30733012ce5cf75f938a79c70568595454e27b2f014avanjeff                    &UgaColorDepth,
30743012ce5cf75f938a79c70568595454e27b2f014avanjeff                    &UgaRefreshRate
30753012ce5cf75f938a79c70568595454e27b2f014avanjeff                    );
3076d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff      if (!EFI_ERROR (Status) && EFI_ERROR (DeviceStatus)) {
3077d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff        //
3078d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff        // if GetMode is successfully and UGA device hasn't been set, set it
3079d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff        //
3080d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff        Status = ConSplitterUgaDrawSetMode (
308176649bf4d80e1d2ed062846c2960292fb63de08dvanjeff                    &Private->UgaDraw,
308276649bf4d80e1d2ed062846c2960292fb63de08dvanjeff                    UgaHorizontalResolution,
308376649bf4d80e1d2ed062846c2960292fb63de08dvanjeff                    UgaVerticalResolution,
308476649bf4d80e1d2ed062846c2960292fb63de08dvanjeff                    UgaColorDepth,
3085d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff                    UgaRefreshRate
3086d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff                    );
3087d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff      }
3088d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff      //
3089d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff      // If GetMode/SetMode is failed, set to 800x600 mode
3090d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff      //
3091d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff      if(EFI_ERROR (Status)) {
3092d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff        Status = ConSplitterUgaDrawSetMode (
309376649bf4d80e1d2ed062846c2960292fb63de08dvanjeff                    &Private->UgaDraw,
309476649bf4d80e1d2ed062846c2960292fb63de08dvanjeff                    800,
309576649bf4d80e1d2ed062846c2960292fb63de08dvanjeff                    600,
309676649bf4d80e1d2ed062846c2960292fb63de08dvanjeff                    32,
3097d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff                    60
3098d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff                    );
3099d6e11f223065ed83ce38e84a9a00e20dfa37bc2dvanjeff      }
31003012ce5cf75f938a79c70568595454e27b2f014avanjeff    }
31013012ce5cf75f938a79c70568595454e27b2f014avanjeff  }
310295276127e373f2e2fb2a208ff77267422a197d9fxgu
3103f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  if (((!EFI_ERROR (DeviceStatus)) || (!EFI_ERROR (Status))) &&
3104f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      ((Private->CurrentNumberOfGraphicsOutput + Private->CurrentNumberOfUgaDraw) == 1)) {
3105f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin    if (!FeaturePcdGet (PcdConOutGopSupport)) {
3106f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      //
3107f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      // If Graphics Outpurt protocol not supported, UGA Draw protocol is installed
3108f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      // on the virtual handle.
3109f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      //
3110f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      Status = gBS->InstallMultipleProtocolInterfaces (
3111f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &mConOut.VirtualHandle,
3112f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &gEfiUgaDrawProtocolGuid,
3113f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &mConOut.UgaDraw,
3114f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      NULL
3115f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      );
3116f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin    } else if (!FeaturePcdGet (PcdConOutUgaSupport)) {
3117f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      //
3118f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      // If UGA Draw protocol not supported, Graphics Output Protocol is installed
3119f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      // on virtual handle.
3120f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      //
3121f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      Status = gBS->InstallMultipleProtocolInterfaces (
3122f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &mConOut.VirtualHandle,
3123f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &gEfiGraphicsOutputProtocolGuid,
3124f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &mConOut.GraphicsOutput,
3125f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      NULL
3126f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      );
3127f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin    } else {
3128f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      //
3129f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      // Boot Graphics Output protocol and UGA Draw protocol are supported,
3130f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      // both they will be installed on virtual handle.
3131f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      //
3132f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      Status = gBS->InstallMultipleProtocolInterfaces (
3133f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &mConOut.VirtualHandle,
3134f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &gEfiGraphicsOutputProtocolGuid,
3135f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &mConOut.GraphicsOutput,
3136f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &gEfiUgaDrawProtocolGuid,
3137f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      &mConOut.UgaDraw,
3138f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      NULL
3139f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin                      );
3140f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin    }
3141f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin  }
3142f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin
31439937b36506924de4b721f03addc50ed318474a5evanjeff  //
31448541adab27901906118876f1acd3555666677ff9vanjeff  // After adding new console device, all existing console devices should be
3145189eac2199940cdc1265503ba4854ea947042424qwang  // synced to the current shared mode.
3146189eac2199940cdc1265503ba4854ea947042424qwang  //
3147189eac2199940cdc1265503ba4854ea947042424qwang  ConsplitterSetConsoleOutMode (Private);
3148189eac2199940cdc1265503ba4854ea947042424qwang
314995276127e373f2e2fb2a208ff77267422a197d9fxgu  return Status;
315095276127e373f2e2fb2a208ff77267422a197d9fxgu}
315195276127e373f2e2fb2a208ff77267422a197d9fxgu
3152a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3153a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3154415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  Remove Text Out Device in Consplitter Text Out list.
3155a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3156415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  Private                  Text Out Splitter pointer.
3157415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  TextOut                  Simple Text Output Pointer protocol pointer.
3158a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3159415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              Text Out Device removed successfully.
3160415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_NOT_FOUND            No Text Out Device found.
3161a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3162a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
316395276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
316495276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutDeleteDevice (
316595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA     *Private,
316695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *TextOut
316795276127e373f2e2fb2a208ff77267422a197d9fxgu  )
316895276127e373f2e2fb2a208ff77267422a197d9fxgu{
316995276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                 Index;
317095276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                 CurrentNumOfConsoles;
317195276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_AND_GOP_DATA *TextOutList;
317295276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS            Status;
317395276127e373f2e2fb2a208ff77267422a197d9fxgu
317495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
317595276127e373f2e2fb2a208ff77267422a197d9fxgu  // Remove the specified text-out device data structure from the Text out List,
317695276127e373f2e2fb2a208ff77267422a197d9fxgu  // and rearrange the remaining data structures in the Text out List.
317795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
317895276127e373f2e2fb2a208ff77267422a197d9fxgu  CurrentNumOfConsoles  = Private->CurrentNumberOfConsoles;
317995276127e373f2e2fb2a208ff77267422a197d9fxgu  Index                 = (INT32) CurrentNumOfConsoles - 1;
318095276127e373f2e2fb2a208ff77267422a197d9fxgu  TextOutList           = Private->TextOutList;
318195276127e373f2e2fb2a208ff77267422a197d9fxgu  while (Index >= 0) {
318295276127e373f2e2fb2a208ff77267422a197d9fxgu    if (TextOutList->TextOut == TextOut) {
3183f58fcb0a1df34c32130dc852ae083895e2e52923li-elvin      if (TextOutList->UgaDraw != NULL) {
3184aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff        Private->CurrentNumberOfUgaDraw--;
3185aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff      }
3186aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff      if (TextOutList->GraphicsOutput != NULL) {
3187aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff        Private->CurrentNumberOfGraphicsOutput--;
3188aec072adb2af2bd1cc0677a25d4a099c8779c10dvanjeff      }
31895469967137a29bf0f8893ae120391df079eccffdvanjeff      CopyMem (TextOutList, TextOutList + 1, sizeof (TEXT_OUT_AND_GOP_DATA) * Index);
31905469967137a29bf0f8893ae120391df079eccffdvanjeff      CurrentNumOfConsoles--;
319195276127e373f2e2fb2a208ff77267422a197d9fxgu      break;
319295276127e373f2e2fb2a208ff77267422a197d9fxgu    }
319395276127e373f2e2fb2a208ff77267422a197d9fxgu
319495276127e373f2e2fb2a208ff77267422a197d9fxgu    Index--;
319595276127e373f2e2fb2a208ff77267422a197d9fxgu    TextOutList++;
319695276127e373f2e2fb2a208ff77267422a197d9fxgu  }
319795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
319895276127e373f2e2fb2a208ff77267422a197d9fxgu  // The specified TextOut is not managed by the ConSplitter driver
319995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
320095276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Index < 0) {
320195276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_NOT_FOUND;
320295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
320395276127e373f2e2fb2a208ff77267422a197d9fxgu
3204cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin  if ((Private->CurrentNumberOfGraphicsOutput == 0) && (Private->CurrentNumberOfUgaDraw == 0)) {
3205cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin    //
3206cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin    // If there is not any physical GOP and UGA device in system,
3207cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin    // Consplitter GOP or UGA protocol will be uninstalled
3208cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin    //
3209cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin    if (!FeaturePcdGet (PcdConOutGopSupport)) {
3210cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin      Status = gBS->UninstallProtocolInterface (
3211cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin                      Private->VirtualHandle,
3212cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin                      &gEfiUgaDrawProtocolGuid,
3213cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin                      &Private->UgaDraw
3214cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin                      );
3215cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin    } else if (!FeaturePcdGet (PcdConOutUgaSupport)) {
3216cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin      Status = gBS->UninstallProtocolInterface (
3217cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin                      Private->VirtualHandle,
3218cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin                      &gEfiGraphicsOutputProtocolGuid,
3219cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin                      &Private->GraphicsOutput
3220cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin                      );
3221cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin    } else {
3222cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin      Status = gBS->UninstallMultipleProtocolInterfaces (
3223cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin             Private->VirtualHandle,
3224cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin             &gEfiUgaDrawProtocolGuid,
3225cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin             &Private->UgaDraw,
3226cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin             &gEfiGraphicsOutputProtocolGuid,
3227cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin             &Private->GraphicsOutput,
3228cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin             NULL
3229cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin             );
3230cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin    }
3231cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin  }
3232cc1a5b86ff05c6b245f27cf309d06a113e511514li-elvin
323395276127e373f2e2fb2a208ff77267422a197d9fxgu  if (CurrentNumOfConsoles == 0) {
323495276127e373f2e2fb2a208ff77267422a197d9fxgu    //
32359937b36506924de4b721f03addc50ed318474a5evanjeff    // If the number of consoles is zero, reset all parameters
323695276127e373f2e2fb2a208ff77267422a197d9fxgu    //
323795276127e373f2e2fb2a208ff77267422a197d9fxgu    Private->CurrentNumberOfConsoles      = 0;
323895276127e373f2e2fb2a208ff77267422a197d9fxgu    Private->TextOutMode.MaxMode          = 1;
323995276127e373f2e2fb2a208ff77267422a197d9fxgu    Private->TextOutQueryData[0].Columns  = 80;
324095276127e373f2e2fb2a208ff77267422a197d9fxgu    Private->TextOutQueryData[0].Rows     = 25;
32419937b36506924de4b721f03addc50ed318474a5evanjeff    TextOutSetMode (Private, 0);
324295276127e373f2e2fb2a208ff77267422a197d9fxgu
324395276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_SUCCESS;
324495276127e373f2e2fb2a208ff77267422a197d9fxgu  }
324595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
324695276127e373f2e2fb2a208ff77267422a197d9fxgu  // Max Mode is realy an intersection of the QueryMode command to all
324795276127e373f2e2fb2a208ff77267422a197d9fxgu  // devices. So we must copy the QueryMode of the first device to
324895276127e373f2e2fb2a208ff77267422a197d9fxgu  // QueryData.
324995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
325095276127e373f2e2fb2a208ff77267422a197d9fxgu  ZeroMem (
325195276127e373f2e2fb2a208ff77267422a197d9fxgu    Private->TextOutQueryData,
325295276127e373f2e2fb2a208ff77267422a197d9fxgu    Private->TextOutQueryDataCount * sizeof (TEXT_OUT_SPLITTER_QUERY_DATA)
325395276127e373f2e2fb2a208ff77267422a197d9fxgu    );
325495276127e373f2e2fb2a208ff77267422a197d9fxgu
325595276127e373f2e2fb2a208ff77267422a197d9fxgu  FreePool (Private->TextOutModeMap);
325695276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->TextOutModeMap = NULL;
325795276127e373f2e2fb2a208ff77267422a197d9fxgu  TextOutList             = Private->TextOutList;
325895276127e373f2e2fb2a208ff77267422a197d9fxgu
325995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
326095276127e373f2e2fb2a208ff77267422a197d9fxgu  // Add the first TextOut to the QueryData array and ModeMap table
326195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
326295276127e373f2e2fb2a208ff77267422a197d9fxgu  Status = ConSplitterAddOutputMode (Private, TextOutList->TextOut);
326395276127e373f2e2fb2a208ff77267422a197d9fxgu
326495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
326595276127e373f2e2fb2a208ff77267422a197d9fxgu  // Now add one by one
326695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
326795276127e373f2e2fb2a208ff77267422a197d9fxgu  Index = 1;
326895276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->CurrentNumberOfConsoles = 1;
326995276127e373f2e2fb2a208ff77267422a197d9fxgu  TextOutList++;
327095276127e373f2e2fb2a208ff77267422a197d9fxgu  while ((UINTN) Index < CurrentNumOfConsoles) {
327195276127e373f2e2fb2a208ff77267422a197d9fxgu    ConSplitterSyncOutputMode (Private, TextOutList->TextOut);
327295276127e373f2e2fb2a208ff77267422a197d9fxgu    Index++;
327395276127e373f2e2fb2a208ff77267422a197d9fxgu    Private->CurrentNumberOfConsoles++;
327495276127e373f2e2fb2a208ff77267422a197d9fxgu    TextOutList++;
327595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
327695276127e373f2e2fb2a208ff77267422a197d9fxgu
327795276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterGetIntersectionBetweenConOutAndStrErr ();
327895276127e373f2e2fb2a208ff77267422a197d9fxgu
327995276127e373f2e2fb2a208ff77267422a197d9fxgu  return Status;
328095276127e373f2e2fb2a208ff77267422a197d9fxgu}
32814b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff
3282a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3283a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3284a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reset the input device and optionaly run diagnostics
3285a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3286a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
3287a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  ExtendedVerification     Driver may perform diagnostics on reset.
3288a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3289a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The device was reset.
3290a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device is not functioning properly and could
3291a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   not be reset.
3292a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3293a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
329495276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
329595276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
329695276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextInReset (
329795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This,
329895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  BOOLEAN                         ExtendedVerification
329995276127e373f2e2fb2a208ff77267422a197d9fxgu  )
330095276127e373f2e2fb2a208ff77267422a197d9fxgu{
330195276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                    Status;
330295276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                    ReturnStatus;
330395276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
330495276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         Index;
330595276127e373f2e2fb2a208ff77267422a197d9fxgu
330695276127e373f2e2fb2a208ff77267422a197d9fxgu  Private                       = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
330795276127e373f2e2fb2a208ff77267422a197d9fxgu
330895276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->KeyEventSignalState  = FALSE;
330995276127e373f2e2fb2a208ff77267422a197d9fxgu
331095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
331195276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
331295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
331395276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
331495276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = Private->TextInList[Index]->Reset (
331595276127e373f2e2fb2a208ff77267422a197d9fxgu                                          Private->TextInList[Index],
331695276127e373f2e2fb2a208ff77267422a197d9fxgu                                          ExtendedVerification
331795276127e373f2e2fb2a208ff77267422a197d9fxgu                                          );
331895276127e373f2e2fb2a208ff77267422a197d9fxgu    if (EFI_ERROR (Status)) {
331995276127e373f2e2fb2a208ff77267422a197d9fxgu      ReturnStatus = Status;
332095276127e373f2e2fb2a208ff77267422a197d9fxgu    }
332195276127e373f2e2fb2a208ff77267422a197d9fxgu  }
332295276127e373f2e2fb2a208ff77267422a197d9fxgu
332395276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
332495276127e373f2e2fb2a208ff77267422a197d9fxgu}
332595276127e373f2e2fb2a208ff77267422a197d9fxgu
3326a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3327a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3328a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reads the next keystroke from the input device. The WaitForKey Event can
3329a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  be used to test for existance of a keystroke via WaitForEvent () call.
3330a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
333133019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Private                  Protocol instance pointer.
3332a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Key                      Driver may perform diagnostics on reset.
3333a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3334a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The keystroke information was returned.
3335a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_NOT_READY            There was no keystroke data availiable.
3336a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The keydtroke information was not returned due
3337a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   to hardware errors.
3338a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3339a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
334095276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
334195276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
334295276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextInPrivateReadKeyStroke (
334395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
334495276127e373f2e2fb2a208ff77267422a197d9fxgu  OUT EFI_INPUT_KEY                   *Key
334595276127e373f2e2fb2a208ff77267422a197d9fxgu  )
334695276127e373f2e2fb2a208ff77267422a197d9fxgu{
334795276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS    Status;
334895276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN         Index;
334995276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_INPUT_KEY CurrentKey;
335095276127e373f2e2fb2a208ff77267422a197d9fxgu
335195276127e373f2e2fb2a208ff77267422a197d9fxgu  Key->UnicodeChar  = 0;
335295276127e373f2e2fb2a208ff77267422a197d9fxgu  Key->ScanCode     = SCAN_NULL;
335395276127e373f2e2fb2a208ff77267422a197d9fxgu
335495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
335595276127e373f2e2fb2a208ff77267422a197d9fxgu  // if no physical console input device exists, return EFI_NOT_READY;
335695276127e373f2e2fb2a208ff77267422a197d9fxgu  // if any physical console input device has key input,
335795276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the key and EFI_SUCCESS.
335895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
335995276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {
336095276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = Private->TextInList[Index]->ReadKeyStroke (
336195276127e373f2e2fb2a208ff77267422a197d9fxgu                                          Private->TextInList[Index],
336295276127e373f2e2fb2a208ff77267422a197d9fxgu                                          &CurrentKey
336395276127e373f2e2fb2a208ff77267422a197d9fxgu                                          );
336495276127e373f2e2fb2a208ff77267422a197d9fxgu    if (!EFI_ERROR (Status)) {
336595276127e373f2e2fb2a208ff77267422a197d9fxgu      *Key = CurrentKey;
336695276127e373f2e2fb2a208ff77267422a197d9fxgu      return Status;
336795276127e373f2e2fb2a208ff77267422a197d9fxgu    }
336895276127e373f2e2fb2a208ff77267422a197d9fxgu  }
336995276127e373f2e2fb2a208ff77267422a197d9fxgu
337095276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_NOT_READY;
337195276127e373f2e2fb2a208ff77267422a197d9fxgu}
337295276127e373f2e2fb2a208ff77267422a197d9fxgu
3373838a9c58c949a47194f507561eb44f9b1b7499acczhang
3374a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3375a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3376a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reads the next keystroke from the input device. The WaitForKey Event can
3377a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  be used to test for existance of a keystroke via WaitForEvent () call.
3378a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3379a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
3380a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Key                      Driver may perform diagnostics on reset.
3381a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3382a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The keystroke information was returned.
3383a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_NOT_READY            There was no keystroke data availiable.
3384a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The keydtroke information was not returned due
3385a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   to hardware errors.
3386a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3387a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
338895276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
338995276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
339095276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextInReadKeyStroke (
339195276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This,
339295276127e373f2e2fb2a208ff77267422a197d9fxgu  OUT EFI_INPUT_KEY                   *Key
339395276127e373f2e2fb2a208ff77267422a197d9fxgu  )
339495276127e373f2e2fb2a208ff77267422a197d9fxgu{
339595276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
339695276127e373f2e2fb2a208ff77267422a197d9fxgu
339795276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
339895276127e373f2e2fb2a208ff77267422a197d9fxgu
339995276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->KeyEventSignalState = FALSE;
340095276127e373f2e2fb2a208ff77267422a197d9fxgu
3401838a9c58c949a47194f507561eb44f9b1b7499acczhang  //
3402f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  // Signal ConnectConIn event on first call in Lazy ConIn mode
3403838a9c58c949a47194f507561eb44f9b1b7499acczhang  //
3404838a9c58c949a47194f507561eb44f9b1b7499acczhang  if (!mConInIsConnect && PcdGetBool (PcdConInConnectOnDemand)) {
3405838a9c58c949a47194f507561eb44f9b1b7499acczhang    DEBUG ((EFI_D_INFO, "Connect ConIn in first ReadKeyStoke in Lazy ConIn mode.\n"));
340689b5f4b33fd5f4ec9cf6b7c341d47f912ad5c7b7czhang    gBS->SignalEvent (Private->ConnectConInEvent);
3407838a9c58c949a47194f507561eb44f9b1b7499acczhang    mConInIsConnect = TRUE;
3408838a9c58c949a47194f507561eb44f9b1b7499acczhang  }
3409838a9c58c949a47194f507561eb44f9b1b7499acczhang
341095276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterTextInPrivateReadKeyStroke (Private, Key);
341195276127e373f2e2fb2a208ff77267422a197d9fxgu}
341295276127e373f2e2fb2a208ff77267422a197d9fxgu
341395276127e373f2e2fb2a208ff77267422a197d9fxgu
3414a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3415f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff  This event aggregates all the events of the ConIn devices in the spliter.
3416f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff
341795276127e373f2e2fb2a208ff77267422a197d9fxgu  If any events of physical ConIn devices are signaled, signal the ConIn
341895276127e373f2e2fb2a208ff77267422a197d9fxgu  spliter event. This will cause the calling code to call
341995276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterTextInReadKeyStroke ().
342095276127e373f2e2fb2a208ff77267422a197d9fxgu
3421a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Event                    The Event assoicated with callback.
3422a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Context                  Context registered when Event was created.
342395276127e373f2e2fb2a208ff77267422a197d9fxgu
3424a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
3425a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffVOID
3426a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffEFIAPI
3427a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffConSplitterTextInWaitForKey (
3428a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN  EFI_EVENT                       Event,
3429a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN  VOID                            *Context
3430a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  )
343195276127e373f2e2fb2a208ff77267422a197d9fxgu{
343295276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                    Status;
343395276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
343495276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         Index;
343595276127e373f2e2fb2a208ff77267422a197d9fxgu
343695276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = (TEXT_IN_SPLITTER_PRIVATE_DATA *) Context;
3437f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff
343895276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Private->KeyEventSignalState) {
3439f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff    //
3440f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff    // If KeyEventSignalState is flagged before, and not cleared by Reset() or ReadKeyStroke()
3441f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff    //
344295276127e373f2e2fb2a208ff77267422a197d9fxgu    gBS->SignalEvent (Event);
344395276127e373f2e2fb2a208ff77267422a197d9fxgu    return ;
344495276127e373f2e2fb2a208ff77267422a197d9fxgu  }
3445f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff
344695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
3447f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff  // If any physical console input device has key input, signal the event.
344895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
344995276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {
345095276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = gBS->CheckEvent (Private->TextInList[Index]->WaitForKey);
345195276127e373f2e2fb2a208ff77267422a197d9fxgu    if (!EFI_ERROR (Status)) {
345295276127e373f2e2fb2a208ff77267422a197d9fxgu      gBS->SignalEvent (Event);
345395276127e373f2e2fb2a208ff77267422a197d9fxgu      Private->KeyEventSignalState = TRUE;
345495276127e373f2e2fb2a208ff77267422a197d9fxgu    }
345595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
345695276127e373f2e2fb2a208ff77267422a197d9fxgu}
345795276127e373f2e2fb2a208ff77267422a197d9fxgu
345866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
3459a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3460a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
34614b5c4fba5929750f36dbc8dca4e4520cd78e2f60vanjeff  Test if the key has been registered on input device.
3462a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3463a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  RegsiteredData           A pointer to a buffer that is filled in with the
3464a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   keystroke state data for the key that was
3465a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   registered.
3466a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  InputData                A pointer to a buffer that is filled in with the
3467a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   keystroke state data for the key that was
3468a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   pressed.
3469a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3470a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval TRUE                     Key be pressed matches a registered key.
3471a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval FLASE                    Match failed.
3472a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3473a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
347466aa04e4e3a0b84369cbb483a78c4113b619663aqhuangBOOLEAN
347566aa04e4e3a0b84369cbb483a78c4113b619663aqhuangIsKeyRegistered (
347666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_KEY_DATA  *RegsiteredData,
347766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_KEY_DATA  *InputData
347866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  )
347966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang{
348066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  ASSERT (RegsiteredData != NULL && InputData != NULL);
34817a5064ce425f85da87deaabc726945d1c980aafbvanjeff
348266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if ((RegsiteredData->Key.ScanCode    != InputData->Key.ScanCode) ||
348366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
34847a5064ce425f85da87deaabc726945d1c980aafbvanjeff    return FALSE;
34857a5064ce425f85da87deaabc726945d1c980aafbvanjeff  }
34867a5064ce425f85da87deaabc726945d1c980aafbvanjeff
348766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
348866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
348966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
349066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (RegsiteredData->KeyState.KeyShiftState != 0 &&
349166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {
34927a5064ce425f85da87deaabc726945d1c980aafbvanjeff    return FALSE;
34937a5064ce425f85da87deaabc726945d1c980aafbvanjeff  }
349466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (RegsiteredData->KeyState.KeyToggleState != 0 &&
349566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {
34967a5064ce425f85da87deaabc726945d1c980aafbvanjeff    return FALSE;
34977a5064ce425f85da87deaabc726945d1c980aafbvanjeff  }
34987a5064ce425f85da87deaabc726945d1c980aafbvanjeff
349966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  return TRUE;
350066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
350166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang}
350266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
3503a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3504a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3505a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reset the input device and optionaly run diagnostics
3506a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3507a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
3508a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  ExtendedVerification     Driver may perform diagnostics on reset.
3509a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3510a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The device was reset.
3511a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device is not functioning properly and could
3512a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   not be reset.
3513a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3514a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
351566aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFI_STATUS
351666aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFIAPI
351766aa04e4e3a0b84369cbb483a78c4113b619663aqhuangConSplitterTextInResetEx (
351866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
351966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN BOOLEAN                            ExtendedVerification
352066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  )
352166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang{
352266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  EFI_STATUS                    Status;
352366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  EFI_STATUS                    ReturnStatus;
352466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
352566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  UINTN                         Index;
352666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
352766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private                       = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
352866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
352966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private->KeyEventSignalState  = FALSE;
353066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
353166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
353266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // return the worst status met
353366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
353466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfExConsoles; Index++) {
353566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    Status = Private->TextInExList[Index]->Reset (
353666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             Private->TextInExList[Index],
353766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             ExtendedVerification
353866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             );
353966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    if (EFI_ERROR (Status)) {
354066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      ReturnStatus = Status;
354166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    }
354266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
354366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
354466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  return ReturnStatus;
354566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
354666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang}
354766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
3548a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3549a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3550a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reads the next keystroke from the input device. The WaitForKey Event can
3551a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  be used to test for existance of a keystroke via WaitForEvent () call.
3552a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3553a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
3554a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  KeyData                  A pointer to a buffer that is filled in with the
3555a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   keystroke state data for the key that was
3556a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   pressed.
3557a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3558a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The keystroke information was returned.
3559a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_NOT_READY            There was no keystroke data availiable.
3560a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The keystroke information was not returned due
3561a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   to hardware errors.
3562a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_INVALID_PARAMETER    KeyData is NULL.
3563a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3564a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
356566aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFI_STATUS
356666aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFIAPI
356766aa04e4e3a0b84369cbb483a78c4113b619663aqhuangConSplitterTextInReadKeyStrokeEx (
356866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
356966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  OUT EFI_KEY_DATA                      *KeyData
357066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  )
357166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang{
357266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
357366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  EFI_STATUS                    Status;
357466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  UINTN                         Index;
357566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  EFI_KEY_DATA                  CurrentKeyData;
357666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
35777a5064ce425f85da87deaabc726945d1c980aafbvanjeff
357866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (KeyData == NULL) {
357966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    return EFI_INVALID_PARAMETER;
358066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
358166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
358266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
358366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
358466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private->KeyEventSignalState = FALSE;
358566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
358666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  KeyData->Key.UnicodeChar  = 0;
358766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  KeyData->Key.ScanCode     = SCAN_NULL;
358866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
358966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
3590f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  // Signal ConnectConIn event on first call in Lazy ConIn mode
3591f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  //
3592f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  if (!mConInIsConnect && PcdGetBool (PcdConInConnectOnDemand)) {
3593f58f3de07ef4531828c108ea099ff637f8c52d1fczhang    DEBUG ((EFI_D_INFO, "Connect ConIn in first ReadKeyStoke in Lazy ConIn mode.\n"));
359489b5f4b33fd5f4ec9cf6b7c341d47f912ad5c7b7czhang    gBS->SignalEvent (Private->ConnectConInEvent);
3595f58f3de07ef4531828c108ea099ff637f8c52d1fczhang    mConInIsConnect = TRUE;
3596f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  }
3597f58f3de07ef4531828c108ea099ff637f8c52d1fczhang
3598f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  //
359966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // if no physical console input device exists, return EFI_NOT_READY;
360066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // if any physical console input device has key input,
360166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // return the key and EFI_SUCCESS.
360266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
360366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {
360466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    Status = Private->TextInExList[Index]->ReadKeyStrokeEx (
360566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                          Private->TextInExList[Index],
360666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                          &CurrentKeyData
360766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                          );
360866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    if (!EFI_ERROR (Status)) {
360966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      CopyMem (KeyData, &CurrentKeyData, sizeof (CurrentKeyData));
361066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      return Status;
361166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    }
361266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
361366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
36147a5064ce425f85da87deaabc726945d1c980aafbvanjeff  return EFI_NOT_READY;
361566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang}
361666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
3617a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3618a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3619a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Set certain state for the input device.
3620a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3621a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
3622a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  KeyToggleState           A pointer to the EFI_KEY_TOGGLE_STATE to set the
3623a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   state for the input device.
3624a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3625a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The device state was set successfully.
3626a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device is not functioning correctly and
3627a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   could not have the setting adjusted.
3628a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          The device does not have the ability to set its
3629a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   state.
3630a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_INVALID_PARAMETER    KeyToggleState is NULL.
3631a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3632a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
363366aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFI_STATUS
363466aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFIAPI
363566aa04e4e3a0b84369cbb483a78c4113b619663aqhuangConSplitterTextInSetState (
363666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
363766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_KEY_TOGGLE_STATE               *KeyToggleState
363866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  )
363966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang{
364066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
364166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  EFI_STATUS                    Status;
364266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  UINTN                         Index;
364366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
364466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (KeyToggleState == NULL) {
364566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    return EFI_INVALID_PARAMETER;
364666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
364766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
364866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
364966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
365066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
365166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // if no physical console input device exists, return EFI_SUCCESS;
365266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // otherwise return the status of setting state of physical console input device
365366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
365466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {
365566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    Status = Private->TextInExList[Index]->SetState (
365666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             Private->TextInExList[Index],
365766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             KeyToggleState
365866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             );
365966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    if (EFI_ERROR (Status)) {
366066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      return Status;
366166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    }
366266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
366366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
36647a5064ce425f85da87deaabc726945d1c980aafbvanjeff  return EFI_SUCCESS;
366566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
366666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang}
366766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
3668a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3669a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3670a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Register a notification function for a particular keystroke for the input device.
3671a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3672a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
3673a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  KeyData                  A pointer to a buffer that is filled in with the
3674a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   keystroke information data for the key that was
3675a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   pressed.
3676a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  KeyNotificationFunction  Points to the function to be called when the key
3677a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   sequence is typed specified by KeyData.
3678a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  NotifyHandle             Points to the unique handle assigned to the
3679a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   registered notification.
3680a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3681a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The notification function was registered
3682a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   successfully.
3683a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_OUT_OF_RESOURCES     Unable to allocate resources for necesssary data
3684a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   structures.
3685f890b1e053c20f386fbd6bc9a8db39b5104a5777vanjeff  @retval EFI_INVALID_PARAMETER    KeyData or KeyNotificationFunction or NotifyHandle is NULL.
3686a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3687a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
368866aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFI_STATUS
368966aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFIAPI
369066aa04e4e3a0b84369cbb483a78c4113b619663aqhuangConSplitterTextInRegisterKeyNotify (
369166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
369266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_KEY_DATA                       *KeyData,
369366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,
3694402e4a9d777677296945afa020194bf4123885e2niruiyu  OUT VOID                              **NotifyHandle
369566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  )
369666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang{
369766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
369866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  EFI_STATUS                    Status;
369966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  UINTN                         Index;
370066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  TEXT_IN_EX_SPLITTER_NOTIFY    *NewNotify;
370166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  LIST_ENTRY                    *Link;
37027a5064ce425f85da87deaabc726945d1c980aafbvanjeff  TEXT_IN_EX_SPLITTER_NOTIFY    *CurrentNotify;
37037a5064ce425f85da87deaabc726945d1c980aafbvanjeff
370466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
370566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (KeyData == NULL || NotifyHandle == NULL || KeyNotificationFunction == NULL) {
370666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    return EFI_INVALID_PARAMETER;
370766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
370866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
370966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
371066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
371166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
371266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.
371366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
371466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
3715fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    CurrentNotify = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);
37167a5064ce425f85da87deaabc726945d1c980aafbvanjeff    if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
371766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
3718402e4a9d777677296945afa020194bf4123885e2niruiyu        *NotifyHandle = CurrentNotify;
371966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang        return EFI_SUCCESS;
372066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      }
372166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    }
372266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
37237a5064ce425f85da87deaabc726945d1c980aafbvanjeff
372466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
372566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // Allocate resource to save the notification function
37267a5064ce425f85da87deaabc726945d1c980aafbvanjeff  //
372766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  NewNotify = (TEXT_IN_EX_SPLITTER_NOTIFY *) AllocateZeroPool (sizeof (TEXT_IN_EX_SPLITTER_NOTIFY));
372866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (NewNotify == NULL) {
372966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    return EFI_OUT_OF_RESOURCES;
373066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
3731a974619978dff4528e810f74fb736cb474db65c1niruiyu  NewNotify->NotifyHandleList = (EFI_HANDLE *) AllocateZeroPool (sizeof (EFI_HANDLE) *  Private->TextInExListCount);
373266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (NewNotify->NotifyHandleList == NULL) {
373366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    gBS->FreePool (NewNotify);
373466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    return EFI_OUT_OF_RESOURCES;
373566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
37367a5064ce425f85da87deaabc726945d1c980aafbvanjeff  NewNotify->Signature         = TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE;
373766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  NewNotify->KeyNotificationFn = KeyNotificationFunction;
3738f0384583afe35c9e5f2771ac975076521eb5e37eniruiyu  CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA));
37397a5064ce425f85da87deaabc726945d1c980aafbvanjeff
374066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
37417a5064ce425f85da87deaabc726945d1c980aafbvanjeff  // Return the wrong status of registering key notify of
374266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  // physical console input device if meet problems
374366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  //
374466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {
374566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    Status = Private->TextInExList[Index]->RegisterKeyNotify (
374666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             Private->TextInExList[Index],
374766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             KeyData,
374866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             KeyNotificationFunction,
374966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             &NewNotify->NotifyHandleList[Index]
375066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang                                             );
375166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    if (EFI_ERROR (Status)) {
3752a974619978dff4528e810f74fb736cb474db65c1niruiyu      //
3753a974619978dff4528e810f74fb736cb474db65c1niruiyu      // Un-register the key notify on all physical console input devices
3754a974619978dff4528e810f74fb736cb474db65c1niruiyu      //
3755a974619978dff4528e810f74fb736cb474db65c1niruiyu      while (Index-- != 0) {
3756a974619978dff4528e810f74fb736cb474db65c1niruiyu        Private->TextInExList[Index]->UnregisterKeyNotify (
3757a974619978dff4528e810f74fb736cb474db65c1niruiyu                                        Private->TextInExList[Index],
3758a974619978dff4528e810f74fb736cb474db65c1niruiyu                                        NewNotify->NotifyHandleList[Index]
3759a974619978dff4528e810f74fb736cb474db65c1niruiyu                                        );
3760a974619978dff4528e810f74fb736cb474db65c1niruiyu      }
376166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      gBS->FreePool (NewNotify->NotifyHandleList);
376266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      gBS->FreePool (NewNotify);
376366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      return Status;
376466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    }
376566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
376666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
376766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  InsertTailList (&mConIn.NotifyList, &NewNotify->NotifyEntry);
37687a5064ce425f85da87deaabc726945d1c980aafbvanjeff
3769402e4a9d777677296945afa020194bf4123885e2niruiyu  *NotifyHandle                = NewNotify;
37707a5064ce425f85da87deaabc726945d1c980aafbvanjeff
37717a5064ce425f85da87deaabc726945d1c980aafbvanjeff  return EFI_SUCCESS;
37727a5064ce425f85da87deaabc726945d1c980aafbvanjeff
377366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang}
377466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
3775a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3776a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3777a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Remove a registered notification function from a particular keystroke.
3778a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3779a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
3780a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  NotificationHandle       The handle of the notification function being
3781a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   unregistered.
3782a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3783a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The notification function was unregistered
3784a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   successfully.
3785a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_INVALID_PARAMETER    The NotificationHandle is invalid.
3786a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3787a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
378866aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFI_STATUS
378966aa04e4e3a0b84369cbb483a78c4113b619663aqhuangEFIAPI
379066aa04e4e3a0b84369cbb483a78c4113b619663aqhuangConSplitterTextInUnregisterKeyNotify (
379166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
3792402e4a9d777677296945afa020194bf4123885e2niruiyu  IN VOID                               *NotificationHandle
379366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  )
379466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang{
379566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
379666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  UINTN                         Index;
379766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  TEXT_IN_EX_SPLITTER_NOTIFY    *CurrentNotify;
37987a5064ce425f85da87deaabc726945d1c980aafbvanjeff  LIST_ENTRY                    *Link;
379966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
380066aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  if (NotificationHandle == NULL) {
380166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang    return EFI_INVALID_PARAMETER;
380266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
380366aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
380466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  Private = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
380566aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
380666aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
3807fc753d3b82f545cfe2c2d2e084b44a0c0e2a9c52vanjeff    CurrentNotify = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);
3808402e4a9d777677296945afa020194bf4123885e2niruiyu    if (CurrentNotify == NotificationHandle) {
380966aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {
3810a974619978dff4528e810f74fb736cb474db65c1niruiyu        Private->TextInExList[Index]->UnregisterKeyNotify (
3811a974619978dff4528e810f74fb736cb474db65c1niruiyu                                        Private->TextInExList[Index],
3812a974619978dff4528e810f74fb736cb474db65c1niruiyu                                        CurrentNotify->NotifyHandleList[Index]
3813a974619978dff4528e810f74fb736cb474db65c1niruiyu                                        );
381466aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      }
38157a5064ce425f85da87deaabc726945d1c980aafbvanjeff      RemoveEntryList (&CurrentNotify->NotifyEntry);
38167fc80d44841dbc1f1b68d75312ab7ec9e6d63613vanjeff
381766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      gBS->FreePool (CurrentNotify->NotifyHandleList);
381866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang      gBS->FreePool (CurrentNotify);
38197a5064ce425f85da87deaabc726945d1c980aafbvanjeff      return EFI_SUCCESS;
38207a5064ce425f85da87deaabc726945d1c980aafbvanjeff    }
382166aa04e4e3a0b84369cbb483a78c4113b619663aqhuang  }
382266aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
38238a67d804b3b660b233ba58e24fee81c76786001bvanjeff  //
38248a67d804b3b660b233ba58e24fee81c76786001bvanjeff  // NotificationHandle is not found in database
38258a67d804b3b660b233ba58e24fee81c76786001bvanjeff  //
38268a67d804b3b660b233ba58e24fee81c76786001bvanjeff  return EFI_INVALID_PARAMETER;
382766aa04e4e3a0b84369cbb483a78c4113b619663aqhuang}
382866aa04e4e3a0b84369cbb483a78c4113b619663aqhuang
3829a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3830a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3831a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reset the input device and optionaly run diagnostics
3832a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3833a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
3834a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  ExtendedVerification     Driver may perform diagnostics on reset.
3835a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3836a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The device was reset.
3837a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device is not functioning properly and could
3838a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   not be reset.
3839a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3840a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
384195276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
384295276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
384395276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSimplePointerReset (
384495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_POINTER_PROTOCOL     *This,
384595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  BOOLEAN                         ExtendedVerification
384695276127e373f2e2fb2a208ff77267422a197d9fxgu  )
384795276127e373f2e2fb2a208ff77267422a197d9fxgu{
384895276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                    Status;
384995276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                    ReturnStatus;
385095276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
385195276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         Index;
385295276127e373f2e2fb2a208ff77267422a197d9fxgu
385395276127e373f2e2fb2a208ff77267422a197d9fxgu  Private                         = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_SIMPLE_POINTER_THIS (This);
385495276127e373f2e2fb2a208ff77267422a197d9fxgu
385595276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->InputEventSignalState  = FALSE;
385695276127e373f2e2fb2a208ff77267422a197d9fxgu
385795276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Private->CurrentNumberOfPointers == 0) {
385895276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_SUCCESS;
385995276127e373f2e2fb2a208ff77267422a197d9fxgu  }
386095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
386195276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
386295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
386395276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfPointers; Index++) {
386495276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = Private->PointerList[Index]->Reset (
386595276127e373f2e2fb2a208ff77267422a197d9fxgu                                            Private->PointerList[Index],
386695276127e373f2e2fb2a208ff77267422a197d9fxgu                                            ExtendedVerification
386795276127e373f2e2fb2a208ff77267422a197d9fxgu                                            );
386895276127e373f2e2fb2a208ff77267422a197d9fxgu    if (EFI_ERROR (Status)) {
386995276127e373f2e2fb2a208ff77267422a197d9fxgu      ReturnStatus = Status;
387095276127e373f2e2fb2a208ff77267422a197d9fxgu    }
387195276127e373f2e2fb2a208ff77267422a197d9fxgu  }
387295276127e373f2e2fb2a208ff77267422a197d9fxgu
387395276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
387495276127e373f2e2fb2a208ff77267422a197d9fxgu}
387595276127e373f2e2fb2a208ff77267422a197d9fxgu
3876a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3877a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3878a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reads the next keystroke from the input device. The WaitForKey Event can
3879a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  be used to test for existance of a keystroke via WaitForEvent () call.
3880a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
388133019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Private                  Protocol instance pointer.
388233019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  State                    The state information of simple pointer device.
3883a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3884a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The keystroke information was returned.
3885a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_NOT_READY            There was no keystroke data availiable.
3886a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The keydtroke information was not returned due
3887a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   to hardware errors.
3888a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3889a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
389095276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
389195276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
389295276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSimplePointerPrivateGetState (
389395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
389495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN OUT EFI_SIMPLE_POINTER_STATE     *State
389595276127e373f2e2fb2a208ff77267422a197d9fxgu  )
389695276127e373f2e2fb2a208ff77267422a197d9fxgu{
389795276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                Status;
389895276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                ReturnStatus;
389995276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                     Index;
390095276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_SIMPLE_POINTER_STATE  CurrentState;
390195276127e373f2e2fb2a208ff77267422a197d9fxgu
390295276127e373f2e2fb2a208ff77267422a197d9fxgu  State->RelativeMovementX  = 0;
390395276127e373f2e2fb2a208ff77267422a197d9fxgu  State->RelativeMovementY  = 0;
390495276127e373f2e2fb2a208ff77267422a197d9fxgu  State->RelativeMovementZ  = 0;
390595276127e373f2e2fb2a208ff77267422a197d9fxgu  State->LeftButton         = FALSE;
390695276127e373f2e2fb2a208ff77267422a197d9fxgu  State->RightButton        = FALSE;
390795276127e373f2e2fb2a208ff77267422a197d9fxgu
390895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
390995276127e373f2e2fb2a208ff77267422a197d9fxgu  // if no physical console input device exists, return EFI_NOT_READY;
391095276127e373f2e2fb2a208ff77267422a197d9fxgu  // if any physical console input device has key input,
391195276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the key and EFI_SUCCESS.
391295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
391395276127e373f2e2fb2a208ff77267422a197d9fxgu  ReturnStatus = EFI_NOT_READY;
391495276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0; Index < Private->CurrentNumberOfPointers; Index++) {
391595276127e373f2e2fb2a208ff77267422a197d9fxgu
391695276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = Private->PointerList[Index]->GetState (
391795276127e373f2e2fb2a208ff77267422a197d9fxgu                                            Private->PointerList[Index],
391895276127e373f2e2fb2a208ff77267422a197d9fxgu                                            &CurrentState
391995276127e373f2e2fb2a208ff77267422a197d9fxgu                                            );
392095276127e373f2e2fb2a208ff77267422a197d9fxgu    if (!EFI_ERROR (Status)) {
392195276127e373f2e2fb2a208ff77267422a197d9fxgu      if (ReturnStatus == EFI_NOT_READY) {
392295276127e373f2e2fb2a208ff77267422a197d9fxgu        ReturnStatus = EFI_SUCCESS;
392395276127e373f2e2fb2a208ff77267422a197d9fxgu      }
392495276127e373f2e2fb2a208ff77267422a197d9fxgu
392595276127e373f2e2fb2a208ff77267422a197d9fxgu      if (CurrentState.LeftButton) {
392695276127e373f2e2fb2a208ff77267422a197d9fxgu        State->LeftButton = TRUE;
392795276127e373f2e2fb2a208ff77267422a197d9fxgu      }
392895276127e373f2e2fb2a208ff77267422a197d9fxgu
392995276127e373f2e2fb2a208ff77267422a197d9fxgu      if (CurrentState.RightButton) {
393095276127e373f2e2fb2a208ff77267422a197d9fxgu        State->RightButton = TRUE;
393195276127e373f2e2fb2a208ff77267422a197d9fxgu      }
393295276127e373f2e2fb2a208ff77267422a197d9fxgu
393395276127e373f2e2fb2a208ff77267422a197d9fxgu      if (CurrentState.RelativeMovementX != 0 && Private->PointerList[Index]->Mode->ResolutionX != 0) {
393495276127e373f2e2fb2a208ff77267422a197d9fxgu        State->RelativeMovementX += (CurrentState.RelativeMovementX * (INT32) Private->SimplePointerMode.ResolutionX) / (INT32) Private->PointerList[Index]->Mode->ResolutionX;
393595276127e373f2e2fb2a208ff77267422a197d9fxgu      }
393695276127e373f2e2fb2a208ff77267422a197d9fxgu
393795276127e373f2e2fb2a208ff77267422a197d9fxgu      if (CurrentState.RelativeMovementY != 0 && Private->PointerList[Index]->Mode->ResolutionY != 0) {
393895276127e373f2e2fb2a208ff77267422a197d9fxgu        State->RelativeMovementY += (CurrentState.RelativeMovementY * (INT32) Private->SimplePointerMode.ResolutionY) / (INT32) Private->PointerList[Index]->Mode->ResolutionY;
393995276127e373f2e2fb2a208ff77267422a197d9fxgu      }
394095276127e373f2e2fb2a208ff77267422a197d9fxgu
394195276127e373f2e2fb2a208ff77267422a197d9fxgu      if (CurrentState.RelativeMovementZ != 0 && Private->PointerList[Index]->Mode->ResolutionZ != 0) {
394295276127e373f2e2fb2a208ff77267422a197d9fxgu        State->RelativeMovementZ += (CurrentState.RelativeMovementZ * (INT32) Private->SimplePointerMode.ResolutionZ) / (INT32) Private->PointerList[Index]->Mode->ResolutionZ;
394395276127e373f2e2fb2a208ff77267422a197d9fxgu      }
394495276127e373f2e2fb2a208ff77267422a197d9fxgu    } else if (Status == EFI_DEVICE_ERROR) {
394595276127e373f2e2fb2a208ff77267422a197d9fxgu      ReturnStatus = EFI_DEVICE_ERROR;
394695276127e373f2e2fb2a208ff77267422a197d9fxgu    }
394795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
394895276127e373f2e2fb2a208ff77267422a197d9fxgu
394995276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
395095276127e373f2e2fb2a208ff77267422a197d9fxgu}
395195276127e373f2e2fb2a208ff77267422a197d9fxgu
3952a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3953a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
3954a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reads the next keystroke from the input device. The WaitForKey Event can
3955a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  be used to test for existance of a keystroke via WaitForEvent () call.
3956a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3957415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  This                     A pointer to protocol instance.
3958415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @param  State                    A pointer to state information on the pointer device
3959a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3960415df2a396a2d7c1bc4be2af6db6cb1ff45f0200vanjeff  @retval EFI_SUCCESS              The keystroke information was returned in State.
3961a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_NOT_READY            There was no keystroke data availiable.
3962a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The keydtroke information was not returned due
3963a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   to hardware errors.
3964a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
3965a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
396695276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
396795276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
396895276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterSimplePointerGetState (
396995276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_POINTER_PROTOCOL     *This,
397095276127e373f2e2fb2a208ff77267422a197d9fxgu  IN OUT EFI_SIMPLE_POINTER_STATE     *State
397195276127e373f2e2fb2a208ff77267422a197d9fxgu  )
397295276127e373f2e2fb2a208ff77267422a197d9fxgu{
397395276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
397495276127e373f2e2fb2a208ff77267422a197d9fxgu
397595276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_SIMPLE_POINTER_THIS (This);
397695276127e373f2e2fb2a208ff77267422a197d9fxgu
397795276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->InputEventSignalState = FALSE;
397895276127e373f2e2fb2a208ff77267422a197d9fxgu
397995276127e373f2e2fb2a208ff77267422a197d9fxgu  return ConSplitterSimplePointerPrivateGetState (Private, State);
398095276127e373f2e2fb2a208ff77267422a197d9fxgu}
398195276127e373f2e2fb2a208ff77267422a197d9fxgu
398295276127e373f2e2fb2a208ff77267422a197d9fxgu
3983a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
398495276127e373f2e2fb2a208ff77267422a197d9fxgu  This event agregates all the events of the ConIn devices in the spliter.
398595276127e373f2e2fb2a208ff77267422a197d9fxgu  If any events of physical ConIn devices are signaled, signal the ConIn
398695276127e373f2e2fb2a208ff77267422a197d9fxgu  spliter event. This will cause the calling code to call
398795276127e373f2e2fb2a208ff77267422a197d9fxgu  ConSplitterTextInReadKeyStroke ().
398895276127e373f2e2fb2a208ff77267422a197d9fxgu
3989a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Event                    The Event assoicated with callback.
3990a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Context                  Context registered when Event was created.
399195276127e373f2e2fb2a208ff77267422a197d9fxgu
3992a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
3993a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffVOID
3994a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffEFIAPI
3995a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffConSplitterSimplePointerWaitForInput (
3996a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN  EFI_EVENT                       Event,
3997a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN  VOID                            *Context
3998a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  )
399995276127e373f2e2fb2a208ff77267422a197d9fxgu{
400095276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                    Status;
400195276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
400295276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                         Index;
400395276127e373f2e2fb2a208ff77267422a197d9fxgu
400495276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = (TEXT_IN_SPLITTER_PRIVATE_DATA *) Context;
400595276127e373f2e2fb2a208ff77267422a197d9fxgu
400695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
400795276127e373f2e2fb2a208ff77267422a197d9fxgu  // if InputEventSignalState is flagged before, and not cleared by Reset() or ReadKeyStroke()
400895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
400995276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Private->InputEventSignalState) {
401095276127e373f2e2fb2a208ff77267422a197d9fxgu    gBS->SignalEvent (Event);
401195276127e373f2e2fb2a208ff77267422a197d9fxgu    return ;
401295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
401395276127e373f2e2fb2a208ff77267422a197d9fxgu  //
401495276127e373f2e2fb2a208ff77267422a197d9fxgu  // if any physical console input device has key input, signal the event.
401595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
401695276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0; Index < Private->CurrentNumberOfPointers; Index++) {
401795276127e373f2e2fb2a208ff77267422a197d9fxgu    Status = gBS->CheckEvent (Private->PointerList[Index]->WaitForInput);
401895276127e373f2e2fb2a208ff77267422a197d9fxgu    if (!EFI_ERROR (Status)) {
401995276127e373f2e2fb2a208ff77267422a197d9fxgu      gBS->SignalEvent (Event);
402095276127e373f2e2fb2a208ff77267422a197d9fxgu      Private->InputEventSignalState = TRUE;
402195276127e373f2e2fb2a208ff77267422a197d9fxgu    }
402295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
402395276127e373f2e2fb2a208ff77267422a197d9fxgu}
402495276127e373f2e2fb2a208ff77267422a197d9fxgu
4025a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4026a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Resets the pointer device hardware.
4027a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4028a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
4029a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  ExtendedVerification     Driver may perform diagnostics on reset.
4030a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4031a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The device was reset.
4032a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device is not functioning correctly and
4033a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   could not be reset.
4034a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4035a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
40368ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFI_STATUS
40378ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFIAPI
40388ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianConSplitterAbsolutePointerReset (
40398ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN EFI_ABSOLUTE_POINTER_PROTOCOL   *This,
40408ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN BOOLEAN                         ExtendedVerification
40418ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  )
40428ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian{
40438ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_STATUS                    Status;
40448ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_STATUS                    ReturnStatus;
40458ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
40468ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  UINTN                         Index;
40478ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
40488ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Private = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_ABSOLUTE_POINTER_THIS (This);
40498ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
40508ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Private->AbsoluteInputEventSignalState = FALSE;
40517a5064ce425f85da87deaabc726945d1c980aafbvanjeff
40528ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  if (Private->CurrentNumberOfAbsolutePointers == 0) {
40538ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    return EFI_SUCCESS;
40548ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
40558ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
40568ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  // return the worst status met
40578ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
40588ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {
40598ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    Status = Private->AbsolutePointerList[Index]->Reset (
40608ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian                                                    Private->AbsolutePointerList[Index],
40618ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian                                                    ExtendedVerification
40628ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian                                                    );
40638ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    if (EFI_ERROR (Status)) {
40648ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      ReturnStatus = Status;
40658ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    }
40668ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
40678ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
40688ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  return ReturnStatus;
40698ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian}
40708ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
4071a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4072a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4073a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Retrieves the current state of a pointer device.
4074a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4075a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
4076a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  State                    A pointer to the state information on the
4077a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   pointer device.
4078a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4079a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The state of the pointer device was returned in
4080a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   State..
4081a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_NOT_READY            The state of the pointer device has not changed
4082a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   since the last call to GetState().
4083a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         A device error occurred while attempting to
4084a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   retrieve the pointer device's current state.
4085a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4086a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
40878ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianEFI_STATUS
40887a5064ce425f85da87deaabc726945d1c980aafbvanjeffEFIAPI
40898ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tianConSplitterAbsolutePointerGetState (
40908ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN EFI_ABSOLUTE_POINTER_PROTOCOL   *This,
40918ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  IN OUT EFI_ABSOLUTE_POINTER_STATE  *State
40928ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  )
40938ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian{
40948ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
40958ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_STATUS                    Status;
40968ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_STATUS                    ReturnStatus;
40978ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  UINTN                         Index;
40988ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_ABSOLUTE_POINTER_STATE    CurrentState;
40998ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41008ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41018ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Private = TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_ABSOLUTE_POINTER_THIS (This);
41028ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41038ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Private->AbsoluteInputEventSignalState = FALSE;
41048ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41058ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  State->CurrentX                        = 0;
41068ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  State->CurrentY                        = 0;
41078ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  State->CurrentZ                        = 0;
41088ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  State->ActiveButtons                   = 0;
41097a5064ce425f85da87deaabc726945d1c980aafbvanjeff
41108ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
41118ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  // if no physical pointer device exists, return EFI_NOT_READY;
41128ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  // if any physical pointer device has changed state,
41138ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  // return the state and EFI_SUCCESS.
41148ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
41158ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  ReturnStatus = EFI_NOT_READY;
41168ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  for (Index = 0; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {
41178ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41188ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    Status = Private->AbsolutePointerList[Index]->GetState (
41198ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian                                                    Private->AbsolutePointerList[Index],
41208ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian                                                    &CurrentState
41218ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian                                                    );
41228ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    if (!EFI_ERROR (Status)) {
41238ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      if (ReturnStatus == EFI_NOT_READY) {
41248ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian        ReturnStatus = EFI_SUCCESS;
41258ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      }
41268ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41278ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      State->ActiveButtons = CurrentState.ActiveButtons;
41288ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41298ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      if (!(Private->AbsolutePointerMode.AbsoluteMinX == 0 && Private->AbsolutePointerMode.AbsoluteMaxX == 0)) {
41308ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian        State->CurrentX = CurrentState.CurrentX;
41318ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      }
41328ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      if (!(Private->AbsolutePointerMode.AbsoluteMinY == 0 && Private->AbsolutePointerMode.AbsoluteMaxY == 0)) {
41338ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian        State->CurrentY = CurrentState.CurrentY;
41348ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      }
41358ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      if (!(Private->AbsolutePointerMode.AbsoluteMinZ == 0 && Private->AbsolutePointerMode.AbsoluteMaxZ == 0)) {
41368ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian        State->CurrentZ = CurrentState.CurrentZ;
41378ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      }
41387a5064ce425f85da87deaabc726945d1c980aafbvanjeff
41398ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    } else if (Status == EFI_DEVICE_ERROR) {
41408ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      ReturnStatus = EFI_DEVICE_ERROR;
41418ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    }
41428ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
41438ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41448ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  return ReturnStatus;
41458ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian}
41468ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41478ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
4148a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
41498ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  This event agregates all the events of the pointer devices in the splitter.
41508ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  If any events of physical pointer devices are signaled, signal the pointer
41518ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  splitter event. This will cause the calling code to call
41528ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  ConSplitterAbsolutePointerGetState ().
41538ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
4154a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Event                    The Event assoicated with callback.
4155a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Context                  Context registered when Event was created.
41568ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
4157a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
4158a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffVOID
4159a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffEFIAPI
4160a4d608d1f777b0675b45072967fe39492f45bb1bvanjeffConSplitterAbsolutePointerWaitForInput (
4161a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN  EFI_EVENT                       Event,
4162a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  IN  VOID                            *Context
4163a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  )
41648ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian{
41658ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  EFI_STATUS                    Status;
41668ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  TEXT_IN_SPLITTER_PRIVATE_DATA *Private;
41678ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  UINTN                         Index;
41688ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41698ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  Private = (TEXT_IN_SPLITTER_PRIVATE_DATA *) Context;
41708ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
41718ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
41727a5064ce425f85da87deaabc726945d1c980aafbvanjeff  // if AbsoluteInputEventSignalState is flagged before,
41738ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  // and not cleared by Reset() or GetState(), signal it
41748ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
41758ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  if (Private->AbsoluteInputEventSignalState) {
41768ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    gBS->SignalEvent (Event);
41778ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    return ;
41788ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
41798ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
41808ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  // if any physical console input device has key input, signal the event.
41818ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  //
41828ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  for (Index = 0; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {
41838ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    Status = gBS->CheckEvent (Private->AbsolutePointerList[Index]->WaitForInput);
41848ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    if (!EFI_ERROR (Status)) {
41858ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      gBS->SignalEvent (Event);
41868ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian      Private->AbsoluteInputEventSignalState = TRUE;
41878ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian    }
41888ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian  }
41898ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian}
41908ae0b360f5463e666cf5b1c93b7693ac7ad9a312eric_tian
4191a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4192a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4193a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Reset the text output device hardware and optionaly run diagnostics
4194a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4195a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
4196a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  ExtendedVerification     Driver may perform more exhaustive verfication
4197a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   operation of the device during reset.
4198a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4199a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The text output device was reset.
4200a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The text output device is not functioning
4201a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   correctly and could not be reset.
4202a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4203a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
420495276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
420595276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
420695276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutReset (
420795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
420895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  BOOLEAN                            ExtendedVerification
420995276127e373f2e2fb2a208ff77267422a197d9fxgu  )
421095276127e373f2e2fb2a208ff77267422a197d9fxgu{
421195276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      Status;
421295276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
421395276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           Index;
421495276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      ReturnStatus;
421595276127e373f2e2fb2a208ff77267422a197d9fxgu
421695276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
421795276127e373f2e2fb2a208ff77267422a197d9fxgu
421895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
421995276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
422095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
422195276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
42229937b36506924de4b721f03addc50ed318474a5evanjeff    Status = Private->TextOutList[Index].TextOut->Reset (
42239937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Private->TextOutList[Index].TextOut,
42249937b36506924de4b721f03addc50ed318474a5evanjeff                                                    ExtendedVerification
42259937b36506924de4b721f03addc50ed318474a5evanjeff                                                    );
42269937b36506924de4b721f03addc50ed318474a5evanjeff    if (EFI_ERROR (Status)) {
42279937b36506924de4b721f03addc50ed318474a5evanjeff      ReturnStatus = Status;
422895276127e373f2e2fb2a208ff77267422a197d9fxgu    }
422995276127e373f2e2fb2a208ff77267422a197d9fxgu  }
423095276127e373f2e2fb2a208ff77267422a197d9fxgu
42310ce1dd70a9d2b70fbedaefb1ba9d664b8a7bb4eferic_tian  This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BLACK));
423295276127e373f2e2fb2a208ff77267422a197d9fxgu
42339937b36506924de4b721f03addc50ed318474a5evanjeff  //
42349937b36506924de4b721f03addc50ed318474a5evanjeff  // reset all mode parameters
42359937b36506924de4b721f03addc50ed318474a5evanjeff  //
42369937b36506924de4b721f03addc50ed318474a5evanjeff  TextOutSetMode (Private, 0);
423795276127e373f2e2fb2a208ff77267422a197d9fxgu
423895276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
423995276127e373f2e2fb2a208ff77267422a197d9fxgu}
424095276127e373f2e2fb2a208ff77267422a197d9fxgu
4241a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4242a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4243a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Write a Unicode string to the output device.
4244a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4245a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
424633019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  WString                  The NULL-terminated Unicode string to be
4247a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   displayed on the output device(s). All output
4248a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   devices must also support the Unicode drawing
4249a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   defined in this file.
4250a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4251a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The string was output to the device.
4252a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device reported an error while attempting to
4253a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   output the text.
4254a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          The output device's mode is not currently in a
4255a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   defined text mode.
4256a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_WARN_UNKNOWN_GLYPH   This warning code indicates that some of the
4257a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   characters in the Unicode string could not be
4258a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   rendered and were skipped.
4259a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4260a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
426195276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
426295276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
426395276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutOutputString (
426495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
426595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  CHAR16                             *WString
426695276127e373f2e2fb2a208ff77267422a197d9fxgu  )
426795276127e373f2e2fb2a208ff77267422a197d9fxgu{
426895276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      Status;
426995276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
427095276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           Index;
427195276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      ReturnStatus;
4272fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  UINTN                           MaxColumn;
4273fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  UINTN                           MaxRow;
427495276127e373f2e2fb2a208ff77267422a197d9fxgu
427595276127e373f2e2fb2a208ff77267422a197d9fxgu  This->SetAttribute (This, This->Mode->Attribute);
427695276127e373f2e2fb2a208ff77267422a197d9fxgu
427795276127e373f2e2fb2a208ff77267422a197d9fxgu  Private         = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
427895276127e373f2e2fb2a208ff77267422a197d9fxgu
427995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
428095276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
428195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
428295276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
42839937b36506924de4b721f03addc50ed318474a5evanjeff    Status = Private->TextOutList[Index].TextOut->OutputString (
42849937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Private->TextOutList[Index].TextOut,
4285fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                                                    WString
42869937b36506924de4b721f03addc50ed318474a5evanjeff                                                    );
42879937b36506924de4b721f03addc50ed318474a5evanjeff    if (EFI_ERROR (Status)) {
42889937b36506924de4b721f03addc50ed318474a5evanjeff      ReturnStatus = Status;
428995276127e373f2e2fb2a208ff77267422a197d9fxgu    }
429095276127e373f2e2fb2a208ff77267422a197d9fxgu  }
429195276127e373f2e2fb2a208ff77267422a197d9fxgu
42927389f6496d27efa001d913deff81bcb79c9beae7vanjeff  if (Private->CurrentNumberOfConsoles > 0) {
42937389f6496d27efa001d913deff81bcb79c9beae7vanjeff    Private->TextOutMode.CursorColumn = Private->TextOutList[0].TextOut->Mode->CursorColumn;
42947389f6496d27efa001d913deff81bcb79c9beae7vanjeff    Private->TextOutMode.CursorRow    = Private->TextOutList[0].TextOut->Mode->CursorRow;
4295fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin  } else {
4296fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    //
4297fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    // When there is no real console devices in system,
4298fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    // update cursor position for the virtual device in consplitter.
4299fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    //
4300fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    Private->TextOut.QueryMode (
4301fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                       &Private->TextOut,
4302fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                       Private->TextOutMode.Mode,
4303fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                       &MaxColumn,
4304fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                       &MaxRow
4305fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin                       );
4306fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    for (; *WString != CHAR_NULL; WString++) {
4307fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      switch (*WString) {
4308fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      case CHAR_BACKSPACE:
4309fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        if (Private->TextOutMode.CursorColumn == 0 && Private->TextOutMode.CursorRow > 0) {
4310fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin          Private->TextOutMode.CursorRow--;
4311fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin          Private->TextOutMode.CursorColumn = (INT32) (MaxColumn - 1);
4312fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        } else if (Private->TextOutMode.CursorColumn > 0) {
4313fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin          Private->TextOutMode.CursorColumn--;
4314fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        }
4315fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        break;
4316fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin
4317fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      case CHAR_LINEFEED:
4318fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        if (Private->TextOutMode.CursorRow < (INT32) (MaxRow - 1)) {
4319fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin          Private->TextOutMode.CursorRow++;
4320fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        }
4321fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        break;
4322fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin
4323fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      case CHAR_CARRIAGE_RETURN:
4324fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        Private->TextOutMode.CursorColumn = 0;
4325fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        break;
4326fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin
4327fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      default:
4328fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        if (Private->TextOutMode.CursorColumn < (INT32) (MaxColumn - 1)) {
4329fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin          Private->TextOutMode.CursorColumn++;
4330fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        } else {
4331fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin          Private->TextOutMode.CursorColumn = 0;
4332fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin          if (Private->TextOutMode.CursorRow < (INT32) (MaxRow - 1)) {
4333fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin            Private->TextOutMode.CursorRow++;
4334fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin          }
4335fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        }
4336fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin        break;
4337fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin      }
4338fe3396514022ec798f304b9e28d4ac6a04e01946li-elvin    }
433995276127e373f2e2fb2a208ff77267422a197d9fxgu  }
434095276127e373f2e2fb2a208ff77267422a197d9fxgu
434195276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
434295276127e373f2e2fb2a208ff77267422a197d9fxgu}
434395276127e373f2e2fb2a208ff77267422a197d9fxgu
4344a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4345a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4346a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Verifies that all characters in a Unicode string can be output to the
4347a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  target device.
4348a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4349a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
435033019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  WString                  The NULL-terminated Unicode string to be
4351a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   examined for the output device(s).
4352a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4353a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The device(s) are capable of rendering the
4354a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   output string.
4355a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          Some of the characters in the Unicode string
4356a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   cannot be rendered by one or more of the output
4357a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   devices mapped by the EFI handle.
4358a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4359a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
436095276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
436195276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
436295276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutTestString (
436395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
436495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  CHAR16                             *WString
436595276127e373f2e2fb2a208ff77267422a197d9fxgu  )
436695276127e373f2e2fb2a208ff77267422a197d9fxgu{
436795276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      Status;
436895276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
436995276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           Index;
437095276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      ReturnStatus;
437195276127e373f2e2fb2a208ff77267422a197d9fxgu
437295276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
437395276127e373f2e2fb2a208ff77267422a197d9fxgu
437495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
437595276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
437695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
437795276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
43789937b36506924de4b721f03addc50ed318474a5evanjeff    Status = Private->TextOutList[Index].TextOut->TestString (
43799937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Private->TextOutList[Index].TextOut,
43809937b36506924de4b721f03addc50ed318474a5evanjeff                                                    WString
43819937b36506924de4b721f03addc50ed318474a5evanjeff                                                    );
43829937b36506924de4b721f03addc50ed318474a5evanjeff    if (EFI_ERROR (Status)) {
43839937b36506924de4b721f03addc50ed318474a5evanjeff      ReturnStatus = Status;
438495276127e373f2e2fb2a208ff77267422a197d9fxgu    }
438595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
438695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
438795276127e373f2e2fb2a208ff77267422a197d9fxgu  // There is no DevNullTextOutTestString () since a Unicode buffer would
438895276127e373f2e2fb2a208ff77267422a197d9fxgu  // always return EFI_SUCCESS.
438995276127e373f2e2fb2a208ff77267422a197d9fxgu  // ReturnStatus will be EFI_SUCCESS if no consoles are present
439095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
439195276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
439295276127e373f2e2fb2a208ff77267422a197d9fxgu}
439395276127e373f2e2fb2a208ff77267422a197d9fxgu
4394a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4395a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4396a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Returns information for an available text mode that the output device(s)
4397a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  supports.
4398a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4399a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
4400a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  ModeNumber               The mode number to return information on.
440133019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Columns                  Returns the columns of the text output device
440233019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff                                   for the requested ModeNumber.
440333019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Rows                     Returns the rows of the text output device
4404a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   for the requested ModeNumber.
4405a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4406a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The requested mode information was returned.
4407a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device had an error and could not complete
4408a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   the request.
4409a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          The mode number was not valid.
4410a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4411a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
441295276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
441395276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
441495276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutQueryMode (
441595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
441695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                              ModeNumber,
441795276127e373f2e2fb2a208ff77267422a197d9fxgu  OUT UINTN                              *Columns,
441895276127e373f2e2fb2a208ff77267422a197d9fxgu  OUT UINTN                              *Rows
441995276127e373f2e2fb2a208ff77267422a197d9fxgu  )
442095276127e373f2e2fb2a208ff77267422a197d9fxgu{
442195276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
44223012ce5cf75f938a79c70568595454e27b2f014avanjeff  UINTN                           CurrentMode;
44233012ce5cf75f938a79c70568595454e27b2f014avanjeff  INT32                           *TextOutModeMap;
442495276127e373f2e2fb2a208ff77267422a197d9fxgu
442595276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
442695276127e373f2e2fb2a208ff77267422a197d9fxgu
442795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
442895276127e373f2e2fb2a208ff77267422a197d9fxgu  // Check whether param ModeNumber is valid.
442995276127e373f2e2fb2a208ff77267422a197d9fxgu  // ModeNumber should be within range 0 ~ MaxMode - 1.
443095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
443195276127e373f2e2fb2a208ff77267422a197d9fxgu  if ( (ModeNumber > (UINTN)(((UINT32)-1)>>1)) ) {
443295276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_UNSUPPORTED;
443395276127e373f2e2fb2a208ff77267422a197d9fxgu  }
443495276127e373f2e2fb2a208ff77267422a197d9fxgu
443595276127e373f2e2fb2a208ff77267422a197d9fxgu  if ((INT32) ModeNumber >= This->Mode->MaxMode) {
443695276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_UNSUPPORTED;
443795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
443895276127e373f2e2fb2a208ff77267422a197d9fxgu
44393012ce5cf75f938a79c70568595454e27b2f014avanjeff  //
44403012ce5cf75f938a79c70568595454e27b2f014avanjeff  // We get the available mode from mode intersection map if it's available
44413012ce5cf75f938a79c70568595454e27b2f014avanjeff  //
44423012ce5cf75f938a79c70568595454e27b2f014avanjeff  if (Private->TextOutModeMap != NULL) {
44433012ce5cf75f938a79c70568595454e27b2f014avanjeff    TextOutModeMap = Private->TextOutModeMap + Private->TextOutListCount * ModeNumber;
44443012ce5cf75f938a79c70568595454e27b2f014avanjeff    CurrentMode    = (UINTN)(*TextOutModeMap);
44453012ce5cf75f938a79c70568595454e27b2f014avanjeff    *Columns       = Private->TextOutQueryData[CurrentMode].Columns;
44463012ce5cf75f938a79c70568595454e27b2f014avanjeff    *Rows          = Private->TextOutQueryData[CurrentMode].Rows;
44473012ce5cf75f938a79c70568595454e27b2f014avanjeff  } else {
44483012ce5cf75f938a79c70568595454e27b2f014avanjeff    *Columns  = Private->TextOutQueryData[ModeNumber].Columns;
44493012ce5cf75f938a79c70568595454e27b2f014avanjeff    *Rows     = Private->TextOutQueryData[ModeNumber].Rows;
44503012ce5cf75f938a79c70568595454e27b2f014avanjeff  }
445195276127e373f2e2fb2a208ff77267422a197d9fxgu
445295276127e373f2e2fb2a208ff77267422a197d9fxgu  if (*Columns <= 0 && *Rows <= 0) {
445395276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_UNSUPPORTED;
445495276127e373f2e2fb2a208ff77267422a197d9fxgu
445595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
445695276127e373f2e2fb2a208ff77267422a197d9fxgu
445795276127e373f2e2fb2a208ff77267422a197d9fxgu  return EFI_SUCCESS;
445895276127e373f2e2fb2a208ff77267422a197d9fxgu}
445995276127e373f2e2fb2a208ff77267422a197d9fxgu
4460a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4461a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4462a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Sets the output device(s) to a specified mode.
4463a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4464a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
4465a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  ModeNumber               The mode number to set.
4466a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4467a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The requested text mode was set.
4468a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device had an error and could not complete
4469a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   the request.
4470a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          The mode number was not valid.
4471a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4472a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
447395276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
447495276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
447595276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutSetMode (
447695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
447795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                              ModeNumber
447895276127e373f2e2fb2a208ff77267422a197d9fxgu  )
447995276127e373f2e2fb2a208ff77267422a197d9fxgu{
448095276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      Status;
448195276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
448295276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           Index;
448395276127e373f2e2fb2a208ff77267422a197d9fxgu  INT32                           *TextOutModeMap;
448495276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      ReturnStatus;
448595276127e373f2e2fb2a208ff77267422a197d9fxgu
448695276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
448795276127e373f2e2fb2a208ff77267422a197d9fxgu
448895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
448995276127e373f2e2fb2a208ff77267422a197d9fxgu  // Check whether param ModeNumber is valid.
449095276127e373f2e2fb2a208ff77267422a197d9fxgu  // ModeNumber should be within range 0 ~ MaxMode - 1.
449195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
449295276127e373f2e2fb2a208ff77267422a197d9fxgu  if ( (ModeNumber > (UINTN)(((UINT32)-1)>>1)) ) {
449395276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_UNSUPPORTED;
449495276127e373f2e2fb2a208ff77267422a197d9fxgu  }
449595276127e373f2e2fb2a208ff77267422a197d9fxgu
449695276127e373f2e2fb2a208ff77267422a197d9fxgu  if ((INT32) ModeNumber >= This->Mode->MaxMode) {
449795276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_UNSUPPORTED;
449895276127e373f2e2fb2a208ff77267422a197d9fxgu  }
449995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
450095276127e373f2e2fb2a208ff77267422a197d9fxgu  // If the mode is being set to the curent mode, then just clear the screen and return.
450195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
450295276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Private->TextOutMode.Mode == (INT32) ModeNumber) {
450395276127e373f2e2fb2a208ff77267422a197d9fxgu    return ConSplitterTextOutClearScreen (This);
450495276127e373f2e2fb2a208ff77267422a197d9fxgu  }
450595276127e373f2e2fb2a208ff77267422a197d9fxgu  //
450695276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
450795276127e373f2e2fb2a208ff77267422a197d9fxgu  //
450895276127e373f2e2fb2a208ff77267422a197d9fxgu  TextOutModeMap = Private->TextOutModeMap + Private->TextOutListCount * ModeNumber;
450995276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
45109937b36506924de4b721f03addc50ed318474a5evanjeff    Status = Private->TextOutList[Index].TextOut->SetMode (
45119937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Private->TextOutList[Index].TextOut,
45129937b36506924de4b721f03addc50ed318474a5evanjeff                                                    TextOutModeMap[Index]
45139937b36506924de4b721f03addc50ed318474a5evanjeff                                                    );
45149937b36506924de4b721f03addc50ed318474a5evanjeff    if (EFI_ERROR (Status)) {
45159937b36506924de4b721f03addc50ed318474a5evanjeff      ReturnStatus = Status;
451695276127e373f2e2fb2a208ff77267422a197d9fxgu    }
451795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
45189937b36506924de4b721f03addc50ed318474a5evanjeff
451995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
45209937b36506924de4b721f03addc50ed318474a5evanjeff  // Set mode parameter to specified mode number
452195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
45229937b36506924de4b721f03addc50ed318474a5evanjeff  TextOutSetMode (Private, ModeNumber);
452395276127e373f2e2fb2a208ff77267422a197d9fxgu
452495276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
452595276127e373f2e2fb2a208ff77267422a197d9fxgu}
452695276127e373f2e2fb2a208ff77267422a197d9fxgu
4527a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4528a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4529a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Sets the background and foreground colors for the OutputString () and
4530a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  ClearScreen () functions.
4531a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4532a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
4533a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Attribute                The attribute to set. Bits 0..3 are the
4534a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   foreground color, and bits 4..6 are the
4535a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   background color. All other bits are undefined
4536a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   and must be zero. The valid Attributes are
4537a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   defined in this file.
4538a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4539a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The attribute was set.
4540a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device had an error and could not complete
4541a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   the request.
4542a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          The attribute requested is not defined.
4543a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4544a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
454595276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
454695276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
454795276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutSetAttribute (
454895276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
454995276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                              Attribute
455095276127e373f2e2fb2a208ff77267422a197d9fxgu  )
455195276127e373f2e2fb2a208ff77267422a197d9fxgu{
455295276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      Status;
455395276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
455495276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           Index;
455595276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      ReturnStatus;
455695276127e373f2e2fb2a208ff77267422a197d9fxgu
455795276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
455895276127e373f2e2fb2a208ff77267422a197d9fxgu
455995276127e373f2e2fb2a208ff77267422a197d9fxgu  //
456095276127e373f2e2fb2a208ff77267422a197d9fxgu  // Check whether param Attribute is valid.
456195276127e373f2e2fb2a208ff77267422a197d9fxgu  //
4562ffbc792ce5edf8ec6250c9808dc4bcad8cfd08b8Elvin Li  if ((Attribute | 0x7F) != 0x7F) {
456395276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_UNSUPPORTED;
456495276127e373f2e2fb2a208ff77267422a197d9fxgu  }
456595276127e373f2e2fb2a208ff77267422a197d9fxgu
456695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
456795276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
456895276127e373f2e2fb2a208ff77267422a197d9fxgu  //
456995276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
45709937b36506924de4b721f03addc50ed318474a5evanjeff    Status = Private->TextOutList[Index].TextOut->SetAttribute (
45719937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Private->TextOutList[Index].TextOut,
45729937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Attribute
45739937b36506924de4b721f03addc50ed318474a5evanjeff                                                    );
45749937b36506924de4b721f03addc50ed318474a5evanjeff    if (EFI_ERROR (Status)) {
45759937b36506924de4b721f03addc50ed318474a5evanjeff      ReturnStatus = Status;
457695276127e373f2e2fb2a208ff77267422a197d9fxgu    }
457795276127e373f2e2fb2a208ff77267422a197d9fxgu  }
457895276127e373f2e2fb2a208ff77267422a197d9fxgu
457995276127e373f2e2fb2a208ff77267422a197d9fxgu  Private->TextOutMode.Attribute = (INT32) Attribute;
458095276127e373f2e2fb2a208ff77267422a197d9fxgu
458195276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
458295276127e373f2e2fb2a208ff77267422a197d9fxgu}
458395276127e373f2e2fb2a208ff77267422a197d9fxgu
4584a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4585a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4586a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Clears the output device(s) display to the currently selected background
4587a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  color.
4588a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4589a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
4590a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4591a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The operation completed successfully.
4592a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device had an error and could not complete
4593a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   the request.
4594a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          The output device is not in a valid text mode.
4595a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4596a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
459795276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
459895276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
459995276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutClearScreen (
460095276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This
460195276127e373f2e2fb2a208ff77267422a197d9fxgu  )
460295276127e373f2e2fb2a208ff77267422a197d9fxgu{
460395276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      Status;
460495276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
460595276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           Index;
460695276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      ReturnStatus;
460795276127e373f2e2fb2a208ff77267422a197d9fxgu
460895276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
460995276127e373f2e2fb2a208ff77267422a197d9fxgu
461095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
461195276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
461295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
461395276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
46149937b36506924de4b721f03addc50ed318474a5evanjeff    Status = Private->TextOutList[Index].TextOut->ClearScreen (Private->TextOutList[Index].TextOut);
46159937b36506924de4b721f03addc50ed318474a5evanjeff    if (EFI_ERROR (Status)) {
46169937b36506924de4b721f03addc50ed318474a5evanjeff      ReturnStatus = Status;
461795276127e373f2e2fb2a208ff77267422a197d9fxgu    }
461895276127e373f2e2fb2a208ff77267422a197d9fxgu  }
461995276127e373f2e2fb2a208ff77267422a197d9fxgu
46209937b36506924de4b721f03addc50ed318474a5evanjeff  //
46219937b36506924de4b721f03addc50ed318474a5evanjeff  // No need to do extra check here as whether (Column, Row) is valid has
46229937b36506924de4b721f03addc50ed318474a5evanjeff  // been checked in ConSplitterTextOutSetCursorPosition. And (0, 0) should
46239937b36506924de4b721f03addc50ed318474a5evanjeff  // always be supported.
46249937b36506924de4b721f03addc50ed318474a5evanjeff  //
46259937b36506924de4b721f03addc50ed318474a5evanjeff  Private->TextOutMode.CursorColumn = 0;
46269937b36506924de4b721f03addc50ed318474a5evanjeff  Private->TextOutMode.CursorRow    = 0;
46279937b36506924de4b721f03addc50ed318474a5evanjeff  Private->TextOutMode.CursorVisible = TRUE;
462895276127e373f2e2fb2a208ff77267422a197d9fxgu
462995276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
463095276127e373f2e2fb2a208ff77267422a197d9fxgu}
463195276127e373f2e2fb2a208ff77267422a197d9fxgu
4632a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4633a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4634a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Sets the current coordinates of the cursor position
4635a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4636a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
463733019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Column                   The column position to set the cursor to. Must be
463833019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff                                   greater than or equal to zero and less than the
463933019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff                                   number of columns by QueryMode ().
464033019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff  @param  Row                      The row position to set the cursor to. Must be
4641a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   greater than or equal to zero and less than the
464233019a717c8c94a7a4b7a78cd3eed177af88c990vanjeff                                   number of rows by QueryMode ().
4643a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4644a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The operation completed successfully.
4645a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device had an error and could not complete
4646a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   the request.
4647a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          The output device is not in a valid text mode,
4648a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   or the cursor position is invalid for the
4649a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   current mode.
4650a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4651a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
465295276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
465395276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
465495276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutSetCursorPosition (
465595276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
465695276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                              Column,
465795276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  UINTN                              Row
465895276127e373f2e2fb2a208ff77267422a197d9fxgu  )
465995276127e373f2e2fb2a208ff77267422a197d9fxgu{
466095276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      Status;
466195276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
466295276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           Index;
466395276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      ReturnStatus;
466495276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           MaxColumn;
466595276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           MaxRow;
4666de8fe2c269cf681ffaed684433a379ea81160d17klu  INT32                           *TextOutModeMap;
4667de8fe2c269cf681ffaed684433a379ea81160d17klu  INT32                           ModeNumber;
4668de8fe2c269cf681ffaed684433a379ea81160d17klu  INT32                           CurrentMode;
466995276127e373f2e2fb2a208ff77267422a197d9fxgu
467095276127e373f2e2fb2a208ff77267422a197d9fxgu  Private   = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
4671de8fe2c269cf681ffaed684433a379ea81160d17klu  TextOutModeMap  = NULL;
4672de8fe2c269cf681ffaed684433a379ea81160d17klu  ModeNumber      = Private->TextOutMode.Mode;
46737a5064ce425f85da87deaabc726945d1c980aafbvanjeff
4674de8fe2c269cf681ffaed684433a379ea81160d17klu  //
4675de8fe2c269cf681ffaed684433a379ea81160d17klu  // Get current MaxColumn and MaxRow from intersection map
4676de8fe2c269cf681ffaed684433a379ea81160d17klu  //
4677de8fe2c269cf681ffaed684433a379ea81160d17klu  if (Private->TextOutModeMap != NULL) {
4678de8fe2c269cf681ffaed684433a379ea81160d17klu    TextOutModeMap = Private->TextOutModeMap + Private->TextOutListCount * ModeNumber;
4679de8fe2c269cf681ffaed684433a379ea81160d17klu    CurrentMode    = *TextOutModeMap;
4680de8fe2c269cf681ffaed684433a379ea81160d17klu  } else {
4681de8fe2c269cf681ffaed684433a379ea81160d17klu    CurrentMode = ModeNumber;
4682de8fe2c269cf681ffaed684433a379ea81160d17klu  }
46837a5064ce425f85da87deaabc726945d1c980aafbvanjeff
4684de8fe2c269cf681ffaed684433a379ea81160d17klu  MaxColumn = Private->TextOutQueryData[CurrentMode].Columns;
4685de8fe2c269cf681ffaed684433a379ea81160d17klu  MaxRow    = Private->TextOutQueryData[CurrentMode].Rows;
468695276127e373f2e2fb2a208ff77267422a197d9fxgu
468795276127e373f2e2fb2a208ff77267422a197d9fxgu  if (Column >= MaxColumn || Row >= MaxRow) {
468895276127e373f2e2fb2a208ff77267422a197d9fxgu    return EFI_UNSUPPORTED;
468995276127e373f2e2fb2a208ff77267422a197d9fxgu  }
469095276127e373f2e2fb2a208ff77267422a197d9fxgu  //
469195276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
469295276127e373f2e2fb2a208ff77267422a197d9fxgu  //
469395276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
46949937b36506924de4b721f03addc50ed318474a5evanjeff    Status = Private->TextOutList[Index].TextOut->SetCursorPosition (
46959937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Private->TextOutList[Index].TextOut,
46969937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Column,
46979937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Row
46989937b36506924de4b721f03addc50ed318474a5evanjeff                                                    );
46999937b36506924de4b721f03addc50ed318474a5evanjeff    if (EFI_ERROR (Status)) {
47009937b36506924de4b721f03addc50ed318474a5evanjeff      ReturnStatus = Status;
470195276127e373f2e2fb2a208ff77267422a197d9fxgu    }
470295276127e373f2e2fb2a208ff77267422a197d9fxgu  }
470395276127e373f2e2fb2a208ff77267422a197d9fxgu
47049937b36506924de4b721f03addc50ed318474a5evanjeff  //
47059937b36506924de4b721f03addc50ed318474a5evanjeff  // No need to do extra check here as whether (Column, Row) is valid has
47069937b36506924de4b721f03addc50ed318474a5evanjeff  // been checked in ConSplitterTextOutSetCursorPosition. And (0, 0) should
47079937b36506924de4b721f03addc50ed318474a5evanjeff  // always be supported.
47089937b36506924de4b721f03addc50ed318474a5evanjeff  //
47099937b36506924de4b721f03addc50ed318474a5evanjeff  Private->TextOutMode.CursorColumn = (INT32) Column;
47109937b36506924de4b721f03addc50ed318474a5evanjeff  Private->TextOutMode.CursorRow    = (INT32) Row;
471195276127e373f2e2fb2a208ff77267422a197d9fxgu
471295276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
471395276127e373f2e2fb2a208ff77267422a197d9fxgu}
471495276127e373f2e2fb2a208ff77267422a197d9fxgu
4715a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4716a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff/**
4717a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  Makes the cursor visible or invisible
4718a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4719a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  This                     Protocol instance pointer.
4720a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @param  Visible                  If TRUE, the cursor is set to be visible. If
4721a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   FALSE, the cursor is set to be invisible.
4722a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4723a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_SUCCESS              The operation completed successfully.
4724a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_DEVICE_ERROR         The device had an error and could not complete
4725a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   the request, or the device does not support
4726a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff                                   changing the cursor mode.
4727a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff  @retval EFI_UNSUPPORTED          The output device is not in a valid text mode.
4728a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff
4729a4d608d1f777b0675b45072967fe39492f45bb1bvanjeff**/
473095276127e373f2e2fb2a208ff77267422a197d9fxguEFI_STATUS
473195276127e373f2e2fb2a208ff77267422a197d9fxguEFIAPI
473295276127e373f2e2fb2a208ff77267422a197d9fxguConSplitterTextOutEnableCursor (
473395276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
473495276127e373f2e2fb2a208ff77267422a197d9fxgu  IN  BOOLEAN                            Visible
473595276127e373f2e2fb2a208ff77267422a197d9fxgu  )
473695276127e373f2e2fb2a208ff77267422a197d9fxgu{
473795276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      Status;
473895276127e373f2e2fb2a208ff77267422a197d9fxgu  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;
473995276127e373f2e2fb2a208ff77267422a197d9fxgu  UINTN                           Index;
474095276127e373f2e2fb2a208ff77267422a197d9fxgu  EFI_STATUS                      ReturnStatus;
474195276127e373f2e2fb2a208ff77267422a197d9fxgu
474295276127e373f2e2fb2a208ff77267422a197d9fxgu  Private = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);
474395276127e373f2e2fb2a208ff77267422a197d9fxgu
474495276127e373f2e2fb2a208ff77267422a197d9fxgu  //
474595276127e373f2e2fb2a208ff77267422a197d9fxgu  // return the worst status met
474695276127e373f2e2fb2a208ff77267422a197d9fxgu  //
474795276127e373f2e2fb2a208ff77267422a197d9fxgu  for (Index = 0, ReturnStatus = EFI_SUCCESS; Index < Private->CurrentNumberOfConsoles; Index++) {
47489937b36506924de4b721f03addc50ed318474a5evanjeff    Status = Private->TextOutList[Index].TextOut->EnableCursor (
47499937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Private->TextOutList[Index].TextOut,
47509937b36506924de4b721f03addc50ed318474a5evanjeff                                                    Visible
47519937b36506924de4b721f03addc50ed318474a5evanjeff                                                    );
47529937b36506924de4b721f03addc50ed318474a5evanjeff    if (EFI_ERROR (Status)) {
47539937b36506924de4b721f03addc50ed318474a5evanjeff      ReturnStatus = Status;
475495276127e373f2e2fb2a208ff77267422a197d9fxgu    }
475595276127e373f2e2fb2a208ff77267422a197d9fxgu  }
475695276127e373f2e2fb2a208ff77267422a197d9fxgu
47579937b36506924de4b721f03addc50ed318474a5evanjeff  Private->TextOutMode.CursorVisible = Visible;
475895276127e373f2e2fb2a208ff77267422a197d9fxgu
475995276127e373f2e2fb2a208ff77267422a197d9fxgu  return ReturnStatus;
476095276127e373f2e2fb2a208ff77267422a197d9fxgu}
47613012ce5cf75f938a79c70568595454e27b2f014avanjeff
4762f58f3de07ef4531828c108ea099ff637f8c52d1fczhang
4763f58f3de07ef4531828c108ea099ff637f8c52d1fczhang/**
4764f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  An empty function to pass error checking of CreateEventEx ().
4765f58f3de07ef4531828c108ea099ff637f8c52d1fczhang
4766f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  @param  Event                 Event whose notification function is being invoked.
4767f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  @param  Context               Pointer to the notification function's context,
4768f58f3de07ef4531828c108ea099ff637f8c52d1fczhang                                which is implementation-dependent.
4769f58f3de07ef4531828c108ea099ff637f8c52d1fczhang
4770f58f3de07ef4531828c108ea099ff637f8c52d1fczhang**/
4771f58f3de07ef4531828c108ea099ff637f8c52d1fczhangVOID
4772f58f3de07ef4531828c108ea099ff637f8c52d1fczhangEFIAPI
4773f58f3de07ef4531828c108ea099ff637f8c52d1fczhangConSplitterEmptyCallbackFunction (
4774f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  IN EFI_EVENT                Event,
4775f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  IN VOID                     *Context
4776f58f3de07ef4531828c108ea099ff637f8c52d1fczhang  )
4777f58f3de07ef4531828c108ea099ff637f8c52d1fczhang{
4778f58f3de07ef4531828c108ea099ff637f8c52d1fczhang}
4779