X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FConsole%2FGraphicsConsoleDxe%2FGraphicsConsole.c;h=c042451a9b5234baf309d7626c5a41755355fb8e;hp=01610f7c54686311736e89c0f502c3c60247df44;hb=HEAD;hpb=adfa1abc0914ba1ea39d3f4612611465bab0c761 diff --git a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c index 01610f7c54..b895dafede 100644 --- a/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c +++ b/MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c @@ -1,14 +1,8 @@ /** @file This is the main routine for initializing the Graphics Console support routines. -Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -17,10 +11,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // // Graphics Console Device Private Data template // -GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = { +GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = { GRAPHICS_CONSOLE_DEV_SIGNATURE, - (EFI_GRAPHICS_OUTPUT_PROTOCOL *) NULL, - (EFI_UGA_DRAW_PROTOCOL *) NULL, + (EFI_GRAPHICS_OUTPUT_PROTOCOL *)NULL, + (EFI_UGA_DRAW_PROTOCOL *)NULL, { GraphicsConsoleConOutReset, GraphicsConsoleConOutOutputString, @@ -31,69 +25,74 @@ GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = { GraphicsConsoleConOutClearScreen, GraphicsConsoleConOutSetCursorPosition, GraphicsConsoleConOutEnableCursor, - (EFI_SIMPLE_TEXT_OUTPUT_MODE *) NULL + (EFI_SIMPLE_TEXT_OUTPUT_MODE *)NULL }, { 0, -1, - EFI_TEXT_ATTR(EFI_LIGHTGRAY, EFI_BLACK), + EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK), 0, 0, - TRUE + FALSE }, - (GRAPHICS_CONSOLE_MODE_DATA *) NULL, - (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL + (GRAPHICS_CONSOLE_MODE_DATA *)NULL, + (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)NULL }; -GRAPHICS_CONSOLE_MODE_DATA mGraphicsConsoleModeData[] = { - {100, 31}, +GRAPHICS_CONSOLE_MODE_DATA mGraphicsConsoleModeData[] = { + { 100, 31 }, // 800 x 600 + { 128, 40 }, // 1024 x 768 + { 160, 42 }, // 1280 x 800 + { 240, 56 }, // 1920 x 1080 // // New modes can be added here. // The last entry is specific for full screen mode. // - {0, 0} + { 0, 0 } }; -EFI_HII_DATABASE_PROTOCOL *mHiiDatabase; -EFI_HII_FONT_PROTOCOL *mHiiFont; -EFI_HII_HANDLE mHiiHandle; -VOID *mHiiRegistration; +EFI_HII_DATABASE_PROTOCOL *mHiiDatabase; +EFI_HII_FONT_PROTOCOL *mHiiFont; +EFI_HII_HANDLE mHiiHandle; +VOID *mHiiRegistration; -EFI_GUID mFontPackageListGuid = {0xf5f219d3, 0x7006, 0x4648, {0xac, 0x8d, 0xd6, 0x1d, 0xfb, 0x7b, 0xc6, 0xad}}; +EFI_GUID mFontPackageListGuid = { + 0xf5f219d3, 0x7006, 0x4648, { 0xac, 0x8d, 0xd6, 0x1d, 0xfb, 0x7b, 0xc6, 0xad } +}; -CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL }; +CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL }; -EFI_GRAPHICS_OUTPUT_BLT_PIXEL mGraphicsEfiColors[16] = { +EFI_GRAPHICS_OUTPUT_BLT_PIXEL mGraphicsEfiColors[16] = { // // B G R reserved // - {0x00, 0x00, 0x00, 0x00}, // BLACK - {0x98, 0x00, 0x00, 0x00}, // LIGHTBLUE - {0x00, 0x98, 0x00, 0x00}, // LIGHGREEN - {0x98, 0x98, 0x00, 0x00}, // LIGHCYAN - {0x00, 0x00, 0x98, 0x00}, // LIGHRED - {0x98, 0x00, 0x98, 0x00}, // MAGENTA - {0x00, 0x98, 0x98, 0x00}, // BROWN - {0x98, 0x98, 0x98, 0x00}, // LIGHTGRAY - {0x30, 0x30, 0x30, 0x00}, // DARKGRAY - BRIGHT BLACK - {0xff, 0x00, 0x00, 0x00}, // BLUE - {0x00, 0xff, 0x00, 0x00}, // LIME - {0xff, 0xff, 0x00, 0x00}, // CYAN - {0x00, 0x00, 0xff, 0x00}, // RED - {0xff, 0x00, 0xff, 0x00}, // FUCHSIA - {0x00, 0xff, 0xff, 0x00}, // YELLOW - {0xff, 0xff, 0xff, 0x00} // WHITE + { 0x00, 0x00, 0x00, 0x00 }, // BLACK + { 0x98, 0x00, 0x00, 0x00 }, // LIGHTBLUE + { 0x00, 0x98, 0x00, 0x00 }, // LIGHGREEN + { 0x98, 0x98, 0x00, 0x00 }, // LIGHCYAN + { 0x00, 0x00, 0x98, 0x00 }, // LIGHRED + { 0x98, 0x00, 0x98, 0x00 }, // MAGENTA + { 0x00, 0x98, 0x98, 0x00 }, // BROWN + { 0x98, 0x98, 0x98, 0x00 }, // LIGHTGRAY + { 0x30, 0x30, 0x30, 0x00 }, // DARKGRAY - BRIGHT BLACK + { 0xff, 0x00, 0x00, 0x00 }, // BLUE + { 0x00, 0xff, 0x00, 0x00 }, // LIME + { 0xff, 0xff, 0x00, 0x00 }, // CYAN + { 0x00, 0x00, 0xff, 0x00 }, // RED + { 0xff, 0x00, 0xff, 0x00 }, // FUCHSIA + { 0x00, 0xff, 0xff, 0x00 }, // YELLOW + { 0xff, 0xff, 0xff, 0x00 } // WHITE }; -EFI_NARROW_GLYPH mCursorGlyph = { +EFI_NARROW_GLYPH mCursorGlyph = { 0x0000, 0x00, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF } + { 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF } }; -CHAR16 SpaceStr[] = { NARROW_CHAR, ' ', 0 }; +CHAR16 SpaceStr[] = { NARROW_CHAR, ' ', 0 }; -EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = { +EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = { GraphicsConsoleControllerDriverSupported, GraphicsConsoleControllerDriverStart, GraphicsConsoleControllerDriverStop, @@ -121,15 +120,15 @@ EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = { EFI_STATUS EFIAPI GraphicsConsoleControllerDriverSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { - EFI_STATUS Status; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; + EFI_STATUS Status; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; GraphicsOutput = NULL; UgaDraw = NULL; @@ -139,7 +138,7 @@ GraphicsConsoleControllerDriverSupported ( Status = gBS->OpenProtocol ( Controller, &gEfiGraphicsOutputProtocolGuid, - (VOID **) &GraphicsOutput, + (VOID **)&GraphicsOutput, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER @@ -152,12 +151,13 @@ GraphicsConsoleControllerDriverSupported ( Status = gBS->OpenProtocol ( Controller, &gEfiUgaDrawProtocolGuid, - (VOID **) &UgaDraw, + (VOID **)&UgaDraw, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); } + if (EFI_ERROR (Status)) { return Status; } @@ -170,18 +170,18 @@ GraphicsConsoleControllerDriverSupported ( Status = gBS->OpenProtocol ( Controller, &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath, + (VOID **)&DevicePath, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (!EFI_ERROR (Status)) { gBS->CloseProtocol ( - Controller, - &gEfiDevicePathProtocolGuid, - This->DriverBindingHandle, - Controller - ); + Controller, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + Controller + ); } else { goto Error; } @@ -197,19 +197,20 @@ GraphicsConsoleControllerDriverSupported ( Error: if (GraphicsOutput != NULL) { gBS->CloseProtocol ( - Controller, - &gEfiGraphicsOutputProtocolGuid, - This->DriverBindingHandle, - Controller - ); + Controller, + &gEfiGraphicsOutputProtocolGuid, + This->DriverBindingHandle, + Controller + ); } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { gBS->CloseProtocol ( - Controller, - &gEfiUgaDrawProtocolGuid, - This->DriverBindingHandle, - Controller - ); + Controller, + &gEfiUgaDrawProtocolGuid, + This->DriverBindingHandle, + Controller + ); } + return Status; } @@ -220,7 +221,7 @@ Error: @param[in] HorizontalResolution The size of video screen in pixels in the X dimension. @param[in] VerticalResolution The size of video screen in pixels in the Y dimension. - @param[in] GopModeNumber The graphics mode number which graphis console is based on. + @param[in] GopModeNumber The graphics mode number which graphics console is based on. @param[out] TextModeCount The total number of text modes that graphics console supports. @param[out] TextModeData The buffer to the text modes column and row information. Caller is responsible to free it when it's non-NULL. @@ -231,11 +232,11 @@ Error: **/ EFI_STATUS InitializeGraphicsConsoleTextMode ( - IN UINT32 HorizontalResolution, - IN UINT32 VerticalResolution, - IN UINT32 GopModeNumber, - OUT UINTN *TextModeCount, - OUT GRAPHICS_CONSOLE_MODE_DATA **TextModeData + IN UINT32 HorizontalResolution, + IN UINT32 VerticalResolution, + IN UINT32 GopModeNumber, + OUT UINTN *TextModeCount, + OUT GRAPHICS_CONSOLE_MODE_DATA **TextModeData ) { UINTN Index; @@ -245,8 +246,8 @@ InitializeGraphicsConsoleTextMode ( UINTN ValidCount; UINTN ValidIndex; UINTN MaxColumns; - UINTN MaxRows; - + UINTN MaxRows; + if ((TextModeCount == NULL) || (TextModeData == NULL)) { return EFI_INVALID_PARAMETER; } @@ -287,7 +288,7 @@ InitializeGraphicsConsoleTextMode ( // // Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec. // - ValidCount = 0; + ValidCount = 0; NewModeBuffer[ValidCount].Columns = 80; NewModeBuffer[ValidCount].Rows = 25; @@ -295,40 +296,45 @@ InitializeGraphicsConsoleTextMode ( NewModeBuffer[ValidCount].GopHeight = VerticalResolution; NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber; NewModeBuffer[ValidCount].DeltaX = (HorizontalResolution - (NewModeBuffer[ValidCount].Columns * EFI_GLYPH_WIDTH)) >> 1; - NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (NewModeBuffer[ValidCount].Rows * EFI_GLYPH_HEIGHT)) >> 1; + NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (NewModeBuffer[ValidCount].Rows * EFI_GLYPH_HEIGHT)) >> 1; ValidCount++; if ((MaxColumns >= 80) && (MaxRows >= 50)) { NewModeBuffer[ValidCount].Columns = 80; NewModeBuffer[ValidCount].Rows = 50; NewModeBuffer[ValidCount].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1; - NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1; + NewModeBuffer[ValidCount].DeltaY = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1; } + NewModeBuffer[ValidCount].GopWidth = HorizontalResolution; NewModeBuffer[ValidCount].GopHeight = VerticalResolution; NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber; ValidCount++; - + // // Start from mode 2 to put the valid mode other than 80x25 and 80x50 in the output mode buffer. // for (Index = 0; Index < Count; Index++) { if ((ModeBuffer[Index].Columns == 0) || (ModeBuffer[Index].Rows == 0) || - (ModeBuffer[Index].Columns > MaxColumns) || (ModeBuffer[Index].Rows > MaxRows)) { + (ModeBuffer[Index].Columns > MaxColumns) || (ModeBuffer[Index].Rows > MaxRows)) + { // // Skip the pre-defined mode which is invalid or exceeds the max column and row. // continue; } + for (ValidIndex = 0; ValidIndex < ValidCount; ValidIndex++) { if ((ModeBuffer[Index].Columns == NewModeBuffer[ValidIndex].Columns) && - (ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) { + (ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) + { // // Skip the duplicated mode. // break; } } + if (ValidIndex == ValidCount) { NewModeBuffer[ValidCount].Columns = ModeBuffer[Index].Columns; NewModeBuffer[ValidCount].Rows = ModeBuffer[Index].Rows; @@ -340,14 +346,20 @@ InitializeGraphicsConsoleTextMode ( ValidCount++; } } - - DEBUG_CODE ( - for (Index = 0; Index < ValidCount; Index++) { - DEBUG ((EFI_D_INFO, "Graphics - Mode %d, Column = %d, Row = %d\n", - Index, NewModeBuffer[Index].Columns, NewModeBuffer[Index].Rows)); - } - ); - + + DEBUG_CODE_BEGIN (); + for (Index = 0; Index < ValidCount; Index++) { + DEBUG (( + DEBUG_INFO, + "Graphics - Mode %d, Column = %d, Row = %d\n", + Index, + NewModeBuffer[Index].Columns, + NewModeBuffer[Index].Rows + )); + } + + DEBUG_CODE_END (); + // // Return valid mode count and mode information buffer. // @@ -373,24 +385,30 @@ InitializeGraphicsConsoleTextMode ( EFI_STATUS EFIAPI GraphicsConsoleControllerDriverStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { - EFI_STATUS Status; - GRAPHICS_CONSOLE_DEV *Private; - UINT32 HorizontalResolution; - UINT32 VerticalResolution; - UINT32 ColorDepth; - UINT32 RefreshRate; - UINT32 ModeIndex; - UINTN MaxMode; - UINT32 ModeNumber; - EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode; - UINTN SizeOfInfo; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - + EFI_STATUS Status; + GRAPHICS_CONSOLE_DEV *Private; + UINT32 HorizontalResolution; + UINT32 VerticalResolution; + UINT32 ColorDepth; + UINT32 RefreshRate; + UINT32 ModeIndex; + UINTN MaxMode; + UINT32 ModeNumber; + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode; + UINTN SizeOfInfo; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; + INT32 PreferMode; + INT32 Index; + UINTN Column; + UINTN Row; + UINTN DefaultColumn; + UINTN DefaultRow; + ModeNumber = 0; // @@ -409,17 +427,17 @@ GraphicsConsoleControllerDriverStart ( Status = gBS->OpenProtocol ( Controller, &gEfiGraphicsOutputProtocolGuid, - (VOID **) &Private->GraphicsOutput, + (VOID **)&Private->GraphicsOutput, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); - if (EFI_ERROR(Status) && FeaturePcdGet (PcdUgaConsumeSupport)) { + if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) { Status = gBS->OpenProtocol ( Controller, &gEfiUgaDrawProtocolGuid, - (VOID **) &Private->UgaDraw, + (VOID **)&Private->UgaDraw, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER @@ -430,8 +448,8 @@ GraphicsConsoleControllerDriverStart ( goto Error; } - HorizontalResolution = PcdGet32 (PcdVideoHorizontalResolution); - VerticalResolution = PcdGet32 (PcdVideoVerticalResolution); + HorizontalResolution = PcdGet32 (PcdVideoHorizontalResolution); + VerticalResolution = PcdGet32 (PcdVideoVerticalResolution); if (Private->GraphicsOutput != NULL) { // @@ -442,26 +460,29 @@ GraphicsConsoleControllerDriverStart ( if ((HorizontalResolution == 0x0) || (VerticalResolution == 0x0)) { // // Find the highest resolution which GOP supports. - // + // MaxMode = Private->GraphicsOutput->Mode->MaxMode; - + for (ModeIndex = 0; ModeIndex < MaxMode; ModeIndex++) { Status = Private->GraphicsOutput->QueryMode ( - Private->GraphicsOutput, - ModeIndex, - &SizeOfInfo, - &Info - ); + Private->GraphicsOutput, + ModeIndex, + &SizeOfInfo, + &Info + ); if (!EFI_ERROR (Status)) { if ((Info->HorizontalResolution > HorizontalResolution) || - ((Info->HorizontalResolution == HorizontalResolution) && (Info->VerticalResolution > VerticalResolution))) { + ((Info->HorizontalResolution == HorizontalResolution) && (Info->VerticalResolution > VerticalResolution))) + { HorizontalResolution = Info->HorizontalResolution; VerticalResolution = Info->VerticalResolution; ModeNumber = ModeIndex; } + FreePool (Info); } } + if ((HorizontalResolution == 0x0) || (VerticalResolution == 0x0)) { Status = EFI_UNSUPPORTED; goto Error; @@ -471,35 +492,38 @@ GraphicsConsoleControllerDriverStart ( // Use user-defined resolution // Status = CheckModeSupported ( - Private->GraphicsOutput, - HorizontalResolution, - VerticalResolution, - &ModeNumber - ); + Private->GraphicsOutput, + HorizontalResolution, + VerticalResolution, + &ModeNumber + ); if (EFI_ERROR (Status)) { // // if not supporting current mode, try 800x600 which is required by UEFI/EFI spec // - Status = CheckModeSupported ( - Private->GraphicsOutput, - 800, - 600, - &ModeNumber - ); + HorizontalResolution = 800; + VerticalResolution = 600; + Status = CheckModeSupported ( + Private->GraphicsOutput, + HorizontalResolution, + VerticalResolution, + &ModeNumber + ); Mode = Private->GraphicsOutput->Mode; - if (EFI_ERROR (Status) && Mode->MaxMode != 0) { + if (EFI_ERROR (Status) && (Mode->MaxMode != 0)) { // - // Set default mode failed or device don't support default mode, then get the current mode information + // If set default mode failed or device doesn't support default mode, then get the current mode information // HorizontalResolution = Mode->Info->HorizontalResolution; - VerticalResolution = Mode->Info->VerticalResolution; - ModeNumber = Mode->Mode; + VerticalResolution = Mode->Info->VerticalResolution; + ModeNumber = Mode->Mode; } } } - if (ModeNumber != Private->GraphicsOutput->Mode->Mode) { + + if (EFI_ERROR (Status) || (ModeNumber != Private->GraphicsOutput->Mode->Mode)) { // - // Current graphics mode is not set or is not set to the mode which we has found, + // Current graphics mode is not set or is not set to the mode which we have found, // set the new graphic mode. // Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber); @@ -514,34 +538,34 @@ GraphicsConsoleControllerDriverStart ( // // At first try to set user-defined resolution // - ColorDepth = 32; - RefreshRate = 60; - Status = Private->UgaDraw->SetMode ( - Private->UgaDraw, - HorizontalResolution, - VerticalResolution, - ColorDepth, - RefreshRate - ); + ColorDepth = 32; + RefreshRate = 60; + Status = Private->UgaDraw->SetMode ( + Private->UgaDraw, + HorizontalResolution, + VerticalResolution, + ColorDepth, + RefreshRate + ); if (EFI_ERROR (Status)) { // // Try to set 800*600 which is required by UEFI/EFI spec // Status = Private->UgaDraw->SetMode ( - Private->UgaDraw, - 800, - 600, - ColorDepth, - RefreshRate - ); + Private->UgaDraw, + 800, + 600, + ColorDepth, + RefreshRate + ); if (EFI_ERROR (Status)) { Status = Private->UgaDraw->GetMode ( - Private->UgaDraw, - &HorizontalResolution, - &VerticalResolution, - &ColorDepth, - &RefreshRate - ); + Private->UgaDraw, + &HorizontalResolution, + &VerticalResolution, + &ColorDepth, + &RefreshRate + ); if (EFI_ERROR (Status)) { goto Error; } @@ -549,7 +573,7 @@ GraphicsConsoleControllerDriverStart ( } } - DEBUG ((EFI_D_INFO, "GraphicsConsole video resolution %d x %d\n", HorizontalResolution, VerticalResolution)); + DEBUG ((DEBUG_INFO, "GraphicsConsole video resolution %d x %d\n", HorizontalResolution, VerticalResolution)); // // Initialize the mode which GraphicsConsole supports. @@ -569,18 +593,37 @@ GraphicsConsoleControllerDriverStart ( // // Update the maximum number of modes // - Private->SimpleTextOutputMode.MaxMode = (INT32) MaxMode; + Private->SimpleTextOutputMode.MaxMode = (INT32)MaxMode; - DEBUG_CODE_BEGIN (); - Status = GraphicsConsoleConOutSetMode (&Private->SimpleTextOutput, 0); - if (EFI_ERROR (Status)) { - goto Error; + // + // Initialize the Mode of graphics console devices + // + PreferMode = -1; + DefaultColumn = PcdGet32 (PcdConOutColumn); + DefaultRow = PcdGet32 (PcdConOutRow); + Column = 0; + Row = 0; + for (Index = 0; Index < (INT32)MaxMode; Index++) { + if ((DefaultColumn != 0) && (DefaultRow != 0)) { + if ((Private->ModeData[Index].Columns == DefaultColumn) && + (Private->ModeData[Index].Rows == DefaultRow)) + { + PreferMode = Index; + break; + } + } else { + if ((Private->ModeData[Index].Columns > Column) && + (Private->ModeData[Index].Rows > Row)) + { + Column = Private->ModeData[Index].Columns; + Row = Private->ModeData[Index].Rows; + PreferMode = Index; + } } - Status = GraphicsConsoleConOutOutputString (&Private->SimpleTextOutput, (CHAR16 *)L"Graphics Console Started\n\r"); - if (EFI_ERROR (Status)) { - goto Error; - } - DEBUG_CODE_END (); + } + + Private->SimpleTextOutput.Mode->Mode = (INT32)PreferMode; + DEBUG ((DEBUG_INFO, "Graphics Console Started, Mode: %d\n", PreferMode)); // // Install protocol interfaces for the Graphics Console device. @@ -651,10 +694,10 @@ Error: EFI_STATUS EFIAPI GraphicsConsoleControllerDriverStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE Controller, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer ) { EFI_STATUS Status; @@ -664,7 +707,7 @@ GraphicsConsoleControllerDriverStop ( Status = gBS->OpenProtocol ( Controller, &gEfiSimpleTextOutProtocolGuid, - (VOID **) &SimpleTextOutput, + (VOID **)&SimpleTextOutput, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_GET_PROTOCOL @@ -687,18 +730,18 @@ GraphicsConsoleControllerDriverStop ( // if (Private->GraphicsOutput != NULL) { gBS->CloseProtocol ( - Controller, - &gEfiGraphicsOutputProtocolGuid, - This->DriverBindingHandle, - Controller - ); + Controller, + &gEfiGraphicsOutputProtocolGuid, + This->DriverBindingHandle, + Controller + ); } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { gBS->CloseProtocol ( - Controller, - &gEfiUgaDrawProtocolGuid, - This->DriverBindingHandle, - Controller - ); + Controller, + &gEfiUgaDrawProtocolGuid, + This->DriverBindingHandle, + Controller + ); } if (Private->LineBuffer != NULL) { @@ -722,7 +765,7 @@ GraphicsConsoleControllerDriverStop ( Check if the current specific mode supported the user defined resolution for the Graphics Console device based on Graphics Output Protocol. - If yes, set the graphic devcice's current mode to this specific mode. + If yes, set the graphic device's current mode to this specific mode. @param GraphicsOutput Graphics Output Protocol instance pointer. @param HorizontalResolution User defined horizontal resolution @@ -745,27 +788,29 @@ CheckModeSupported ( OUT UINT32 *CurrentModeNumber ) { - UINT32 ModeNumber; - EFI_STATUS Status; - UINTN SizeOfInfo; - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; - UINT32 MaxMode; + UINT32 ModeNumber; + EFI_STATUS Status; + UINTN SizeOfInfo; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; + UINT32 MaxMode; Status = EFI_SUCCESS; MaxMode = GraphicsOutput->Mode->MaxMode; for (ModeNumber = 0; ModeNumber < MaxMode; ModeNumber++) { Status = GraphicsOutput->QueryMode ( - GraphicsOutput, - ModeNumber, - &SizeOfInfo, - &Info - ); + GraphicsOutput, + ModeNumber, + &SizeOfInfo, + &Info + ); if (!EFI_ERROR (Status)) { if ((Info->HorizontalResolution == HorizontalResolution) && - (Info->VerticalResolution == VerticalResolution)) { + (Info->VerticalResolution == VerticalResolution)) + { if ((GraphicsOutput->Mode->Info->HorizontalResolution == HorizontalResolution) && - (GraphicsOutput->Mode->Info->VerticalResolution == VerticalResolution)) { + (GraphicsOutput->Mode->Info->VerticalResolution == VerticalResolution)) + { // // If video device has been set to this mode, we do not need to SetMode again // @@ -779,6 +824,7 @@ CheckModeSupported ( } } } + FreePool (Info); } } @@ -791,7 +837,6 @@ CheckModeSupported ( return Status; } - /** Locate HII Database protocol and HII Font protocol. @@ -808,12 +853,12 @@ EfiLocateHiiProtocol ( { EFI_STATUS Status; - Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &mHiiDatabase); + Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **)&mHiiDatabase); if (EFI_ERROR (Status)) { return Status; } - Status = gBS->LocateProtocol (&gEfiHiiFontProtocolGuid, NULL, (VOID **) &mHiiFont); + Status = gBS->LocateProtocol (&gEfiHiiFontProtocolGuid, NULL, (VOID **)&mHiiFont); return Status; } @@ -825,7 +870,7 @@ EfiLocateHiiProtocol ( Reset the text output device hardware and optionally run diagnostics. Implements SIMPLE_TEXT_OUTPUT.Reset(). - If ExtendeVerification is TRUE, then perform dependent Graphics Console + If ExtendedVerification is TRUE, then perform dependent Graphics Console device reset, and set display mode to mode 0. If ExtendedVerification is FALSE, only set display mode to mode 0. @@ -846,16 +891,17 @@ GraphicsConsoleConOutReset ( IN BOOLEAN ExtendedVerification ) { - EFI_STATUS Status; + EFI_STATUS Status; + Status = This->SetMode (This, 0); if (EFI_ERROR (Status)) { return Status; } + Status = This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK)); return Status; } - /** Write a Unicode string to the output device. @@ -885,25 +931,25 @@ GraphicsConsoleConOutOutputString ( IN CHAR16 *WString ) { - GRAPHICS_CONSOLE_DEV *Private; + GRAPHICS_CONSOLE_DEV *Private; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - INTN Mode; - UINTN MaxColumn; - UINTN MaxRow; - UINTN Width; - UINTN Height; - UINTN Delta; - EFI_STATUS Status; - BOOLEAN Warning; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + INTN Mode; + UINTN MaxColumn; + UINTN MaxRow; + UINTN Width; + UINTN Height; + UINTN Delta; + EFI_STATUS Status; + BOOLEAN Warning; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background; - UINTN DeltaX; - UINTN DeltaY; - UINTN Count; - UINTN Index; - INT32 OriginAttribute; - EFI_TPL OldTpl; + UINTN DeltaX; + UINTN DeltaY; + UINTN Count; + UINTN Index; + INT32 OriginAttribute; + EFI_TPL OldTpl; if (This->Mode->Mode == -1) { // @@ -913,20 +959,20 @@ GraphicsConsoleConOutOutputString ( } Status = EFI_SUCCESS; - + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); // // Current mode // - Mode = This->Mode->Mode; - Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); + Mode = This->Mode->Mode; + Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); GraphicsOutput = Private->GraphicsOutput; - UgaDraw = Private->UgaDraw; + UgaDraw = Private->UgaDraw; MaxColumn = Private->ModeData[Mode].Columns; MaxRow = Private->ModeData[Mode].Rows; - DeltaX = (UINTN) Private->ModeData[Mode].DeltaX; - DeltaY = (UINTN) Private->ModeData[Mode].DeltaY; + DeltaX = (UINTN)Private->ModeData[Mode].DeltaX; + DeltaY = (UINTN)Private->ModeData[Mode].DeltaY; Width = MaxColumn * EFI_GLYPH_WIDTH; Height = (MaxRow - 1) * EFI_GLYPH_HEIGHT; Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL); @@ -946,19 +992,18 @@ GraphicsConsoleConOutOutputString ( OriginAttribute = This->Mode->Attribute; while (*WString != L'\0') { - if (*WString == CHAR_BACKSPACE) { // // If the cursor is at the left edge of the display, then move the cursor // one row up. // - if (This->Mode->CursorColumn == 0 && This->Mode->CursorRow > 0) { + if ((This->Mode->CursorColumn == 0) && (This->Mode->CursorRow > 0)) { This->Mode->CursorRow--; - This->Mode->CursorColumn = (INT32) (MaxColumn - 1); + This->Mode->CursorColumn = (INT32)(MaxColumn - 1); This->OutputString (This, SpaceStr); FlushCursor (This); This->Mode->CursorRow--; - This->Mode->CursorColumn = (INT32) (MaxColumn - 1); + This->Mode->CursorColumn = (INT32)(MaxColumn - 1); } else if (This->Mode->CursorColumn > 0) { // // If the cursor is not at the left edge of the display, then move the cursor @@ -971,102 +1016,95 @@ GraphicsConsoleConOutOutputString ( } WString++; - } else if (*WString == CHAR_LINEFEED) { // // If the cursor is at the bottom of the display, then scroll the display one // row, and do not update the cursor position. Otherwise, move the cursor // down one row. // - if (This->Mode->CursorRow == (INT32) (MaxRow - 1)) { + if (This->Mode->CursorRow == (INT32)(MaxRow - 1)) { if (GraphicsOutput != NULL) { // // Scroll Screen Up One Row // GraphicsOutput->Blt ( - GraphicsOutput, - NULL, - EfiBltVideoToVideo, - DeltaX, - DeltaY + EFI_GLYPH_HEIGHT, - DeltaX, - DeltaY, - Width, - Height, - Delta - ); + GraphicsOutput, + NULL, + EfiBltVideoToVideo, + DeltaX, + DeltaY + EFI_GLYPH_HEIGHT, + DeltaX, + DeltaY, + Width, + Height, + Delta + ); // // Print Blank Line at last line // GraphicsOutput->Blt ( - GraphicsOutput, - &Background, - EfiBltVideoFill, - 0, - 0, - DeltaX, - DeltaY + Height, - Width, - EFI_GLYPH_HEIGHT, - Delta - ); + GraphicsOutput, + &Background, + EfiBltVideoFill, + 0, + 0, + DeltaX, + DeltaY + Height, + Width, + EFI_GLYPH_HEIGHT, + Delta + ); } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { // // Scroll Screen Up One Row // UgaDraw->Blt ( - UgaDraw, - NULL, - EfiUgaVideoToVideo, - DeltaX, - DeltaY + EFI_GLYPH_HEIGHT, - DeltaX, - DeltaY, - Width, - Height, - Delta - ); + UgaDraw, + NULL, + EfiUgaVideoToVideo, + DeltaX, + DeltaY + EFI_GLYPH_HEIGHT, + DeltaX, + DeltaY, + Width, + Height, + Delta + ); // // Print Blank Line at last line // UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *) (UINTN) &Background, - EfiUgaVideoFill, - 0, - 0, - DeltaX, - DeltaY + Height, - Width, - EFI_GLYPH_HEIGHT, - Delta - ); + UgaDraw, + (EFI_UGA_PIXEL *)(UINTN)&Background, + EfiUgaVideoFill, + 0, + 0, + DeltaX, + DeltaY + Height, + Width, + EFI_GLYPH_HEIGHT, + Delta + ); } } else { This->Mode->CursorRow++; } WString++; - } else if (*WString == CHAR_CARRIAGE_RETURN) { // // Move the cursor to the beginning of the current row. // This->Mode->CursorColumn = 0; WString++; - } else if (*WString == WIDE_CHAR) { - This->Mode->Attribute |= EFI_WIDE_ATTRIBUTE; WString++; - } else if (*WString == NARROW_CHAR) { - - This->Mode->Attribute &= (~ (UINT32) EFI_WIDE_ATTRIBUTE); + This->Mode->Attribute &= (~(UINT32)EFI_WIDE_ATTRIBUTE); WString++; - } else { // // Print the character at the current cursor position and move the cursor @@ -1082,14 +1120,16 @@ GraphicsConsoleConOutOutputString ( // Count is used to determine how many characters are used regardless of their attributes // for (Count = 0, Index = 0; (This->Mode->CursorColumn + Index) < MaxColumn; Count++, Index++) { - if (WString[Count] == CHAR_NULL || - WString[Count] == CHAR_BACKSPACE || - WString[Count] == CHAR_LINEFEED || - WString[Count] == CHAR_CARRIAGE_RETURN || - WString[Count] == WIDE_CHAR || - WString[Count] == NARROW_CHAR) { + if ((WString[Count] == CHAR_NULL) || + (WString[Count] == CHAR_BACKSPACE) || + (WString[Count] == CHAR_LINEFEED) || + (WString[Count] == CHAR_CARRIAGE_RETURN) || + (WString[Count] == WIDE_CHAR) || + (WString[Count] == NARROW_CHAR)) + { break; } + // // Is the wide attribute on? // @@ -1114,17 +1154,18 @@ GraphicsConsoleConOutOutputString ( if (EFI_ERROR (Status)) { Warning = TRUE; } + // // At the end of line, output carriage return and line feed // - WString += Count; - This->Mode->CursorColumn += (INT32) Index; - if (This->Mode->CursorColumn > (INT32) MaxColumn) { + WString += Count; + This->Mode->CursorColumn += (INT32)Index; + if (This->Mode->CursorColumn > (INT32)MaxColumn) { This->Mode->CursorColumn -= 2; This->OutputString (This, SpaceStr); } - if (This->Mode->CursorColumn >= (INT32) MaxColumn) { + if (This->Mode->CursorColumn >= (INT32)MaxColumn) { FlushCursor (This); This->OutputString (This, mCrLfString); FlushCursor (This); @@ -1142,7 +1183,6 @@ GraphicsConsoleConOutOutputString ( gBS->RestoreTPL (OldTpl); return Status; - } /** @@ -1171,10 +1211,10 @@ GraphicsConsoleConOutTestString ( IN CHAR16 *WString ) { - EFI_STATUS Status; - UINT16 Count; + EFI_STATUS Status; + UINT16 Count; - EFI_IMAGE_OUTPUT *Blt; + EFI_IMAGE_OUTPUT *Blt; Blt = NULL; Count = 0; @@ -1191,6 +1231,7 @@ GraphicsConsoleConOutTestString ( FreePool (Blt); Blt = NULL; } + Count++; if (EFI_ERROR (Status)) { @@ -1201,7 +1242,6 @@ GraphicsConsoleConOutTestString ( return EFI_SUCCESS; } - /** Returns information for an available text mode that the output device(s) supports @@ -1232,22 +1272,21 @@ GraphicsConsoleConOutQueryMode ( EFI_STATUS Status; EFI_TPL OldTpl; - if (ModeNumber >= (UINTN) This->Mode->MaxMode) { + if (ModeNumber >= (UINTN)This->Mode->MaxMode) { return EFI_UNSUPPORTED; } OldTpl = gBS->RaiseTPL (TPL_NOTIFY); Status = EFI_SUCCESS; - Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); + Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); - *Columns = Private->ModeData[ModeNumber].Columns; - *Rows = Private->ModeData[ModeNumber].Rows; + *Columns = Private->ModeData[ModeNumber].Columns; + *Rows = Private->ModeData[ModeNumber].Rows; - if (*Columns <= 0 || *Rows <= 0) { + if ((*Columns <= 0) || (*Rows <= 0)) { Status = EFI_UNSUPPORTED; goto Done; - } Done: @@ -1255,7 +1294,6 @@ Done: return Status; } - /** Sets the output device(s) to a specified mode. @@ -1278,35 +1316,35 @@ GraphicsConsoleConOutSetMode ( IN UINTN ModeNumber ) { - EFI_STATUS Status; - GRAPHICS_CONSOLE_DEV *Private; - GRAPHICS_CONSOLE_MODE_DATA *ModeData; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL *NewLineBuffer; - UINT32 HorizontalResolution; - UINT32 VerticalResolution; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - UINT32 ColorDepth; - UINT32 RefreshRate; - EFI_TPL OldTpl; + EFI_STATUS Status; + GRAPHICS_CONSOLE_DEV *Private; + GRAPHICS_CONSOLE_MODE_DATA *ModeData; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *NewLineBuffer; + UINT32 HorizontalResolution; + UINT32 VerticalResolution; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + UINT32 ColorDepth; + UINT32 RefreshRate; + EFI_TPL OldTpl; OldTpl = gBS->RaiseTPL (TPL_NOTIFY); - Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); + Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); GraphicsOutput = Private->GraphicsOutput; - UgaDraw = Private->UgaDraw; + UgaDraw = Private->UgaDraw; // // Make sure the requested mode number is supported // - if (ModeNumber >= (UINTN) This->Mode->MaxMode) { + if (ModeNumber >= (UINTN)This->Mode->MaxMode) { Status = EFI_UNSUPPORTED; goto Done; } - - ModeData = &(Private->ModeData[ModeNumber]); - if (ModeData->Columns <= 0 && ModeData->Rows <= 0) { + ModeData = &(Private->ModeData[ModeNumber]); + + if ((ModeData->Columns <= 0) && (ModeData->Rows <= 0)) { Status = EFI_UNSUPPORTED; goto Done; } @@ -1318,7 +1356,7 @@ GraphicsConsoleConOutSetMode ( // // If the new mode is the same as the old mode, then just return EFI_SUCCESS // - if ((INT32) ModeNumber == This->Mode->Mode) { + if ((INT32)ModeNumber == This->Mode->Mode) { // // Clear the current text window on the current graphics console // @@ -1326,6 +1364,7 @@ GraphicsConsoleConOutSetMode ( Status = EFI_SUCCESS; goto Done; } + // // Otherwise, the size of the text console and/or the GOP/UGA mode will be changed, // so erase the cursor, and free the LineBuffer for the current mode @@ -1371,17 +1410,17 @@ GraphicsConsoleConOutSetMode ( // The current graphics mode is correct, so simply clear the entire display // Status = GraphicsOutput->Blt ( - GraphicsOutput, - &mGraphicsEfiColors[0], - EfiBltVideoFill, - 0, - 0, - 0, - 0, - ModeData->GopWidth, - ModeData->GopHeight, - 0 - ); + GraphicsOutput, + &mGraphicsEfiColors[0], + EfiBltVideoFill, + 0, + 0, + 0, + 0, + ModeData->GopWidth, + ModeData->GopHeight, + 0 + ); } } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { // @@ -1394,7 +1433,7 @@ GraphicsConsoleConOutSetMode ( &ColorDepth, &RefreshRate ); - if (EFI_ERROR (Status) || HorizontalResolution != ModeData->GopWidth || VerticalResolution != ModeData->GopHeight) { + if (EFI_ERROR (Status) || (HorizontalResolution != ModeData->GopWidth) || (VerticalResolution != ModeData->GopHeight)) { // // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new graphics mode // @@ -1417,7 +1456,7 @@ GraphicsConsoleConOutSetMode ( // Status = UgaDraw->Blt ( UgaDraw, - (EFI_UGA_PIXEL *) (UINTN) &mGraphicsEfiColors[0], + (EFI_UGA_PIXEL *)(UINTN)&mGraphicsEfiColors[0], EfiUgaVideoFill, 0, 0, @@ -1433,15 +1472,15 @@ GraphicsConsoleConOutSetMode ( // // The new mode is valid, so commit the mode change // - This->Mode->Mode = (INT32) ModeNumber; + This->Mode->Mode = (INT32)ModeNumber; // // Move the text cursor to the upper left hand corner of the display and flush it // - This->Mode->CursorColumn = 0; - This->Mode->CursorRow = 0; + This->Mode->CursorColumn = 0; + This->Mode->CursorRow = 0; - FlushCursor (This); + FlushCursor (This); Status = EFI_SUCCESS; @@ -1450,7 +1489,6 @@ Done: return Status; } - /** Sets the background and foreground colors for the OutputString () and ClearScreen () functions. @@ -1474,20 +1512,13 @@ GraphicsConsoleConOutSetAttribute ( IN UINTN Attribute ) { - EFI_TPL OldTpl; + EFI_TPL OldTpl; - if ((Attribute | 0xFF) != 0xFF) { + if ((Attribute | 0x7F) != 0x7F) { return EFI_UNSUPPORTED; } - if (This->Mode->Mode == -1) { - // - // If current mode is not valid, return error. - // - return EFI_UNSUPPORTED; - } - - if ((INT32) Attribute == This->Mode->Attribute) { + if ((INT32)Attribute == This->Mode->Attribute) { return EFI_SUCCESS; } @@ -1495,7 +1526,7 @@ GraphicsConsoleConOutSetAttribute ( FlushCursor (This); - This->Mode->Attribute = (INT32) Attribute; + This->Mode->Attribute = (INT32)Attribute; FlushCursor (This); @@ -1504,7 +1535,6 @@ GraphicsConsoleConOutSetAttribute ( return EFI_SUCCESS; } - /** Clears the output device(s) display to the currently selected background color. @@ -1524,15 +1554,15 @@ GraphicsConsoleConOutClearScreen ( IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This ) { - EFI_STATUS Status; - GRAPHICS_CONSOLE_DEV *Private; - GRAPHICS_CONSOLE_MODE_DATA *ModeData; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background; - EFI_TPL OldTpl; - + EFI_STATUS Status; + GRAPHICS_CONSOLE_DEV *Private; + GRAPHICS_CONSOLE_MODE_DATA *ModeData; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background; + EFI_TPL OldTpl; + if (This->Mode->Mode == -1) { // // If current mode is not valid, return error. @@ -1542,29 +1572,29 @@ GraphicsConsoleConOutClearScreen ( OldTpl = gBS->RaiseTPL (TPL_NOTIFY); - Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); + Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); GraphicsOutput = Private->GraphicsOutput; - UgaDraw = Private->UgaDraw; - ModeData = &(Private->ModeData[This->Mode->Mode]); + UgaDraw = Private->UgaDraw; + ModeData = &(Private->ModeData[This->Mode->Mode]); GetTextColors (This, &Foreground, &Background); if (GraphicsOutput != NULL) { Status = GraphicsOutput->Blt ( - GraphicsOutput, - &Background, - EfiBltVideoFill, - 0, - 0, - 0, - 0, - ModeData->GopWidth, - ModeData->GopHeight, - 0 - ); + GraphicsOutput, + &Background, + EfiBltVideoFill, + 0, + 0, + 0, + 0, + ModeData->GopWidth, + ModeData->GopHeight, + 0 + ); } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { Status = UgaDraw->Blt ( UgaDraw, - (EFI_UGA_PIXEL *) (UINTN) &Background, + (EFI_UGA_PIXEL *)(UINTN)&Background, EfiUgaVideoFill, 0, 0, @@ -1578,8 +1608,8 @@ GraphicsConsoleConOutClearScreen ( Status = EFI_UNSUPPORTED; } - This->Mode->CursorColumn = 0; - This->Mode->CursorRow = 0; + This->Mode->CursorColumn = 0; + This->Mode->CursorRow = 0; FlushCursor (This); @@ -1588,7 +1618,6 @@ GraphicsConsoleConOutClearScreen ( return Status; } - /** Sets the current coordinates of the cursor position. @@ -1632,23 +1661,23 @@ GraphicsConsoleConOutSetCursorPosition ( OldTpl = gBS->RaiseTPL (TPL_NOTIFY); - Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); - ModeData = &(Private->ModeData[This->Mode->Mode]); + Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); + ModeData = &(Private->ModeData[This->Mode->Mode]); if ((Column >= ModeData->Columns) || (Row >= ModeData->Rows)) { Status = EFI_UNSUPPORTED; goto Done; } - if ((This->Mode->CursorColumn == (INT32) Column) && (This->Mode->CursorRow == (INT32) Row)) { + if ((This->Mode->CursorColumn == (INT32)Column) && (This->Mode->CursorRow == (INT32)Row)) { Status = EFI_SUCCESS; goto Done; } FlushCursor (This); - This->Mode->CursorColumn = (INT32) Column; - This->Mode->CursorRow = (INT32) Row; + This->Mode->CursorColumn = (INT32)Column; + This->Mode->CursorRow = (INT32)Row; FlushCursor (This); @@ -1658,7 +1687,6 @@ Done: return Status; } - /** Makes the cursor visible or invisible. @@ -1680,7 +1708,7 @@ GraphicsConsoleConOutEnableCursor ( IN BOOLEAN Visible ) { - EFI_TPL OldTpl; + EFI_TPL OldTpl; if (This->Mode->Mode == -1) { // @@ -1702,7 +1730,7 @@ GraphicsConsoleConOutEnableCursor ( } /** - Gets Graphics Console devcie's foreground color and background color. + Gets Graphics Console device's foreground color and background color. @param This Protocol instance pointer. @param Foreground Returned text foreground color. @@ -1720,7 +1748,7 @@ GetTextColors ( { INTN Attribute; - Attribute = This->Mode->Attribute & 0x7F; + Attribute = This->Mode->Attribute & 0x7F; *Foreground = mGraphicsEfiColors[Attribute & 0x0f]; *Background = mGraphicsEfiColors[Attribute >> 4]; @@ -1748,40 +1776,42 @@ DrawUnicodeWeightAtCursorN ( IN UINTN Count ) { - EFI_STATUS Status; - GRAPHICS_CONSOLE_DEV *Private; - EFI_IMAGE_OUTPUT *Blt; - EFI_STRING String; - EFI_FONT_DISPLAY_INFO *FontInfo; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - EFI_HII_ROW_INFO *RowInfoArray; - UINTN RowInfoArraySize; + EFI_STATUS Status; + GRAPHICS_CONSOLE_DEV *Private; + EFI_IMAGE_OUTPUT *Blt; + EFI_STRING String; + EFI_FONT_DISPLAY_INFO *FontInfo; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + EFI_HII_ROW_INFO *RowInfoArray; + UINTN RowInfoArraySize; Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); - Blt = (EFI_IMAGE_OUTPUT *) AllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT)); + Blt = (EFI_IMAGE_OUTPUT *)AllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT)); if (Blt == NULL) { return EFI_OUT_OF_RESOURCES; } - Blt->Width = (UINT16) (Private->ModeData[This->Mode->Mode].GopWidth); - Blt->Height = (UINT16) (Private->ModeData[This->Mode->Mode].GopHeight); + Blt->Width = (UINT16)(Private->ModeData[This->Mode->Mode].GopWidth); + Blt->Height = (UINT16)(Private->ModeData[This->Mode->Mode].GopHeight); String = AllocateCopyPool ((Count + 1) * sizeof (CHAR16), UnicodeWeight); if (String == NULL) { FreePool (Blt); return EFI_OUT_OF_RESOURCES; } + // // Set the end character // *(String + Count) = L'\0'; - FontInfo = (EFI_FONT_DISPLAY_INFO *) AllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO)); + FontInfo = (EFI_FONT_DISPLAY_INFO *)AllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO)); if (FontInfo == NULL) { FreePool (Blt); FreePool (String); return EFI_OUT_OF_RESOURCES; } + // // Get current foreground and background colors. // @@ -1805,13 +1835,12 @@ DrawUnicodeWeightAtCursorN ( NULL, NULL ); - } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { // // If Graphics Output protocol cannot be found and PcdUgaConsumeSupport enabled, // using UGA Draw protocol to draw. // - ASSERT (Private->UgaDraw!= NULL); + ASSERT (Private->UgaDraw != NULL); UgaDraw = Private->UgaDraw; @@ -1828,17 +1857,17 @@ DrawUnicodeWeightAtCursorN ( // we ask StringToImage to print the string to blt buffer, then blt to device using UgaDraw. // Status = mHiiFont->StringToImage ( - mHiiFont, - EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_IGNORE_LINE_BREAK, - String, - FontInfo, - &Blt, - This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX, - This->Mode->CursorRow * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY, - &RowInfoArray, - &RowInfoArraySize, - NULL - ); + mHiiFont, + EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_IGNORE_LINE_BREAK, + String, + FontInfo, + &Blt, + This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX, + This->Mode->CursorRow * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY, + &RowInfoArray, + &RowInfoArraySize, + NULL + ); if (!EFI_ERROR (Status)) { // @@ -1849,7 +1878,7 @@ DrawUnicodeWeightAtCursorN ( Status = UgaDraw->Blt ( UgaDraw, - (EFI_UGA_PIXEL *) Blt->Image.Bitmap, + (EFI_UGA_PIXEL *)Blt->Image.Bitmap, EfiUgaBltBufferToVideo, This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX, (This->Mode->CursorRow) * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY, @@ -1870,22 +1899,25 @@ DrawUnicodeWeightAtCursorN ( if (Blt != NULL) { FreePool (Blt); } + if (String != NULL) { FreePool (String); } + if (FontInfo != NULL) { FreePool (FontInfo); } + return Status; } /** Flush the cursor on the screen. - + If CursorVisible is FALSE, nothing to do and return directly. - If CursorVisible is TRUE, + If CursorVisible is TRUE, i) If the cursor shows on screen, it will be erased. - ii) If the cursor does not show on screen, it will be shown. + ii) If the cursor does not show on screen, it will be shown. @param This Protocol instance pointer. @@ -1897,17 +1929,17 @@ FlushCursor ( IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This ) { - GRAPHICS_CONSOLE_DEV *Private; - EFI_SIMPLE_TEXT_OUTPUT_MODE *CurrentMode; - INTN GlyphX; - INTN GlyphY; - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Foreground; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Background; - EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[EFI_GLYPH_HEIGHT][EFI_GLYPH_WIDTH]; - UINTN PosX; - UINTN PosY; + GRAPHICS_CONSOLE_DEV *Private; + EFI_SIMPLE_TEXT_OUTPUT_MODE *CurrentMode; + INTN GlyphX; + INTN GlyphY; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; + EFI_UGA_DRAW_PROTOCOL *UgaDraw; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Foreground; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Background; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[EFI_GLYPH_HEIGHT][EFI_GLYPH_WIDTH]; + UINTN PosX; + UINTN PosY; CurrentMode = This->Mode; @@ -1915,9 +1947,9 @@ FlushCursor ( return EFI_SUCCESS; } - Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); + Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This); GraphicsOutput = Private->GraphicsOutput; - UgaDraw = Private->UgaDraw; + UgaDraw = Private->UgaDraw; // // In this driver, only narrow character was supported. @@ -1925,34 +1957,34 @@ FlushCursor ( // // Blt a character to the screen // - GlyphX = (CurrentMode->CursorColumn * EFI_GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX; - GlyphY = (CurrentMode->CursorRow * EFI_GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY; + GlyphX = (CurrentMode->CursorColumn * EFI_GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX; + GlyphY = (CurrentMode->CursorRow * EFI_GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY; if (GraphicsOutput != NULL) { GraphicsOutput->Blt ( - GraphicsOutput, - (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar, - EfiBltVideoToBltBuffer, - GlyphX, - GlyphY, - 0, - 0, - EFI_GLYPH_WIDTH, - EFI_GLYPH_HEIGHT, - EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) - ); + GraphicsOutput, + (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)BltChar, + EfiBltVideoToBltBuffer, + GlyphX, + GlyphY, + 0, + 0, + EFI_GLYPH_WIDTH, + EFI_GLYPH_HEIGHT, + EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *) (UINTN) BltChar, - EfiUgaVideoToBltBuffer, - GlyphX, - GlyphY, - 0, - 0, - EFI_GLYPH_WIDTH, - EFI_GLYPH_HEIGHT, - EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL) - ); + UgaDraw, + (EFI_UGA_PIXEL *)(UINTN)BltChar, + EfiUgaVideoToBltBuffer, + GlyphX, + GlyphY, + 0, + 0, + EFI_GLYPH_WIDTH, + EFI_GLYPH_HEIGHT, + EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL) + ); } GetTextColors (This, &Foreground.Pixel, &Background.Pixel); @@ -1970,30 +2002,30 @@ FlushCursor ( if (GraphicsOutput != NULL) { GraphicsOutput->Blt ( - GraphicsOutput, - (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar, - EfiBltBufferToVideo, - 0, - 0, - GlyphX, - GlyphY, - EFI_GLYPH_WIDTH, - EFI_GLYPH_HEIGHT, - EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) - ); + GraphicsOutput, + (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)BltChar, + EfiBltBufferToVideo, + 0, + 0, + GlyphX, + GlyphY, + EFI_GLYPH_WIDTH, + EFI_GLYPH_HEIGHT, + EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) + ); } else if (FeaturePcdGet (PcdUgaConsumeSupport)) { UgaDraw->Blt ( - UgaDraw, - (EFI_UGA_PIXEL *) (UINTN) BltChar, - EfiUgaBltBufferToVideo, - 0, - 0, - GlyphX, - GlyphY, - EFI_GLYPH_WIDTH, - EFI_GLYPH_HEIGHT, - EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL) - ); + UgaDraw, + (EFI_UGA_PIXEL *)(UINTN)BltChar, + EfiUgaBltBufferToVideo, + 0, + 0, + GlyphX, + GlyphY, + EFI_GLYPH_WIDTH, + EFI_GLYPH_HEIGHT, + EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL) + ); } return EFI_SUCCESS; @@ -2010,16 +2042,16 @@ FlushCursor ( VOID EFIAPI RegisterFontPackage ( - IN EFI_EVENT Event, - IN VOID *Context + IN EFI_EVENT Event, + IN VOID *Context ) { - EFI_STATUS Status; - EFI_HII_SIMPLE_FONT_PACKAGE_HDR *SimplifiedFont; - UINT32 PackageLength; - UINT8 *Package; - UINT8 *Location; - EFI_HII_DATABASE_PROTOCOL *HiiDatabase; + EFI_STATUS Status; + EFI_HII_SIMPLE_FONT_PACKAGE_HDR *SimplifiedFont; + UINT32 PackageLength; + UINT8 *Package; + UINT8 *Location; + EFI_HII_DATABASE_PROTOCOL *HiiDatabase; // // Locate HII Database Protocol @@ -2027,7 +2059,7 @@ RegisterFontPackage ( Status = gBS->LocateProtocol ( &gEfiHiiDatabaseProtocolGuid, NULL, - (VOID **) &HiiDatabase + (VOID **)&HiiDatabase ); if (EFI_ERROR (Status)) { return; @@ -2050,17 +2082,17 @@ RegisterFontPackage ( // | | // +--------------------------------+ - PackageLength = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + mNarrowFontSize + 4; - Package = AllocateZeroPool (PackageLength); + PackageLength = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + mNarrowFontSize + 4; + Package = AllocateZeroPool (PackageLength); ASSERT (Package != NULL); - WriteUnaligned32((UINT32 *) Package,PackageLength); - SimplifiedFont = (EFI_HII_SIMPLE_FONT_PACKAGE_HDR *) (Package + 4); - SimplifiedFont->Header.Length = (UINT32) (PackageLength - 4); + WriteUnaligned32 ((UINT32 *)Package, PackageLength); + SimplifiedFont = (EFI_HII_SIMPLE_FONT_PACKAGE_HDR *)(Package + 4); + SimplifiedFont->Header.Length = (UINT32)(PackageLength - 4); SimplifiedFont->Header.Type = EFI_HII_PACKAGE_SIMPLE_FONTS; - SimplifiedFont->NumberOfNarrowGlyphs = (UINT16) (mNarrowFontSize / sizeof (EFI_NARROW_GLYPH)); + SimplifiedFont->NumberOfNarrowGlyphs = (UINT16)(mNarrowFontSize / sizeof (EFI_NARROW_GLYPH)); - Location = (UINT8 *) (&SimplifiedFont->NumberOfWideGlyphs + 1); + Location = (UINT8 *)(&SimplifiedFont->NumberOfWideGlyphs + 1); CopyMem (Location, gUsStdNarrowGlyphData, mNarrowFontSize); // @@ -2089,11 +2121,11 @@ RegisterFontPackage ( EFI_STATUS EFIAPI InitializeGraphicsConsole ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; + EFI_STATUS Status; // // Register notify function on HII Database Protocol to add font package. @@ -2121,5 +2153,3 @@ InitializeGraphicsConsole ( return Status; } - -