]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix Consplitter GOP UEFI SCT issue.
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 21 Aug 2012 01:35:43 +0000 (01:35 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 21 Aug 2012 01:35:43 +0000 (01:35 +0000)
Signed-off-by: Li Elvin <elvin.li@intel.com>
Reviewed-by: Ni Ruiyu <ruiyu.ni@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13651 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c

index 89cef729e9b455d6630e2f4c1107e1bd7a88da42..f57aefeb7acd238964f838a33659cf03d6ae2368 100644 (file)
@@ -44,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
@@ -54,14 +57,38 @@ ConSplitterGraphicsOutputQueryMode (
   //\r
   Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
 \r
-  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
-  if (*Info == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\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
+  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
@@ -106,6 +133,7 @@ ConSplitterGraphicsOutputSetMode (
   Mode = &Private->GraphicsOutputModeBuffer[ModeNumber];\r
 \r
   ReturnStatus = EFI_SUCCESS;\r
+  GraphicsOutput = NULL;\r
   //\r
   // return the worst status met\r
   //\r
@@ -150,14 +178,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
+  if ((Private->CurrentNumberOfGraphicsOutput == 1) && (GraphicsOutput != NULL)) {\r
+    //\r
+    // If only one physical GOP device exist, copy physical information to consplitter.\r
+    //\r
+    CopyMem (This->Mode->Info, GraphicsOutput->Mode->Info, GraphicsOutput->Mode->SizeOfInfo);\r
+    This->Mode->SizeOfInfo = GraphicsOutput->Mode->SizeOfInfo;\r
+    This->Mode->FrameBufferBase = GraphicsOutput->Mode->FrameBufferBase;\r
+    This->Mode->FrameBufferSize = GraphicsOutput->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