/** @file\r
Support for Graphics output spliter.\r
\r
-Copyright (c) 2006 - 2009, 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
EFI_STATUS\r
EFIAPI\r
-ConSpliterGraphicsOutputQueryMode (\r
+ConSplitterGraphicsOutputQueryMode (\r
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
IN UINT32 ModeNumber,\r
OUT UINTN *SizeOfInfo,\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
**/\r
EFI_STATUS\r
EFIAPI\r
-ConSpliterGraphicsOutputSetMode (\r
+ConSplitterGraphicsOutputSetMode (\r
IN EFI_GRAPHICS_OUTPUT_PROTOCOL * This,\r
IN UINT32 ModeNumber\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
return EFI_UNSUPPORTED;\r
}\r
\r
- if (ModeNumber == This->Mode->Mode) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\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
EFI_STATUS\r
EFIAPI\r
-ConSpliterGraphicsOutputBlt (\r
+ConSplitterGraphicsOutputBlt (\r
IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL\r
IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,\r
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
\r
+ if (This == NULL || ((UINTN) BltOperation) >= EfiGraphicsOutputBltOperationMax) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
Private = GRAPHICS_OUTPUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
\r
ReturnStatus = EFI_SUCCESS;\r
**/\r
EFI_STATUS\r
EFIAPI\r
-ConSpliterUgaDrawGetMode (\r
+ConSplitterUgaDrawGetMode (\r
IN EFI_UGA_DRAW_PROTOCOL *This,\r
OUT UINT32 *HorizontalResolution,\r
OUT UINT32 *VerticalResolution,\r
**/\r
EFI_STATUS\r
EFIAPI\r
-ConSpliterUgaDrawSetMode (\r
+ConSplitterUgaDrawSetMode (\r
IN EFI_UGA_DRAW_PROTOCOL *This,\r
IN UINT32 HorizontalResolution,\r
IN UINT32 VerticalResolution,\r
**/\r
EFI_STATUS\r
EFIAPI\r
-ConSpliterUgaDrawBlt (\r
+ConSplitterUgaDrawBlt (\r
IN EFI_UGA_DRAW_PROTOCOL *This,\r
IN EFI_UGA_PIXEL *BltBuffer, OPTIONAL\r
IN EFI_UGA_BLT_OPERATION BltOperation,\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