From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from zg8tmty1ljiyny4xntqumjca.icoremail.net (zg8tmty1ljiyny4xntqumjca.icoremail.net [165.227.154.27]) by mx.groups.io with SMTP id smtpd.web10.1380.1610700556402751555 for ; Fri, 15 Jan 2021 00:49:16 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: phytium.com.cn, ip: 165.227.154.27, mailfrom: jialing@phytium.com.cn) Received: from localhost.localdomain (unknown [117.136.88.47]) by c1app12 (Coremail) with SMTP id DAINCgDHzpbFVgFgExlyBA--.39669S9; Fri, 15 Jan 2021 16:49:13 +0800 (CST) From: Ling Jia To: devel@edk2.groups.io Cc: Leif Lindholm , Ling , Peng Xie , Yiqi Shu Subject: [PATCH v1 07/10] Silicon/Phytium: Added Spi driver support to Phytium2000-4 Date: Fri, 15 Jan 2021 08:47:59 +0000 Message-Id: <20210115084802.62196-8-jialing@phytium.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210115084802.62196-1-jialing@phytium.com.cn> References: <20210115084802.62196-1-jialing@phytium.com.cn> MIME-Version: 1.0 X-CM-TRANSID: DAINCgDHzpbFVgFgExlyBA--.39669S9 X-Coremail-Antispam: 1UD129KBjvJXoW3tw43Kr1kCry3ZF1rAw43KFg_yoWDtF4kpF 43trn8Wr48GFWaqw4rXw10kFs5A3s09a4DKFsxWFyrZa15Xry8CanFyF1rJF92qF4qyFW8 Was8tw15uF1qyw7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBG14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Xr0_Ar1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr 1UM28EF7xvwVC2z280aVAFwI0_Gr1j6F4UJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Cr1j 6rxdM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6x IIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_ Gr1lF7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxkIecxEwVAFwVW8Zw CF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j 6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_JF0_Jw1lIxkGc2Ij64 vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Gr0_ Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j6r4UMIIF0x vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x0JUfhLnUUUUU= X-Originating-IP: [117.136.88.47] X-CM-SenderInfo: xmldzxdqj61x51wl3zoofrzhdfq/ Content-Transfer-Encoding: quoted-printable From: Ling The PhytiumSpiDxe is to provide Spi bus read-write interface. Cc: Leif Lindholm Signed-off-by: Ling Jia Signed-off-by: Peng Xie Reviewed-by: Yiqi Shu --- Platform/Phytium/Durian/DurianPkg.dsc | = 5 + Platform/Phytium/Durian/DurianPkg.fdf | = 5 + Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.inf | 5= 2 ++++++ Silicon/Phytium/Include/Protocol/PhytiumSpi.h | 5= 1 ++++++ Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.h | 7= 3 ++++++++ Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.c | 18= 9 ++++++++++++++++++++ 6 files changed, 375 insertions(+) diff --git a/Platform/Phytium/Durian/DurianPkg.dsc b/Platform/Phytium/Duria= n/DurianPkg.dsc index 5c40d9fb5dce..a23c1d52cece 100644 --- a/Platform/Phytium/Durian/DurianPkg.dsc +++ b/Platform/Phytium/Durian/DurianPkg.dsc @@ -256,6 +256,11 @@ [Components.common] #=0D ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf=0D =0D + #=0D + # Spi driver=0D + #=0D + Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.inf=0D +=0D #=0D # Usb Support=0D #=0D diff --git a/Platform/Phytium/Durian/DurianPkg.fdf b/Platform/Phytium/Duria= n/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=0D INF ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf=0D =0D + #=0D + # Spi driver=0D + #=0D + INF Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpiDxe.in= f=0D +=0D # Variable services=0D INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf=0D INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.i= nf=0D diff --git a/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpi= Dxe.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=0D +# Phytium Spi Master Drivers.=0D +#=0D +# Copyright (C) 2020, Phytium Technology Co,Ltd. All rights reserved.
= =0D +#=0D +# SPDX-License-Identifier: BSD-2-Clause-Patent=0D +#=0D +#**/=0D +=0D +[Defines]=0D + INF_VERSION =3D 0x00010019=0D + BASE_NAME =3D PhytiumSpiDxe=0D + FILE_GUID =3D 2ba95e5c-f7f5-11ea-bf18-67fdc5787495= =0D + MODULE_TYPE =3D DXE_RUNTIME_DRIVER=0D + VERSION_STRING =3D 1.0=0D + ENTRY_POINT =3D SpiMasterDrvEntryPoint=0D +=0D +[Sources.common]=0D + PhytiumSpiDxe.c=0D + PhytiumSpiDxe.h=0D +=0D +[Packages]=0D + MdePkg/MdePkg.dec=0D + ArmPkg/ArmPkg.dec=0D + ArmPlatformPkg/ArmPlatformPkg.dec=0D + Silicon/Phytium/Phytium.dec=0D +=0D +[LibraryClasses]=0D + BaseLib=0D + DebugLib=0D + PcdLib=0D + IoLib=0D + UefiBootServicesTableLib=0D + DxeServicesTableLib=0D + UefiRuntimeLib=0D + UefiLib=0D + UefiDriverEntryPoint=0D +=0D +[Guids]=0D + gEfiEventVirtualAddressChangeGuid=0D +=0D +[Protocols]=0D + gPhytiumSpiMasterProtocolGuid=0D +=0D +[FixedPcd]=0D + gPhytiumPlatformTokenSpaceGuid.PcdSpiFlashBase=0D + gPhytiumPlatformTokenSpaceGuid.PcdSpiFlashSize=0D + gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerBase=0D + gPhytiumPlatformTokenSpaceGuid.PcdSpiControllerSize=0D +=0D +[Depex]=0D + TRUE=0D diff --git a/Silicon/Phytium/Include/Protocol/PhytiumSpi.h b/Silicon/Phytiu= m/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=0D + The Header of Protocol For SPI.=0D +=0D + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.
= =0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#ifndef __PHYTIUM_SPI_H__=0D +#define __PHYTIUM_SPI_H__=0D +=0D +extern EFI_GUID gPhytiumSpiMasterProtocolGuid;=0D +typedef struct _EFI_SPI_DRV_PROTOCOL EFI_SPI_DRV_PROTOCOL;=0D +=0D +typedef=0D +EFI_STATUS=0D +(EFIAPI *SPI_DRV_INIT_INTERFACE) (=0D + VOID=0D + );=0D +=0D +typedef=0D +EFI_STATUS=0D +(EFIAPI *SPI_DRV_SET_CONFIG_INTERFACE)(=0D + IN UINT8 CmdId,=0D + IN UINT32 Config,=0D + IN UINTN RegAddr=0D + );=0D +=0D +typedef=0D +EFI_STATUS=0D +(EFIAPI *SPI_DRV_GET_CONFIG_INTERFACE)(=0D + IN UINT8 CmdId,=0D + OUT UINT32 *Config,=0D + IN UINTN RegAddr=0D + );=0D +=0D +typedef=0D +EFI_STATUS=0D +(EFIAPI *SPI_DRV_CONFIG_MODE_INTERFACE)(=0D + IN UINT32 Config=0D + );=0D +=0D +struct _EFI_SPI_DRV_PROTOCOL{=0D + SPI_DRV_INIT_INTERFACE SpiInit;=0D + SPI_DRV_SET_CONFIG_INTERFACE SpiSetConfig;=0D + SPI_DRV_GET_CONFIG_INTERFACE SpiGetConfig;=0D + SPI_DRV_CONFIG_MODE_INTERFACE SpiSetMode;=0D +};=0D +=0D +#endif /* __PHYTIUM_SPI_H__ */=0D diff --git a/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpi= Dxe.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=0D + Phytium Spi Drivers Header=0D +=0D + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.
= =0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#ifndef __PHYTIUM_SPI_DXE_H__=0D +#define __PHYTIUM_SPI_DXE_H__=0D +=0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +#include =0D +=0D +#define SPI_MASTER_SIGNATURE SIGNATURE_32 ('M', 'S', 'P', 'I')=0D +=0D +#define REG_MODE_REG 0x02C=0D +=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterGetConfig (=0D + IN UINT8 CmdId,=0D + OUT UINT32 *Config,=0D + IN UINTN RegAddr=0D + );=0D +=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterSetConfig (=0D + IN UINT8 CmdId,=0D + IN UINT32 Config,=0D + IN UINTN RegAddr=0D + );=0D +=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterSetMode (=0D + IN UINT32 Config=0D + );=0D +=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterInit (=0D + VOID=0D + );=0D +=0D +typedef struct {=0D + EFI_SPI_DRV_PROTOCOL SpiMasterProtocol;=0D + UINTN Signature;=0D + EFI_HANDLE Handle;=0D + } PHYT_SPI_MASTER;=0D +=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterDrvEntryPoint (=0D + IN EFI_HANDLE ImageHandle,=0D + IN EFI_SYSTEM_TABLE *SystemTable=0D + );=0D +=0D +#endif /* __PHYTIUM_SPI_DXE_H__ */=0D diff --git a/Silicon/Phytium/Phytium2000-4/Drivers/PhytiumSpiDxe/PhytiumSpi= Dxe.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=0D + Phytium Spi Master Drivers.=0D +=0D + Copyright (C) 2020, Phytium Technology Co Ltd. All rights reserved.
= =0D +=0D + SPDX-License-Identifier: BSD-2-Clause-Patent=0D +=0D +**/=0D +=0D +#include "PhytiumSpiDxe.h"=0D +=0D +PHYT_SPI_MASTER *pSpiMasterInstance;=0D +static UINTN mSpiControlBase;=0D +=0D +/**=0D + This function inited a spi driver.=0D +=0D + @param None.=0D +=0D + @retval None.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterInit (=0D + VOID=0D + )=0D +{=0D + return EFI_SUCCESS;=0D +}=0D +=0D +=0D +/**=0D + This function seted config to spi registers.=0D +=0D + @param[in] CmdId The id of command.=0D +=0D + @param[in] Config The value to be seted.=0D +=0D + @param[in] RegAddr The address of spi registers.=0D +=0D + @retval EFI_SUCCESS SpiMasterSetConfig() is executed successfully.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterSetConfig (=0D + IN UINT8 CmdId,=0D + IN UINT32 Config,=0D + IN UINTN RegAddr=0D + )=0D +{=0D + UINTN SpiAddr =3D 0;=0D + UINT32 Value =3D 0;=0D +=0D + if(CmdId !=3D 0)=0D + Value =3D(CmdId << 24) | (Config & 0xffffff);=0D + else=0D + Value =3D Config;=0D +=0D + SpiAddr =3D mSpiControlBase + RegAddr;=0D + MmioWrite32 (SpiAddr, Value);=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +=0D +/**=0D + This function geted config from spi registers.=0D +=0D + @param[in] CmdId The id of command.=0D +=0D + @param[out] Config The pointer of the config.=0D +=0D + @param[in] RegAddr The address of spi registers.=0D +=0D + @retval EFI_SUCCESS SpiMasterGetConfig() is executed successfully.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterGetConfig (=0D + IN UINT8 CmdId,=0D + OUT UINT32 *Config,=0D + IN UINTN RegAddr=0D + )=0D +{=0D + UINTN SpiAddr =3D 0;=0D + UINT32 Value =3D 0;=0D +=0D + SpiAddr =3D mSpiControlBase + RegAddr;=0D + Value =3D MmioRead32 (SpiAddr);=0D + if(CmdId !=3D 0)=0D + *Config =3D Value & 0xffffff;=0D + else=0D + *Config =3D Value;=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +=0D +/**=0D + This function seted spi mode.=0D +=0D + @param[in] Config The value to seted.=0D +=0D + @retval EFI_SUCCESS SpiMasterSetMode() is executed successfully.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterSetMode (=0D + IN UINT32 Config=0D + )=0D +{=0D +=0D + SpiMasterSetConfig (0, Config, REG_MODE_REG);=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +=0D +/**=0D + This function inited the spi driver protocol.=0D +=0D + @param[in] SpiMasterProtocol A pointer to the master protocol struct.= =0D +=0D + @retval EFI_SUCCESS SpiMasterInitProtocol() is executed succ= essfully.=0D +=0D +**/=0D +STATIC=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterInitProtocol (=0D + IN EFI_SPI_DRV_PROTOCOL *SpiMasterProtocol=0D + )=0D +{=0D +=0D + SpiMasterProtocol->SpiInit =3D SpiMasterInit;=0D + SpiMasterProtocol->SpiSetConfig =3D SpiMasterSetConfig;=0D + SpiMasterProtocol->SpiGetConfig =3D SpiMasterGetConfig;=0D + SpiMasterProtocol->SpiSetMode =3D SpiMasterSetMode;=0D +=0D + return EFI_SUCCESS;=0D +}=0D +=0D +=0D +/**=0D + This function is the entrypoint of the spi driver.=0D +=0D + @param[in] ImageHandle The firmware allocated handle for the EFI imag= e.=0D +=0D + @param[in] SystemTable A pointer to the EFI System Table.=0D +=0D + @retval EFI_SUCCESS The entry point is executed successfully.=0D +=0D + @retval other Some error occurs when executing this entry po= int.=0D +=0D +**/=0D +EFI_STATUS=0D +EFIAPI=0D +SpiMasterDrvEntryPoint (=0D + IN EFI_HANDLE ImageHandle,=0D + IN EFI_SYSTEM_TABLE *SystemTable=0D + )=0D +{=0D + EFI_STATUS Status;=0D +=0D + pSpiMasterInstance =3D AllocateRuntimeZeroPool (sizeof (PHYT_SPI_MASTER)= );=0D + if (pSpiMasterInstance =3D=3D NULL) {=0D + return EFI_OUT_OF_RESOURCES;=0D + }=0D +=0D + mSpiControlBase =3D FixedPcdGet64 (PcdSpiControllerBase);=0D +=0D + SpiMasterInitProtocol (&pSpiMasterInstance->SpiMasterProtocol);=0D +=0D + pSpiMasterInstance->Signature =3D SPI_MASTER_SIGNATURE;=0D +=0D + Status =3D gBS->InstallMultipleProtocolInterfaces (=0D + &(pSpiMasterInstance->Handle),=0D + &gPhytiumSpiMasterProtocolGuid,=0D + &(pSpiMasterInstance->SpiMasterProtocol),=0D + NULL=0D + );=0D + ASSERT_EFI_ERROR(Status);=0D +=0D + return EFI_SUCCESS;=0D +}=0D --=20 2.25.1