summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h')
-rw-r--r--MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h286
1 files changed, 286 insertions, 0 deletions
diff --git a/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h
new file mode 100644
index 0000000000..fb71e8d56f
--- /dev/null
+++ b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlash.h
@@ -0,0 +1,286 @@
+/** @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 <PiDxe.h>
+#include <Protocol/SpiNorFlash.h>
+#include <Protocol/SpiIo.h>
+#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_