From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4001:c06::22f; helo=mail-io0-x22f.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-io0-x22f.google.com (mail-io0-x22f.google.com [IPv6:2607:f8b0:4001:c06::22f]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 52CB3210C999C for ; Thu, 31 May 2018 04:09:19 -0700 (PDT) Received: by mail-io0-x22f.google.com with SMTP id 200-v6so24289925ioz.6 for ; Thu, 31 May 2018 04:09:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=+UL3zCTIMc3ikiz83oTfd+VO+PolgRMz8OoDxs3mwMs=; b=Xa2QDIcXiqGbnlzCMFK4I1h4+TYKJ6EferMPbCcBVoPk/3Ep8fUvA3+ljSEuwYnATj yvhdyzQeZCYqyOUlBDN+Tyggc7SPzUufqt0qL6NM5B1gd4PtMNnOpXjI+VJgYqMISMNo jJSQEJtPbc7LSQdrsTfYGwyXXVrI69xbHebAs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=+UL3zCTIMc3ikiz83oTfd+VO+PolgRMz8OoDxs3mwMs=; b=Uibh3+d/ZHB/lTHkMf+CEqTFFjRmU3L3VFm2UU0Xd9D/QiRum0BvHhyQQi42y7lQCw C6Y/5uAYCtO8mu+atAWeVIST6NsGs/PPwWdm5gMcmDUft761l2PGDLF8gZ+Jo8/WTIde WouNWdtUOJesZGX2OyNaO1fka+nTso9kSg8LS5Kjni49C7cA56XwlB5wIgQJd8EUvQmh NAbSDMcYg1RhFGitXP4lOHV/yWB1c22qrXh8GiRqrPJmjGy9Ok7ZTID6IEqTQOF9apan Z2stwuzYQBmyd0v0UjVnrDZgt3LIjjO8V93jsF7nd96pB351ebVLw//2raxvqVgZBpL9 80Rg== X-Gm-Message-State: ALKqPwfdx2f36qmJjcuVhgKsbzT0B3eLmrkiYgSNKVvmlsi1txUpFKby NNSasZYLk2pX6gK+upDvgUe7aIiXGduCvR8wEGHCjA== X-Google-Smtp-Source: ADUXVKJYdu4aX1BSPgV7NmHxlq8js4P4kJoMTWNNoHv+j1mmTAkTp3djBjy10rRoxOwaoWY336cRQY5y7Xg39VWd6/M= X-Received: by 2002:a6b:dd0b:: with SMTP id f11-v6mr120852ioc.173.1527764958200; Thu, 31 May 2018 04:09:18 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a6b:bb86:0:0:0:0:0 with HTTP; Thu, 31 May 2018 04:09:17 -0700 (PDT) In-Reply-To: <20180525061552.19840-3-michael.d.kinney@intel.com> References: <20180525061552.19840-1-michael.d.kinney@intel.com> <20180525061552.19840-3-michael.d.kinney@intel.com> From: Ard Biesheuvel Date: Thu, 31 May 2018 13:09:17 +0200 Message-ID: To: Michael D Kinney , Leif Lindholm Cc: "edk2-devel@lists.01.org" , Eric Dong , Star Zeng Subject: Re: [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 May 2018 11:09:19 -0000 Content-Type: text/plain; charset="UTF-8" (+ Leif) On 25 May 2018 at 08:15, Michael D Kinney 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/MsCapsuleSupport > > 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 > Cc: Star Zeng > Cc: Eric Dong > Signed-off-by: Michael D Kinney > 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/DisplayUpdateProgressLibGraphics.c > create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgressLibGraphics.inf > create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgressLibGraphics.uni > create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.c > create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf > create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.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.
> + Copyright (c) 2018, Intel Corporation. All rights reserved.
> + > + 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 > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > + > +// > +// 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.
> +# Copyright (c) 2018, Intel Corporation. All rights reserved.
> +# > +# 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.
> +// > +// 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/DisplayUpdateProgressLibText.c b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.c > new file mode 100644 > index 0000000000..7aca8b89d0 > --- /dev/null > +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.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.
> + Copyright (c) 2018, Intel Corporation. All rights reserved.
> + > + 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 > +#include > +#include > +#include > + > +// > +// 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/DisplayUpdateProgressLibText.inf b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf > new file mode 100644 > index 0000000000..c3134439e4 > --- /dev/null > +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.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.
> +# Copyright (c) 2018, Intel Corporation. All rights reserved.
> +# > +# 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/DisplayUpdateProgressLibText.uni b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.uni > new file mode 100644 > index 0000000000..3c783722bc > --- /dev/null > +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.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.
> +// > +// 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/DxeCapsuleLibNull.inf > BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf > SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf > + DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgressLibGraphics.inf > > [LibraryClasses.EBC.PEIM] > IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf > @@ -327,6 +328,8 @@ [Components] > MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf > MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/NonDiscoverableDeviceRegistrationLib.inf > MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf > + MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgressLibGraphics.inf > + MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf > > MdeModulePkg/Universal/BdsDxe/BdsDxe.inf > MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf > -- > 2.14.2.windows.3 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel