/** @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
-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
\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
\r
**/\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
- }\r
+ GraphicsOutput = NULL;\r
\r
- *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
- if (*Info == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\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
- *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
-\r
- CopyMem (*Info, &Private->GraphicsOutputModeBuffer[ModeNumber], *SizeOfInfo);\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
return EFI_SUCCESS;\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
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