a38x: add support for SolidRun's ClearFog-A1 board

	- added support for a new 'customer' pre-compiled option for
	  SolidRun's ClearFog A0 board
	- compiled with './build.pl -b armada_38x_clearfog -f mmc'
	- Predefined binary header configuration:
	  * Skip AVS selection from pre-burnt EFUSE values
	  * DDR: increased internal CK delay due to short traces
	- Added full U-Boot board structures, including new GPP
	  routine callback to reset PHY & Switch via GPIOs

Change-Id: I16e70a64608cb0630f723568a2fb3d6adf0f5f6c
Signed-off-by: Omri Itach <omrii@marvell.com>
Reviewed-on: http://vgitil04.il.marvell.com:8080/23479
diff --git a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvLib.c b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvLib.c
index 7b87cee..eb6f5bf 100644
--- a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvLib.c
+++ b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvLib.c
@@ -2222,6 +2222,8 @@
 		gBoardId = CUSTOMER_BOARD_ID0;
 	#elif CONFIG_CUSTOMER_BOARD_1
 		gBoardId = CUSTOMER_BOARD_ID1;
+	#elif CONFIG_CLEARFOG_BOARD
+		gBoardId = A38X_CLEARFOG_BOARD_ID;
 	#endif
 #else /* !CONFIG_CUSTOMER_BOARD_SUPPORT */
 	/* Temporarily set generic board struct pointer, to set/get EEPROM i2c address, and read board ID */
diff --git a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec.h b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec.h
index 00d95a7..86983ee 100644
--- a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec.h
+++ b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec.h
@@ -83,7 +83,8 @@
 #define A38X_CUTOMER_BOARD_ID_BASE		0x0
 #define A38X_CUSTOMER_BOARD_ID0			(A38X_CUTOMER_BOARD_ID_BASE + 0)
 #define A38X_CUSTOMER_BOARD_ID1			(A38X_CUTOMER_BOARD_ID_BASE + 1)
-#define A38X_MV_MAX_CUSTOMER_BOARD_ID		(A38X_CUTOMER_BOARD_ID_BASE + 2)
+#define A38X_CLEARFOG_BOARD_ID			(A38X_CUTOMER_BOARD_ID_BASE + 2)
+#define A38X_MV_MAX_CUSTOMER_BOARD_ID		(A38X_CUTOMER_BOARD_ID_BASE + 3)
 #define A38X_MV_CUSTOMER_BOARD_NUM		(A38X_MV_MAX_CUSTOMER_BOARD_ID - A38X_CUTOMER_BOARD_ID_BASE)
 
 /* Armada-38x Marvell boards */
diff --git a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec38x.c b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec38x.c
index 852db1a..7fd5ca2 100644
--- a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec38x.c
+++ b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec38x.c
@@ -66,6 +66,7 @@
 #include "boardEnv/mvBoardEnvSpec.h"
 #include "twsi/mvTwsi.h"
 #include "pex/mvPexRegs.h"
+#include "gpp/mvGppRegs.h"
 
 /***************************************** Customer Boards *****************************************/
 /*******************************************************************************
@@ -271,6 +272,7 @@
 	{1, 3, 0xC0}  /* Output Data, register#1 */
 };
 
+
 MV_BOARD_GPP_INFO armada_38x_customer_1_GppInfo[] = {
 	/* {{MV_BOARD_GPP_CLASS	devClass, MV_U8	gppPinNum}} */
 /* USB_Host0 *//* //{BOARD_GPP_USB_VBUS,    44},*/ /* from MPP map */
@@ -353,12 +355,175 @@
 	.switchInfoNum			= 0
 };
 
+/*******************************************************************************
+ * A38x SolidRun ClearFog
+ *******************************************************************************/
+MV_BOARD_TWSI_INFO armada_38x_clearfog_BoardTwsiDev[] = {
+	/* {{MV_BOARD_DEV_CLASS devClass, MV_U8 devClassId,  MV_U8 twsiDevAddr, MV_U8 twsiDevAddrType}} */
+	{ BOARD_TWSI_IO_EXPANDER,	0,	0x20, ADDR7_BIT, MV_FALSE},
+};
+MV_BOARD_MAC_INFO armada_38x_clearfog_BoardMacInfo[] = {
+	/* {{MV_BOARD_MAC_SPEED boardMacSpeed, MV_32 boardEthSmiAddr ,
+	   MV_32 boardEthSmiAddr0 , MV_BOOL boardMacEnabled;}} */
+	{ BOARD_MAC_SPEED_AUTO, 0x0, 0x0, MV_TRUE},
+	{ BOARD_MAC_SPEED_1000M, -1, -1, MV_TRUE},
+	{ BOARD_MAC_SPEED_AUTO,  -1,  -1, MV_TRUE}
+};
+
+MV_DEV_CS_INFO armada_38x_clearfog_BoardDeCsInfo[] = {
+	/*{deviceCS, params, devType, devWidth, busWidth, busNum, active }*/
+	{ DEVICE_CS0,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
+	{ DEVICE_CS1,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
+	{ DEVICE_CS2,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
+	{ DEVICE_CS3,	N_A, BOARD_DEV_NAND_FLASH,	8,	8,	0,	MV_FALSE },	/* NAND DEV */
+	{ DEV_BOOCS,	N_A, BOARD_DEV_NOR_FLASH,	16,	16,	0,	MV_FALSE },	/* NOR DEV */
+	{ SPI0_CS0,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	0,	MV_FALSE },	/* SPI0 DEV */
+	{ SPI0_CS1,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	0,	MV_FALSE },	/* SPI0 DEV */
+	{ SPI0_CS2,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	0,	MV_FALSE },	/* SPI0 DEV */
+	{ SPI0_CS3,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	0,	MV_FALSE },	/* SPI0 DEV */
+	{ SPI1_CS0,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_TRUE },	/* SPI1 DEV */
+	{ SPI1_CS1,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_FALSE },	/* SPI1 DEV */
+	{ SPI1_CS2,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_FALSE },	/* SPI1 DEV */
+	{ SPI1_CS3,		N_A, BOARD_DEV_SPI_FLASH,	8,	8,	1,	MV_FALSE }	/* SPI1 DEV */
+};
+
+MV_BOARD_MPP_INFO armada_38x_clearfog_BoardMppConfigValue[] = {
+	{ {
+		A38x_CLEARFOG_BOARD_MPP0_7,
+		A38x_CLEARFOG_BOARD_MPP8_15,
+		A38x_CLEARFOG_BOARD_MPP16_23,
+		A38x_CLEARFOG_BOARD_MPP24_31,
+		A38x_CLEARFOG_BOARD_MPP32_39,
+		A38x_CLEARFOG_BOARD_MPP40_47,
+		A38x_CLEARFOG_BOARD_MPP48_55,
+		A38x_CLEARFOG_BOARD_MPP56_63,
+	} }
+};
+
+struct MV_BOARD_IO_EXPANDER armada_38x_clearfog_IoExpanderInfo[] = {
+	{0, 2, 0x40}, /* Deassert both mini pcie reset signals */
+	{0, 6, 0xf9},
+	{0, 2, 0x46}, /* Assert reset signals and enable USB3 current limiter */
+	{0, 6, 0xb9},
+	{0, 3, 0x0}, /* Set SFP_TX_DIS to zero */
+	{0, 7, 0xbf}, /* Drive SFP_TX_DIS to zero */
+};
+
+MV_BOARD_USB_INFO armada_38x_clearfog_InfoBoardUsbInfo[] = {
+/* {MV_UNIT_ID usbType, MV_U8 usbPortNum, MV_BOOL isActive} */
+	{ USB3_UNIT_ID, 0, MV_TRUE},
+	{ USB3_UNIT_ID, 1, MV_TRUE},    /* xHCI port#1 connected only via USB2.0 UTMI (not via USB3.0 SerDes lane) */
+	{ USB_UNIT_ID,  0, MV_TRUE},
+};
+
+struct MV_BOARD_SWITCH_INFO armada_38x_clearfog_InfoSwitchInfo[] = {
+	{
+		.isEnabled = MV_TRUE,
+		.isCpuPortRgmii = MV_FALSE,
+		.switchIrq = -1,	/* set to -1 for using PPU*/
+		.switchPort = {0, 1, 2, 3, 4, 5, 6},
+		.cpuPort = 5,
+		.connectedPort = {-1, 5, -1},
+		.smiScanMode = MV_SWITCH_SMI_MULTI_ADDR_MODE,
+		.quadPhyAddr = 4,
+		.forceLinkMask = 0x60
+	}
+};
+
+MV_BOARD_IO_EXPANDER_TYPE_INFO armada_38x_clearfog_ioExpPinInfo[] = {
+/*	{ IO Type enum,			bit offset, Io.exp num,		reg Num */
+	{ MV_IO_EXPANDER_USB_VBUS,	6,		0,		2} /* VBUS_EN: IO.exp#1 (0x21), reg #3, bit 7 */
+};
+
+void A38x_CLEARFOG_BOARD_gpp_callback(MV_BOARD_INFO *board) {
+	/* Toggle GPIO41 to reset on-board switch and phy */
+	/* Set GPIO41 as output enabled */
+	MV_REG_BIT_RESET (GPP_DATA_OUT_REG(1), BIT9);
+	/* reset output value */
+	MV_REG_BIT_RESET (GPP_DATA_OUT_EN_REG(1), BIT9);
+	/* set output value */
+	mvOsDelay(1);
+	MV_REG_BIT_SET (GPP_DATA_OUT_EN_REG(1), BIT9);
+	mvOsDelay(10);
+
+	/* update on-Board IO expander with pre-defined values:
+	 * USB3 current limiter, and SFP_TX_DIS, Deassert and assert 2*mini PCIe reset signals, */
+	mvBoardIoExpanderUpdate();
+}
+
+MV_BOARD_INFO armada_38x_clearfog_board_info = {
+	.boardName				= "SolidRun ClearFog-A1 REV2.0",
+	.numBoardNetComplexValue		= 0,
+	.pBoardNetComplexInfo			= NULL,
+	.pBoardMppConfigValue			= armada_38x_clearfog_BoardMppConfigValue,
+	.intsGppMaskLow				= 0,
+	.intsGppMaskMid				= 0,
+	.intsGppMaskHigh			= 0,
+	.numBoardDeviceIf			= ARRSZ(armada_38x_clearfog_BoardDeCsInfo),
+	.pDevCsInfo					= armada_38x_clearfog_BoardDeCsInfo,
+	.numBoardTwsiDev			= ARRSZ(armada_38x_clearfog_BoardTwsiDev),
+	.pBoardTwsiDev				= armada_38x_clearfog_BoardTwsiDev,
+	.numBoardMacInfo			= ARRSZ(armada_38x_clearfog_BoardMacInfo),
+	.pBoardMacInfo				= armada_38x_clearfog_BoardMacInfo,
+	.numBoardGppInfo			= 0,
+	.pBoardGppInfo				= 0,
+	.numBoardIoExpPinInfo			= ARRSZ(armada_38x_clearfog_ioExpPinInfo),
+	.pBoardIoExpPinInfo			= armada_38x_clearfog_ioExpPinInfo,
+	.activeLedsNumber			= 0,
+	.pLedGppPin				= NULL,
+	.ledsPolarity				= 0,
+
+	/* PMU Power */
+	.pmuPwrUpPolarity			= 0,
+	.pmuPwrUpDelay				= 80000,
+
+	/* GPP values */
+	.gppOutEnValLow				= A38x_CLEARFOG_BOARD_GPP_OUT_ENA_LOW,
+	.gppOutEnValMid				= A38x_CLEARFOG_BOARD_GPP_OUT_ENA_MID,
+	.gppOutValLow				= A38x_CLEARFOG_BOARD_GPP_OUT_VAL_LOW,
+	.gppOutValMid				= A38x_CLEARFOG_BOARD_GPP_OUT_VAL_MID,
+	.gppPolarityValLow			= A38x_CLEARFOG_BOARD_GPP_POL_LOW,
+	.gppPolarityValMid			= A38x_CLEARFOG_BOARD_GPP_POL_MID,
+	.gppPostConfigCallBack			= A38x_CLEARFOG_BOARD_gpp_callback,
+
+	/* TDM */
+	.numBoardTdmInfo			= {},
+	.pBoardTdmInt2CsInfo			= {},
+	.boardTdmInfoIndex			= -1,
+
+	.pBoardSpecInit				= NULL,
+
+	.pBoardUsbInfo				= armada_38x_clearfog_InfoBoardUsbInfo,
+	.numBoardUsbInfo			= ARRSZ(armada_38x_clearfog_InfoBoardUsbInfo),
+
+	/* NAND init params */
+	.nandFlashReadParams			= 0,
+	.nandFlashWriteParams			= 0,
+	.nandFlashControl			= 0,
+	.nandIfMode					= NAND_IF_NFC,
+
+	.isSdMmcConnected			= MV_TRUE,
+
+	/* NOR init params */
+	.norFlashReadParams			= 0,
+	.norFlashWriteParams			= 0,
+	/* Enable modules auto-detection. */
+	.configAutoDetect			= MV_FALSE,
+	.numIoExp				= ARRSZ(armada_38x_clearfog_IoExpanderInfo),
+	.pIoExp					= armada_38x_clearfog_IoExpanderInfo,
+	.boardOptionsModule			= MV_MODULE_NO_MODULE,
+	.isAmc					= MV_FALSE,
+	.pSwitchInfo				= armada_38x_clearfog_InfoSwitchInfo,
+	.switchInfoNum				= ARRSZ(armada_38x_clearfog_InfoSwitchInfo)
+};
+
 /*
  * All supported A380 customer boards
  */
 MV_BOARD_INFO *customerBoardInfoTbl[] = {
 	&armada_38x_customer_board_0_info,
-	&armada_38x_customer_board_1_info
+	&armada_38x_customer_board_1_info,
+	&armada_38x_clearfog_board_info
 };
 
 
diff --git a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec38x.h b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec38x.h
index 8b65364..45bab59 100644
--- a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec38x.h
+++ b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvSpec38x.h
@@ -119,6 +119,29 @@
 #define A38x_CUSTOMER_BOARD_1_GPP_POL_LOW		0x0
 #define A38x_CUSTOMER_BOARD_1_GPP_POL_MID		0x0
 
+
+/******************************* SolidRun Board *******************************/
+/*******************************************************************************
+ * SolidRun ClearFog-A1 REV2.0 */
+/******************************************************************************/
+#define A38x_CLEARFOG_BOARD_MPP0_7			0x11111111
+#define A38x_CLEARFOG_BOARD_MPP8_15			0x11111111
+#define A38x_CLEARFOG_BOARD_MPP16_23		0x10460011
+#define A38x_CLEARFOG_BOARD_MPP24_31		0x22043333
+#define A38x_CLEARFOG_BOARD_MPP32_39		0x44400002
+#define A38x_CLEARFOG_BOARD_MPP40_47		0x41144004
+#define A38x_CLEARFOG_BOARD_MPP48_55		0x45333333
+#define A38x_CLEARFOG_BOARD_MPP56_63		0x00004444
+
+#define A38x_CLEARFOG_BOARD_GPP_OUT_ENA_LOW	0xFFFFFFFF
+#define A38x_CLEARFOG_BOARD_GPP_OUT_ENA_MID	0xFFFFFFFF
+
+#define A38x_CLEARFOG_BOARD_GPP_OUT_VAL_LOW	0x0
+#define A38x_CLEARFOG_BOARD_GPP_OUT_VAL_MID	0x0
+#define A38x_CLEARFOG_BOARD_GPP_POL_LOW		0x0
+#define A38x_CLEARFOG_BOARD_GPP_POL_MID		0x0
+
+
 /******************************* Marvell Boards *******************************/
 
 /*******************************************************************************
diff --git a/boards.cfg b/boards.cfg
index 73fcd9a..a2159f8 100644
--- a/boards.cfg
+++ b/boards.cfg
@@ -54,6 +54,7 @@
 armada_38x                   arm         armv7       a38x                mv_ebu         mvca9        armada_38x:ARMADA_38X
 armada_38x_customer0         arm         armv7       a38x                mv_ebu         mvca9        armada_38x:CUSTOMER_BOARD_0,ARMADA_38X
 armada_38x_customer1         arm         armv7       a38x                mv_ebu         mvca9        armada_38x:CUSTOMER_BOARD_1,ARMADA_38X
+armada_38x_clearfog          arm         armv7       a38x                mv_ebu         mvca9        armada_38x:CLEARFOG_BOARD,ARMADA_38X
 armada_39x                   arm         armv7       a38x                mv_ebu         mvca9        armada_38x:ARMADA_39X
 armada_39x_customer0         arm         armv7       a38x                mv_ebu         mvca9        armada_38x:CUSTOMER_BOARD_0,ARMADA_39X
 armada_39x_customer1         arm         armv7       a38x                mv_ebu         mvca9        armada_38x:CUSTOMER_BOARD_1,ARMADA_39X
diff --git a/build.pl b/build.pl
index be9e5b9..e9712f9 100755
--- a/build.pl
+++ b/build.pl
@@ -13,7 +13,7 @@
 	print "Options:\n";
 	print "\t-f\tBoot device. Accepts spi, nor, nand, mmc\n";
 	print "\t-b\tBoard type. Accepts:\tavanta_lp , avanta_lp_customer0 , avanta_lp_customer1\n";
-	print "\t\t\t\t\tarmada_38x, armada_38x_customer0, armada_38x_customer1\n";
+	print "\t\t\t\t\tarmada_38x, armada_38x_clearfog, armada_38x_customer0, armada_38x_customer1\n";
 	print "\t\t\t\t\tarmada_39x, armada_39x_customer0, armada_39x_customer1\n";
 	print "\t\t\t\t\tarmada_375, armada_375_customer0, armada_375_customer1\n";
 	print "\t\t\t\t\tbobcat2_db, bobcat2_rd, bobcat2_customer0, bobcat2_customer1\n";
@@ -93,6 +93,7 @@
 	($opt_b eq "armada_375_customer0") or
 	($opt_b eq "armada_375_customer1") or
 	($opt_b eq "armada_38x") or
+	($opt_b eq "armada_38x_clearfog") or
 	($opt_b eq "armada_38x_customer0") or
 	($opt_b eq "armada_38x_customer1") or
 	($opt_b eq "armada_39x") or
@@ -137,10 +138,11 @@
 		$boardID="msys-ac3";
 		$targetBoard = substr $board, 8;
 	}
-	# if board string contains "customer", use customer define for binary_header
-	if (index($board, "customer") != -1){
+	# if board string contains "customer" (Or A38x-SolidRun Clear fog board), use customer define for binary_header
+	if ((index($board, "customer") != -1) or (index($board, "clearfog") != -1)) {
 		system("echo \"#define CONFIG_CUSTOMER_BOARD_SUPPORT 1\" >> include/config.h");
 	}
+
 }
 else
 {
diff --git a/include/configs/armada_38x.h b/include/configs/armada_38x.h
index 3bfe102..9ef8da3 100644
--- a/include/configs/armada_38x.h
+++ b/include/configs/armada_38x.h
@@ -68,7 +68,7 @@
 #define MV_DDR_64BIT
 #define MV_BOOTROM
 
-#if defined (CONFIG_CUSTOMER_BOARD_0) || defined (CONFIG_CUSTOMER_BOARD_1)
+#if defined (CONFIG_CUSTOMER_BOARD_0) || defined (CONFIG_CUSTOMER_BOARD_1) || defined (CONFIG_CLEARFOG_BOARD)
 #define CONFIG_CUSTOMER_BOARD_SUPPORT
 #endif
 
@@ -508,8 +508,13 @@
 	#define CONFIG_DOS_PARTITION
 	#define CONFIG_ISO_PARTITION
 	#define ENV_USB0_MODE   "host"
+#ifdef CONFIG_CLEARFOG_BOARD
+	#define ENV_USB_ACTIVE        "1"
+	#define ENV_USB_MODE          "3"	/* 3 = USB3.0 | 2 = USB2.0 */
+#else
 	#define ENV_USB_ACTIVE        "0"
 	#define ENV_USB_MODE          "2"	/* 3 = USB3.0 | 2 = USB2.0 */
+#endif
 
 	#define CONFIG_USB_HOST_ETHER
 	#define CONFIG_USB_ETHER_ASIX
diff --git a/tools/marvell/bin_hdr/base.mk b/tools/marvell/bin_hdr/base.mk
index 98527d2..9f8404b 100755
--- a/tools/marvell/bin_hdr/base.mk
+++ b/tools/marvell/bin_hdr/base.mk
@@ -83,6 +83,9 @@
 ifeq "$(CONFIG_CUSTOMER_BOARD_1)"  "y"
   CFLAGS += -DCONFIG_CUSTOMER_BOARD_1
 endif
+ifeq "$(CONFIG_CLEARFOG_BOARD)"  "y"
+  CFLAGS += -DCONFIG_CLEARFOG_BOARD
+endif
 
 # AXP
 ifeq "$(CONFIG_DB_78x60_BP_REV2)"  "y"
diff --git a/tools/marvell/bin_hdr/inc/ddr3_soc/a38x/ddr3_a38x.h b/tools/marvell/bin_hdr/inc/ddr3_soc/a38x/ddr3_a38x.h
index 8271286..c191552 100644
--- a/tools/marvell/bin_hdr/inc/ddr3_soc/a38x/ddr3_a38x.h
+++ b/tools/marvell/bin_hdr/inc/ddr3_soc/a38x/ddr3_a38x.h
@@ -76,15 +76,23 @@
 #define MV_DDR_TOPOLOGY_UPDATE_FROM_TWSI
 #endif
 
-#define CONFIG_AVS_FROM_EFUSE /* Read pre-burnt EFUSE values, to derive requested AVS value for current chip */
+#ifndef CONFIG_CLEARFOG_BOARD /* clear fog board has no pre-burnt AVS values on EFUSE */
+	#define CONFIG_AVS_FROM_EFUSE /* Read pre-burnt EFUSE values, to derive requested AVS value for current chip */
+#endif
 #define ECC_SUPPORT
 
 /*Controler bus divider 1 for 32 bit, 2 for 64 bit*/
 #define MV_DDR_CONTROLLER_BUS_WIDTH_MULTIPLIER		1
 
 /*Tune internal training params values*/
-#define MV_TUNE_TRAINING_PARAMS_CK_DELAY 		160
-#define MV_TUNE_TRAINING_PARAMS_PHYREG3VAL		0xA
+#ifdef CONFIG_CLEARFOG_BOARD
+	/* SolidRun Armada 38x MicroSOM has short traces on it's DDR clock.
+	   using increased internal delay inside the SoC to compensate for that */
+	#define MV_TUNE_TRAINING_PARAMS_CK_DELAY 	260
+#else
+	#define MV_TUNE_TRAINING_PARAMS_CK_DELAY 	160
+#endif
+#define MV_TUNE_TRAINING_PARAMS_PHYREG3VAL	0xA
 
 #define MV_TUNE_TRAINING_PARAMS_PRI_DATA	123
 #define MV_TUNE_TRAINING_PARAMS_NRI_DATA	123
diff --git a/tools/marvell/bin_hdr/inc/ddr3_soc/a38x/ddr3_a38x_topology.h b/tools/marvell/bin_hdr/inc/ddr3_soc/a38x/ddr3_a38x_topology.h
index d18ed3c..bbea7ec 100755
--- a/tools/marvell/bin_hdr/inc/ddr3_soc/a38x/ddr3_a38x_topology.h
+++ b/tools/marvell/bin_hdr/inc/ddr3_soc/a38x/ddr3_a38x_topology.h
@@ -82,6 +82,8 @@
 	#define BUS_WIDTH_CUST_BOARD_1		BUS_WIDTH_8
 	#define SPEED_BIN_DDR_CUST_BOARD_2	SPEED_BIN_DDR_1866L
 	#define BUS_WIDTH_CUST_BOARD_2		BUS_WIDTH_8
+	#define SPEED_BIN_DDR_CLEARFOG_BOARD	SPEED_BIN_DDR_1600K
+	#define BUS_WIDTH_CLEARFOG_BOARD	BUS_WIDTH_16
 
 	#define SPEED_BIN_DDR_DB_68XX		SPEED_BIN_DDR_1866L
 	#define BUS_WIDTH_DB_68XX			BUS_WIDTH_8
@@ -112,12 +114,19 @@
 	{{{{0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}}, SPEED_BIN_DDR_CUST_BOARD_1, BUS_WIDTH_CUST_BOARD_1 , MEM_4G, DDR_FREQ_800, 0 ,   0 , MV_HWS_TEMP_LOW}},
     INTERFACE_BUS_MASK_32BIT  /* Buses mask */
     },
-    /* 2nd Customer board */
+    /* 2nd Customer board  - GP Board*/
     {
     0x1, /* active interfaces */
     /*cs_mask, mirror, dqs_swap, ck_swap X PUPs                                     speed_bin             memory_device_width  mem_size     frequency  casL casWL      temperature */
 	{{{{0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}}, SPEED_BIN_DDR_CUST_BOARD_2, BUS_WIDTH_CUST_BOARD_2 , MEM_4G, DDR_FREQ_800, 0 ,   0 , MV_HWS_TEMP_LOW}},
     INTERFACE_BUS_MASK_32BIT  /* Buses mask */
+    },
+    /* 3rd Customer board  -  SolidRun ClearFog-A1 REV2.0 */
+    {
+    0x1, /* active interfaces */
+    /*cs_mask, mirror, dqs_swap, ck_swap X PUPs                                     speed_bin             memory_device_width  mem_size     frequency  casL casWL      temperature */
+	{{{{0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}, {0x1,0,0,0}}, SPEED_BIN_DDR_CLEARFOG_BOARD, BUS_WIDTH_CLEARFOG_BOARD , MEM_4G, DDR_FREQ_800, 0 ,   0 , MV_HWS_TEMP_LOW}},
+    INTERFACE_BUS_MASK_32BIT  /* Buses mask */
     }
 };
 
diff --git a/tools/marvell/bin_hdr/platform/sysEnv/a38x/mvSysEnvLib.c b/tools/marvell/bin_hdr/platform/sysEnv/a38x/mvSysEnvLib.c
index a0b908c..f92887c 100755
--- a/tools/marvell/bin_hdr/platform/sysEnv/a38x/mvSysEnvLib.c
+++ b/tools/marvell/bin_hdr/platform/sysEnv/a38x/mvSysEnvLib.c
@@ -329,6 +329,8 @@
 		gBoardId = CUSTOMER_BOARD_ID0;
 	#elif CONFIG_CUSTOMER_BOARD_1
 		gBoardId = CUSTOMER_BOARD_ID1;
+	#elif CONFIG_CLEARFOG_BOARD
+		gBoardId = A38X_CLEARFOG_BOARD_ID;
 	#endif
 #else
 	/* For Marvell Boards: read board ID from TWSI*/
diff --git a/tools/marvell/bin_hdr/platform/sysEnv/a38x/mvSysEnvLib.h b/tools/marvell/bin_hdr/platform/sysEnv/a38x/mvSysEnvLib.h
index 640b3b3..66f6138 100755
--- a/tools/marvell/bin_hdr/platform/sysEnv/a38x/mvSysEnvLib.h
+++ b/tools/marvell/bin_hdr/platform/sysEnv/a38x/mvSysEnvLib.h
@@ -293,7 +293,8 @@
 #define A38X_CUSTOMER_BOARD_ID_BASE		0x0
 #define A38X_CUSTOMER_BOARD_ID0			(A38X_CUSTOMER_BOARD_ID_BASE + 0)
 #define A38X_CUSTOMER_BOARD_ID1			(A38X_CUSTOMER_BOARD_ID_BASE + 1)
-#define A38X_MV_MAX_CUSTOMER_BOARD_ID		(A38X_CUSTOMER_BOARD_ID_BASE + 2)
+#define A38X_CLEARFOG_BOARD_ID			(A38X_CUSTOMER_BOARD_ID_BASE + 2)
+#define A38X_MV_MAX_CUSTOMER_BOARD_ID		(A38X_CUSTOMER_BOARD_ID_BASE + 3)
 #define A38X_MV_CUSTOMER_BOARD_NUM		(A38X_MV_MAX_CUSTOMER_BOARD_ID - A38X_CUSTOMER_BOARD_ID_BASE)
 
 /* Marvell boards for A38x*/
@@ -488,11 +489,13 @@
 #define MV_BOARD_WAKEUP_GPIO_INFO {\
 {A38X_CUSTOMER_BOARD_ID0,	-1 },\
 {A38X_CUSTOMER_BOARD_ID0,	-1 },\
+{A38X_CLEARFOG_BOARD_ID,	-1 },\
 };
 
 #define MV_BOARD_USB_VBUS_GPIO_INFO {\
 {A38X_CUSTOMER_BOARD_ID0, {-1, -1} },\
 {A38X_CUSTOMER_BOARD_ID0, {-1, -1} },\
+{A38X_CLEARFOG_BOARD_ID, {-1, -1} },\
 };
 #else
 #define MV_BOARD_WAKEUP_GPIO_INFO {\
diff --git a/tools/marvell/bin_hdr/src_phy/a38x/mvHighSpeedTopologySpec-38x.c b/tools/marvell/bin_hdr/src_phy/a38x/mvHighSpeedTopologySpec-38x.c
index 5437807..ec2c65f 100755
--- a/tools/marvell/bin_hdr/src_phy/a38x/mvHighSpeedTopologySpec-38x.c
+++ b/tools/marvell/bin_hdr/src_phy/a38x/mvHighSpeedTopologySpec-38x.c
@@ -93,6 +93,14 @@
 	{ SATA3,		__3Gbps,	SERDES_DEFAULT_MODE,		MV_FALSE,	MV_FALSE },
 	{ SATA2,		__3Gbps,	SERDES_DEFAULT_MODE,		MV_FALSE,	MV_FALSE },
 	{ USB3_HOST1,	__5Gbps,	SERDES_DEFAULT_MODE,		MV_FALSE,	MV_FALSE }
+},
+{	/* SolidRun ClearFog-A1 REV2.0 Topology */
+	{ SATA0,	__3Gbps,	SERDES_DEFAULT_MODE,		MV_FALSE,	MV_FALSE },
+	{ SGMII1,	__1_25Gbps,	SERDES_DEFAULT_MODE,		MV_FALSE,	MV_FALSE },
+	{ PEX1,	  	__5Gbps,	PEX_ROOT_COMPLEX_x1,		MV_FALSE,	MV_FALSE },
+	{ USB3_HOST1,	__5Gbps,	SERDES_DEFAULT_MODE,		MV_FALSE,	MV_FALSE },
+	{ PEX2,	  	__5Gbps,	PEX_ROOT_COMPLEX_x1,		MV_FALSE,	MV_FALSE },
+	{ SGMII2,	__1_25Gbps,	SERDES_DEFAULT_MODE,		MV_FALSE,	MV_FALSE }
 }};
 
 
@@ -125,6 +133,7 @@
 {
 	loadTopologyCustomer,   	  /* Customer Board 0 */
 	loadTopologyCustomer,   	  /* Customer Board 1*/
+	loadTopologyCustomer,   	  /* SolidRun ClearFog Board */
 };
 
 #else /* CONFIG_CUSTOMER_BOARD_SUPPORT */