/** @file\r
This is the main routine for initializing the Graphics Console support routines.\r
\r
-Copyright (c) 2006 - 2010, 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
-\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 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
},\r
{\r
0,\r
- 0,\r
+ -1,\r
EFI_TEXT_ATTR(EFI_LIGHTGRAY, EFI_BLACK),\r
0,\r
0,\r
TRUE\r
},\r
- {\r
- { 80, 25, 0, 0, 0, 0 }, // Mode 0\r
- { 80, 50, 0, 0, 0, 0 }, // Mode 1\r
- { 100,31, 0, 0, 0, 0 }, // Mode 2\r
- { 0, 0, 0, 0, 0, 0 } // Mode 3\r
- },\r
+ (GRAPHICS_CONSOLE_MODE_DATA *) NULL,\r
(EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL\r
};\r
\r
+GRAPHICS_CONSOLE_MODE_DATA mGraphicsConsoleModeData[] = {\r
+ {100, 31},\r
+ //\r
+ // New modes can be added here.\r
+ // The last entry is specific for full screen mode.\r
+ //\r
+ {0, 0}\r
+};\r
+\r
EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
EFI_HII_FONT_PROTOCOL *mHiiFont;\r
EFI_HII_HANDLE mHiiHandle;\r
-EFI_EVENT mHiiRegistration;\r
+VOID *mHiiRegistration;\r
\r
EFI_GUID mFontPackageListGuid = {0xf5f219d3, 0x7006, 0x4648, {0xac, 0x8d, 0xd6, 0x1d, 0xfb, 0x7b, 0xc6, 0xad}};\r
\r
return Status;\r
}\r
\r
+/**\r
+ Initialize all the text modes which the graphics console supports.\r
+\r
+ It returns information for available text modes that the graphics can support.\r
+\r
+ @param[in] HorizontalResolution The size of video screen in pixels in the X dimension.\r
+ @param[in] VerticalResolution The size of video screen in pixels in the Y dimension.\r
+ @param[in] GopModeNumber The graphics mode number which graphis console is based on.\r
+ @param[out] TextModeCount The total number of text modes that graphics console supports.\r
+ @param[out] TextModeData The buffer to the text modes column and row information.\r
+ Caller is responsible to free it when it's non-NULL.\r
+\r
+ @retval EFI_SUCCESS The supporting mode information is returned.\r
+ @retval EFI_INVALID_PARAMETER The parameters are invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+InitializeGraphicsConsoleTextMode (\r
+ IN UINT32 HorizontalResolution,\r
+ IN UINT32 VerticalResolution,\r
+ IN UINT32 GopModeNumber,\r
+ OUT UINTN *TextModeCount,\r
+ OUT GRAPHICS_CONSOLE_MODE_DATA **TextModeData\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINTN Count;\r
+ GRAPHICS_CONSOLE_MODE_DATA *ModeBuffer;\r
+ GRAPHICS_CONSOLE_MODE_DATA *NewModeBuffer;\r
+ UINTN ValidCount;\r
+ UINTN ValidIndex;\r
+ UINTN MaxColumns;\r
+ UINTN MaxRows;\r
+\r
+ if ((TextModeCount == NULL) || (TextModeData == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Count = sizeof (mGraphicsConsoleModeData) / sizeof (GRAPHICS_CONSOLE_MODE_DATA);\r
+\r
+ //\r
+ // Compute the maximum number of text Rows and Columns that this current graphics mode can support.\r
+ // To make graphics console work well, MaxColumns and MaxRows should not be zero.\r
+ //\r
+ MaxColumns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
+ MaxRows = VerticalResolution / EFI_GLYPH_HEIGHT;\r
+\r
+ //\r
+ // According to UEFI spec, all output devices support at least 80x25 text mode.\r
+ //\r
+ ASSERT ((MaxColumns >= 80) && (MaxRows >= 25));\r
+\r
+ //\r
+ // Add full screen mode to the last entry.\r
+ //\r
+ mGraphicsConsoleModeData[Count - 1].Columns = MaxColumns;\r
+ mGraphicsConsoleModeData[Count - 1].Rows = MaxRows;\r
+\r
+ //\r
+ // Get defined mode buffer pointer.\r
+ //\r
+ ModeBuffer = mGraphicsConsoleModeData;\r
+\r
+ //\r
+ // Here we make sure that the final mode exposed does not include the duplicated modes,\r
+ // and does not include the invalid modes which exceed the max column and row.\r
+ // Reserve 2 modes for 80x25, 80x50 of graphics console.\r
+ //\r
+ NewModeBuffer = AllocateZeroPool (sizeof (GRAPHICS_CONSOLE_MODE_DATA) * (Count + 2));\r
+ ASSERT (NewModeBuffer != NULL);\r
+\r
+ //\r
+ // Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec.\r
+ //\r
+ ValidCount = 0;\r
+\r
+ NewModeBuffer[ValidCount].Columns = 80;\r
+ NewModeBuffer[ValidCount].Rows = 25;\r
+ NewModeBuffer[ValidCount].GopWidth = HorizontalResolution;\r
+ NewModeBuffer[ValidCount].GopHeight = VerticalResolution;\r
+ NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;\r
+ NewModeBuffer[ValidCount].DeltaX = (HorizontalResolution - (NewModeBuffer[ValidCount].Columns * EFI_GLYPH_WIDTH)) >> 1;\r
+ NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (NewModeBuffer[ValidCount].Rows * EFI_GLYPH_HEIGHT)) >> 1;\r
+ ValidCount++;\r
+\r
+ if ((MaxColumns >= 80) && (MaxRows >= 50)) {\r
+ NewModeBuffer[ValidCount].Columns = 80;\r
+ NewModeBuffer[ValidCount].Rows = 50;\r
+ NewModeBuffer[ValidCount].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
+ NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1;\r
+ }\r
+ NewModeBuffer[ValidCount].GopWidth = HorizontalResolution;\r
+ NewModeBuffer[ValidCount].GopHeight = VerticalResolution;\r
+ NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;\r
+ ValidCount++;\r
+\r
+ //\r
+ // Start from mode 2 to put the valid mode other than 80x25 and 80x50 in the output mode buffer.\r
+ //\r
+ for (Index = 0; Index < Count; Index++) {\r
+ if ((ModeBuffer[Index].Columns == 0) || (ModeBuffer[Index].Rows == 0) ||\r
+ (ModeBuffer[Index].Columns > MaxColumns) || (ModeBuffer[Index].Rows > MaxRows)) {\r
+ //\r
+ // Skip the pre-defined mode which is invalid or exceeds the max column and row.\r
+ //\r
+ continue;\r
+ }\r
+ for (ValidIndex = 0; ValidIndex < ValidCount; ValidIndex++) {\r
+ if ((ModeBuffer[Index].Columns == NewModeBuffer[ValidIndex].Columns) &&\r
+ (ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) {\r
+ //\r
+ // Skip the duplicated mode.\r
+ //\r
+ break;\r
+ }\r
+ }\r
+ if (ValidIndex == ValidCount) {\r
+ NewModeBuffer[ValidCount].Columns = ModeBuffer[Index].Columns;\r
+ NewModeBuffer[ValidCount].Rows = ModeBuffer[Index].Rows;\r
+ NewModeBuffer[ValidCount].GopWidth = HorizontalResolution;\r
+ NewModeBuffer[ValidCount].GopHeight = VerticalResolution;\r
+ NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;\r
+ NewModeBuffer[ValidCount].DeltaX = (HorizontalResolution - (NewModeBuffer[ValidCount].Columns * EFI_GLYPH_WIDTH)) >> 1;\r
+ NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (NewModeBuffer[ValidCount].Rows * EFI_GLYPH_HEIGHT)) >> 1;\r
+ ValidCount++;\r
+ }\r
+ }\r
+\r
+ DEBUG_CODE (\r
+ for (Index = 0; Index < ValidCount; Index++) {\r
+ DEBUG ((EFI_D_INFO, "Graphics - Mode %d, Column = %d, Row = %d\n",\r
+ Index, NewModeBuffer[Index].Columns, NewModeBuffer[Index].Rows));\r
+ }\r
+ );\r
+\r
+ //\r
+ // Return valid mode count and mode information buffer.\r
+ //\r
+ *TextModeCount = ValidCount;\r
+ *TextModeData = NewModeBuffer;\r
+ return EFI_SUCCESS;\r
+}\r
\r
/**\r
Start this driver on Controller by opening Graphics Output protocol or\r
UINT32 VerticalResolution;\r
UINT32 ColorDepth;\r
UINT32 RefreshRate;\r
+ UINT32 ModeIndex;\r
UINTN MaxMode;\r
- UINTN Columns;\r
- UINTN Rows;\r
UINT32 ModeNumber;\r
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;\r
+ UINTN SizeOfInfo;\r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+ INT32 PreferMode;\r
+ INT32 Index;\r
+ UINTN Column;\r
+ UINTN Row;\r
+ UINTN DefaultColumn;\r
+ UINTN DefaultRow;\r
+\r
ModeNumber = 0;\r
\r
//\r
goto Error;\r
}\r
\r
- //\r
- // If the current mode information can not be retrieved, then attempt to set the default mode\r
- // of 800x600, 32 bit color, 60 Hz refresh.\r
- //\r
- HorizontalResolution = 800;\r
- VerticalResolution = 600;\r
+ HorizontalResolution = PcdGet32 (PcdVideoHorizontalResolution);\r
+ VerticalResolution = PcdGet32 (PcdVideoVerticalResolution);\r
\r
if (Private->GraphicsOutput != NULL) {\r
//\r
// for the user-defined mode; if there are multiple video devices,\r
// graphic console driver will set all the video devices to the same mode.\r
//\r
- Status = CheckModeSupported (\r
- Private->GraphicsOutput,\r
- CURRENT_HORIZONTAL_RESOLUTION,\r
- CURRENT_VERTICAL_RESOLUTION,\r
- &ModeNumber\r
- );\r
- if (!EFI_ERROR(Status)) {\r
+ if ((HorizontalResolution == 0x0) || (VerticalResolution == 0x0)) {\r
//\r
- // Update default mode to current mode\r
+ // Find the highest resolution which GOP supports.\r
//\r
- HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
- VerticalResolution = CURRENT_VERTICAL_RESOLUTION;\r
+ MaxMode = Private->GraphicsOutput->Mode->MaxMode;\r
+\r
+ for (ModeIndex = 0; ModeIndex < MaxMode; ModeIndex++) {\r
+ Status = Private->GraphicsOutput->QueryMode (\r
+ Private->GraphicsOutput,\r
+ ModeIndex,\r
+ &SizeOfInfo,\r
+ &Info\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((Info->HorizontalResolution > HorizontalResolution) ||\r
+ ((Info->HorizontalResolution == HorizontalResolution) && (Info->VerticalResolution > VerticalResolution))) {\r
+ HorizontalResolution = Info->HorizontalResolution;\r
+ VerticalResolution = Info->VerticalResolution;\r
+ ModeNumber = ModeIndex;\r
+ }\r
+ FreePool (Info);\r
+ }\r
+ }\r
+ if ((HorizontalResolution == 0x0) || (VerticalResolution == 0x0)) {\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Error;\r
+ }\r
} else {\r
//\r
- // if not supporting current mode, try 800x600 which is required by UEFI/EFI spec\r
+ // Use user-defined resolution\r
//\r
Status = CheckModeSupported (\r
Private->GraphicsOutput,\r
- 800,\r
- 600,\r
+ HorizontalResolution,\r
+ VerticalResolution,\r
&ModeNumber\r
);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // if not supporting current mode, try 800x600 which is required by UEFI/EFI spec\r
+ //\r
+ HorizontalResolution = 800;\r
+ VerticalResolution = 600;\r
+ Status = CheckModeSupported (\r
+ Private->GraphicsOutput,\r
+ HorizontalResolution,\r
+ VerticalResolution,\r
+ &ModeNumber\r
+ );\r
+ Mode = Private->GraphicsOutput->Mode;\r
+ if (EFI_ERROR (Status) && Mode->MaxMode != 0) {\r
+ //\r
+ // Set default mode failed or device don't support default mode, then get the current mode information\r
+ //\r
+ HorizontalResolution = Mode->Info->HorizontalResolution;\r
+ VerticalResolution = Mode->Info->VerticalResolution;\r
+ ModeNumber = Mode->Mode;\r
+ }\r
+ }\r
}\r
-\r
- Mode = Private->GraphicsOutput->Mode;\r
-\r
- if (EFI_ERROR (Status) || (Mode->MaxMode != 0)) {\r
+ if (ModeNumber != Private->GraphicsOutput->Mode->Mode) {\r
//\r
- // Set default mode failed or device don't support default mode, then get the current mode information\r
+ // Current graphics mode is not set or is not set to the mode which we has found,\r
+ // set the new graphic mode.\r
//\r
- HorizontalResolution = Mode->Info->HorizontalResolution;\r
- VerticalResolution = Mode->Info->VerticalResolution;\r
- ModeNumber = Mode->Mode;\r
+ Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // The mode set operation failed\r
+ //\r
+ goto Error;\r
+ }\r
}\r
} else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
//\r
RefreshRate = 60;\r
Status = Private->UgaDraw->SetMode (\r
Private->UgaDraw,\r
- CURRENT_HORIZONTAL_RESOLUTION,\r
- CURRENT_VERTICAL_RESOLUTION,\r
+ HorizontalResolution,\r
+ VerticalResolution,\r
ColorDepth,\r
RefreshRate\r
);\r
- if (!EFI_ERROR (Status)) {\r
- HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
- VerticalResolution = CURRENT_VERTICAL_RESOLUTION;\r
- } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+ if (EFI_ERROR (Status)) {\r
//\r
// Try to set 800*600 which is required by UEFI/EFI spec\r
//\r
Status = Private->UgaDraw->SetMode (\r
Private->UgaDraw,\r
- HorizontalResolution,\r
- VerticalResolution,\r
+ 800,\r
+ 600,\r
ColorDepth,\r
RefreshRate\r
);\r
goto Error;\r
}\r
}\r
- } else {\r
- Status = EFI_UNSUPPORTED;\r
- goto Error;\r
}\r
}\r
\r
- //\r
- // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
- //\r
- Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
- Rows = VerticalResolution / EFI_GLYPH_HEIGHT;\r
-\r
- //\r
- // See if the mode is too small to support the required 80x25 text mode\r
- //\r
- if (Columns < 80 || Rows < 25) {\r
- goto Error;\r
- }\r
- //\r
- // Add Mode #0 that must be 80x25\r
- //\r
- MaxMode = 0;\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (25 * EFI_GLYPH_HEIGHT)) >> 1;\r
- MaxMode++;\r
-\r
- //\r
- // If it is possible to support Mode #1 - 80x50, than add it as an active mode\r
- //\r
- if (Rows >= 50) {\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1;\r
- MaxMode++;\r
- }\r
-\r
- //\r
- // If it is not to support Mode #1 - 80x50, then skip it\r
- //\r
- if (MaxMode < 2) {\r
- Private->ModeData[MaxMode].Columns = 0;\r
- Private->ModeData[MaxMode].Rows = 0;\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = 0;\r
- Private->ModeData[MaxMode].DeltaY = 0;\r
- MaxMode++;\r
- }\r
+ DEBUG ((EFI_D_INFO, "GraphicsConsole video resolution %d x %d\n", HorizontalResolution, VerticalResolution));\r
\r
//\r
- // Add Mode #2 that must be 100x31 (graphic mode >= 800x600)\r
+ // Initialize the mode which GraphicsConsole supports.\r
//\r
- if (Columns >= 100 && Rows >= 31) {\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (100 * EFI_GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (31 * EFI_GLYPH_HEIGHT)) >> 1;\r
- MaxMode++;\r
- }\r
+ Status = InitializeGraphicsConsoleTextMode (\r
+ HorizontalResolution,\r
+ VerticalResolution,\r
+ ModeNumber,\r
+ &MaxMode,\r
+ &Private->ModeData\r
+ );\r
\r
- //\r
- // Add Mode #3 that uses the entire display for user-defined mode\r
- //\r
- if (HorizontalResolution > 800 && VerticalResolution > 600) {\r
- Private->ModeData[MaxMode].Columns = HorizontalResolution/EFI_GLYPH_WIDTH;\r
- Private->ModeData[MaxMode].Rows = VerticalResolution/EFI_GLYPH_HEIGHT;\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution % EFI_GLYPH_WIDTH) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution % EFI_GLYPH_HEIGHT) >> 1;\r
- MaxMode++;\r
+ if (EFI_ERROR (Status)) {\r
+ goto Error;\r
}\r
\r
//\r
Private->SimpleTextOutputMode.MaxMode = (INT32) MaxMode;\r
\r
//\r
- // Determine the number of text modes that this protocol can support\r
+ // Initialize the Mode of graphics console devices\r
//\r
- Status = GraphicsConsoleConOutSetMode (&Private->SimpleTextOutput, 0);\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
+ PreferMode = -1;\r
+ DefaultColumn = PcdGet32 (PcdConOutColumn);\r
+ DefaultRow = PcdGet32 (PcdConOutRow);\r
+ Column = 0;\r
+ Row = 0;\r
+ for (Index = 0; Index < (INT32)MaxMode; Index++) {\r
+ if (DefaultColumn != 0 && DefaultRow != 0) {\r
+ if ((Private->ModeData[Index].Columns == DefaultColumn) &&\r
+ (Private->ModeData[Index].Rows == DefaultRow)) {\r
+ PreferMode = Index;\r
+ break;\r
+ }\r
+ } else {\r
+ if ((Private->ModeData[Index].Columns > Column) &&\r
+ (Private->ModeData[Index].Rows > Row)) {\r
+ Column = Private->ModeData[Index].Columns;\r
+ Row = Private->ModeData[Index].Rows;\r
+ PreferMode = Index;\r
+ }\r
+ }\r
}\r
-\r
- DEBUG_CODE_BEGIN ();\r
- GraphicsConsoleConOutOutputString (&Private->SimpleTextOutput, (CHAR16 *)L"Graphics Console Started\n\r");\r
- DEBUG_CODE_END ();\r
+ Private->SimpleTextOutput.Mode->Mode = (INT32)PreferMode;\r
+ DEBUG ((DEBUG_INFO, "Graphics Console Started, Mode: %d\n", PreferMode));\r
\r
//\r
// Install protocol interfaces for the Graphics Console device.\r
FreePool (Private->LineBuffer);\r
}\r
\r
+ if (Private->ModeData != NULL) {\r
+ FreePool (Private->ModeData);\r
+ }\r
+\r
//\r
// Free private data\r
//\r
FreePool (Private->LineBuffer);\r
}\r
\r
+ if (Private->ModeData != NULL) {\r
+ FreePool (Private->ModeData);\r
+ }\r
+\r
//\r
// Free our instance data\r
//\r
//\r
// If video device has been set to this mode, we do not need to SetMode again\r
//\r
+ FreePool (Info);\r
break;\r
} else {\r
Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
VOID\r
)\r
{\r
- EFI_HANDLE Handle;\r
- UINTN Size;\r
EFI_STATUS Status;\r
\r
- //\r
- // There should only be one - so buffer size is this\r
- //\r
- Size = sizeof (EFI_HANDLE);\r
-\r
- Status = gBS->LocateHandle (\r
- ByProtocol,\r
- &gEfiHiiDatabaseProtocolGuid,\r
- NULL,\r
- &Size,\r
- (VOID **) &Handle\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = gBS->HandleProtocol (\r
- Handle,\r
- &gEfiHiiDatabaseProtocolGuid,\r
- (VOID **) &mHiiDatabase\r
- );\r
-\r
+ Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &mHiiDatabase);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- Status = gBS->HandleProtocol (\r
- Handle,\r
- &gEfiHiiFontProtocolGuid,\r
- (VOID **) &mHiiFont\r
- );\r
+ Status = gBS->LocateProtocol (&gEfiHiiFontProtocolGuid, NULL, (VOID **) &mHiiFont);\r
return Status;\r
}\r
\r
IN BOOLEAN ExtendedVerification\r
)\r
{\r
- This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
- return This->SetMode (This, 0);\r
+ EFI_STATUS Status;\r
+ Status = This->SetMode (This, 0);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ Status = This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
+ return Status;\r
}\r
\r
\r
INT32 OriginAttribute;\r
EFI_TPL OldTpl;\r
\r
+ if (This->Mode->Mode == -1) {\r
+ //\r
+ // If current mode is not valid, return error.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
Status = EFI_SUCCESS;\r
\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
MaxColumn = Private->ModeData[Mode].Columns;\r
MaxRow = Private->ModeData[Mode].Rows;\r
- DeltaX = Private->ModeData[Mode].DeltaX;\r
- DeltaY = Private->ModeData[Mode].DeltaY;\r
+ DeltaX = (UINTN) Private->ModeData[Mode].DeltaX;\r
+ DeltaY = (UINTN) Private->ModeData[Mode].DeltaY;\r
Width = MaxColumn * EFI_GLYPH_WIDTH;\r
Height = (MaxRow - 1) * EFI_GLYPH_HEIGHT;\r
Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
//\r
GetTextColors (This, &Foreground, &Background);\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
Warning = FALSE;\r
\r
This->Mode->CursorRow--;\r
This->Mode->CursorColumn = (INT32) (MaxColumn - 1);\r
This->OutputString (This, SpaceStr);\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
This->Mode->CursorRow--;\r
This->Mode->CursorColumn = (INT32) (MaxColumn - 1);\r
} else if (This->Mode->CursorColumn > 0) {\r
//\r
This->Mode->CursorColumn--;\r
This->OutputString (This, SpaceStr);\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
This->Mode->CursorColumn--;\r
}\r
\r
}\r
\r
if (This->Mode->CursorColumn >= (INT32) MaxColumn) {\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
This->OutputString (This, mCrLfString);\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
}\r
}\r
}\r
\r
This->Mode->Attribute = OriginAttribute;\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
if (Warning) {\r
Status = EFI_WARN_UNKNOWN_GLYPH;\r
*Columns = Private->ModeData[ModeNumber].Columns;\r
*Rows = Private->ModeData[ModeNumber].Rows;\r
\r
- if (*Columns <= 0 && *Rows <= 0) {\r
+ if (*Columns <= 0 || *Rows <= 0) {\r
Status = EFI_UNSUPPORTED;\r
goto Done;\r
\r
Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
GraphicsOutput = Private->GraphicsOutput;\r
UgaDraw = Private->UgaDraw;\r
- ModeData = &(Private->ModeData[ModeNumber]);\r
-\r
- if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
- Status = EFI_UNSUPPORTED;\r
- goto Done;\r
- }\r
\r
//\r
// Make sure the requested mode number is supported\r
goto Done;\r
}\r
\r
+ ModeData = &(Private->ModeData[ModeNumber]);\r
+\r
if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
Status = EFI_UNSUPPORTED;\r
goto Done;\r
}\r
- //\r
- // Attempt to allocate a line buffer for the requested mode number\r
- //\r
- NewLineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * EFI_GLYPH_WIDTH * EFI_GLYPH_HEIGHT);\r
\r
- if (NewLineBuffer == NULL) {\r
- //\r
- // The new line buffer could not be allocated, so return an error.\r
- // No changes to the state of the current console have been made, so the current console is still valid\r
- //\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
//\r
// If the mode has been set at least one other time, then LineBuffer will not be NULL\r
//\r
if (Private->LineBuffer != NULL) {\r
- //\r
- // Clear the current text window on the current graphics console\r
- //\r
- This->ClearScreen (This);\r
-\r
//\r
// If the new mode is the same as the old mode, then just return EFI_SUCCESS\r
//\r
if ((INT32) ModeNumber == This->Mode->Mode) {\r
- FreePool (NewLineBuffer);\r
+ //\r
+ // Clear the current text window on the current graphics console\r
+ //\r
+ This->ClearScreen (This);\r
Status = EFI_SUCCESS;\r
goto Done;\r
}\r
// Otherwise, the size of the text console and/or the GOP/UGA mode will be changed,\r
// so erase the cursor, and free the LineBuffer for the current mode\r
//\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
FreePool (Private->LineBuffer);\r
}\r
+\r
+ //\r
+ // Attempt to allocate a line buffer for the requested mode number\r
+ //\r
+ NewLineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * EFI_GLYPH_WIDTH * EFI_GLYPH_HEIGHT);\r
+\r
+ if (NewLineBuffer == NULL) {\r
+ //\r
+ // The new line buffer could not be allocated, so return an error.\r
+ // No changes to the state of the current console have been made, so the current console is still valid\r
+ //\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+\r
//\r
// Assign the current line buffer to the newly allocated line buffer\r
//\r
This->Mode->Mode = (INT32) ModeNumber;\r
\r
//\r
- // Move the text cursor to the upper left hand corner of the display and enable it\r
+ // Move the text cursor to the upper left hand corner of the display and flush it\r
//\r
- This->SetCursorPosition (This, 0, 0);\r
+ This->Mode->CursorColumn = 0;\r
+ This->Mode->CursorRow = 0;\r
+\r
+ FlushCursor (This);\r
\r
Status = EFI_SUCCESS;\r
\r
{\r
EFI_TPL OldTpl;\r
\r
- if ((Attribute | 0xFF) != 0xFF) {\r
+ if ((Attribute | 0x7F) != 0x7F) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
This->Mode->Attribute = (INT32) Attribute;\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
gBS->RestoreTPL (OldTpl);\r
\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
EFI_TPL OldTpl;\r
\r
+ if (This->Mode->Mode == -1) {\r
+ //\r
+ // If current mode is not valid, return error.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
This->Mode->CursorColumn = 0;\r
This->Mode->CursorRow = 0;\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
gBS->RestoreTPL (OldTpl);\r
\r
EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
\r
+ if (This->Mode->Mode == -1) {\r
+ //\r
+ // If current mode is not valid, return error.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
Status = EFI_SUCCESS;\r
\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
goto Done;\r
}\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
This->Mode->CursorColumn = (INT32) Column;\r
This->Mode->CursorRow = (INT32) Row;\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
Done:\r
gBS->RestoreTPL (OldTpl);\r
the cursor is set to be invisible.\r
\r
@retval EFI_SUCCESS The operation completed successfully.\r
+ @retval EFI_UNSUPPORTED The output device's mode is not currently in a\r
+ defined text mode.\r
\r
**/\r
EFI_STATUS\r
{\r
EFI_TPL OldTpl;\r
\r
+ if (This->Mode->Mode == -1) {\r
+ //\r
+ // If current mode is not valid, return error.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
This->Mode->CursorVisible = Visible;\r
\r
- EraseCursor (This);\r
+ FlushCursor (This);\r
\r
gBS->RestoreTPL (OldTpl);\r
return EFI_SUCCESS;\r
}\r
\r
/**\r
- Erase the cursor on the screen.\r
+ Flush the cursor on the screen.\r
+\r
+ If CursorVisible is FALSE, nothing to do and return directly.\r
+ If CursorVisible is TRUE,\r
+ i) If the cursor shows on screen, it will be erased.\r
+ ii) If the cursor does not show on screen, it will be shown.\r
\r
@param This Protocol instance pointer.\r
\r
\r
**/\r
EFI_STATUS\r
-EraseCursor (\r
+FlushCursor (\r
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
)\r
{\r
NULL,\r
(VOID **) &HiiDatabase\r
);\r
- ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
\r
//\r
// Add 4 bytes to the header for entire length for HiiAddPackages use only.\r
\r
//\r
// Register notify function on HII Database Protocol to add font package.\r
- // \r
+ //\r
EfiCreateProtocolNotifyEvent (\r
&gEfiHiiDatabaseProtocolGuid,\r
TPL_CALLBACK,\r