]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
Clean codes per ECC for GraphicsConsoleDxe module.
[mirror_edk2.git] / MdeModulePkg / Universal / Console / GraphicsConsoleDxe / GraphicsConsole.c
index 13c5d699912b4d930ae6c4f3328b8b1db336fdd7..1e1bd0edd4f1c6bd0ca7b7022536738ced9019c1 100644 (file)
@@ -1,25 +1,24 @@
-/**@file\r
+/** @file\r
   This is the main routine for initializing the Graphics Console support routines.\r
 Remaining Tasks\r
-  Add all standard Glyphs from EFI 1.02 Specification\r
+  Add all standard Glyphs from UEFI 2.0 Specification\r
   Implement optimal automatic Mode creation algorithm\r
   Solve palette issues for mixed graphics and text\r
   When does this protocol reset the palette?\r
-    \r
-Copyright (c) 2006 - 2007 Intel Corporation. <BR>\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
+Copyright (c) 2006 - 2008 Intel Corporation. <BR>\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
 **/\r
 \r
 #include "GraphicsConsole.h"\r
 \r
-STATIC\r
 EFI_STATUS\r
 GetTextColors (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
@@ -27,7 +26,6 @@ GetTextColors (
   OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *Background\r
   );\r
 \r
-STATIC\r
 EFI_STATUS\r
 DrawUnicodeWeightAtCursorN (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
@@ -35,12 +33,19 @@ DrawUnicodeWeightAtCursorN (
   IN  UINTN                            Count\r
   );\r
 \r
-STATIC\r
 EFI_STATUS\r
 EraseCursor (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This\r
   );\r
 \r
+EFI_STATUS\r
+CheckModeSupported (\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput,\r
+  IN  UINT32  HorizontalResolution,\r
+  IN  UINT32  VerticalResolution,\r
+  OUT UINT32  *CurrentModeNumber\r
+  );\r
+\r
 //\r
 // Globals\r
 //\r
@@ -70,18 +75,23 @@ GRAPHICS_CONSOLE_DEV        mGraphicsConsoleDevTemplate = {
   },\r
   {\r
     { 80, 25, 0, 0, 0, 0 },  // Mode 0\r
-    { 80, 50, 0, 0, 0, 0 },  // Mode 1 \r
-    {  0,  0, 0, 0, 0, 0 }   // Mode 2\r
+    { 80, 50, 0, 0, 0, 0 },  // Mode 1\r
+    { 100,31, 0, 0, 0, 0 },  // Mode 2\r
+    {  0,  0, 0, 0, 0, 0 }   // Mode 3\r
   },\r
   (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL,\r
-  (EFI_HII_HANDLE) 0\r
+  (EFI_HII_HANDLE ) 0\r
 };\r
 \r
-EFI_HII_PROTOCOL            *mHii;\r
+EFI_HII_DATABASE_PROTOCOL   *mHiiDatabase;\r
+EFI_HII_FONT_PROTOCOL       *mHiiFont;\r
+BOOLEAN                     mFirstAccessFlag = TRUE;\r
+\r
+STATIC EFI_GUID             mFontPackageListGuid = {0xf5f219d3, 0x7006, 0x4648, 0xac, 0x8d, 0xd6, 0x1d, 0xfb, 0x7b, 0xc6, 0xad};\r
 \r
-static CHAR16               mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
+STATIC CHAR16               mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
 \r
-static EFI_GRAPHICS_OUTPUT_BLT_PIXEL        mEfiColors[16] = {\r
+STATIC EFI_GRAPHICS_OUTPUT_BLT_PIXEL        mEfiColors[16] = {\r
   //\r
   // B     G     R\r
   //\r
@@ -103,12 +113,14 @@ static EFI_GRAPHICS_OUTPUT_BLT_PIXEL        mEfiColors[16] = {
   {0xff, 0xff, 0xff, 0x00}  // WHITE\r
 };\r
 \r
-static EFI_NARROW_GLYPH     mCursorGlyph = {\r
+STATIC EFI_NARROW_GLYPH     mCursorGlyph = {\r
   0x0000,\r
   0x00,\r
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF }\r
 };\r
 \r
+STATIC CHAR16       SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
+\r
 EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = {\r
   GraphicsConsoleControllerDriverSupported,\r
   GraphicsConsoleControllerDriverStart,\r
@@ -126,12 +138,13 @@ GraphicsConsoleControllerDriverSupported (
   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
+  EFI_STATUS                   Status;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL     *UgaDraw;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+  EFI_UGA_DRAW_PROTOCOL        *UgaDraw;\r
+  EFI_DEVICE_PATH_PROTOCOL     *DevicePath;\r
 \r
-  UgaDraw = NULL;\r
+  GraphicsOutput = NULL;\r
+  UgaDraw        = NULL;\r
   //\r
   // Open the IO Abstraction(s) needed to perform the supported test\r
   //\r
@@ -143,9 +156,8 @@ GraphicsConsoleControllerDriverSupported (
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
-  \r
-  if (EFI_ERROR (Status)) {\r
-    GraphicsOutput = NULL;\r
+\r
+  if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     //\r
     // Open Graphics Output Protocol failed, try to open UGA Draw Protocol\r
     //\r
@@ -157,9 +169,9 @@ GraphicsConsoleControllerDriverSupported (
                     Controller,\r
                     EFI_OPEN_PROTOCOL_BY_DRIVER\r
                     );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
+  }\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
   }\r
 \r
   //\r
@@ -185,6 +197,7 @@ GraphicsConsoleControllerDriverSupported (
   } else {\r
     goto Error;\r
   }\r
+\r
   //\r
   // Does Hii Exist?  If not, we aren't ready to run\r
   //\r
@@ -201,7 +214,7 @@ Error:
           This->DriverBindingHandle,\r
           Controller\r
           );\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     gBS->CloseProtocol (\r
           Controller,\r
           &gEfiUgaDrawProtocolGuid,\r
@@ -212,6 +225,20 @@ Error:
   return Status;\r
 }\r
 \r
+\r
+/**\r
+  Start the controller.\r
+\r
+  @param  This                  A pointer to the EFI_DRIVER_BINDING_PROTOCOL\r
+                                instance.\r
+  @param  Controller            The handle of the controller to start.\r
+  @param  RemainingDevicePath   A pointer to the remaining portion of a devcie\r
+                                path.\r
+\r
+  @retval EFI_SUCCESS           Return successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Out of resources.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleControllerDriverStart (\r
@@ -219,42 +246,24 @@ GraphicsConsoleControllerDriverStart (
   IN EFI_HANDLE                     Controller,\r
   IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
   )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Start the controller.\r
-\r
-  Arguments:\r
-\r
-    This                - A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
-    Controller          - The handle of the controller to start.\r
-    RemainingDevicePath - A pointer to the remaining portion of a devcie path.\r
-\r
-  Returns:\r
-\r
-    EFI_SUCCESS          - Return successfully.\r
-    EFI_OUT_OF_RESOURCES - Out of resources.\r
-\r
---*/\r
 {\r
-  EFI_STATUS            Status;\r
-  GRAPHICS_CONSOLE_DEV  *Private;\r
-  EFI_HII_PACKAGES      *Package;\r
-  EFI_HII_FONT_PACK     *FontPack;\r
-  UINTN                 NarrowFontSize;\r
-  UINT32                HorizontalResolution;\r
-  UINT32                VerticalResolution;\r
-  UINT32                ColorDepth;\r
-  UINT32                RefreshRate;\r
-  UINTN                 MaxMode;\r
-  UINTN                 Columns;\r
-  UINTN                 Rows;\r
-  UINT8                 *Location;\r
+  EFI_STATUS                           Status;\r
+  GRAPHICS_CONSOLE_DEV                 *Private;\r
+  UINTN                                NarrowFontSize;\r
+  UINT32                               HorizontalResolution;\r
+  UINT32                               VerticalResolution;\r
+  UINT32                               ColorDepth;\r
+  UINT32                               RefreshRate;\r
+  UINTN                                MaxMode;\r
+  UINTN                                Columns;\r
+  UINTN                                Rows;\r
   UINT32                               ModeNumber;\r
-  UINTN                                SizeOfInfo;\r
-  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
-  \r
+  EFI_HII_SIMPLE_FONT_PACKAGE_HDR      *SimplifiedFont;\r
+  UINTN                                PackageLength;\r
+  EFI_HII_PACKAGE_LIST_HEADER          *PackageList;\r
+  UINT8                                *Package;\r
+  UINT8                                *Location;\r
+\r
   ModeNumber = 0;\r
 \r
   //\r
@@ -278,9 +287,8 @@ GraphicsConsoleControllerDriverStart (
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
-  if (EFI_ERROR(Status)) {\r
-    Private->GraphicsOutput = NULL;\r
 \r
+  if (EFI_ERROR(Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     Status = gBS->OpenProtocol (\r
                     Controller,\r
                     &gEfiUgaDrawProtocolGuid,\r
@@ -289,44 +297,44 @@ GraphicsConsoleControllerDriverStart (
                     Controller,\r
                     EFI_OPEN_PROTOCOL_BY_DRIVER\r
                     );\r
-    if (EFI_ERROR (Status)) {\r
-      goto Error;\r
-    }\r
   }\r
 \r
-  //\r
-  // Get the HII protocol. If Supported() succeeds, do we really\r
-  // need to get HII protocol again?\r
-  //\r
-  Status = EfiLocateHiiProtocol ();\r
   if (EFI_ERROR (Status)) {\r
     goto Error;\r
   }\r
 \r
   NarrowFontSize  = ReturnNarrowFontSize ();\r
 \r
-  FontPack        = AllocateZeroPool (sizeof (EFI_HII_FONT_PACK) + NarrowFontSize);\r
-  ASSERT (FontPack);\r
-\r
-  FontPack->Header.Length         = (UINT32) (sizeof (EFI_HII_FONT_PACK) + NarrowFontSize);\r
-  FontPack->Header.Type           = EFI_HII_FONT;\r
-  FontPack->NumberOfNarrowGlyphs  = (UINT16) (NarrowFontSize / sizeof (EFI_NARROW_GLYPH));\r
-\r
-  Location                        = (UINT8 *) (&FontPack->NumberOfWideGlyphs + sizeof (UINT8));\r
-  CopyMem (Location, UsStdNarrowGlyphData, NarrowFontSize);\r
+  if (mFirstAccessFlag) {\r
+    //\r
+    // Add 4 bytes to the header for entire length for HiiLibPreparePackageList use only.\r
+    // Looks ugly. Might be updated when font tool is ready.\r
+    //\r
+    PackageLength   = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + NarrowFontSize + 4;\r
+    Package = AllocateZeroPool (PackageLength);\r
+    if (Package == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    CopyMem (Package, &PackageLength, 4);\r
+    SimplifiedFont = (EFI_HII_SIMPLE_FONT_PACKAGE_HDR*) (Package + 4);\r
+    SimplifiedFont->Header.Length        = (UINT32) (PackageLength - 4);\r
+    SimplifiedFont->Header.Type          = EFI_HII_PACKAGE_SIMPLE_FONTS;\r
+    SimplifiedFont->NumberOfNarrowGlyphs = (UINT16) (NarrowFontSize / sizeof (EFI_NARROW_GLYPH));\r
 \r
-  //\r
-  // Register our Fonts into the global database\r
-  //\r
-  Package = PreparePackages (1, NULL, FontPack);\r
-  mHii->NewPack (mHii, Package, &(Private->HiiHandle));\r
-  FreePool (Package);\r
+    Location = (UINT8 *) (&SimplifiedFont->NumberOfWideGlyphs + 1);\r
+    CopyMem (Location, UsStdNarrowGlyphData, NarrowFontSize);\r
 \r
-  //\r
-  // Free the font database\r
-  //\r
-  FreePool (FontPack);\r
+    //\r
+    // Add this simplified font package to a package list then install it.\r
+    //\r
+    PackageList = HiiLibPreparePackageList (1, &mFontPackageListGuid, Package);\r
+    Status = mHiiDatabase->NewPackageList (mHiiDatabase, PackageList, NULL, &(Private->HiiHandle));\r
+    ASSERT_EFI_ERROR (Status);\r
+    SafeFreePool (PackageList);\r
+    SafeFreePool (Package);\r
 \r
+    mFirstAccessFlag = FALSE;\r
+  }\r
   //\r
   // If the current mode information can not be retrieved, then attemp to set the default mode\r
   // of 800x600, 32 bit colot, 60 Hz refresh.\r
@@ -336,26 +344,32 @@ GraphicsConsoleControllerDriverStart (
 \r
   if (Private->GraphicsOutput != NULL) {\r
     //\r
-    // The console is build on top of Graphics Output Protocol, find the mode number for 800x600\r
+    // The console is build on top of Graphics Output Protocol, find the mode number\r
+    // for the user-defined mode; if there are multiple video devices,\r
+    // graphic console driver will set all the video devices to the same mode.\r
     //\r
-    for (ModeNumber = 0; ModeNumber < Private->GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
-      Status = Private->GraphicsOutput->QueryMode (\r
-                         Private->GraphicsOutput,\r
-                         ModeNumber,\r
-                         &SizeOfInfo,\r
-                         &Info\r
-                         );\r
-      if (!EFI_ERROR (Status)) {\r
-        if ((Info->HorizontalResolution == 800) &&\r
-            (Info->VerticalResolution == 600)) {\r
-          Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber);\r
-          if (!EFI_ERROR (Status)) {\r
-            FreePool (Info);\r
-            break;\r
-          }\r
-        }\r
-        FreePool (Info);\r
-      }\r
+    Status = CheckModeSupported (\r
+                 Private->GraphicsOutput,\r
+                 CURRENT_HORIZONTAL_RESOLUTION,\r
+                 CURRENT_VERTICAL_RESOLUTION,\r
+                 &ModeNumber\r
+                 );\r
+    if (!EFI_ERROR(Status)) {\r
+      //\r
+      // Update default mode to current mode\r
+      //\r
+      HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
+      VerticalResolution   = CURRENT_VERTICAL_RESOLUTION;\r
+    } else {\r
+      //\r
+      // if not supporting current mode, try 800x600 which is required by UEFI/EFI spec\r
+      //\r
+      Status = CheckModeSupported (\r
+                   Private->GraphicsOutput,\r
+                   800,\r
+                   600,\r
+                   &ModeNumber\r
+                   );\r
     }\r
 \r
     if (EFI_ERROR (Status) || (ModeNumber == Private->GraphicsOutput->Mode->MaxMode)) {\r
@@ -366,41 +380,56 @@ GraphicsConsoleControllerDriverStart (
       VerticalResolution = Private->GraphicsOutput->Mode->Info->VerticalResolution;\r
       ModeNumber = Private->GraphicsOutput->Mode->Mode;\r
     }\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     //\r
-    // The console is build on top of UGA Draw Protocol\r
+    // At first try to set user-defined resolution\r
     //\r
     ColorDepth            = 32;\r
     RefreshRate           = 60;\r
     Status = Private->UgaDraw->SetMode (\r
                                 Private->UgaDraw,\r
-                                HorizontalResolution,\r
-                                VerticalResolution,\r
+                                CURRENT_HORIZONTAL_RESOLUTION,\r
+                                CURRENT_VERTICAL_RESOLUTION,\r
                                 ColorDepth,\r
                                 RefreshRate\r
                                 );\r
-    if (EFI_ERROR (Status)) {\r
+    if (!EFI_ERROR (Status)) {\r
+      HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
+      VerticalResolution   = CURRENT_VERTICAL_RESOLUTION;\r
+    } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
       //\r
-      // Get the current mode information from the UGA Draw Protocol\r
+      // Try to set 800*600 which is required by UEFI/EFI spec\r
       //\r
-      Status = Private->UgaDraw->GetMode (\r
+      Status = Private->UgaDraw->SetMode (\r
                                   Private->UgaDraw,\r
-                                  &HorizontalResolution,\r
-                                  &VerticalResolution,\r
-                                  &ColorDepth,\r
-                                  &RefreshRate\r
+                                  HorizontalResolution,\r
+                                  VerticalResolution,\r
+                                  ColorDepth,\r
+                                  RefreshRate\r
                                   );\r
       if (EFI_ERROR (Status)) {\r
-        goto Error;\r
+        Status = Private->UgaDraw->GetMode (\r
+                                    Private->UgaDraw,\r
+                                    &HorizontalResolution,\r
+                                    &VerticalResolution,\r
+                                    &ColorDepth,\r
+                                    &RefreshRate\r
+                                    );\r
+        if (EFI_ERROR (Status)) {\r
+          goto Error;\r
+        }\r
       }\r
+    } else {\r
+      Status = EFI_UNSUPPORTED;\r
+      goto Error;\r
     }\r
   }\r
 \r
   //\r
   // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
   //\r
-  Columns = HorizontalResolution / GLYPH_WIDTH;\r
-  Rows    = VerticalResolution / GLYPH_HEIGHT;\r
+  Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
+  Rows    = VerticalResolution / EFI_GLYPH_HEIGHT;\r
 \r
   //\r
   // See if the mode is too small to support the required 80x25 text mode\r
@@ -415,8 +444,8 @@ GraphicsConsoleControllerDriverStart (
   Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
   Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
   Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-  Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
-  Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (25 * GLYPH_HEIGHT)) >> 1;\r
+  Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
+  Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (25 * EFI_GLYPH_HEIGHT)) >> 1;\r
   MaxMode++;\r
 \r
   //\r
@@ -426,35 +455,51 @@ GraphicsConsoleControllerDriverStart (
     Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
     Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
     Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-    Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
-    Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (50 * GLYPH_HEIGHT)) >> 1;\r
+    Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
+    Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1;\r
     MaxMode++;\r
   }\r
+\r
   //\r
-  // If the graphics mode is 800x600, than add a text mode that uses the entire display\r
+  // If it is not to support Mode #1 - 80x50, then skip it\r
   //\r
-  if (HorizontalResolution == 800 && VerticalResolution == 600) {\r
-\r
-    if (MaxMode < 2) {\r
-      Private->ModeData[MaxMode].Columns    = 0;\r
-      Private->ModeData[MaxMode].Rows       = 0;\r
-      Private->ModeData[MaxMode].GopWidth   = 800;\r
-      Private->ModeData[MaxMode].GopHeight  = 600;\r
-      Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-      Private->ModeData[MaxMode].DeltaX     = 0;\r
-      Private->ModeData[MaxMode].DeltaY     = 0;\r
-      MaxMode++;\r
-    }\r
+  if (MaxMode < 2) {\r
+    Private->ModeData[MaxMode].Columns    = 0;\r
+    Private->ModeData[MaxMode].Rows       = 0;\r
+    Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
+    Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
+    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
+    Private->ModeData[MaxMode].DeltaX     = 0;\r
+    Private->ModeData[MaxMode].DeltaY     = 0;\r
+    MaxMode++;\r
+  }\r
+\r
+  //\r
+  // Add Mode #2 that must be 100x31 (graphic mode >= 800x600)\r
+  //\r
+  if (Columns >= 100 && Rows >= 31) {\r
+    Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
+    Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
+    Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
+    Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution - (100 * EFI_GLYPH_WIDTH)) >> 1;\r
+    Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (31 * EFI_GLYPH_HEIGHT)) >> 1;\r
+    MaxMode++;\r
+  }\r
 \r
-    Private->ModeData[MaxMode].Columns    = 800 / GLYPH_WIDTH;\r
-    Private->ModeData[MaxMode].Rows       = 600 / GLYPH_HEIGHT;\r
-    Private->ModeData[MaxMode].GopWidth   = 800;\r
-    Private->ModeData[MaxMode].GopHeight  = 600;\r
+  //\r
+  // Add Mode #3 that uses the entire display for user-defined mode\r
+  //\r
+  if (HorizontalResolution > 800 && VerticalResolution > 600) {\r
+    Private->ModeData[MaxMode].Columns    = HorizontalResolution/EFI_GLYPH_WIDTH;\r
+    Private->ModeData[MaxMode].Rows       = VerticalResolution/EFI_GLYPH_HEIGHT;\r
+    Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
+    Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
     Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
-    Private->ModeData[MaxMode].DeltaX     = (800 % GLYPH_WIDTH) >> 1;\r
-    Private->ModeData[MaxMode].DeltaY     = (600 % GLYPH_HEIGHT) >> 1;\r
+    Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution % EFI_GLYPH_WIDTH) >> 1;\r
+    Private->ModeData[MaxMode].DeltaY     = (VerticalResolution % EFI_GLYPH_HEIGHT) >> 1;\r
     MaxMode++;\r
   }\r
+\r
   //\r
   // Update the maximum number of modes\r
   //\r
@@ -494,7 +539,7 @@ Error:
             This->DriverBindingHandle,\r
             Controller\r
             );\r
-    } else {\r
+    } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
       gBS->CloseProtocol (\r
             Controller,\r
             &gEfiUgaDrawProtocolGuid,\r
@@ -561,7 +606,7 @@ GraphicsConsoleControllerDriverStop (
             This->DriverBindingHandle,\r
             Controller\r
             );\r
-    } else {\r
+    } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
       gBS->CloseProtocol (\r
             Controller,\r
             &gEfiUgaDrawProtocolGuid,\r
@@ -573,7 +618,10 @@ GraphicsConsoleControllerDriverStop (
     //\r
     // Remove the font pack\r
     //\r
-    mHii->RemovePack (mHii, Private->HiiHandle);\r
+    if (Private->HiiHandle != NULL) {\r
+      HiiLibRemovePackages (Private->HiiHandle);\r
+      mFirstAccessFlag = TRUE;\r
+    }\r
 \r
     //\r
     // Free our instance data\r
@@ -588,19 +636,59 @@ GraphicsConsoleControllerDriverStop (
 }\r
 \r
 EFI_STATUS\r
-EfiLocateHiiProtocol (\r
-  VOID\r
+CheckModeSupported (\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput,\r
+  IN  UINT32  HorizontalResolution,\r
+  IN  UINT32  VerticalResolution,\r
+  OUT UINT32  *CurrentModeNumber\r
   )\r
-/*++\r
+{\r
+  UINT32     ModeNumber;\r
+  EFI_STATUS Status;\r
+  UINTN      SizeOfInfo;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
 \r
-  Routine Description:\r
-    Find if the HII protocol is available. If yes, locate the HII protocol\r
+  Status = EFI_SUCCESS;\r
 \r
-  Arguments:\r
+  for (ModeNumber = 0; ModeNumber < GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
+    Status = GraphicsOutput->QueryMode (\r
+                       GraphicsOutput,\r
+                       ModeNumber,\r
+                       &SizeOfInfo,\r
+                       &Info\r
+                       );\r
+    if (!EFI_ERROR (Status)) {\r
+      if ((Info->HorizontalResolution == HorizontalResolution) &&\r
+          (Info->VerticalResolution == VerticalResolution)) {\r
+        Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
+        if (!EFI_ERROR (Status)) {\r
+          gBS->FreePool (Info);\r
+          break;\r
+        }\r
+      }\r
+      gBS->FreePool (Info);\r
+    }\r
+  }\r
+\r
+  if (ModeNumber == GraphicsOutput->Mode->MaxMode) {\r
+    Status = EFI_UNSUPPORTED;\r
+  }\r
+\r
+  *CurrentModeNumber = ModeNumber;\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Locate HII protocols for future usage.\r
 \r
-  Returns:\r
 \r
---*/\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLocateHiiProtocol (\r
+  VOID\r
+  )\r
 {\r
   EFI_HANDLE  Handle;\r
   UINTN       Size;\r
@@ -613,10 +701,10 @@ EfiLocateHiiProtocol (
 \r
   Status = gBS->LocateHandle (\r
                   ByProtocol,\r
-                  &gEfiHiiProtocolGuid,\r
+                  &gEfiHiiDatabaseProtocolGuid,\r
                   NULL,\r
                   &Size,\r
-                  &Handle\r
+                  (VOID **) &Handle\r
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
@@ -625,84 +713,79 @@ EfiLocateHiiProtocol (
 \r
   Status = gBS->HandleProtocol (\r
                   Handle,\r
-                  &gEfiHiiProtocolGuid,\r
-                  (VOID **)&mHii\r
+                  &gEfiHiiDatabaseProtocolGuid,\r
+                  (VOID **) &mHiiDatabase\r
                   );\r
 \r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  Handle,\r
+                  &gEfiHiiFontProtocolGuid,\r
+                  (VOID **) &mHiiFont\r
+                  );\r
   return Status;\r
 }\r
+\r
 //\r
 // Body of the STO functions\r
 //\r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.Reset().\r
+  If ExtendeVerification is TRUE, then perform dependent Graphics Console\r
+  device reset, and set display mode to mode 0.\r
+  If ExtendedVerification is FALSE, only set display mode to mode 0.\r
+\r
+  @param  This                  Indicates the calling context.\r
+  @param  ExtendedVerification  Indicates that the driver may perform a more\r
+                                exhaustive verification operation of the device\r
+                                during reset.\r
+\r
+  @return EFI_SUCCESS\r
+  @return The reset operation succeeds.\r
+  @return EFI_DEVICE_ERROR\r
+  @return The Graphics Console is not functioning correctly\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutReset (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
   IN  BOOLEAN                          ExtendedVerification\r
   )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.Reset().\r
-    If ExtendeVerification is TRUE, then perform dependent Graphics Console \r
-    device reset, and set display mode to mode 0.\r
-    If ExtendedVerification is FALSE, only set display mode to mode 0.\r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    ExtendedVerification - Indicates that the driver may perform a more exhaustive\r
-                           verification operation of the device during reset.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-       The reset operation succeeds.   \r
-    \r
-    EFI_DEVICE_ERROR\r
-      The Graphics Console is not functioning correctly \r
-                \r
---*/\r
 {\r
   This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
   return This->SetMode (This, 0);\r
 }\r
 \r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.OutputString().\r
+  The Unicode string will be converted to Glyphs and will be\r
+  sent to the Graphics Console.\r
+\r
+  @param  This                  Indicates the calling context.\r
+  @param  WString               The Null-terminated Unicode string to be displayed\r
+                                on the Graphics Console.\r
+\r
+  @return EFI_SUCCESS\r
+  @return The string is output successfully.\r
+  @return EFI_DEVICE_ERROR\r
+  @return The Graphics Console failed to send the string out.\r
+  @return EFI_WARN_UNKNOWN_GLYPH\r
+  @return Indicates that some of the characters in the Unicode string could not\r
+  @return be rendered and are skipped.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutOutputString (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
   IN  CHAR16                           *WString\r
   )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.OutputString().\r
-    The Unicode string will be converted to Glyphs and will be \r
-    sent to the Graphics Console.\r
-    \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    WString - The Null-terminated Unicode string to be displayed on \r
-              the Graphics Console.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-       The string is output successfully.   \r
-    \r
-    EFI_DEVICE_ERROR\r
-      The Graphics Console failed to send the string out.\r
-      \r
-    EFI_WARN_UNKNOWN_GLYPH\r
-      Indicates that some of the characters in the Unicode string could not \r
-      be rendered and are skipped.          \r
-                \r
---*/\r
 {\r
   GRAPHICS_CONSOLE_DEV  *Private;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL   *GraphicsOutput;\r
@@ -723,7 +806,6 @@ GraphicsConsoleConOutOutputString (
   UINTN                 Index;\r
   INT32                 OriginAttribute;\r
   EFI_TPL               OldTpl;\r
-  CHAR16                         SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
 \r
   Status = EFI_SUCCESS;\r
 \r
@@ -740,8 +822,8 @@ GraphicsConsoleConOutOutputString (
   MaxRow    = Private->ModeData[Mode].Rows;\r
   DeltaX    = Private->ModeData[Mode].DeltaX;\r
   DeltaY    = Private->ModeData[Mode].DeltaY;\r
-  Width     = MaxColumn * GLYPH_WIDTH;\r
-  Height    = (MaxRow - 1) * GLYPH_HEIGHT;\r
+  Width     = MaxColumn * EFI_GLYPH_WIDTH;\r
+  Height    = (MaxRow - 1) * EFI_GLYPH_HEIGHT;\r
   Delta     = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
 \r
   //\r
@@ -758,7 +840,7 @@ GraphicsConsoleConOutOutputString (
   //\r
   OriginAttribute = This->Mode->Attribute;\r
 \r
-  while (*WString) {\r
+  while (*WString != L'\0') {\r
 \r
     if (*WString == CHAR_BACKSPACE) {\r
       //\r
@@ -801,7 +883,7 @@ GraphicsConsoleConOutOutputString (
                     NULL,\r
                     EfiBltVideoToVideo,\r
                     DeltaX,\r
-                    DeltaY + GLYPH_HEIGHT,\r
+                    DeltaY + EFI_GLYPH_HEIGHT,\r
                     DeltaX,\r
                     DeltaY,\r
                     Width,\r
@@ -821,10 +903,10 @@ GraphicsConsoleConOutOutputString (
                     DeltaX,\r
                     DeltaY + Height,\r
                     Width,\r
-                    GLYPH_HEIGHT,\r
+                    EFI_GLYPH_HEIGHT,\r
                     Delta\r
                     );\r
-        } else {\r
+        } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
           //\r
           // Scroll Screen Up One Row\r
           //\r
@@ -833,7 +915,7 @@ GraphicsConsoleConOutOutputString (
                     NULL,\r
                     EfiUgaVideoToVideo,\r
                     DeltaX,\r
-                    DeltaY + GLYPH_HEIGHT,\r
+                    DeltaY + EFI_GLYPH_HEIGHT,\r
                     DeltaX,\r
                     DeltaY,\r
                     Width,\r
@@ -853,7 +935,7 @@ GraphicsConsoleConOutOutputString (
                     DeltaX,\r
                     DeltaY + Height,\r
                     Width,\r
-                    GLYPH_HEIGHT,\r
+                    EFI_GLYPH_HEIGHT,\r
                     Delta\r
                     );\r
         }\r
@@ -973,56 +1055,49 @@ GraphicsConsoleConOutOutputString (
 \r
 }\r
 \r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.TestString().\r
+  If one of the characters in the *Wstring is\r
+  neither valid valid Unicode drawing characters,\r
+  not ASCII code, then this function will return\r
+  EFI_UNSUPPORTED.\r
+\r
+  @param  This                  Indicates the calling context.\r
+  @param  WString               The Null-terminated Unicode string to be tested.\r
+\r
+  @return EFI_SUCCESS\r
+  @return The Graphics Console is capable of rendering the output string.\r
+  @return EFI_UNSUPPORTED\r
+  @return Some of the characters in the Unicode string cannot be rendered.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutTestString (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
   IN  CHAR16                           *WString\r
   )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.TestString().\r
-    If one of the characters in the *Wstring is\r
-    neither valid valid Unicode drawing characters,\r
-    not ASCII code, then this function will return\r
-    EFI_UNSUPPORTED.\r
-        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    WString - The Null-terminated Unicode string to be tested.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-       The Graphics Console is capable of rendering the output string. \r
-    \r
-    EFI_UNSUPPORTED\r
-      Some of the characters in the Unicode string cannot be rendered.      \r
-                \r
---*/\r
 {\r
   EFI_STATUS            Status;\r
-  UINT16                GlyphWidth;\r
-  UINT32                GlyphStatus;\r
   UINT16                Count;\r
-  GLYPH_UNION           *Glyph;\r
-\r
-  GlyphStatus = 0;\r
-  Count       = 0;\r
-\r
-  while (WString[Count]) {\r
-    Status = mHii->GetGlyph (\r
-                    mHii,\r
-                    WString,\r
-                    &Count,\r
-                    (UINT8 **) &Glyph,\r
-                    &GlyphWidth,\r
-                    &GlyphStatus\r
-                    );\r
+\r
+  EFI_IMAGE_OUTPUT      *Blt;\r
+\r
+  Blt   = NULL;\r
+  Count = 0;\r
+\r
+  while (WString[Count] != 0) {\r
+    Status = mHiiFont->GetGlyph (\r
+                         mHiiFont,\r
+                         WString[Count],\r
+                         NULL,\r
+                         &Blt,\r
+                         NULL\r
+                         );\r
+    SafeFreePool (Blt);\r
+    Blt = NULL;\r
+    Count++;\r
 \r
     if (EFI_ERROR (Status)) {\r
       return EFI_UNSUPPORTED;\r
@@ -1032,6 +1107,25 @@ GraphicsConsoleConOutTestString (
   return EFI_SUCCESS;\r
 }\r
 \r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.QueryMode().\r
+  It returnes information for an available text mode\r
+  that the Graphics Console supports.\r
+  In this driver,we only support text mode 80x25, which is\r
+  defined as mode 0.\r
+\r
+  @param  This                  Indicates the calling context.\r
+  @param  ModeNumber            The mode number to return information on.\r
+  @param  Columns               The returned columns of the requested mode.\r
+  @param  Rows                  The returned rows of the requested mode.\r
+\r
+  @return EFI_SUCCESS\r
+  @return The requested mode information is returned.\r
+  @return EFI_UNSUPPORTED\r
+  @return The mode number is not valid.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutQueryMode (\r
@@ -1040,35 +1134,6 @@ GraphicsConsoleConOutQueryMode (
   OUT UINTN                            *Columns,\r
   OUT UINTN                            *Rows\r
   )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.QueryMode().\r
-    It returnes information for an available text mode\r
-    that the Graphics Console supports.\r
-    In this driver,we only support text mode 80x25, which is\r
-    defined as mode 0.\r
-        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    ModeNumber - The mode number to return information on.\r
-        \r
-    Columns - The returned columns of the requested mode.\r
-        \r
-    Rows - The returned rows of the requested mode.                \r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The requested mode information is returned. \r
-    \r
-    EFI_UNSUPPORTED\r
-      The mode number is not valid.   \r
-                \r
---*/\r
 {\r
   GRAPHICS_CONSOLE_DEV  *Private;\r
   EFI_STATUS            Status;\r
@@ -1080,7 +1145,7 @@ GraphicsConsoleConOutQueryMode (
 \r
   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
   Status = EFI_SUCCESS;\r
-  \r
+\r
   Private   = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
 \r
   *Columns  = Private->ModeData[ModeNumber].Columns;\r
@@ -1097,37 +1162,29 @@ Done:
   return Status;\r
 }\r
 \r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.SetMode().\r
+  Set the Graphics Console to a specified mode.\r
+  In this driver, we only support mode 0.\r
+\r
+  @param  This                  Indicates the calling context.\r
+  @param  ModeNumber            The text mode to set.\r
+\r
+  @return EFI_SUCCESS\r
+  @return The requested text mode is set.\r
+  @return EFI_DEVICE_ERROR\r
+  @return The requested text mode cannot be set because of Graphics Console device error.\r
+  @return EFI_UNSUPPORTED\r
+  @return The text mode number is not valid.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutSetMode (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
   IN  UINTN                            ModeNumber\r
   )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.SetMode().\r
-    Set the Graphics Console to a specified mode.\r
-    In this driver, we only support mode 0.        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    ModeNumber - The text mode to set.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-       The requested text mode is set.\r
-       \r
-    EFI_DEVICE_ERROR\r
-      The requested text mode cannot be set because of Graphics Console device error.\r
-    \r
-    EFI_UNSUPPORTED\r
-      The text mode number is not valid.       \r
-                \r
---*/\r
 {\r
   EFI_STATUS                      Status;\r
   GRAPHICS_CONSOLE_DEV            *Private;\r
@@ -1168,7 +1225,7 @@ GraphicsConsoleConOutSetMode (
   //\r
   // Attempt to allocate a line buffer for the requested mode number\r
   //\r
-  NewLineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * GLYPH_WIDTH * GLYPH_HEIGHT);\r
+  NewLineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * EFI_GLYPH_WIDTH * EFI_GLYPH_HEIGHT);\r
 \r
   if (NewLineBuffer == NULL) {\r
     //\r
@@ -1196,10 +1253,10 @@ GraphicsConsoleConOutSetMode (
       goto Done;\r
     }\r
     //\r
-    // Otherwise, the size of the text console and/or the UGA mode will be changed,\r
-    // so turn off the cursor, and free the LineBuffer for the current mode\r
+    // Otherwise, the size of the text console and/or the GOP/UGA mode will be changed,\r
+    // so erase the cursor, and free the LineBuffer for the current mode\r
     //\r
-    This->EnableCursor (This, FALSE);\r
+    EraseCursor (This);\r
 \r
     FreePool (Private->LineBuffer);\r
   }\r
@@ -1237,7 +1294,7 @@ GraphicsConsoleConOutSetMode (
                           0\r
                           );\r
     }\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     //\r
     // Get the current UGA Draw mode information\r
     //\r
@@ -1293,7 +1350,6 @@ GraphicsConsoleConOutSetMode (
   // Move the text cursor to the upper left hand corner of the displat and enable it\r
   //\r
   This->SetCursorPosition (This, 0, 0);\r
-  This->EnableCursor (This, TRUE);\r
 \r
   Status = EFI_SUCCESS;\r
 \r
@@ -1302,39 +1358,28 @@ Done:
   return Status;\r
 }\r
 \r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.SetAttribute().\r
+\r
+  @param  This                  Indicates the calling context.\r
+  @param  Attribute             The attribute to set. Only bit0..6 are valid, all\r
+                                other bits are undefined and must be zero.\r
+\r
+  @return EFI_SUCCESS           The requested attribute is set.\r
+  @return EFI_DEVICE_ERROR      The requested attribute cannot be set due to Graphics Console port error.\r
+  @return EFI_UNSUPPORTED       The attribute requested is not defined by EFI spec.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutSetAttribute (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
   IN  UINTN                            Attribute\r
   )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.SetAttribute().       \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-    \r
-    Attrubute - The attribute to set. Only bit0..6 are valid, all other bits\r
-                are undefined and must be zero.\r
-        \r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The requested attribute is set. \r
-       \r
-    EFI_DEVICE_ERROR\r
-      The requested attribute cannot be set due to Graphics Console port error.\r
-          \r
-    EFI_UNSUPPORTED\r
-      The attribute requested is not defined by EFI spec.   \r
-                \r
---*/\r
 {\r
   EFI_TPL               OldTpl;\r
-  \r
+\r
   if ((Attribute | 0xFF) != 0xFF) {\r
     return EFI_UNSUPPORTED;\r
   }\r
@@ -1356,35 +1401,27 @@ GraphicsConsoleConOutSetAttribute (
   return EFI_SUCCESS;\r
 }\r
 \r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.ClearScreen().\r
+  It clears the Graphics Console's display to the\r
+  currently selected background color.\r
+\r
+  @param  This                  Indicates the calling context.\r
+\r
+  @return EFI_SUCCESS\r
+  @return The operation completed successfully.\r
+  @return EFI_DEVICE_ERROR\r
+  @return The Graphics Console cannot be cleared due to Graphics Console device error.\r
+  @return EFI_UNSUPPORTED\r
+  @return The Graphics Console is not in a valid text mode.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutClearScreen (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This\r
   )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.ClearScreen().\r
-    It clears the Graphics Console's display to the \r
-    currently selected background color.\r
-        \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-\r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The operation completed successfully.\r
-       \r
-    EFI_DEVICE_ERROR\r
-      The Graphics Console cannot be cleared due to Graphics Console device error.        \r
-    \r
-    EFI_UNSUPPORTED\r
-      The Graphics Console is not in a valid text mode.       \r
-                \r
---*/\r
 {\r
   EFI_STATUS                    Status;\r
   GRAPHICS_CONSOLE_DEV          *Private;\r
@@ -1416,7 +1453,7 @@ GraphicsConsoleConOutClearScreen (
                         ModeData->GopHeight,\r
                         0\r
                         );\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     Status = UgaDraw->Blt (\r
                         UgaDraw,\r
                         (EFI_UGA_PIXEL *) (UINTN) &Background,\r
@@ -1429,6 +1466,8 @@ GraphicsConsoleConOutClearScreen (
                         ModeData->GopHeight,\r
                         0\r
                         );\r
+  } else {\r
+    Status = EFI_UNSUPPORTED;\r
   }\r
 \r
   This->Mode->CursorColumn  = 0;\r
@@ -1441,6 +1480,23 @@ GraphicsConsoleConOutClearScreen (
   return Status;\r
 }\r
 \r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition().\r
+\r
+  @param  This                  Indicates the calling context.\r
+  @param  Column                The row to set cursor to.\r
+  @param  Row                   The column to set cursor to.\r
+\r
+  @return EFI_SUCCESS\r
+  @return The operation completed successfully.\r
+  @return EFI_DEVICE_ERROR\r
+  @return The request fails due to Graphics Console device error.\r
+  @return EFI_UNSUPPORTED\r
+  @return The Graphics Console is not in a valid text mode, or the cursor position\r
+  @return is invalid for current mode.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutSetCursorPosition (\r
@@ -1448,32 +1504,6 @@ GraphicsConsoleConOutSetCursorPosition (
   IN  UINTN                            Column,\r
   IN  UINTN                            Row\r
   )\r
-/*++\r
-  Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition().          \r
-  \r
-  Arguments:\r
-  \r
-    This - Indicates the calling context.\r
-        \r
-    Column - The row to set cursor to.\r
-        \r
-    Row - The column to set cursor to.                \r
-\r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The operation completed successfully.\r
-       \r
-    EFI_DEVICE_ERROR\r
-      The request fails due to Graphics Console device error.        \r
-    \r
-    EFI_UNSUPPORTED\r
-      The Graphics Console is not in a valid text mode, or the cursor position\r
-      is invalid for current mode.     \r
-                \r
---*/\r
 {\r
   GRAPHICS_CONSOLE_DEV        *Private;\r
   GRAPHICS_CONSOLE_MODE_DATA  *ModeData;\r
@@ -1510,39 +1540,32 @@ Done:
   return Status;\r
 }\r
 \r
+\r
+/**\r
+  Implements SIMPLE_TEXT_OUTPUT.EnableCursor().\r
+  In this driver, the cursor cannot be hidden.\r
+\r
+  @param  This                  Indicates the calling context.\r
+  @param  Visible               If TRUE, the cursor is set to be visible, If FALSE,\r
+                                the cursor is set to be invisible.\r
+\r
+  @return EFI_SUCCESS\r
+  @return The request is valid.\r
+  @return EFI_UNSUPPORTED\r
+  @return The Graphics Console does not support a hidden cursor.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 GraphicsConsoleConOutEnableCursor (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\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
-    This - Indicates the calling context.\r
-        \r
-    Visible - If TRUE, the cursor is set to be visible,\r
-              If FALSE, the cursor is set to be invisible.        \r
-\r
-  Returns:\r
-  \r
-    EFI_SUCCESS\r
-      The request is valid.\r
-       \r
-    EFI_UNSUPPORTED\r
-      The Graphics Console does not support a hidden cursor.   \r
-                \r
---*/\r
 {\r
   EFI_TPL               OldTpl;\r
-  \r
+\r
   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-    \r
+\r
   EraseCursor (This);\r
 \r
   This->Mode->CursorVisible = Visible;\r
@@ -1553,7 +1576,6 @@ GraphicsConsoleConOutEnableCursor (
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 GetTextColors (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
@@ -1571,148 +1593,126 @@ GetTextColors (
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 DrawUnicodeWeightAtCursorN (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This,\r
-  IN  CHAR16                           *UnicodeWeight,\r
-  IN  UINTN                            Count\r
+  IN  CHAR16                        *UnicodeWeight,\r
+  IN  UINTN                         Count\r
   )\r
 {\r
-  GRAPHICS_CONSOLE_DEV  *Private;\r
-  EFI_STATUS            Status;\r
-  EFI_STATUS            ReturnStatus;\r
-  GLYPH_UNION           *Glyph;\r
-  GLYPH_UNION           GlyphData;\r
-  INTN                  GlyphX;\r
-  INTN                  GlyphY;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
-  UINTN                 Index;\r
-  UINTN                 ArrayIndex;\r
-  UINTN                 Counts;\r
-  UINT16                GlyphWidth;\r
-  UINT32                GlyphStatus;\r
+  EFI_STATUS                        Status;\r
+  GRAPHICS_CONSOLE_DEV              *Private;\r
+  EFI_IMAGE_OUTPUT                  *Blt;\r
+  EFI_STRING                        String;\r
+  EFI_FONT_DISPLAY_INFO             *FontInfo;\r
+  EFI_UGA_DRAW_PROTOCOL             *UgaDraw;\r
+  EFI_HII_ROW_INFO                  *RowInfoArray;\r
+  UINTN                             RowInfoArraySize;\r
 \r
-  Private       = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+  Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+  Blt = (EFI_IMAGE_OUTPUT *) AllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT));\r
+  if (Blt == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
 \r
-  ReturnStatus  = EFI_SUCCESS;\r
-  GlyphStatus   = 0;\r
-  GlyphWidth    = 0x08;\r
+  Blt->Width        = (UINT16) (Private->ModeData[This->Mode->Mode].GopWidth);\r
+  Blt->Height       = (UINT16) (Private->ModeData[This->Mode->Mode].GopHeight);\r
 \r
-  GetTextColors (This, &Foreground, &Background);\r
+  String = AllocateCopyPool ((Count + 1) * sizeof (CHAR16), UnicodeWeight);\r
+  if (String == NULL) {\r
+    SafeFreePool (Blt);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  *(String + Count) = 0;\r
 \r
-  Index       = 0;\r
-  ArrayIndex  = 0;\r
-  while (Index < Count) {\r
-    if (This->Mode->Attribute & EFI_WIDE_ATTRIBUTE) {\r
-      GlyphStatus = WIDE_CHAR;\r
-    } else {\r
-      GlyphStatus = NARROW_CHAR;\r
-    }\r
+  FontInfo = (EFI_FONT_DISPLAY_INFO *) AllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO));\r
+  if (FontInfo == NULL) {\r
+    SafeFreePool (Blt);\r
+    SafeFreePool (String);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  GetTextColors (This, &FontInfo->ForegroundColor, &FontInfo->BackgroundColor);\r
 \r
-    Status = mHii->GetGlyph (\r
-                    mHii,\r
-                    UnicodeWeight,\r
-                    (UINT16 *) &Index,\r
-                    (UINT8 **) &Glyph,\r
-                    &GlyphWidth,\r
-                    &GlyphStatus\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      ReturnStatus = Status;\r
-    }\r
+  if (Private->GraphicsOutput != NULL) {\r
+    Blt->Image.Screen = Private->GraphicsOutput;\r
+\r
+    Status = mHiiFont->StringToImage (\r
+                         mHiiFont,\r
+                         EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_DIRECT_TO_SCREEN,\r
+                         String,\r
+                         FontInfo,\r
+                         &Blt,\r
+                         This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                         This->Mode->CursorRow * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+                         NULL,\r
+                         NULL,\r
+                         NULL\r
+                         );\r
 \r
-    Counts = 0;\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+    ASSERT (Private->UgaDraw!= NULL);\r
 \r
-    CopyMem (&GlyphData, Glyph, sizeof (GLYPH_UNION));\r
+    UgaDraw = Private->UgaDraw;\r
 \r
-    do {\r
-      //\r
-      // We are creating the second half of the wide character's BLT buffer\r
-      //\r
-      if (GlyphWidth == 0x10 && Counts == 1) {\r
-        CopyMem (&GlyphData.NarrowGlyph.GlyphCol1, &Glyph->WideGlyph.GlyphCol2, sizeof (Glyph->WideGlyph.GlyphCol2));\r
-      }\r
+    Blt->Image.Bitmap = AllocateZeroPool (Blt->Width * Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
+    if (Blt->Image.Bitmap == NULL) {\r
+      SafeFreePool (Blt);\r
+      SafeFreePool (String);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
 \r
-      Counts++;\r
-\r
-      if (GlyphWidth == 0x10) {\r
-        mHii->GlyphToBlt (\r
-                mHii,\r
-                (UINT8 *) &GlyphData,\r
-                Foreground,\r
-                Background,\r
-                Count * 2,\r
-                GLYPH_WIDTH,\r
-                GLYPH_HEIGHT,\r
-                &Private->LineBuffer[ArrayIndex * GLYPH_WIDTH]\r
-                );\r
-      } else {\r
-        mHii->GlyphToBlt (\r
-                mHii,\r
-                (UINT8 *) &GlyphData,\r
-                Foreground,\r
-                Background,\r
-                Count,\r
-                GLYPH_WIDTH,\r
-                GLYPH_HEIGHT,\r
-                &Private->LineBuffer[ArrayIndex * GLYPH_WIDTH]\r
-                );\r
-      }\r
+    RowInfoArray = NULL;\r
+    //\r
+    //  StringToImage only support blt'ing image to device using GOP protocol. If GOP is not supported in this platform,\r
+    //  we ask StringToImage to print the string to blt buffer, then blt to device using UgaDraw.\r
+    //\r
+    Status = mHiiFont->StringToImage (\r
+                          mHiiFont,\r
+                          EFI_HII_IGNORE_IF_NO_GLYPH,\r
+                          String,\r
+                          FontInfo,\r
+                          &Blt,\r
+                          This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                          This->Mode->CursorRow * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+                          &RowInfoArray,\r
+                          &RowInfoArraySize,\r
+                          NULL\r
+                          );\r
 \r
-      ArrayIndex++;\r
+    if (!EFI_ERROR (Status)) {\r
+      //\r
+      // Line breaks are handled by caller of DrawUnicodeWeightAtCursorN, so the updated parameter RowInfoArraySize by StringToImage will\r
+      // always be 1 or 0 (if there is no valid Unicode Char can be printed). ASSERT here to make sure.\r
+      //\r
+      ASSERT (RowInfoArraySize <= 1);\r
 \r
-    } while (Counts < 2 && GlyphWidth == 0x10);\r
+      Status = UgaDraw->Blt (\r
+                          UgaDraw,\r
+                          (EFI_UGA_PIXEL *) Blt->Image.Bitmap,\r
+                          EfiUgaBltBufferToVideo,\r
+                          This->Mode->CursorColumn * EFI_GLYPH_WIDTH  + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                          (This->Mode->CursorRow) * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+                          This->Mode->CursorColumn * EFI_GLYPH_WIDTH  + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                          (This->Mode->CursorRow) * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+                          RowInfoArray[0].LineWidth,\r
+                          RowInfoArray[0].LineHeight,\r
+                          Blt->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+                          );\r
+    }\r
 \r
-  }\r
-  //\r
-  // If we are printing Wide characters, treat the BLT as if it is twice as many characters\r
-  //\r
-  if (GlyphWidth == 0x10) {\r
-    Count = Count * 2;\r
-  }\r
-  //\r
-  // Blt a character to the screen\r
-  //\r
-  GlyphX  = This->Mode->CursorColumn * GLYPH_WIDTH;\r
-  GlyphY  = This->Mode->CursorRow * GLYPH_HEIGHT;\r
-  GraphicsOutput = Private->GraphicsOutput;\r
-  UgaDraw = Private->UgaDraw;\r
-  if (GraphicsOutput != NULL) {\r
-    GraphicsOutput->Blt (\r
-              GraphicsOutput,\r
-              Private->LineBuffer,\r
-              EfiBltBufferToVideo,\r
-              0,\r
-              0,\r
-              GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
-              GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
-              GLYPH_WIDTH * Count,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * Count * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
-              );\r
+    SafeFreePool (RowInfoArray);\r
+    SafeFreePool (Blt->Image.Bitmap);\r
   } else {\r
-    UgaDraw->Blt (\r
-              UgaDraw,\r
-              (EFI_UGA_PIXEL *) (UINTN) Private->LineBuffer,\r
-              EfiUgaBltBufferToVideo,\r
-              0,\r
-              0,\r
-              GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
-              GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
-              GLYPH_WIDTH * Count,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * Count * sizeof (EFI_UGA_PIXEL)\r
-              );\r
+    Status = EFI_UNSUPPORTED;\r
   }\r
 \r
-  return ReturnStatus;\r
+  SafeFreePool (Blt);\r
+  SafeFreePool (String);\r
+  SafeFreePool (FontInfo);\r
+  return Status;\r
 }\r
 \r
-STATIC\r
+\r
 EFI_STATUS\r
 EraseCursor (\r
   IN  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *This\r
@@ -1726,9 +1726,9 @@ EraseCursor (
   EFI_UGA_DRAW_PROTOCOL       *UgaDraw;\r
   EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Foreground;\r
   EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Background;\r
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[GLYPH_HEIGHT][GLYPH_WIDTH];\r
-  UINTN                       X;\r
-  UINTN                       Y;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[EFI_GLYPH_HEIGHT][EFI_GLYPH_WIDTH];\r
+  UINTN                       PosX;\r
+  UINTN                       PosY;\r
 \r
   CurrentMode = This->Mode;\r
 \r
@@ -1746,8 +1746,8 @@ EraseCursor (
   //\r
   // Blt a character to the screen\r
   //\r
-  GlyphX  = (CurrentMode->CursorColumn * GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX;\r
-  GlyphY  = (CurrentMode->CursorRow * GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY;\r
+  GlyphX  = (CurrentMode->CursorColumn * EFI_GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX;\r
+  GlyphY  = (CurrentMode->CursorRow * EFI_GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY;\r
   if (GraphicsOutput != NULL) {\r
     GraphicsOutput->Blt (\r
               GraphicsOutput,\r
@@ -1757,11 +1757,11 @@ EraseCursor (
               GlyphY,\r
               0,\r
               0,\r
-              GLYPH_WIDTH,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+              EFI_GLYPH_WIDTH,\r
+              EFI_GLYPH_HEIGHT,\r
+              EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
               );\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     UgaDraw->Blt (\r
               UgaDraw,\r
               (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
@@ -1770,9 +1770,9 @@ EraseCursor (
               GlyphY,\r
               0,\r
               0,\r
-              GLYPH_WIDTH,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
+              EFI_GLYPH_WIDTH,\r
+              EFI_GLYPH_HEIGHT,\r
+              EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
               );\r
   }\r
 \r
@@ -1781,10 +1781,10 @@ EraseCursor (
   //\r
   // Convert Monochrome bitmap of the Glyph to BltBuffer structure\r
   //\r
-  for (Y = 0; Y < GLYPH_HEIGHT; Y++) {\r
-    for (X = 0; X < GLYPH_WIDTH; X++) {\r
-      if ((mCursorGlyph.GlyphCol1[Y] & (1 << X)) != 0) {\r
-        BltChar[Y][GLYPH_WIDTH - X - 1].Raw ^= Foreground.Raw;\r
+  for (PosY = 0; PosY < EFI_GLYPH_HEIGHT; PosY++) {\r
+    for (PosX = 0; PosX < EFI_GLYPH_WIDTH; PosX++) {\r
+      if ((mCursorGlyph.GlyphCol1[PosY] & (1 << PosX)) != 0) {\r
+        BltChar[PosY][EFI_GLYPH_WIDTH - PosX - 1].Raw ^= Foreground.Raw;\r
       }\r
     }\r
   }\r
@@ -1798,11 +1798,11 @@ EraseCursor (
               0,\r
               GlyphX,\r
               GlyphY,\r
-              GLYPH_WIDTH,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+              EFI_GLYPH_WIDTH,\r
+              EFI_GLYPH_HEIGHT,\r
+              EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
               );\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     UgaDraw->Blt (\r
               UgaDraw,\r
               (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
@@ -1811,9 +1811,9 @@ EraseCursor (
               0,\r
               GlyphX,\r
               GlyphY,\r
-              GLYPH_WIDTH,\r
-              GLYPH_HEIGHT,\r
-              GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
+              EFI_GLYPH_WIDTH,\r
+              EFI_GLYPH_HEIGHT,\r
+              EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
               );\r
   }\r
 \r
@@ -1823,9 +1823,9 @@ EraseCursor (
 /**\r
   The user Entry Point for module GraphicsConsole. The user code starts with this function.\r
 \r
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  \r
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.\r
   @param[in] SystemTable    A pointer to the EFI System Table.\r
-  \r
+\r
   @retval EFI_SUCCESS       The entry point is executed successfully.\r
   @retval other             Some error occurs when executing this entry point.\r
 \r
@@ -1842,14 +1842,13 @@ InitializeGraphicsConsole (
   //\r
   // Install driver model protocol(s).\r
   //\r
-  Status = EfiLibInstallAllDriverProtocols (\r
+  Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
              SystemTable,\r
              &gGraphicsConsoleDriverBinding,\r
              ImageHandle,\r
              &gGraphicsConsoleComponentName,\r
-             NULL,\r
-             NULL\r
+             &gGraphicsConsoleComponentName2\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -1857,3 +1856,4 @@ InitializeGraphicsConsole (
   return Status;\r
 }\r
 \r
+\r