From nobody Fri Nov 1 04:45:04 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 Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1522873570560905.8012912436155; Wed, 4 Apr 2018 13:26:10 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id ECC0F21FB7D53; Wed, 4 Apr 2018 13:26:04 -0700 (PDT) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 9CB942095745F for ; Wed, 4 Apr 2018 13:26:03 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Apr 2018 13:26:01 -0700 Received: from mdkinney-mobl2.amr.corp.intel.com ([10.241.98.47]) by fmsmga006.fm.intel.com with ESMTP; 04 Apr 2018 13:26:01 -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=192.55.52.93; helo=mga11.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.48,408,1517904000"; d="scan'208";a="217591851" From: Michael D Kinney To: edk2-devel@lists.01.org Date: Wed, 4 Apr 2018 13:25:47 -0700 Message-Id: <20180404202554.9568-3-michael.d.kinney@intel.com> X-Mailer: git-send-email 2.14.2.windows.3 In-Reply-To: <20180404202554.9568-1-michael.d.kinney@intel.com> References: <20180404202554.9568-1-michael.d.kinney@intel.com> Subject: [edk2] [Patch 2/9] 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 --- .../DisplayUpdateProgressGraphicsLib.c | 475 +++++++++++++++++= ++++ .../DisplayUpdateProgressGraphicsLib.inf | 60 +++ .../DisplayUpdateProgressGraphicsLib.uni | 18 + .../DisplayUpdateProgressTextLib.c | 142 ++++++ .../DisplayUpdateProgressTextLib.inf | 53 +++ .../DisplayUpdateProgressTextLib.uni | 18 + MdeModulePkg/MdeModulePkg.dsc | 3 + 7 files changed, 769 insertions(+) create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressGraphicsLib/D= isplayUpdateProgressGraphicsLib.c create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressGraphicsLib/D= isplayUpdateProgressGraphicsLib.inf create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressGraphicsLib/D= isplayUpdateProgressGraphicsLib.uni create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressTextLib/Displ= ayUpdateProgressTextLib.c create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressTextLib/Displ= ayUpdateProgressTextLib.inf create mode 100644 MdeModulePkg/Library/DisplayUpdateProgressTextLib/Displ= ayUpdateProgressTextLib.uni diff --git a/MdeModulePkg/Library/DisplayUpdateProgressGraphicsLib/DisplayU= pdateProgressGraphicsLib.c b/MdeModulePkg/Library/DisplayUpdateProgressGrap= hicsLib/DisplayUpdateProgressGraphicsLib.c new file mode 100644 index 0000000000..007522cea0 --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressGraphicsLib/DisplayUpdatePr= ogressGraphicsLib.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/DisplayUpdateProgressGraphicsLib/DisplayU= pdateProgressGraphicsLib.inf b/MdeModulePkg/Library/DisplayUpdateProgressGr= aphicsLib/DisplayUpdateProgressGraphicsLib.inf new file mode 100644 index 0000000000..810f13acd9 --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressGraphicsLib/DisplayUpdatePr= ogressGraphicsLib.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 DisplayUpdateProgressGraphicsLib + MODULE_UNI_FILE =3D DisplayUpdateProgressGraphicsLib.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] + DisplayUpdateProgressGraphicsLib.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/DisplayUpdateProgressGraphicsLib/DisplayU= pdateProgressGraphicsLib.uni b/MdeModulePkg/Library/DisplayUpdateProgressGr= aphicsLib/DisplayUpdateProgressGraphicsLib.uni new file mode 100644 index 0000000000..d7da641338 --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressGraphicsLib/DisplayUpdatePr= ogressGraphicsLib.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/DisplayUpdateProgressTextLib/DisplayUpdat= eProgressTextLib.c b/MdeModulePkg/Library/DisplayUpdateProgressTextLib/Disp= layUpdateProgressTextLib.c new file mode 100644 index 0000000000..aa849aba2e --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressTextLib/DisplayUpdateProgre= ssTextLib.c @@ -0,0 +1,142 @@ +/** @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; + +/** + 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 Foreground; + 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; + } + + // + // 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) { + Foreground =3D EFI_WHITE; + } else { + Foreground =3D EFI_BLACK; + if (Color->Pixel.Blue >=3D 0x40) { + Foreground =3D Foreground | EFI_BLUE; + } + if (Color->Pixel.Green >=3D 0x40) { + Foreground =3D Foreground | EFI_GREEN; + } + if (Color->Pixel.Red >=3D 0x40) { + Foreground =3D Foreground | EFI_RED; + } + if (Color->Pixel.Blue >=3D 0xC0 || Color->Pixel.Green >=3D 0xC0 || C= olor->Pixel.Red >=3D 0xC0) { + Foreground =3D Foreground | EFI_BRIGHT; + } + if (Foreground =3D=3D EFI_BLACK) { + Foreground =3D EFI_WHITE; + } + } + gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (Foreground, EFI= _BLACK)); + + // + // 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; + } + + Print (L"\rUpdate Progress - %3d%% ", Completion); + for (Index =3D 0; Index < 50; Index++) { + if (Index <=3D Completion / 2) { + Print (L"%c", 0x2588); + } else { + Print (L"%c", 0x2591); + } + } + + mPreviousProgress =3D Completion; + + return EFI_SUCCESS; +} diff --git a/MdeModulePkg/Library/DisplayUpdateProgressTextLib/DisplayUpdat= eProgressTextLib.inf b/MdeModulePkg/Library/DisplayUpdateProgressTextLib/Di= splayUpdateProgressTextLib.inf new file mode 100644 index 0000000000..b5782dc44c --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressTextLib/DisplayUpdateProgre= ssTextLib.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 DisplayUpdateProgressTextLib + MODULE_UNI_FILE =3D DisplayUpdateProgressTextLib.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] + DisplayUpdateProgressTextLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + DebugLib + UefiBootServicesTableLib + UefiLib diff --git a/MdeModulePkg/Library/DisplayUpdateProgressTextLib/DisplayUpdat= eProgressTextLib.uni b/MdeModulePkg/Library/DisplayUpdateProgressTextLib/Di= splayUpdateProgressTextLib.uni new file mode 100644 index 0000000000..3c783722bc --- /dev/null +++ b/MdeModulePkg/Library/DisplayUpdateProgressTextLib/DisplayUpdateProgre= ssTextLib.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..d122e78266 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/DisplayUpdateProgressGraph= icsLib/DisplayUpdateProgressGraphicsLib.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/DisplayUpdateProgressGraphicsLib/DisplayUpdateProgr= essGraphicsLib.inf + MdeModulePkg/Library/DisplayUpdateProgressTextLib/DisplayUpdateProgressT= extLib.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