/** @file Definitions of SPI NOR flash operation functions. Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef SPI_NOR_FLASH_H_ #define SPI_NOR_FLASH_H_ #include #include #include #include "SpiNorFlashJedecSfdpInternal.h" /** Fill Write Buffer with Opcode, Address, Dummy Bytes, and Data @param[in] Opcode - Opcode for transaction @param[in] Address - SPI Offset Start Address @param[in] WriteBytes - Number of bytes to write to SPI device @param[in] WriteBuffer - Buffer containing bytes to write to SPI device @retval Size of Data in Buffer **/ UINT32 FillWriteBuffer ( IN SPI_NOR_FLASH_INSTANCE *SpiNorFlashInstance, IN UINT8 Opcode, IN UINT32 DummyBytes, IN UINT8 AddressBytesSupported, IN BOOLEAN UseAddress, IN UINT32 Address, IN UINT32 WriteBytes, IN UINT8 *WriteBuffer ); /** Set Write Enable Latch @param[in] Instance SPI NOR instance with all protocols, etc. @retval EFI_SUCCESS SPI Write Enable succeeded @retval EFI_DEVICE_ERROR SPI Flash part did not respond properly **/ EFI_STATUS SetWel ( IN SPI_NOR_FLASH_INSTANCE *SpiNorFlashInstance ); /** Check for not device write in progress @param[in] Instance SPI NOR instance with all protocols, etc. @param[in] Timeout Timeout in microsecond @param[in] RetryCount The retry count @retval EFI_SUCCESS Device does not have a write in progress @retval EFI_DEVICE_ERROR SPI Flash part did not respond properly **/ EFI_STATUS WaitNotWip ( IN SPI_NOR_FLASH_INSTANCE *SpiNorFlashInstance, IN UINT32 Timeout, IN UINT32 RetryCount ); /** Check for write enable latch set and not device write in progress @param[in] Instance SPI NOR instance with all protocols, etc. @param[in] Timeout Timeout in microsecond @param[in] RetryCount The retry count @retval EFI_SUCCESS Device does not have a write in progress and write enable latch is set @retval EFI_DEVICE_ERROR SPI Flash part did not respond properly **/ EFI_STATUS WaitWelNotWip ( IN SPI_NOR_FLASH_INSTANCE *SpiNorFlashInstance, IN UINT32 Timeout, IN UINT32 RetryCount ); /** Check for not write enable latch set and not device write in progress @param[in] Instance SPI NOR instance with all protocols, etc. @param[in] Timeout Timeout in microsecond @param[in] RetryCount The retry count @retval EFI_SUCCESS Device does not have a write in progress and write enable latch is not set @retval EFI_DEVICE_ERROR SPI Flash part did not respond properly **/ EFI_STATUS WaitNotWelNotWip ( IN SPI_NOR_FLASH_INSTANCE *SpiNorFlashInstance, IN UINT32 Timeout, IN UINT32 RetryCount ); /** Read the 3 byte manufacture and device ID from the SPI flash. This routine must be called at or below TPL_NOTIFY. This routine reads the 3 byte manufacture and device ID from the flash part filling the buffer provided. @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data structure. @param[out] Buffer Pointer to a 3 byte buffer to receive the manufacture and device ID. @retval EFI_SUCCESS The manufacture and device ID was read successfully. @retval EFI_INVALID_PARAMETER Buffer is NULL @retval EFI_DEVICE_ERROR Invalid data received from SPI flash part. **/ EFI_STATUS EFIAPI GetFlashId ( IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, OUT UINT8 *Buffer ); /** Read data from the SPI flash. This routine must be called at or below TPL_NOTIFY. This routine reads data from the SPI part in the buffer provided. @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data structure. @param[in] FlashAddress Address in the flash to start reading @param[in] LengthInBytes Read length in bytes @param[out] Buffer Address of a buffer to receive the data @retval EFI_SUCCESS The data was read successfully. @retval EFI_INVALID_PARAMETER Buffer is NULL, or FlashAddress >= This->FlashSize, or LengthInBytes > This->FlashSize - FlashAddress **/ EFI_STATUS EFIAPI ReadData ( IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, IN UINT32 FlashAddress, IN UINT32 LengthInBytes, OUT UINT8 *Buffer ); /** Read data from the SPI flash at not fast speed This routine must be called at or below TPL_NOTIFY. This routine reads data from the SPI part in the buffer provided. @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data structure. @param[in] FlashAddress Address in the flash to start reading @param[in] LengthInBytes Read length in bytes @param[out] Buffer Address of a buffer to receive the data @retval EFI_SUCCESS The data was read successfully. @retval EFI_INVALID_PARAMETER Buffer is NULL, or FlashAddress >= This->FlashSize, or LengthInBytes > This->FlashSize - FlashAddress **/ EFI_STATUS EFIAPI LfReadData ( IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, IN UINT32 FlashAddress, IN UINT32 LengthInBytes, OUT UINT8 *Buffer ); /** Read the flash status register. This routine must be called at or below TPL_NOTIFY. This routine reads the flash part status register. @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data structure. @param[in] LengthInBytes Number of status bytes to read. @param[out] FlashStatus Pointer to a buffer to receive the flash status. @retval EFI_SUCCESS The status register was read successfully. **/ EFI_STATUS EFIAPI ReadStatus ( IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, IN UINT32 LengthInBytes, OUT UINT8 *FlashStatus ); /** Write the flash status register. This routine must be called at or below TPL_N OTIFY. This routine writes the flash part status register. @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data structure. @param[in] LengthInBytes Number of status bytes to write. @param[in] FlashStatus Pointer to a buffer containing the new status. @retval EFI_SUCCESS The status write was successful. @retval EFI_OUT_OF_RESOURCES Failed to allocate the write buffer. **/ EFI_STATUS EFIAPI WriteStatus ( IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, IN UINT32 LengthInBytes, IN UINT8 *FlashStatus ); /** Write data to the SPI flash. This routine must be called at or below TPL_NOTIFY. This routine breaks up the write operation as necessary to write the data to the SPI part. @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data structure. @param[in] FlashAddress Address in the flash to start writing @param[in] LengthInBytes Write length in bytes @param[in] Buffer Address of a buffer containing the data @retval EFI_SUCCESS The data was written successfully. @retval EFI_INVALID_PARAMETER Buffer is NULL, or FlashAddress >= This->FlashSize, or LengthInBytes > This->FlashSize - FlashAddress @retval EFI_OUT_OF_RESOURCES Insufficient memory to copy buffer. **/ EFI_STATUS EFIAPI WriteData ( IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, IN UINT32 FlashAddress, IN UINT32 LengthInBytes, IN UINT8 *Buffer ); /** Efficiently erases one or more 4KiB regions in the SPI flash. This routine must be called at or below TPL_NOTIFY. This routine uses a combination of 4 KiB and larger blocks to erase the specified area. @param[in] This Pointer to an EFI_SPI_NOR_FLASH_PROTOCOL data structure. @param[in] FlashAddress Address within a 4 KiB block to start erasing @param[in] BlockCount Number of 4 KiB blocks to erase @retval EFI_SUCCESS The erase was completed successfully. @retval EFI_INVALID_PARAMETER FlashAddress >= This->FlashSize, or BlockCount * 4 KiB > This->FlashSize - FlashAddress **/ EFI_STATUS EFIAPI Erase ( IN CONST EFI_SPI_NOR_FLASH_PROTOCOL *This, IN UINT32 FlashAddress, IN UINT32 BlockCount ); #endif // SPI_NOR_FLASH_H_