The SpiDxe is to provide Spi bus read-write interfaces. v3: Optimized the codes to conform to specifications.
Signed-off-by: Ling Jia <jial...@phytium.com.cn> Reviewed-by: Leif Lindholm <l...@nuviainc.com> --- Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec | 9 + Platform/Phytium/DurianPkg/DurianPkg.dsc | 5 + Platform/Phytium/DurianPkg/DurianPkg.fdf | 2 + Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.inf | 44 +++++ Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.h | 64 +++++++ Silicon/Phytium/PhytiumCommonPkg/Include/Protocol/SpiProtocol.h | 51 +++++ Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.c | 198 ++++++++++++++++++++ 7 files changed, 373 insertions(+) diff --git a/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec b/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec index 48f430c88de6..69842b89e021 100644 --- a/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec +++ b/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec @@ -38,4 +38,13 @@ [PcdsFixedAtBuild.common] gPhytiumPlatformTokenSpaceGuid.PcdPciConfigBase|0x0|UINT64|0x00000002 gPhytiumPlatformTokenSpaceGuid.PcdPciConfigSize|0x0|UINT64|0x00000003 + # + # SPI Flash Controller Register Base Address and Size + # + gPhytiumPlatformTokenSpaceGuid.PcdSpiFlashBase|0x0|UINT64|0x00000004 + gPhytiumPlatformTokenSpaceGuid.PcdSpiFlashSize|0x0|UINT64|0x00000005 + gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerBase|0x0|UINT64|0x00000006 + gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerSize|0x0|UINT64|0x00000007 + [Protocols] + gSpiMasterProtocolGuid = { 0xdf093560, 0xf955, 0x11ea, { 0x96, 0x42, 0x43, 0x9d, 0x80, 0xdd, 0x0b, 0x7c}} diff --git a/Platform/Phytium/DurianPkg/DurianPkg.dsc b/Platform/Phytium/DurianPkg/DurianPkg.dsc index 3a9bc2289cf3..68698d613f96 100644 --- a/Platform/Phytium/DurianPkg/DurianPkg.dsc +++ b/Platform/Phytium/DurianPkg/DurianPkg.dsc @@ -244,6 +244,11 @@ [Components.common] # ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf + # + # Spi driver + # + Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.inf + # # Usb Support # diff --git a/Platform/Phytium/DurianPkg/DurianPkg.fdf b/Platform/Phytium/DurianPkg/DurianPkg.fdf index a443d0f3a4ac..1cf1927484db 100644 --- a/Platform/Phytium/DurianPkg/DurianPkg.fdf +++ b/Platform/Phytium/DurianPkg/DurianPkg.fdf @@ -95,6 +95,8 @@ [FV.FvMain] INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf + INF Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.inf + INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf diff --git a/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.inf b/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.inf new file mode 100644 index 000000000000..21d75f268da4 --- /dev/null +++ b/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.inf @@ -0,0 +1,44 @@ +#/** @file +# Phytium Spi Master Drivers. +# +# Copyright (C) 2020, Phytium Technology Co, Ltd. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +#**/ + +[Defines] + INF_VERSION = 0x0001001b + BASE_NAME = SpiDxe + FILE_GUID = 2ba95e5c-f7f5-11ea-bf18-67fdc5787495 + MODULE_TYPE = DXE_RUNTIME_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = SpiMasterDrvEntryPoint + +[Sources.common] + SpiDxe.c + SpiDxe.h + +[Packages] + ArmPkg/ArmPkg.dec + MdePkg/MdePkg.dec + Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + IoLib + UefiLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Guids] + +[Protocols] + gSpiMasterProtocolGuid + +[FixedPcd] + gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerBase + +[Depex] + TRUE diff --git a/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.h b/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.h new file mode 100644 index 000000000000..fbadd01921ff --- /dev/null +++ b/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.h @@ -0,0 +1,64 @@ +/** @file + Phytium Spi Drivers Header + + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SPI_DXE_H_ +#define SPI_DXE_H_ + +#include <Library/DebugLib.h> +#include <Library/IoLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/SpiProtocol.h> +#include <Uefi/UefiBaseType.h> + +#define SPI_MASTER_SIGNATURE SIGNATURE_32 ('M', 'S', 'P', 'I') +#define REG_MODE_REG 0x02C + +EFI_STATUS +EFIAPI +SpiMasterGetConfig ( + IN UINT8 CmdId, + OUT UINT32 *Config, + IN UINTN RegAddr + ); + +EFI_STATUS +EFIAPI +SpiMasterSetConfig ( + IN UINT8 CmdId, + IN UINT32 Config, + IN UINTN RegAddr + ); + +EFI_STATUS +EFIAPI +SpiMasterSetMode ( + IN UINT32 Config + ); + +EFI_STATUS +EFIAPI +SpiMasterInit ( + VOID + ); + +typedef struct { + EFI_SPI_DRV_PROTOCOL SpiMasterProtocol; + UINTN Signature; + EFI_HANDLE Handle; +} PHYT_SPI_MASTER; + +EFI_STATUS +EFIAPI +SpiMasterDrvEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +#endif // SPI_DXE_H_ diff --git a/Silicon/Phytium/PhytiumCommonPkg/Include/Protocol/SpiProtocol.h b/Silicon/Phytium/PhytiumCommonPkg/Include/Protocol/SpiProtocol.h new file mode 100644 index 000000000000..3ed64d1a5dd7 --- /dev/null +++ b/Silicon/Phytium/PhytiumCommonPkg/Include/Protocol/SpiProtocol.h @@ -0,0 +1,51 @@ +/** @file + The Header of Protocol For SPI. + + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SPI_H_ +#define SPI_H_ + +extern EFI_GUID gSpiMasterProtocolGuid; +typedef struct _EFI_SPI_DRV_PROTOCOL EFI_SPI_DRV_PROTOCOL; + +typedef +EFI_STATUS +(EFIAPI *SPI_DRV_INIT_INTERFACE) ( + VOID + ); + +typedef +EFI_STATUS +(EFIAPI *SPI_DRV_SET_CONFIG_INTERFACE)( + IN UINT8 CmdId, + IN UINT32 Config, + IN UINTN RegAddr + ); + +typedef +EFI_STATUS +(EFIAPI *SPI_DRV_GET_CONFIG_INTERFACE)( + IN UINT8 CmdId, + OUT UINT32 *Config, + IN UINTN RegAddr + ); + +typedef +EFI_STATUS +(EFIAPI *SPI_DRV_CONFIG_MODE_INTERFACE)( + IN UINT32 Config + ); + +struct _EFI_SPI_DRV_PROTOCOL{ + SPI_DRV_INIT_INTERFACE SpiInit; + SPI_DRV_SET_CONFIG_INTERFACE SpiSetConfig; + SPI_DRV_GET_CONFIG_INTERFACE SpiGetConfig; + SPI_DRV_CONFIG_MODE_INTERFACE SpiSetMode; +}; + +#endif // SPI_H_ diff --git a/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.c b/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.c new file mode 100644 index 000000000000..885bbd63619c --- /dev/null +++ b/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.c @@ -0,0 +1,198 @@ +/** @file + Phytium Spi Master Drivers. + + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "SpiDxe.h" + +PHYT_SPI_MASTER *pSpiMasterInstance; +static UINTN mSpiControlBase; + +/** + This function inited a spi driver. + + @param None. + + @retval None. + +**/ +EFI_STATUS +EFIAPI +SpiMasterInit ( + VOID + ) +{ + return EFI_SUCCESS; +} + + +/** + This function seted config to spi registers. + + @param[in] CmdId The id of command. + + @param[in] Config The value to be seted. + + @param[in] RegAddr The address of spi registers. + + @retval EFI_SUCCESS SpiMasterSetConfig() is executed successfully. + +**/ +EFI_STATUS +EFIAPI +SpiMasterSetConfig ( + IN UINT8 CmdId, + IN UINT32 Config, + IN UINTN RegAddr + ) +{ + UINTN SpiAddr; + UINT32 Value; + + SpiAddr = 0; + Value = 0; + + if (CmdId != 0) { + Value = (CmdId << 24) | (Config & 0xffffff); + } else { + Value = Config; + } + + SpiAddr = mSpiControlBase + RegAddr; + MmioWrite32 (SpiAddr, Value); + + return EFI_SUCCESS; +} + + +/** + This function geted config from spi registers. + + @param[in] CmdId The id of command. + + @param[out] Config The pointer of the config. + + @param[in] RegAddr The address of spi registers. + + @retval EFI_SUCCESS SpiMasterGetConfig() is executed successfully. + +**/ +EFI_STATUS +EFIAPI +SpiMasterGetConfig ( + IN UINT8 CmdId, + OUT UINT32 *Config, + IN UINTN RegAddr + ) +{ + UINTN SpiAddr; + UINT32 Value; + + SpiAddr = 0; + Value = 0; + + SpiAddr = mSpiControlBase + RegAddr; + Value = MmioRead32 (SpiAddr); + + if (CmdId != 0) { + *Config = Value & 0xffffff; + } else { + *Config = Value; + } + + return EFI_SUCCESS; +} + + +/** + This function seted spi mode. + + @param[in] Config The value to seted. + + @retval EFI_SUCCESS SpiMasterSetMode() is executed successfully. + +**/ +EFI_STATUS +EFIAPI +SpiMasterSetMode ( + IN UINT32 Config + ) +{ + + SpiMasterSetConfig (0, Config, REG_MODE_REG); + + return EFI_SUCCESS; +} + + +/** + This function inited the spi driver protocol. + + @param[in] SpiMasterProtocol A pointer to the master protocol struct. + + @retval EFI_SUCCESS SpiMasterInitProtocol() is executed successfully. + +**/ +STATIC +EFI_STATUS +EFIAPI +SpiMasterInitProtocol ( + IN EFI_SPI_DRV_PROTOCOL *SpiMasterProtocol + ) +{ + + SpiMasterProtocol->SpiInit = SpiMasterInit; + SpiMasterProtocol->SpiSetConfig = SpiMasterSetConfig; + SpiMasterProtocol->SpiGetConfig = SpiMasterGetConfig; + SpiMasterProtocol->SpiSetMode = SpiMasterSetMode; + + return EFI_SUCCESS; +} + + +/** + This function is the entrypoint of the spi driver. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + + @retval other Some error occurs when executing this entry point. + +**/ +EFI_STATUS +EFIAPI +SpiMasterDrvEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + pSpiMasterInstance = AllocateRuntimeZeroPool (sizeof (PHYT_SPI_MASTER)); + if (pSpiMasterInstance == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + mSpiControlBase = FixedPcdGet64 (PcdSpiControllerBase); + + SpiMasterInitProtocol (&pSpiMasterInstance->SpiMasterProtocol); + + pSpiMasterInstance->Signature = SPI_MASTER_SIGNATURE; + + Status = gBS->InstallMultipleProtocolInterfaces ( + &(pSpiMasterInstance->Handle), + &gSpiMasterProtocolGuid, + &(pSpiMasterInstance->SpiMasterProtocol), + NULL + ); + ASSERT_EFI_ERROR (Status); + + return EFI_SUCCESS; +} -- 2.25.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72817): https://edk2.groups.io/g/devel/message/72817 Mute This Topic: https://groups.io/mt/81361270/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-