/** @file\r
Platform Flash Access library.\r
\r
- Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
#include <Uefi.h>\r
}\r
\r
/**\r
- Perform flash write opreation.\r
+ Perform flash write operation with progress indicator. The start and end\r
+ completion percentage values are passed into this function. If the requested\r
+ flash write operation is broken up, then completion percentage between the\r
+ start and end values may be passed to the provided Progress function. The\r
+ caller of this function is required to call the Progress function for the\r
+ start and end completion percentage values. This allows the Progress,\r
+ StartPercentage, and EndPercentage parameters to be ignored if the requested\r
+ flash write operation can not be broken up\r
\r
@param[in] FirmwareType The type of firmware.\r
@param[in] FlashAddress The address of flash device to be accessed.\r
@param[in] FlashAddressType The type of flash device address.\r
@param[in] Buffer The pointer to the data buffer.\r
@param[in] Length The length of data buffer in bytes.\r
+ @param[in] Progress A function used report the progress of the\r
+ firmware update. This is an optional parameter\r
+ that may be NULL.\r
+ @param[in] StartPercentage The start completion percentage value that may\r
+ be used to report progress during the flash\r
+ write operation.\r
+ @param[in] EndPercentage The end completion percentage value that may\r
+ be used to report progress during the flash\r
+ write operation.\r
\r
@retval EFI_SUCCESS The operation returns successfully.\r
@retval EFI_WRITE_PROTECTED The flash device is read only.\r
**/\r
EFI_STATUS\r
EFIAPI\r
-PerformFlashWrite (\r
- IN PLATFORM_FIRMWARE_TYPE FirmwareType,\r
- IN EFI_PHYSICAL_ADDRESS FlashAddress,\r
- IN FLASH_ADDRESS_TYPE FlashAddressType,\r
- IN VOID *Buffer,\r
- IN UINTN Length\r
+PerformFlashWriteWithProgress (\r
+ IN PLATFORM_FIRMWARE_TYPE FirmwareType,\r
+ IN EFI_PHYSICAL_ADDRESS FlashAddress,\r
+ IN FLASH_ADDRESS_TYPE FlashAddressType,\r
+ IN VOID *Buffer,\r
+ IN UINTN Length,\r
+ IN EFI_FIRMWARE_MANAGEMENT_UPDATE_IMAGE_PROGRESS Progress, OPTIONAL\r
+ IN UINTN StartPercentage,\r
+ IN UINTN EndPercentage\r
)\r
{\r
EFI_STATUS Status = EFI_SUCCESS;\r
// Raise TPL to TPL_NOTIFY to block any event handler,\r
// while still allowing RaiseTPL(TPL_NOTIFY) within\r
// output driver during Print()\r
- //\r
+ //\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
for (Index = 0; Index < CountOfBlocks; Index++) {\r
+ if (Progress != NULL) {\r
+ Progress (StartPercentage + ((Index * (EndPercentage - StartPercentage)) / CountOfBlocks));\r
+ }\r
//\r
// Handle block based on address and contents.\r
//\r
if (!EFI_ERROR (InternalCompareBlock (Address, Buf))) {\r
DEBUG((DEBUG_INFO, "Skipping block at 0x%lx (already programmed)\n", Address));\r
} else {\r
- //\r
- // Display a dot for each block being updated.\r
- //\r
- Print (L".");\r
-\r
//\r
// Make updating process uninterruptable,\r
// so that the flash memory area is not accessed by other entities\r
// which may interfere with the updating process\r
//\r
Status = InternalEraseBlock (Address);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR(Status)) {\r
gBS->RestoreTPL (OldTpl);\r
FlashError = TRUE;\r
goto Done;\r
- }\r
+ }\r
Status = InternalWriteBlock (\r
Address,\r
Buf,\r
(UINT32)(Length > BLOCK_SIZE ? BLOCK_SIZE : Length)\r
);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR(Status)) {\r
gBS->RestoreTPL (OldTpl);\r
FlashError = TRUE;\r
goto Done;\r
}\r
- }\r
+ }\r
\r
//\r
// Move to next block to update.\r
}\r
gBS->RestoreTPL (OldTpl);\r
\r
- Done:\r
+Done:\r
if ((BiosCntl & B_PCH_LPC_BIOS_CNTL_SMM_BWP) == B_PCH_LPC_BIOS_CNTL_SMM_BWP) {\r
//\r
// Restore original control setting\r
//\r
MmioWrite8 (LpcBaseAddress + R_PCH_LPC_BIOS_CNTL, BiosCntl);\r
- }\r
+ }\r
+\r
+ if (Progress != NULL) {\r
+ Progress (EndPercentage);\r
+ }\r
\r
- //\r
- // Print flash update failure message if error detected.\r
- //\r
if (FlashError) {\r
- Print (L"No %r\n", Status);\r
+ return EFI_WRITE_PROTECTED;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
/**\r
- Perform microcode write opreation.\r
+ Perform flash write operation.\r
+\r
+ @param[in] FirmwareType The type of firmware.\r
+ @param[in] FlashAddress The address of flash device to be accessed.\r
+ @param[in] FlashAddressType The type of flash device address.\r
+ @param[in] Buffer The pointer to the data buffer.\r
+ @param[in] Length The length of data buffer in bytes.\r
+\r
+ @retval EFI_SUCCESS The operation returns successfully.\r
+ @retval EFI_WRITE_PROTECTED The flash device is read only.\r
+ @retval EFI_UNSUPPORTED The flash device access is unsupported.\r
+ @retval EFI_INVALID_PARAMETER The input parameter is not valid.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PerformFlashWrite (\r
+ IN PLATFORM_FIRMWARE_TYPE FirmwareType,\r
+ IN EFI_PHYSICAL_ADDRESS FlashAddress,\r
+ IN FLASH_ADDRESS_TYPE FlashAddressType,\r
+ IN VOID *Buffer,\r
+ IN UINTN Length\r
+ )\r
+{\r
+ return PerformFlashWriteWithProgress (\r
+ FirmwareType,\r
+ FlashAddress,\r
+ FlashAddressType,\r
+ Buffer,\r
+ Length,\r
+ NULL,\r
+ 0,\r
+ 0\r
+ );\r
+}\r
+\r
+/**\r
+ Perform microcode write operation.\r
\r
@param[in] FlashAddress The address of flash device to be accessed.\r
@param[in] Buffer The pointer to the data buffer.\r