IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
);\r
\r
+EFI_STATUS\r
+CheckModeSupported (\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput,\r
+ IN UINT32 HorizontalResolution,\r
+ IN UINT32 VerticalResolution,\r
+ OUT UINT32 *CurrentModeNumber\r
+ );\r
+\r
//\r
// Globals\r
//\r
},\r
{\r
{ 80, 25, 0, 0, 0, 0 }, // Mode 0\r
- { 80, 50, 0, 0, 0, 0 }, // Mode 1 \r
- { 0, 0, 0, 0, 0, 0 } // Mode 2\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
(EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL,\r
(EFI_HII_HANDLE) 0\r
\r
--*/\r
{\r
- EFI_STATUS Status;\r
- GRAPHICS_CONSOLE_DEV *Private;\r
+ EFI_STATUS Status;\r
+ GRAPHICS_CONSOLE_DEV *Private;\r
EFI_HII_PACKAGES *Package;\r
EFI_HII_FONT_PACK *FontPack;\r
- UINTN NarrowFontSize;\r
- UINT32 HorizontalResolution;\r
- UINT32 VerticalResolution;\r
- UINT32 ColorDepth;\r
- UINT32 RefreshRate;\r
- UINTN MaxMode;\r
- UINTN Columns;\r
- UINTN Rows;\r
- UINT8 *Location;\r
+ UINTN NarrowFontSize;\r
+ UINT32 HorizontalResolution;\r
+ UINT32 VerticalResolution;\r
+ UINT32 ColorDepth;\r
+ UINT32 RefreshRate;\r
+ UINTN MaxMode;\r
+ UINTN Columns;\r
+ UINTN Rows;\r
+ UINT8 *Location;\r
UINT32 ModeNumber;\r
- UINTN SizeOfInfo;\r
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
\r
ModeNumber = 0;\r
\r
\r
if (Private->GraphicsOutput != NULL) {\r
//\r
- // The console is build on top of Graphics Output Protocol, find the mode number for 800x600\r
+ // The console is build on top of Graphics Output Protocol, find the mode number \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
- for (ModeNumber = 0; ModeNumber < Private->GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
- Status = Private->GraphicsOutput->QueryMode (\r
- Private->GraphicsOutput,\r
- ModeNumber,\r
- &SizeOfInfo,\r
- &Info\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- if ((Info->HorizontalResolution == 800) &&\r
- (Info->VerticalResolution == 600)) {\r
- Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber);\r
- if (!EFI_ERROR (Status)) {\r
- FreePool (Info);\r
- break;\r
- }\r
- }\r
- FreePool (Info);\r
- }\r
+ Status = CheckModeSupported (\r
+ Private->GraphicsOutput, \r
+ CURRENT_HORIZONTAL_RESOLUTION, \r
+ CURRENT_VERTICAL_RESOLUTION,\r
+ &ModeNumber\r
+ );\r
+ if (!EFI_ERROR(Status)) {\r
+ //\r
+ // Update default mode to current mode\r
+ //\r
+ HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
+ VerticalResolution = CURRENT_VERTICAL_RESOLUTION;\r
+ } else {\r
+ //\r
+ // if not supporting current mode, try 800x600 which is required by UEFI/EFI spec\r
+ //\r
+ Status = CheckModeSupported (\r
+ Private->GraphicsOutput, \r
+ 800, \r
+ 600, \r
+ &ModeNumber\r
+ );\r
}\r
\r
if (EFI_ERROR (Status) || (ModeNumber == Private->GraphicsOutput->Mode->MaxMode)) {\r
}\r
} else {\r
//\r
- // The console is build on top of UGA Draw Protocol\r
+ // At first try to set user-defined resolution\r
//\r
ColorDepth = 32;\r
RefreshRate = 60;\r
Status = Private->UgaDraw->SetMode (\r
Private->UgaDraw,\r
- HorizontalResolution,\r
- VerticalResolution,\r
+ CURRENT_HORIZONTAL_RESOLUTION,\r
+ CURRENT_VERTICAL_RESOLUTION,\r
ColorDepth,\r
RefreshRate\r
);\r
- if (EFI_ERROR (Status)) {\r
+ if (!EFI_ERROR (Status)) {\r
+ HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
+ VerticalResolution = CURRENT_VERTICAL_RESOLUTION;\r
+ } else {\r
//\r
- // Get the current mode information from the UGA Draw Protocol\r
+ // Try to set 800*600 which is required by UEFI/EFI spec\r
//\r
- Status = Private->UgaDraw->GetMode (\r
+ Status = Private->UgaDraw->SetMode (\r
Private->UgaDraw,\r
- &HorizontalResolution,\r
- &VerticalResolution,\r
- &ColorDepth,\r
- &RefreshRate\r
+ HorizontalResolution,\r
+ VerticalResolution,\r
+ ColorDepth,\r
+ RefreshRate\r
);\r
if (EFI_ERROR (Status)) {\r
- goto Error;\r
+ Status = Private->UgaDraw->GetMode (\r
+ Private->UgaDraw,\r
+ &HorizontalResolution,\r
+ &VerticalResolution,\r
+ &ColorDepth,\r
+ &RefreshRate\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Error;\r
+ }\r
}\r
}\r
}\r
Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (50 * GLYPH_HEIGHT)) >> 1;\r
MaxMode++;\r
}\r
+\r
//\r
- // If the graphics mode is 800x600, than add a text mode that uses the entire display\r
+ // If it is not to support Mode #1 - 80x50, then skip it\r
//\r
- if (HorizontalResolution == 800 && VerticalResolution == 600) {\r
-\r
- if (MaxMode < 2) {\r
- Private->ModeData[MaxMode].Columns = 0;\r
- Private->ModeData[MaxMode].Rows = 0;\r
- Private->ModeData[MaxMode].GopWidth = 800;\r
- Private->ModeData[MaxMode].GopHeight = 600;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = 0;\r
- Private->ModeData[MaxMode].DeltaY = 0;\r
- MaxMode++;\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
+ \r
+ //\r
+ // Add Mode #2 that must be 100x31 (graphic mode >= 800x600)\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 * GLYPH_WIDTH)) >> 1;\r
+ Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (31 * GLYPH_HEIGHT)) >> 1;\r
+ MaxMode++;\r
+ }\r
\r
- Private->ModeData[MaxMode].Columns = 800 / GLYPH_WIDTH;\r
- Private->ModeData[MaxMode].Rows = 600 / GLYPH_HEIGHT;\r
- Private->ModeData[MaxMode].GopWidth = 800;\r
- Private->ModeData[MaxMode].GopHeight = 600;\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/GLYPH_WIDTH;\r
+ Private->ModeData[MaxMode].Rows = VerticalResolution/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 = (800 % GLYPH_WIDTH) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (600 % GLYPH_HEIGHT) >> 1;\r
+ Private->ModeData[MaxMode].DeltaX = (HorizontalResolution % GLYPH_WIDTH) >> 1;\r
+ Private->ModeData[MaxMode].DeltaY = (VerticalResolution % GLYPH_HEIGHT) >> 1;\r
MaxMode++;\r
}\r
+ \r
//\r
// Update the maximum number of modes\r
//\r
return Status;\r
}\r
\r
+EFI_STATUS\r
+CheckModeSupported (\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput,\r
+ IN UINT32 HorizontalResolution,\r
+ IN UINT32 VerticalResolution,\r
+ OUT UINT32 *CurrentModeNumber\r
+ )\r
+{\r
+ UINT32 ModeNumber;\r
+ EFI_STATUS Status;\r
+ UINTN SizeOfInfo; \r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+ \r
+ Status = EFI_SUCCESS;\r
+ \r
+ for (ModeNumber = 0; ModeNumber < GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
+ Status = GraphicsOutput->QueryMode (\r
+ GraphicsOutput,\r
+ ModeNumber,\r
+ &SizeOfInfo,\r
+ &Info\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((Info->HorizontalResolution == HorizontalResolution) &&\r
+ (Info->VerticalResolution == VerticalResolution)) {\r
+ Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->FreePool (Info);\r
+ break;\r
+ }\r
+ }\r
+ gBS->FreePool (Info);\r
+ }\r
+ }\r
+ \r
+ if (ModeNumber == GraphicsOutput->Mode->MaxMode) {\r
+ Status = EFI_UNSUPPORTED;\r
+ }\r
+ \r
+ *CurrentModeNumber = ModeNumber;\r
+ return Status; \r
+}\r
+\r
EFI_STATUS\r
EfiLocateHiiProtocol (\r
VOID\r