]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c
MdeModulePkg/AtaAtapiPassThru: Revert patch to disable Bus Master
[mirror_edk2.git] / MdeModulePkg / Universal / Console / ConSplitterDxe / ConSplitterGraphics.c
index 5b11f2114b211e37a7e9987ec2b78491018bdbe8..b7cdd7af39c003d5075852d13bf5f076e1e7ab73 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   Support for Graphics output spliter.\r
   \r
-Copyright (c) 2006 - 2010, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+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
@@ -30,7 +30,6 @@ CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };
   @retval EFI_SUCCESS           Mode information returned.\r
   @retval EFI_BUFFER_TOO_SMALL  The Info buffer was too small.\r
   @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve the video mode.\r
-  @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()\r
   @retval EFI_INVALID_PARAMETER One of the input args was NULL.\r
   @retval EFI_OUT_OF_RESOURCES  No resource available.\r
 \r
@@ -45,6 +44,9 @@ ConSplitterGraphicsOutputQueryMode (
   )\r
 {\r
   TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL    *GraphicsOutput;\r
+  EFI_STATUS                      Status;\r
+  UINTN                           Index;\r
 \r
   if (This == NULL || Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -55,19 +57,39 @@ ConSplitterGraphicsOutputQueryMode (
   //\r
   Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
 \r
-  if (Private->HardwareNeedsStarting) {\r
-    return EFI_NOT_STARTED;\r
+  GraphicsOutput = NULL;\r
+  \r
+  if (Private->CurrentNumberOfGraphicsOutput == 1) {\r
+    //\r
+    // Find the only one GraphicsOutput.\r
+    //\r
+    for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
+      GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
+      if (GraphicsOutput != NULL) {\r
+        break;\r
+      }\r
+    }\r
   }\r
-\r
-  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
-  if (*Info == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+  \r
+  if (GraphicsOutput != NULL) {\r
+    //\r
+    // If only one physical GOP device exist, return its information.\r
+    //\r
+    Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) ModeNumber, SizeOfInfo, Info);\r
+    return Status;\r
+  } else {\r
+    //\r
+    // If 2 more phyiscal GOP device exist or GOP protocol does not exist, \r
+    // return GOP information (PixelFormat is PixelBltOnly) created in ConSplitterAddGraphicsOutputMode ().\r
+    //\r
+    *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+    if (*Info == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+    CopyMem (*Info, &Private->GraphicsOutputModeBuffer[ModeNumber], *SizeOfInfo);\r
   }\r
 \r
-  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
-\r
-  CopyMem (*Info, &Private->GraphicsOutputModeBuffer[ModeNumber], *SizeOfInfo);\r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -98,6 +120,7 @@ ConSplitterGraphicsOutputSetMode (
   EFI_STATUS                             ReturnStatus;\r
   EFI_GRAPHICS_OUTPUT_MODE_INFORMATION   *Mode;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL           *GraphicsOutput;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL           *PhysicalGraphicsOutput;\r
   UINTN                                  NumberIndex;\r
   UINTN                                  SizeOfInfo;\r
   EFI_GRAPHICS_OUTPUT_MODE_INFORMATION   *Info;\r
@@ -111,12 +134,15 @@ ConSplitterGraphicsOutputSetMode (
   Mode = &Private->GraphicsOutputModeBuffer[ModeNumber];\r
 \r
   ReturnStatus = EFI_SUCCESS;\r
+  GraphicsOutput = NULL;\r
+  PhysicalGraphicsOutput = NULL;\r
   //\r
   // return the worst status met\r
   //\r
   for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
     GraphicsOutput = Private->TextOutList[Index].GraphicsOutput;\r
     if (GraphicsOutput != NULL) {\r
+      PhysicalGraphicsOutput = GraphicsOutput;\r
       //\r
       // Find corresponding ModeNumber of this GraphicsOutput instance\r
       //\r
@@ -155,16 +181,21 @@ ConSplitterGraphicsOutputSetMode (
 \r
   This->Mode->Mode = ModeNumber;\r
 \r
-  CopyMem (This->Mode->Info, &Private->GraphicsOutputModeBuffer[ModeNumber], This->Mode->SizeOfInfo);\r
-\r
-  //\r
-  // Information is not enough here, so the following items remain unchanged:\r
-  //  GraphicsOutputMode->Info->Version, GraphicsOutputMode->Info->PixelFormat\r
-  //  GraphicsOutputMode->SizeOfInfo, GraphicsOutputMode->FrameBufferBase, GraphicsOutputMode->FrameBufferSize\r
-  // These items will be initialized/updated when a new GOP device is added into ConsoleSplitter.\r
-  //\r
-\r
-  Private->HardwareNeedsStarting = FALSE;\r
+  if ((Private->CurrentNumberOfGraphicsOutput == 1) && (PhysicalGraphicsOutput != NULL)) {\r
+    //\r
+    // If only one physical GOP device exist, copy physical information to consplitter.\r
+    //\r
+    CopyMem (This->Mode->Info, PhysicalGraphicsOutput->Mode->Info, PhysicalGraphicsOutput->Mode->SizeOfInfo);\r
+    This->Mode->SizeOfInfo = PhysicalGraphicsOutput->Mode->SizeOfInfo;\r
+    This->Mode->FrameBufferBase = PhysicalGraphicsOutput->Mode->FrameBufferBase;\r
+    This->Mode->FrameBufferSize = PhysicalGraphicsOutput->Mode->FrameBufferSize;\r
+  } else {\r
+    //\r
+    // If 2 more phyiscal GOP device exist or GOP protocol does not exist, \r
+    // return GOP information (PixelFormat is PixelBltOnly) created in ConSplitterAddGraphicsOutputMode ().\r
+    //\r
+    CopyMem (This->Mode->Info, &Private->GraphicsOutputModeBuffer[ModeNumber], This->Mode->SizeOfInfo);\r
+  }\r
 \r
   return ReturnStatus;\r
 }\r
@@ -535,7 +566,7 @@ ConSplitterUgaDrawBlt (
                               );\r
       if (EFI_ERROR (Status)) {\r
         ReturnStatus = Status;\r
-      } else if (BltOperation == EfiBltVideoToBltBuffer) {\r
+      } else if (BltOperation == EfiUgaVideoToBltBuffer) {\r
         //\r
         // Only need to read the data into buffer one time\r
         //\r