Home | History | Annotate | Download | only in ConSplitterDxe
      1 /** @file
      2   Private data structures for the Console Splitter driver
      3 
      4 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef _CON_SPLITTER_H_
     16 #define _CON_SPLITTER_H_
     17 
     18 #include <Uefi.h>
     19 #include <PiDxe.h>
     20 
     21 #include <Protocol/DevicePath.h>
     22 #include <Protocol/ComponentName.h>
     23 #include <Protocol/DriverBinding.h>
     24 #include <Protocol/SimplePointer.h>
     25 #include <Protocol/AbsolutePointer.h>
     26 #include <Protocol/SimpleTextOut.h>
     27 #include <Protocol/SimpleTextIn.h>
     28 #include <Protocol/SimpleTextInEx.h>
     29 #include <Protocol/GraphicsOutput.h>
     30 #include <Protocol/UgaDraw.h>
     31 
     32 #include <Guid/ConsoleInDevice.h>
     33 #include <Guid/StandardErrorDevice.h>
     34 #include <Guid/ConsoleOutDevice.h>
     35 #include <Guid/ConnectConInEvent.h>
     36 
     37 #include <Library/PcdLib.h>
     38 #include <Library/DebugLib.h>
     39 #include <Library/UefiDriverEntryPoint.h>
     40 #include <Library/UefiLib.h>
     41 #include <Library/BaseLib.h>
     42 #include <Library/BaseMemoryLib.h>
     43 #include <Library/MemoryAllocationLib.h>
     44 #include <Library/UefiBootServicesTableLib.h>
     45 #include <Library/UefiRuntimeServicesTableLib.h>
     46 
     47 //
     48 // Driver Binding Externs
     49 //
     50 extern EFI_DRIVER_BINDING_PROTOCOL  gConSplitterConInDriverBinding;
     51 extern EFI_COMPONENT_NAME_PROTOCOL  gConSplitterConInComponentName;
     52 extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterConInComponentName2;
     53 extern EFI_DRIVER_BINDING_PROTOCOL  gConSplitterSimplePointerDriverBinding;
     54 extern EFI_COMPONENT_NAME_PROTOCOL  gConSplitterSimplePointerComponentName;
     55 extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterSimplePointerComponentName2;
     56 extern EFI_DRIVER_BINDING_PROTOCOL  gConSplitterAbsolutePointerDriverBinding;
     57 extern EFI_COMPONENT_NAME_PROTOCOL  gConSplitterAbsolutePointerComponentName;
     58 extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterAbsolutePointerComponentName2;
     59 extern EFI_DRIVER_BINDING_PROTOCOL  gConSplitterConOutDriverBinding;
     60 extern EFI_COMPONENT_NAME_PROTOCOL  gConSplitterConOutComponentName;
     61 extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterConOutComponentName2;
     62 extern EFI_DRIVER_BINDING_PROTOCOL  gConSplitterStdErrDriverBinding;
     63 extern EFI_COMPONENT_NAME_PROTOCOL  gConSplitterStdErrComponentName;
     64 extern EFI_COMPONENT_NAME2_PROTOCOL gConSplitterStdErrComponentName2;
     65 
     66 
     67 //
     68 // These definitions were in the old Hii protocol, but are not in the new UEFI
     69 // version. So they are defined locally.
     70 //
     71 #define UNICODE_NARROW_CHAR   0xFFF0
     72 #define UNICODE_WIDE_CHAR     0xFFF1
     73 
     74 
     75 //
     76 // Private Data Structures
     77 //
     78 #define CONSOLE_SPLITTER_ALLOC_UNIT  32
     79 
     80 
     81 typedef struct {
     82   UINTN   Column;
     83   UINTN   Row;
     84 } CONSOLE_OUT_MODE;
     85 
     86 typedef struct {
     87   UINTN   Columns;
     88   UINTN   Rows;
     89 } TEXT_OUT_SPLITTER_QUERY_DATA;
     90 
     91 
     92 #define TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE    SIGNATURE_32 ('T', 'i', 'S', 'n')
     93 
     94 //
     95 // Private data for Text In Ex Splitter Notify
     96 //
     97 typedef struct _TEXT_IN_EX_SPLITTER_NOTIFY {
     98   UINTN                                 Signature;
     99   VOID                                  **NotifyHandleList;
    100   EFI_KEY_DATA                          KeyData;
    101   EFI_KEY_NOTIFY_FUNCTION               KeyNotificationFn;
    102   LIST_ENTRY                            NotifyEntry;
    103 } TEXT_IN_EX_SPLITTER_NOTIFY;
    104 
    105 #define TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS(a)  \
    106   CR ((a),                                       \
    107       TEXT_IN_EX_SPLITTER_NOTIFY,                \
    108       NotifyEntry,                               \
    109       TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE       \
    110       )
    111 
    112 #define TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('T', 'i', 'S', 'p')
    113 
    114 //
    115 // Private data for the Console In splitter
    116 //
    117 typedef struct {
    118   UINT64                             Signature;
    119   EFI_HANDLE                         VirtualHandle;
    120 
    121   EFI_SIMPLE_TEXT_INPUT_PROTOCOL     TextIn;
    122   UINTN                              CurrentNumberOfConsoles;
    123   EFI_SIMPLE_TEXT_INPUT_PROTOCOL     **TextInList;
    124   UINTN                              TextInListCount;
    125 
    126   EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  TextInEx;
    127   UINTN                              CurrentNumberOfExConsoles;
    128   EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  **TextInExList;
    129   UINTN                              TextInExListCount;
    130   LIST_ENTRY                         NotifyList;
    131 
    132 
    133   EFI_SIMPLE_POINTER_PROTOCOL        SimplePointer;
    134   EFI_SIMPLE_POINTER_MODE            SimplePointerMode;
    135   UINTN                              CurrentNumberOfPointers;
    136   EFI_SIMPLE_POINTER_PROTOCOL        **PointerList;
    137   UINTN                              PointerListCount;
    138 
    139   EFI_ABSOLUTE_POINTER_PROTOCOL      AbsolutePointer;
    140   EFI_ABSOLUTE_POINTER_MODE          AbsolutePointerMode;
    141   UINTN                              CurrentNumberOfAbsolutePointers;
    142   EFI_ABSOLUTE_POINTER_PROTOCOL      **AbsolutePointerList;
    143   UINTN                              AbsolutePointerListCount;
    144   BOOLEAN                            AbsoluteInputEventSignalState;
    145 
    146   BOOLEAN                            KeyEventSignalState;
    147   BOOLEAN                            InputEventSignalState;
    148   EFI_EVENT                          ConnectConInEvent;
    149 } TEXT_IN_SPLITTER_PRIVATE_DATA;
    150 
    151 #define TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_THIS(a)  \
    152   CR ((a),                                          \
    153       TEXT_IN_SPLITTER_PRIVATE_DATA,                \
    154       TextIn,                                       \
    155       TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE       \
    156       )
    157 
    158 #define TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_SIMPLE_POINTER_THIS(a) \
    159   CR ((a),                                                        \
    160       TEXT_IN_SPLITTER_PRIVATE_DATA,                              \
    161       SimplePointer,                                              \
    162       TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE                     \
    163       )
    164 #define TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS(a) \
    165   CR (a,                                              \
    166       TEXT_IN_SPLITTER_PRIVATE_DATA,                  \
    167       TextInEx,                                       \
    168       TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE         \
    169       )
    170 
    171 #define TEXT_IN_SPLITTER_PRIVATE_DATA_FROM_ABSOLUTE_POINTER_THIS(a) \
    172   CR (a,                                                            \
    173       TEXT_IN_SPLITTER_PRIVATE_DATA,                                \
    174       AbsolutePointer,                                              \
    175       TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE                       \
    176       )
    177 
    178 
    179 #define TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('T', 'o', 'S', 'p')
    180 
    181 typedef struct {
    182   EFI_GRAPHICS_OUTPUT_PROTOCOL     *GraphicsOutput;
    183   EFI_UGA_DRAW_PROTOCOL            *UgaDraw;
    184   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;
    185 } TEXT_OUT_AND_GOP_DATA;
    186 
    187 //
    188 // Private data for the Console Out splitter
    189 //
    190 typedef struct {
    191   UINT64                                Signature;
    192   EFI_HANDLE                            VirtualHandle;
    193   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL       TextOut;
    194   EFI_SIMPLE_TEXT_OUTPUT_MODE           TextOutMode;
    195 
    196   EFI_UGA_DRAW_PROTOCOL                 UgaDraw;
    197   UINT32                                UgaHorizontalResolution;
    198   UINT32                                UgaVerticalResolution;
    199   UINT32                                UgaColorDepth;
    200   UINT32                                UgaRefreshRate;
    201 
    202   EFI_GRAPHICS_OUTPUT_PROTOCOL          GraphicsOutput;
    203   EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *GraphicsOutputModeBuffer;
    204   UINTN                                 CurrentNumberOfGraphicsOutput;
    205   UINTN                                 CurrentNumberOfUgaDraw;
    206 
    207   UINTN                                 CurrentNumberOfConsoles;
    208   TEXT_OUT_AND_GOP_DATA                 *TextOutList;
    209   UINTN                                 TextOutListCount;
    210   TEXT_OUT_SPLITTER_QUERY_DATA          *TextOutQueryData;
    211   UINTN                                 TextOutQueryDataCount;
    212   INT32                                 *TextOutModeMap;
    213 
    214 } TEXT_OUT_SPLITTER_PRIVATE_DATA;
    215 
    216 #define TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS(a) \
    217   CR ((a),                                          \
    218       TEXT_OUT_SPLITTER_PRIVATE_DATA,               \
    219       TextOut,                                      \
    220       TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE      \
    221       )
    222 
    223 #define GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS(a)  \
    224   CR ((a),                                                  \
    225       TEXT_OUT_SPLITTER_PRIVATE_DATA,                       \
    226       GraphicsOutput,                                       \
    227       TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE              \
    228       )
    229 
    230 #define UGA_DRAW_SPLITTER_PRIVATE_DATA_FROM_THIS(a) \
    231   CR ((a),                                          \
    232       TEXT_OUT_SPLITTER_PRIVATE_DATA,               \
    233       UgaDraw,                                      \
    234       TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE      \
    235       )
    236 
    237 #define CONSOLE_CONTROL_SPLITTER_PRIVATE_DATA_FROM_THIS(a)  \
    238   CR ((a),                                                  \
    239       TEXT_OUT_SPLITTER_PRIVATE_DATA,                       \
    240       ConsoleControl,                                       \
    241       TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE              \
    242       )
    243 
    244 //
    245 // Function Prototypes
    246 //
    247 
    248 /**
    249   The user Entry Point for module ConSplitter. The user code starts with this function.
    250 
    251   Installs driver module protocols and. Creates virtual device handles for ConIn,
    252   ConOut, and StdErr. Installs Simple Text In protocol, Simple Text In Ex protocol,
    253   Simple Pointer protocol, Absolute Pointer protocol on those virtual handlers.
    254   Installs Graphics Output protocol and/or UGA Draw protocol if needed.
    255 
    256   @param[in] ImageHandle    The firmware allocated handle for the EFI image.
    257   @param[in] SystemTable    A pointer to the EFI System Table.
    258 
    259   @retval EFI_SUCCESS       The entry point is executed successfully.
    260   @retval other             Some error occurs when executing this entry point.
    261 
    262 **/
    263 EFI_STATUS
    264 EFIAPI
    265 ConSplitterDriverEntry (
    266   IN EFI_HANDLE                       ImageHandle,
    267   IN EFI_SYSTEM_TABLE                 *SystemTable
    268   );
    269 
    270 /**
    271   Construct console input devices' private data.
    272 
    273   @param  ConInPrivate             A pointer to the TEXT_IN_SPLITTER_PRIVATE_DATA
    274                                    structure.
    275 
    276   @retval EFI_OUT_OF_RESOURCES     Out of resources.
    277   @retval EFI_SUCCESS              Text Input Devcie's private data has been constructed.
    278   @retval other                    Failed to construct private data.
    279 
    280 **/
    281 EFI_STATUS
    282 ConSplitterTextInConstructor (
    283   TEXT_IN_SPLITTER_PRIVATE_DATA       *ConInPrivate
    284   );
    285 
    286 /**
    287   Construct console output devices' private data.
    288 
    289   @param  ConOutPrivate            A pointer to the TEXT_OUT_SPLITTER_PRIVATE_DATA
    290                                    structure.
    291 
    292   @retval EFI_OUT_OF_RESOURCES     Out of resources.
    293   @retval EFI_SUCCESS              Text Input Devcie's private data has been constructed.
    294 
    295 **/
    296 EFI_STATUS
    297 ConSplitterTextOutConstructor (
    298   TEXT_OUT_SPLITTER_PRIVATE_DATA      *ConOutPrivate
    299   );
    300 
    301 
    302 /**
    303   Test to see if Console In Device could be supported on the Controller.
    304 
    305   @param  This                Driver Binding protocol instance pointer.
    306   @param  ControllerHandle    Handle of device to test.
    307   @param  RemainingDevicePath Optional parameter use to pick a specific child
    308                               device to start.
    309 
    310   @retval EFI_SUCCESS         This driver supports this device.
    311   @retval other               This driver does not support this device.
    312 
    313 **/
    314 EFI_STATUS
    315 EFIAPI
    316 ConSplitterConInDriverBindingSupported (
    317   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    318   IN  EFI_HANDLE                      ControllerHandle,
    319   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    320   );
    321 
    322 /**
    323   Test to see if Simple Pointer protocol could be supported on the Controller.
    324 
    325   @param  This                Driver Binding protocol instance pointer.
    326   @param  ControllerHandle    Handle of device to test.
    327   @param  RemainingDevicePath Optional parameter use to pick a specific child
    328                               device to start.
    329 
    330   @retval EFI_SUCCESS         This driver supports this device.
    331   @retval other               This driver does not support this device.
    332 
    333 **/
    334 EFI_STATUS
    335 EFIAPI
    336 ConSplitterSimplePointerDriverBindingSupported (
    337   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    338   IN  EFI_HANDLE                      ControllerHandle,
    339   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    340   );
    341 
    342 /**
    343   Test to see if Console Out Device could be supported on the Controller.
    344 
    345   @param  This                Driver Binding protocol instance pointer.
    346   @param  ControllerHandle    Handle of device to test.
    347   @param  RemainingDevicePath Optional parameter use to pick a specific child
    348                               device to start.
    349 
    350   @retval EFI_SUCCESS         This driver supports this device.
    351   @retval other               This driver does not support this device.
    352 
    353 **/
    354 EFI_STATUS
    355 EFIAPI
    356 ConSplitterConOutDriverBindingSupported (
    357   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    358   IN  EFI_HANDLE                      ControllerHandle,
    359   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    360   );
    361 
    362 /**
    363   Test to see if Standard Error Device could be supported on the Controller.
    364 
    365   @param  This                Driver Binding protocol instance pointer.
    366   @param  ControllerHandle    Handle of device to test.
    367   @param  RemainingDevicePath Optional parameter use to pick a specific child
    368                               device to start.
    369 
    370   @retval EFI_SUCCESS         This driver supports this device.
    371   @retval other               This driver does not support this device.
    372 
    373 **/
    374 EFI_STATUS
    375 EFIAPI
    376 ConSplitterStdErrDriverBindingSupported (
    377   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    378   IN  EFI_HANDLE                      ControllerHandle,
    379   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    380   );
    381 
    382 /**
    383   Start Console In Consplitter on device handle.
    384 
    385   @param  This                 Driver Binding protocol instance pointer.
    386   @param  ControllerHandle     Handle of device to bind driver to.
    387   @param  RemainingDevicePath  Optional parameter use to pick a specific child
    388                                device to start.
    389 
    390   @retval EFI_SUCCESS          Console In Consplitter is added to ControllerHandle.
    391   @retval other                Console In Consplitter does not support this device.
    392 
    393 **/
    394 EFI_STATUS
    395 EFIAPI
    396 ConSplitterConInDriverBindingStart (
    397   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    398   IN  EFI_HANDLE                      ControllerHandle,
    399   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    400   );
    401 
    402 /**
    403   Start Simple Pointer Consplitter on device handle.
    404 
    405   @param  This                 Driver Binding protocol instance pointer.
    406   @param  ControllerHandle     Handle of device to bind driver to.
    407   @param  RemainingDevicePath  Optional parameter use to pick a specific child
    408                                device to start.
    409 
    410   @retval EFI_SUCCESS          Simple Pointer Consplitter is added to ControllerHandle.
    411   @retval other                Simple Pointer Consplitter does not support this device.
    412 
    413 **/
    414 EFI_STATUS
    415 EFIAPI
    416 ConSplitterSimplePointerDriverBindingStart (
    417   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    418   IN  EFI_HANDLE                      ControllerHandle,
    419   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    420   );
    421 
    422 /**
    423   Start Console Out Consplitter on device handle.
    424 
    425   @param  This                 Driver Binding protocol instance pointer.
    426   @param  ControllerHandle     Handle of device to bind driver to.
    427   @param  RemainingDevicePath  Optional parameter use to pick a specific child
    428                                device to start.
    429 
    430   @retval EFI_SUCCESS          Console Out Consplitter is added to ControllerHandle.
    431   @retval other                Console Out Consplitter does not support this device.
    432 
    433 **/
    434 EFI_STATUS
    435 EFIAPI
    436 ConSplitterConOutDriverBindingStart (
    437   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    438   IN  EFI_HANDLE                      ControllerHandle,
    439   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    440   );
    441 
    442 /**
    443   Start Standard Error Consplitter on device handle.
    444 
    445   @param  This                 Driver Binding protocol instance pointer.
    446   @param  ControllerHandle     Handle of device to bind driver to.
    447   @param  RemainingDevicePath  Optional parameter use to pick a specific child
    448                                device to start.
    449 
    450   @retval EFI_SUCCESS          Standard Error Consplitter is added to ControllerHandle.
    451   @retval other                Standard Error Consplitter does not support this device.
    452 
    453 **/
    454 EFI_STATUS
    455 EFIAPI
    456 ConSplitterStdErrDriverBindingStart (
    457   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    458   IN  EFI_HANDLE                      ControllerHandle,
    459   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    460   );
    461 
    462 /**
    463   Stop Console In ConSplitter on ControllerHandle by closing Console In Devcice GUID.
    464 
    465   @param  This              Driver Binding protocol instance pointer.
    466   @param  ControllerHandle  Handle of device to stop driver on
    467   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
    468                             children is zero stop the entire bus driver.
    469   @param  ChildHandleBuffer List of Child Handles to Stop.
    470 
    471   @retval EFI_SUCCESS       This driver is removed ControllerHandle
    472   @retval other             This driver was not removed from this device
    473 
    474 **/
    475 EFI_STATUS
    476 EFIAPI
    477 ConSplitterConInDriverBindingStop (
    478   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    479   IN  EFI_HANDLE                      ControllerHandle,
    480   IN  UINTN                           NumberOfChildren,
    481   IN  EFI_HANDLE                      *ChildHandleBuffer
    482   );
    483 
    484 /**
    485   Stop Simple Pointer protocol ConSplitter on ControllerHandle by closing
    486   Simple Pointer protocol.
    487 
    488   @param  This              Driver Binding protocol instance pointer.
    489   @param  ControllerHandle  Handle of device to stop driver on
    490   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
    491                             children is zero stop the entire bus driver.
    492   @param  ChildHandleBuffer List of Child Handles to Stop.
    493 
    494   @retval EFI_SUCCESS       This driver is removed ControllerHandle
    495   @retval other             This driver was not removed from this device
    496 
    497 **/
    498 EFI_STATUS
    499 EFIAPI
    500 ConSplitterSimplePointerDriverBindingStop (
    501   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    502   IN  EFI_HANDLE                      ControllerHandle,
    503   IN  UINTN                           NumberOfChildren,
    504   IN  EFI_HANDLE                      *ChildHandleBuffer
    505   );
    506 
    507 /**
    508   Stop Console Out ConSplitter on device handle by closing Console Out Devcice GUID.
    509 
    510   @param  This              Driver Binding protocol instance pointer.
    511   @param  ControllerHandle  Handle of device to stop driver on
    512   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
    513                             children is zero stop the entire bus driver.
    514   @param  ChildHandleBuffer List of Child Handles to Stop.
    515 
    516   @retval EFI_SUCCESS       This driver is removed ControllerHandle
    517   @retval other             This driver was not removed from this device
    518 
    519 **/
    520 EFI_STATUS
    521 EFIAPI
    522 ConSplitterConOutDriverBindingStop (
    523   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    524   IN  EFI_HANDLE                      ControllerHandle,
    525   IN  UINTN                           NumberOfChildren,
    526   IN  EFI_HANDLE                      *ChildHandleBuffer
    527   );
    528 
    529 /**
    530   Stop Standard Error ConSplitter on ControllerHandle by closing Standard Error GUID.
    531 
    532   @param  This              Driver Binding protocol instance pointer.
    533   @param  ControllerHandle  Handle of device to stop driver on
    534   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
    535                             children is zero stop the entire bus driver.
    536   @param  ChildHandleBuffer List of Child Handles to Stop.
    537 
    538   @retval EFI_SUCCESS       This driver is removed ControllerHandle
    539   @retval other             This driver was not removed from this device
    540 
    541 **/
    542 EFI_STATUS
    543 EFIAPI
    544 ConSplitterStdErrDriverBindingStop (
    545   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    546   IN  EFI_HANDLE                      ControllerHandle,
    547   IN  UINTN                           NumberOfChildren,
    548   IN  EFI_HANDLE                      *ChildHandleBuffer
    549   );
    550 
    551 
    552 /**
    553   Test to see if Absolute Pointer protocol could be supported on the Controller.
    554 
    555   @param  This                Driver Binding protocol instance pointer.
    556   @param  ControllerHandle    Handle of device to test.
    557   @param  RemainingDevicePath Optional parameter use to pick a specific child
    558                               device to start.
    559 
    560   @retval EFI_SUCCESS         This driver supports this device.
    561   @retval other               This driver does not support this device.
    562 
    563 **/
    564 EFI_STATUS
    565 EFIAPI
    566 ConSplitterAbsolutePointerDriverBindingSupported (
    567   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    568   IN  EFI_HANDLE                      ControllerHandle,
    569   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    570   );
    571 
    572 /**
    573   Start Absolute Pointer Consplitter on device handle.
    574 
    575   @param  This                 Driver Binding protocol instance pointer.
    576   @param  ControllerHandle     Handle of device to bind driver to.
    577   @param  RemainingDevicePath  Optional parameter use to pick a specific child
    578                                device to start.
    579 
    580   @retval EFI_SUCCESS          Absolute Pointer Consplitter is added to ControllerHandle.
    581   @retval other                Absolute Pointer Consplitter does not support this device.
    582 
    583 **/
    584 EFI_STATUS
    585 EFIAPI
    586 ConSplitterAbsolutePointerDriverBindingStart (
    587   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    588   IN  EFI_HANDLE                      ControllerHandle,
    589   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
    590   );
    591 
    592 /**
    593   Stop Absolute Pointer protocol ConSplitter on ControllerHandle by closing
    594   Absolute Pointer protocol.
    595 
    596   @param  This              Driver Binding protocol instance pointer.
    597   @param  ControllerHandle  Handle of device to stop driver on
    598   @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
    599                             children is zero stop the entire bus driver.
    600   @param  ChildHandleBuffer List of Child Handles to Stop.
    601 
    602   @retval EFI_SUCCESS       This driver is removed ControllerHandle
    603   @retval other             This driver was not removed from this device
    604 
    605 **/
    606 EFI_STATUS
    607 EFIAPI
    608 ConSplitterAbsolutePointerDriverBindingStop (
    609   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
    610   IN  EFI_HANDLE                      ControllerHandle,
    611   IN  UINTN                           NumberOfChildren,
    612   IN  EFI_HANDLE                      *ChildHandleBuffer
    613   );
    614 
    615 /**
    616   Add Absolute Pointer Device in Consplitter Absolute Pointer list.
    617 
    618   @param  Private                  Text In Splitter pointer.
    619   @param  AbsolutePointer          Absolute Pointer protocol pointer.
    620 
    621   @retval EFI_SUCCESS              Absolute Pointer Device added successfully.
    622   @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
    623 
    624 **/
    625 EFI_STATUS
    626 ConSplitterAbsolutePointerAddDevice (
    627   IN  TEXT_IN_SPLITTER_PRIVATE_DATA     *Private,
    628   IN  EFI_ABSOLUTE_POINTER_PROTOCOL     *AbsolutePointer
    629   );
    630 
    631 /**
    632   Remove Absolute Pointer Device from Consplitter Absolute Pointer list.
    633 
    634   @param  Private                  Text In Splitter pointer.
    635   @param  AbsolutePointer          Absolute Pointer protocol pointer.
    636 
    637   @retval EFI_SUCCESS              Absolute Pointer Device removed successfully.
    638   @retval EFI_NOT_FOUND            No Absolute Pointer Device found.
    639 
    640 **/
    641 EFI_STATUS
    642 ConSplitterAbsolutePointerDeleteDevice (
    643   IN  TEXT_IN_SPLITTER_PRIVATE_DATA     *Private,
    644   IN  EFI_ABSOLUTE_POINTER_PROTOCOL     *AbsolutePointer
    645   );
    646 
    647 //
    648 // Absolute Pointer protocol interfaces
    649 //
    650 
    651 
    652 /**
    653   Resets the pointer device hardware.
    654 
    655   @param  This                     Protocol instance pointer.
    656   @param  ExtendedVerification     Driver may perform diagnostics on reset.
    657 
    658   @retval EFI_SUCCESS              The device was reset.
    659   @retval EFI_DEVICE_ERROR         The device is not functioning correctly and
    660                                    could not be reset.
    661 
    662 **/
    663 EFI_STATUS
    664 EFIAPI
    665 ConSplitterAbsolutePointerReset (
    666   IN EFI_ABSOLUTE_POINTER_PROTOCOL   *This,
    667   IN BOOLEAN                         ExtendedVerification
    668   );
    669 
    670 
    671 /**
    672   Retrieves the current state of a pointer device.
    673 
    674   @param  This                     Protocol instance pointer.
    675   @param  State                    A pointer to the state information on the
    676                                    pointer device.
    677 
    678   @retval EFI_SUCCESS              The state of the pointer device was returned in
    679                                    State..
    680   @retval EFI_NOT_READY            The state of the pointer device has not changed
    681                                    since the last call to GetState().
    682   @retval EFI_DEVICE_ERROR         A device error occurred while attempting to
    683                                    retrieve the pointer device's current state.
    684 
    685 **/
    686 EFI_STATUS
    687 EFIAPI
    688 ConSplitterAbsolutePointerGetState (
    689   IN EFI_ABSOLUTE_POINTER_PROTOCOL   *This,
    690   IN OUT EFI_ABSOLUTE_POINTER_STATE  *State
    691   );
    692 
    693 /**
    694   This event agregates all the events of the pointer devices in the splitter.
    695 
    696   If any events of physical pointer devices are signaled, signal the pointer
    697   splitter event. This will cause the calling code to call
    698   ConSplitterAbsolutePointerGetState ().
    699 
    700   @param  Event                    The Event assoicated with callback.
    701   @param  Context                  Context registered when Event was created.
    702 
    703 **/
    704 VOID
    705 EFIAPI
    706 ConSplitterAbsolutePointerWaitForInput (
    707   IN  EFI_EVENT                       Event,
    708   IN  VOID                            *Context
    709   );
    710 
    711 /**
    712   Retrieves a Unicode string that is the user readable name of the driver.
    713 
    714   This function retrieves the user readable name of a driver in the form of a
    715   Unicode string. If the driver specified by This has a user readable name in
    716   the language specified by Language, then a pointer to the driver name is
    717   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
    718   by This does not support the language specified by Language,
    719   then EFI_UNSUPPORTED is returned.
    720 
    721   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
    722                                 EFI_COMPONENT_NAME_PROTOCOL instance.
    723 
    724   @param  Language[in]          A pointer to a Null-terminated ASCII string
    725                                 array indicating the language. This is the
    726                                 language of the driver name that the caller is
    727                                 requesting, and it must match one of the
    728                                 languages specified in SupportedLanguages. The
    729                                 number of languages supported by a driver is up
    730                                 to the driver writer. Language is specified
    731                                 in RFC 4646 or ISO 639-2 language code format.
    732 
    733   @param  DriverName[out]       A pointer to the Unicode string to return.
    734                                 This Unicode string is the name of the
    735                                 driver specified by This in the language
    736                                 specified by Language.
    737 
    738   @retval EFI_SUCCESS           The Unicode string for the Driver specified by
    739                                 This and the language specified by Language was
    740                                 returned in DriverName.
    741 
    742   @retval EFI_INVALID_PARAMETER Language is NULL.
    743 
    744   @retval EFI_INVALID_PARAMETER DriverName is NULL.
    745 
    746   @retval EFI_UNSUPPORTED       The driver specified by This does not support
    747                                 the language specified by Language.
    748 
    749 **/
    750 EFI_STATUS
    751 EFIAPI
    752 ConSplitterComponentNameGetDriverName (
    753   IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
    754   IN  CHAR8                        *Language,
    755   OUT CHAR16                       **DriverName
    756   );
    757 
    758 
    759 /**
    760   Retrieves a Unicode string that is the user readable name of the controller
    761   that is being managed by a driver.
    762 
    763   This function retrieves the user readable name of the controller specified by
    764   ControllerHandle and ChildHandle in the form of a Unicode string. If the
    765   driver specified by This has a user readable name in the language specified by
    766   Language, then a pointer to the controller name is returned in ControllerName,
    767   and EFI_SUCCESS is returned.  If the driver specified by This is not currently
    768   managing the controller specified by ControllerHandle and ChildHandle,
    769   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
    770   support the language specified by Language, then EFI_UNSUPPORTED is returned.
    771 
    772   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
    773                                 EFI_COMPONENT_NAME_PROTOCOL instance.
    774 
    775   @param  ControllerHandle[in]  The handle of a controller that the driver
    776                                 specified by This is managing.  This handle
    777                                 specifies the controller whose name is to be
    778                                 returned.
    779 
    780   @param  ChildHandle[in]       The handle of the child controller to retrieve
    781                                 the name of.  This is an optional parameter that
    782                                 may be NULL.  It will be NULL for device
    783                                 drivers.  It will also be NULL for a bus drivers
    784                                 that wish to retrieve the name of the bus
    785                                 controller.  It will not be NULL for a bus
    786                                 driver that wishes to retrieve the name of a
    787                                 child controller.
    788 
    789   @param  Language[in]          A pointer to a Null-terminated ASCII string
    790                                 array indicating the language.  This is the
    791                                 language of the driver name that the caller is
    792                                 requesting, and it must match one of the
    793                                 languages specified in SupportedLanguages. The
    794                                 number of languages supported by a driver is up
    795                                 to the driver writer. Language is specified in
    796                                 RFC 4646 or ISO 639-2 language code format.
    797 
    798   @param  ControllerName[out]   A pointer to the Unicode string to return.
    799                                 This Unicode string is the name of the
    800                                 controller specified by ControllerHandle and
    801                                 ChildHandle in the language specified by
    802                                 Language from the point of view of the driver
    803                                 specified by This.
    804 
    805   @retval EFI_SUCCESS           The Unicode string for the user readable name in
    806                                 the language specified by Language for the
    807                                 driver specified by This was returned in
    808                                 DriverName.
    809 
    810   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
    811 
    812   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
    813                                 EFI_HANDLE.
    814 
    815   @retval EFI_INVALID_PARAMETER Language is NULL.
    816 
    817   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
    818 
    819   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
    820                                 managing the controller specified by
    821                                 ControllerHandle and ChildHandle.
    822 
    823   @retval EFI_UNSUPPORTED       The driver specified by This does not support
    824                                 the language specified by Language.
    825 
    826 **/
    827 EFI_STATUS
    828 EFIAPI
    829 ConSplitterConInComponentNameGetControllerName (
    830   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
    831   IN  EFI_HANDLE                                      ControllerHandle,
    832   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
    833   IN  CHAR8                                           *Language,
    834   OUT CHAR16                                          **ControllerName
    835   );
    836 
    837 
    838 /**
    839   Retrieves a Unicode string that is the user readable name of the controller
    840   that is being managed by a driver.
    841 
    842   This function retrieves the user readable name of the controller specified by
    843   ControllerHandle and ChildHandle in the form of a Unicode string. If the
    844   driver specified by This has a user readable name in the language specified by
    845   Language, then a pointer to the controller name is returned in ControllerName,
    846   and EFI_SUCCESS is returned.  If the driver specified by This is not currently
    847   managing the controller specified by ControllerHandle and ChildHandle,
    848   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
    849   support the language specified by Language, then EFI_UNSUPPORTED is returned.
    850 
    851   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
    852                                 EFI_COMPONENT_NAME_PROTOCOL instance.
    853 
    854   @param  ControllerHandle[in]  The handle of a controller that the driver
    855                                 specified by This is managing.  This handle
    856                                 specifies the controller whose name is to be
    857                                 returned.
    858 
    859   @param  ChildHandle[in]       The handle of the child controller to retrieve
    860                                 the name of.  This is an optional parameter that
    861                                 may be NULL.  It will be NULL for device
    862                                 drivers.  It will also be NULL for a bus drivers
    863                                 that wish to retrieve the name of the bus
    864                                 controller.  It will not be NULL for a bus
    865                                 driver that wishes to retrieve the name of a
    866                                 child controller.
    867 
    868   @param  Language[in]          A pointer to a Null-terminated ASCII string
    869                                 array indicating the language.  This is the
    870                                 language of the driver name that the caller is
    871                                 requesting, and it must match one of the
    872                                 languages specified in SupportedLanguages. The
    873                                 number of languages supported by a driver is up
    874                                 to the driver writer. Language is specified in
    875                                 RFC 4646 or ISO 639-2 language code format.
    876 
    877   @param  ControllerName[out]   A pointer to the Unicode string to return.
    878                                 This Unicode string is the name of the
    879                                 controller specified by ControllerHandle and
    880                                 ChildHandle in the language specified by
    881                                 Language from the point of view of the driver
    882                                 specified by This.
    883 
    884   @retval EFI_SUCCESS           The Unicode string for the user readable name in
    885                                 the language specified by Language for the
    886                                 driver specified by This was returned in
    887                                 DriverName.
    888 
    889   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
    890 
    891   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
    892                                 EFI_HANDLE.
    893 
    894   @retval EFI_INVALID_PARAMETER Language is NULL.
    895 
    896   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
    897 
    898   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
    899                                 managing the controller specified by
    900                                 ControllerHandle and ChildHandle.
    901 
    902   @retval EFI_UNSUPPORTED       The driver specified by This does not support
    903                                 the language specified by Language.
    904 
    905 **/
    906 EFI_STATUS
    907 EFIAPI
    908 ConSplitterSimplePointerComponentNameGetControllerName (
    909   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
    910   IN  EFI_HANDLE                                      ControllerHandle,
    911   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
    912   IN  CHAR8                                           *Language,
    913   OUT CHAR16                                          **ControllerName
    914   );
    915 
    916 /**
    917   Retrieves a Unicode string that is the user readable name of the controller
    918   that is being managed by an EFI Driver.
    919 
    920   @param  This                   A pointer to the EFI_COMPONENT_NAME_PROTOCOL
    921                                  instance.
    922   @param  ControllerHandle       The handle of a controller that the driver
    923                                  specified by This is managing.  This handle
    924                                  specifies the controller whose name is to be
    925                                  returned.
    926   @param  ChildHandle            The handle of the child controller to retrieve the
    927                                  name of.  This is an optional parameter that may
    928                                  be NULL.  It will be NULL for device drivers.  It
    929                                  will also be NULL for a bus drivers that wish to
    930                                  retrieve the name of the bus controller.  It will
    931                                  not be NULL for a bus driver that wishes to
    932                                  retrieve the name of a child controller.
    933   @param  Language               A pointer to RFC4646 language identifier. This is
    934                                  the language of the controller name that that the
    935                                  caller is requesting, and it must match one of the
    936                                  languages specified in SupportedLanguages.  The
    937                                  number of languages supported by a driver is up to
    938                                  the driver writer.
    939   @param  ControllerName         A pointer to the Unicode string to return.  This
    940                                  Unicode string is the name of the controller
    941                                  specified by ControllerHandle and ChildHandle in
    942                                  the language specified by Language from the point
    943                                  of view of the driver specified by This.
    944 
    945   @retval EFI_SUCCESS            The Unicode string for the user readable name in
    946                                  the language specified by Language for the driver
    947                                  specified by This was returned in DriverName.
    948   @retval EFI_INVALID_PARAMETER  ControllerHandle is NULL.
    949   @retval EFI_INVALID_PARAMETER  ChildHandle is not NULL and it is not a valid
    950                                  EFI_HANDLE.
    951   @retval EFI_INVALID_PARAMETER  Language is NULL.
    952   @retval EFI_INVALID_PARAMETER  ControllerName is NULL.
    953   @retval EFI_UNSUPPORTED        The driver specified by This is not currently
    954                                  managing the controller specified by
    955                                  ControllerHandle and ChildHandle.
    956   @retval EFI_UNSUPPORTED        The driver specified by This does not support the
    957                                  language specified by Language.
    958 
    959 **/
    960 EFI_STATUS
    961 EFIAPI
    962 ConSplitterAbsolutePointerComponentNameGetControllerName (
    963   IN  EFI_COMPONENT_NAME_PROTOCOL                    *This,
    964   IN  EFI_HANDLE                                      ControllerHandle,
    965   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
    966   IN  CHAR8                                           *Language,
    967   OUT CHAR16                                          **ControllerName
    968   );
    969 
    970 /**
    971   Retrieves a Unicode string that is the user readable name of the controller
    972   that is being managed by a driver.
    973 
    974   This function retrieves the user readable name of the controller specified by
    975   ControllerHandle and ChildHandle in the form of a Unicode string. If the
    976   driver specified by This has a user readable name in the language specified by
    977   Language, then a pointer to the controller name is returned in ControllerName,
    978   and EFI_SUCCESS is returned.  If the driver specified by This is not currently
    979   managing the controller specified by ControllerHandle and ChildHandle,
    980   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
    981   support the language specified by Language, then EFI_UNSUPPORTED is returned.
    982 
    983   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
    984                                 EFI_COMPONENT_NAME_PROTOCOL instance.
    985 
    986   @param  ControllerHandle[in]  The handle of a controller that the driver
    987                                 specified by This is managing.  This handle
    988                                 specifies the controller whose name is to be
    989                                 returned.
    990 
    991   @param  ChildHandle[in]       The handle of the child controller to retrieve
    992                                 the name of.  This is an optional parameter that
    993                                 may be NULL.  It will be NULL for device
    994                                 drivers.  It will also be NULL for a bus drivers
    995                                 that wish to retrieve the name of the bus
    996                                 controller.  It will not be NULL for a bus
    997                                 driver that wishes to retrieve the name of a
    998                                 child controller.
    999 
   1000   @param  Language[in]          A pointer to a Null-terminated ASCII string
   1001                                 array indicating the language.  This is the
   1002                                 language of the driver name that the caller is
   1003                                 requesting, and it must match one of the
   1004                                 languages specified in SupportedLanguages. The
   1005                                 number of languages supported by a driver is up
   1006                                 to the driver writer. Language is specified in
   1007                                 RFC 4646 or ISO 639-2 language code format.
   1008 
   1009   @param  ControllerName[out]   A pointer to the Unicode string to return.
   1010                                 This Unicode string is the name of the
   1011                                 controller specified by ControllerHandle and
   1012                                 ChildHandle in the language specified by
   1013                                 Language from the point of view of the driver
   1014                                 specified by This.
   1015 
   1016   @retval EFI_SUCCESS           The Unicode string for the user readable name in
   1017                                 the language specified by Language for the
   1018                                 driver specified by This was returned in
   1019                                 DriverName.
   1020 
   1021   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
   1022 
   1023   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
   1024                                 EFI_HANDLE.
   1025 
   1026   @retval EFI_INVALID_PARAMETER Language is NULL.
   1027 
   1028   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
   1029 
   1030   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
   1031                                 managing the controller specified by
   1032                                 ControllerHandle and ChildHandle.
   1033 
   1034   @retval EFI_UNSUPPORTED       The driver specified by This does not support
   1035                                 the language specified by Language.
   1036 
   1037 **/
   1038 EFI_STATUS
   1039 EFIAPI
   1040 ConSplitterConOutComponentNameGetControllerName (
   1041   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
   1042   IN  EFI_HANDLE                                      ControllerHandle,
   1043   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
   1044   IN  CHAR8                                           *Language,
   1045   OUT CHAR16                                          **ControllerName
   1046   );
   1047 
   1048 
   1049 /**
   1050   Retrieves a Unicode string that is the user readable name of the controller
   1051   that is being managed by a driver.
   1052 
   1053   This function retrieves the user readable name of the controller specified by
   1054   ControllerHandle and ChildHandle in the form of a Unicode string. If the
   1055   driver specified by This has a user readable name in the language specified by
   1056   Language, then a pointer to the controller name is returned in ControllerName,
   1057   and EFI_SUCCESS is returned.  If the driver specified by This is not currently
   1058   managing the controller specified by ControllerHandle and ChildHandle,
   1059   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
   1060   support the language specified by Language, then EFI_UNSUPPORTED is returned.
   1061 
   1062   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
   1063                                 EFI_COMPONENT_NAME_PROTOCOL instance.
   1064 
   1065   @param  ControllerHandle[in]  The handle of a controller that the driver
   1066                                 specified by This is managing.  This handle
   1067                                 specifies the controller whose name is to be
   1068                                 returned.
   1069 
   1070   @param  ChildHandle[in]       The handle of the child controller to retrieve
   1071                                 the name of.  This is an optional parameter that
   1072                                 may be NULL.  It will be NULL for device
   1073                                 drivers.  It will also be NULL for a bus drivers
   1074                                 that wish to retrieve the name of the bus
   1075                                 controller.  It will not be NULL for a bus
   1076                                 driver that wishes to retrieve the name of a
   1077                                 child controller.
   1078 
   1079   @param  Language[in]          A pointer to a Null-terminated ASCII string
   1080                                 array indicating the language.  This is the
   1081                                 language of the driver name that the caller is
   1082                                 requesting, and it must match one of the
   1083                                 languages specified in SupportedLanguages. The
   1084                                 number of languages supported by a driver is up
   1085                                 to the driver writer. Language is specified in
   1086                                 RFC 4646 or ISO 639-2 language code format.
   1087 
   1088   @param  ControllerName[out]   A pointer to the Unicode string to return.
   1089                                 This Unicode string is the name of the
   1090                                 controller specified by ControllerHandle and
   1091                                 ChildHandle in the language specified by
   1092                                 Language from the point of view of the driver
   1093                                 specified by This.
   1094 
   1095   @retval EFI_SUCCESS           The Unicode string for the user readable name in
   1096                                 the language specified by Language for the
   1097                                 driver specified by This was returned in
   1098                                 DriverName.
   1099 
   1100   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
   1101 
   1102   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
   1103                                 EFI_HANDLE.
   1104 
   1105   @retval EFI_INVALID_PARAMETER Language is NULL.
   1106 
   1107   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
   1108 
   1109   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
   1110                                 managing the controller specified by
   1111                                 ControllerHandle and ChildHandle.
   1112 
   1113   @retval EFI_UNSUPPORTED       The driver specified by This does not support
   1114                                 the language specified by Language.
   1115 
   1116 **/
   1117 EFI_STATUS
   1118 EFIAPI
   1119 ConSplitterStdErrComponentNameGetControllerName (
   1120   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
   1121   IN  EFI_HANDLE                                      ControllerHandle,
   1122   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
   1123   IN  CHAR8                                           *Language,
   1124   OUT CHAR16                                          **ControllerName
   1125   );
   1126 
   1127 
   1128 //
   1129 // TextIn Constructor/Destructor functions
   1130 //
   1131 
   1132 /**
   1133   Add Text Input Device in Consplitter Text Input list.
   1134 
   1135   @param  Private                  Text In Splitter pointer.
   1136   @param  TextIn                   Simple Text Input protocol pointer.
   1137 
   1138   @retval EFI_SUCCESS              Text Input Device added successfully.
   1139   @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
   1140 
   1141 **/
   1142 EFI_STATUS
   1143 ConSplitterTextInAddDevice (
   1144   IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
   1145   IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *TextIn
   1146   );
   1147 
   1148 /**
   1149   Remove Text Input Device from Consplitter Text Input list.
   1150 
   1151   @param  Private                  Text In Splitter pointer.
   1152   @param  TextIn                   Simple Text protocol pointer.
   1153 
   1154   @retval EFI_SUCCESS              Simple Text Device removed successfully.
   1155   @retval EFI_NOT_FOUND            No Simple Text Device found.
   1156 
   1157 **/
   1158 EFI_STATUS
   1159 ConSplitterTextInDeleteDevice (
   1160   IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
   1161   IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *TextIn
   1162   );
   1163 
   1164 //
   1165 // SimplePointer Constuctor/Destructor functions
   1166 //
   1167 
   1168 /**
   1169   Add Simple Pointer Device in Consplitter Simple Pointer list.
   1170 
   1171   @param  Private                  Text In Splitter pointer.
   1172   @param  SimplePointer            Simple Pointer protocol pointer.
   1173 
   1174   @retval EFI_SUCCESS              Simple Pointer Device added successfully.
   1175   @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
   1176 
   1177 **/
   1178 EFI_STATUS
   1179 ConSplitterSimplePointerAddDevice (
   1180   IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
   1181   IN  EFI_SIMPLE_POINTER_PROTOCOL     *SimplePointer
   1182   );
   1183 
   1184 /**
   1185   Remove Simple Pointer Device from Consplitter Simple Pointer list.
   1186 
   1187   @param  Private                  Text In Splitter pointer.
   1188   @param  SimplePointer            Simple Pointer protocol pointer.
   1189 
   1190   @retval EFI_SUCCESS              Simple Pointer Device removed successfully.
   1191   @retval EFI_NOT_FOUND            No Simple Pointer Device found.
   1192 
   1193 **/
   1194 EFI_STATUS
   1195 ConSplitterSimplePointerDeleteDevice (
   1196   IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
   1197   IN  EFI_SIMPLE_POINTER_PROTOCOL     *SimplePointer
   1198   );
   1199 
   1200 //
   1201 // TextOut Constuctor/Destructor functions
   1202 //
   1203 
   1204 /**
   1205   Add Text Output Device in Consplitter Text Output list.
   1206 
   1207   @param  Private                  Text Out Splitter pointer.
   1208   @param  TextOut                  Simple Text Output protocol pointer.
   1209   @param  GraphicsOutput           Graphics Output protocol pointer.
   1210   @param  UgaDraw                  UGA Draw protocol pointer.
   1211 
   1212   @retval EFI_SUCCESS              Text Output Device added successfully.
   1213   @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
   1214 
   1215 **/
   1216 EFI_STATUS
   1217 ConSplitterTextOutAddDevice (
   1218   IN  TEXT_OUT_SPLITTER_PRIVATE_DATA     *Private,
   1219   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *TextOut,
   1220   IN  EFI_GRAPHICS_OUTPUT_PROTOCOL       *GraphicsOutput,
   1221   IN  EFI_UGA_DRAW_PROTOCOL              *UgaDraw
   1222   );
   1223 
   1224 /**
   1225   Remove Text Out Device in Consplitter Text Out list.
   1226 
   1227   @param  Private                  Text Out Splitter pointer.
   1228   @param  TextOut                  Simple Text Output Pointer protocol pointer.
   1229 
   1230   @retval EFI_SUCCESS              Text Out Device removed successfully.
   1231   @retval EFI_NOT_FOUND            No Text Out Device found.
   1232 
   1233 **/
   1234 EFI_STATUS
   1235 ConSplitterTextOutDeleteDevice (
   1236   IN  TEXT_OUT_SPLITTER_PRIVATE_DATA     *Private,
   1237   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *TextOut
   1238   );
   1239 
   1240 //
   1241 // TextIn I/O Functions
   1242 //
   1243 
   1244 /**
   1245   Reset the input device and optionaly run diagnostics
   1246 
   1247   @param  This                     Protocol instance pointer.
   1248   @param  ExtendedVerification     Driver may perform diagnostics on reset.
   1249 
   1250   @retval EFI_SUCCESS              The device was reset.
   1251   @retval EFI_DEVICE_ERROR         The device is not functioning properly and could
   1252                                    not be reset.
   1253 
   1254 **/
   1255 EFI_STATUS
   1256 EFIAPI
   1257 ConSplitterTextInReset (
   1258   IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This,
   1259   IN  BOOLEAN                         ExtendedVerification
   1260   );
   1261 
   1262 /**
   1263   Reads the next keystroke from the input device. The WaitForKey Event can
   1264   be used to test for existance of a keystroke via WaitForEvent () call.
   1265 
   1266   @param  This                     Protocol instance pointer.
   1267   @param  Key                      Driver may perform diagnostics on reset.
   1268 
   1269   @retval EFI_SUCCESS              The keystroke information was returned.
   1270   @retval EFI_NOT_READY            There was no keystroke data availiable.
   1271   @retval EFI_DEVICE_ERROR         The keydtroke information was not returned due
   1272                                    to hardware errors.
   1273 
   1274 **/
   1275 EFI_STATUS
   1276 EFIAPI
   1277 ConSplitterTextInReadKeyStroke (
   1278   IN  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *This,
   1279   OUT EFI_INPUT_KEY                   *Key
   1280   );
   1281 
   1282 /**
   1283   Add Text Input Ex Device in Consplitter Text Input Ex list.
   1284 
   1285   @param  Private                  Text In Splitter pointer.
   1286   @param  TextInEx                 Simple Text Input Ex Input protocol pointer.
   1287 
   1288   @retval EFI_SUCCESS              Text Input Ex Device added successfully.
   1289   @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
   1290 
   1291 **/
   1292 EFI_STATUS
   1293 ConSplitterTextInExAddDevice (
   1294   IN  TEXT_IN_SPLITTER_PRIVATE_DATA         *Private,
   1295   IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL     *TextInEx
   1296   );
   1297 
   1298 /**
   1299   Remove Text Ex Device from Consplitter Text Input Ex list.
   1300 
   1301   @param  Private                  Text In Splitter pointer.
   1302   @param  TextInEx                 Simple Text Ex protocol pointer.
   1303 
   1304   @retval EFI_SUCCESS              Simple Text Input Ex Device removed successfully.
   1305   @retval EFI_NOT_FOUND            No Simple Text Input Ex Device found.
   1306 
   1307 **/
   1308 EFI_STATUS
   1309 ConSplitterTextInExDeleteDevice (
   1310   IN  TEXT_IN_SPLITTER_PRIVATE_DATA         *Private,
   1311   IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL     *TextInEx
   1312   );
   1313 
   1314 //
   1315 // Simple Text Input Ex protocol function prototypes
   1316 //
   1317 
   1318 /**
   1319   Reset the input device and optionaly run diagnostics
   1320 
   1321   @param  This                     Protocol instance pointer.
   1322   @param  ExtendedVerification     Driver may perform diagnostics on reset.
   1323 
   1324   @retval EFI_SUCCESS              The device was reset.
   1325   @retval EFI_DEVICE_ERROR         The device is not functioning properly and could
   1326                                    not be reset.
   1327 
   1328 **/
   1329 EFI_STATUS
   1330 EFIAPI
   1331 ConSplitterTextInResetEx (
   1332   IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
   1333   IN BOOLEAN                            ExtendedVerification
   1334   );
   1335 
   1336 
   1337 /**
   1338   Reads the next keystroke from the input device. The WaitForKey Event can
   1339   be used to test for existance of a keystroke via WaitForEvent () call.
   1340 
   1341   @param  This                     Protocol instance pointer.
   1342   @param  KeyData                  A pointer to a buffer that is filled in with the
   1343                                    keystroke state data for the key that was
   1344                                    pressed.
   1345 
   1346   @retval EFI_SUCCESS              The keystroke information was returned.
   1347   @retval EFI_NOT_READY            There was no keystroke data availiable.
   1348   @retval EFI_DEVICE_ERROR         The keystroke information was not returned due
   1349                                    to hardware errors.
   1350   @retval EFI_INVALID_PARAMETER    KeyData is NULL.
   1351 
   1352 **/
   1353 EFI_STATUS
   1354 EFIAPI
   1355 ConSplitterTextInReadKeyStrokeEx (
   1356   IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
   1357   OUT EFI_KEY_DATA                      *KeyData
   1358   );
   1359 
   1360 
   1361 /**
   1362   Set certain state for the input device.
   1363 
   1364   @param  This                     Protocol instance pointer.
   1365   @param  KeyToggleState           A pointer to the EFI_KEY_TOGGLE_STATE to set the
   1366                                    state for the input device.
   1367 
   1368   @retval EFI_SUCCESS              The device state was set successfully.
   1369   @retval EFI_DEVICE_ERROR         The device is not functioning correctly and
   1370                                    could not have the setting adjusted.
   1371   @retval EFI_UNSUPPORTED          The device does not have the ability to set its
   1372                                    state.
   1373   @retval EFI_INVALID_PARAMETER    KeyToggleState is NULL.
   1374 
   1375 **/
   1376 EFI_STATUS
   1377 EFIAPI
   1378 ConSplitterTextInSetState (
   1379   IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
   1380   IN EFI_KEY_TOGGLE_STATE               *KeyToggleState
   1381   );
   1382 
   1383 
   1384 /**
   1385   Register a notification function for a particular keystroke for the input device.
   1386 
   1387   @param  This                     Protocol instance pointer.
   1388   @param  KeyData                  A pointer to a buffer that is filled in with the
   1389                                    keystroke information data for the key that was
   1390                                    pressed.
   1391   @param  KeyNotificationFunction  Points to the function to be called when the key
   1392                                    sequence is typed specified by KeyData.
   1393   @param  NotifyHandle             Points to the unique handle assigned to the
   1394                                    registered notification.
   1395 
   1396   @retval EFI_SUCCESS              The notification function was registered
   1397                                    successfully.
   1398   @retval EFI_OUT_OF_RESOURCES     Unable to allocate resources for necesssary data
   1399                                    structures.
   1400   @retval EFI_INVALID_PARAMETER    KeyData or KeyNotificationFunction or NotifyHandle is NULL.
   1401 
   1402 **/
   1403 EFI_STATUS
   1404 EFIAPI
   1405 ConSplitterTextInRegisterKeyNotify (
   1406   IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
   1407   IN EFI_KEY_DATA                       *KeyData,
   1408   IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,
   1409   OUT VOID                              **NotifyHandle
   1410   );
   1411 
   1412 
   1413 /**
   1414   Remove a registered notification function from a particular keystroke.
   1415 
   1416   @param  This                     Protocol instance pointer.
   1417   @param  NotificationHandle       The handle of the notification function being
   1418                                    unregistered.
   1419 
   1420   @retval EFI_SUCCESS              The notification function was unregistered
   1421                                    successfully.
   1422   @retval EFI_INVALID_PARAMETER    The NotificationHandle is invalid.
   1423   @retval EFI_NOT_FOUND            Can not find the matching entry in database.
   1424 
   1425 **/
   1426 EFI_STATUS
   1427 EFIAPI
   1428 ConSplitterTextInUnregisterKeyNotify (
   1429   IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
   1430   IN VOID                               *NotificationHandle
   1431   );
   1432 
   1433 /**
   1434   This event aggregates all the events of the ConIn devices in the spliter.
   1435 
   1436   If any events of physical ConIn devices are signaled, signal the ConIn
   1437   spliter event. This will cause the calling code to call
   1438   ConSplitterTextInReadKeyStroke ().
   1439 
   1440   @param  Event                    The Event assoicated with callback.
   1441   @param  Context                  Context registered when Event was created.
   1442 
   1443 **/
   1444 VOID
   1445 EFIAPI
   1446 ConSplitterTextInWaitForKey (
   1447   IN  EFI_EVENT                       Event,
   1448   IN  VOID                            *Context
   1449   );
   1450 
   1451 
   1452 /**
   1453   Reads the next keystroke from the input device. The WaitForKey Event can
   1454   be used to test for existance of a keystroke via WaitForEvent () call.
   1455 
   1456   @param  Private                  Protocol instance pointer.
   1457   @param  Key                      Driver may perform diagnostics on reset.
   1458 
   1459   @retval EFI_SUCCESS              The keystroke information was returned.
   1460   @retval EFI_NOT_READY            There was no keystroke data availiable.
   1461   @retval EFI_DEVICE_ERROR         The keydtroke information was not returned due
   1462                                    to hardware errors.
   1463 
   1464 **/
   1465 EFI_STATUS
   1466 EFIAPI
   1467 ConSplitterTextInPrivateReadKeyStroke (
   1468   IN  TEXT_IN_SPLITTER_PRIVATE_DATA   *Private,
   1469   OUT EFI_INPUT_KEY                   *Key
   1470   );
   1471 
   1472 /**
   1473   Reset the input device and optionaly run diagnostics
   1474 
   1475   @param  This                     Protocol instance pointer.
   1476   @param  ExtendedVerification     Driver may perform diagnostics on reset.
   1477 
   1478   @retval EFI_SUCCESS              The device was reset.
   1479   @retval EFI_DEVICE_ERROR         The device is not functioning properly and could
   1480                                    not be reset.
   1481 
   1482 **/
   1483 EFI_STATUS
   1484 EFIAPI
   1485 ConSplitterSimplePointerReset (
   1486   IN  EFI_SIMPLE_POINTER_PROTOCOL     *This,
   1487   IN  BOOLEAN                         ExtendedVerification
   1488   );
   1489 
   1490 /**
   1491   Reads the next keystroke from the input device. The WaitForKey Event can
   1492   be used to test for existance of a keystroke via WaitForEvent () call.
   1493 
   1494   @param  This                     A pointer to protocol instance.
   1495   @param  State                    A pointer to state information on the pointer device
   1496 
   1497   @retval EFI_SUCCESS              The keystroke information was returned in State.
   1498   @retval EFI_NOT_READY            There was no keystroke data availiable.
   1499   @retval EFI_DEVICE_ERROR         The keydtroke information was not returned due
   1500                                    to hardware errors.
   1501 
   1502 **/
   1503 EFI_STATUS
   1504 EFIAPI
   1505 ConSplitterSimplePointerGetState (
   1506   IN  EFI_SIMPLE_POINTER_PROTOCOL     *This,
   1507   IN OUT EFI_SIMPLE_POINTER_STATE     *State
   1508   );
   1509 
   1510 /**
   1511   This event agregates all the events of the ConIn devices in the spliter.
   1512   If any events of physical ConIn devices are signaled, signal the ConIn
   1513   spliter event. This will cause the calling code to call
   1514   ConSplitterTextInReadKeyStroke ().
   1515 
   1516   @param  Event                    The Event assoicated with callback.
   1517   @param  Context                  Context registered when Event was created.
   1518 
   1519 **/
   1520 VOID
   1521 EFIAPI
   1522 ConSplitterSimplePointerWaitForInput (
   1523   IN  EFI_EVENT                       Event,
   1524   IN  VOID                            *Context
   1525   );
   1526 
   1527 //
   1528 // TextOut I/O Functions
   1529 //
   1530 
   1531 /**
   1532   Reset the text output device hardware and optionaly run diagnostics
   1533 
   1534   @param  This                     Protocol instance pointer.
   1535   @param  ExtendedVerification     Driver may perform more exhaustive verfication
   1536                                    operation of the device during reset.
   1537 
   1538   @retval EFI_SUCCESS              The text output device was reset.
   1539   @retval EFI_DEVICE_ERROR         The text output device is not functioning
   1540                                    correctly and could not be reset.
   1541 
   1542 **/
   1543 EFI_STATUS
   1544 EFIAPI
   1545 ConSplitterTextOutReset (
   1546   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
   1547   IN  BOOLEAN                            ExtendedVerification
   1548   );
   1549 
   1550 /**
   1551   Write a Unicode string to the output device.
   1552 
   1553   @param  This                     Protocol instance pointer.
   1554   @param  WString                  The NULL-terminated Unicode string to be
   1555                                    displayed on the output device(s). All output
   1556                                    devices must also support the Unicode drawing
   1557                                    defined in this file.
   1558 
   1559   @retval EFI_SUCCESS              The string was output to the device.
   1560   @retval EFI_DEVICE_ERROR         The device reported an error while attempting to
   1561                                    output the text.
   1562   @retval EFI_UNSUPPORTED          The output device's mode is not currently in a
   1563                                    defined text mode.
   1564   @retval EFI_WARN_UNKNOWN_GLYPH   This warning code indicates that some of the
   1565                                    characters in the Unicode string could not be
   1566                                    rendered and were skipped.
   1567 
   1568 **/
   1569 EFI_STATUS
   1570 EFIAPI
   1571 ConSplitterTextOutOutputString (
   1572   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
   1573   IN  CHAR16                             *WString
   1574   );
   1575 
   1576 /**
   1577   Verifies that all characters in a Unicode string can be output to the
   1578   target device.
   1579 
   1580   @param  This                     Protocol instance pointer.
   1581   @param  WString                  The NULL-terminated Unicode string to be
   1582                                    examined for the output device(s).
   1583 
   1584   @retval EFI_SUCCESS              The device(s) are capable of rendering the
   1585                                    output string.
   1586   @retval EFI_UNSUPPORTED          Some of the characters in the Unicode string
   1587                                    cannot be rendered by one or more of the output
   1588                                    devices mapped by the EFI handle.
   1589 
   1590 **/
   1591 EFI_STATUS
   1592 EFIAPI
   1593 ConSplitterTextOutTestString (
   1594   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
   1595   IN  CHAR16                             *WString
   1596   );
   1597 
   1598 /**
   1599   Returns information for an available text mode that the output device(s)
   1600   supports.
   1601 
   1602   @param  This                     Protocol instance pointer.
   1603   @param  ModeNumber               The mode number to return information on.
   1604   @param  Columns                  Returns the columns of the text output device
   1605                                    for the requested ModeNumber.
   1606   @param  Rows                     Returns the rows of the text output device
   1607                                    for the requested ModeNumber.
   1608 
   1609   @retval EFI_SUCCESS              The requested mode information was returned.
   1610   @retval EFI_DEVICE_ERROR         The device had an error and could not complete
   1611                                    the request.
   1612   @retval EFI_UNSUPPORTED          The mode number was not valid.
   1613 
   1614 **/
   1615 EFI_STATUS
   1616 EFIAPI
   1617 ConSplitterTextOutQueryMode (
   1618   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
   1619   IN  UINTN                              ModeNumber,
   1620   OUT UINTN                              *Columns,
   1621   OUT UINTN                              *Rows
   1622   );
   1623 
   1624 /**
   1625   Sets the output device(s) to a specified mode.
   1626 
   1627   @param  This                     Protocol instance pointer.
   1628   @param  ModeNumber               The mode number to set.
   1629 
   1630   @retval EFI_SUCCESS              The requested text mode was set.
   1631   @retval EFI_DEVICE_ERROR         The device had an error and could not complete
   1632                                    the request.
   1633   @retval EFI_UNSUPPORTED          The mode number was not valid.
   1634 
   1635 **/
   1636 EFI_STATUS
   1637 EFIAPI
   1638 ConSplitterTextOutSetMode (
   1639   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
   1640   IN  UINTN                              ModeNumber
   1641   );
   1642 
   1643 /**
   1644   Sets the background and foreground colors for the OutputString () and
   1645   ClearScreen () functions.
   1646 
   1647   @param  This                     Protocol instance pointer.
   1648   @param  Attribute                The attribute to set. Bits 0..3 are the
   1649                                    foreground color, and bits 4..6 are the
   1650                                    background color. All other bits are undefined
   1651                                    and must be zero. The valid Attributes are
   1652                                    defined in this file.
   1653 
   1654   @retval EFI_SUCCESS              The attribute was set.
   1655   @retval EFI_DEVICE_ERROR         The device had an error and could not complete
   1656                                    the request.
   1657   @retval EFI_UNSUPPORTED          The attribute requested is not defined.
   1658 
   1659 **/
   1660 EFI_STATUS
   1661 EFIAPI
   1662 ConSplitterTextOutSetAttribute (
   1663   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
   1664   IN  UINTN                              Attribute
   1665   );
   1666 
   1667 /**
   1668   Clears the output device(s) display to the currently selected background
   1669   color.
   1670 
   1671   @param  This                     Protocol instance pointer.
   1672 
   1673   @retval EFI_SUCCESS              The operation completed successfully.
   1674   @retval EFI_DEVICE_ERROR         The device had an error and could not complete
   1675                                    the request.
   1676   @retval EFI_UNSUPPORTED          The output device is not in a valid text mode.
   1677 
   1678 **/
   1679 EFI_STATUS
   1680 EFIAPI
   1681 ConSplitterTextOutClearScreen (
   1682   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This
   1683   );
   1684 
   1685 /**
   1686   Sets the current coordinates of the cursor position
   1687 
   1688   @param  This                     Protocol instance pointer.
   1689   @param  Column                   The column position to set the cursor to. Must be
   1690                                    greater than or equal to zero and less than the
   1691                                    number of columns by QueryMode ().
   1692   @param  Row                      The row position to set the cursor to. Must be
   1693                                    greater than or equal to zero and less than the
   1694                                    number of rows by QueryMode ().
   1695 
   1696   @retval EFI_SUCCESS              The operation completed successfully.
   1697   @retval EFI_DEVICE_ERROR         The device had an error and could not complete
   1698                                    the request.
   1699   @retval EFI_UNSUPPORTED          The output device is not in a valid text mode,
   1700                                    or the cursor position is invalid for the
   1701                                    current mode.
   1702 
   1703 **/
   1704 EFI_STATUS
   1705 EFIAPI
   1706 ConSplitterTextOutSetCursorPosition (
   1707   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
   1708   IN  UINTN                              Column,
   1709   IN  UINTN                              Row
   1710   );
   1711 
   1712 
   1713 /**
   1714   Makes the cursor visible or invisible
   1715 
   1716   @param  This                     Protocol instance pointer.
   1717   @param  Visible                  If TRUE, the cursor is set to be visible. If
   1718                                    FALSE, the cursor is set to be invisible.
   1719 
   1720   @retval EFI_SUCCESS              The operation completed successfully.
   1721   @retval EFI_DEVICE_ERROR         The device had an error and could not complete
   1722                                    the request, or the device does not support
   1723                                    changing the cursor mode.
   1724   @retval EFI_UNSUPPORTED          The output device is not in a valid text mode.
   1725 
   1726 **/
   1727 EFI_STATUS
   1728 EFIAPI
   1729 ConSplitterTextOutEnableCursor (
   1730   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *This,
   1731   IN  BOOLEAN                            Visible
   1732   );
   1733 
   1734 /**
   1735   Take the passed in Buffer of size ElementSize and grow the buffer
   1736   by CONSOLE_SPLITTER_ALLOC_UNIT * ElementSize bytes.
   1737   Copy the current data in Buffer to the new version of Buffer and
   1738   free the old version of buffer.
   1739 
   1740   @param  ElementSize              Size of element in array.
   1741   @param  Count                    Current number of elements in array.
   1742   @param  Buffer                   Bigger version of passed in Buffer with all the
   1743                                    data.
   1744 
   1745   @retval EFI_SUCCESS              Buffer size has grown.
   1746   @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.
   1747 
   1748 **/
   1749 EFI_STATUS
   1750 ConSplitterGrowBuffer (
   1751   IN      UINTN                       ElementSize,
   1752   IN OUT  UINTN                       *Count,
   1753   IN OUT  VOID                        **Buffer
   1754   );
   1755 
   1756 /**
   1757   Returns information for an available graphics mode that the graphics device
   1758   and the set of active video output devices supports.
   1759 
   1760   @param  This                  The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
   1761   @param  ModeNumber            The mode number to return information on.
   1762   @param  SizeOfInfo            A pointer to the size, in bytes, of the Info buffer.
   1763   @param  Info                  A pointer to callee allocated buffer that returns information about ModeNumber.
   1764 
   1765   @retval EFI_SUCCESS           Mode information returned.
   1766   @retval EFI_BUFFER_TOO_SMALL  The Info buffer was too small.
   1767   @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve the video mode.
   1768   @retval EFI_INVALID_PARAMETER One of the input args was NULL.
   1769   @retval EFI_OUT_OF_RESOURCES  No resource available.
   1770 
   1771 **/
   1772 EFI_STATUS
   1773 EFIAPI
   1774 ConSplitterGraphicsOutputQueryMode (
   1775   IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
   1776   IN  UINT32                                ModeNumber,
   1777   OUT UINTN                                 *SizeOfInfo,
   1778   OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info
   1779   );
   1780 
   1781 /**
   1782   Set the video device into the specified mode and clears the visible portions of
   1783   the output display to black.
   1784 
   1785   @param  This                  The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
   1786   @param  ModeNumber            Abstraction that defines the current video mode.
   1787 
   1788   @retval EFI_SUCCESS           The graphics mode specified by ModeNumber was selected.
   1789   @retval EFI_DEVICE_ERROR      The device had an error and could not complete the request.
   1790   @retval EFI_UNSUPPORTED       ModeNumber is not supported by this device.
   1791   @retval EFI_OUT_OF_RESOURCES  No resource available.
   1792 
   1793 **/
   1794 EFI_STATUS
   1795 EFIAPI
   1796 ConSplitterGraphicsOutputSetMode (
   1797   IN  EFI_GRAPHICS_OUTPUT_PROTOCOL * This,
   1798   IN  UINT32                       ModeNumber
   1799   );
   1800 
   1801 /**
   1802   The following table defines actions for BltOperations.
   1803 
   1804   EfiBltVideoFill - Write data from the  BltBuffer pixel (SourceX, SourceY)
   1805   directly to every pixel of the video display rectangle
   1806   (DestinationX, DestinationY)
   1807   (DestinationX + Width, DestinationY + Height).
   1808   Only one pixel will be used from the BltBuffer. Delta is NOT used.
   1809   EfiBltVideoToBltBuffer - Read data from the video display rectangle
   1810   (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in
   1811   the BltBuffer rectangle (DestinationX, DestinationY )
   1812   (DestinationX + Width, DestinationY + Height). If DestinationX or
   1813   DestinationY is not zero then Delta must be set to the length in bytes
   1814   of a row in the BltBuffer.
   1815   EfiBltBufferToVideo - Write data from the  BltBuffer rectangle
   1816   (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the
   1817   video display rectangle (DestinationX, DestinationY)
   1818   (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is
   1819   not zero then Delta must be set to the length in bytes of a row in the
   1820   BltBuffer.
   1821   EfiBltVideoToVideo - Copy from the video display rectangle
   1822   (SourceX, SourceY) (SourceX + Width, SourceY + Height) .
   1823   to the video display rectangle (DestinationX, DestinationY)
   1824   (DestinationX + Width, DestinationY + Height).
   1825   The BltBuffer and Delta  are not used in this mode.
   1826 
   1827   @param  This                    Protocol instance pointer.
   1828   @param  BltBuffer               Buffer containing data to blit into video buffer.
   1829                                   This buffer has a size of
   1830                                   Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
   1831   @param  BltOperation            Operation to perform on BlitBuffer and video
   1832                                   memory
   1833   @param  SourceX                 X coordinate of source for the BltBuffer.
   1834   @param  SourceY                 Y coordinate of source for the BltBuffer.
   1835   @param  DestinationX            X coordinate of destination for the BltBuffer.
   1836   @param  DestinationY            Y coordinate of destination for the BltBuffer.
   1837   @param  Width                   Width of rectangle in BltBuffer in pixels.
   1838   @param  Height                  Hight of rectangle in BltBuffer in pixels.
   1839   @param  Delta                   OPTIONAL.
   1840 
   1841   @retval EFI_SUCCESS             The Blt operation completed.
   1842   @retval EFI_INVALID_PARAMETER   BltOperation is not valid.
   1843   @retval EFI_DEVICE_ERROR        A hardware error occured writting to the video
   1844                                   buffer.
   1845 
   1846 **/
   1847 EFI_STATUS
   1848 EFIAPI
   1849 ConSplitterGraphicsOutputBlt (
   1850   IN  EFI_GRAPHICS_OUTPUT_PROTOCOL                  *This,
   1851   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL                 *BltBuffer, OPTIONAL
   1852   IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION             BltOperation,
   1853   IN  UINTN                                         SourceX,
   1854   IN  UINTN                                         SourceY,
   1855   IN  UINTN                                         DestinationX,
   1856   IN  UINTN                                         DestinationY,
   1857   IN  UINTN                                         Width,
   1858   IN  UINTN                                         Height,
   1859   IN  UINTN                                         Delta         OPTIONAL
   1860   );
   1861 
   1862 
   1863 /**
   1864   Return the current video mode information.
   1865 
   1866   @param  This                  The EFI_UGA_DRAW_PROTOCOL instance.
   1867   @param  HorizontalResolution  The size of video screen in pixels in the X dimension.
   1868   @param  VerticalResolution    The size of video screen in pixels in the Y dimension.
   1869   @param  ColorDepth            Number of bits per pixel, currently defined to be 32.
   1870   @param  RefreshRate           The refresh rate of the monitor in Hertz.
   1871 
   1872   @retval EFI_SUCCESS           Mode information returned.
   1873   @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()
   1874   @retval EFI_INVALID_PARAMETER One of the input args was NULL.
   1875 
   1876 **/
   1877 EFI_STATUS
   1878 EFIAPI
   1879 ConSplitterUgaDrawGetMode (
   1880   IN  EFI_UGA_DRAW_PROTOCOL           *This,
   1881   OUT UINT32                          *HorizontalResolution,
   1882   OUT UINT32                          *VerticalResolution,
   1883   OUT UINT32                          *ColorDepth,
   1884   OUT UINT32                          *RefreshRate
   1885   );
   1886 
   1887 /**
   1888   Set the current video mode information.
   1889 
   1890   @param  This                 The EFI_UGA_DRAW_PROTOCOL instance.
   1891   @param  HorizontalResolution The size of video screen in pixels in the X dimension.
   1892   @param  VerticalResolution   The size of video screen in pixels in the Y dimension.
   1893   @param  ColorDepth           Number of bits per pixel, currently defined to be 32.
   1894   @param  RefreshRate          The refresh rate of the monitor in Hertz.
   1895 
   1896   @retval EFI_SUCCESS          Mode information returned.
   1897   @retval EFI_NOT_STARTED      Video display is not initialized. Call SetMode ()
   1898   @retval EFI_OUT_OF_RESOURCES Out of resources.
   1899 
   1900 **/
   1901 EFI_STATUS
   1902 EFIAPI
   1903 ConSplitterUgaDrawSetMode (
   1904   IN  EFI_UGA_DRAW_PROTOCOL           *This,
   1905   IN UINT32                           HorizontalResolution,
   1906   IN UINT32                           VerticalResolution,
   1907   IN UINT32                           ColorDepth,
   1908   IN UINT32                           RefreshRate
   1909   );
   1910 
   1911 /**
   1912   Blt a rectangle of pixels on the graphics screen.
   1913 
   1914   The following table defines actions for BltOperations.
   1915 
   1916   EfiUgaVideoFill:
   1917     Write data from the  BltBuffer pixel (SourceX, SourceY)
   1918     directly to every pixel of the video display rectangle
   1919     (DestinationX, DestinationY)
   1920     (DestinationX + Width, DestinationY + Height).
   1921     Only one pixel will be used from the BltBuffer. Delta is NOT used.
   1922   EfiUgaVideoToBltBuffer:
   1923     Read data from the video display rectangle
   1924     (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in
   1925     the BltBuffer rectangle (DestinationX, DestinationY )
   1926     (DestinationX + Width, DestinationY + Height). If DestinationX or
   1927     DestinationY is not zero then Delta must be set to the length in bytes
   1928     of a row in the BltBuffer.
   1929   EfiUgaBltBufferToVideo:
   1930     Write data from the  BltBuffer rectangle
   1931     (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the
   1932     video display rectangle (DestinationX, DestinationY)
   1933     (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is
   1934     not zero then Delta must be set to the length in bytes of a row in the
   1935     BltBuffer.
   1936   EfiUgaVideoToVideo:
   1937     Copy from the video display rectangle
   1938     (SourceX, SourceY) (SourceX + Width, SourceY + Height) .
   1939     to the video display rectangle (DestinationX, DestinationY)
   1940     (DestinationX + Width, DestinationY + Height).
   1941     The BltBuffer and Delta  are not used in this mode.
   1942 
   1943   @param  This           Protocol instance pointer.
   1944   @param  BltBuffer      Buffer containing data to blit into video buffer. This
   1945                          buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL)
   1946   @param  BltOperation   Operation to perform on BlitBuffer and video memory
   1947   @param  SourceX        X coordinate of source for the BltBuffer.
   1948   @param  SourceY        Y coordinate of source for the BltBuffer.
   1949   @param  DestinationX   X coordinate of destination for the BltBuffer.
   1950   @param  DestinationY   Y coordinate of destination for the BltBuffer.
   1951   @param  Width          Width of rectangle in BltBuffer in pixels.
   1952   @param  Height         Hight of rectangle in BltBuffer in pixels.
   1953   @param  Delta          OPTIONAL
   1954 
   1955   @retval EFI_SUCCESS            The Blt operation completed.
   1956   @retval EFI_INVALID_PARAMETER  BltOperation is not valid.
   1957   @retval EFI_DEVICE_ERROR       A hardware error occured writting to the video buffer.
   1958 
   1959 **/
   1960 EFI_STATUS
   1961 EFIAPI
   1962 ConSplitterUgaDrawBlt (
   1963   IN  EFI_UGA_DRAW_PROTOCOL                         *This,
   1964   IN  EFI_UGA_PIXEL                                 *BltBuffer, OPTIONAL
   1965   IN  EFI_UGA_BLT_OPERATION                         BltOperation,
   1966   IN  UINTN                                         SourceX,
   1967   IN  UINTN                                         SourceY,
   1968   IN  UINTN                                         DestinationX,
   1969   IN  UINTN                                         DestinationY,
   1970   IN  UINTN                                         Width,
   1971   IN  UINTN                                         Height,
   1972   IN  UINTN                                         Delta         OPTIONAL
   1973   );
   1974 
   1975 /**
   1976   Sets the output device(s) to a specified mode.
   1977 
   1978   @param  Private                 Text Out Splitter pointer.
   1979   @param  ModeNumber              The mode number to set.
   1980 
   1981 **/
   1982 VOID
   1983 TextOutSetMode (
   1984   IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private,
   1985   IN  UINTN                           ModeNumber
   1986   );
   1987 
   1988 /**
   1989   An empty function to pass error checking of CreateEventEx ().
   1990 
   1991   @param  Event                 Event whose notification function is being invoked.
   1992   @param  Context               Pointer to the notification function's context,
   1993                                 which is implementation-dependent.
   1994 
   1995 **/
   1996 VOID
   1997 EFIAPI
   1998 ConSplitterEmptyCallbackFunction (
   1999   IN EFI_EVENT                Event,
   2000   IN VOID                     *Context
   2001   );
   2002 
   2003 
   2004 #endif
   2005