summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlashJedecSfdpInternal.h
diff options
context:
space:
mode:
authorabnchang <abnchang@amd.com>2023-06-18 05:44:35 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2024-04-20 08:26:40 +0000
commit8b02ecc5f04cac5eb1b7c4a79a800e97bcf205fa (patch)
tree418cdbd11704aa6d98b43fc32b8792adb1c4ea5c /MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlashJedecSfdpInternal.h
parent6dc09fda0484a4404cca2432a64ec8368d2f9424 (diff)
downloadedk2-8b02ecc5f04cac5eb1b7c4a79a800e97bcf205fa.tar.gz
edk2-8b02ecc5f04cac5eb1b7c4a79a800e97bcf205fa.tar.bz2
edk2-8b02ecc5f04cac5eb1b7c4a79a800e97bcf205fa.zip
MdeModulePkg/SpiNorFlashJedecSfdp: SPI NOR Flash JEDEC SFDP
BZ#: 4471 SPI NOR Flash JEDEC Serial Flash Discoverable Driver implementation. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Hao A Wu <hao.a.wu@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Abdul Lateef Attar <abdattar@amd.com> Cc: Brit Chesley <brit.chesley@amd.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
Diffstat (limited to 'MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlashJedecSfdpInternal.h')
-rw-r--r--MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlashJedecSfdpInternal.h299
1 files changed, 299 insertions, 0 deletions
diff --git a/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlashJedecSfdpInternal.h b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlashJedecSfdpInternal.h
new file mode 100644
index 0000000000..309d8dcea7
--- /dev/null
+++ b/MdeModulePkg/Bus/Spi/SpiNorFlashJedecSfdp/SpiNorFlashJedecSfdpInternal.h
@@ -0,0 +1,299 @@
+/** @file
+ SPI NOR flash driver internal definitions.
+
+ Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef SPI_NOR_FLASH_INSTANCE_H_
+#define SPI_NOR_FLASH_INSTANCE_H_
+
+#include <PiDxe.h>
+#include <Protocol/SpiNorFlash.h>
+#include <Protocol/SpiIo.h>
+#include <IndustryStandard/SpiNorFlashJedecSfdp.h>
+
+#define SPI_NOR_FLASH_SIGNATURE SIGNATURE_32 ('s', 'n', 'f', 'm')
+
+#define SPI_NOR_FLASH_FROM_THIS(a) CR (a, SPI_NOR_FLASH_INSTANCE, Protocol, SPI_NOR_FLASH_SIGNATURE)
+
+typedef struct {
+ LIST_ENTRY NextFastReadCap; ///< Link list to next Fast read capability
+ UINT8 FastReadInstruction; ///< Fast read instruction.
+ UINT8 ModeClocks; ///< Fast read clock.
+ UINT8 WaitStates; ///< Fast read wait dummy clocks
+} SFPD_FAST_READ_CAPBILITY_RECORD;
+
+typedef struct {
+ LIST_ENTRY NextEraseType; ///< Link list to next erase type.
+ UINT16 EraseType; ///< Erase type this flash device supports.
+ UINT8 EraseInstruction; ///< Erase instruction
+ UINT32 EraseSizeInByte; ///< The size of byte in 2^EraseSize the erase type command
+ ///< can erase.
+ UINT32 EraseTypicalTime; ///< Time the device typically takes to erase this type
+ ///< size.
+ UINT64 EraseTimeout; ///< Maximum typical erase timeout.
+} SFDP_SUPPORTED_ERASE_TYPE_RECORD;
+
+typedef enum {
+ SearchEraseTypeByType = 1,
+ SearchEraseTypeByCommand,
+ SearchEraseTypeBySize,
+ SearchEraseTypeBySmallestSize,
+ SearchEraseTypeByBiggestSize
+} SFDP_SEARCH_ERASE_TYPE;
+
+typedef struct {
+ LIST_ENTRY NextCommand; ///< Link list to next detection command.
+ UINT32 CommandAddress; ///< Address to issue the command.
+ UINT8 CommandInstruction; ///< Detection command instruction.
+ UINT8 LatencyInClock; ///< Command latency in clocks.
+ SPDF_CONFIGURATION_COMMAND_ADDR_LENGTH CommandAddressLength; ///< Adddress length of detection command.
+ UINT8 ConfigurationBitMask; ///< The interest bit of the byte data retunred
+ ///< after sending the detection command.
+} SFDP_SECTOR_MAP_DETECTION_RECORD;
+
+typedef struct {
+ LIST_ENTRY NextRegion; ///< Link list to the next region.
+ UINT32 RegionAddress; ///< Region starting address.
+ UINT32 RegionTotalSize; ///< Region total size in bytes.
+ UINT32 RegionSectors; ///< Sectors in this region.
+ UINT32 SectorSize; ///< Sector size in byte (Minimum blcok erase size)
+ UINT8 SupportedEraseTypeNum; ///< Number of erase type supported.
+ UINT8 SupportedEraseType[SFDP_ERASE_TYPES_NUMBER]; ///< Erase types supported.
+ UINT32 EraseTypeBySizeBitmap; ///< The bitmap of supoprted srase block sizes.
+ ///< from big to small.
+} SFDP_SECTOR_REGION_RECORD;
+
+typedef struct {
+ LIST_ENTRY NextDescriptor; ///< Link list to next flash map descriptor.
+ UINT8 ConfigurationId; ///< The ID of this configuration.
+ UINT8 RegionCount; ///< The regions of this sector map configuration.
+ LIST_ENTRY RegionList; ///< The linked list of the regions.
+} SFDP_SECTOR_MAP_RECORD;
+
+typedef struct {
+ UINTN Signature;
+ EFI_HANDLE Handle;
+ EFI_SPI_NOR_FLASH_PROTOCOL Protocol;
+ EFI_SPI_IO_PROTOCOL *SpiIo;
+ UINT32 SfdpBasicFlashByteCount;
+ UINT32 SfdpSectorMapByteCount;
+ SFDP_BASIC_FLASH_PARAMETER *SfdpBasicFlash;
+ SFDP_SECTOR_MAP_TABLE *SfdpFlashSectorMap;
+ UINT8 *SpiTransactionWriteBuffer;
+ UINT32 SpiTransactionWriteBufferIndex;
+ //
+ // SFDP information.
+ //
+ SFDP_HEADER SfdpHeader; ///< SFDP header.
+ UINT32 FlashDeviceSize; ///< The total size of this flash device.
+ UINT8 CurrentAddressBytes; ///< The current address bytes.
+
+ //
+ // This is a linked list in which the Fast Read capability tables
+ // are linked from the low performance transfer to higher performance
+ // transfer. The SPI read would use the first Fast Read entry for
+ // SPI read operation.
+ //
+ LIST_ENTRY FastReadTableList;
+
+ LIST_ENTRY SupportedEraseTypes; ///< The linked list of supported erase types.
+ BOOLEAN Uniform4KEraseSupported; ///< The flash device supoprts uniform 4K erase.
+ BOOLEAN WriteEnableLatchRequired; ///< Wether Write Enable Latch is supported.
+ UINT8 WriteEnableLatchCommand; ///< Write Enable Latch command.
+ //
+ // Below is the linked list of flash device sector
+ // map configuration detection command and map descriptors.
+ //
+ BOOLEAN ConfigurationCommandsNeeded; ///< Indicates whether sector map
+ ///< configuration detection is
+ ///< required.
+ LIST_ENTRY ConfigurationCommandList; ///< The linked list of configuration
+ ///< detection command sequence.
+ LIST_ENTRY ConfigurationMapList; ///< The linked list of configuration
+ ///< map descriptors.
+ SFDP_SECTOR_MAP_RECORD *CurrentSectorMap; ///< The current activated flash device
+ ///< sector map.
+} SPI_NOR_FLASH_INSTANCE;
+
+/**
+ This routine returns the desired Fast Read mode.
+
+ @param[in] Instance Spi Nor Flash Instance data with pointer to
+ EFI_SPI_NOR_FLASH_PROTOCOL and EFI_SPI_IO_PROTOCOL
+ @param[in,out] FastReadInstruction Fast Read instruction, the input is
+ the default value.
+ @param[in,out] FastReadOperationClock Fast Read operation clock, the input is
+ the default value.
+ @param[in,out] FastReadDummyClocks Fast Read wait state (Dummy clocks), the
+ input is the default value.
+ @retval EFI_SUCCESS The parameters are updated.
+ @retval EFI_NOT_FOUND No desired Fas Read mode found.
+
+**/
+EFI_STATUS
+GetFastReadParameter (
+ IN SPI_NOR_FLASH_INSTANCE *Instance,
+ IN OUT UINT8 *FastReadInstruction,
+ IN OUT UINT8 *FastReadOperationClock,
+ IN OUT UINT8 *FastReadDummyClocks
+ );
+
+/**
+ Read SFDP parameters into buffer
+
+ This routine reads the JEDEC SPI Flash Discoverable Parameters from the SPI
+ chip.
+
+ @param[in] Instance Spi Nor Flash Instance data with pointer to
+ EFI_SPI_NOR_FLASH_PROTOCOL and EFI_SPI_IO_PROTOCOL
+
+ @retval EFI_SUCCESS The SPI part size is filled.
+ @retval EFI_DEVICE_ERROR Invalid data received from SPI flash part.
+
+**/
+EFI_STATUS
+ReadSfdpBasicParameterTable (
+ IN SPI_NOR_FLASH_INSTANCE *Instance
+ );
+
+/**
+ Read SFDP Sector Map Parameter into buffer
+
+ This routine reads the JEDEC SPI Flash Discoverable Parameters from the SPI
+ chip.
+
+ @param[in] Instance Spi Nor Flash Instance data with pointer to
+ EFI_SPI_NOR_FLASH_PROTOCOL and EFI_SPI_IO_PROTOCOL
+
+ @retval EFI_SUCCESS The SPI part size is filled.
+ @retval EFI_DEVICE_ERROR Invalid data received from SPI flash part.
+
+**/
+EFI_STATUS
+ReadSfdpSectorMapParameterTable (
+ IN SPI_NOR_FLASH_INSTANCE *Instance
+ );
+
+/**
+ Return flash device size from SFDP Basic Flash Parameter Table DWORD 2
+
+ @param[in] Instance Spi Nor Flash Instance data with pointer to
+ EFI_SPI_NOR_FLASH_PROTOCOL and
+ EFI_SPI_IO_PROTOCOL.
+
+* @retval UINT32 Flash device size in byte, zero indicates error.
+
+**/
+UINT32
+SfdpGetFlashSize (
+ IN SPI_NOR_FLASH_INSTANCE *Instance
+ );
+
+/**
+ Read SFDP
+ This routine reads the JEDEC SPI Flash Discoverable Parameters. We just
+ read the necessary tables in this routine.
+
+ @param[in] Instance Spi Nor Flash Instance data with pointer to
+ EFI_SPI_NOR_FLASH_PROTOCOL and EFI_SPI_IO_PROTOCOL
+
+ @retval EFI_SUCCESS Header is filled in
+ @retval EFI_DEVICE_ERROR Invalid data received from SPI flash part.
+
+**/
+EFI_STATUS
+ReadSfdp (
+ IN SPI_NOR_FLASH_INSTANCE *Instance
+ );
+
+/**
+ Set EraseBlockBytes in SPI NOR Flash Protocol
+
+ @param[in] Instance Spi Nor Flash Instance data with pointer to
+ EFI_SPI_NOR_FLASH_PROTOCOL and EFI_SPI_IO_PROTOCOL
+
+ @retval EFI_SUCCESS The erase block size is returned.
+ @retval Otherwise Failed to get erase block size.
+
+**/
+EFI_STATUS
+SetSectorEraseBlockSize (
+ IN SPI_NOR_FLASH_INSTANCE *Instance
+ );
+
+/**
+ Get the erase block attribute for the target address.
+
+ @param[in] Instance Spi Nor Flash Instance data with pointer to
+ EFI_SPI_NOR_FLASH_PROTOCOL and EFI_SPI_IO_PROTOCOL
+ @param[in] FlashRegion The region the flash address belong.
+ @param[in] FlashAddress The target flash address.
+ @param[in] RemainingSize Remaining size to erase.
+ @param[in, out] BlockSizeToErase Input - The block erase size for this continious blocks.
+ Output - The determined block size for erasing.
+ @param[in, out] BlockCountToErase Input - The expected blocks to erase.
+ Output - The determined number of blocks to erase.
+ @param[out] BlockEraseCommand The erase command used for this continious blocks.
+ @param[out] TypicalTime Pointer to receive the typical time in millisecond
+ to erase this erase type size.
+ @param[out] MaximumTimeout Pointer to receive the maximum timeout in millisecond
+ to erase this erase type size.
+ @retval EFI_SUCCESS The erase block attribute is returned.
+ @retval EFI_DEVICE_ERROR No valid SFDP discovered.
+ @retval EFI_NOT_FOUND No valud erase block attribute found.
+
+**/
+EFI_STATUS
+GetEraseBlockAttribute (
+ IN SPI_NOR_FLASH_INSTANCE *Instance,
+ IN SFDP_SECTOR_REGION_RECORD *FlashRegion,
+ IN UINT32 FlashAddress,
+ IN UINT32 RemainingSize,
+ IN OUT UINT32 *BlockSizeToErase,
+ IN OUT UINT32 *BlockCountToErase,
+ OUT UINT8 *BlockEraseCommand,
+ OUT UINT32 *TypicalTime,
+ OUT UINT64 *MaximumTimeout
+ );
+
+/**
+ Get the erase block attribute for the target address.
+
+ @param[in] Instance Spi Nor Flash Instance data with pointer to
+ EFI_SPI_NOR_FLASH_PROTOCOL and EFI_SPI_IO_PROTOCOL
+ @param[in] FlashAddress The target flash address.
+ @param[out] FlashRegion The target flash address.
+
+ @retval EFI_SUCCESS The region is returned.
+ @retval EFI_INVALID_PARAMETER FlashAddress is not belong to any region.
+ @retval EFI_INVALID_PARAMETER Other errors.
+
+**/
+EFI_STATUS
+GetRegionByFlashAddress (
+ IN SPI_NOR_FLASH_INSTANCE *Instance,
+ IN UINT32 FlashAddress,
+ OUT SFDP_SECTOR_REGION_RECORD **FlashRegion
+ );
+
+/**
+ Initial SPI_NOR_FLASH_INSTANCE structure.
+
+ @param[in] Instance Pointer to SPI_NOR_FLASH_INSTANCE.
+ EFI_SPI_NOR_FLASH_PROTOCOL and EFI_SPI_IO_PROTOCOL
+
+ @retval EFI_SUCCESS SPI_NOR_FLASH_INSTANCE is initialized according to
+ SPI NOR Flash SFDP specification.
+ @retval Otherwisw Failed to initial SPI_NOR_FLASH_INSTANCE structure.
+
+**/
+EFI_STATUS
+InitialSpiNorFlashSfdpInstance (
+ IN SPI_NOR_FLASH_INSTANCE *Instance
+ );
+
+#endif // SPI_NOR_FLASH_INSTANCE_H_