mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-30 07:13:20 +00:00 
			
		
		
		
	 9d510e61fc
			
		
	
	
		9d510e61fc
		
	
	
	
	
		
			
			https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
		
			
				
	
	
		
			158 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| 
 | |
| #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;
 | |
| }
 |