From: Meenakshi Aggarwal <[email protected]>

Add support of IfcLib, it will be used to perform
any operation on IFC controller.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Meenakshi Aggarwal <[email protected]>
---
 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 <Library/BeIoLib.h>
+#include <Library/IoLib.h>
+#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);
+  }
+}
+
+VOID
+SetTimings (
+  IN  UINT8        CS,
+  IN  IFC_TIMINGS  IfcTimings
+  )
+{
+  IFC_REGS*        IfcRegs;
+
+  IfcRegs = (IFC_REGS*) PcdGet64 (PcdIfcBaseAddr);
+
+  // 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);
+
+  // 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 <Ifc.h>
+#include <Uefi.h>
+
+#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

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to