Ard, There are a number of conditions that DisplayUpdateProgressLibGraphics will not display a Progress bar. * No GOP * No EDK II Boot Logo 2 Protocol * The EDK II Boot Logo 2 Protocol GetBootLogo() service does not return a logo
If capsules are processed when only a text console is present, then the text version of the lib should be used. DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf Best regards, Mike > -----Original Message----- > From: Ard Biesheuvel [mailto:[email protected]] > Sent: Thursday, May 31, 2018 4:09 AM > To: Kinney, Michael D <[email protected]>; Leif > Lindholm <[email protected]> > Cc: [email protected]; Dong, Eric > <[email protected]>; Zeng, Star <[email protected]> > Subject: Re: [edk2] [Patch v3 2/3] MdeModulePkg: Add > DisplayUpdateProgressLib instances > > (+ Leif) > > On 25 May 2018 at 08:15, Michael D Kinney > <[email protected]> wrote: > > https://bugzilla.tianocore.org/show_bug.cgi?id=801 > > > > Based on content from the following branch/commits: > > > https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsul > eSupport > > > > Add DisplayUpdateProgressLib instances for text > consoles > > and graphical consoles. > > > > Hello Mike, > > Is it correct that DisplayUpdateProgressLibGraphics > shows no output at > all if no GOP instance is detected? > > The current FlashAccessLib implementation I have for > SynQuacer falls > back to console output in that case, so it would regress > to having no > visible progress indication whatsoever if I move it to > this library. > What do you recommend in this case? Can we use the > result code of the > progress reporting callback as an indication of a > missing GOP, and > retain the fallback in FlashAccessLib in this case? > > > > > Cc: Sean Brogan <[email protected]> > > Cc: Star Zeng <[email protected]> > > Cc: Eric Dong <[email protected]> > > Signed-off-by: Michael D Kinney > <[email protected]> > > Contributed-under: TianoCore Contribution Agreement > 1.1 > > --- > > .../DisplayUpdateProgressLibGraphics.c | > 475 +++++++++++++++++++++ > > .../DisplayUpdateProgressLibGraphics.inf | > 60 +++ > > .../DisplayUpdateProgressLibGraphics.uni | > 18 + > > .../DisplayUpdateProgressLibText.c | > 174 ++++++++ > > .../DisplayUpdateProgressLibText.inf | > 53 +++ > > .../DisplayUpdateProgressLibText.uni | > 18 + > > MdeModulePkg/MdeModulePkg.dsc | > 3 + > > 7 files changed, 801 insertions(+) > > create mode 100644 > MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/Di > splayUpdateProgressLibGraphics.c > > create mode 100644 > MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/Di > splayUpdateProgressLibGraphics.inf > > create mode 100644 > MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/Di > splayUpdateProgressLibGraphics.uni > > create mode 100644 > MdeModulePkg/Library/DisplayUpdateProgressLibText/Displa > yUpdateProgressLibText.c > > create mode 100644 > MdeModulePkg/Library/DisplayUpdateProgressLibText/Displa > yUpdateProgressLibText.inf > > create mode 100644 > MdeModulePkg/Library/DisplayUpdateProgressLibText/Displa > yUpdateProgressLibText.uni > > > > diff --git > a/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.c > b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.c > > new file mode 100644 > > index 0000000000..007522cea0 > > --- /dev/null > > +++ > b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.c > > @@ -0,0 +1,475 @@ > > +/** @file > > + Provides services to display completion progress of > a firmware update on a > > + graphical console that supports the Graphics Output > Protocol. > > + > > + Copyright (c) 2016, Microsoft Corporation. All > rights reserved.<BR> > > + Copyright (c) 2018, Intel Corporation. All rights > reserved.<BR> > > + > > + Redistribution and use in source and binary forms, > with or without > > + modification, are permitted provided that the > following conditions are met: > > + 1. Redistributions of source code must retain the > above copyright notice, > > + this list of conditions and the following > disclaimer. > > + 2. Redistributions in binary form must reproduce > the above copyright notice, > > + this list of conditions and the following > disclaimer in the documentation > > + and/or other materials provided with the > distribution. > > + > > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS > AND CONTRIBUTORS "AS IS" AND > > + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, THE IMPLIED > > + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR PURPOSE ARE DISCLAIMED. > > + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE FOR ANY DIRECT, > > + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL DAMAGES (INCLUDING, > > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > OR SERVICES; LOSS OF USE, > > + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > CAUSED AND ON ANY THEORY OF > > + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING NEGLIGENCE > > + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS SOFTWARE, EVEN IF > > + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > + > > +**/ > > + > > +#include <PiDxe.h> > > +#include <Library/BaseMemoryLib.h> > > +#include <Library/MemoryAllocationLib.h> > > +#include <Library/UefiBootServicesTableLib.h> > > +#include <Library/DebugLib.h> > > +#include <Library/BaseLib.h> > > +#include <Library/UefiLib.h> > > + > > +#include <Protocol/GraphicsOutput.h> > > +#include <Protocol/BootLogo2.h> > > + > > +// > > +// Values in percent of of logo height. > > +// > > +#define LOGO_BOTTOM_PADDING 20 > > +#define PROGRESS_BLOCK_HEIGHT 10 > > + > > +// > > +// Graphics Output Protocol instance to display > progress bar > > +// > > +EFI_GRAPHICS_OUTPUT_PROTOCOL *mGop = NULL; > > + > > +// > > +// Set to 100 percent so it is reset on first call. > > +// > > +UINTN mPreviousProgress = 100; > > + > > +// > > +// Display coordinates for the progress bar. > > +// > > +UINTN mStartX = 0; > > +UINTN mStartY = 0; > > + > > +// > > +// Width and height of the progress bar. > > +// > > +UINTN mBlockWidth = 0; > > +UINTN mBlockHeight = 0; > > + > > +// > > +// GOP bitmap of the progress bar. Initialized on > every new progress of 100% > > +// > > +EFI_GRAPHICS_OUTPUT_BLT_PIXEL *mBlockBitmap; > > + > > +// > > +// GOP bitmap of the progress bar backround. > Initialized once. > > +// > > +EFI_GRAPHICS_OUTPUT_BLT_PIXEL > *mProgressBarBackground; > > + > > +// > > +// Default mask used to detect the left, right , top, > and bottom of logo. Only > > +// green and blue pixels are used for logo detection. > > +// > > +const EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION > mLogoDetectionColorMask = { > > + { > > + 0xFF, // Blue > > + 0xFF, // Green > > + 0x00, // Red > > + 0x00 // Reserved > > + } > > +}; > > + > > +// > > +// Background color of progress bar. Grey. > > +// > > +const EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION > mProgressBarBackgroundColor = { > > + { > > + 0x80, // Blue > > + 0x80, // Green > > + 0x80, // Red > > + 0x00 // Reserved > > + } > > +}; > > + > > +// > > +// Default color of progress completion. White. > > +// > > +const EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION > mProgressBarDefaultColor = { > > + { > > + 0xFF, // Blue > > + 0xFF, // Green > > + 0xFF, // Red > > + 0x00 // Reserved > > + } > > +}; > > + > > +// > > +// Set to TRUE if a valid Graphics Output Protocol is > found and the progress > > +// bar fits under the boot logo using the current > graphics mode. > > +// > > +BOOLEAN mGraphicsGood = FALSE; > > + > > +/* > > + Internal function used to find the bounds of the > white logo (on black or > > + red background). > > + > > + These bounds are then computed to find the block > size, 0%, 100%, etc. > > + > > +*/ > > +VOID > > +FindDim ( > > + VOID > > + ) > > +{ > > + EFI_STATUS Status; > > + INTN LogoX; > > + INTN LogoStartX; > > + INTN LogoEndX; > > + INTN LogoY; > > + INTN LogoStartY; > > + INTN LogoEndY; > > + UINTN OffsetX; > // Logo screen coordinate > > + UINTN OffsetY; > // Logo screen coordinate > > + UINTN Width; > // Width of logo in pixels > > + UINTN Height; > // Height of logo in pixels > > + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Logo; > > + EDKII_BOOT_LOGO2_PROTOCOL *BootLogo; > > + EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *Pixel; > > + > > + Logo = NULL; > > + BootLogo = NULL; > > + > > + // > > + // Return if a Graphics Output Protocol ha snot > been found. > > + // > > + if (mGop == NULL) { > > + DEBUG ((DEBUG_ERROR, "No GOP found. No progress > bar support. \n")); > > + return; > > + } > > + > > + // > > + // Get boot logo protocol so we know where on the > screen to grab > > + // > > + Status = gBS->LocateProtocol ( > > + &gEdkiiBootLogo2ProtocolGuid, > > + NULL, > > + (VOID **)&BootLogo > > + ); > > + if ((BootLogo == NULL) || (EFI_ERROR (Status))) { > > + DEBUG ((DEBUG_ERROR, "Failed to locate > gEdkiiBootLogo2ProtocolGuid. No Progress bar support. > \n", Status)); > > + return; > > + } > > + > > + // > > + // Get logo location and size > > + // > > + Status = BootLogo->GetBootLogo ( > > + BootLogo, > > + &Logo, > > + &OffsetX, > > + &OffsetY, > > + &Width, > > + &Height > > + ); > > + if (EFI_ERROR (Status)) { > > + DEBUG ((DEBUG_ERROR, "Failed to Get Boot Logo > Status = %r. No Progress bar support. \n", Status)); > > + return; > > + } > > + > > + // > > + // Within logo buffer find where the actual logo > starts/ends > > + // > > + LogoEndX = 0; > > + LogoEndY = 0; > > + > > + // > > + // Find left side of logo in logo coordinates > > + // > > + for (LogoX = 0, LogoStartX = Width; LogoX < > LogoStartX; LogoX++) { > > + Pixel = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION > *)(Logo + LogoX); > > + for (LogoY = 0; LogoY < (INTN)Height; LogoY++) { > > + if ((Pixel->Raw & mLogoDetectionColorMask.Raw) > != 0x0) { > > + LogoStartX = LogoX; > > + // > > + // For loop searches from right side back to > this column. > > + // > > + LogoEndX = LogoX; > > + DEBUG ((DEBUG_INFO, "StartX found at (%d, %d) > Color is: 0x%X \n", LogoX, LogoY, Pixel->Raw)); > > + break; > > + } > > + Pixel = Pixel + Width; > > + } > > + } > > + > > + // > > + // Find right side of logo > > + // > > + for (LogoX = Width - 1; LogoX >= LogoEndX; LogoX--) > { > > + Pixel = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION > *)(Logo + LogoX); > > + for (LogoY = 0; LogoY < (INTN)Height; LogoY++) { > > + if ((Pixel->Raw & mLogoDetectionColorMask.Raw) > != 0x0) { > > + LogoEndX = LogoX; > > + DEBUG ((DEBUG_INFO, "EndX found at (%d, %d) > Color is: 0x%X \n", LogoX, LogoY, Pixel->Raw)); > > + break; > > + } > > + Pixel = Pixel + Width; > > + } > > + } > > + > > + // > > + // Compute mBlockWidth > > + // > > + mBlockWidth = ((LogoEndX - LogoStartX) + 99) / 100; > > + > > + // > > + // Adjust mStartX based on block width so it is > centered under logo > > + // > > + mStartX = LogoStartX + OffsetX - (((mBlockWidth * > 100) - (LogoEndX - LogoStartX)) / 2); > > + DEBUG ((DEBUG_INFO, "mBlockWidth set to 0x%X\n", > mBlockWidth)); > > + DEBUG ((DEBUG_INFO, "mStartX set to 0x%X\n", > mStartX)); > > + > > + // > > + // Find the top of the logo > > + // > > + for (LogoY = 0, LogoStartY = Height; LogoY < > LogoStartY; LogoY++) { > > + Pixel = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION > *)(Logo + (Width * LogoY)); > > + for (LogoX = 0; LogoX < (INTN)Width; LogoX++) { > > + //not black or red > > + if ((Pixel->Raw & mLogoDetectionColorMask.Raw) > != 0x0) { > > + LogoStartY = LogoY; > > + LogoEndY = LogoY; //for next loop will search > from bottom side back to this row. > > + DEBUG ((DEBUG_INFO, "StartY found at (%d, %d) > Color is: 0x%X \n", LogoX, LogoY, Pixel->Raw)); > > + break; > > + } > > + Pixel++; > > + } > > + } > > + > > + // > > + // Find the bottom of the logo > > + // > > + for (LogoY = Height - 1; LogoY >= LogoEndY; LogoY-- > ) { > > + Pixel = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION > *)(Logo + (Width * LogoY)); > > + for (LogoX = 0; LogoX < (INTN)Width; LogoX++) { > > + if ((Pixel->Raw & mLogoDetectionColorMask.Raw) > != 0x0) { > > + LogoEndY = LogoY; > > + DEBUG ((DEBUG_INFO, "EndY found at (%d, %d) > Color is: 0x%X \n", LogoX, LogoY, Pixel->Raw)); > > + break; > > + } > > + Pixel++; > > + } > > + } > > + > > + // > > + // Compute bottom padding (distance between logo > bottom and progress bar) > > + // > > + mStartY = (((LogoEndY - LogoStartY) * > LOGO_BOTTOM_PADDING) / 100) + LogoEndY + OffsetY; > > + > > + // > > + // Compute progress bar height > > + // > > + mBlockHeight = (((LogoEndY - LogoStartY) * > PROGRESS_BLOCK_HEIGHT) / 100); > > + > > + DEBUG ((DEBUG_INFO, "mBlockHeight set to 0x%X\n", > mBlockHeight)); > > + > > + // > > + // Create progress bar background (one time init). > > + // > > + mProgressBarBackground = AllocatePool (mBlockWidth > * 100 * mBlockHeight * sizeof > (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); > > + if (mProgressBarBackground == NULL) { > > + DEBUG ((DEBUG_ERROR, "Failed to allocate progress > bar background\n")); > > + return; > > + } > > + > > + // > > + // Fill the progress bar with the background color > > + // > > + SetMem32 ( > > + mProgressBarBackground, > > + (mBlockWidth * 100 * mBlockHeight * sizeof > (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)), > > + mProgressBarBackgroundColor.Raw > > + ); > > + > > + // > > + // Allocate mBlockBitmap > > + // > > + mBlockBitmap = AllocatePool (mBlockWidth * > mBlockHeight * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); > > + if (mBlockBitmap == NULL) { > > + FreePool (mProgressBarBackground); > > + DEBUG ((DEBUG_ERROR, "Failed to allocate > block\n")); > > + return; > > + } > > + > > + // > > + // Check screen width and height and make sure it > fits. > > + // > > + if ((mBlockHeight > Height) || (mBlockWidth > > Width) || (mBlockHeight < 1) || (mBlockWidth < 1)) { > > + DEBUG ((DEBUG_ERROR, "DisplayUpdateProgressLib - > Progress - Failed to get valid width and height.\n")); > > + DEBUG ((DEBUG_ERROR, "DisplayUpdateProgressLib - > Progress - mBlockHeight: 0x%X mBlockWidth: 0x%X.\n", > mBlockHeight, mBlockWidth)); > > + FreePool (mProgressBarBackground); > > + FreePool (mBlockBitmap); > > + return; > > + } > > + > > + mGraphicsGood = TRUE; > > +} > > + > > +/** > > + Function indicates the current completion progress > of a firmware update. > > + Platform may override with its own specific > function. > > + > > + @param[in] Completion A value between 0 and 100 > indicating the current > > + completion progress of a > firmware update. This > > + value must the the same or > higher than previous > > + calls to this service. The > first call of 0 or a > > + value of 0 after reaching a > value of 100 resets > > + the progress indicator to 0. > > + @param[in] Color Color of the progress > indicator. Only used when > > + Completion is 0 to set the > color of the progress > > + indicator. If Color is > NULL, then the default color > > + is used. > > + > > + @retval EFI_SUCCESS Progress displayed > successfully. > > + @retval EFI_INVALID_PARAMETER Completion is not in > range 0..100. > > + @retval EFI_INVALID_PARAMETER Completion is less > than Completion value from > > + a previous call to > this service. > > + @retval EFI_NOT_READY The device used to > indicate progress is not > > + available. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +DisplayUpdateProgress ( > > + IN UINTN Completion, > > + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *Color > OPTIONAL > > + ) > > +{ > > + EFI_STATUS Status; > > + UINTN PreX; > > + UINTN Index; > > + > > + // > > + // Check range > > + // > > + if (Completion > 100) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Check to see if this Completion percentage has > already been displayed > > + // > > + if (Completion == mPreviousProgress) { > > + return EFI_SUCCESS; > > + } > > + > > + // > > + // Find Graphics Output Protocol if not already > set. 1 time. > > + // > > + if (mGop == NULL) { > > + Status = gBS->HandleProtocol ( > > + gST->ConsoleOutHandle, > > + &gEfiGraphicsOutputProtocolGuid, > > + (VOID**)&mGop > > + ); > > + if (EFI_ERROR (Status)) { > > + Status = gBS->LocateProtocol > (&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&mGop); > > + if (EFI_ERROR (Status)) { > > + mGop = NULL; > > + DEBUG ((DEBUG_ERROR, "Show Progress Function > could not locate GOP. Status = %r\n", Status)); > > + return EFI_NOT_READY; > > + } > > + } > > + > > + // > > + // Run once > > + // > > + FindDim (); > > + } > > + > > + // > > + // Make sure a valid start, end, and size info are > available (find the Logo) > > + // > > + if (!mGraphicsGood) { > > + DEBUG ((DEBUG_INFO, "Graphics Not Good. Not > doing any onscreen visual display\n")); > > + return EFI_NOT_READY; > > + } > > + > > + // > > + // Do special init on first call of each progress > session > > + // > > + if (mPreviousProgress == 100) { > > + // > > + // Draw progress bar background > > + // > > + mGop->Blt ( > > + mGop, > > + mProgressBarBackground, > > + EfiBltBufferToVideo, > > + 0, > > + 0, > > + mStartX, > > + mStartY, > > + (mBlockWidth * 100), > > + mBlockHeight, > > + 0 > > + ); > > + > > + DEBUG ((DEBUG_VERBOSE, "Color is 0x%X\n", > > + (Color == NULL) ? mProgressBarDefaultColor.Raw > : Color->Raw > > + )); > > + > > + // > > + // Update block bitmap with correct color > > + // > > + SetMem32 ( > > + mBlockBitmap, > > + (mBlockWidth * mBlockHeight * sizeof > (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)), > > + (Color == NULL) ? mProgressBarDefaultColor.Raw > : Color->Raw > > + ); > > + > > + // > > + // Clear previous > > + // > > + mPreviousProgress = 0; > > + } > > + > > + // > > + // Can not update progress bar if Completion is > less than previous > > + // > > + if (Completion < mPreviousProgress) { > > + DEBUG ((DEBUG_WARN, "WARNING: Completion (%d) > should not be lesss than Previous (%d)!!!\n", > Completion, mPreviousProgress)); > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + PreX = ((mPreviousProgress * mBlockWidth) + > mStartX); > > + for (Index = 0; Index < (Completion - > mPreviousProgress); Index++) { > > + // > > + // Show progress by coloring new area > > + // > > + mGop->Blt ( > > + mGop, > > + mBlockBitmap, > > + EfiBltBufferToVideo, > > + 0, > > + 0, > > + PreX, > > + mStartY, > > + mBlockWidth, > > + mBlockHeight, > > + 0 > > + ); > > + PreX += mBlockWidth; > > + } > > + > > + mPreviousProgress = Completion; > > + > > + return EFI_SUCCESS; > > +} > > diff --git > a/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.inf > b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.inf > > new file mode 100644 > > index 0000000000..ada6076770 > > --- /dev/null > > +++ > b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.inf > > @@ -0,0 +1,60 @@ > > +## @file > > +# Provides services to display completion progress > of a firmware update on a > > +# graphical console that supports the Graphics > Output Protocol. > > +# > > +# Copyright (c) 2016, Microsoft Corporation, All > rights reserved.<BR> > > +# Copyright (c) 2018, Intel Corporation. All rights > reserved.<BR> > > +# > > +# Redistribution and use in source and binary forms, > with or without > > +# modification, are permitted provided that the > following conditions are met: > > +# 1. Redistributions of source code must retain the > above copyright notice, > > +# this list of conditions and the following > disclaimer. > > +# 2. Redistributions in binary form must reproduce > the above copyright notice, > > +# this list of conditions and the following > disclaimer in the documentation > > +# and/or other materials provided with the > distribution. > > +# > > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS > AND CONTRIBUTORS "AS IS" AND > > +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, THE IMPLIED > > +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR PURPOSE ARE DISCLAIMED. > > +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE FOR ANY DIRECT, > > +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL DAMAGES (INCLUDING, > > +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; LOSS OF USE, > > +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND ON ANY THEORY OF > > +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING NEGLIGENCE > > +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS SOFTWARE, EVEN IF > > +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > +## > > + > > +[Defines] > > + INF_VERSION = 0x00010005 > > + BASE_NAME = DisplayUpdateProgressLibGraphics > > + MODULE_UNI_FILE = > DisplayUpdateProgressLibGraphics.uni > > + FILE_GUID = 319E9E37-B2D6-4699-90F3- > B8B72B6D4CBD > > + MODULE_TYPE = DXE_DRIVER > > + VERSION_STRING = 1.0 > > + LIBRARY_CLASS = > DisplayUpdateProgressLib|DXE_DRIVER UEFI_DRIVER > UEFI_APPLICATION > > + > > +# > > +# The following information is for reference only and > not required by the build tools. > > +# > > +# VALID_ARCHITECTURES = IA32 X64 IPF EBC > > +# > > + > > +[Sources] > > + DisplayUpdateProgressLibGraphics.c > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + MdeModulePkg/MdeModulePkg.dec > > + > > +[LibraryClasses] > > + BaseMemoryLib > > + DebugLib > > + MemoryAllocationLib > > + UefiBootServicesTableLib > > + BaseLib > > + UefiLib > > + > > +[Protocols] > > + gEfiGraphicsOutputProtocolGuid # CONSUMES > > + gEdkiiBootLogo2ProtocolGuid # CONSUMES > > diff --git > a/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.uni > b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.uni > > new file mode 100644 > > index 0000000000..d7da641338 > > --- /dev/null > > +++ > b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/ > DisplayUpdateProgressLibGraphics.uni > > @@ -0,0 +1,18 @@ > > +// /** @file > > +// Provides services to display completion progress > of a firmware update on a > > +// graphical console that supports the Graphics > Output Protocol. > > +// > > +// Copyright (c) 2018, Intel Corporation. All rights > reserved.<BR> > > +// > > +// 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. > > +// > > +// **/ > > + > > +#string STR_MODULE_ABSTRACT #language en-US > "Provides services to display completion progress of a > firmware update on a graphical console that supports the > Graphics Output Protocol." > > + > > +#string STR_MODULE_DESCRIPTION #language en-US > "Provides services to display completion progress of a > firmware update on a graphical console that supports the > Graphics Output Protocol." > > diff --git > a/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.c > b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.c > > new file mode 100644 > > index 0000000000..7aca8b89d0 > > --- /dev/null > > +++ > b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.c > > @@ -0,0 +1,174 @@ > > +/** @file > > + Provides services to display completion progress of > a firmware update on a > > + text console. > > + > > + Copyright (c) 2016, Microsoft Corporation. All > rights reserved.<BR> > > + Copyright (c) 2018, Intel Corporation. All rights > reserved.<BR> > > + > > + Redistribution and use in source and binary forms, > with or without > > + modification, are permitted provided that the > following conditions are met: > > + 1. Redistributions of source code must retain the > above copyright notice, > > + this list of conditions and the following > disclaimer. > > + 2. Redistributions in binary form must reproduce > the above copyright notice, > > + this list of conditions and the following > disclaimer in the documentation > > + and/or other materials provided with the > distribution. > > + > > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS > AND CONTRIBUTORS "AS IS" AND > > + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, THE IMPLIED > > + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR PURPOSE ARE DISCLAIMED. > > + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE FOR ANY DIRECT, > > + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL DAMAGES (INCLUDING, > > + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS > OR SERVICES; LOSS OF USE, > > + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER > CAUSED AND ON ANY THEORY OF > > + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING NEGLIGENCE > > + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS SOFTWARE, EVEN IF > > + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > + > > +**/ > > + > > +#include <PiDxe.h> > > +#include <Library/DebugLib.h> > > +#include <Library/UefiBootServicesTableLib.h> > > +#include <Library/UefiLib.h> > > + > > +// > > +// Control Style. Set to 100 so it is reset on first > call. > > +// > > +UINTN mPreviousProgress = 100; > > + > > +// > > +// Text foreground color of progress bar > > +// > > +UINTN mProgressBarForegroundColor; > > + > > +/** > > + Function indicates the current completion progress > of a firmware update. > > + Platform may override with its own specific > function. > > + > > + @param[in] Completion A value between 0 and 100 > indicating the current > > + completion progress of a > firmware update. This > > + value must the the same or > higher than previous > > + calls to this service. The > first call of 0 or a > > + value of 0 after reaching a > value of 100 resets > > + the progress indicator to 0. > > + @param[in] Color Color of the progress > indicator. Only used when > > + Completion is 0 to set the > color of the progress > > + indicator. If Color is > NULL, then the default color > > + is used. > > + > > + @retval EFI_SUCCESS Progress displayed > successfully. > > + @retval EFI_INVALID_PARAMETER Completion is not in > range 0..100. > > + @retval EFI_INVALID_PARAMETER Completion is less > than Completion value from > > + a previous call to > this service. > > + @retval EFI_NOT_READY The device used to > indicate progress is not > > + available. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +DisplayUpdateProgress ( > > + IN UINTN Completion, > > + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *Color > OPTIONAL > > + ) > > +{ > > + UINTN Index; > > + UINTN CurrentAttribute; > > + > > + // > > + // Check range > > + // > > + if (Completion > 100) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Check to see if this Completion percentage has > already been displayed > > + // > > + if (Completion == mPreviousProgress) { > > + return EFI_SUCCESS; > > + } > > + > > + // > > + // Do special init on first call of each progress > session > > + // > > + if (mPreviousProgress == 100) { > > + Print (L"\n"); > > + > > + // > > + // Convert pixel color to text foreground color > > + // > > + if (Color == NULL) { > > + mProgressBarForegroundColor = EFI_WHITE; > > + } else { > > + mProgressBarForegroundColor = EFI_BLACK; > > + if (Color->Pixel.Blue >= 0x40) { > > + mProgressBarForegroundColor |= EFI_BLUE; > > + } > > + if (Color->Pixel.Green >= 0x40) { > > + mProgressBarForegroundColor |= EFI_GREEN; > > + } > > + if (Color->Pixel.Red >= 0x40) { > > + mProgressBarForegroundColor |= EFI_RED; > > + } > > + if (Color->Pixel.Blue >= 0xC0 || Color- > >Pixel.Green >= 0xC0 || Color->Pixel.Red >= 0xC0) { > > + mProgressBarForegroundColor |= EFI_BRIGHT; > > + } > > + if (mProgressBarForegroundColor == EFI_BLACK) { > > + mProgressBarForegroundColor = EFI_WHITE; > > + } > > + } > > + > > + // > > + // Clear previous > > + // > > + mPreviousProgress = 0; > > + } > > + > > + // > > + // Can not update progress bar if Completion is > less than previous > > + // > > + if (Completion < mPreviousProgress) { > > + DEBUG ((DEBUG_WARN, "WARNING: Completion (%d) > should not be lesss than Previous (%d)!!!\n", > Completion, mPreviousProgress)); > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Save current text color > > + // > > + CurrentAttribute = (UINTN)gST->ConOut->Mode- > >Attribute; > > + > > + // > > + // Print progress percentage > > + // > > + Print (L"\rUpdate Progress - %3d%% ", Completion); > > + > > + // > > + // Set progress bar color > > + // > > + gST->ConOut->SetAttribute ( > > + gST->ConOut, > > + EFI_TEXT_ATTR > (mProgressBarForegroundColor, EFI_BLACK) > > + ); > > + > > + // > > + // Print completed portion of progress bar > > + // > > + for (Index = 0; Index < Completion / 2; Index++) { > > + Print (L"%c", BLOCKELEMENT_FULL_BLOCK); > > + } > > + > > + // > > + // Restore text color > > + // > > + gST->ConOut->SetAttribute (gST->ConOut, > CurrentAttribute); > > + > > + // > > + // Print remaining portion of progress bar > > + // > > + for (; Index < 50; Index++) { > > + Print (L"%c", BLOCKELEMENT_LIGHT_SHADE); > > + } > > + > > + mPreviousProgress = Completion; > > + > > + return EFI_SUCCESS; > > +} > > diff --git > a/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.inf > b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.inf > > new file mode 100644 > > index 0000000000..c3134439e4 > > --- /dev/null > > +++ > b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.inf > > @@ -0,0 +1,53 @@ > > +## @file > > +# Provides services to display completion progress > of a firmware update on a > > +# text console. > > +# > > +# Copyright (c) 2016, Microsoft Corporation, All > rights reserved.<BR> > > +# Copyright (c) 2018, Intel Corporation. All rights > reserved.<BR> > > +# > > +# Redistribution and use in source and binary forms, > with or without > > +# modification, are permitted provided that the > following conditions are met: > > +# 1. Redistributions of source code must retain the > above copyright notice, > > +# this list of conditions and the following > disclaimer. > > +# 2. Redistributions in binary form must reproduce > the above copyright notice, > > +# this list of conditions and the following > disclaimer in the documentation > > +# and/or other materials provided with the > distribution. > > +# > > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS > AND CONTRIBUTORS "AS IS" AND > > +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT > NOT LIMITED TO, THE IMPLIED > > +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > PARTICULAR PURPOSE ARE DISCLAIMED. > > +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > CONTRIBUTORS BE LIABLE FOR ANY DIRECT, > > +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > CONSEQUENTIAL DAMAGES (INCLUDING, > > +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE > GOODS OR SERVICES; LOSS OF USE, > > +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) > HOWEVER CAUSED AND ON ANY THEORY OF > > +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, > OR TORT (INCLUDING NEGLIGENCE > > +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF > THIS SOFTWARE, EVEN IF > > +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > > +## > > + > > +[Defines] > > + INF_VERSION = 0x00010005 > > + BASE_NAME = DisplayUpdateProgressLibText > > + MODULE_UNI_FILE = DisplayUpdateProgressLibText.uni > > + FILE_GUID = CDEF83AE-1900-4B41-BF47- > AAE9BD729CA5 > > + MODULE_TYPE = DXE_DRIVER > > + VERSION_STRING = 1.0 > > + LIBRARY_CLASS = > DisplayUpdateProgressLib|DXE_DRIVER UEFI_DRIVER > UEFI_APPLICATION > > + > > +# > > +# The following information is for reference only and > not required by the build tools. > > +# > > +# VALID_ARCHITECTURES = IA32 X64 IPF EBC > > +# > > + > > +[Sources] > > + DisplayUpdateProgressLibText.c > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + MdeModulePkg/MdeModulePkg.dec > > + > > +[LibraryClasses] > > + DebugLib > > + UefiBootServicesTableLib > > + UefiLib > > diff --git > a/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.uni > b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.uni > > new file mode 100644 > > index 0000000000..3c783722bc > > --- /dev/null > > +++ > b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp > layUpdateProgressLibText.uni > > @@ -0,0 +1,18 @@ > > +// /** @file > > +// Provides services to display completion progress > of a firmware update on a > > +// text console. > > +// > > +// Copyright (c) 2018, Intel Corporation. All rights > reserved.<BR> > > +// > > +// 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. > > +// > > +// **/ > > + > > +#string STR_MODULE_ABSTRACT #language en-US > "Provides services to display completion progress of a > firmware update on a text console." > > + > > +#string STR_MODULE_DESCRIPTION #language en-US > "Provides services to display completion progress of a > firmware update on a text console." > > diff --git a/MdeModulePkg/MdeModulePkg.dsc > b/MdeModulePkg/MdeModulePkg.dsc > > index ec24a50c7d..b4e8a703af 100644 > > --- a/MdeModulePkg/MdeModulePkg.dsc > > +++ b/MdeModulePkg/MdeModulePkg.dsc > > @@ -108,6 +108,7 @@ [LibraryClasses] > > > CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCap > suleLibNull.inf > > > BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/Bas > eBmpSupportLib.inf > > > SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib. > inf > > + > DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpd > ateProgressLibGraphics/DisplayUpdateProgressLibGraphics. > inf > > > > [LibraryClasses.EBC.PEIM] > > > IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf > > @@ -327,6 +328,8 @@ [Components] > > > MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib > .inf > > > MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLi > b/NonDiscoverableDeviceRegistrationLib.inf > > > MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib > .inf > > + > MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/Di > splayUpdateProgressLibGraphics.inf > > + > MdeModulePkg/Library/DisplayUpdateProgressLibText/Displa > yUpdateProgressLibText.inf > > > > MdeModulePkg/Universal/BdsDxe/BdsDxe.inf > > > MdeModulePkg/Application/BootManagerMenuApp/BootManagerM > enuApp.inf > > -- > > 2.14.2.windows.3 > > > > _______________________________________________ > > edk2-devel mailing list > > [email protected] > > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

