public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
@ 2018-05-25  6:15 Michael D Kinney
  2018-05-25  6:15 ` [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class Michael D Kinney
                   ` (4 more replies)
  0 siblings, 5 replies; 17+ messages in thread
From: Michael D Kinney @ 2018-05-25  6:15 UTC (permalink / raw)
  To: edk2-devel
  Cc: Sean Brogan, Star Zeng, Eric Dong, Jiewen Yao, David Wei,
	Mang Guo, Kelly Steele

https://bugzilla.tianocore.org/show_bug.cgi?id=801

Based on content from:

https://github.com/Microsoft/MS_UEFI/blob/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Include/Library/DisplayUpdateProgressLib.h
https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressGraphicsLib
https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressTextLib

Updates for V3
==============
* Add Version field to EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL
* Break up patch series into 4 smaller patch series to handle dependencies
  between the edk2 repository and the edk2-platforms repository.
  + Patch series for edk2 repo that adds DisplayUpdateProgressLib class and 
    instances.  Defines the EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL.
    Adds PerformFlashWriteWithProgress() API to the PlatformFlashAccessLib.
  + Patch series for platforms in edk2-platforms that use capsules to add the
    DisplayUpdateProgressLib mapping to the DSC files and add the
    PerformFlashWriteWithProgress() API implementation to the
    PlatformFlashAccessLib implementations.
  + Patch series for platforms in edk2 that use capsules to add the
    DisplayUpdateProgressLib mapping to the DSC files and add the
    PerformFlashWriteWithProgress() API implementation to the
    PlatformFlashAccessLib implementations.
  + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the 
    PerformFlashWriteWithProgress() API .

Updates for V2
==============
* Change DisplayUpdateProgressGraphicsLib to DisplayUpdateProgressLibGraphics
* Change DisplayUpdateProgressTextLib to DisplayUpdateProgressLibText
* Clarify that color in Firmware Management Progress Protocol is the foreground color
* Add missing parameters to PerformFlashWriteWithProgress() function header.
* Update PerformFlashWriteWithProgress() function header describing the use of
  the start and end percentage values.
* Update QuarkPlatformPkg PerformFlashWriteWithProgress() to call Progress() for
  the end precentage.
* Update Vlv2Tbl2DevicePkg PerformFlashWriteWithProgress() to call Progress()
  for the end precentage.

Add DisplayUpdateProgressLib class along implementations for both graphical
(Graphics Output Protocol based) and text (Simple Text Output Protocol based)
consoles.  Also add the EDK II Firmware Management Progress Protocol that is an
optional protocol that provides the progress bar color and a watchdog timeout
value thaty can be used when a firmware image is updated in a firmware device.

* Add progress support to DxeCapsuleLibFmp
* Add progress support to SystemFirmwareUpdateDxe
* Add progress support to PlatformFlashAccessLib class and instances.
* Reduce Print() calls during a firmware update.

Cc: Sean Brogan <sean.brogan@microsoft.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: David Wei <david.wei@intel.com>
Cc: Mang Guo <mang.guo@intel.com>
Cc: Kelly Steele <kelly.steele@intel.com>

Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1

Michael D Kinney (3):
  MdeModulePkg: Add DisplayUpdateProgressLib class
  MdeModulePkg: Add DisplayUpdateProgressLib instances
  SignedCapsulePkg/PlatformFlashAccessLib: Add progress API

 .../Include/Library/DisplayUpdateProgressLib.h     |  65 +++
 .../Include/Protocol/FirmwareManagementProgress.h  |  55 +++
 .../DisplayUpdateProgressLibGraphics.c             | 475 +++++++++++++++++++++
 .../DisplayUpdateProgressLibGraphics.inf           |  60 +++
 .../DisplayUpdateProgressLibGraphics.uni           |  18 +
 .../DisplayUpdateProgressLibText.c                 | 174 ++++++++
 .../DisplayUpdateProgressLibText.inf               |  53 +++
 .../DisplayUpdateProgressLibText.uni               |  18 +
 MdeModulePkg/MdeModulePkg.dec                      |  11 +
 MdeModulePkg/MdeModulePkg.dsc                      |   3 +
 .../Include/Library/PlatformFlashAccessLib.h       |  49 ++-
 .../PlatformFlashAccessLibNull.c                   |  70 ++-
 12 files changed, 1042 insertions(+), 9 deletions(-)
 create mode 100644 MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
 create mode 100644 MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h
 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

-- 
2.14.2.windows.3



^ permalink raw reply	[flat|nested] 17+ messages in thread

* [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class
  2018-05-25  6:15 [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Michael D Kinney
@ 2018-05-25  6:15 ` Michael D Kinney
  2018-05-25 11:06   ` Zeng, Star
  2018-05-25  6:15 ` [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances Michael D Kinney
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 17+ messages in thread
From: Michael D Kinney @ 2018-05-25  6:15 UTC (permalink / raw)
  To: edk2-devel; +Cc: Sean Brogan, Star Zeng, Eric Dong

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 the DisplayUpdateProgressLib class that is used
to inform the user of progress during updates of
firmware images in firmware devices.  A platform
specific instance of this library can be used to
customize how the user is informed of progress.

Add the EDK II Firmware Management Progress Protocol.
This is an optional protocol that must be installed
onto the same handle as a Firmware Management Protocol.
This new protocol provides the color of a progress
bar that allows different firmware devices to use
different colors during a firmware update.  It also
provides a watchdog timer value in seconds that is
armed each time the Progress() service passed
into Firmware Management Protocol SetImage()
is called.

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
---
 .../Include/Library/DisplayUpdateProgressLib.h     | 65 ++++++++++++++++++++++
 .../Include/Protocol/FirmwareManagementProgress.h  | 55 ++++++++++++++++++
 MdeModulePkg/MdeModulePkg.dec                      | 11 ++++
 3 files changed, 131 insertions(+)
 create mode 100644 MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
 create mode 100644 MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h

diff --git a/MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h b/MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
new file mode 100644
index 0000000000..ad1f2cae38
--- /dev/null
+++ b/MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
@@ -0,0 +1,65 @@
+/** @file
+  Provides services to display completion progress when processing a
+  firmware update that updates the firmware image in a firmware device.
+  A platform may provide its own instance of this library class to custoimize
+  how a user is informed of completion progress.
+
+  Copyright (c) 2016, Microsoft Corporation
+  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
+
+  All rights reserved.
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions are met:
+  1. Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright notice,
+  this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+**/
+
+#ifndef __DISPLAY_PROGRESS_LIB__
+#define __DISPLAY_PROGRESS_LIB__
+
+#include <Protocol/GraphicsOutput.h>
+
+/**
+  Indicates the current completion progress of a firmware update.
+
+  @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
+  );
+
+#endif
diff --git a/MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h b/MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h
new file mode 100644
index 0000000000..21f91909ae
--- /dev/null
+++ b/MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h
@@ -0,0 +1,55 @@
+/** @file
+  EDK II Firmware Management Progress 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 that 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.
+
+**/
+
+#ifndef __EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL_H__
+#define __EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL_H__
+
+#include <Protocol/GraphicsOutput.h>
+
+///
+/// EDK II Firmware Management Progress Protocol GUID value
+///
+#define EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL_GUID \
+  { \
+    0x1849bda2, 0x6952, 0x4e86, { 0xa1, 0xdb, 0x55, 0x9a, 0x3c, 0x47, 0x9d, 0xf1 } \
+  }
+
+///
+/// EDK II Firmware Management Progress Protocol structure
+///
+typedef struct {
+  ///
+  /// The version of this structure.  Initial version value is 0x00000001.
+  ///
+  UINT32                               Version;
+  ///
+  /// The foreground color of a progress bar that is used by the Progress()
+  /// function that is passed into the Firmware Management Protocol SetImage()
+  /// service is called.
+  ///
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION  ProgressBarForegroundColor;
+  ///
+  /// The time in seconds to arm the watchdog timer each time the Progress()
+  /// function passed into the  Firmware Management Protocol SetImage() service
+  /// is called.
+  ///
+  UINTN                                WatchdogSeconds;
+} EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL;
+
+///
+/// EDK II Firmware Management Progress Protocol GUID variable.
+///
+extern EFI_GUID gEdkiiFirmwareManagementProgressProtocolGuid;
+
+#endif
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index cc397185f7..d4833ea178 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -175,6 +175,13 @@ [LibraryClasses]
   #
   BmpSupportLib|Include/Library/BmpSupportLib.h
 
+  ## @libraryclass  Provides services to display completion progress when
+  #  processing a firmware update that updates the firmware image in a firmware
+  #  device.  A platform may provide its own instance of this library class to
+  #  custoimize how a user is informed of completion progress.
+  #
+  DisplayUpdateProgressLib|Include/Library/DisplayUpdateProgressLib.h
+
 [Guids]
   ## MdeModule package token space guid
   # Include/Guid/MdeModulePkgTokenSpace.h
@@ -595,6 +602,10 @@ [Protocols]
   gEdkiiPlatformSpecificResetFilterProtocolGuid  = { 0x695d7835, 0x8d47, 0x4c11, { 0xab, 0x22, 0xfa, 0x8a, 0xcc, 0xe7, 0xae, 0x7a } }
   ## Include/Protocol/PlatformSpecificResetHandler.h
   gEdkiiPlatformSpecificResetHandlerProtocolGuid = { 0x2df6ba0b, 0x7092, 0x440d, { 0xbd, 0x4, 0xfb, 0x9, 0x1e, 0xc3, 0xf3, 0xc1 } }
+
+  ## Include/Protocol/FirmwareManagementProgress.h
+  gEdkiiFirmwareManagementProgressProtocolGuid = { 0x1849bda2, 0x6952, 0x4e86, { 0xa1, 0xdb, 0x55, 0x9a, 0x3c, 0x47, 0x9d, 0xf1 } }
+
 #
 # [Error.gEfiMdeModulePkgTokenSpaceGuid]
 #   0x80000001 | Invalid value provided.
-- 
2.14.2.windows.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
  2018-05-25  6:15 [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Michael D Kinney
  2018-05-25  6:15 ` [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class Michael D Kinney
@ 2018-05-25  6:15 ` Michael D Kinney
  2018-05-25 11:10   ` Zeng, Star
  2018-05-31 11:09   ` Ard Biesheuvel
  2018-05-25  6:15 ` [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress API Michael D Kinney
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 17+ messages in thread
From: Michael D Kinney @ 2018-05-25  6:15 UTC (permalink / raw)
  To: edk2-devel; +Cc: Sean Brogan, Star Zeng, Eric Dong

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



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress API
  2018-05-25  6:15 [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Michael D Kinney
  2018-05-25  6:15 ` [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class Michael D Kinney
  2018-05-25  6:15 ` [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances Michael D Kinney
@ 2018-05-25  6:15 ` Michael D Kinney
  2018-05-28 19:18   ` Yao, Jiewen
  2018-05-28 19:07 ` [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Yao, Jiewen
  2018-05-29  9:51 ` Ard Biesheuvel
  4 siblings, 1 reply; 17+ messages in thread
From: Michael D Kinney @ 2018-05-25  6:15 UTC (permalink / raw)
  To: edk2-devel; +Cc: Jiewen Yao

https://bugzilla.tianocore.org/show_bug.cgi?id=801

Add a new API to the PlatformFlashAccessLib that passes
in an optional Progress() function along with a start and
end percentage to call the Progress() function with.
If the Progress() function is not NULL, then it is the
Progress() function that was passed into the Firmware
Management Protocol SetImage() services and is used
to update the user on the progress as a firmware device
is updated with a firmware image.

Implementations of the PlatformFlashAccessLib are
recommended to call the Progress() function as work
is performed to update to contents of a firmware
storage device.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
---
 .../Include/Library/PlatformFlashAccessLib.h       | 49 ++++++++++++++-
 .../PlatformFlashAccessLibNull.c                   | 70 +++++++++++++++++++---
 2 files changed, 110 insertions(+), 9 deletions(-)

diff --git a/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h b/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h
index 0a8858e4c4..e3308251c2 100644
--- a/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h
+++ b/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h
@@ -1,7 +1,7 @@
 /** @file
   Platform flash device access library.
 
-  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2016 - 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
@@ -16,6 +16,8 @@
 #ifndef __PLATFORM_FLASH_ACCESS_LIB_H__
 #define __PLATFORM_FLASH_ACCESS_LIB_H__
 
+#include <Protocol/FirmwareManagement.h>
+
 typedef enum {
   FlashAddressTypeRelativeAddress,
   FlashAddressTypeAbsoluteAddress,
@@ -31,7 +33,7 @@ typedef enum {
 } PLATFORM_FIRMWARE_TYPE;
 
 /**
-  Perform flash write opreation.
+  Perform flash write operation.
 
   @param[in] FirmwareType      The type of firmware.
   @param[in] FlashAddress      The address of flash device to be accessed.
@@ -54,4 +56,47 @@ PerformFlashWrite (
   IN UINTN                        Length
   );
 
+/**
+  Perform flash write operation with progress indicator.  The start and end
+  completion percentage values are passed into this function.  If the requested
+  flash write operation is broken up, then completion percentage between the
+  start and end values may be passed to the provided Progress function.  The
+  caller of this function is required to call the Progress function for the
+  start and end completion percentage values.  This allows the Progress,
+  StartPercentage, and EndPercentage parameters to be ignored if the requested
+  flash write operation can not be broken up
+
+  @param[in] FirmwareType      The type of firmware.
+  @param[in] FlashAddress      The address of flash device to be accessed.
+  @param[in] FlashAddressType  The type of flash device address.
+  @param[in] Buffer            The pointer to the data buffer.
+  @param[in] Length            The length of data buffer in bytes.
+  @param[in] Progress          A function used report the progress of the
+                               firmware update.  This is an optional parameter
+                               that may be NULL.
+  @param[in] StartPercentage   The start completion percentage value that may
+                               be used to report progress during the flash
+                               write operation.
+  @param[in] EndPercentage     The end completion percentage value that may
+                               be used to report progress during the flash
+                               write operation.
+
+  @retval EFI_SUCCESS           The operation returns successfully.
+  @retval EFI_WRITE_PROTECTED   The flash device is read only.
+  @retval EFI_UNSUPPORTED       The flash device access is unsupported.
+  @retval EFI_INVALID_PARAMETER The input parameter is not valid.
+**/
+EFI_STATUS
+EFIAPI
+PerformFlashWriteWithProgress (
+  IN PLATFORM_FIRMWARE_TYPE                         FirmwareType,
+  IN EFI_PHYSICAL_ADDRESS                           FlashAddress,
+  IN FLASH_ADDRESS_TYPE                             FlashAddressType,
+  IN VOID                                           *Buffer,
+  IN UINTN                                          Length,
+  IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress,        OPTIONAL
+  IN UINTN                                          StartPercentage,
+  IN UINTN                                          EndPercentage
+  );
+
 #endif
diff --git a/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLibNull.c b/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLibNull.c
index b34ebbba1e..854f108cf4 100644
--- a/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLibNull.c
+++ b/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLibNull.c
@@ -1,7 +1,7 @@
 /** @file
   Platform flash device access library NULL instance.
 
-  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2016 - 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
@@ -20,7 +20,57 @@
 UINT64 mInternalFdAddress;
 
 /**
-  Perform flash write opreation.
+  Perform flash write operation with progress indicator.  The start and end
+  completion percentage values are passed into this function.  If the requested
+  flash write operation is broken up, then completion percentage between the
+  start and end values may be passed to the provided Progress function.  The
+  caller of this function is required to call the Progress function for the
+  start and end completion percentage values.  This allows the Progress,
+  StartPercentage, and EndPercentage parameters to be ignored if the requested
+  flash write operation can not be broken up
+
+  @param[in] FirmwareType      The type of firmware.
+  @param[in] FlashAddress      The address of flash device to be accessed.
+  @param[in] FlashAddressType  The type of flash device address.
+  @param[in] Buffer            The pointer to the data buffer.
+  @param[in] Length            The length of data buffer in bytes.
+  @param[in] Progress          A function used report the progress of the
+                               firmware update.  This is an optional parameter
+                               that may be NULL.
+  @param[in] StartPercentage   The start completion percentage value that may
+                               be used to report progress during the flash
+                               write operation.
+  @param[in] EndPercentage     The end completion percentage value that may
+                               be used to report progress during the flash
+                               write operation.
+
+  @retval EFI_SUCCESS           The operation returns successfully.
+  @retval EFI_WRITE_PROTECTED   The flash device is read only.
+  @retval EFI_UNSUPPORTED       The flash device access is unsupported.
+  @retval EFI_INVALID_PARAMETER The input parameter is not valid.
+**/
+EFI_STATUS
+EFIAPI
+PerformFlashWriteWithProgress (
+  IN PLATFORM_FIRMWARE_TYPE                         FirmwareType,
+  IN EFI_PHYSICAL_ADDRESS                           FlashAddress,
+  IN FLASH_ADDRESS_TYPE                             FlashAddressType,
+  IN VOID                                           *Buffer,
+  IN UINTN                                          Length,
+  IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress,        OPTIONAL
+  IN UINTN                                          StartPercentage,
+  IN UINTN                                          EndPercentage
+  )
+{
+  if (FlashAddressType == FlashAddressTypeRelativeAddress) {
+    FlashAddress = FlashAddress + mInternalFdAddress;
+  }
+  CopyMem((VOID *)(UINTN)(FlashAddress), Buffer, Length);
+  return EFI_SUCCESS;
+}
+
+/**
+  Perform flash write operation.
 
   @param[in] FirmwareType      The type of firmware.
   @param[in] FlashAddress      The address of flash device to be accessed.
@@ -43,9 +93,15 @@ PerformFlashWrite (
   IN UINTN                        Length
   )
 {
-  if (FlashAddressType == FlashAddressTypeRelativeAddress) {
-    FlashAddress = FlashAddress + mInternalFdAddress;
-  }
-  CopyMem((VOID *)(UINTN)(FlashAddress), Buffer, Length);
-  return EFI_SUCCESS;
+  return PerformFlashWriteWithProgress (
+           FirmwareType,
+           FlashAddress,
+           FlashAddressType,
+           Buffer,
+           Length,
+           NULL,
+           0,
+           0
+           );
 }
+
-- 
2.14.2.windows.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class
  2018-05-25  6:15 ` [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class Michael D Kinney
@ 2018-05-25 11:06   ` Zeng, Star
  0 siblings, 0 replies; 17+ messages in thread
From: Zeng, Star @ 2018-05-25 11:06 UTC (permalink / raw)
  To: Kinney, Michael D, edk2-devel@lists.01.org
  Cc: Sean Brogan, Dong, Eric, Zeng, Star

Reviewed-by: Star Zeng <star.zeng@intel.com> after fixing typo ' custoimize ' to ' customize '.

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 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class

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 the DisplayUpdateProgressLib class that is used to inform the user of progress during updates of firmware images in firmware devices.  A platform specific instance of this library can be used to customize how the user is informed of progress.

Add the EDK II Firmware Management Progress Protocol.
This is an optional protocol that must be installed onto the same handle as a Firmware Management Protocol.
This new protocol provides the color of a progress bar that allows different firmware devices to use different colors during a firmware update.  It also provides a watchdog timer value in seconds that is armed each time the Progress() service passed into Firmware Management Protocol SetImage() is called.

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
---
 .../Include/Library/DisplayUpdateProgressLib.h     | 65 ++++++++++++++++++++++
 .../Include/Protocol/FirmwareManagementProgress.h  | 55 ++++++++++++++++++
 MdeModulePkg/MdeModulePkg.dec                      | 11 ++++
 3 files changed, 131 insertions(+)
 create mode 100644 MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
 create mode 100644 MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h

diff --git a/MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h b/MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
new file mode 100644
index 0000000000..ad1f2cae38
--- /dev/null
+++ b/MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
@@ -0,0 +1,65 @@
+/** @file
+  Provides services to display completion progress when processing a
+  firmware update that updates the firmware image in a firmware device.
+  A platform may provide its own instance of this library class to 
+custoimize
+  how a user is informed of completion progress.
+
+  Copyright (c) 2016, Microsoft Corporation  Copyright (c) 2018, Intel 
+ Corporation. All rights reserved.<BR>
+
+  All rights reserved.
+  Redistribution and use in source and binary forms, with or without  
+ modification, are permitted provided that the following conditions are met:
+  1. Redistributions of source code must retain the above copyright 
+ notice,  this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright 
+ notice,  this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
+ "AS IS" AND  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
+ LIMITED TO, THE IMPLIED  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 
+ ANY DIRECT,  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+ CONSEQUENTIAL DAMAGES (INCLUDING,  BUT NOT LIMITED TO, PROCUREMENT OF 
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  DATA, OR PROFITS; OR 
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  LIABILITY, 
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE  
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+**/
+
+#ifndef __DISPLAY_PROGRESS_LIB__
+#define __DISPLAY_PROGRESS_LIB__
+
+#include <Protocol/GraphicsOutput.h>
+
+/**
+  Indicates the current completion progress of a firmware update.
+
+  @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
+  );
+
+#endif
diff --git a/MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h b/MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h
new file mode 100644
index 0000000000..21f91909ae
--- /dev/null
+++ b/MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h
@@ -0,0 +1,55 @@
+/** @file
+  EDK II Firmware Management Progress 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 that 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.
+
+**/
+
+#ifndef __EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL_H__
+#define __EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL_H__
+
+#include <Protocol/GraphicsOutput.h>
+
+///
+/// EDK II Firmware Management Progress Protocol GUID value /// #define 
+EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL_GUID \
+  { \
+    0x1849bda2, 0x6952, 0x4e86, { 0xa1, 0xdb, 0x55, 0x9a, 0x3c, 0x47, 
+0x9d, 0xf1 } \
+  }
+
+///
+/// EDK II Firmware Management Progress Protocol structure /// typedef 
+struct {
+  ///
+  /// The version of this structure.  Initial version value is 0x00000001.
+  ///
+  UINT32                               Version;
+  ///
+  /// The foreground color of a progress bar that is used by the 
+Progress()
+  /// function that is passed into the Firmware Management Protocol 
+SetImage()
+  /// service is called.
+  ///
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION  ProgressBarForegroundColor;
+  ///
+  /// The time in seconds to arm the watchdog timer each time the 
+Progress()
+  /// function passed into the  Firmware Management Protocol SetImage() 
+service
+  /// is called.
+  ///
+  UINTN                                WatchdogSeconds;
+} EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL;
+
+///
+/// EDK II Firmware Management Progress Protocol GUID variable.
+///
+extern EFI_GUID gEdkiiFirmwareManagementProgressProtocolGuid;
+
+#endif
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index cc397185f7..d4833ea178 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -175,6 +175,13 @@ [LibraryClasses]
   #
   BmpSupportLib|Include/Library/BmpSupportLib.h
 
+  ## @libraryclass  Provides services to display completion progress 
+ when  #  processing a firmware update that updates the firmware image 
+ in a firmware  #  device.  A platform may provide its own instance of 
+ this library class to  #  custoimize how a user is informed of completion progress.
+  #
+  DisplayUpdateProgressLib|Include/Library/DisplayUpdateProgressLib.h
+
 [Guids]
   ## MdeModule package token space guid
   # Include/Guid/MdeModulePkgTokenSpace.h
@@ -595,6 +602,10 @@ [Protocols]
   gEdkiiPlatformSpecificResetFilterProtocolGuid  = { 0x695d7835, 0x8d47, 0x4c11, { 0xab, 0x22, 0xfa, 0x8a, 0xcc, 0xe7, 0xae, 0x7a } }
   ## Include/Protocol/PlatformSpecificResetHandler.h
   gEdkiiPlatformSpecificResetHandlerProtocolGuid = { 0x2df6ba0b, 0x7092, 0x440d, { 0xbd, 0x4, 0xfb, 0x9, 0x1e, 0xc3, 0xf3, 0xc1 } }
+
+  ## Include/Protocol/FirmwareManagementProgress.h
+  gEdkiiFirmwareManagementProgressProtocolGuid = { 0x1849bda2, 0x6952, 
+ 0x4e86, { 0xa1, 0xdb, 0x55, 0x9a, 0x3c, 0x47, 0x9d, 0xf1 } }
+
 #
 # [Error.gEfiMdeModulePkgTokenSpaceGuid]
 #   0x80000001 | Invalid value provided.
--
2.14.2.windows.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
  2018-05-25  6:15 ` [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances Michael D Kinney
@ 2018-05-25 11:10   ` Zeng, Star
  2018-05-31 11:09   ` Ard Biesheuvel
  1 sibling, 0 replies; 17+ messages in thread
From: Zeng, Star @ 2018-05-25 11:10 UTC (permalink / raw)
  To: Kinney, Michael D, edk2-devel@lists.01.org
  Cc: Sean Brogan, Dong, Eric, Zeng, Star

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



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
  2018-05-25  6:15 [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Michael D Kinney
                   ` (2 preceding siblings ...)
  2018-05-25  6:15 ` [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress API Michael D Kinney
@ 2018-05-28 19:07 ` Yao, Jiewen
  2018-05-29  9:51 ` Ard Biesheuvel
  4 siblings, 0 replies; 17+ messages in thread
From: Yao, Jiewen @ 2018-05-28 19:07 UTC (permalink / raw)
  To: Kinney, Michael D, edk2-devel@lists.01.org
  Cc: Sean Brogan, Zeng, Star, Dong, Eric, Wei, David, Guo, Mang,
	Steele, Kelly

Thank you to add Version.

Patch 1,2,3,4 reviewed-by: Jiewen.yao@intel.com

Thank you
Yao Jiewen

> -----Original Message-----
> From: Kinney, Michael D
> Sent: Thursday, May 24, 2018 11: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>; Yao, Jiewen
> <jiewen.yao@intel.com>; Wei, David <david.wei@intel.com>; Guo, Mang
> <mang.guo@intel.com>; Steele, Kelly <kelly.steele@intel.com>
> Subject: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=801
> 
> Based on content from:
> 
> https://github.com/Microsoft/MS_UEFI/blob/share/MsCapsuleSupport/MsCaps
> uleUpdatePkg/Include/Library/DisplayUpdateProgressLib.h
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsu
> leUpdatePkg/Library/DisplayUpdateProgressGraphicsLib
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsu
> leUpdatePkg/Library/DisplayUpdateProgressTextLib
> 
> Updates for V3
> ==============
> * Add Version field to EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL
> * Break up patch series into 4 smaller patch series to handle dependencies
>   between the edk2 repository and the edk2-platforms repository.
>   + Patch series for edk2 repo that adds DisplayUpdateProgressLib class and
>     instances.  Defines the
> EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL.
>     Adds PerformFlashWriteWithProgress() API to the PlatformFlashAccessLib.
>   + Patch series for platforms in edk2-platforms that use capsules to add the
>     DisplayUpdateProgressLib mapping to the DSC files and add the
>     PerformFlashWriteWithProgress() API implementation to the
>     PlatformFlashAccessLib implementations.
>   + Patch series for platforms in edk2 that use capsules to add the
>     DisplayUpdateProgressLib mapping to the DSC files and add the
>     PerformFlashWriteWithProgress() API implementation to the
>     PlatformFlashAccessLib implementations.
>   + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
>     PerformFlashWriteWithProgress() API .
> 
> Updates for V2
> ==============
> * Change DisplayUpdateProgressGraphicsLib to
> DisplayUpdateProgressLibGraphics
> * Change DisplayUpdateProgressTextLib to DisplayUpdateProgressLibText
> * Clarify that color in Firmware Management Progress Protocol is the
> foreground color
> * Add missing parameters to PerformFlashWriteWithProgress() function header.
> * Update PerformFlashWriteWithProgress() function header describing the use
> of
>   the start and end percentage values.
> * Update QuarkPlatformPkg PerformFlashWriteWithProgress() to call Progress()
> for
>   the end precentage.
> * Update Vlv2Tbl2DevicePkg PerformFlashWriteWithProgress() to call Progress()
>   for the end precentage.
> 
> Add DisplayUpdateProgressLib class along implementations for both graphical
> (Graphics Output Protocol based) and text (Simple Text Output Protocol based)
> consoles.  Also add the EDK II Firmware Management Progress Protocol that is
> an
> optional protocol that provides the progress bar color and a watchdog timeout
> value thaty can be used when a firmware image is updated in a firmware device.
> 
> * Add progress support to DxeCapsuleLibFmp
> * Add progress support to SystemFirmwareUpdateDxe
> * Add progress support to PlatformFlashAccessLib class and instances.
> * Reduce Print() calls during a firmware update.
> 
> Cc: Sean Brogan <sean.brogan@microsoft.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: David Wei <david.wei@intel.com>
> Cc: Mang Guo <mang.guo@intel.com>
> Cc: Kelly Steele <kelly.steele@intel.com>
> 
> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> 
> Michael D Kinney (3):
>   MdeModulePkg: Add DisplayUpdateProgressLib class
>   MdeModulePkg: Add DisplayUpdateProgressLib instances
>   SignedCapsulePkg/PlatformFlashAccessLib: Add progress API
> 
>  .../Include/Library/DisplayUpdateProgressLib.h     |  65 +++
>  .../Include/Protocol/FirmwareManagementProgress.h  |  55 +++
>  .../DisplayUpdateProgressLibGraphics.c             | 475
> +++++++++++++++++++++
>  .../DisplayUpdateProgressLibGraphics.inf           |  60 +++
>  .../DisplayUpdateProgressLibGraphics.uni           |  18 +
>  .../DisplayUpdateProgressLibText.c                 | 174 ++++++++
>  .../DisplayUpdateProgressLibText.inf               |  53 +++
>  .../DisplayUpdateProgressLibText.uni               |  18 +
>  MdeModulePkg/MdeModulePkg.dec                      |  11 +
>  MdeModulePkg/MdeModulePkg.dsc                      |   3 +
>  .../Include/Library/PlatformFlashAccessLib.h       |  49 ++-
>  .../PlatformFlashAccessLibNull.c                   |  70 ++-
>  12 files changed, 1042 insertions(+), 9 deletions(-)
>  create mode 100644
> MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
>  create mode 100644
> MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h
>  create mode 100644
> MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProg
> ressLibGraphics.c
>  create mode 100644
> MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProg
> ressLibGraphics.inf
>  create mode 100644
> MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProg
> ressLibGraphics.uni
>  create mode 100644
> MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLi
> bText.c
>  create mode 100644
> MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLi
> bText.inf
>  create mode 100644
> MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLi
> bText.uni
> 
> --
> 2.14.2.windows.3



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress API
  2018-05-25  6:15 ` [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress API Michael D Kinney
@ 2018-05-28 19:18   ` Yao, Jiewen
  0 siblings, 0 replies; 17+ messages in thread
From: Yao, Jiewen @ 2018-05-28 19:18 UTC (permalink / raw)
  To: Kinney, Michael D, edk2-devel@lists.01.org

Reviewed-by: Jiewen.yao@intel.com

> -----Original Message-----
> From: Kinney, Michael D
> Sent: Thursday, May 24, 2018 11:16 PM
> To: edk2-devel@lists.01.org
> Cc: Yao, Jiewen <jiewen.yao@intel.com>
> Subject: [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress
> API
> 
> https://bugzilla.tianocore.org/show_bug.cgi?id=801
> 
> Add a new API to the PlatformFlashAccessLib that passes
> in an optional Progress() function along with a start and
> end percentage to call the Progress() function with.
> If the Progress() function is not NULL, then it is the
> Progress() function that was passed into the Firmware
> Management Protocol SetImage() services and is used
> to update the user on the progress as a firmware device
> is updated with a firmware image.
> 
> Implementations of the PlatformFlashAccessLib are
> recommended to call the Progress() function as work
> is performed to update to contents of a firmware
> storage device.
> 
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
> ---
>  .../Include/Library/PlatformFlashAccessLib.h       | 49 ++++++++++++++-
>  .../PlatformFlashAccessLibNull.c                   | 70
> +++++++++++++++++++---
>  2 files changed, 110 insertions(+), 9 deletions(-)
> 
> diff --git a/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h
> b/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h
> index 0a8858e4c4..e3308251c2 100644
> --- a/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h
> +++ b/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h
> @@ -1,7 +1,7 @@
>  /** @file
>    Platform flash device access library.
> 
> -  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2016 - 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
> @@ -16,6 +16,8 @@
>  #ifndef __PLATFORM_FLASH_ACCESS_LIB_H__
>  #define __PLATFORM_FLASH_ACCESS_LIB_H__
> 
> +#include <Protocol/FirmwareManagement.h>
> +
>  typedef enum {
>    FlashAddressTypeRelativeAddress,
>    FlashAddressTypeAbsoluteAddress,
> @@ -31,7 +33,7 @@ typedef enum {
>  } PLATFORM_FIRMWARE_TYPE;
> 
>  /**
> -  Perform flash write opreation.
> +  Perform flash write operation.
> 
>    @param[in] FirmwareType      The type of firmware.
>    @param[in] FlashAddress      The address of flash device to be accessed.
> @@ -54,4 +56,47 @@ PerformFlashWrite (
>    IN UINTN                        Length
>    );
> 
> +/**
> +  Perform flash write operation with progress indicator.  The start and end
> +  completion percentage values are passed into this function.  If the
> requested
> +  flash write operation is broken up, then completion percentage between the
> +  start and end values may be passed to the provided Progress function.  The
> +  caller of this function is required to call the Progress function for the
> +  start and end completion percentage values.  This allows the Progress,
> +  StartPercentage, and EndPercentage parameters to be ignored if the
> requested
> +  flash write operation can not be broken up
> +
> +  @param[in] FirmwareType      The type of firmware.
> +  @param[in] FlashAddress      The address of flash device to be accessed.
> +  @param[in] FlashAddressType  The type of flash device address.
> +  @param[in] Buffer            The pointer to the data buffer.
> +  @param[in] Length            The length of data buffer in bytes.
> +  @param[in] Progress          A function used report the progress of the
> +                               firmware update.  This is an optional
> parameter
> +                               that may be NULL.
> +  @param[in] StartPercentage   The start completion percentage value that
> may
> +                               be used to report progress during the flash
> +                               write operation.
> +  @param[in] EndPercentage     The end completion percentage value that
> may
> +                               be used to report progress during the flash
> +                               write operation.
> +
> +  @retval EFI_SUCCESS           The operation returns successfully.
> +  @retval EFI_WRITE_PROTECTED   The flash device is read only.
> +  @retval EFI_UNSUPPORTED       The flash device access is unsupported.
> +  @retval EFI_INVALID_PARAMETER The input parameter is not valid.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PerformFlashWriteWithProgress (
> +  IN PLATFORM_FIRMWARE_TYPE                         FirmwareType,
> +  IN EFI_PHYSICAL_ADDRESS                           FlashAddress,
> +  IN FLASH_ADDRESS_TYPE
> FlashAddressType,
> +  IN VOID                                           *Buffer,
> +  IN UINTN                                          Length,
> +  IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress,
> OPTIONAL
> +  IN UINTN                                          StartPercentage,
> +  IN UINTN                                          EndPercentage
> +  );
> +
>  #endif
> diff --git
> a/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLib
> Null.c
> b/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLib
> Null.c
> index b34ebbba1e..854f108cf4 100644
> ---
> a/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLib
> Null.c
> +++
> b/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAccessLib
> Null.c
> @@ -1,7 +1,7 @@
>  /** @file
>    Platform flash device access library NULL instance.
> 
> -  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2016 - 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
> @@ -20,7 +20,57 @@
>  UINT64 mInternalFdAddress;
> 
>  /**
> -  Perform flash write opreation.
> +  Perform flash write operation with progress indicator.  The start and end
> +  completion percentage values are passed into this function.  If the
> requested
> +  flash write operation is broken up, then completion percentage between the
> +  start and end values may be passed to the provided Progress function.  The
> +  caller of this function is required to call the Progress function for the
> +  start and end completion percentage values.  This allows the Progress,
> +  StartPercentage, and EndPercentage parameters to be ignored if the
> requested
> +  flash write operation can not be broken up
> +
> +  @param[in] FirmwareType      The type of firmware.
> +  @param[in] FlashAddress      The address of flash device to be accessed.
> +  @param[in] FlashAddressType  The type of flash device address.
> +  @param[in] Buffer            The pointer to the data buffer.
> +  @param[in] Length            The length of data buffer in bytes.
> +  @param[in] Progress          A function used report the progress of the
> +                               firmware update.  This is an optional
> parameter
> +                               that may be NULL.
> +  @param[in] StartPercentage   The start completion percentage value that
> may
> +                               be used to report progress during the flash
> +                               write operation.
> +  @param[in] EndPercentage     The end completion percentage value that
> may
> +                               be used to report progress during the flash
> +                               write operation.
> +
> +  @retval EFI_SUCCESS           The operation returns successfully.
> +  @retval EFI_WRITE_PROTECTED   The flash device is read only.
> +  @retval EFI_UNSUPPORTED       The flash device access is unsupported.
> +  @retval EFI_INVALID_PARAMETER The input parameter is not valid.
> +**/
> +EFI_STATUS
> +EFIAPI
> +PerformFlashWriteWithProgress (
> +  IN PLATFORM_FIRMWARE_TYPE                         FirmwareType,
> +  IN EFI_PHYSICAL_ADDRESS                           FlashAddress,
> +  IN FLASH_ADDRESS_TYPE
> FlashAddressType,
> +  IN VOID                                           *Buffer,
> +  IN UINTN                                          Length,
> +  IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS  Progress,
> OPTIONAL
> +  IN UINTN                                          StartPercentage,
> +  IN UINTN                                          EndPercentage
> +  )
> +{
> +  if (FlashAddressType == FlashAddressTypeRelativeAddress) {
> +    FlashAddress = FlashAddress + mInternalFdAddress;
> +  }
> +  CopyMem((VOID *)(UINTN)(FlashAddress), Buffer, Length);
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Perform flash write operation.
> 
>    @param[in] FirmwareType      The type of firmware.
>    @param[in] FlashAddress      The address of flash device to be accessed.
> @@ -43,9 +93,15 @@ PerformFlashWrite (
>    IN UINTN                        Length
>    )
>  {
> -  if (FlashAddressType == FlashAddressTypeRelativeAddress) {
> -    FlashAddress = FlashAddress + mInternalFdAddress;
> -  }
> -  CopyMem((VOID *)(UINTN)(FlashAddress), Buffer, Length);
> -  return EFI_SUCCESS;
> +  return PerformFlashWriteWithProgress (
> +           FirmwareType,
> +           FlashAddress,
> +           FlashAddressType,
> +           Buffer,
> +           Length,
> +           NULL,
> +           0,
> +           0
> +           );
>  }
> +
> --
> 2.14.2.windows.3



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
  2018-05-25  6:15 [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Michael D Kinney
                   ` (3 preceding siblings ...)
  2018-05-28 19:07 ` [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Yao, Jiewen
@ 2018-05-29  9:51 ` Ard Biesheuvel
  2018-05-29  9:51   ` Ard Biesheuvel
  4 siblings, 1 reply; 17+ messages in thread
From: Ard Biesheuvel @ 2018-05-29  9:51 UTC (permalink / raw)
  To: Michael D Kinney
  Cc: edk2-devel@lists.01.org, Eric Dong, Jiewen Yao, Star Zeng,
	David Wei

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:
>
> https://github.com/Microsoft/MS_UEFI/blob/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Include/Library/DisplayUpdateProgressLib.h
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressGraphicsLib
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressTextLib
>
> Updates for V3
> ==============
> * Add Version field to EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL
> * Break up patch series into 4 smaller patch series to handle dependencies
>   between the edk2 repository and the edk2-platforms repository.
>   + Patch series for edk2 repo that adds DisplayUpdateProgressLib class and
>     instances.  Defines the EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL.
>     Adds PerformFlashWriteWithProgress() API to the PlatformFlashAccessLib.
>   + Patch series for platforms in edk2-platforms that use capsules to add the
>     DisplayUpdateProgressLib mapping to the DSC files and add the
>     PerformFlashWriteWithProgress() API implementation to the
>     PlatformFlashAccessLib implementations.
>   + Patch series for platforms in edk2 that use capsules to add the
>     DisplayUpdateProgressLib mapping to the DSC files and add the
>     PerformFlashWriteWithProgress() API implementation to the
>     PlatformFlashAccessLib implementations.
>   + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
>     PerformFlashWriteWithProgress() API .
>
> Updates for V2
> ==============
> * Change DisplayUpdateProgressGraphicsLib to DisplayUpdateProgressLibGraphics
> * Change DisplayUpdateProgressTextLib to DisplayUpdateProgressLibText
> * Clarify that color in Firmware Management Progress Protocol is the foreground color
> * Add missing parameters to PerformFlashWriteWithProgress() function header.
> * Update PerformFlashWriteWithProgress() function header describing the use of
>   the start and end percentage values.
> * Update QuarkPlatformPkg PerformFlashWriteWithProgress() to call Progress() for
>   the end precentage.
> * Update Vlv2Tbl2DevicePkg PerformFlashWriteWithProgress() to call Progress()
>   for the end precentage.
>
> Add DisplayUpdateProgressLib class along implementations for both graphical
> (Graphics Output Protocol based) and text (Simple Text Output Protocol based)
> consoles.  Also add the EDK II Firmware Management Progress Protocol that is an
> optional protocol that provides the progress bar color and a watchdog timeout
> value thaty can be used when a firmware image is updated in a firmware device.
>
> * Add progress support to DxeCapsuleLibFmp
> * Add progress support to SystemFirmwareUpdateDxe
> * Add progress support to PlatformFlashAccessLib class and instances.
> * Reduce Print() calls during a firmware update.
>
> Cc: Sean Brogan <sean.brogan@microsoft.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Eric Dong <eric.dong@intel.com>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: David Wei <david.wei@intel.com>
> Cc: Mang Guo <mang.guo@intel.com>
> Cc: Kelly Steele <kelly.steele@intel.com>
>
> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.1
>
> Michael D Kinney (3):
>   MdeModulePkg: Add DisplayUpdateProgressLib class
>   MdeModulePkg: Add DisplayUpdateProgressLib instances
>   SignedCapsulePkg/PlatformFlashAccessLib: Add progress API
>

This message says 0/3, but there appear to be 4 patches in the series???


>  .../Include/Library/DisplayUpdateProgressLib.h     |  65 +++
>  .../Include/Protocol/FirmwareManagementProgress.h  |  55 +++
>  .../DisplayUpdateProgressLibGraphics.c             | 475 +++++++++++++++++++++
>  .../DisplayUpdateProgressLibGraphics.inf           |  60 +++
>  .../DisplayUpdateProgressLibGraphics.uni           |  18 +
>  .../DisplayUpdateProgressLibText.c                 | 174 ++++++++
>  .../DisplayUpdateProgressLibText.inf               |  53 +++
>  .../DisplayUpdateProgressLibText.uni               |  18 +
>  MdeModulePkg/MdeModulePkg.dec                      |  11 +
>  MdeModulePkg/MdeModulePkg.dsc                      |   3 +
>  .../Include/Library/PlatformFlashAccessLib.h       |  49 ++-
>  .../PlatformFlashAccessLibNull.c                   |  70 ++-
>  12 files changed, 1042 insertions(+), 9 deletions(-)
>  create mode 100644 MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h
>  create mode 100644 MdeModulePkg/Include/Protocol/FirmwareManagementProgress.h
>  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
>
> --
> 2.14.2.windows.3
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
  2018-05-29  9:51 ` Ard Biesheuvel
@ 2018-05-29  9:51   ` Ard Biesheuvel
  2018-05-29 12:43     ` Ard Biesheuvel
  0 siblings, 1 reply; 17+ messages in thread
From: Ard Biesheuvel @ 2018-05-29  9:51 UTC (permalink / raw)
  To: Michael D Kinney
  Cc: edk2-devel@lists.01.org, Eric Dong, Jiewen Yao, Star Zeng,
	David Wei

On 29 May 2018 at 11:51, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> 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:
>>
>> https://github.com/Microsoft/MS_UEFI/blob/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Include/Library/DisplayUpdateProgressLib.h
>> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressGraphicsLib
>> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressTextLib
>>
>> Updates for V3
>> ==============
>> * Add Version field to EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL
>> * Break up patch series into 4 smaller patch series to handle dependencies
>>   between the edk2 repository and the edk2-platforms repository.
>>   + Patch series for edk2 repo that adds DisplayUpdateProgressLib class and
>>     instances.  Defines the EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL.
>>     Adds PerformFlashWriteWithProgress() API to the PlatformFlashAccessLib.
>>   + Patch series for platforms in edk2-platforms that use capsules to add the
>>     DisplayUpdateProgressLib mapping to the DSC files and add the
>>     PerformFlashWriteWithProgress() API implementation to the
>>     PlatformFlashAccessLib implementations.
>>   + Patch series for platforms in edk2 that use capsules to add the
>>     DisplayUpdateProgressLib mapping to the DSC files and add the
>>     PerformFlashWriteWithProgress() API implementation to the
>>     PlatformFlashAccessLib implementations.
>>   + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
>>     PerformFlashWriteWithProgress() API .
>>
>> Updates for V2
>> ==============
>> * Change DisplayUpdateProgressGraphicsLib to DisplayUpdateProgressLibGraphics
>> * Change DisplayUpdateProgressTextLib to DisplayUpdateProgressLibText
>> * Clarify that color in Firmware Management Progress Protocol is the foreground color
>> * Add missing parameters to PerformFlashWriteWithProgress() function header.
>> * Update PerformFlashWriteWithProgress() function header describing the use of
>>   the start and end percentage values.
>> * Update QuarkPlatformPkg PerformFlashWriteWithProgress() to call Progress() for
>>   the end precentage.
>> * Update Vlv2Tbl2DevicePkg PerformFlashWriteWithProgress() to call Progress()
>>   for the end precentage.
>>
>> Add DisplayUpdateProgressLib class along implementations for both graphical
>> (Graphics Output Protocol based) and text (Simple Text Output Protocol based)
>> consoles.  Also add the EDK II Firmware Management Progress Protocol that is an
>> optional protocol that provides the progress bar color and a watchdog timeout
>> value thaty can be used when a firmware image is updated in a firmware device.
>>
>> * Add progress support to DxeCapsuleLibFmp
>> * Add progress support to SystemFirmwareUpdateDxe
>> * Add progress support to PlatformFlashAccessLib class and instances.
>> * Reduce Print() calls during a firmware update.
>>
>> Cc: Sean Brogan <sean.brogan@microsoft.com>
>> Cc: Star Zeng <star.zeng@intel.com>
>> Cc: Eric Dong <eric.dong@intel.com>
>> Cc: Jiewen Yao <jiewen.yao@intel.com>
>> Cc: David Wei <david.wei@intel.com>
>> Cc: Mang Guo <mang.guo@intel.com>
>> Cc: Kelly Steele <kelly.steele@intel.com>
>>
>> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>>
>> Michael D Kinney (3):
>>   MdeModulePkg: Add DisplayUpdateProgressLib class
>>   MdeModulePkg: Add DisplayUpdateProgressLib instances
>>   SignedCapsulePkg/PlatformFlashAccessLib: Add progress API
>>
>
> This message says 0/3, but there appear to be 4 patches in the series???
>

Never mind, the threading in my email client confused me.


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
  2018-05-29  9:51   ` Ard Biesheuvel
@ 2018-05-29 12:43     ` Ard Biesheuvel
  2018-05-29 13:05       ` Gao, Liming
  0 siblings, 1 reply; 17+ messages in thread
From: Ard Biesheuvel @ 2018-05-29 12:43 UTC (permalink / raw)
  To: Michael D Kinney
  Cc: edk2-devel@lists.01.org, Eric Dong, Jiewen Yao, Star Zeng,
	David Wei

On 29 May 2018 at 11:51, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> On 29 May 2018 at 11:51, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>> 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:
>>>
>>> https://github.com/Microsoft/MS_UEFI/blob/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Include/Library/DisplayUpdateProgressLib.h
>>> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressGraphicsLib
>>> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressTextLib
>>>
>>> Updates for V3
>>> ==============
>>> * Add Version field to EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL
>>> * Break up patch series into 4 smaller patch series to handle dependencies
>>>   between the edk2 repository and the edk2-platforms repository.
>>>   + Patch series for edk2 repo that adds DisplayUpdateProgressLib class and
>>>     instances.  Defines the EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL.
>>>     Adds PerformFlashWriteWithProgress() API to the PlatformFlashAccessLib.
>>>   + Patch series for platforms in edk2-platforms that use capsules to add the
>>>     DisplayUpdateProgressLib mapping to the DSC files and add the
>>>     PerformFlashWriteWithProgress() API implementation to the
>>>     PlatformFlashAccessLib implementations.
>>>   + Patch series for platforms in edk2 that use capsules to add the
>>>     DisplayUpdateProgressLib mapping to the DSC files and add the
>>>     PerformFlashWriteWithProgress() API implementation to the
>>>     PlatformFlashAccessLib implementations.
>>>   + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
>>>     PerformFlashWriteWithProgress() API .
>>>
>>> Updates for V2
>>> ==============
>>> * Change DisplayUpdateProgressGraphicsLib to DisplayUpdateProgressLibGraphics
>>> * Change DisplayUpdateProgressTextLib to DisplayUpdateProgressLibText
>>> * Clarify that color in Firmware Management Progress Protocol is the foreground color
>>> * Add missing parameters to PerformFlashWriteWithProgress() function header.
>>> * Update PerformFlashWriteWithProgress() function header describing the use of
>>>   the start and end percentage values.
>>> * Update QuarkPlatformPkg PerformFlashWriteWithProgress() to call Progress() for
>>>   the end precentage.
>>> * Update Vlv2Tbl2DevicePkg PerformFlashWriteWithProgress() to call Progress()
>>>   for the end precentage.
>>>
>>> Add DisplayUpdateProgressLib class along implementations for both graphical
>>> (Graphics Output Protocol based) and text (Simple Text Output Protocol based)
>>> consoles.  Also add the EDK II Firmware Management Progress Protocol that is an
>>> optional protocol that provides the progress bar color and a watchdog timeout
>>> value thaty can be used when a firmware image is updated in a firmware device.
>>>
>>> * Add progress support to DxeCapsuleLibFmp
>>> * Add progress support to SystemFirmwareUpdateDxe
>>> * Add progress support to PlatformFlashAccessLib class and instances.
>>> * Reduce Print() calls during a firmware update.
>>>
>>> Cc: Sean Brogan <sean.brogan@microsoft.com>
>>> Cc: Star Zeng <star.zeng@intel.com>
>>> Cc: Eric Dong <eric.dong@intel.com>
>>> Cc: Jiewen Yao <jiewen.yao@intel.com>
>>> Cc: David Wei <david.wei@intel.com>
>>> Cc: Mang Guo <mang.guo@intel.com>
>>> Cc: Kelly Steele <kelly.steele@intel.com>
>>>
>>> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
>>> Contributed-under: TianoCore Contribution Agreement 1.1
>>>
>>> Michael D Kinney (3):
>>>   MdeModulePkg: Add DisplayUpdateProgressLib class
>>>   MdeModulePkg: Add DisplayUpdateProgressLib instances
>>>   SignedCapsulePkg/PlatformFlashAccessLib: Add progress API
>>>
>>
>> This message says 0/3, but there appear to be 4 patches in the series???
>>
>
> Never mind, the threading in my email client confused me.

OK I am still confused

Where is this patch:

  + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
    PerformFlashWriteWithProgress() API .

??


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
  2018-05-29 12:43     ` Ard Biesheuvel
@ 2018-05-29 13:05       ` Gao, Liming
  2018-05-29 13:08         ` Ard Biesheuvel
  0 siblings, 1 reply; 17+ messages in thread
From: Gao, Liming @ 2018-05-29 13:05 UTC (permalink / raw)
  To: Ard Biesheuvel, Kinney, Michael D
  Cc: edk2-devel@lists.01.org, Yao, Jiewen, Dong, Eric, Zeng, Star,
	Wei, David

Do you try to find this one [edk2] [edk2-platforms Patch v4 0/6] Add DisplayUpdateProgressLib to platforms?

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ard Biesheuvel
> Sent: Tuesday, May 29, 2018 8:43 PM
> To: Kinney, Michael D <michael.d.kinney@intel.com>
> Cc: edk2-devel@lists.01.org; Yao, Jiewen <jiewen.yao@intel.com>; Dong, Eric <eric.dong@intel.com>; Zeng, Star
> <star.zeng@intel.com>; Wei, David <david.wei@intel.com>
> Subject: Re: [edk2] [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
> 
> On 29 May 2018 at 11:51, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> > On 29 May 2018 at 11:51, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
> >> 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:
> >>>
> >>>
> https://github.com/Microsoft/MS_UEFI/blob/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Include/Library/DisplayUpdateProgress
> Lib.h
> >>>
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressGraphics
> Lib
> >>>
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressTextLib
> >>>
> >>> Updates for V3
> >>> ==============
> >>> * Add Version field to EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL
> >>> * Break up patch series into 4 smaller patch series to handle dependencies
> >>>   between the edk2 repository and the edk2-platforms repository.
> >>>   + Patch series for edk2 repo that adds DisplayUpdateProgressLib class and
> >>>     instances.  Defines the EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL.
> >>>     Adds PerformFlashWriteWithProgress() API to the PlatformFlashAccessLib.
> >>>   + Patch series for platforms in edk2-platforms that use capsules to add the
> >>>     DisplayUpdateProgressLib mapping to the DSC files and add the
> >>>     PerformFlashWriteWithProgress() API implementation to the
> >>>     PlatformFlashAccessLib implementations.
> >>>   + Patch series for platforms in edk2 that use capsules to add the
> >>>     DisplayUpdateProgressLib mapping to the DSC files and add the
> >>>     PerformFlashWriteWithProgress() API implementation to the
> >>>     PlatformFlashAccessLib implementations.
> >>>   + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
> >>>     PerformFlashWriteWithProgress() API .
> >>>
> >>> Updates for V2
> >>> ==============
> >>> * Change DisplayUpdateProgressGraphicsLib to DisplayUpdateProgressLibGraphics
> >>> * Change DisplayUpdateProgressTextLib to DisplayUpdateProgressLibText
> >>> * Clarify that color in Firmware Management Progress Protocol is the foreground color
> >>> * Add missing parameters to PerformFlashWriteWithProgress() function header.
> >>> * Update PerformFlashWriteWithProgress() function header describing the use of
> >>>   the start and end percentage values.
> >>> * Update QuarkPlatformPkg PerformFlashWriteWithProgress() to call Progress() for
> >>>   the end precentage.
> >>> * Update Vlv2Tbl2DevicePkg PerformFlashWriteWithProgress() to call Progress()
> >>>   for the end precentage.
> >>>
> >>> Add DisplayUpdateProgressLib class along implementations for both graphical
> >>> (Graphics Output Protocol based) and text (Simple Text Output Protocol based)
> >>> consoles.  Also add the EDK II Firmware Management Progress Protocol that is an
> >>> optional protocol that provides the progress bar color and a watchdog timeout
> >>> value thaty can be used when a firmware image is updated in a firmware device.
> >>>
> >>> * Add progress support to DxeCapsuleLibFmp
> >>> * Add progress support to SystemFirmwareUpdateDxe
> >>> * Add progress support to PlatformFlashAccessLib class and instances.
> >>> * Reduce Print() calls during a firmware update.
> >>>
> >>> Cc: Sean Brogan <sean.brogan@microsoft.com>
> >>> Cc: Star Zeng <star.zeng@intel.com>
> >>> Cc: Eric Dong <eric.dong@intel.com>
> >>> Cc: Jiewen Yao <jiewen.yao@intel.com>
> >>> Cc: David Wei <david.wei@intel.com>
> >>> Cc: Mang Guo <mang.guo@intel.com>
> >>> Cc: Kelly Steele <kelly.steele@intel.com>
> >>>
> >>> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
> >>> Contributed-under: TianoCore Contribution Agreement 1.1
> >>>
> >>> Michael D Kinney (3):
> >>>   MdeModulePkg: Add DisplayUpdateProgressLib class
> >>>   MdeModulePkg: Add DisplayUpdateProgressLib instances
> >>>   SignedCapsulePkg/PlatformFlashAccessLib: Add progress API
> >>>
> >>
> >> This message says 0/3, but there appear to be 4 patches in the series???
> >>
> >
> > Never mind, the threading in my email client confused me.
> 
> OK I am still confused
> 
> Where is this patch:
> 
>   + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
>     PerformFlashWriteWithProgress() API .
> 
> ??
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
  2018-05-29 13:05       ` Gao, Liming
@ 2018-05-29 13:08         ` Ard Biesheuvel
  2018-05-29 14:31           ` Kinney, Michael D
  0 siblings, 1 reply; 17+ messages in thread
From: Ard Biesheuvel @ 2018-05-29 13:08 UTC (permalink / raw)
  To: Gao, Liming
  Cc: Kinney, Michael D, edk2-devel@lists.01.org, Yao, Jiewen,
	Dong, Eric, Zeng, Star, Wei, David

Hello Liming,

On 29 May 2018 at 15:05, Gao, Liming <liming.gao@intel.com> wrote:
> Do you try to find this one [edk2] [edk2-platforms Patch v4 0/6] Add DisplayUpdateProgressLib to platforms?
>

No, I am trying to locate the patch that actually invokes the new
PerformFlashWriteWithProgress() function when processing the capsule.

>> -----Original Message-----
>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ard Biesheuvel
>> Sent: Tuesday, May 29, 2018 8:43 PM
>> To: Kinney, Michael D <michael.d.kinney@intel.com>
>> Cc: edk2-devel@lists.01.org; Yao, Jiewen <jiewen.yao@intel.com>; Dong, Eric <eric.dong@intel.com>; Zeng, Star
>> <star.zeng@intel.com>; Wei, David <david.wei@intel.com>
>> Subject: Re: [edk2] [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
>>
>> On 29 May 2018 at 11:51, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>> > On 29 May 2018 at 11:51, Ard Biesheuvel <ard.biesheuvel@linaro.org> wrote:
>> >> 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:
>> >>>
>> >>>
>> https://github.com/Microsoft/MS_UEFI/blob/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Include/Library/DisplayUpdateProgress
>> Lib.h
>> >>>
>> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressGraphics
>> Lib
>> >>>
>> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsuleSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgressTextLib
>> >>>
>> >>> Updates for V3
>> >>> ==============
>> >>> * Add Version field to EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL
>> >>> * Break up patch series into 4 smaller patch series to handle dependencies
>> >>>   between the edk2 repository and the edk2-platforms repository.
>> >>>   + Patch series for edk2 repo that adds DisplayUpdateProgressLib class and
>> >>>     instances.  Defines the EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL.
>> >>>     Adds PerformFlashWriteWithProgress() API to the PlatformFlashAccessLib.
>> >>>   + Patch series for platforms in edk2-platforms that use capsules to add the
>> >>>     DisplayUpdateProgressLib mapping to the DSC files and add the
>> >>>     PerformFlashWriteWithProgress() API implementation to the
>> >>>     PlatformFlashAccessLib implementations.
>> >>>   + Patch series for platforms in edk2 that use capsules to add the
>> >>>     DisplayUpdateProgressLib mapping to the DSC files and add the
>> >>>     PerformFlashWriteWithProgress() API implementation to the
>> >>>     PlatformFlashAccessLib implementations.
>> >>>   + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
>> >>>     PerformFlashWriteWithProgress() API .
>> >>>
>> >>> Updates for V2
>> >>> ==============
>> >>> * Change DisplayUpdateProgressGraphicsLib to DisplayUpdateProgressLibGraphics
>> >>> * Change DisplayUpdateProgressTextLib to DisplayUpdateProgressLibText
>> >>> * Clarify that color in Firmware Management Progress Protocol is the foreground color
>> >>> * Add missing parameters to PerformFlashWriteWithProgress() function header.
>> >>> * Update PerformFlashWriteWithProgress() function header describing the use of
>> >>>   the start and end percentage values.
>> >>> * Update QuarkPlatformPkg PerformFlashWriteWithProgress() to call Progress() for
>> >>>   the end precentage.
>> >>> * Update Vlv2Tbl2DevicePkg PerformFlashWriteWithProgress() to call Progress()
>> >>>   for the end precentage.
>> >>>
>> >>> Add DisplayUpdateProgressLib class along implementations for both graphical
>> >>> (Graphics Output Protocol based) and text (Simple Text Output Protocol based)
>> >>> consoles.  Also add the EDK II Firmware Management Progress Protocol that is an
>> >>> optional protocol that provides the progress bar color and a watchdog timeout
>> >>> value thaty can be used when a firmware image is updated in a firmware device.
>> >>>
>> >>> * Add progress support to DxeCapsuleLibFmp
>> >>> * Add progress support to SystemFirmwareUpdateDxe
>> >>> * Add progress support to PlatformFlashAccessLib class and instances.
>> >>> * Reduce Print() calls during a firmware update.
>> >>>
>> >>> Cc: Sean Brogan <sean.brogan@microsoft.com>
>> >>> Cc: Star Zeng <star.zeng@intel.com>
>> >>> Cc: Eric Dong <eric.dong@intel.com>
>> >>> Cc: Jiewen Yao <jiewen.yao@intel.com>
>> >>> Cc: David Wei <david.wei@intel.com>
>> >>> Cc: Mang Guo <mang.guo@intel.com>
>> >>> Cc: Kelly Steele <kelly.steele@intel.com>
>> >>>
>> >>> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com>
>> >>> Contributed-under: TianoCore Contribution Agreement 1.1
>> >>>
>> >>> Michael D Kinney (3):
>> >>>   MdeModulePkg: Add DisplayUpdateProgressLib class
>> >>>   MdeModulePkg: Add DisplayUpdateProgressLib instances
>> >>>   SignedCapsulePkg/PlatformFlashAccessLib: Add progress API
>> >>>
>> >>
>> >> This message says 0/3, but there appear to be 4 patches in the series???
>> >>
>> >
>> > Never mind, the threading in my email client confused me.
>>
>> OK I am still confused
>>
>> Where is this patch:
>>
>>   + Patch for edk2 that adds the use of the DisplayUpateProgressLib and the
>>     PerformFlashWriteWithProgress() API .
>>
>> ??
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org
>> https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
  2018-05-29 13:08         ` Ard Biesheuvel
@ 2018-05-29 14:31           ` Kinney, Michael D
  2018-05-31 11:12             ` Ard Biesheuvel
  0 siblings, 1 reply; 17+ messages in thread
From: Kinney, Michael D @ 2018-05-29 14:31 UTC (permalink / raw)
  To: Ard Biesheuvel, Gao, Liming, Kinney, Michael D
  Cc: Dong, Eric, edk2-devel@lists.01.org, Yao, Jiewen, Zeng, Star,
	Wei, David

Ard,

I broke the series up into multiple series.

I can send out the 4th one this morning so
you can see the one that uses it.  It is a
repeat of content that was shared in a single
series earlier.  I deferred it so we can get
all the platform updates done first so there
are no build breaks.

Mike

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-
> bounces@lists.01.org] On Behalf Of Ard Biesheuvel
> Sent: Tuesday, May 29, 2018 6:08 AM
> To: Gao, Liming <liming.gao@intel.com>
> Cc: Dong, Eric <eric.dong@intel.com>; edk2-
> devel@lists.01.org; Yao, Jiewen <jiewen.yao@intel.com>;
> Kinney, Michael D <michael.d.kinney@intel.com>; Zeng,
> Star <star.zeng@intel.com>; Wei, David
> <david.wei@intel.com>
> Subject: Re: [edk2] [Patch v3 0/3] Add
> DisplayUpdateProgressLib for capsules
> 
> Hello Liming,
> 
> On 29 May 2018 at 15:05, Gao, Liming
> <liming.gao@intel.com> wrote:
> > Do you try to find this one [edk2] [edk2-platforms
> Patch v4 0/6] Add DisplayUpdateProgressLib to platforms?
> >
> 
> No, I am trying to locate the patch that actually
> invokes the new
> PerformFlashWriteWithProgress() function when processing
> the capsule.
> 
> >> -----Original Message-----
> >> From: edk2-devel [mailto:edk2-devel-
> bounces@lists.01.org] On Behalf Of Ard Biesheuvel
> >> Sent: Tuesday, May 29, 2018 8:43 PM
> >> To: Kinney, Michael D <michael.d.kinney@intel.com>
> >> Cc: edk2-devel@lists.01.org; Yao, Jiewen
> <jiewen.yao@intel.com>; Dong, Eric
> <eric.dong@intel.com>; Zeng, Star
> >> <star.zeng@intel.com>; Wei, David
> <david.wei@intel.com>
> >> Subject: Re: [edk2] [Patch v3 0/3] Add
> DisplayUpdateProgressLib for capsules
> >>
> >> On 29 May 2018 at 11:51, Ard Biesheuvel
> <ard.biesheuvel@linaro.org> wrote:
> >> > On 29 May 2018 at 11:51, Ard Biesheuvel
> <ard.biesheuvel@linaro.org> wrote:
> >> >> 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:
> >> >>>
> >> >>>
> >>
> https://github.com/Microsoft/MS_UEFI/blob/share/MsCapsul
> eSupport/MsCapsuleUpdatePkg/Include/Library/DisplayUpdat
> eProgress
> >> Lib.h
> >> >>>
> >>
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsul
> eSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgres
> sGraphics
> >> Lib
> >> >>>
> >>
> https://github.com/Microsoft/MS_UEFI/tree/share/MsCapsul
> eSupport/MsCapsuleUpdatePkg/Library/DisplayUpdateProgres
> sTextLib
> >> >>>
> >> >>> Updates for V3
> >> >>> ==============
> >> >>> * Add Version field to
> EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL
> >> >>> * Break up patch series into 4 smaller patch
> series to handle dependencies
> >> >>>   between the edk2 repository and the edk2-
> platforms repository.
> >> >>>   + Patch series for edk2 repo that adds
> DisplayUpdateProgressLib class and
> >> >>>     instances.  Defines the
> EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL.
> >> >>>     Adds PerformFlashWriteWithProgress() API to
> the PlatformFlashAccessLib.
> >> >>>   + Patch series for platforms in edk2-platforms
> that use capsules to add the
> >> >>>     DisplayUpdateProgressLib mapping to the DSC
> files and add the
> >> >>>     PerformFlashWriteWithProgress() API
> implementation to the
> >> >>>     PlatformFlashAccessLib implementations.
> >> >>>   + Patch series for platforms in edk2 that use
> capsules to add the
> >> >>>     DisplayUpdateProgressLib mapping to the DSC
> files and add the
> >> >>>     PerformFlashWriteWithProgress() API
> implementation to the
> >> >>>     PlatformFlashAccessLib implementations.
> >> >>>   + Patch for edk2 that adds the use of the
> DisplayUpateProgressLib and the
> >> >>>     PerformFlashWriteWithProgress() API .
> >> >>>
> >> >>> Updates for V2
> >> >>> ==============
> >> >>> * Change DisplayUpdateProgressGraphicsLib to
> DisplayUpdateProgressLibGraphics
> >> >>> * Change DisplayUpdateProgressTextLib to
> DisplayUpdateProgressLibText
> >> >>> * Clarify that color in Firmware Management
> Progress Protocol is the foreground color
> >> >>> * Add missing parameters to
> PerformFlashWriteWithProgress() function header.
> >> >>> * Update PerformFlashWriteWithProgress() function
> header describing the use of
> >> >>>   the start and end percentage values.
> >> >>> * Update QuarkPlatformPkg
> PerformFlashWriteWithProgress() to call Progress() for
> >> >>>   the end precentage.
> >> >>> * Update Vlv2Tbl2DevicePkg
> PerformFlashWriteWithProgress() to call Progress()
> >> >>>   for the end precentage.
> >> >>>
> >> >>> Add DisplayUpdateProgressLib class along
> implementations for both graphical
> >> >>> (Graphics Output Protocol based) and text (Simple
> Text Output Protocol based)
> >> >>> consoles.  Also add the EDK II Firmware
> Management Progress Protocol that is an
> >> >>> optional protocol that provides the progress bar
> color and a watchdog timeout
> >> >>> value thaty can be used when a firmware image is
> updated in a firmware device.
> >> >>>
> >> >>> * Add progress support to DxeCapsuleLibFmp
> >> >>> * Add progress support to SystemFirmwareUpdateDxe
> >> >>> * Add progress support to PlatformFlashAccessLib
> class and instances.
> >> >>> * Reduce Print() calls during a firmware update.
> >> >>>
> >> >>> Cc: Sean Brogan <sean.brogan@microsoft.com>
> >> >>> Cc: Star Zeng <star.zeng@intel.com>
> >> >>> Cc: Eric Dong <eric.dong@intel.com>
> >> >>> Cc: Jiewen Yao <jiewen.yao@intel.com>
> >> >>> Cc: David Wei <david.wei@intel.com>
> >> >>> Cc: Mang Guo <mang.guo@intel.com>
> >> >>> Cc: Kelly Steele <kelly.steele@intel.com>
> >> >>>
> >> >>> Signed-off-by: Michael D Kinney
> <michael.d.kinney@intel.com>
> >> >>> Contributed-under: TianoCore Contribution
> Agreement 1.1
> >> >>>
> >> >>> Michael D Kinney (3):
> >> >>>   MdeModulePkg: Add DisplayUpdateProgressLib
> class
> >> >>>   MdeModulePkg: Add DisplayUpdateProgressLib
> instances
> >> >>>   SignedCapsulePkg/PlatformFlashAccessLib: Add
> progress API
> >> >>>
> >> >>
> >> >> This message says 0/3, but there appear to be 4
> patches in the series???
> >> >>
> >> >
> >> > Never mind, the threading in my email client
> confused me.
> >>
> >> OK I am still confused
> >>
> >> Where is this patch:
> >>
> >>   + Patch for edk2 that adds the use of the
> DisplayUpateProgressLib and the
> >>     PerformFlashWriteWithProgress() API .
> >>
> >> ??
> >> _______________________________________________
> >> 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


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
  2018-05-25  6:15 ` [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances Michael D Kinney
  2018-05-25 11:10   ` Zeng, Star
@ 2018-05-31 11:09   ` Ard Biesheuvel
  2018-06-04 20:24     ` Kinney, Michael D
  1 sibling, 1 reply; 17+ messages in thread
From: Ard Biesheuvel @ 2018-05-31 11:09 UTC (permalink / raw)
  To: Michael D Kinney, Leif Lindholm
  Cc: edk2-devel@lists.01.org, Eric Dong, Star Zeng

(+ 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


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules
  2018-05-29 14:31           ` Kinney, Michael D
@ 2018-05-31 11:12             ` Ard Biesheuvel
  0 siblings, 0 replies; 17+ messages in thread
From: Ard Biesheuvel @ 2018-05-31 11:12 UTC (permalink / raw)
  To: Kinney, Michael D
  Cc: Gao, Liming, Dong, Eric, edk2-devel@lists.01.org, Yao, Jiewen,
	Zeng, Star, Wei, David

On 29 May 2018 at 16:31, Kinney, Michael D <michael.d.kinney@intel.com> wrote:
> Ard,
>
> I broke the series up into multiple series.
>
> I can send out the 4th one this morning so
> you can see the one that uses it.  It is a
> repeat of content that was shared in a single
> series earlier.  I deferred it so we can get
> all the platform updates done first so there
> are no build breaks.
>

Yeah I found the code in question I believe.


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances
  2018-05-31 11:09   ` Ard Biesheuvel
@ 2018-06-04 20:24     ` Kinney, Michael D
  0 siblings, 0 replies; 17+ messages in thread
From: Kinney, Michael D @ 2018-06-04 20:24 UTC (permalink / raw)
  To: Ard Biesheuvel, Leif Lindholm, Kinney, Michael D
  Cc: edk2-devel@lists.01.org, Dong, Eric, Zeng, Star

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

^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2018-06-04 20:24 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-05-25  6:15 [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Michael D Kinney
2018-05-25  6:15 ` [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class Michael D Kinney
2018-05-25 11:06   ` Zeng, Star
2018-05-25  6:15 ` [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances Michael D Kinney
2018-05-25 11:10   ` Zeng, Star
2018-05-31 11:09   ` Ard Biesheuvel
2018-06-04 20:24     ` Kinney, Michael D
2018-05-25  6:15 ` [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress API Michael D Kinney
2018-05-28 19:18   ` Yao, Jiewen
2018-05-28 19:07 ` [Patch v3 0/3] Add DisplayUpdateProgressLib for capsules Yao, Jiewen
2018-05-29  9:51 ` Ard Biesheuvel
2018-05-29  9:51   ` Ard Biesheuvel
2018-05-29 12:43     ` Ard Biesheuvel
2018-05-29 13:05       ` Gao, Liming
2018-05-29 13:08         ` Ard Biesheuvel
2018-05-29 14:31           ` Kinney, Michael D
2018-05-31 11:12             ` Ard Biesheuvel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox