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.
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/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.<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/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.<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/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.<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/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.<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/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
Reviewed-by: Star Zeng <star.zeng@intel.com>
Thanks,
Star
-----Original Message-----
From: Kinney, Michael D
Sent: Friday, May 25, 2018 2:16 PM
To: edk2-devel@lists.01.org
Cc: Sean Brogan <sean.brogan@microsoft.com>; Zeng, Star <star.zeng@intel.com>; Dong, Eric <eric.dong@intel.com>
Subject: [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
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.
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/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/DisplayUpdat
+++ eProgressLibGraphics.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/DisplayUpdat
+++ eProgressLibGraphics.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/DisplayUpdat
+++ eProgressLibGraphics.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/DisplayUpdateProgressLibText.c b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.c
new file mode 100644
index 0000000000..7aca8b89d0
--- /dev/null
+++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdatePro
+++ gressLibText.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/DisplayUpdateProgressLibText.inf b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf
new file mode 100644
index 0000000000..c3134439e4
--- /dev/null
+++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdatePro
+++ gressLibText.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/DisplayUpdateProgressLibText.uni b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.uni
new file mode 100644
index 0000000000..3c783722bc
--- /dev/null
+++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdatePro
+++ gressLibText.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/DxeCapsuleLibNull.inf
BmpSupportLib|MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
+
+ DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLib
+ Graphics/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/DisplayUpdatePro
+ gressLibGraphics.inf
+ MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgres
+ sLibText.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
(+ 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/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 <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/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.<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/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.<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/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.<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/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.<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/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
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
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
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2026 Red Hat, Inc.