[edk2] [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances

Michael D Kinney posted 3 patches 7 years, 8 months ago
[edk2] [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
Posted by Michael D Kinney 7 years, 8 months ago
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
Re: [edk2] [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
Posted by Zeng, Star 7 years, 8 months ago
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
Re: [edk2] [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
Posted by Ard Biesheuvel 7 years, 8 months ago
(+ 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
Re: [edk2] [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
Posted by Kinney, Michael D 7 years, 8 months ago
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