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