/** @file NorFlashDeviceLib.h
Copyright (c) 2011 - 2024, Arm Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef NOR_FLASH_DEVICE_LIB_H_
#define NOR_FLASH_DEVICE_LIB_H_
#include
#include
#include
typedef struct _NOR_FLASH_INSTANCE NOR_FLASH_INSTANCE;
#define GET_NOR_BLOCK_ADDRESS(BaseAddr, Lba, LbaSize) ( BaseAddr + (UINTN)((Lba) * LbaSize) )
/**
This structure describes the device path for a NOR flash device instance.
**/
#pragma pack (1)
typedef struct {
VENDOR_DEVICE_PATH Vendor; ///< Vendor specific device path node.
UINT8 Index; ///< Index of a NOR flash device instance.
EFI_DEVICE_PATH_PROTOCOL End; ///< End node of a hardware device path.
} NOR_FLASH_DEVICE_PATH;
#pragma pack ()
/**
NOR Flash instance structure used to identify different flash
or regions within a flash.
**/
struct _NOR_FLASH_INSTANCE {
UINT32 Signature; ///< NOR Flash instance signature.
EFI_HANDLE Handle; ///< NOR Flash instance handle.
UINTN HostControllerBaseAddress; ///< NOR Flash host controller base address.
///< This field is optional if no host
///< controller is present.
UINTN DeviceBaseAddress; ///< NOR Flash device base address.
UINTN RegionBaseAddress; ///< NOR Flash region base address.
UINTN Size; ///< NOR Flash region size.
EFI_LBA StartLba; ///< Region start LBA.
EFI_BLOCK_IO_PROTOCOL BlockIoProtocol; ///< Instance's Block IO protocol handle.
EFI_BLOCK_IO_MEDIA Media; ///< Instance's Media information.
EFI_DISK_IO_PROTOCOL DiskIoProtocol; ///< Instance's Disk IO protocol handle.
EFI_FIRMWARE_VOLUME_BLOCK2_PROTOCOL FvbProtocol; ///< Instance's FVB protocol handle.
VOID *ShadowBuffer; ///< Instance's shadow buffer.
NOR_FLASH_DEVICE_PATH DevicePath; ///< Instance's device path.
};
/**
Write a full block to a given location.
@param[in] Instance NOR flash Instance.
@param[in] Lba The logical block address in NOR flash.
@param[in] DataBuffer The data to write into NOR flash location.
@param[in] BlockSizeInWords The number of bytes to write.
@retval EFI_SUCCESS Write is complete.
@retval EFI_DEVICE_ERROR The device reported an error.
@retval EFI_WRITE_PROTECTED The block is write protected.
@retval EFI_INVALID_PARAMETER Invalid parameters passed.
@retval EFI_BUFFER_TOO_SMALL Insufficient buffer size.
@retval EFI_BAD_BUFFER_SIZE Invalid buffer size.
**/
EFI_STATUS
NorFlashWriteFullBlock (
IN NOR_FLASH_INSTANCE *Instance,
IN EFI_LBA Lba,
IN UINT32 *DataBuffer,
IN UINT32 BlockSizeInWords
);
/**
This function unlocks and erases an entire NOR Flash block.
@param[in] Instance NOR flash Instance.
@param[in] BlockAddress Block address to unlock and erase.
@retval EFI_SUCCESS Erase and unlock successfully completed.
@retval EFI_DEVICE_ERROR The device reported an error.
@retval EFI_WRITE_PROTECTED The block is write protected.
**/
EFI_STATUS
NorFlashUnlockAndEraseSingleBlock (
IN NOR_FLASH_INSTANCE *Instance,
IN UINTN BlockAddress
);
/**
Write a full or portion of a block.
@param[in] Instance NOR flash Instance.
@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, out] NumBytes The total size of the buffer.
@param[in] Buffer The pointer to a caller-allocated buffer that
contains the source for the write.
@retval EFI_SUCCESS Write is complete.
@retval EFI_OUT_OF_RESOURCES Invalid Buffer passed.
@retval EFI_BAD_BUFFER_SIZE Buffer size not enough.
@retval EFI_DEVICE_ERROR The device reported an error.
@retval EFI_ACCESS_DENIED Device is in write disabled mode.
**/
EFI_STATUS
NorFlashWriteSingleBlock (
IN NOR_FLASH_INSTANCE *Instance,
IN EFI_LBA Lba,
IN UINTN Offset,
IN OUT UINTN *NumBytes,
IN UINT8 *Buffer
);
/**
Write multiple blocks.
@param[in] Instance NOR flash Instance.
@param[in] Lba The starting logical block index.
@param[in] BufferSizeInBytes The number of bytes to write.
@param[in] Buffer The pointer to a caller-allocated buffer that
contains the source for the write.
@retval EFI_SUCCESS Write is complete.
@retval EFI_INVALID_PARAMETER Invalid parameters passed.
@retval EFI_BAD_BUFFER_SIZE Invalid buffer size passed.
@retval EFI_DEVICE_ERROR The device reported an error.
@retval EFI_WRITE_PROTECTED The block is write protected.
@retval EFI_BUFFER_TOO_SMALL Insufficient buffer size.
**/
EFI_STATUS
NorFlashWriteBlocks (
IN NOR_FLASH_INSTANCE *Instance,
IN EFI_LBA Lba,
IN UINTN BufferSizeInBytes,
IN VOID *Buffer
);
/**
Read multiple blocks.
@param[in] Instance NOR flash Instance.
@param[in] Lba The starting logical block index to read from.
@param[in] BufferSizeInBytes The number of bytes to read.
@param[out] Buffer The pointer to a caller-allocated buffer that
should be copied with read data.
@retval EFI_SUCCESS Read is complete.
@retval EFI_INVALID_PARAMETER Invalid parameters passed.
@retval EFI_BAD_BUFFER_SIZE Invalid buffer size passed.
**/
EFI_STATUS
NorFlashReadBlocks (
IN NOR_FLASH_INSTANCE *Instance,
IN EFI_LBA Lba,
IN UINTN BufferSizeInBytes,
OUT VOID *Buffer
);
/**
Read from NOR flash.
@param[in] Instance NOR flash Instance.
@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] BufferSizeInBytes The number of bytes to read.
@param[out] Buffer The pointer to a caller-allocated buffer that
should be copied with read data.
@retval EFI_SUCCESS Read is complete.
@retval EFI_INVALID_PARAMETER Invalid parameters passed.
**/
EFI_STATUS
NorFlashRead (
IN NOR_FLASH_INSTANCE *Instance,
IN EFI_LBA Lba,
IN UINTN Offset,
IN UINTN BufferSizeInBytes,
OUT VOID *Buffer
);
/**
NOR Flash Reset.
@param[in] Instance NOR flash instance.
@retval EFI_SUCCESS Return success on successful reset.
@retval EFI_DEVICE_ERROR The device reported an error.
**/
EFI_STATUS
NorFlashReset (
IN NOR_FLASH_INSTANCE *Instance
);
/**
The following function presumes that the block has already been unlocked.
@param[in] Instance NOR flash instance.
@param[in] BlockAddress Block address to erase.
@retval EFI_SUCCESS Request is executed successfully.
@retval EFI_DEVICE_ERROR The device reported an error.
@retval EFI_WRITE_PROTECTED The block is write protected.
**/
EFI_STATUS
NorFlashEraseSingleBlock (
IN NOR_FLASH_INSTANCE *Instance,
IN UINTN BlockAddress
);
/**
Lock all pending read/write to NOR flash device.
@param[in] OriginalTPL Pointer to NOR flash device Original TPL.
**/
VOID
EFIAPI
NorFlashLock (
IN EFI_TPL *OriginalTPL
);
/**
Unlock all pending read/write to NOR flash device.
@param[in] OriginalTPL NOR flash device Original TPL.
**/
VOID
EFIAPI
NorFlashUnlock (
IN EFI_TPL OriginalTPL
);
/**
Read JEDEC ID of NOR flash device.
@param[in] Instance NOR flash Instance of variable store region.
@param[out] JedecId JEDEC ID of NOR flash device.
Maximum length of JedecId can be upto 6 bytes
@retval EFI_SUCCESS The write is completed.
@retval EFI_UNSUPPORTED JEDEC ID retrieval not implemented.
@retval EFI_DEVICE_ERROR Failed to fetch JEDEC ID.
@retval EFI_INVALID_PARAMETER Invalid parameters passed.
**/
EFI_STATUS
NorFlashReadId (
IN NOR_FLASH_INSTANCE *Instance,
OUT UINT8 *JedecId // Maximum length of JedecId can be upto 6 bytes.
);
#endif /* NOR_FLASH_DEVICE_LIB_H_ */