avs: a38x: add EEPROM field to disable AVS values from EFUSE

	Added EEPROM field 'avsskip' to disable AVS value read from EFUSE
	To be able to use the board when having problematic pre-burnt AVS
	value in EEPROM

Change-Id: Idc81c67b12af10bb252b4daad48e86a2d8f5efee
Signed-off-by: Bassel Saba <basselsa@marvell.com>
Reviewed-on: http://vgitil04.il.marvell.com:8080/22054
Reviewed-by: Omri Itach <omrii@marvell.com>
Tested-by: Star_Automation <star@marvell.com>
(cherry picked from commit 51fce8fde6acfe833e81413ff943528fd9d958fc)
Reviewed-on: http://vgitil04.il.marvell.com:8080/22162
diff --git a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvLib38x.h b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvLib38x.h
index 50b3929..ab8b420 100644
--- a/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvLib38x.h
+++ b/board/mv_ebu/a38x/armada_38x_family/boardEnv/mvBoardEnvLib38x.h
@@ -134,6 +134,7 @@
 	MV_SATR_TDM_CONNECTED,
 	MV_SATR_TDM_PLACE_HOLDER,
 	MV_SATR_BOARD_SPEED,
+	MV_SATR_AVS_SKIP,
 	MV_SATR_MAX_OPTION,
 } MV_SATR_TYPE_ID;
 
@@ -167,10 +168,13 @@
 {"flavor",	MV_SATR_FULL_FLAVOR,		0x10,	4,	0,	2,	{0, 1, 0, 1, 1, 1, 0}, 0},\
 {"tdm",		MV_SATR_TDM_CONNECTED,		0x20,	5,	0,	2,	{0, 1, 0, 0, 0, 0, 0}, 0},\
 {"tdmplaceholder",	MV_SATR_TDM_PLACE_HOLDER,	0x40,	6,	0,	2,	{0, 0, 0, 0, 0, 0, 0}, 0},\
+{"avsskip",	MV_SATR_AVS_SKIP,		0x80,	7,	0,	2,	{0, 1, 0, 1, 1, 1, 1}, 0},\
 {"boardspeed",	MV_SATR_BOARD_SPEED,		0x3,	0,	0,	3,	{0, 1, 0, 1, 1, 0, 1}, SATR_READ_ONLY},\
 {"max_option",	MV_SATR_MAX_OPTION,		0x0,	0,	0,	0,	{0, 0, 0, 0, 0, 0, 0}, 0},\
 };
 /* tdm place holder is used for future support for multiple tdm devices */
+/* avsskip is used to skip selecting AVS from EFUSE:
+ *	- used in binary header by Marvell boards only*/
 
 /* extra SAR table, for different board implementations:
  * in case a field is used on 2 boards with different i2c mapping */
diff --git a/board/mv_ebu/a38x/cmd_sar38x.c b/board/mv_ebu/a38x/cmd_sar38x.c
index 50d3e68..ff36066 100755
--- a/board/mv_ebu/a38x/cmd_sar38x.c
+++ b/board/mv_ebu/a38x/cmd_sar38x.c
@@ -47,7 +47,7 @@
 	MV_SATR_TYPE_ID satrId;
 	MV_U32 defauleValueForBoard[MV_MARVELL_BOARD_NUM];
 } MV_BOARD_SATR_DEFAULT;
-#define MAX_DEFAULT_ENTRY	22
+#define MAX_DEFAULT_ENTRY	23
 MV_BOARD_SATR_DEFAULT boardSatrDefault[MAX_DEFAULT_ENTRY] = {
 /* 	defauleValueForBoard[] = RD_NAS_68xx,	DB_BP_68xx,	RD_WAP_68xx,	DB_AP_68xx , DB_GP_68xx,  DB_BP_6821,	DB-AMC */
 { MV_SATR_CPU_DDR_L2_FREQ,	{0x0c,		0x0c,		0x0c,		0x0c,		0x0c,	  0x4,		0x0c}},
@@ -70,6 +70,7 @@
 { MV_SATR_TDM_CONNECTED,	{0,		1,		0,		0,		0,	  0,		0} },
 { MV_SATR_TDM_PLACE_HOLDER,	{0,		1,		0,		0,		0,	  0,		0} },
 { MV_SATR_BOARD_SPEED,		{0,		0x1,		0,		0x1,		0x1,	  0,		0x1} },
+{ MV_SATR_AVS_SKIP,		{0,		0x1,		0,		0x1,		0x1,	  0x1,		0x1} },
 {MV_SATR_BOOT_DEVICE,           {0,             0,              0,		0,		0,	  0,		0} },/* Dummy entry: default value taken from S@R register */
 {MV_SATR_BOOT2_DEVICE,          {0,             0,              0,		0,		0,	  0,		0} },/* Dummy entry: default value taken from S@R register */
 };
@@ -343,6 +344,11 @@
 		mvOsPrintf("\t0 = Connected\n");
 		mvOsPrintf("\t1 = Not connected\n ");
 		break;
+	case MV_SATR_AVS_SKIP:
+		mvOsPrintf("Indicates whether to skip AVS update from EFUSE or not:\n");
+		mvOsPrintf("\t0 = Do not skip AVS update from EFUSE\n");
+		mvOsPrintf("\t1 = Skip AVS update from EFUSE\n");
+		break;
 	case MV_SATR_BOARD_SPEED:
 		mvOsPrintf("Determines the max supported CPU speed:\n");
 		mvOsPrintf("\t1 = %uMHz\n", getBoardSpeed(1));
@@ -465,6 +471,9 @@
 	case MV_SATR_TDM_CONNECTED:
 		mvOsPrintf("tdm\t\t= %d  ==> TDM module is %s\n", tmp, (tmp == 0) ? "connected" : "not connected");
 		break;
+	case MV_SATR_AVS_SKIP:
+		mvOsPrintf("avsskip\t\t= %d  ==> %sskip AVS update from EFUSE\n", tmp, (tmp == 0) ? "Do not " : "");
+		break;
 	case MV_SATR_BOARD_SPEED:
 		mvOsPrintf("boardspeed\t\t= %d  ==> Max CPU speed is %uMHz\n", tmp, getBoardSpeed(tmp));
 		break;
@@ -661,6 +670,7 @@
 "ecoversion		   - DB-88F6820-BP: ECO version	(read only)\n"
 "boardid			   - board ID		(read only)\n"
 "boardspeed			   - MAX validated CPU mode for current chip		(read only)\n"
+"avsskip			   - Skip AVS from EFUSE update\n"
 
 "\n\t Board Specific SW fields\n"
 "\t------------------------\n"
diff --git a/tools/marvell/bin_hdr/src_init/a38x/generalInit.c b/tools/marvell/bin_hdr/src_init/a38x/generalInit.c
index 12fc0c7..cee999b 100644
--- a/tools/marvell/bin_hdr/src_init/a38x/generalInit.c
+++ b/tools/marvell/bin_hdr/src_init/a38x/generalInit.c
@@ -71,6 +71,7 @@
 #include "printf.h"
 #include "mvSysEnvLib.h"
 #include "soc_spec.h"
+#include "bin_hdr_twsi.h"
 
 /******************************************************************************************
 * mvDeviceIdConfig - set SoC Unit configuration and device ID according to detected flavour
@@ -138,6 +139,41 @@
 }
 
 #ifdef CONFIG_ARMADA_38X
+
+/*******************************************************************************
+* isSkippingAVSFromEfuse
+*
+* DESCRIPTION:
+*	read 'avsskip' field in EEPROM to detect whether to skip AVS
+*	selection from EFUSE, in order to add option to skip AVS selection
+*	with problematic AVS values in EEPROM
+* RETURN:
+*	MV_TRUE, if avsskip is 1
+*	MV_FALSE, otherwise.
+*
+*******************************************************************************/
+MV_BOOL isSkippingAVSFromEfuse()
+{
+	MV_TWSI_SLAVE twsiSlave;
+	MV_U8 data;
+
+	twsiSlave.slaveAddr.address = 0x57; // EEPROM Address
+	twsiSlave.slaveAddr.type = ADDR7_BIT;
+	twsiSlave.validOffset = MV_TRUE;
+	twsiSlave.moreThen256 = MV_TRUE;
+	twsiSlave.offset = 2;		/* SW EEPROM, register 2, bit 7 */
+
+	if (mvTwsiRead(0, &twsiSlave, &data, 1) != MV_OK) {
+		mvPrintf("%s: TWSI Read of 'avsskip' failed\n", __func__);
+		return MV_TRUE; /* skip AVS from EFUSE in case of error */
+	}
+	data >>= 7; /* BIT 7 */
+	if (data == 1)
+		return MV_TRUE;
+	else
+		return MV_FALSE;
+}
+
 /*******************************************************************************
 * mvGetAvsValFromEfuse
 *
@@ -174,7 +210,16 @@
 	MV_U32 versionVal, binVal, avsRegControlVal;
 	MV_BOARD_AVS_EFUSE_MAP efuse_freq_val[] = EFUSE_FREQ_VAL_INFO;
 	int i;
-
+#ifndef CONFIG_CUSTOMER_BOARD_SUPPORT
+	/* For Marvell boards only:
+	 * AVS configuration from EFUSE can be skipped for Marvell boards, for:
+		- Already existing SoCs which EFUSE was not pre-burnt with AVS values
+		- SoCs with invalid AVS EFUSE values */
+	if (isSkippingAVSFromEfuse() == MV_TRUE) {
+		mvPrintf("Skipping AVS selection from EFUSE (SatR field 'avsskip' = Yes)\n");
+		return MV_FALSE;
+	}
+#endif
 	/* Set Memory I/O window */
 	MV_REG_WRITE(AHB_TO_MBUS_WIN_CTRL_REG(EFUSE_WIN_ID), EFUSE_WIN_CTRL_VAL);
 	MV_REG_WRITE(AHB_TO_MBUS_WIN_BASE_REG(EFUSE_WIN_ID), EFUSE_WIN_BASE_VAL);
@@ -238,7 +283,7 @@
 	}
 	mvPrintf("Selected AVS value from eFuse: 0x%X (corresponding to frequency %uMHz) ",
 			*avsVal, efuse_freq_val[i].cpu_freq);
-	mvPrintf("version %u\n", versionVal);
+	mvPrintf("EFUSE version %u\n", versionVal);
 	return MV_TRUE;
 }
 #endif /* CONFIG_ARMADA_38X */
@@ -264,11 +309,12 @@
 #endif
 
 	/* Update AVS debug control register */
-    MV_REG_WRITE(AVS_DEBUG_CNTR_REG, AVS_DEBUG_CNTR_DEFAULT_VALUE);
-    MV_REG_WRITE(AVS_DEBUG_CNTR_REG, AVS_DEBUG_CNTR_DEFAULT_VALUE);
+	MV_REG_WRITE(AVS_DEBUG_CNTR_REG, AVS_DEBUG_CNTR_DEFAULT_VALUE);
+	MV_REG_WRITE(AVS_DEBUG_CNTR_REG, AVS_DEBUG_CNTR_DEFAULT_VALUE);
 
-    regData = MV_REG_READ(AVS_ENABLED_CONTROL);
+	regData = MV_REG_READ(AVS_ENABLED_CONTROL);
 	regData &= ~(AVS_LOW_VDD_LIMIT_MASK | AVS_HIGH_VDD_LIMIT_MASK);
+
 #ifdef CONFIG_ARMADA_38X
 	/* 1. Armada38x was signed off for 1600/800 at 1.15V (AVS)
 	 * 2. Based on ATE/system correlation, in order to achieve higher speeds (1866MHz, 2000MHz),
@@ -311,7 +357,6 @@
 	/* Device general configuration was not supported on a38x Z0 revision */
 	if (mvSysEnvDeviceRevGet() != MV_88F68XX_Z1_ID)
 		mvDeviceIdConfig();
-
 	mvSysEnvUsbVbusReset();
 
 	return MV_OK;