diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c index 34b7809a61..0d54cdffc8 100644 --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenance.c @@ -30,6 +30,8 @@ UINT32 mBmmSetupTextModeRow = 0; UINT32 mBmmSetupHorizontalResolution = 0; UINT32 mBmmSetupVerticalResolution = 0; +BOOLEAN mBmmModeInitialized = FALSE; + EFI_DEVICE_PATH_PROTOCOL EndDevicePath[] = { { END_DEVICE_PATH_TYPE, @@ -1277,6 +1279,77 @@ FreeAllMenu ( mAllMenuInit = FALSE; } +/** + Initial the boot mode related parameters. + +**/ +VOID +BmmInitialBootModeInfo ( + VOID + ) +{ + EFI_STATUS Status; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; + UINTN BootTextColumn; + UINTN BootTextRow; + + if (mBmmModeInitialized) { + return; + } + + // + // After the console is ready, get current video resolution + // and text mode before launching setup at first time. + // + Status = gBS->HandleProtocol ( + gST->ConsoleOutHandle, + &gEfiGraphicsOutputProtocolGuid, + (VOID**)&GraphicsOutput + ); + if (EFI_ERROR (Status)) { + GraphicsOutput = NULL; + } + + Status = gBS->HandleProtocol ( + gST->ConsoleOutHandle, + &gEfiSimpleTextOutProtocolGuid, + (VOID**)&SimpleTextOut + ); + if (EFI_ERROR (Status)) { + SimpleTextOut = NULL; + } + + if (GraphicsOutput != NULL) { + // + // Get current video resolution and text mode. + // + mBmmBootHorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution; + mBmmBootVerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution; + } + + if (SimpleTextOut != NULL) { + Status = SimpleTextOut->QueryMode ( + SimpleTextOut, + SimpleTextOut->Mode->Mode, + &BootTextColumn, + &BootTextRow + ); + mBmmBootTextModeColumn = (UINT32)BootTextColumn; + mBmmBootTextModeRow = (UINT32)BootTextRow; + } + + // + // Get user defined text mode for setup. + // + mBmmSetupHorizontalResolution = PcdGet32 (PcdSetupVideoHorizontalResolution); + mBmmSetupVerticalResolution = PcdGet32 (PcdSetupVideoVerticalResolution); + mBmmSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn); + mBmmSetupTextModeRow = PcdGet32 (PcdSetupConOutRow); + + mBmmModeInitialized = TRUE; +} + /** Install Boot Maintenance Manager Menu driver. @@ -1365,6 +1438,8 @@ BootMaintenanceManagerUiLibConstructor ( // InitializeBmmConfig(mBmmCallbackInfo); + BmmInitialBootModeInfo(); + return EFI_SUCCESS; } diff --git a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf index 25f990e786..6f2cda33d2 100644 --- a/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf +++ b/MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf @@ -101,4 +101,6 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutColumn ## CONSUMES - gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow ## CONSUMES \ No newline at end of file + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupConOutRow ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution ## CONSUMES