]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
1. Add PcdConOutGopSupport and PcdConOutUgaSupport in MdeModulePkg.dec
[mirror_edk2.git] / MdeModulePkg / Universal / Console / ConSplitterDxe / ConSplitter.c
index bfd50bd59d127d9644f453588e1a60e2df7ac4aa..d6c3abd9e245517b0abc4134eee9d2e2111de9ea 100644 (file)
@@ -104,6 +104,16 @@ STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = {
     0,\r
     FALSE,\r
   },\r
+  {\r
+    ConSpliterUgaDrawGetMode,\r
+    ConSpliterUgaDrawSetMode,\r
+    ConSpliterUgaDrawBlt\r
+  },\r
+  0,\r
+  0,\r
+  0,\r
+  0,\r
+  (EFI_UGA_PIXEL *) NULL,\r
   {\r
     ConSpliterGraphicsOutputQueryMode,\r
     ConSpliterGraphicsOutputSetMode,\r
@@ -157,6 +167,16 @@ STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = {
     0,\r
     FALSE,\r
   },\r
+  {\r
+    ConSpliterUgaDrawGetMode,\r
+    ConSpliterUgaDrawSetMode,\r
+    ConSpliterUgaDrawBlt\r
+  },\r
+  0,\r
+  0,\r
+  0,\r
+  0,\r
+  (EFI_UGA_PIXEL *) NULL,\r
   {\r
     ConSpliterGraphicsOutputQueryMode,\r
     ConSpliterGraphicsOutputSetMode,\r
@@ -226,9 +246,9 @@ EFI_DRIVER_BINDING_PROTOCOL           gConSplitterStdErrDriverBinding = {
 /**\r
   The user Entry Point for module ConSplitter. 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
@@ -317,6 +337,8 @@ Returns:
 {\r
   EFI_STATUS  Status;\r
 \r
+  ASSERT (FeaturePcdGet (PcdConOutGopSupport) ||\r
+          FeaturePcdGet (PcdConOutUgaSupport));\r
   //\r
   // The driver creates virtual handles for ConIn, ConOut, and StdErr.\r
   // The virtual handles will always exist even if no console exist in the\r
@@ -364,21 +386,58 @@ Returns:
   //\r
   Status = ConSplitterTextOutConstructor (&mConOut);\r
   if (!EFI_ERROR (Status)) {\r
-    //\r
-    // In UEFI mode, Graphics Output Protocol is installed on virtual handle.\r
-    //\r
-    Status = gBS->InstallMultipleProtocolInterfaces (\r
-                    &mConOut.VirtualHandle,\r
-                    &gEfiSimpleTextOutProtocolGuid,\r
-                    &mConOut.TextOut,\r
-                    &gEfiGraphicsOutputProtocolGuid,\r
-                    &mConOut.GraphicsOutput,\r
-                    &gEfiConsoleControlProtocolGuid,\r
-                    &mConOut.ConsoleControl,\r
-                    &gEfiPrimaryConsoleOutDeviceGuid,\r
-                    NULL,\r
-                    NULL\r
-                    );\r
+    if (!FeaturePcdGet (PcdConOutGopSupport)) {\r
+      //\r
+      // In EFI mode, UGA Draw protocol is installed\r
+      //\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mConOut.VirtualHandle,\r
+                      &gEfiSimpleTextOutProtocolGuid,\r
+                      &mConOut.TextOut,\r
+                      &gEfiUgaDrawProtocolGuid,\r
+                      &mConOut.UgaDraw,\r
+                      &gEfiConsoleControlProtocolGuid,\r
+                      &mConOut.ConsoleControl,\r
+                      &gEfiPrimaryConsoleOutDeviceGuid,\r
+                      NULL,\r
+                      NULL\r
+                      );\r
+    } else if (!FeaturePcdGet (PcdConOutUgaSupport)) {\r
+      //\r
+      // In UEFI mode, Graphics Output Protocol is installed on virtual handle.\r
+      //\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mConOut.VirtualHandle,\r
+                      &gEfiSimpleTextOutProtocolGuid,\r
+                      &mConOut.TextOut,\r
+                      &gEfiGraphicsOutputProtocolGuid,\r
+                      &mConOut.GraphicsOutput,\r
+                      &gEfiConsoleControlProtocolGuid,\r
+                      &mConOut.ConsoleControl,\r
+                      &gEfiPrimaryConsoleOutDeviceGuid,\r
+                      NULL,\r
+                      NULL\r
+                      );\r
+    } else {\r
+      //\r
+      // In EFI and UEFI comptible mode, Graphics Output Protocol and UGA are\r
+      // installed on virtual handle.\r
+      //\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mConOut.VirtualHandle,\r
+                      &gEfiSimpleTextOutProtocolGuid,\r
+                      &mConOut.TextOut,\r
+                      &gEfiGraphicsOutputProtocolGuid,\r
+                      &mConOut.GraphicsOutput,\r
+                      &gEfiUgaDrawProtocolGuid,\r
+                      &mConOut.UgaDraw,\r
+                      &gEfiConsoleControlProtocolGuid,\r
+                      &mConOut.ConsoleControl,\r
+                      &gEfiPrimaryConsoleOutDeviceGuid,\r
+                      NULL,\r
+                      NULL\r
+                      );\r
+    }\r
 \r
     if (!EFI_ERROR (Status)) {\r
       //\r
@@ -513,41 +572,49 @@ ConSplitterTextOutConstructor (
   ConOutPrivate->TextOutQueryData[0].Rows     = 25;\r
   DevNullTextOutSetMode (ConOutPrivate, 0);\r
 \r
-  //\r
-  // Setup resource for mode information in Graphics Output Protocol interface\r
-  //\r
-  if ((ConOutPrivate->GraphicsOutput.Mode = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE))) == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  if ((ConOutPrivate->GraphicsOutput.Mode->Info = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION))) == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // Setup the DevNullGraphicsOutput to 800 x 600 x 32 bits per pixel\r
-  //\r
-  if ((ConOutPrivate->GraphicsOutputModeBuffer = AllocateZeroPool (sizeof (TEXT_OUT_GOP_MODE))) == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+  if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
+    //\r
+    // Setup the DevNullUgaDraw to 800 x 600 x 32 bits per pixel\r
+    //\r
+    ConSpliterUgaDrawSetMode (&ConOutPrivate->UgaDraw, 800, 600, 32, 60);\r
   }\r
-  ConOutPrivate->GraphicsOutputModeBuffer[0].HorizontalResolution = 800;\r
-  ConOutPrivate->GraphicsOutputModeBuffer[0].VerticalResolution = 600;\r
+  if (FeaturePcdGet (PcdConOutGopSupport)) {\r
+    //\r
+    // Setup resource for mode information in Graphics Output Protocol interface\r
+    //\r
+    if ((ConOutPrivate->GraphicsOutput.Mode = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE))) == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    if ((ConOutPrivate->GraphicsOutput.Mode->Info = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION))) == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    //\r
+    // Setup the DevNullGraphicsOutput to 800 x 600 x 32 bits per pixel\r
+    //\r
+    if ((ConOutPrivate->GraphicsOutputModeBuffer = AllocateZeroPool (sizeof (TEXT_OUT_GOP_MODE))) == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    ConOutPrivate->GraphicsOutputModeBuffer[0].HorizontalResolution = 800;\r
+    ConOutPrivate->GraphicsOutputModeBuffer[0].VerticalResolution = 600;\r
 \r
-  //\r
-  // Initialize the following items, theset items remain unchanged in GraphicsOutput->SetMode()\r
-  //  GraphicsOutputMode->Info->Version, GraphicsOutputMode->Info->PixelFormat\r
-  //  GraphicsOutputMode->SizeOfInfo, GraphicsOutputMode->FrameBufferBase, GraphicsOutputMode->FrameBufferSize\r
-  //\r
-  ConOutPrivate->GraphicsOutput.Mode->Info->Version = 0;\r
-  ConOutPrivate->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;\r
-  ConOutPrivate->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
-  ConOutPrivate->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) NULL;\r
-  ConOutPrivate->GraphicsOutput.Mode->FrameBufferSize = 0;\r
+    //\r
+    // Initialize the following items, theset items remain unchanged in GraphicsOutput->SetMode()\r
+    //  GraphicsOutputMode->Info->Version, GraphicsOutputMode->Info->PixelFormat\r
+    //  GraphicsOutputMode->SizeOfInfo, GraphicsOutputMode->FrameBufferBase, GraphicsOutputMode->FrameBufferSize\r
+    //\r
+    ConOutPrivate->GraphicsOutput.Mode->Info->Version = 0;\r
+    ConOutPrivate->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;\r
+    ConOutPrivate->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+    ConOutPrivate->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) NULL;\r
+    ConOutPrivate->GraphicsOutput.Mode->FrameBufferSize = 0;\r
 \r
-  ConOutPrivate->GraphicsOutput.Mode->MaxMode = 1;\r
-  //\r
-  // Initial current mode to unknow state, and then set to mode 0\r
-  //\r
-  ConOutPrivate->GraphicsOutput.Mode->Mode = 0xffff;\r
-  ConOutPrivate->GraphicsOutput.SetMode (&ConOutPrivate->GraphicsOutput, 0);\r
+    ConOutPrivate->GraphicsOutput.Mode->MaxMode = 1;\r
+    //\r
+    // Initial current mode to unknow state, and then set to mode 0\r
+    //\r
+    ConOutPrivate->GraphicsOutput.Mode->Mode = 0xffff;\r
+    ConOutPrivate->GraphicsOutput.SetMode (&ConOutPrivate->GraphicsOutput, 0);\r
+  }\r
 \r
   return Status;\r
 }\r
@@ -967,6 +1034,20 @@ Returns:
   Status = ConSplitterTextOutAddDevice (&mConOut, TextOut, GraphicsOutput, UgaDraw);\r
   ConSplitterTextOutSetAttribute (&mConOut.TextOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
 \r
+  if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
+    //\r
+    // Match the UGA mode data of ConOut with the current mode\r
+    //\r
+    if (UgaDraw != NULL) {\r
+      UgaDraw->GetMode (\r
+                 UgaDraw,\r
+                 &mConOut.UgaHorizontalResolution,\r
+                 &mConOut.UgaVerticalResolution,\r
+                 &mConOut.UgaColorDepth,\r
+                 &mConOut.UgaRefreshRate\r
+                 );\r
+    }\r
+  }\r
   return Status;\r
 }\r
 \r
@@ -2211,15 +2292,21 @@ Returns:
   MaxMode     = Private->TextOutMode.MaxMode;\r
   ASSERT (MaxMode >= 1);\r
 \r
-  if ((GraphicsOutput != NULL) || (UgaDraw != NULL)) {\r
-    ConSplitterAddGraphicsOutputMode (Private, GraphicsOutput, UgaDraw);\r
+  if (FeaturePcdGet (PcdConOutGopSupport)) {\r
+    if ((GraphicsOutput != NULL) || (UgaDraw != NULL)) {\r
+      ConSplitterAddGraphicsOutputMode (Private, GraphicsOutput, UgaDraw);\r
+    }\r
   }\r
 \r
   if (Private->ConsoleOutputMode == EfiConsoleControlScreenGraphics && GraphicsOutput != NULL) {\r
     //\r
     // We just added a new UGA device in graphics mode\r
     //\r
-    DevNullGopSync (Private, GraphicsOutput, UgaDraw);\r
+    if (FeaturePcdGet (PcdConOutGopSupport)) {\r
+      DevNullGopSync (Private, TextAndGop->GraphicsOutput, TextAndGop->UgaDraw);\r
+    } else if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
+      DevNullUgaSync (Private, TextAndGop->GraphicsOutput, TextAndGop->UgaDraw);\r
+    }\r
   } else if ((CurrentMode >= 0) && ((GraphicsOutput != NULL) || (UgaDraw != NULL)) && (CurrentMode < Private->TextOutMode.MaxMode)) {\r
     //\r
     // The new console supports the same mode of the current console so sync up\r