fix: bobk: add dynamic frequency selection for CorePll WA issue

    - The WA will take effect when HW SAR "coreclock" is set to bypass mode(7)
      in this mode, use a new field "bypass_coreclock" to select the core
      frequency in the WA.
    - Add 'bypass mode' setting in SatR field "coreclock"
    - Add SW SatR filed "bypass_coreclock" to select the frequency in
      bypass mode, which located at eeprom reg#6 bits[2:0]
    - Add more frequency support in the WA according to SAR setting

Signed-off-by: Terry <bjzhou@marvell.com>
Change-Id: I69d750781f1f04c9e2ddc2138624e8acdf3d36a3
Reviewed-on: http://vgitil04.il.marvell.com:8080/22742
Tested-by: Star_Automation <star@marvell.com>
Reviewed-by: Omri Itach <omrii@marvell.com>
diff --git a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
index 9cd7b33..9893c0d 100755
--- a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
+++ b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
@@ -1725,6 +1725,75 @@
 	DB(mvOsPrintf("Board: Write core FreqOpt S@R succeeded\n"));
 	return MV_OK;
 }
+
+/*******************************************************************************
+* Read the new SW SatR field "bypass_coreclock" from EEPROM(0x50), reg#6 bits[2:0]
+*******************************************************************************/
+MV_STATUS mvBoardBypassCoreFreqGet(MV_U8 *value)
+{
+	MV_U8		sar0;
+	MV_STATUS	rc1;
+	MV_U16		family = mvCtrlDevFamilyIdGet(0);
+
+	if (family != MV_BOBK_DEV_ID) {
+		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
+		return MV_ERROR;
+	}
+
+	/* The Core Frequency in Bypass mode is taken from the first address-value pair of the EEPROM
+	   initialization sequence, In order to support normal TWSI init sequence flow, the first pair
+	   of DWORDS on EEPROM should contain an address (bytes 0-3) of some scratch pad register
+	   (for instance an UART SCR) and a value (bytes 4-7), which will be partially interpreted
+	   as Core Freq in bypass mode (bits[2:0] of byte 6)
+	*/
+
+	rc1 = mvBoardTwsiRead(BOARD_DEV_TWSI_INIT_EPROM, 0, 6, &sar0);
+	if (MV_ERROR == rc1)
+		return MV_ERROR;
+
+	*value = (sar0 & 0x7);
+
+	return MV_OK;
+}
+
+/*******************************************************************************
+* Write the new SW SatR field "bypass_coreclock" to EEPROM(0x50), reg#6 bits[2:0]
+*******************************************************************************/
+MV_STATUS mvBoardBypassCoreFreqSet(MV_U8 freqVal)
+{
+	MV_U8		sar0;
+	MV_STATUS	rc1;
+	MV_U16		family = mvCtrlDevFamilyIdGet(0);
+
+	if (family != MV_BOBK_DEV_ID) {
+		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
+		return MV_ERROR;
+	}
+
+	/* The Core Frequency in Bypass mode is taken from the first address-value pair of the EEPROM
+	   initialization sequence, In order to support normal TWSI init sequence flow, the first pair
+	   of DWORDS on EEPROM should contain an address (bytes 0-3) of some scratch pad register
+	   (for instance an UART SCR) and a value (bytes 4-7), which will be partially interpreted
+	   as Core Freq in bypass mode (bits[2:0] of byte 6)
+	*/
+
+	rc1 = mvBoardTwsiRead(BOARD_DEV_TWSI_INIT_EPROM, 0, 6, &sar0);
+	if (MV_ERROR == rc1)
+		return MV_ERROR;
+
+	sar0 &= ~0x7;
+	sar0 |= (freqVal & 0x7);
+
+	if (MV_OK != mvBoardTwsiWrite(BOARD_DEV_TWSI_INIT_EPROM, 0, 6, sar0)) {
+		DB(mvOsPrintf("Board: Write Bypass core Freq S@R fail\n"));
+		return MV_ERROR;
+	}
+
+
+	DB(mvOsPrintf("Board: Write Bypss core FreqOpt S@R succeeded\n"));
+	return MV_OK;
+}
+
 /*******************************************************************************/
 MV_STATUS mvBoardCpuFreqGet(MV_U8 *value)
 {
diff --git a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.h b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.h
index 343fbb3..d962a31 100755
--- a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.h
+++ b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.h
@@ -349,6 +349,8 @@
 MV_STATUS mvBoardDramBusWidthSet(MV_U16 conf);
 MV_U16 mvBoardDramBusWidthGet(MV_VOID);
 MV_STATUS mvBoardCoreFreqGet(MV_U8 *value);
+MV_STATUS mvBoardBypassCoreFreqGet(MV_U8 *value);
+MV_STATUS mvBoardBypassCoreFreqSet(MV_U8 freqVal);
 MV_STATUS mvBoardTmFreqGet(MV_U8 *value);
 MV_STATUS mvBoardTmFreqSet(MV_U8 freqVal);
 MV_STATUS mvBoardJtagCpuGet(MV_U8 *value);
diff --git a/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvRegs.h b/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvRegs.h
index d087b89..bc7c468 100644
--- a/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvRegs.h
+++ b/board/mv_ebu/msys/msys_family/ctrlEnv/mvCtrlEnvRegs.h
@@ -557,6 +557,12 @@
 		167, 133			\
 	}
 
+#define MV_BYPASS_CORE_CLK_TBL_BOBK	{	\
+		365, 220,			\
+		250, 200,			\
+		167					\
+	}
+
 #define MV_CORE_CLK_TBL_AC3	{	\
 		290, 250,			\
 		222, 167,			\