]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
add some error check and return.
[mirror_edk2.git] / MdeModulePkg / Universal / Console / GraphicsConsoleDxe / GraphicsConsole.c
index 37e816af019f1f721f9244743ba726c248fdf8c9..2cf2f3e64d6b10c729419f6026798f5ee37d66d0 100644 (file)
@@ -5,15 +5,15 @@ Remaining Tasks
   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
+\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
+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
@@ -83,10 +83,14 @@ GRAPHICS_CONSOLE_DEV        mGraphicsConsoleDevTemplate = {
     {  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
 \r
@@ -135,12 +139,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
@@ -152,9 +157,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
@@ -166,9 +170,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
@@ -194,6 +198,7 @@ GraphicsConsoleControllerDriverSupported (
   } else {\r
     goto Error;\r
   }\r
+\r
   //\r
   // Does Hii Exist?  If not, we aren't ready to run\r
   //\r
@@ -210,7 +215,7 @@ Error:
           This->DriverBindingHandle,\r
           Controller\r
           );\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     gBS->CloseProtocol (\r
           Controller,\r
           &gEfiUgaDrawProtocolGuid,\r
@@ -249,8 +254,6 @@ GraphicsConsoleControllerDriverStart (
 {\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
@@ -259,9 +262,13 @@ GraphicsConsoleControllerDriverStart (
   UINTN                                MaxMode;\r
   UINTN                                Columns;\r
   UINTN                                Rows;\r
-  UINT8                                *Location;\r
   UINT32                               ModeNumber;\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
@@ -285,9 +292,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
@@ -296,44 +302,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
@@ -343,13 +349,13 @@ GraphicsConsoleControllerDriverStart (
 \r
   if (Private->GraphicsOutput != NULL) {\r
     //\r
-    // The console is build on top of Graphics Output Protocol, find the mode number \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
     Status = CheckModeSupported (\r
-                 Private->GraphicsOutput, \r
-                 CURRENT_HORIZONTAL_RESOLUTION, \r
+                 Private->GraphicsOutput,\r
+                 CURRENT_HORIZONTAL_RESOLUTION,\r
                  CURRENT_VERTICAL_RESOLUTION,\r
                  &ModeNumber\r
                  );\r
@@ -364,9 +370,9 @@ GraphicsConsoleControllerDriverStart (
       // 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
+                   Private->GraphicsOutput,\r
+                   800,\r
+                   600,\r
                    &ModeNumber\r
                    );\r
     }\r
@@ -379,7 +385,7 @@ GraphicsConsoleControllerDriverStart (
       VerticalResolution = Private->GraphicsOutput->Mode->Info->VerticalResolution;\r
       ModeNumber = Private->GraphicsOutput->Mode->Mode;\r
     }\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     //\r
     // At first try to set user-defined resolution\r
     //\r
@@ -395,7 +401,7 @@ GraphicsConsoleControllerDriverStart (
     if (!EFI_ERROR (Status)) {\r
       HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
       VerticalResolution   = CURRENT_VERTICAL_RESOLUTION;\r
-    } else {\r
+    } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
       //\r
       // Try to set 800*600 which is required by UEFI/EFI spec\r
       //\r
@@ -418,6 +424,9 @@ GraphicsConsoleControllerDriverStart (
           goto Error;\r
         }\r
       }\r
+    } else {\r
+      Status = EFI_UNSUPPORTED;\r
+      goto Error;\r
     }\r
   }\r
 \r
@@ -469,11 +478,11 @@ GraphicsConsoleControllerDriverStart (
     Private->ModeData[MaxMode].DeltaY     = 0;\r
     MaxMode++;\r
   }\r
-  \r
+\r
   //\r
   // Add Mode #2 that must be 100x31 (graphic mode >= 800x600)\r
   //\r
-  if (Columns >= 100 && Rows >= 31) {  \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
@@ -487,7 +496,7 @@ GraphicsConsoleControllerDriverStart (
   //\r
   if (HorizontalResolution > 800 && VerticalResolution > 600) {\r
     Private->ModeData[MaxMode].Columns    = HorizontalResolution/GLYPH_WIDTH;\r
-    Private->ModeData[MaxMode].Rows       = VerticalResolution/GLYPH_HEIGHT;    \r
+    Private->ModeData[MaxMode].Rows       = VerticalResolution/GLYPH_HEIGHT;\r
     Private->ModeData[MaxMode].GopWidth   = HorizontalResolution;\r
     Private->ModeData[MaxMode].GopHeight  = VerticalResolution;\r
     Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
@@ -495,7 +504,7 @@ GraphicsConsoleControllerDriverStart (
     Private->ModeData[MaxMode].DeltaY     = (VerticalResolution % GLYPH_HEIGHT) >> 1;\r
     MaxMode++;\r
   }\r
-    \r
+\r
   //\r
   // Update the maximum number of modes\r
   //\r
@@ -535,7 +544,7 @@ Error:
             This->DriverBindingHandle,\r
             Controller\r
             );\r
-    } else {\r
+    } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
       gBS->CloseProtocol (\r
             Controller,\r
             &gEfiUgaDrawProtocolGuid,\r
@@ -602,7 +611,7 @@ GraphicsConsoleControllerDriverStop (
             This->DriverBindingHandle,\r
             Controller\r
             );\r
-    } else {\r
+    } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
       gBS->CloseProtocol (\r
             Controller,\r
             &gEfiUgaDrawProtocolGuid,\r
@@ -614,7 +623,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
@@ -638,11 +650,11 @@ CheckModeSupported (
 {\r
   UINT32     ModeNumber;\r
   EFI_STATUS Status;\r
-  UINTN      SizeOfInfo;  \r
+  UINTN      SizeOfInfo;\r
   EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
-    \r
+\r
   Status = EFI_SUCCESS;\r
-  \r
+\r
   for (ModeNumber = 0; ModeNumber < GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
     Status = GraphicsOutput->QueryMode (\r
                        GraphicsOutput,\r
@@ -662,13 +674,13 @@ CheckModeSupported (
       gBS->FreePool (Info);\r
     }\r
   }\r
-  \r
+\r
   if (ModeNumber == GraphicsOutput->Mode->MaxMode) {\r
     Status = EFI_UNSUPPORTED;\r
   }\r
-  \r
+\r
   *CurrentModeNumber = ModeNumber;\r
-  return Status; \r
+  return Status;\r
 }\r
 \r
 EFI_STATUS\r
@@ -678,7 +690,7 @@ EfiLocateHiiProtocol (
 /*++\r
 \r
   Routine Description:\r
-    Find if the HII protocol is available. If yes, locate the HII protocol\r
+    Locate HII protocols for future usage.\r
 \r
   Arguments:\r
 \r
@@ -697,10 +709,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
@@ -709,12 +721,22 @@ 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
@@ -726,27 +748,27 @@ GraphicsConsoleConOutReset (
   )\r
 /*++\r
   Routine Description:\r
-  \r
+\r
     Implements SIMPLE_TEXT_OUTPUT.Reset().\r
-    If ExtendeVerification is TRUE, then perform dependent Graphics Console \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
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
-    \r
+\r
     ExtendedVerification - Indicates that the driver may perform a more exhaustive\r
                            verification operation of the device during reset.\r
-        \r
+\r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
-       The reset operation succeeds.   \r
-    \r
+       The reset operation succeeds.\r
+\r
     EFI_DEVICE_ERROR\r
-      The Graphics Console is not functioning correctly \r
-                \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
@@ -761,31 +783,31 @@ GraphicsConsoleConOutOutputString (
   )\r
 /*++\r
   Routine Description:\r
-  \r
+\r
     Implements SIMPLE_TEXT_OUTPUT.OutputString().\r
-    The Unicode string will be converted to Glyphs and will be \r
+    The Unicode string will be converted to Glyphs and will be\r
     sent to the Graphics Console.\r
-    \r
-  \r
+\r
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
-    \r
-    WString - The Null-terminated Unicode string to be displayed on \r
+\r
+    WString - The Null-terminated Unicode string to be displayed on\r
               the Graphics Console.\r
-        \r
+\r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
-       The string is output successfully.   \r
-    \r
+       The string is output successfully.\r
+\r
     EFI_DEVICE_ERROR\r
       The Graphics Console failed to send the string out.\r
-      \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
+      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
@@ -908,7 +930,7 @@ GraphicsConsoleConOutOutputString (
                     GLYPH_HEIGHT,\r
                     Delta\r
                     );\r
-        } else {\r
+        } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
           //\r
           // Scroll Screen Up One Row\r
           //\r
@@ -1065,48 +1087,48 @@ GraphicsConsoleConOutTestString (
   )\r
 /*++\r
   Routine Description:\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
-  \r
+\r
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
-    \r
+\r
     WString - The Null-terminated Unicode string to be tested.\r
-        \r
+\r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
-       The Graphics Console is capable of rendering the output string. \r
-    \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
+      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 = NULL;\r
+\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
@@ -1126,45 +1148,45 @@ GraphicsConsoleConOutQueryMode (
   )\r
 /*++\r
   Routine Description:\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
-  \r
+\r
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
-    \r
+\r
     ModeNumber - The mode number to return information on.\r
-        \r
+\r
     Columns - The returned columns of the requested mode.\r
-        \r
-    Rows - The returned rows of the requested mode.                \r
-        \r
+\r
+    Rows - The returned rows of the requested mode.\r
+\r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
-      The requested mode information is returned. \r
-    \r
+      The requested mode information is returned.\r
+\r
     EFI_UNSUPPORTED\r
-      The mode number is not valid.   \r
-                \r
+      The mode number is not valid.\r
+\r
 --*/\r
 {\r
   GRAPHICS_CONSOLE_DEV  *Private;\r
   EFI_STATUS            Status;\r
   EFI_TPL               OldTpl;\r
-       \r
+\r
   if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \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
@@ -1189,28 +1211,28 @@ GraphicsConsoleConOutSetMode (
   )\r
 /*++\r
   Routine Description:\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
+    In this driver, we only support mode 0.\r
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
-    \r
+\r
     ModeNumber - The text mode to set.\r
-        \r
+\r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
        The requested text mode is set.\r
-       \r
+\r
     EFI_DEVICE_ERROR\r
       The requested text mode cannot be set because of Graphics Console device error.\r
-    \r
+\r
     EFI_UNSUPPORTED\r
-      The text mode number is not valid.       \r
-                \r
+      The text mode number is not valid.\r
+\r
 --*/\r
 {\r
   EFI_STATUS                      Status;\r
@@ -1321,7 +1343,7 @@ GraphicsConsoleConOutSetMode (
                           0\r
                           );\r
     }\r
-  } else {\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     //\r
     // Get the current UGA Draw mode information\r
     //\r
@@ -1393,31 +1415,31 @@ GraphicsConsoleConOutSetAttribute (
   )\r
 /*++\r
   Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.SetAttribute().       \r
-  \r
+\r
+    Implements SIMPLE_TEXT_OUTPUT.SetAttribute().\r
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
-    \r
+\r
     Attrubute - The attribute to set. Only bit0..6 are valid, all other bits\r
                 are undefined and must be zero.\r
-        \r
+\r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
-      The requested attribute is set. \r
-       \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
+\r
     EFI_UNSUPPORTED\r
-      The attribute requested is not defined by EFI spec.   \r
-                \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
@@ -1446,27 +1468,27 @@ GraphicsConsoleConOutClearScreen (
   )\r
 /*++\r
   Routine Description:\r
-  \r
+\r
     Implements SIMPLE_TEXT_OUTPUT.ClearScreen().\r
-    It clears the Graphics Console's display to the \r
+    It clears the Graphics Console's display to the\r
     currently selected background color.\r
-        \r
-  \r
+\r
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
 \r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
       The operation completed successfully.\r
-       \r
+\r
     EFI_DEVICE_ERROR\r
-      The Graphics Console cannot be cleared due to Graphics Console device error.        \r
-    \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
+      The Graphics Console is not in a valid text mode.\r
+\r
 --*/\r
 {\r
   EFI_STATUS                    Status;\r
@@ -1499,7 +1521,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
@@ -1512,6 +1534,8 @@ GraphicsConsoleConOutClearScreen (
                         ModeData->GopHeight,\r
                         0\r
                         );\r
+  } else {\r
+    Status = EFI_UNSUPPORTED;\r
   }\r
 \r
   This->Mode->CursorColumn  = 0;\r
@@ -1533,29 +1557,29 @@ GraphicsConsoleConOutSetCursorPosition (
   )\r
 /*++\r
   Routine Description:\r
-  \r
-    Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition().          \r
-  \r
+\r
+    Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition().\r
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
-        \r
+\r
     Column - The row to set cursor to.\r
-        \r
-    Row - The column to set cursor to.                \r
+\r
+    Row - The column to set cursor to.\r
 \r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
       The operation completed successfully.\r
-       \r
+\r
     EFI_DEVICE_ERROR\r
-      The request fails due to Graphics Console device error.        \r
-    \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
+      is invalid for current mode.\r
+\r
 --*/\r
 {\r
   GRAPHICS_CONSOLE_DEV        *Private;\r
@@ -1601,31 +1625,31 @@ GraphicsConsoleConOutEnableCursor (
   )\r
 /*++\r
   Routine Description:\r
-  \r
+\r
     Implements SIMPLE_TEXT_OUTPUT.EnableCursor().\r
-    In this driver, the cursor cannot be hidden.        \r
-  \r
+    In this driver, the cursor cannot be hidden.\r
+\r
   Arguments:\r
-  \r
+\r
     This - Indicates the calling context.\r
-        \r
+\r
     Visible - If TRUE, the cursor is set to be visible,\r
-              If FALSE, the cursor is set to be invisible.        \r
+              If FALSE, the cursor is set to be invisible.\r
 \r
   Returns:\r
-  \r
+\r
     EFI_SUCCESS\r
       The request is valid.\r
-       \r
+\r
     EFI_UNSUPPORTED\r
-      The Graphics Console does not support a hidden cursor.   \r
-                \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
@@ -1654,147 +1678,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
+  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 * GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                         This->Mode->CursorRow * GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+                         NULL,\r
+                         NULL,\r
+                         NULL\r
+                         );\r
+\r
+  } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+    ASSERT (Private->UgaDraw!= NULL);\r
+\r
+    UgaDraw = Private->UgaDraw;\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 = 0;\r
-\r
-    CopyMem (&GlyphData, Glyph, sizeof (GLYPH_UNION));\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 * GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                          This->Mode->CursorRow * GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+                          &RowInfoArray,\r
+                          &RowInfoArraySize,\r
+                          NULL\r
+                          );\r
 \r
-    do {\r
+    if (!EFI_ERROR (Status)) {\r
       //\r
-      // We are creating the second half of the wide character's BLT buffer\r
+      // Line breaks are handled by caller of DrawUnicodeWeightAtCursorN, so the updated parameter RowInfoArraySize by StringToImage will\r
+      // always be 1. ASSERT here to make sure.\r
       //\r
-      if (GlyphWidth == 0x10 && Counts == 1) {\r
-        CopyMem (&GlyphData.NarrowGlyph.GlyphCol1, &Glyph->WideGlyph.GlyphCol2, sizeof (Glyph->WideGlyph.GlyphCol2));\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
+      ASSERT (RowInfoArraySize == 1);\r
 \r
-      ArrayIndex++;\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 * GLYPH_WIDTH  + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                          (This->Mode->CursorRow) * GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+                          This->Mode->CursorColumn * GLYPH_WIDTH  + Private->ModeData[This->Mode->Mode].DeltaX,\r
+                          (This->Mode->CursorRow) * 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
+\r
 STATIC\r
 EFI_STATUS\r
 EraseCursor (\r
@@ -1844,7 +1847,7 @@ EraseCursor (
               GLYPH_HEIGHT,\r
               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
@@ -1885,7 +1888,7 @@ EraseCursor (
               GLYPH_HEIGHT,\r
               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
@@ -1906,9 +1909,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
@@ -1939,3 +1942,4 @@ InitializeGraphicsConsole (
   return Status;\r
 }\r
 \r
+\r