From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c0c::244; helo=mail-wr0-x244.google.com; envelope-from=leif.lindholm@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wr0-x244.google.com (mail-wr0-x244.google.com [IPv6:2a00:1450:400c:c0c::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id AB459226847A9 for ; Wed, 18 Apr 2018 11:39:50 -0700 (PDT) Received: by mail-wr0-x244.google.com with SMTP id f14-v6so7443328wre.4 for ; Wed, 18 Apr 2018 11:39:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=IEXHO04++H5x17U6dnSCG80pj1Eh2QLeViUkZiZ8UlQ=; b=Qr+YSZzCIS5cgBX8nz3tDFaNvRwYQE95QYHa1t+HoxSpM9W2UExSbN2AOAwfSnBz8c D5o2aZpBPdl0b/QPoT0R77LEm7y2W0uQkcxZI0n6ueDMZfQtQS/zMWnfLf5omN5RdL47 +W8Zc7tTGrtV2VNYXxiRvFEj8rl/iQdPwTYPo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=IEXHO04++H5x17U6dnSCG80pj1Eh2QLeViUkZiZ8UlQ=; b=nxB6aJ/AfRYXw0jEMocWJICO3RW4cSkutrKE+2Cqolh9h0KFuaxwj4iXxBxtRHYoFF NvHDF2SgKEq6se5xecQCK3Y5Nm/ZHQMLc/8wCHcUU0lCiiWNJhbRVm5u7JJKui3Ij/c5 JptOkVWJfHnB5Ymr5XJCZ6F0j3gXQc3ImmwUdGTh5VapMHUfjXe+OaI9Zlx+wdPRaMNf vY0ox0wyyljrhDU0EmcmpHi5CAglNIX9NXPOzlpBsw98P9bREOCMyxhjwooWdsylc3Vy V1h3Me0DXvxyxLBIM5XHpgjpS6DFlEyz6cxKFWJzH11REoKPosa8wN0zaOjswK9F/4zp vaxg== X-Gm-Message-State: ALQs6tBPZBpeD6LIISugl0uj5jwgr1i7vWM8SnChk9gpEpy+PaEnlmm+ mkviPm7xh6qHw2esnK8jnNcysQ== X-Google-Smtp-Source: AIpwx49YrKgEc9Y9as07OxnoIdY3kjF9hCWnAE35mvR/aM2+6bPeETYUdLOPDoNdatAb5FWukrXsjw== X-Received: by 2002:adf:b823:: with SMTP id h32-v6mr2579055wrf.209.1524076789116; Wed, 18 Apr 2018 11:39:49 -0700 (PDT) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id w14sm1870283wmd.1.2018.04.18.11.39.47 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 18 Apr 2018 11:39:47 -0700 (PDT) Date: Wed, 18 Apr 2018 19:39:46 +0100 From: Leif Lindholm To: Meenakshi Cc: ard.biesheuvel@linaro.org, edk2-devel@lists.01.org, udit.kumar@nxp.com, v.sethi@nxp.com Message-ID: <20180418183946.rfsdkwbtgbv5pfbr@bivouac.eciton.net> References: <1518771035-6733-1-git-send-email-meenakshi.aggarwal@nxp.com> <1518771035-6733-13-git-send-email-meenakshi.aggarwal@nxp.com> MIME-Version: 1.0 In-Reply-To: <1518771035-6733-13-git-send-email-meenakshi.aggarwal@nxp.com> User-Agent: NeoMutt/20170113 (1.7.2) Subject: Re: [PATCH edk2-platforms 12/39] Silicon/NXP : Add support of IfcLib X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Apr 2018 18:39:51 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, Feb 16, 2018 at 02:20:08PM +0530, Meenakshi wrote: > From: Meenakshi Aggarwal > > Add support of IfcLib, it will be used to perform > any operation on IFC controller. Again, please describe what an IFC is. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Meenakshi Aggarwal > --- > Silicon/NXP/Include/Library/IfcLib.h | 23 +++++ > Silicon/NXP/Library/IfcLib/IfcLib.c | 155 ++++++++++++++++++++++++++++ > Silicon/NXP/Library/IfcLib/IfcLib.h | 184 ++++++++++++++++++++++++++++++++++ > Silicon/NXP/Library/IfcLib/IfcLib.inf | 38 +++++++ > Silicon/NXP/NxpQoriqLs.dec | 1 + > 5 files changed, 401 insertions(+) > create mode 100644 Silicon/NXP/Include/Library/IfcLib.h > create mode 100644 Silicon/NXP/Library/IfcLib/IfcLib.c > create mode 100644 Silicon/NXP/Library/IfcLib/IfcLib.h > create mode 100644 Silicon/NXP/Library/IfcLib/IfcLib.inf > > diff --git a/Silicon/NXP/Include/Library/IfcLib.h b/Silicon/NXP/Include/Library/IfcLib.h > new file mode 100644 > index 0000000..f350d33 > --- /dev/null > +++ b/Silicon/NXP/Include/Library/IfcLib.h > @@ -0,0 +1,23 @@ > +/** @IfcLib.h > + > + Copyright 2018 NXP > + > + This program and the accompanying materials > + are licensed and made available under the terms and conditions of the BSD License > + which accompanies this distribution. The full text of the license may be found at > + http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#ifndef __IFC_LIB_H__ > +#define __IFC_LIB_H__ > + > +VOID > +IfcInit ( > + VOID > + ); > + > +#endif //__IFC_LIB_H__ > diff --git a/Silicon/NXP/Library/IfcLib/IfcLib.c b/Silicon/NXP/Library/IfcLib/IfcLib.c > new file mode 100644 > index 0000000..97a6591 > --- /dev/null > +++ b/Silicon/NXP/Library/IfcLib/IfcLib.c > @@ -0,0 +1,155 @@ > +/** @IfcLib.c > + > + Copyright 2018 NXP > + > + This program and the accompanying materials > + are licensed and made available under the terms and conditions of the BSD License > + which accompanies this distribution. The full text of the license may be found at > + http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#include > +#include > +#include "IfcLib.h" > + > +UINT8 mNandCS; > +UINT8 mNorCS; > +UINT8 mFpgaCS; > + > +UINT32 > +EFIAPI > +IfcWrite ( > + IN UINTN Address, > + IN UINT32 Value > + ) > +{ > + if (FixedPcdGetBool(PcdIfcBigEndian)) { > + return BeMmioWrite32 (Address, Value); > + } else { > + return MmioWrite32 (Address, Value); > + } > +} Same comment as watchdog and gur(?) for conteoller endianness handling. > + > +VOID > +SetTimings ( > + IN UINT8 CS, > + IN IFC_TIMINGS IfcTimings > + ) > +{ > + IFC_REGS* IfcRegs; > + > + IfcRegs = (IFC_REGS*) PcdGet64 (PcdIfcBaseAddr); No space after (IFC_REGS*). > + > + // Configure Extended chip select property registers > + IfcWrite ((UINTN)&IfcRegs->CsprCs[CS].CsprExt, IfcTimings.CsprExt); > + > + // Configure Fpga timing registers > + IfcWrite ((UINTN)&IfcRegs->FtimCs[CS].Ftim[IFC_FTIM0], IfcTimings.Ftim[0]); > + IfcWrite ((UINTN)&IfcRegs->FtimCs[CS].Ftim[IFC_FTIM1], IfcTimings.Ftim[1]); > + IfcWrite ((UINTN)&IfcRegs->FtimCs[CS].Ftim[IFC_FTIM2], IfcTimings.Ftim[2]); > + IfcWrite ((UINTN)&IfcRegs->FtimCs[CS].Ftim[IFC_FTIM3], IfcTimings.Ftim[3]); > + > + // Configure chip select option registers > + IfcWrite ((UINTN)&IfcRegs->CsprCs[CS].Cspr, IfcTimings.Cspr); > + > + // Configure address mask registers > + IfcWrite ((UINTN)&IfcRegs->AmaskCs[CS].Amask, IfcTimings.Amask); > + > + // Configure chip select property registers > + IfcWrite ((UINTN)&IfcRegs->CsorCs[CS].Csor, IfcTimings.Csor); > + > + return; > +} > + > +VOID > +NandInit( > + VOID > + ) > +{ > + IFC_REGS* IfcRegs; > + IFC_TIMINGS NandIfcTimings; > + > + IfcRegs = (IFC_REGS*) PcdGet64 (PcdIfcBaseAddr); No space after (IFC_REGS*). / Leif > + > + // Get Nand Flash Timings > + GetIfcNandFlashTimings (&NandIfcTimings); > + > + // Validate chip select > + if (NandIfcTimings.CS < IFC_CS_MAX) { > + mNandCS = NandIfcTimings.CS; > + > + // clear event registers > + IfcWrite ((UINTN)&IfcRegs->IfcNand.PgrdcmplEvtStat, ~0U); > + > + IfcWrite ((UINTN)&IfcRegs->IfcNand.NandEvterStat, ~0U); > + > + // Enable error and event for any detected errors > + IfcWrite ((UINTN)&IfcRegs->IfcNand.NandEvterEn, > + IFC_NAND_EVTER_EN_OPC_EN | > + IFC_NAND_EVTER_EN_PGRDCMPL_EN | > + IFC_NAND_EVTER_EN_FTOER_EN | > + IFC_NAND_EVTER_EN_WPER_EN); > + IfcWrite ((UINTN)&IfcRegs->IfcNand.Ncfgr, 0x0); > + > + SetTimings (mNandCS, NandIfcTimings); > + } > + > + return; > +} > + > +VOID > +FpgaInit ( > + VOID > + ) > +{ > + IFC_TIMINGS FpgaIfcTimings; > + > + // Get Fpga Flash Timings > + GetIfcFpgaTimings (&FpgaIfcTimings); > + > + // Validate chip select > + if (FpgaIfcTimings.CS < IFC_CS_MAX) { > + mFpgaCS = FpgaIfcTimings.CS; > + SetTimings (mFpgaCS, FpgaIfcTimings); > + } > + > + return; > +} > + > +VOID > +NorInit ( > + VOID > + ) > +{ > + IFC_TIMINGS NorIfcTimings; > + > + // Get NOR Flash Timings > + GetIfcNorFlashTimings (&NorIfcTimings); > + > + // Validate chip select > + if (NorIfcTimings.CS < IFC_CS_MAX) { > + mNorCS = NorIfcTimings.CS; > + SetTimings (mNorCS, NorIfcTimings); > + } > + > + return; > +} > + > +// > +// IFC has NOR , NAND and FPGA > +// > +VOID > +IfcInit ( > + VOID > + ) > +{ > + NorInit(); > + NandInit(); > + FpgaInit(); > + > + return; > +} > diff --git a/Silicon/NXP/Library/IfcLib/IfcLib.h b/Silicon/NXP/Library/IfcLib/IfcLib.h > new file mode 100644 > index 0000000..9f52576 > --- /dev/null > +++ b/Silicon/NXP/Library/IfcLib/IfcLib.h > @@ -0,0 +1,184 @@ > +/** @IfcLib.h > + > + Copyright 2017 NXP > + > + This program and the accompanying materials > + are licensed and made available under the terms and conditions of the BSD License > + which accompanies this distribution. The full text of the license may be found at > + http://opensource.org/licenses/bsd-license.php > + > + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#ifndef __IFC_LIB_H__ > +#define __IFC_LIB_H__ > + > +#include > +#include > + > +#define IFC_NAND_RESERVED_SIZE FixedPcdGet32 (PcdIfcNandReservedSize) > + > +typedef enum { > + IFC_FTIM0 = 0, > + IFC_FTIM1, > + IFC_FTIM2, > + IFC_FTIM3, > +} IFC_FTIMS; > + > +typedef struct { > + UINT32 CsprExt; > + UINT32 Cspr; > + UINT32 Res; > +} IFC_CSPR; > + > +typedef struct { > + UINT32 Amask; > + UINT32 Res[0x2]; > +} IFC_AMASK; > + > +typedef struct { > + UINT32 Csor; > + UINT32 CsorExt; > + UINT32 Res; > +} IFC_CSOR; > + > +typedef struct { > + UINT32 Ftim[4]; > + UINT32 Res[0x8]; > +}IFC_FTIM ; > + > +typedef struct { > + UINT32 Ncfgr; > + UINT32 Res1[0x4]; > + UINT32 NandFcr0; > + UINT32 NandFcr1; > + UINT32 Res2[0x8]; > + UINT32 Row0; > + UINT32 Res3; > + UINT32 Col0; > + UINT32 Res4; > + UINT32 Row1; > + UINT32 Res5; > + UINT32 Col1; > + UINT32 Res6; > + UINT32 Row2; > + UINT32 Res7; > + UINT32 Col2; > + UINT32 Res8; > + UINT32 Row3; > + UINT32 Res9; > + UINT32 Col3; > + UINT32 Res10[0x24]; > + UINT32 NandFbcr; > + UINT32 Res11; > + UINT32 NandFir0; > + UINT32 NandFir1; > + UINT32 nandFir2; > + UINT32 Res12[0x10]; > + UINT32 NandCsel; > + UINT32 Res13; > + UINT32 NandSeqStrt; > + UINT32 Res14; > + UINT32 NandEvterStat; > + UINT32 Res15; > + UINT32 PgrdcmplEvtStat; > + UINT32 Res16[0x2]; > + UINT32 NandEvterEn; > + UINT32 Res17[0x2]; > + UINT32 NandEvterIntrEn; > + UINT32 Res18[0x2]; > + UINT32 NandErattr0; > + UINT32 NandErattr1; > + UINT32 Res19[0x10]; > + UINT32 NandFsr; > + UINT32 Res20; > + UINT32 NandEccstat[4]; > + UINT32 Res21[0x20]; > + UINT32 NanNdcr; > + UINT32 Res22[0x2]; > + UINT32 NandAutobootTrgr; > + UINT32 Res23; > + UINT32 NandMdr; > + UINT32 Res24[0x5C]; > +} IFC_NAND; > + > +/* > + * IFC controller NOR Machine registers > + */ > +typedef struct { > + UINT32 NorEvterStat; > + UINT32 Res1[0x2]; > + UINT32 NorEvterEn; > + UINT32 Res2[0x2]; > + UINT32 NorEvterIntrEn; > + UINT32 Res3[0x2]; > + UINT32 NorErattr0; > + UINT32 NorErattr1; > + UINT32 NorErattr2; > + UINT32 Res4[0x4]; > + UINT32 NorCr; > + UINT32 Res5[0xEF]; > +} IFC_NOR; > + > +/* > + * IFC controller GPCM Machine registers > + */ > +typedef struct { > + UINT32 GpcmEvterStat; > + UINT32 Res1[0x2]; > + UINT32 GpcmEvterEn; > + UINT32 Res2[0x2]; > + UINT32 gpcmEvterIntrEn; > + UINT32 Res3[0x2]; > + UINT32 GpcmErattr0; > + UINT32 GpcmErattr1; > + UINT32 GcmErattr2; > + UINT32 GpcmStat; > +} IFC_GPCM; > + > +/* > + * IFC Controller Registers > + */ > +typedef struct { > + UINT32 IfcRev; > + UINT32 Res1[0x2]; > + IFC_CSPR CsprCs[IFC_BANK_COUNT]; > + UINT8 Res2[IFC_CSPR_REG_LEN - IFC_CSPR_USED_LEN]; > + IFC_AMASK AmaskCs[IFC_BANK_COUNT]; > + UINT8 Res3[IFC_AMASK_REG_LEN - IFC_AMASK_USED_LEN]; > + IFC_CSOR CsorCs[IFC_BANK_COUNT]; > + UINT8 Res4[IFC_CSOR_REG_LEN - IFC_CSOR_USED_LEN]; > + IFC_FTIM FtimCs[IFC_BANK_COUNT]; > + UINT8 Res5[IFC_FTIM_REG_LEN - IFC_FTIM_USED_LEN]; > + UINT32 RbStat; > + UINT32 RbMap; > + UINT32 WpMap; > + UINT32 IfcGcr; > + UINT32 Res7[0x2]; > + UINT32 CmEvter_stat; > + UINT32 Res8[0x2]; > + UINT32 CmEvterEn; > + UINT32 Res9[0x2]; > + UINT32 CmEvterIntrEn; > + UINT32 Res10[0x2]; > + UINT32 CmErattr0; > + UINT32 CmErattr1; > + UINT32 Res11[0x2]; > + UINT32 IfcCcr; > + UINT32 IfcCsr; > + UINT32 DdrCcrLow; > + UINT32 Res12[IFC_NAND_RESERVED_SIZE]; > + IFC_NAND IfcNand; > + IFC_NOR IfcNor; > + IFC_GPCM IfcGpcm; > +} IFC_REGS; > + > +extern VOID GetIfcNorFlashTimings (IFC_TIMINGS * NorIfcTimings); > + > +extern VOID GetIfcFpgaTimings (IFC_TIMINGS *FpgaIfcTimings); > + > +extern VOID GetIfcNandFlashTimings (IFC_TIMINGS * NandIfcTimings); > + > +#endif //__IFC_LIB_H__ > diff --git a/Silicon/NXP/Library/IfcLib/IfcLib.inf b/Silicon/NXP/Library/IfcLib/IfcLib.inf > new file mode 100644 > index 0000000..170ed38 > --- /dev/null > +++ b/Silicon/NXP/Library/IfcLib/IfcLib.inf > @@ -0,0 +1,38 @@ > +# IfcLib.inf > +# > +# Component description file for IFC Library > +# > +# Copyright 2018 NXP > +# > +# This program and the accompanying materials > +# are licensed and made available under the terms and conditions of the BSD License > +# which accompanies this distribution. The full text of the license may be found at > +# http://opensource.org/licenses/bsd-license.php > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > +# > + > +[Defines] > + INF_VERSION = 0x0001001A > + BASE_NAME = IfcLib > + FILE_GUID = a465d76c-0785-4ee7-bd72-767983d575a2 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = IfcLib > + > +[Sources.common] > + IfcLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + Silicon/NXP/NxpQoriqLs.dec > + > +[LibraryClasses] > + BoardLib > + BeIoLib > + > +[FixedPcd] > + gNxpQoriqLsTokenSpaceGuid.PcdIfcBaseAddr > + gNxpQoriqLsTokenSpaceGuid.PcdIfcBigEndian > + gNxpQoriqLsTokenSpaceGuid.PcdIfcNandReservedSize > diff --git a/Silicon/NXP/NxpQoriqLs.dec b/Silicon/NXP/NxpQoriqLs.dec > index a73e9d5..43d0a71 100644 > --- a/Silicon/NXP/NxpQoriqLs.dec > +++ b/Silicon/NXP/NxpQoriqLs.dec > @@ -77,6 +77,7 @@ > gNxpQoriqLsTokenSpaceGuid.PcdCcsrBaseAddr|0x0|UINT64|0x00000128 > gNxpQoriqLsTokenSpaceGuid.PcdCcsrSize|0x0|UINT64|0x00000129 > gNxpQoriqLsTokenSpaceGuid.PcdDramMemSize|0x0|UINT64|0x0000012A > + gNxpQoriqLsTokenSpaceGuid.PcdIfcBaseAddr|0x0|UINT64|0x0000012B > > # > # IFC PCDs > -- > 1.9.1 >