[edk2-devel] [PATCH v1 07/10] Silicon/Phytium: Added Spi driver support to Phytium2000-4

Ling Jia jialing at phytium.com.cn
Fri Jan 15 08:47:59 UTC 2021


From: Ling <jialing at phytium.com.cn>

The PhytiumSpiDxe is to provide Spi bus read-write interface.

Cc: Leif Lindholm <leif at nuviainc.com>
Signed-off-by: Ling Jia <jialing at phytium.com.cn>
Signed-off-by: Peng Xie <xiepeng at phytium.com.cn>
Reviewed-by: Yiqi Shu <shuyiqi at phytium.com.cn>
---
 Platform/Phytium/Durian/DurianPkg.dsc                                 |   5 +
 Platform/Phytium/Durian/DurianPkg.fdf                                 |   5 +
 Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.inf |  52 ++++++
 Silicon/Phytium/Include/Protocol/PhytiumSpi.h                         |  51 ++++++
 Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.h   |  73 ++++++++
 Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.c   | 189 ++++++++++++++++++++
 6 files changed, 375 insertions(+)

diff --git a/Platform/Phytium/Durian/DurianPkg.dsc b/Platform/Phytium/Durian/DurianPkg.dsc
index 5c40d9fb5dce..a23c1d52cece 100644
--- a/Platform/Phytium/Durian/DurianPkg.dsc
+++ b/Platform/Phytium/Durian/DurianPkg.dsc
@@ -256,6 +256,11 @@ [Components.common]
   #
   ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf
 
+  #
+  # Spi driver
+  #
+  Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.inf
+
   #
   # Usb Support
   #
diff --git a/Platform/Phytium/Durian/DurianPkg.fdf b/Platform/Phytium/Durian/DurianPkg.fdf
index d39d1a660102..ad0406b3133b 100644
--- a/Platform/Phytium/Durian/DurianPkg.fdf
+++ b/Platform/Phytium/Durian/DurianPkg.fdf
@@ -105,6 +105,11 @@ [FV.FvMain]
   INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf
   INF ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf
 
+  #
+  # Spi driver
+  #
+  INF Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.inf
+
   # Variable services
   INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
   INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
diff --git a/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.inf b/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.inf
new file mode 100644
index 000000000000..522a633a23e6
--- /dev/null
+++ b/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.inf
@@ -0,0 +1,52 @@
+#/** @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                    = 0x00010019
+  BASE_NAME                      = PhytiumSpiDxe
+  FILE_GUID                      = 2ba95e5c-f7f5-11ea-bf18-67fdc5787495
+  MODULE_TYPE                    = DXE_RUNTIME_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = SpiMasterDrvEntryPoint
+
+[Sources.common]
+  PhytiumSpiDxe.c
+  PhytiumSpiDxe.h
+
+[Packages]
+  MdePkg/MdePkg.dec
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+  Silicon/Phytium/Phytium.dec
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
+  PcdLib
+  IoLib
+  UefiBootServicesTableLib
+  DxeServicesTableLib
+  UefiRuntimeLib
+  UefiLib
+  UefiDriverEntryPoint
+
+[Guids]
+  gEfiEventVirtualAddressChangeGuid
+
+[Protocols]
+  gPhytiumSpiMasterProtocolGuid
+
+[FixedPcd]
+  gPhytiumPlatformTokenSpaceGuid.PcdSpiFlashBase
+  gPhytiumPlatformTokenSpaceGuid.PcdSpiFlashSize
+  gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerBase
+  gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerSize
+
+[Depex]
+  TRUE
diff --git a/Silicon/Phytium/Include/Protocol/PhytiumSpi.h b/Silicon/Phytium/Include/Protocol/PhytiumSpi.h
new file mode 100644
index 000000000000..43a258924662
--- /dev/null
+++ b/Silicon/Phytium/Include/Protocol/PhytiumSpi.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 __PHYTIUM_SPI_H__
+#define __PHYTIUM_SPI_H__
+
+extern EFI_GUID gPhytiumSpiMasterProtocolGuid;
+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 /* __PHYTIUM_SPI_H__ */
diff --git a/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.h b/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.h
new file mode 100644
index 000000000000..1a5cbb6b5a33
--- /dev/null
+++ b/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.h
@@ -0,0 +1,73 @@
+/** @file
+  Phytium Spi Drivers Header
+
+  Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef __PHYTIUM_SPI_DXE_H__
+#define __PHYTIUM_SPI_DXE_H__
+
+#include <PiDxe.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/UefiLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeLib.h>
+#include <Uefi/UefiBaseType.h>
+#include <Library/DxeServicesTableLib.h>
+#include <Guid/GlobalVariable.h>
+#include <Guid/EventGroup.h>
+#include <Protocol/PhytiumSpi.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 /* __PHYTIUM_SPI_DXE_H__ */
diff --git a/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.c b/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.c
new file mode 100644
index 000000000000..ade1a2351d9f
--- /dev/null
+++ b/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.c
@@ -0,0 +1,189 @@
+/** @file
+  Phytium Spi Master Drivers.
+
+  Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "PhytiumSpiDxe.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 = 0;
+  UINT32 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 = 0;
+  UINT32 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),
+                &gPhytiumSpiMasterProtocolGuid,
+                &(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 (#70402): https://edk2.groups.io/g/devel/message/70402
Mute This Topic: https://groups.io/mt/79697759/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