From nobody Sun May 5 18:42:53 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1527228962621876.9453782325527; Thu, 24 May 2018 23:16:02 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id ABA4520969641; Thu, 24 May 2018 23:15:59 -0700 (PDT) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 6C7C120965DDA for ; Thu, 24 May 2018 23:15:58 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 May 2018 23:15:57 -0700 Received: from mjain-mobl.amr.corp.intel.com (HELO mdkinney-MOBL2.amr.corp.intel.com) ([10.252.141.109]) by fmsmga006.fm.intel.com with ESMTP; 24 May 2018 23:15:56 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=michael.d.kinney@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,439,1520924400"; d="scan'208";a="231694767" From: Michael D Kinney To: edk2-devel@lists.01.org Date: Thu, 24 May 2018 23:15:50 -0700 Message-Id: <20180525061552.19840-2-michael.d.kinney@intel.com> X-Mailer: git-send-email 2.14.2.windows.3 In-Reply-To: <20180525061552.19840-1-michael.d.kinney@intel.com> References: <20180525061552.19840-1-michael.d.kinney@intel.com> Subject: [edk2] [Patch v3 1/3] MdeModulePkg: Add DisplayUpdateProgressLib class X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Eric Dong , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" https://bugzilla.tianocore.org/show_bug.cgi?id=3D801 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 Cc: Star Zeng Cc: Eric Dong Signed-off-by: Michael D Kinney Contributed-under: TianoCore Contribution Agreement 1.1 Reviewed-by: Star Zeng after fixing typo ' custoimize= ' to ' customize '. --- .../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/FirmwareManagementProgres= s.h diff --git a/MdeModulePkg/Include/Library/DisplayUpdateProgressLib.h b/MdeM= odulePkg/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 custoim= ize + how a user is informed of completion progress. + + Copyright (c) 2016, Microsoft Corporation + Copyright (c) 2018, Intel Corporation. All rights reserved.
+ + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + 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 not= ice, + 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 IM= PLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE D= ISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY= DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCL= UDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF= USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY TH= EORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEG= LIGENCE + 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 + +/** + 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 co= lor + 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 n= ot + 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/M= deModulePkg/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.
+ This program and the accompanying materials are licensed and made availa= ble under + the terms and conditions of the BSD License that accompanies this distri= bution. + 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 IMP= LIED. + +**/ + +#ifndef __EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL_H__ +#define __EDKII_FIRMWARE_MANAGEMENT_PROGRESS_PROTOCOL_H__ + +#include + +/// +/// 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 SetIma= ge() + /// 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() se= rvice + /// 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 =20 + ## @libraryclass Provides services to display completion progress when + # processing a firmware update that updates the firmware image in a fir= mware + # device. A platform may provide its own instance of this library clas= s 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 =3D { 0x695d7835, 0x8d47,= 0x4c11, { 0xab, 0x22, 0xfa, 0x8a, 0xcc, 0xe7, 0xae, 0x7a } } ## Include/Protocol/PlatformSpecificResetHandler.h gEdkiiPlatformSpecificResetHandlerProtocolGuid =3D { 0x2df6ba0b, 0x7092,= 0x440d, { 0xbd, 0x4, 0xfb, 0x9, 0x1e, 0xc3, 0xf3, 0xc1 } } + + ## Include/Protocol/FirmwareManagementProgress.h + gEdkiiFirmwareManagementProgressProtocolGuid =3D { 0x1849bda2, 0x6952, 0= x4e86, { 0xa1, 0xdb, 0x55, 0x9a, 0x3c, 0x47, 0x9d, 0xf1 } } + # # [Error.gEfiMdeModulePkgTokenSpaceGuid] # 0x80000001 | Invalid value provided. --=20 2.14.2.windows.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 18:42:53 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1527228965816584.722607620149; Thu, 24 May 2018 23:16:05 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id DDFD321BADAB9; Thu, 24 May 2018 23:15:59 -0700 (PDT) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 7920620965DE2 for ; Thu, 24 May 2018 23:15:58 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 May 2018 23:15:57 -0700 Received: from mjain-mobl.amr.corp.intel.com (HELO mdkinney-MOBL2.amr.corp.intel.com) ([10.252.141.109]) by fmsmga006.fm.intel.com with ESMTP; 24 May 2018 23:15:57 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=michael.d.kinney@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,439,1520924400"; d="scan'208";a="231694770" From: Michael D Kinney To: edk2-devel@lists.01.org Date: Thu, 24 May 2018 23:15:51 -0700 Message-Id: <20180525061552.19840-3-michael.d.kinney@intel.com> X-Mailer: git-send-email 2.14.2.windows.3 In-Reply-To: <20180525061552.19840-1-michael.d.kinney@intel.com> References: <20180525061552.19840-1-michael.d.kinney@intel.com> Subject: [edk2] [Patch v3 2/3] MdeModulePkg: Add DisplayUpdateProgressLib instances X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Eric Dong , Star Zeng MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" https://bugzilla.tianocore.org/show_bug.cgi?id=3D801 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 Cc: Star Zeng Cc: Eric Dong Signed-off-by: Michael D Kinney Contributed-under: TianoCore Contribution Agreement 1.1 Reviewed-by: Star Zeng --- .../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/D= isplayUpdateProgressLibGraphics.c create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/D= isplayUpdateProgressLibGraphics.inf create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/D= isplayUpdateProgressLibGraphics.uni create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibText/Displ= ayUpdateProgressLibText.c create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibText/Displ= ayUpdateProgressLibText.inf create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressLibText/Displ= ayUpdateProgressLibText.uni diff --git a/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayU= pdateProgressLibGraphics.c b/MdeModulePkg/Library/DisplayUpdateProgressLibG= raphics/DisplayUpdateProgressLibGraphics.c new file mode 100644 index 0000000000..007522cea0 --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdatePr= ogressLibGraphics.c @@ -0,0 +1,475 @@ +/** @file + Provides services to display completion progress of a firmware update on= a + graphical console that supports the Graphics Output Protocol. + + Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+ Copyright (c) 2018, Intel Corporation. All rights reserved.
+ + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + 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 not= ice, + 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 IM= PLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE D= ISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY= DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCL= UDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF= USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY TH= EORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEG= LIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +**/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +// +// Values in percent of of logo height. +// +#define LOGO_BOTTOM_PADDING 20 +#define PROGRESS_BLOCK_HEIGHT 10 + +// +// Graphics Output Protocol instance to display progress bar +// +EFI_GRAPHICS_OUTPUT_PROTOCOL *mGop =3D NULL; + +// +// Set to 100 percent so it is reset on first call. +// +UINTN mPreviousProgress =3D 100; + +// +// Display coordinates for the progress bar. +// +UINTN mStartX =3D 0; +UINTN mStartY =3D 0; + +// +// Width and height of the progress bar. +// +UINTN mBlockWidth =3D 0; +UINTN mBlockHeight =3D 0; + +// +// GOP bitmap of the progress bar. Initialized on every new progress of 10= 0% +// +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 =3D { + { + 0xFF, // Blue + 0xFF, // Green + 0x00, // Red + 0x00 // Reserved + } +}; + +// +// Background color of progress bar. Grey. +// +const EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION mProgressBarBackgroundColor =3D= { + { + 0x80, // Blue + 0x80, // Green + 0x80, // Red + 0x00 // Reserved + } +}; + +// +// Default color of progress completion. White. +// +const EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION mProgressBarDefaultColor =3D { + { + 0xFF, // Blue + 0xFF, // Green + 0xFF, // Red + 0x00 // Reserved + } +}; + +// +// Set to TRUE if a valid Graphics Output Protocol is found and the progre= ss +// bar fits under the boot logo using the current graphics mode. +// +BOOLEAN mGraphicsGood =3D 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 coordin= ate + UINTN OffsetY; // Logo screen coordin= ate + UINTN Width; // Width of logo in pi= xels + UINTN Height; // Height of logo in p= ixels + EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Logo; + EDKII_BOOT_LOGO2_PROTOCOL *BootLogo; + EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *Pixel; + + Logo =3D NULL; + BootLogo =3D NULL; + + // + // Return if a Graphics Output Protocol ha snot been found. + // + if (mGop =3D=3D 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 =3D gBS->LocateProtocol ( + &gEdkiiBootLogo2ProtocolGuid, + NULL, + (VOID **)&BootLogo + ); + if ((BootLogo =3D=3D NULL) || (EFI_ERROR (Status))) { + DEBUG ((DEBUG_ERROR, "Failed to locate gEdkiiBootLogo2ProtocolGuid. N= o Progress bar support. \n", Status)); + return; + } + + // + // Get logo location and size + // + Status =3D BootLogo->GetBootLogo ( + BootLogo, + &Logo, + &OffsetX, + &OffsetY, + &Width, + &Height + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to Get Boot Logo Status =3D %r. No Progr= ess bar support. \n", Status)); + return; + } + + // + // Within logo buffer find where the actual logo starts/ends + // + LogoEndX =3D 0; + LogoEndY =3D 0; + + // + // Find left side of logo in logo coordinates + // + for (LogoX =3D 0, LogoStartX =3D Width; LogoX < LogoStartX; LogoX++) { + Pixel =3D (EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *)(Logo + LogoX); + for (LogoY =3D 0; LogoY < (INTN)Height; LogoY++) { + if ((Pixel->Raw & mLogoDetectionColorMask.Raw) !=3D 0x0) { + LogoStartX =3D LogoX; + // + // For loop searches from right side back to this column. + // + LogoEndX =3D LogoX; + DEBUG ((DEBUG_INFO, "StartX found at (%d, %d) Color is: 0x%X \n", = LogoX, LogoY, Pixel->Raw)); + break; + } + Pixel =3D Pixel + Width; + } + } + + // + // Find right side of logo + // + for (LogoX =3D Width - 1; LogoX >=3D LogoEndX; LogoX--) { + Pixel =3D (EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *)(Logo + LogoX); + for (LogoY =3D 0; LogoY < (INTN)Height; LogoY++) { + if ((Pixel->Raw & mLogoDetectionColorMask.Raw) !=3D 0x0) { + LogoEndX =3D LogoX; + DEBUG ((DEBUG_INFO, "EndX found at (%d, %d) Color is: 0x%X \n", Lo= goX, LogoY, Pixel->Raw)); + break; + } + Pixel =3D Pixel + Width; + } + } + + // + // Compute mBlockWidth + // + mBlockWidth =3D ((LogoEndX - LogoStartX) + 99) / 100; + + // + // Adjust mStartX based on block width so it is centered under logo + // + mStartX =3D LogoStartX + OffsetX - (((mBlockWidth * 100) - (LogoEndX - L= ogoStartX)) / 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 =3D 0, LogoStartY =3D Height; LogoY < LogoStartY; LogoY++) { + Pixel =3D (EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *)(Logo + (Width * Logo= Y)); + for (LogoX =3D 0; LogoX < (INTN)Width; LogoX++) { + //not black or red + if ((Pixel->Raw & mLogoDetectionColorMask.Raw) !=3D 0x0) { + LogoStartY =3D LogoY; + LogoEndY =3D LogoY; //for next loop will search from bottom side b= ack 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 =3D Height - 1; LogoY >=3D LogoEndY; LogoY--) { + Pixel =3D (EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION *)(Logo + (Width * Logo= Y)); + for (LogoX =3D 0; LogoX < (INTN)Width; LogoX++) { + if ((Pixel->Raw & mLogoDetectionColorMask.Raw) !=3D 0x0) { + LogoEndY =3D LogoY; + DEBUG ((DEBUG_INFO, "EndY found at (%d, %d) Color is: 0x%X \n", Lo= goX, LogoY, Pixel->Raw)); + break; + } + Pixel++; + } + } + + // + // Compute bottom padding (distance between logo bottom and progress bar) + // + mStartY =3D (((LogoEndY - LogoStartY) * LOGO_BOTTOM_PADDING) / 100) + Lo= goEndY + OffsetY; + + // + // Compute progress bar height + // + mBlockHeight =3D (((LogoEndY - LogoStartY) * PROGRESS_BLOCK_HEIGHT) / 10= 0); + + DEBUG ((DEBUG_INFO, "mBlockHeight set to 0x%X\n", mBlockHeight)); + + // + // Create progress bar background (one time init). + // + mProgressBarBackground =3D AllocatePool (mBlockWidth * 100 * mBlockHeigh= t * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)); + if (mProgressBarBackground =3D=3D 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_PI= XEL)), + mProgressBarBackgroundColor.Raw + ); + + // + // Allocate mBlockBitmap + // + mBlockBitmap =3D AllocatePool (mBlockWidth * mBlockHeight * sizeof (EFI_= GRAPHICS_OUTPUT_BLT_PIXEL)); + if (mBlockBitmap =3D=3D 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 - mBlockHeig= ht: 0x%X mBlockWidth: 0x%X.\n", mBlockHeight, mBlockWidth)); + FreePool (mProgressBarBackground); + FreePool (mBlockBitmap); + return; + } + + mGraphicsGood =3D 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 co= lor + 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 n= ot + 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 =3D=3D mPreviousProgress) { + return EFI_SUCCESS; + } + + // + // Find Graphics Output Protocol if not already set. 1 time. + // + if (mGop =3D=3D NULL) { + Status =3D gBS->HandleProtocol ( + gST->ConsoleOutHandle, + &gEfiGraphicsOutputProtocolGuid, + (VOID**)&mGop + ); + if (EFI_ERROR (Status)) { + Status =3D gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NUL= L, (VOID **)&mGop); + if (EFI_ERROR (Status)) { + mGop =3D NULL; + DEBUG ((DEBUG_ERROR, "Show Progress Function could not locate GOP.= Status =3D %r\n", Status)); + return EFI_NOT_READY; + } + } + + // + // Run once + // + FindDim (); + } + + // + // Make sure a valid start, end, and size info are available (find the L= ogo) + // + 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 =3D=3D 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 =3D=3D NULL) ? mProgressBarDefaultColor.Raw : Color->Raw + )); + + // + // Update block bitmap with correct color + // + SetMem32 ( + mBlockBitmap, + (mBlockWidth * mBlockHeight * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)= ), + (Color =3D=3D NULL) ? mProgressBarDefaultColor.Raw : Color->Raw + ); + + // + // Clear previous + // + mPreviousProgress =3D 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 =3D ((mPreviousProgress * mBlockWidth) + mStartX); + for (Index =3D 0; Index < (Completion - mPreviousProgress); Index++) { + // + // Show progress by coloring new area + // + mGop->Blt ( + mGop, + mBlockBitmap, + EfiBltBufferToVideo, + 0, + 0, + PreX, + mStartY, + mBlockWidth, + mBlockHeight, + 0 + ); + PreX +=3D mBlockWidth; + } + + mPreviousProgress =3D Completion; + + return EFI_SUCCESS; +} diff --git a/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayU= pdateProgressLibGraphics.inf b/MdeModulePkg/Library/DisplayUpdateProgressLi= bGraphics/DisplayUpdateProgressLibGraphics.inf new file mode 100644 index 0000000000..ada6076770 --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdatePr= ogressLibGraphics.inf @@ -0,0 +1,60 @@ +## @file +# Provides services to display completion progress of a firmware update o= n a +# graphical console that supports the Graphics Output Protocol. +# +# Copyright (c) 2016, Microsoft Corporation, All rights reserved.
+# Copyright (c) 2018, Intel Corporation. All rights reserved.
+# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are = met: +# 1. Redistributions of source code must retain the above copyright notic= e, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright no= tice, +# this list of conditions and the following disclaimer in the documentati= on +# 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 I= MPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE = DISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR AN= Y DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INC= LUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS O= F USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY T= HEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NE= GLIGENCE +# 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 =3D 0x00010005 + BASE_NAME =3D DisplayUpdateProgressLibGraphics + MODULE_UNI_FILE =3D DisplayUpdateProgressLibGraphics.uni + FILE_GUID =3D 319E9E37-B2D6-4699-90F3-B8B72B6D4CBD + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D DisplayUpdateProgressLib|DXE_DRIVER UEFI_DRIVER UEFI= _APPLICATION + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D 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/DisplayU= pdateProgressLibGraphics.uni b/MdeModulePkg/Library/DisplayUpdateProgressLi= bGraphics/DisplayUpdateProgressLibGraphics.uni new file mode 100644 index 0000000000..d7da641338 --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdatePr= ogressLibGraphics.uni @@ -0,0 +1,18 @@ +// /** @file +// Provides services to display completion progress of a firmware update = on a +// graphical console that supports the Graphics Output Protocol. +// +// Copyright (c) 2018, Intel Corporation. All rights reserved.
+// +// This program and the accompanying materials +// are licensed and made available under the terms and conditions of the B= SD License +// which accompanies this distribution. The full text of the license may b= e 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 IM= PLIED. +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "Provides services to dis= play completion progress of a firmware update on a graphical console that s= upports the Graphics Output Protocol." + +#string STR_MODULE_DESCRIPTION #language en-US "Provides services to dis= play completion progress of a firmware update on a graphical console that s= upports the Graphics Output Protocol." diff --git a/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdat= eProgressLibText.c b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Disp= layUpdateProgressLibText.c new file mode 100644 index 0000000000..7aca8b89d0 --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgre= ssLibText.c @@ -0,0 +1,174 @@ +/** @file + Provides services to display completion progress of a firmware update on= a + text console. + + Copyright (c) 2016, Microsoft Corporation. All rights reserved.
+ Copyright (c) 2018, Intel Corporation. All rights reserved.
+ + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are m= et: + 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 not= ice, + 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 IM= PLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE D= ISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY= DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCL= UDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF= USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY TH= EORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEG= LIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +**/ + +#include +#include +#include +#include + +// +// Control Style. Set to 100 so it is reset on first call. +// +UINTN mPreviousProgress =3D 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 co= lor + 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 n= ot + 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 =3D=3D mPreviousProgress) { + return EFI_SUCCESS; + } + + // + // Do special init on first call of each progress session + // + if (mPreviousProgress =3D=3D 100) { + Print (L"\n"); + + // + // Convert pixel color to text foreground color + // + if (Color =3D=3D NULL) { + mProgressBarForegroundColor =3D EFI_WHITE; + } else { + mProgressBarForegroundColor =3D EFI_BLACK; + if (Color->Pixel.Blue >=3D 0x40) { + mProgressBarForegroundColor |=3D EFI_BLUE; + } + if (Color->Pixel.Green >=3D 0x40) { + mProgressBarForegroundColor |=3D EFI_GREEN; + } + if (Color->Pixel.Red >=3D 0x40) { + mProgressBarForegroundColor |=3D EFI_RED; + } + if (Color->Pixel.Blue >=3D 0xC0 || Color->Pixel.Green >=3D 0xC0 || C= olor->Pixel.Red >=3D 0xC0) { + mProgressBarForegroundColor |=3D EFI_BRIGHT; + } + if (mProgressBarForegroundColor =3D=3D EFI_BLACK) { + mProgressBarForegroundColor =3D EFI_WHITE; + } + } + + // + // Clear previous + // + mPreviousProgress =3D 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 =3D (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 =3D 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 =3D Completion; + + return EFI_SUCCESS; +} diff --git a/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdat= eProgressLibText.inf b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Di= splayUpdateProgressLibText.inf new file mode 100644 index 0000000000..c3134439e4 --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgre= ssLibText.inf @@ -0,0 +1,53 @@ +## @file +# Provides services to display completion progress of a firmware update o= n a +# text console. +# +# Copyright (c) 2016, Microsoft Corporation, All rights reserved.
+# Copyright (c) 2018, Intel Corporation. All rights reserved.
+# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are = met: +# 1. Redistributions of source code must retain the above copyright notic= e, +# this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright no= tice, +# this list of conditions and the following disclaimer in the documentati= on +# 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 I= MPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE = DISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR AN= Y DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INC= LUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS O= F USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY T= HEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NE= GLIGENCE +# 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 =3D 0x00010005 + BASE_NAME =3D DisplayUpdateProgressLibText + MODULE_UNI_FILE =3D DisplayUpdateProgressLibText.uni + FILE_GUID =3D CDEF83AE-1900-4B41-BF47-AAE9BD729CA5 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D DisplayUpdateProgressLib|DXE_DRIVER UEFI_DRIVER UEFI= _APPLICATION + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 IPF EBC +# + +[Sources] + DisplayUpdateProgressLibText.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + DebugLib + UefiBootServicesTableLib + UefiLib diff --git a/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdat= eProgressLibText.uni b/MdeModulePkg/Library/DisplayUpdateProgressLibText/Di= splayUpdateProgressLibText.uni new file mode 100644 index 0000000000..3c783722bc --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgre= ssLibText.uni @@ -0,0 +1,18 @@ +// /** @file +// Provides services to display completion progress of a firmware update = on a +// text console. +// +// Copyright (c) 2018, Intel Corporation. All rights reserved.
+// +// This program and the accompanying materials +// are licensed and made available under the terms and conditions of the B= SD License +// which accompanies this distribution. The full text of the license may b= e 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 IM= PLIED. +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "Provides services to dis= play completion progress of a firmware update on a text console." + +#string STR_MODULE_DESCRIPTION #language en-US "Provides services to dis= play 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.i= nf SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf + DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibGr= aphics/DisplayUpdateProgressLibGraphics.inf =20 [LibraryClasses.EBC.PEIM] IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf @@ -327,6 +328,8 @@ [Components] MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib.inf MdeModulePkg/Library/NonDiscoverableDeviceRegistrationLib/NonDiscoverabl= eDeviceRegistrationLib.inf MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf + MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgr= essLibGraphics.inf + MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressL= ibText.inf =20 MdeModulePkg/Universal/BdsDxe/BdsDxe.inf MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf --=20 2.14.2.windows.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel From nobody Sun May 5 18:42:53 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail(p=none dis=none) header.from=intel.com Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1527228969005381.11931900799186; Thu, 24 May 2018 23:16:09 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 19F7B21CAD9BA; Thu, 24 May 2018 23:16:00 -0700 (PDT) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 8733221BADAB2 for ; Thu, 24 May 2018 23:15:58 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 May 2018 23:15:57 -0700 Received: from mjain-mobl.amr.corp.intel.com (HELO mdkinney-MOBL2.amr.corp.intel.com) ([10.252.141.109]) by fmsmga006.fm.intel.com with ESMTP; 24 May 2018 23:15:57 -0700 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=michael.d.kinney@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,439,1520924400"; d="scan'208";a="231694773" From: Michael D Kinney To: edk2-devel@lists.01.org Date: Thu, 24 May 2018 23:15:52 -0700 Message-Id: <20180525061552.19840-4-michael.d.kinney@intel.com> X-Mailer: git-send-email 2.14.2.windows.3 In-Reply-To: <20180525061552.19840-1-michael.d.kinney@intel.com> References: <20180525061552.19840-1-michael.d.kinney@intel.com> Subject: [edk2] [Patch v3 3/3] SignedCapsulePkg/PlatformFlashAccessLib: Add progress API X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jiewen Yao MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" https://bugzilla.tianocore.org/show_bug.cgi?id=3D801 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 Signed-off-by: Michael D Kinney Contributed-under: TianoCore Contribution Agreement 1.1 Reviewed-by: Jiewen.yao@intel.com --- .../Include/Library/PlatformFlashAccessLib.h | 49 ++++++++++++++- .../PlatformFlashAccessLibNull.c | 70 ++++++++++++++++++= +--- 2 files changed, 110 insertions(+), 9 deletions(-) diff --git a/SignedCapsulePkg/Include/Library/PlatformFlashAccessLib.h b/Si= gnedCapsulePkg/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. =20 - Copyright (c) 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at @@ -16,6 +16,8 @@ #ifndef __PLATFORM_FLASH_ACCESS_LIB_H__ #define __PLATFORM_FLASH_ACCESS_LIB_H__ =20 +#include + typedef enum { FlashAddressTypeRelativeAddress, FlashAddressTypeAbsoluteAddress, @@ -31,7 +33,7 @@ typedef enum { } PLATFORM_FIRMWARE_TYPE; =20 /** - Perform flash write opreation. + Perform flash write operation. =20 @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 ); =20 +/** + Perform flash write operation with progress indicator. The start and end + completion percentage values are passed into this function. If the requ= ested + flash write operation is broken up, then completion percentage between t= he + start and end values may be passed to the provided Progress function. T= he + 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 reque= sted + 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 param= eter + 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, OPTIO= NAL + IN UINTN StartPercentage, + IN UINTN EndPercentage + ); + #endif diff --git a/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFl= ashAccessLibNull.c b/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/Pl= atformFlashAccessLibNull.c index b34ebbba1e..854f108cf4 100644 --- a/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAcce= ssLibNull.c +++ b/SignedCapsulePkg/Library/PlatformFlashAccessLibNull/PlatformFlashAcce= ssLibNull.c @@ -1,7 +1,7 @@ /** @file Platform flash device access library NULL instance. =20 - Copyright (c) 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at @@ -20,7 +20,57 @@ UINT64 mInternalFdAddress; =20 /** - 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 requ= ested + flash write operation is broken up, then completion percentage between t= he + start and end values may be passed to the provided Progress function. T= he + 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 reque= sted + 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 param= eter + 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, OPTIO= NAL + IN UINTN StartPercentage, + IN UINTN EndPercentage + ) +{ + if (FlashAddressType =3D=3D FlashAddressTypeRelativeAddress) { + FlashAddress =3D FlashAddress + mInternalFdAddress; + } + CopyMem((VOID *)(UINTN)(FlashAddress), Buffer, Length); + return EFI_SUCCESS; +} + +/** + Perform flash write operation. =20 @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 =3D=3D FlashAddressTypeRelativeAddress) { - FlashAddress =3D FlashAddress + mInternalFdAddress; - } - CopyMem((VOID *)(UINTN)(FlashAddress), Buffer, Length); - return EFI_SUCCESS; + return PerformFlashWriteWithProgress ( + FirmwareType, + FlashAddress, + FlashAddressType, + Buffer, + Length, + NULL, + 0, + 0 + ); } + --=20 2.14.2.windows.3 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel