/** @file Copyright (c) 2019, Hewlett Packard Enterprise Development LP. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include "RamFlash.h" VOID *mFlashBase; STATIC UINTN mFdBlockSize = 0; STATIC UINTN mFdBlockCount = 0; STATIC UINT8* RamFlashPtr ( IN EFI_LBA Lba, IN UINTN Offset ) { return mFlashBase + ((UINTN)Lba * mFdBlockSize) + Offset; } /** Read from Ram Flash @param[in] Lba The starting logical block index to read from. @param[in] Offset Offset into the block at which to begin reading. @param[in] NumBytes On input, indicates the requested read size. On output, indicates the actual number of bytes read @param[in] Buffer Pointer to the buffer to read into. **/ EFI_STATUS RamFlashRead ( IN EFI_LBA Lba, IN UINTN Offset, IN UINTN *NumBytes, IN UINT8 *Buffer ) { UINT8 *Ptr; // // Only write to the first 64k. We don't bother saving the FTW Spare // block into the flash memory. // if (Lba >= mFdBlockCount) { return EFI_INVALID_PARAMETER; } // // Get flash address // Ptr = (UINT8*) RamFlashPtr (Lba, Offset); CopyMem (Buffer, Ptr, *NumBytes); return EFI_SUCCESS; } /** Write to Ram Flash @param[in] Lba The starting logical block index to write to. @param[in] Offset Offset into the block at which to begin writing. @param[in] NumBytes On input, indicates the requested write size. On output, indicates the actual number of bytes written @param[in] Buffer Pointer to the data to write. **/ EFI_STATUS RamFlashWrite ( IN EFI_LBA Lba, IN UINTN Offset, IN UINTN *NumBytes, IN UINT8 *Buffer ) { UINT8 *Ptr; UINTN i; // // Only write to the first 64k. We don't bother saving the FTW Spare // block into the flash memory. // if (Lba >= mFdBlockCount) { return EFI_INVALID_PARAMETER; } // // Program flash // Ptr = RamFlashPtr (Lba, Offset); for (i = 0; i < *NumBytes; i++) { MmioWrite8((UINTN)Ptr, Buffer[i]); Ptr ++; } return EFI_SUCCESS; } /** Erase a Ram Flash block @param Lba The logical block index to erase. **/ EFI_STATUS RamFlashEraseBlock ( IN EFI_LBA Lba ) { return EFI_SUCCESS; } /** Initializes Ram flash memory support @retval EFI_WRITE_PROTECTED The Ram flash device is not present. @retval EFI_SUCCESS The Ram flash device is supported. **/ EFI_STATUS RamFlashInitialize ( VOID ) { mFlashBase = (UINT8*)(UINTN) PcdGet32 (PcdVariableFdBaseAddress); mFdBlockSize = PcdGet32 (PcdVariableFdBlockSize); ASSERT(PcdGet32 (PcdVariableFdSize) % mFdBlockSize == 0); mFdBlockCount = PcdGet32 (PcdVariableFdSize) / mFdBlockSize; return EFI_SUCCESS; }