[edk2-devel] [PATCH v4 06/10] Silicon/Phytium: Added Spi driver support to FT2000/4

Ling Jia jialing at phytium.com.cn
Wed Aug 18 09:46:46 UTC 2021


The SpiDxe is to provide Spi bus read-write interfaces.

Signed-off-by: Ling Jia <jialing at phytium.com.cn>
Reviewed-by: Leif Lindholm <leif at 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             |  59 ++++++
 Silicon/Phytium/PhytiumCommonPkg/Include/Protocol/SpiProtocol.h |  51 +++++
 Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.c             | 202 ++++++++++++++++++++
 7 files changed, 372 insertions(+)

diff --git a/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec b/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec
index 48f430c88d..69842b89e0 100644
--- a/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec
+++ b/Silicon/Phytium/PhytiumCommonPkg/PhytiumCommonPkg.dec
@@ -38,4 +38,13 @@
   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 3a9bc2289c..68698d613f 100644
--- a/Platform/Phytium/DurianPkg/DurianPkg.dsc
+++ b/Platform/Phytium/DurianPkg/DurianPkg.dsc
@@ -244,6 +244,11 @@
   #
   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 a443d0f3a4..1cf1927484 100644
--- a/Platform/Phytium/DurianPkg/DurianPkg.fdf
+++ b/Platform/Phytium/DurianPkg/DurianPkg.fdf
@@ -95,6 +95,8 @@ READ_LOCK_STATUS   = TRUE
   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 0000000000..21d75f268d
--- /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 0000000000..8795ea238d
--- /dev/null
+++ b/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.h
@@ -0,0 +1,59 @@
+/** @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 <Protocol/SpiProtocol.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 0000000000..3ed64d1a5d
--- /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 0000000000..7602a3e0cd
--- /dev/null
+++ b/Silicon/Phytium/FT2000-4Pkg/Drivers/SpiDxe/SpiDxe.c
@@ -0,0 +1,202 @@
+/** @file
+  Phytium Spi Master Drivers.
+
+  Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Uefi/UefiBaseType.h>
+#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 (#79481): https://edk2.groups.io/g/devel/message/79481
Mute This Topic: https://groups.io/mt/84968654/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list