From: "Kinney, Michael D" <michael.d.kinney@intel.com>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Leif Lindholm <leif.lindholm@linaro.org>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>,
"Dong, Eric" <eric.dong@intel.com>,
"Zeng, Star" <star.zeng@intel.com>
Subject: Re: [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
Date: Mon, 4 Jun 2018 20:24:13 +0000 [thread overview]
Message-ID: <E92EE9817A31E24EB0585FDF735412F5B8A66A2B@ORSMSX113.amr.corp.intel.com> (raw)
In-Reply-To: <CAKv+Gu8oNSDKte=xbBD9rSU-TUG0_KQ0sWOhURe+J0t=p14utg@mail.gmail.com>
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:ard.biesheuvel@linaro.org]
> Sent: Thursday, May 31, 2018 4:09 AM
> To: Kinney, Michael D <michael.d.kinney@intel.com>; Leif
> Lindholm <leif.lindholm@linaro.org>
> Cc: edk2-devel@lists.01.org; Dong, Eric
> <eric.dong@intel.com>; Zeng, Star <star.zeng@intel.com>
> Subject: Re: [edk2] [Patch v3 2/3] MdeModulePkg: Add
> DisplayUpdateProgressLib instances
>
> (+ Leif)
>
> On 25 May 2018 at 08:15, Michael D Kinney
> <michael.d.kinney@intel.com> 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 <sean.brogan@microsoft.com>
> > Cc: Star Zeng <star.zeng@intel.com>
> > Cc: Eric Dong <eric.dong@intel.com>
> > Signed-off-by: Michael D Kinney
> <michael.d.kinney@intel.com>
> > 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
> > edk2-devel@lists.01.org
> > https://lists.01.org/mailman/listinfo/edk2-devel
next prev parent reply other threads:[~2018-06-04 20:24 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-25 6:15 [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Michael D Kinney
2018-05-25 6:15 ` [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class Michael D Kinney
2018-05-25 11:06 ` Zeng, Star
2018-05-25 6:15 ` [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances Michael D Kinney
2018-05-25 11:10 ` Zeng, Star
2018-05-31 11:09 ` Ard Biesheuvel
2018-06-04 20:24 ` Kinney, Michael D [this message]
2018-05-25 6:15 ` [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress API Michael D Kinney
2018-05-28 19:18 ` Yao, Jiewen
2018-05-28 19:07 ` [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Yao, Jiewen
2018-05-29 9:51 ` Ard Biesheuvel
2018-05-29 9:51 ` Ard Biesheuvel
2018-05-29 12:43 ` Ard Biesheuvel
2018-05-29 13:05 ` Gao, Liming
2018-05-29 13:08 ` Ard Biesheuvel
2018-05-29 14:31 ` Kinney, Michael D
2018-05-31 11:12 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E92EE9817A31E24EB0585FDF735412F5B8A66A2B@ORSMSX113.amr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox