]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
1. Fixed bugs in DxeNetLib to meet consistence with network module DriverBinding...
[mirror_edk2.git] / MdeModulePkg / Universal / Console / GraphicsConsoleDxe / GraphicsConsole.c
index ee96eabdd6a0fea6e3596e39f09bf7cd0ab99c17..0f83803a3793c16213af4ca28dabc1b3f15d2e7d 100644 (file)
@@ -41,6 +41,14 @@ EraseCursor (
   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,8 +78,9 @@ 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
@@ -238,22 +247,20 @@ GraphicsConsoleControllerDriverStart (
 \r
 --*/\r
 {\r
-  EFI_STATUS            Status;\r
-  GRAPHICS_CONSOLE_DEV  *Private;\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
+  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
   UINT32                               ModeNumber;\r
-  UINTN                                SizeOfInfo;\r
-  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
   \r
   ModeNumber = 0;\r
 \r
@@ -336,26 +343,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
@@ -368,30 +381,42 @@ GraphicsConsoleControllerDriverStart (
     }\r
   } else {\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 {\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
     }\r
   }\r
@@ -430,31 +455,47 @@ GraphicsConsoleControllerDriverStart (
     Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (50 * 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 * GLYPH_WIDTH)) >> 1;\r
+    Private->ModeData[MaxMode].DeltaY     = (VerticalResolution - (31 * 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/GLYPH_WIDTH;\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
-    Private->ModeData[MaxMode].DeltaX     = (800 % GLYPH_WIDTH) >> 1;\r
-    Private->ModeData[MaxMode].DeltaY     = (600 % GLYPH_HEIGHT) >> 1;\r
+    Private->ModeData[MaxMode].DeltaX     = (HorizontalResolution % GLYPH_WIDTH) >> 1;\r
+    Private->ModeData[MaxMode].DeltaY     = (VerticalResolution % GLYPH_HEIGHT) >> 1;\r
     MaxMode++;\r
   }\r
+    \r
   //\r
   // Update the maximum number of modes\r
   //\r
@@ -587,6 +628,49 @@ GraphicsConsoleControllerDriverStop (
   return Status;\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
+  UINT32     ModeNumber;\r
+  EFI_STATUS Status;\r
+  UINTN      SizeOfInfo;  \r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+    \r
+  Status = EFI_SUCCESS;\r
+  \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
 EFI_STATUS\r
 EfiLocateHiiProtocol (\r
   VOID\r