]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/Console/ConSplitter/Dxe/ConSplitterGraphics.c
Retiring the ANT/JAVA build and removing the older EDK II packages that required...
[mirror_edk2.git] / EdkModulePkg / Universal / Console / ConSplitter / Dxe / ConSplitterGraphics.c
diff --git a/EdkModulePkg/Universal/Console/ConSplitter/Dxe/ConSplitterGraphics.c b/EdkModulePkg/Universal/Console/ConSplitter/Dxe/ConSplitterGraphics.c
deleted file mode 100644 (file)
index e5f7c10..0000000
+++ /dev/null
@@ -1,1215 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
-  ConSplitterGraphics.c\r
-\r
-Abstract:\r
-\r
-  Support for ConsoleControl protocol. Support for UGA Draw spliter.\r
-  Support for DevNull Console Out. This console uses memory buffers\r
-  to represnt the console. It allows a console to start very early and\r
-  when a new console is added it is synced up with the current console\r
-\r
---*/\r
-\r
-\r
-#include "ConSplitter.h"\r
-\r
-static CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-ConSpliterConsoleControlGetMode (\r
-  IN  EFI_CONSOLE_CONTROL_PROTOCOL    *This,\r
-  OUT EFI_CONSOLE_CONTROL_SCREEN_MODE *Mode,\r
-  OUT BOOLEAN                         *GopExists,\r
-  OUT BOOLEAN                         *StdInLocked\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Return the current video mode information. Also returns info about existence\r
-    of UGA Draw devices in system, and if the Std In device is locked. All the\r
-    arguments are optional and only returned if a non NULL pointer is passed in.\r
-\r
-  Arguments:\r
-    This - Protocol instance pointer.\r
-    Mode        - Are we in text of grahics mode.\r
-    UgaExists   - TRUE if UGA Spliter has found a UGA device\r
-    StdInLocked - TRUE if StdIn device is keyboard locked\r
-\r
-  Returns:\r
-    EFI_SUCCESS - Mode information returned.\r
-    EFI_INVALID_PARAMETER - Invalid parameters.\r
-\r
---*/\r
-{\r
-  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;\r
-  UINTN                           Index;\r
-\r
-  Private = CONSOLE_CONTROL_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Mode == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  *Mode = Private->ConsoleOutputMode;\r
-\r
-  if (GopExists != NULL) {\r
-    *GopExists = FALSE;\r
-    for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
-      if ((Private->TextOutList[Index].GraphicsOutput != NULL) || (Private->TextOutList[Index].UgaDraw != NULL)) {\r
-        *GopExists = TRUE;\r
-        break;\r
-      }\r
-    }\r
-  }\r
-\r
-  if (StdInLocked != NULL) {\r
-    *StdInLocked = ConSpliterConssoleControlStdInLocked ();\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-ConSpliterConsoleControlSetMode (\r
-  IN  EFI_CONSOLE_CONTROL_PROTOCOL    *This,\r
-  IN  EFI_CONSOLE_CONTROL_SCREEN_MODE Mode\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Set the current mode to either text or graphics. Graphics is\r
-    for Quiet Boot.\r
-\r
-  Arguments:\r
-    This  - Protocol instance pointer.\r
-    Mode  - Mode to set the\r
-\r
-  Returns:\r
-    EFI_SUCCESS     - Mode information returned.\r
-    EFI_INVALID_PARAMETER - Invalid parameter.\r
-    EFI_UNSUPPORTED - Operation unsupported.\r
-\r
---*/\r
-{\r
-  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;\r
-  UINTN                           Index;\r
-  TEXT_OUT_AND_GOP_DATA           *TextAndGop;\r
-  BOOLEAN                         Supported;\r
-\r
-  Private = CONSOLE_CONTROL_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Mode >= EfiConsoleControlScreenMaxValue) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Judge current mode with wanted mode at first.\r
-  //\r
-  if (Private->ConsoleOutputMode == Mode) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  Supported   = FALSE;\r
-  TextAndGop  = &Private->TextOutList[0];\r
-  for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++, TextAndGop++) {\r
-    if ((TextAndGop->GraphicsOutput != NULL) || (TextAndGop->UgaDraw != NULL)) {\r
-      Supported = TRUE;\r
-      break;\r
-    }\r
-  }\r
-\r
-  if ((!Supported) && (Mode == EfiConsoleControlScreenGraphics)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  Private->ConsoleOutputMode  = Mode;\r
-\r
-  TextAndGop = &Private->TextOutList[0];\r
-  for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++, TextAndGop++) {\r
-\r
-    TextAndGop->TextOutEnabled = TRUE;\r
-    //\r
-    // If we are going into Graphics mode disable ConOut to any UGA device\r
-    //\r
-    if ((Mode == EfiConsoleControlScreenGraphics) &&((TextAndGop->GraphicsOutput != NULL) || (TextAndGop->UgaDraw != NULL))) {\r
-      TextAndGop->TextOutEnabled = FALSE;\r
-      DevNullGopSync (Private, TextAndGop->GraphicsOutput, TextAndGop->UgaDraw);\r
-    }\r
-  }\r
-\r
-  if (Mode == EfiConsoleControlScreenText) {\r
-    DevNullSyncGopStdOut (Private);\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-ConSpliterGraphicsOutputQueryMode (\r
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,\r
-  IN  UINT32                                ModeNumber,\r
-  OUT UINTN                                 *SizeOfInfo,\r
-  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Return the current video mode information.\r
-\r
-  Arguments:\r
-    This                  - Protocol instance pointer.\r
-    ModeNumber            - The mode number to return information on.\r
-    Info                  - Caller allocated buffer that returns information about ModeNumber.\r
-    SizeOfInfo            - A pointer to the size, in bytes, of the Info buffer.\r
-\r
-  Returns:\r
-    EFI_SUCCESS           - Mode information returned.\r
-    EFI_BUFFER_TOO_SMALL  - The Info buffer was too small.\r
-    EFI_DEVICE_ERROR      - A hardware error occurred trying to retrieve the video mode.\r
-    EFI_NOT_STARTED       - Video display is not initialized. Call SetMode ()\r
-    EFI_INVALID_PARAMETER - One of the input args was NULL.\r
-\r
---*/\r
-{\r
-  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;\r
-  TEXT_OUT_GOP_MODE               *Mode;\r
-\r
-  if (This == NULL || Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // retrieve private data\r
-  //\r
-  Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Private->HardwareNeedsStarting) {\r
-    return EFI_NOT_STARTED;\r
-  }\r
-\r
-  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
-\r
-  if (*Info == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
-\r
-  CopyMem (*Info, Private->GraphicsOutput.Mode->Info, *SizeOfInfo);\r
-  Mode = &Private->GraphicsOutputModeBuffer[ModeNumber];\r
-  (*Info)->HorizontalResolution = Mode->HorizontalResolution;\r
-  (*Info)->VerticalResolution = Mode->VerticalResolution;\r
-  (*Info)->PixelsPerScanLine = Mode->HorizontalResolution;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-ConSpliterGraphicsOutputSetMode (\r
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL * This,\r
-  IN  UINT32                       ModeNumber\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Graphics output protocol interface to set video mode\r
-\r
-  Arguments:\r
-    This             - Protocol instance pointer.\r
-    ModeNumber       - The mode number to be set.\r
-\r
-  Returns:\r
-    EFI_SUCCESS      - Graphics mode was changed.\r
-    EFI_DEVICE_ERROR - The device had an error and could not complete the request.\r
-    EFI_UNSUPPORTED  - ModeNumber is not supported by this device.\r
-\r
---*/\r
-{\r
-  EFI_STATUS                             Status;\r
-  TEXT_OUT_SPLITTER_PRIVATE_DATA         *Private;\r
-  UINTN                                  Index;\r
-  EFI_STATUS                             ReturnStatus;\r
-  TEXT_OUT_GOP_MODE                      *Mode;\r
-  UINTN                                  Size;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL           *GraphicsOutput;\r
-  UINTN                                  NumberIndex;\r
-  UINTN                                  SizeOfInfo;\r
-  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION   *Info;\r
-  EFI_UGA_DRAW_PROTOCOL                  *UgaDraw;\r
-\r
-  if (ModeNumber >= This->Mode->MaxMode) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if (ModeNumber == This->Mode->Mode) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  //\r
-  // GopDevNullSetMode ()\r
-  //\r
-  ReturnStatus = EFI_SUCCESS;\r
-\r
-  //\r
-  // Free the old version\r
-  //\r
-  if (Private->GraphicsOutputBlt != NULL) {\r
-    FreePool (Private->GraphicsOutputBlt);\r
-  }\r
-\r
-  //\r
-  // Allocate the virtual Blt buffer\r
-  //\r
-  Mode = &Private->GraphicsOutputModeBuffer[ModeNumber];\r
-  Size = Mode->HorizontalResolution * Mode->VerticalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
-  Private->GraphicsOutputBlt = AllocateZeroPool (Size);\r
-\r
-  if (Private->GraphicsOutputBlt == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  if (!Private->HardwareNeedsStarting) {\r
-    if (Private->ConsoleOutputMode != EfiConsoleControlScreenGraphics) {\r
-      return EFI_UNSUPPORTED;\r
-    }\r
-  }\r
-  //\r
-  // return the worst status met\r
-  //\r
-  for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
-    GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
-    if (GraphicsOutput != NULL) {\r
-      //\r
-      // Find corresponding ModeNumber of this GraphicsOutput instance\r
-      //\r
-      for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex ++) {\r
-        Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info);\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
-        }\r
-        if ((Info->HorizontalResolution == Mode->HorizontalResolution) && (Info->VerticalResolution == Mode->VerticalResolution)) {\r
-          FreePool (Info);\r
-          break;\r
-        }\r
-        FreePool (Info);\r
-      }\r
-\r
-      Status = GraphicsOutput->SetMode (GraphicsOutput, (UINT32) NumberIndex);\r
-      if (EFI_ERROR (Status)) {\r
-        ReturnStatus = Status;\r
-      }\r
-    }\r
-\r
-    UgaDraw = Private->TextOutList[Index].UgaDraw;\r
-    if (UgaDraw != NULL) {\r
-      Status = UgaDraw->SetMode (\r
-                          UgaDraw,\r
-                          Mode->HorizontalResolution,\r
-                          Mode->VerticalResolution,\r
-                          32,\r
-                          60\r
-                          );\r
-      if (EFI_ERROR (Status)) {\r
-        ReturnStatus = Status;\r
-      }\r
-    }\r
-  }\r
-\r
-  This->Mode->Mode = ModeNumber;\r
-\r
-  Info = This->Mode->Info;\r
-  Info->HorizontalResolution = Mode->HorizontalResolution;\r
-  Info->VerticalResolution   = Mode->VerticalResolution;\r
-  Info->PixelsPerScanLine    = Mode->HorizontalResolution;\r
-\r
-  //\r
-  // Information is not enough here, so the following items remain unchanged:\r
-  //  GraphicsOutputMode->Info->Version, GraphicsOutputMode->Info->PixelFormat\r
-  //  GraphicsOutputMode->SizeOfInfo, GraphicsOutputMode->FrameBufferBase, GraphicsOutputMode->FrameBufferSize\r
-  // These items will be initialized/updated when a new GOP device is added into ConsoleSplitter.\r
-  //\r
-\r
-  Private->HardwareNeedsStarting = FALSE;\r
-\r
-  return ReturnStatus;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-DevNullGraphicsOutputBlt (\r
-  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA                *Private,\r
-  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL                 *BltBuffer, OPTIONAL\r
-  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION             BltOperation,\r
-  IN  UINTN                                         SourceX,\r
-  IN  UINTN                                         SourceY,\r
-  IN  UINTN                                         DestinationX,\r
-  IN  UINTN                                         DestinationY,\r
-  IN  UINTN                                         Width,\r
-  IN  UINTN                                         Height,\r
-  IN  UINTN                                         Delta         OPTIONAL\r
-  )\r
-{\r
-  UINTN                         SrcY;\r
-  BOOLEAN                       Forward;\r
-  UINTN                         Index;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltPtr;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ScreenPtr;\r
-  UINTN                         HorizontalResolution;\r
-  UINTN                         VerticalResolution;\r
-\r
-  if ((BltOperation < EfiBltVideoFill) || (BltOperation >= EfiGraphicsOutputBltOperationMax)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Width == 0 || Height == 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (Delta == 0) {\r
-    Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
-  }\r
-\r
-  HorizontalResolution  = Private->GraphicsOutput.Mode->Info->HorizontalResolution;\r
-  VerticalResolution    = Private->GraphicsOutput.Mode->Info->VerticalResolution;\r
-\r
-  //\r
-  // We need to fill the Virtual Screen buffer with the blt data.\r
-  //\r
-  if (BltOperation == EfiBltVideoToBltBuffer) {\r
-    //\r
-    // Video to BltBuffer: Source is Video, destination is BltBuffer\r
-    //\r
-    if ((SourceY + Height) > VerticalResolution) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if ((SourceX + Width) > HorizontalResolution) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    BltPtr    = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer + DestinationY * Delta + DestinationX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
-    ScreenPtr = &Private->GraphicsOutputBlt[SourceY * HorizontalResolution + SourceX];\r
-    while (Height) {\r
-      CopyMem (BltPtr, ScreenPtr, Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
-      BltPtr = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltPtr + Delta);\r
-      ScreenPtr += HorizontalResolution;\r
-      Height--;\r
-    }\r
-  } else {\r
-    //\r
-    // BltBuffer to Video: Source is BltBuffer, destination is Video\r
-    //\r
-    if (DestinationY + Height > VerticalResolution) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (DestinationX + Width > HorizontalResolution) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if ((BltOperation == EfiBltVideoToVideo) && (DestinationY > SourceY)) {\r
-      //\r
-      // Copy backwards, only care the Video to Video Blt\r
-      //\r
-      ScreenPtr = &Private->GraphicsOutputBlt[(DestinationY + Height - 1) * HorizontalResolution + DestinationX];\r
-      SrcY      = SourceY + Height - 1;\r
-      Forward   = FALSE;\r
-    } else {\r
-      //\r
-      // Copy forwards, for other cases\r
-      //\r
-      ScreenPtr = &Private->GraphicsOutputBlt[DestinationY * HorizontalResolution + DestinationX];\r
-      SrcY      = SourceY;\r
-      Forward   = TRUE;\r
-    }\r
-\r
-    while (Height != 0) {\r
-      if (BltOperation == EfiBltVideoFill) {\r
-        for (Index = 0; Index < Width; Index++) {\r
-          ScreenPtr[Index] = *BltBuffer;\r
-        }\r
-      } else {\r
-        if (BltOperation == EfiBltBufferToVideo) {\r
-          BltPtr = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer + SrcY * Delta + SourceX * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
-        } else {\r
-          BltPtr = &Private->GraphicsOutputBlt[SrcY * HorizontalResolution + SourceX];\r
-        }\r
-\r
-        CopyMem (ScreenPtr, BltPtr, Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
-      }\r
-\r
-      if (Forward) {\r
-        ScreenPtr += HorizontalResolution;\r
-        SrcY ++;\r
-      } else {\r
-        ScreenPtr -= HorizontalResolution;\r
-        SrcY --;\r
-      }\r
-      Height--;\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-ConSpliterGraphicsOutputBlt (\r
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL                  *This,\r
-  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL                 *BltBuffer, OPTIONAL\r
-  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION             BltOperation,\r
-  IN  UINTN                                         SourceX,\r
-  IN  UINTN                                         SourceY,\r
-  IN  UINTN                                         DestinationX,\r
-  IN  UINTN                                         DestinationY,\r
-  IN  UINTN                                         Width,\r
-  IN  UINTN                                         Height,\r
-  IN  UINTN                                         Delta         OPTIONAL\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    The following table defines actions for BltOperations:\r
-    EfiBltVideoFill - Write data from the  BltBuffer pixel (SourceX, SourceY)\r
-      directly to every pixel of the video display rectangle\r
-      (DestinationX, DestinationY)\r
-      (DestinationX + Width, DestinationY + Height).\r
-      Only one pixel will be used from the BltBuffer. Delta is NOT used.\r
-    EfiBltVideoToBltBuffer - Read data from the video display rectangle\r
-      (SourceX, SourceY) (SourceX + Width, SourceY + Height) and place it in\r
-      the BltBuffer rectangle (DestinationX, DestinationY )\r
-      (DestinationX + Width, DestinationY + Height). If DestinationX or\r
-      DestinationY is not zero then Delta must be set to the length in bytes\r
-      of a row in the BltBuffer.\r
-    EfiBltBufferToVideo - Write data from the  BltBuffer rectangle\r
-      (SourceX, SourceY) (SourceX + Width, SourceY + Height) directly to the\r
-      video display rectangle (DestinationX, DestinationY)\r
-      (DestinationX + Width, DestinationY + Height). If SourceX or SourceY is\r
-      not zero then Delta must be set to the length in bytes of a row in the\r
-      BltBuffer.\r
-    EfiBltVideoToVideo - Copy from the video display rectangle\r
-      (SourceX, SourceY) (SourceX + Width, SourceY + Height) .\r
-      to the video display rectangle (DestinationX, DestinationY)\r
-      (DestinationX + Width, DestinationY + Height).\r
-     The BltBuffer and Delta  are not used in this mode.\r
-\r
-  Arguments:\r
-    This          - Protocol instance pointer.\r
-    BltBuffer     - Buffer containing data to blit into video buffer. This\r
-                    buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
-    BltOperation  - Operation to perform on BlitBuffer and video memory\r
-    SourceX       - X coordinate of source for the BltBuffer.\r
-    SourceY       - Y coordinate of source for the BltBuffer.\r
-    DestinationX  - X coordinate of destination for the BltBuffer.\r
-    DestinationY  - Y coordinate of destination for the BltBuffer.\r
-    Width         - Width of rectangle in BltBuffer in pixels.\r
-    Height        - Hight of rectangle in BltBuffer in pixels.\r
-    Delta         -\r
-\r
-  Returns:\r
-    EFI_SUCCESS           - The Blt operation completed.\r
-    EFI_INVALID_PARAMETER - BltOperation is not valid.\r
-    EFI_DEVICE_ERROR      - A hardware error occured writting to the video\r
-                             buffer.\r
-\r
---*/\r
-{\r
-  EFI_STATUS                      Status;\r
-  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;\r
-  UINTN                           Index;\r
-  EFI_STATUS                      ReturnStatus;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL    *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL           *UgaDraw;\r
-\r
-  Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  //\r
-  // Sync up DevNull GOP device\r
-  //\r
-  ReturnStatus = DevNullGraphicsOutputBlt (\r
-                  Private,\r
-                  BltBuffer,\r
-                  BltOperation,\r
-                  SourceX,\r
-                  SourceY,\r
-                  DestinationX,\r
-                  DestinationY,\r
-                  Width,\r
-                  Height,\r
-                  Delta\r
-                  );\r
-\r
-  if (Private->ConsoleOutputMode != EfiConsoleControlScreenGraphics) {\r
-    return ReturnStatus;\r
-  }\r
-  //\r
-  // return the worst status met\r
-  //\r
-  for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
-    GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
-    if (GraphicsOutput != NULL) {\r
-      Status = GraphicsOutput->Blt (\r
-                              GraphicsOutput,\r
-                              BltBuffer,\r
-                              BltOperation,\r
-                              SourceX,\r
-                              SourceY,\r
-                              DestinationX,\r
-                              DestinationY,\r
-                              Width,\r
-                              Height,\r
-                              Delta\r
-                              );\r
-      if (EFI_ERROR (Status)) {\r
-        ReturnStatus = Status;\r
-      } else if (BltOperation == EfiBltVideoToBltBuffer) {\r
-        //\r
-        // Only need to read the data into buffer one time\r
-        //\r
-        return EFI_SUCCESS;\r
-      }\r
-    }\r
-\r
-    UgaDraw = Private->TextOutList[Index].UgaDraw;\r
-    if (UgaDraw != NULL) {\r
-      Status = UgaDraw->Blt (\r
-                              UgaDraw,\r
-                              (EFI_UGA_PIXEL *) BltBuffer,\r
-                              (EFI_UGA_BLT_OPERATION) BltOperation,\r
-                              SourceX,\r
-                              SourceY,\r
-                              DestinationX,\r
-                              DestinationY,\r
-                              Width,\r
-                              Height,\r
-                              Delta\r
-                              );\r
-      if (EFI_ERROR (Status)) {\r
-        ReturnStatus = Status;\r
-      } else if (BltOperation == EfiBltVideoToBltBuffer) {\r
-        //\r
-        // Only need to read the data into buffer one time\r
-        //\r
-        return EFI_SUCCESS;\r
-      }\r
-    }\r
-  }\r
-\r
-  return ReturnStatus;\r
-}\r
-\r
-EFI_STATUS\r
-DevNullGopSync (\r
-  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private,\r
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL    *GraphicsOutput,\r
-  IN  EFI_UGA_DRAW_PROTOCOL           *UgaDraw\r
-  )\r
-{\r
-  if (GraphicsOutput != NULL) {\r
-    return GraphicsOutput->Blt (\r
-                      GraphicsOutput,\r
-                      Private->GraphicsOutputBlt,\r
-                      EfiBltBufferToVideo,\r
-                      0,\r
-                      0,\r
-                      0,\r
-                      0,\r
-                      Private->GraphicsOutput.Mode->Info->HorizontalResolution,\r
-                      Private->GraphicsOutput.Mode->Info->VerticalResolution,\r
-                      0\r
-                      );\r
-  } else {\r
-    return UgaDraw->Blt (\r
-                      UgaDraw,\r
-                      (EFI_UGA_PIXEL *) Private->GraphicsOutputBlt,\r
-                      EfiUgaBltBufferToVideo,\r
-                      0,\r
-                      0,\r
-                      0,\r
-                      0,\r
-                      Private->GraphicsOutput.Mode->Info->HorizontalResolution,\r
-                      Private->GraphicsOutput.Mode->Info->VerticalResolution,\r
-                      0\r
-                      );\r
-  }\r
-}\r
-\r
-\r
-EFI_STATUS\r
-DevNullTextOutOutputString (\r
-  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private,\r
-  IN  CHAR16                          *WString\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Write a Unicode string to the output device.\r
-\r
-  Arguments:\r
-    Private - Pointer to the console output splitter's private data. It\r
-              indicates the calling context.\r
-    WString - The NULL-terminated Unicode string to be displayed on the output\r
-              device(s). All output devices must also support the Unicode\r
-              drawing defined in this file.\r
-\r
-  Returns:\r
-    EFI_SUCCESS            - The string was output to the device.\r
-    EFI_DEVICE_ERROR       - The device reported an error while attempting to\r
-                              output the text.\r
-    EFI_UNSUPPORTED        - The output device's mode is not currently in a\r
-                              defined text mode.\r
-    EFI_WARN_UNKNOWN_GLYPH - This warning code indicates that some of the\r
-                              characters in the Unicode string could not be\r
-                              rendered and were skipped.\r
-\r
---*/\r
-{\r
-  UINTN                       SizeScreen;\r
-  UINTN                       SizeAttribute;\r
-  UINTN                       Index;\r
-  EFI_SIMPLE_TEXT_OUTPUT_MODE *Mode;\r
-  CHAR16                      *Screen;\r
-  CHAR16                      *NullScreen;\r
-  CHAR16                      InsertChar;\r
-  CHAR16                      TempChar;\r
-  CHAR16                      *PStr;\r
-  INT32                       *Attribute;\r
-  INT32                       *NullAttributes;\r
-  INT32                       CurrentWidth;\r
-  UINTN                       LastRow;\r
-  UINTN                       MaxColumn;\r
-\r
-  Mode            = &Private->TextOutMode;\r
-  NullScreen      = Private->DevNullScreen;\r
-  NullAttributes  = Private->DevNullAttributes;\r
-  LastRow         = Private->DevNullRows - 1;\r
-  MaxColumn       = Private->DevNullColumns;\r
-\r
-  if (Mode->Attribute & EFI_WIDE_ATTRIBUTE) {\r
-    CurrentWidth = 2;\r
-  } else {\r
-    CurrentWidth = 1;\r
-  }\r
-\r
-  while (*WString) {\r
-\r
-    if (*WString == CHAR_BACKSPACE) {\r
-      //\r
-      // If the cursor is at the left edge of the display, then move the cursor\r
-      // one row up.\r
-      //\r
-      if (Mode->CursorColumn == 0 && Mode->CursorRow > 0) {\r
-        Mode->CursorRow--;\r
-        Mode->CursorColumn = (INT32) MaxColumn;\r
-      }\r
-\r
-      //\r
-      // If the cursor is not at the left edge of the display,\r
-      // then move the cursor left one column.\r
-      //\r
-      if (Mode->CursorColumn > 0) {\r
-        Mode->CursorColumn--;\r
-        if (Mode->CursorColumn > 0 &&\r
-            NullAttributes[Mode->CursorRow * MaxColumn + Mode->CursorColumn - 1] & EFI_WIDE_ATTRIBUTE\r
-            ) {\r
-          Mode->CursorColumn--;\r
-\r
-          //\r
-          // Insert an extra backspace\r
-          //\r
-          InsertChar  = CHAR_BACKSPACE;\r
-          PStr        = WString + 1;\r
-          while (*PStr) {\r
-            TempChar    = *PStr;\r
-            *PStr       = InsertChar;\r
-            InsertChar  = TempChar;\r
-            PStr++;\r
-          }\r
-\r
-          *PStr     = InsertChar;\r
-          *(++PStr) = 0;\r
-\r
-          WString++;\r
-        }\r
-      }\r
-\r
-      WString++;\r
-\r
-    } else if (*WString == CHAR_LINEFEED) {\r
-      //\r
-      // If the cursor is at the bottom of the display,\r
-      // then scroll the display one row, and do not update\r
-      // the cursor position. Otherwise, move the cursor down one row.\r
-      //\r
-      if (Mode->CursorRow == (INT32) (LastRow)) {\r
-        //\r
-        // Scroll Screen Up One Row\r
-        //\r
-        SizeAttribute = LastRow * MaxColumn;\r
-        CopyMem (\r
-          NullAttributes,\r
-          NullAttributes + MaxColumn,\r
-          SizeAttribute * sizeof (INT32)\r
-          );\r
-\r
-        //\r
-        // Each row has an ending CHAR_NULL. So one more character each line\r
-        // for DevNullScreen than DevNullAttributes\r
-        //\r
-        SizeScreen = SizeAttribute + LastRow;\r
-        CopyMem (\r
-          NullScreen,\r
-          NullScreen + (MaxColumn + 1),\r
-          SizeScreen * sizeof (CHAR16)\r
-          );\r
-\r
-        //\r
-        // Print Blank Line at last line\r
-        //\r
-        Screen    = NullScreen + SizeScreen;\r
-        Attribute = NullAttributes + SizeAttribute;\r
-\r
-        for (Index = 0; Index < MaxColumn; Index++, Screen++, Attribute++) {\r
-          *Screen     = ' ';\r
-          *Attribute  = Mode->Attribute;\r
-        }\r
-      } else {\r
-        Mode->CursorRow++;\r
-      }\r
-\r
-      WString++;\r
-    } else if (*WString == CHAR_CARRIAGE_RETURN) {\r
-      //\r
-      // Move the cursor to the beginning of the current row.\r
-      //\r
-      Mode->CursorColumn = 0;\r
-      WString++;\r
-    } else {\r
-      //\r
-      // Print the character at the current cursor position and\r
-      // move the cursor right one column. If this moves the cursor\r
-      // past the right edge of the display, then the line should wrap to\r
-      // the beginning of the next line. This is equivalent to inserting\r
-      // a CR and an LF. Note that if the cursor is at the bottom of the\r
-      // display, and the line wraps, then the display will be scrolled\r
-      // one line.\r
-      //\r
-      Index = Mode->CursorRow * MaxColumn + Mode->CursorColumn;\r
-\r
-      while (Mode->CursorColumn < (INT32) MaxColumn) {\r
-        if (*WString == CHAR_NULL) {\r
-          break;\r
-        }\r
-\r
-        if (*WString == CHAR_BACKSPACE) {\r
-          break;\r
-        }\r
-\r
-        if (*WString == CHAR_LINEFEED) {\r
-          break;\r
-        }\r
-\r
-        if (*WString == CHAR_CARRIAGE_RETURN) {\r
-          break;\r
-        }\r
-\r
-        if (*WString == WIDE_CHAR || *WString == NARROW_CHAR) {\r
-          CurrentWidth = (*WString == WIDE_CHAR) ? 2 : 1;\r
-          WString++;\r
-          continue;\r
-        }\r
-\r
-        if (Mode->CursorColumn + CurrentWidth > (INT32) MaxColumn) {\r
-          //\r
-          // If a wide char is at the rightmost column, then move the char\r
-          // to the beginning of the next row\r
-          //\r
-          NullScreen[Index + Mode->CursorRow] = L' ';\r
-          NullAttributes[Index]               = Mode->Attribute | (UINT32) EFI_WIDE_ATTRIBUTE;\r
-          Index++;\r
-          Mode->CursorColumn++;\r
-        } else {\r
-          NullScreen[Index + Mode->CursorRow] = *WString;\r
-          NullAttributes[Index]               = Mode->Attribute;\r
-          if (CurrentWidth == 1) {\r
-            NullAttributes[Index] &= (~ (UINT32) EFI_WIDE_ATTRIBUTE);\r
-          } else {\r
-            NullAttributes[Index] |= (UINT32) EFI_WIDE_ATTRIBUTE;\r
-            NullAttributes[Index + 1] &= (~ (UINT32) EFI_WIDE_ATTRIBUTE);\r
-          }\r
-\r
-          Index += CurrentWidth;\r
-          WString++;\r
-          Mode->CursorColumn += CurrentWidth;\r
-        }\r
-      }\r
-      //\r
-      // At the end of line, output carriage return and line feed\r
-      //\r
-      if (Mode->CursorColumn >= (INT32) MaxColumn) {\r
-        DevNullTextOutOutputString (Private, mCrLfString);\r
-      }\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-DevNullTextOutSetMode (\r
-  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private,\r
-  IN  UINTN                           ModeNumber\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Sets the output device(s) to a specified mode.\r
-\r
-  Arguments:\r
-    Private    - Private data structure pointer.\r
-    ModeNumber - The mode number to set.\r
-\r
-  Returns:\r
-    EFI_SUCCESS      - The requested text mode was set.\r
-    EFI_DEVICE_ERROR - The device had an error and\r
-                       could not complete the request.\r
-    EFI_UNSUPPORTED - The mode number was not valid.\r
-    EFI_OUT_OF_RESOURCES - Out of resources.\r
-\r
---*/\r
-{\r
-  UINTN                         Size;\r
-  UINTN                         Row;\r
-  UINTN                         Column;\r
-  TEXT_OUT_SPLITTER_QUERY_DATA  *Mode;\r
-\r
-  //\r
-  // No extra check for ModeNumber here, as it has been checked in\r
-  // ConSplitterTextOutSetMode. And mode 0 should always be supported.\r
-  //\r
-  Mode    = &(Private->TextOutQueryData[ModeNumber]);\r
-  Row     = Mode->Rows;\r
-  Column  = Mode->Columns;\r
-\r
-  if (Row <= 0 && Column <= 0) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if (Private->DevNullColumns != Column || Private->DevNullRows != Row) {\r
-\r
-    Private->TextOutMode.Mode = (INT32) ModeNumber;\r
-    Private->DevNullColumns   = Column;\r
-    Private->DevNullRows      = Row;\r
-\r
-    if (Private->DevNullScreen != NULL) {\r
-      FreePool (Private->DevNullScreen);\r
-    }\r
-\r
-    Size                    = (Row * (Column + 1)) * sizeof (CHAR16);\r
-    Private->DevNullScreen  = AllocateZeroPool (Size);\r
-    if (Private->DevNullScreen == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    if (Private->DevNullAttributes != NULL) {\r
-      FreePool (Private->DevNullAttributes);\r
-    }\r
-\r
-    Size                        = Row * Column * sizeof (INT32);\r
-    Private->DevNullAttributes  = AllocateZeroPool (Size);\r
-    if (Private->DevNullAttributes == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-  }\r
-\r
-  DevNullTextOutClearScreen (Private);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-DevNullTextOutClearScreen (\r
-  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Clears the output device(s) display to the currently selected background\r
-    color.\r
-\r
-  Arguments:\r
-    Private     - Protocol instance pointer.\r
-\r
-  Returns:\r
-    EFI_SUCCESS      - The operation completed successfully.\r
-    EFI_DEVICE_ERROR - The device had an error and\r
-                       could not complete the request.\r
-    EFI_UNSUPPORTED - The output device is not in a valid text mode.\r
-\r
---*/\r
-{\r
-  UINTN   Row;\r
-  UINTN   Column;\r
-  CHAR16  *Screen;\r
-  INT32   *Attributes;\r
-  INT32   CurrentAttribute;\r
-\r
-  //\r
-  // Clear the DevNull Text Out Buffers.\r
-  // The screen is filled with spaces.\r
-  // The attributes are all synced with the current Simple Text Out Attribute\r
-  //\r
-  Screen            = Private->DevNullScreen;\r
-  Attributes        = Private->DevNullAttributes;\r
-  CurrentAttribute  = Private->TextOutMode.Attribute;\r
-\r
-  for (Row = 0; Row < Private->DevNullRows; Row++) {\r
-    for (Column = 0; Column < Private->DevNullColumns; Column++, Screen++, Attributes++) {\r
-      *Screen     = ' ';\r
-      *Attributes = CurrentAttribute;\r
-    }\r
-    //\r
-    // Each line of the screen has a NULL on the end so we must skip over it\r
-    //\r
-    Screen++;\r
-  }\r
-\r
-  DevNullTextOutSetCursorPosition (Private, 0, 0);\r
-\r
-  return DevNullTextOutEnableCursor (Private, TRUE);\r
-}\r
-\r
-EFI_STATUS\r
-DevNullTextOutSetCursorPosition (\r
-  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private,\r
-  IN  UINTN                           Column,\r
-  IN  UINTN                           Row\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Sets the current coordinates of the cursor position\r
-\r
-  Arguments:\r
-    Private       - Protocol instance pointer.\r
-    Column, Row - the position to set the cursor to. Must be greater than or\r
-                  equal to zero and less than the number of columns and rows\r
-                  by QueryMode ().\r
-\r
-  Returns:\r
-    EFI_SUCCESS      - The operation completed successfully.\r
-    EFI_DEVICE_ERROR - The device had an error and\r
-                       could not complete the request.\r
-    EFI_UNSUPPORTED - The output device is not in a valid text mode, or the\r
-                       cursor position is invalid for the current mode.\r
-\r
---*/\r
-{\r
-  //\r
-  // No need to do extra check here as whether (Column, Row) is valid has\r
-  // been checked in ConSplitterTextOutSetCursorPosition. And (0, 0) should\r
-  // always be supported.\r
-  //\r
-  Private->TextOutMode.CursorColumn = (INT32) Column;\r
-  Private->TextOutMode.CursorRow    = (INT32) Row;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-DevNullTextOutEnableCursor (\r
-  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private,\r
-  IN  BOOLEAN                         Visible\r
-  )\r
-/*++\r
-  Routine Description:\r
-\r
-    Implements SIMPLE_TEXT_OUTPUT.EnableCursor().\r
-    In this driver, the cursor cannot be hidden.\r
-\r
-  Arguments:\r
-\r
-    Private - Indicates the calling context.\r
-\r
-    Visible - If TRUE, the cursor is set to be visible, If FALSE, the cursor\r
-              is set to be invisible.\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS - The request is valid.\r
-\r
-\r
---*/\r
-{\r
-  Private->TextOutMode.CursorVisible = Visible;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-DevNullSyncGopStdOut (\r
-  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private\r
-  )\r
-/*++\r
-  Routine Description:\r
-    Take the DevNull TextOut device and update the Simple Text Out on every\r
-    UGA device.\r
-\r
-  Arguments:\r
-    Private - Indicates the calling context.\r
-\r
-  Returns:\r
-    EFI_SUCCESS - The request is valid.\r
-    other       - Return status of TextOut->OutputString ()\r
-\r
---*/\r
-{\r
-  EFI_STATUS                    Status;\r
-  EFI_STATUS                    ReturnStatus;\r
-  UINTN                         Row;\r
-  UINTN                         Column;\r
-  UINTN                         List;\r
-  UINTN                         MaxColumn;\r
-  UINTN                         CurrentColumn;\r
-  UINTN                         StartRow;\r
-  UINTN                         StartColumn;\r
-  INT32                         StartAttribute;\r
-  BOOLEAN                       StartCursorState;\r
-  CHAR16                        *Screen;\r
-  CHAR16                        *Str;\r
-  CHAR16                        *Buffer;\r
-  CHAR16                        *BufferTail;\r
-  CHAR16                        *ScreenStart;\r
-  INT32                         CurrentAttribute;\r
-  INT32                         *Attributes;\r
-  EFI_SIMPLE_TEXT_OUT_PROTOCOL  *Sto;\r
-\r
-  //\r
-  // Save the devices Attributes, Cursor enable state and location\r
-  //\r
-  StartColumn       = Private->TextOutMode.CursorColumn;\r
-  StartRow          = Private->TextOutMode.CursorRow;\r
-  StartAttribute    = Private->TextOutMode.Attribute;\r
-  StartCursorState  = Private->TextOutMode.CursorVisible;\r
-\r
-  for (List = 0; List < Private->CurrentNumberOfConsoles; List++) {\r
-\r
-    Sto = Private->TextOutList[List].TextOut;\r
-\r
-    //\r
-    // Skip non GOP/UGA devices\r
-    //\r
-    if ((Private->TextOutList[List].GraphicsOutput != NULL) || (Private->TextOutList[List].UgaDraw != NULL)) {\r
-      Sto->EnableCursor (Sto, FALSE);\r
-      Sto->ClearScreen (Sto);\r
-    }\r
-  }\r
-\r
-  ReturnStatus  = EFI_SUCCESS;\r
-  Screen        = Private->DevNullScreen;\r
-  Attributes    = Private->DevNullAttributes;\r
-  MaxColumn     = Private->DevNullColumns;\r
-\r
-  Buffer        = AllocateZeroPool ((MaxColumn + 1) * sizeof (CHAR16));\r
-\r
-  for (Row = 0; Row < Private->DevNullRows; Row++, Screen += (MaxColumn + 1), Attributes += MaxColumn) {\r
-\r
-    if (Row == (Private->DevNullRows - 1)) {\r
-      //\r
-      // Don't ever sync the last character as it will scroll the screen\r
-      //\r
-      Screen[MaxColumn - 1] = 0x00;\r
-    }\r
-\r
-    Column = 0;\r
-    while (Column < MaxColumn) {\r
-      if (Screen[Column]) {\r
-        CurrentAttribute  = Attributes[Column];\r
-        CurrentColumn     = Column;\r
-        ScreenStart       = &Screen[Column];\r
-\r
-        //\r
-        // the line end is alway 0x0. So Column should be less than MaxColumn\r
-        // It should be still in the same row\r
-        //\r
-        for (Str = ScreenStart, BufferTail = Buffer; *Str != 0; Str++, Column++) {\r
-\r
-          if (Attributes[Column] != CurrentAttribute) {\r
-            Column--;\r
-            break;\r
-          }\r
-\r
-          *BufferTail = *Str;\r
-          BufferTail++;\r
-          if (Attributes[Column] & EFI_WIDE_ATTRIBUTE) {\r
-            Str++;\r
-            Column++;\r
-          }\r
-        }\r
-\r
-        *BufferTail = 0;\r
-\r
-        for (List = 0; List < Private->CurrentNumberOfConsoles; List++) {\r
-\r
-          Sto = Private->TextOutList[List].TextOut;\r
-\r
-          //\r
-          // Skip non GOP/UGA devices\r
-          //\r
-          if ((Private->TextOutList[List].GraphicsOutput != NULL) || (Private->TextOutList[List].UgaDraw != NULL)) {\r
-            Sto->SetAttribute (Sto, CurrentAttribute);\r
-            Sto->SetCursorPosition (Sto, CurrentColumn, Row);\r
-            Status = Sto->OutputString (Sto, Buffer);\r
-            if (EFI_ERROR (Status)) {\r
-              ReturnStatus = Status;\r
-            }\r
-          }\r
-        }\r
-\r
-      }\r
-\r
-      Column++;\r
-    }\r
-  }\r
-  //\r
-  // Restore the devices Attributes, Cursor enable state and location\r
-  //\r
-  for (List = 0; List < Private->CurrentNumberOfConsoles; List++) {\r
-    Sto = Private->TextOutList[List].TextOut;\r
-\r
-    //\r
-    // Skip non GOP/UGA devices\r
-    //\r
-    if ((Private->TextOutList[List].GraphicsOutput != NULL) || (Private->TextOutList[List].UgaDraw != NULL)) {\r
-      Sto->SetAttribute (Sto, StartAttribute);\r
-      Sto->SetCursorPosition (Sto, StartColumn, StartRow);\r
-      Status = Sto->EnableCursor (Sto, StartCursorState);\r
-      if (EFI_ERROR (Status)) {\r
-        ReturnStatus = Status;\r
-      }\r
-    }\r
-  }\r
-\r
-  FreePool (Buffer);\r
-\r
-  return ReturnStatus;\r
-}\r