/** @file Flash Device Library based on SPI Flash library. Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include /** 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; }