/** @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
@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
)\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
//\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
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
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
\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
);\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