/** @file | |
Flash Device Library based on SPI Flash library. | |
Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved. <BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <PiDxe.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/SpiFlashLib.h> | |
/** | |
Initialize spi flash device. | |
@retval EFI_SUCCESS The tested spi flash device is supported. | |
@retval EFI_UNSUPPORTED The tested spi flash device is not supported. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
LibFvbFlashDeviceInit ( | |
VOID | |
) | |
{ | |
return SpiConstructor (); | |
} | |
/** | |
Read NumBytes bytes of data from the address specified by | |
PAddress into Buffer. | |
@param[in] PAddress The starting physical address of the read. | |
@param[in,out] NumBytes On input, the number of bytes to read. On output, the number | |
of bytes actually read. | |
@param[out] Buffer The destination data buffer for the read. | |
@retval EFI_SUCCESS. Opertion is successful. | |
@retval EFI_DEVICE_ERROR If there is any device errors. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
LibFvbFlashDeviceRead ( | |
IN UINTN PAddress, | |
IN OUT UINTN *NumBytes, | |
OUT UINT8 *Buffer | |
) | |
{ | |
EFI_STATUS Status; | |
UINT32 ByteCount; | |
UINT32 RgnSize; | |
UINT32 AddrOffset; | |
Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize); | |
if (EFI_ERROR (Status)) { | |
return Status; | |
} | |
// BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize)) | |
// which equal (PAddress + RgnSize) here. | |
AddrOffset = (UINT32)((UINT32)PAddress + RgnSize); | |
ByteCount = (UINT32)*NumBytes; | |
return SpiFlashRead (FlashRegionBios, AddrOffset, ByteCount, Buffer); | |
} | |
/** | |
Write NumBytes bytes of data from Buffer to the address specified by | |
PAddresss. | |
@param[in] PAddress The starting physical address of the write. | |
@param[in,out] NumBytes On input, the number of bytes to write. On output, | |
the actual number of bytes written. | |
@param[in] Buffer The source data buffer for the write. | |
@retval EFI_SUCCESS. Opertion is successful. | |
@retval EFI_DEVICE_ERROR If there is any device errors. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
LibFvbFlashDeviceWrite ( | |
IN UINTN PAddress, | |
IN OUT UINTN *NumBytes, | |
IN UINT8 *Buffer | |
) | |
{ | |
EFI_STATUS Status; | |
UINT32 ByteCount; | |
UINT32 RgnSize; | |
UINT32 AddrOffset; | |
Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize); | |
if (EFI_ERROR (Status)) { | |
return Status; | |
} | |
// BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize)) | |
// which equal (PAddress + RgnSize) here. | |
AddrOffset = (UINT32)((UINT32)PAddress + RgnSize); | |
ByteCount = (UINT32)*NumBytes; | |
return SpiFlashWrite (FlashRegionBios, AddrOffset, ByteCount, Buffer); | |
} | |
/** | |
Erase the block starting at PAddress. | |
@param[in] PAddress The starting physical address of the block to be erased. | |
This library assume that caller garantee that the PAddress | |
is at the starting address of this block. | |
@param[in] LbaLength The length of the logical block to be erased. | |
@retval EFI_SUCCESS. Opertion is successful. | |
@retval EFI_DEVICE_ERROR If there is any device errors. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
LibFvbFlashDeviceBlockErase ( | |
IN UINTN PAddress, | |
IN UINTN LbaLength | |
) | |
{ | |
EFI_STATUS Status; | |
UINT32 RgnSize; | |
UINT32 AddrOffset; | |
Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize); | |
if (EFI_ERROR (Status)) { | |
return Status; | |
} | |
// BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize)) | |
// which equal (PAddress + RgnSize) here. | |
AddrOffset = (UINT32)((UINT32)PAddress + RgnSize); | |
return SpiFlashErase (FlashRegionBios, AddrOffset, (UINT32)LbaLength); | |
} | |
/** | |
Lock or unlock the block starting at PAddress. | |
@param[in] PAddress The starting physical address of region to be (un)locked. | |
@param[in] LbaLength The length of the logical block to be erased. | |
@param[in] Lock TRUE to lock. FALSE to unlock. | |
@retval EFI_SUCCESS. Opertion is successful. | |
@retval EFI_DEVICE_ERROR If there is any device errors. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
LibFvbFlashDeviceBlockLock ( | |
IN UINTN PAddress, | |
IN UINTN LbaLength, | |
IN BOOLEAN Lock | |
) | |
{ | |
return EFI_SUCCESS; | |
} |