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