bc2: Enable Board ID field on EEPROM

	- Obtain the Board ID from the EEPROM instead of using the
	  compilation option (excepting customer boards).
	- Enable "boardid" SatR fild access on BC2 boards
	- Modify the BIN header for reading the board ID from EEPROM.
	- When the EEPROM is not present or the information stored
	  in EEPROM is invalid, assign a default board ID = 0, which
	  is a DB board ID for both AC3 and BC2 families.

Change-Id: Ibab1296f30c02c7c125effeb38596dbfdbb2abf6
Signed-off-by: kostap <kostap@marvell.com>
Reviewed-on: http://vgitil04.il.marvell.com:8080/19280
Tested-by: Star_Automation <star@marvell.com>
Reviewed-by: Omri Itach <omrii@marvell.com>
(cherry picked from commit c4217d92f78e92baf2cc9b9c7d0649a4541b39fb)
Reviewed-on: http://vgitil04.il.marvell.com:8080/19748
Tested-by: Omri Itach <omrii@marvell.com>
diff --git a/board/mv_ebu/msys/cmd_sar.c b/board/mv_ebu/msys/cmd_sar.c
index 512f7fc..30d6572 100644
--- a/board/mv_ebu/msys/cmd_sar.c
+++ b/board/mv_ebu/msys/cmd_sar.c
@@ -24,8 +24,13 @@
 #include "ctrlEnv/mvCtrlEnvLib.h"
 #include "boardEnv/mvBoardEnvLib.h"
 
-extern MV_BOARD_INFO *marvellAC3BoardInfoTbl[];
-
+#if defined CONFIG_ALLEYCAT3
+	extern MV_BOARD_INFO *marvellAC3BoardInfoTbl[];
+	MV_BOARD_INFO **mvMsysBoardInfoTbl = marvellAC3BoardInfoTbl;
+#else
+	extern MV_BOARD_INFO *marvellBC2BoardInfoTbl[];
+	MV_BOARD_INFO **mvMsysBoardInfoTbl = marvellBC2BoardInfoTbl;
+#endif
 /*
    bc2 sample and reset register
 #     4f       #     4e       #     4d       #      4c      #
@@ -53,9 +58,9 @@
 	CMD_AVS_MODE,
 	CMD_SLAVE_ADDR,
 	CMD_DEVICE_NUM,
-	CMD_BOARD_ID,
 	CMD_DDR_ECC_EN,
 #endif
+	CMD_BOARD_ID,
 	CMD_PCIE_MODE,
 	CMD_BOOTSRC,
 	CMD_DEVICE_ID,
@@ -74,6 +79,7 @@
 						   0,	/* OOB0 connection */
 						   0,	/* OOB1 connection */
 						   0,	/* Force AMC RC GEN1 PCIe */
+						   0,	/* Board ID */
 						   0,	/* PCIe mode */
 						   3,	/* Boot source */
 						   0 };	/* Device ID */
@@ -87,8 +93,8 @@
 						   1,	/* AVS Mode */
 						   1,	/* I2C/SMI Slave address */
 						   0,	/* Device number */
-						   0,	/* Board ID */
 						   0,	/* DDR ECC enable */
+						   0,	/* Board ID */
 						   0,	/* PCIe mode */
 						   3,	/* Boot source */
 						   0 };	/* Device ID */
@@ -156,11 +162,11 @@
 		return CMD_SLAVE_ADDR;
 	if (strcmp(cmd, "devicenum") == 0)
 		return CMD_DEVICE_NUM;
-	if (strcmp(cmd, "boardid") == 0)
-		return CMD_BOARD_ID;
 	if (strcmp(cmd, "ddreccenable") == 0)
 		return CMD_DDR_ECC_EN;
 #endif
+	if (strcmp(cmd, "boardid") == 0)
+		return CMD_BOARD_ID;
 	if (strcmp(cmd, "pcimode") == 0)
 		return CMD_PCIE_MODE;
 	if (strcmp(cmd, "bootsrc") == 0)
@@ -301,18 +307,18 @@
 		printf("\t|  1  |          1          |\n");
 		printf("\t-----------------------------\n");
 		break;
-	case CMD_BOARD_ID:
-		printf("Determines the board ID (0-7)\n");
-		printf("\t| ID  |      Board               |\n");
-		printf("\t----------------------------------\n");
-		for (i = 0; i < AC3_MARVELL_BOARD_NUM ; i++)
-			printf("\t|  %d  |  %-22s  |\n", i, marvellAC3BoardInfoTbl[i]->boardName );
-		printf("\t----------------------------------\n");
-		break;
 	case CMD_DEVICE_NUM:
 		printf("Determines the device number (0-3)\n");
 		break;
 #endif
+	case CMD_BOARD_ID:
+		printf("Determines the board ID (0-7)\n");
+		printf("\t| ID  |      Board               |\n");
+		printf("\t----------------------------------\n");
+		for (i = 0; i < MV_MARVELL_BOARD_NUM ; i++)
+			printf("\t|  %d  |  %-22s  |\n", i, mvMsysBoardInfoTbl[i]->boardName );
+		printf("\t----------------------------------\n");
+		break;
 	case CMD_PCIE_MODE:
 		printf("Determines the PCI-E mode:\n");
 		printf("\t| ID  |       Mode     |\n");
@@ -459,14 +465,14 @@
 			printf("devicenum Error: failed reading devicenum\n");
 		break;
 
+#endif
 	case CMD_BOARD_ID:
 		if (mvBoardSarBoardIdGet(&tmp) == MV_OK)
-			printf("boardid\t\t\t= %d ==>  %s\n", tmp, marvellAC3BoardInfoTbl[tmp]->boardName);
+			printf("boardid\t\t\t= %d ==>  %s\n", tmp, mvMsysBoardInfoTbl[tmp]->boardName);
 		else
 			printf("boardid Error: failed reading boardid\n");
 		break;
 
-#endif
 	case CMD_PCIE_MODE:
 		if (mvBoardPcieModeGet(&tmp) == MV_OK)
 			printf("pcimode \t\t= %d ==>  %s\n", tmp, ((tmp == 0) ? "Endpoint" : "Root Complex"));
@@ -565,13 +571,13 @@
 	case CMD_SLAVE_ADDR:
 		rc = mvBoardSmiI2c2AddrSet(tmp);
 		break;
-	case CMD_BOARD_ID:
-		rc = mvBoardSarBoardIdSet(tmp);
-		break;
 	case CMD_DEVICE_NUM:
 		rc = mvBoardDeviceNumSet(tmp);
 		break;
 #endif
+	case CMD_BOARD_ID:
+		rc = mvBoardSarBoardIdSet(tmp);
+		break;
 	case CMD_PCIE_MODE:
 		rc = mvBoardPcieModeSet(tmp);
 		break;
@@ -583,15 +589,13 @@
 		break;
 	case CMD_DEFAULT:
 		for (i = 0 ; i < CMD_DUMP; i++) {
-#if defined CONFIG_ALLEYCAT3
 			if (i == CMD_BOARD_ID) {
 				MV_U32 brdId = mvBoardIdGet();
-				if ((brdId < AC3_MARVELL_BOARD_ID_BASE) || (brdId >= AC3_MARVELL_MAX_BOARD_ID))
+				if ((brdId < MARVELL_BOARD_ID_BASE) || (brdId >= MV_MAX_MARVELL_BOARD_ID))
 					mvOsPrintf("Bad Board ID returned - %d! Assigning default value!\n", brdId);
 				else
-					defaultValue[i] = brdId - AC3_MARVELL_BOARD_ID_BASE; /* Update default value with real board ID*/
+					defaultValue[i] = brdId - MARVELL_BOARD_ID_BASE; /* Update default value with real board ID*/
 			}
-#endif /* CONFIG_ALLEYCAT3 */
 			if (1 == do_sar_write(i, defaultValue[i]))
 				rc = MV_FALSE;
 			do_sar_read(i);
@@ -623,12 +627,10 @@
 	cmd = argv[1];
 	mode = sar_cmd_get(argv[2]);
 
-#if defined CONFIG_ALLEYCAT3
-	if(mvBoardIdGet() != DB_AC3_ID && mode != CMD_BOARD_ID) {
+	if(mvBoardIdGet() != MV_DEFAULT_BOARD_ID && mode != CMD_BOARD_ID) {
 		mvOsPrintf("Error: Sample at reset supports modifying only 'boardid' field for current board\n\n");
 		goto usage;
 	}
-#endif
 
 	if (strcmp(cmd, "list") == 0)
 		return do_sar_list(mode);
@@ -674,13 +676,13 @@
 #endif
 "bootsrc                    - Boot source\n"
 "deviceid                   - Device ID\n"
-#ifdef CONFIG_ALLEYCAT3
-"\t----Legacy fileds----\n"
-"pllclock                   - PLL2 VCO clock frequency. Valid for rev.A0 only\n"
 "\n\tSW SatR fields\n"
 "\t--------------\n"
-"ddreccenable               - DDR ECC modes\n"
 "boardid                    - Board ID\n"
+#ifdef CONFIG_ALLEYCAT3
+"ddreccenable               - DDR ECC modes\n"
+"\t----Legacy fileds----\n"
+"pllclock                   - PLL2 VCO clock frequency. Valid for rev.A0 only\n"
 #endif
 );
 #endif /*defined(CONFIG_CMD_SAR)*/
diff --git a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
index d24a38a..b75e660 100755
--- a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
+++ b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvLib.c
@@ -1206,55 +1206,51 @@
 	if (gBoardId != -1)
 		return gBoardId;
 
-#if defined CONFIG_ALLEYCAT3
+#ifdef CONFIG_CUSTOMER_BOARD_SUPPORT
 
-	#ifdef CONFIG_CUSTOMER_BOARD_SUPPORT
+	#if defined CONFIG_ALLEYCAT3
 		#ifdef CONFIG_CUSTOMER_BOARD_0
 			gBoardId = AC3_CUSTOMER_BOARD_ID0;
 		#elif CONFIG_CUSTOMER_BOARD_1
 			gBoardId = AC3_CUSTOMER_BOARD_ID1;
 		#endif
-	#else	/* !CONFIG_CUSTOMER_BOARD_SUPPORT */
-
-	/* For Marvell Boards: Temporarily set generic board struct pointer to
-	   use S@R TWSI address, and read board ID */
-	board = marvellAC3BoardInfoTbl[mvBoardIdIndexGet(DB_AC3_ID)];
-	gBoardId = DB_AC3_ID; /* Terporary for usage by mvCtrlDevFamilyIdGet */
-	MV_U8 readValue;
-
-	if (mvBoardSarBoardIdGet(&readValue) != MV_OK || readValue >= AC3_MARVELL_BOARD_NUM) {
-		mvOsPrintf("%s: Error obtaining Board ID from EEPROM (%d)\n", __func__, readValue);
-		mvOsPrintf("%s: Setting default board: DB-DXAC3-MM\n", __func__);
-		readValue = DB_AC3_ID - AC3_MARVELL_BOARD_ID_BASE;
-	}
-
-	gBoardId = AC3_MARVELL_BOARD_ID_BASE + readValue;
-	#endif	/* CONFIG_CUSTOMER_BOARD_SUPPORT */
-
-#else /* CONFIG_BOBCAT2 */
-
-	#ifdef CONFIG_CUSTOMER_BOARD_SUPPORT
+	#else /* BC2 */
 		#ifdef CONFIG_CUSTOMER_BOARD_0
 			gBoardId = BC2_CUSTOMER_BOARD_ID0;
 		#elif CONFIG_CUSTOMER_BOARD_1
 			gBoardId = BC2_CUSTOMER_BOARD_ID1;
 		#endif
-	#else	/* !CONFIG_CUSTOMER_BOARD_SUPPORT */
+	#endif
 
-		#if defined(DB_BOBCAT2)
-			gBoardId = DB_DX_BC2_ID;
-		#elif defined(RD_BOBCAT2)
-			gBoardId = RD_DX_BC2_ID;
-		#elif defined(RD_MTL_BOBCAT2)
-			gBoardId = RD_MTL_BC2;
-		#else
-			mvOsPrintf("%s: Board ID must be defined!\n", __func__);
-			while (1)
-				continue;
-		#endif
-	#endif /* CONFIG_CUSTOMER_BOARD_SUPPORT */
+#else	/* !CONFIG_CUSTOMER_BOARD_SUPPORT */
 
-#endif
+	MV_U8 readValue;
+	MV_BOARD_INFO **mvBoardInfoTbl =
+	#if defined CONFIG_ALLEYCAT3
+		marvellAC3BoardInfoTbl;
+	#else
+		marvellBC2BoardInfoTbl;
+	#endif
+
+	/* Temporarily set generic board struct pointer, to set/get EEPROM i2c address, and read board ID */
+	board = mvBoardInfoTbl[mvBoardIdIndexGet(MV_DEFAULT_BOARD_ID)];
+	gBoardId = MV_DEFAULT_BOARD_ID; /* Terporary for usage by mvCtrlDevFamilyIdGet */
+
+	if (mvBoardSarBoardIdGet(&readValue) != MV_OK) {
+		mvOsPrintf("%s: Error obtaining Board ID from EEPROM (%d)\n", __func__, readValue);
+		mvOsPrintf("%s: Setting default board to: %s\n", __func__, board->boardName);
+		return MV_DEFAULT_BOARD_ID;
+	}
+	readValue = readValue & (BOARD_ID_INDEX_MASK - 1);
+
+	if (readValue >= MV_MARVELL_BOARD_NUM) {
+		mvOsPrintf("%s: Error: read wrong board ID (%d)\n", __func__, readValue);
+		mvOsPrintf("%s: Setting default board to: %s\n", __func__, board->boardName);
+		return MV_DEFAULT_BOARD_ID;
+	}
+	gBoardId = MARVELL_BOARD_ID_BASE + readValue;
+
+#endif /* CONFIG_CUSTOMER_BOARD_SUPPORT */
 
 	return gBoardId;
 }
@@ -2209,12 +2205,6 @@
 MV_STATUS mvBoardSarBoardIdGet(MV_U8 *value)
 {
 	MV_U8		boardId;
-	MV_U16		family = mvCtrlDevFamilyIdGet(0);
-
-	if (family != MV_ALLEYCAT3_DEV_ID) {
-		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
-		return MV_ERROR;
-	}
 
 	/* The Board Id 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
@@ -2235,14 +2225,16 @@
 	MV_U8		boardId;
 	MV_U16		family = mvCtrlDevFamilyIdGet(0);
 
-	if (family != MV_ALLEYCAT3_DEV_ID) {
-		DB(mvOsPrintf("%s: Controller family (0x%04x) is not supported\n", __func__, family));
-		return MV_ERROR;
-	}
-
-	if (val >= AC3_MARVELL_BOARD_NUM) {
-		mvOsPrintf("%s: Error: Unsupported board ID (%d)\n", __func__, val);
-		return MV_ERROR;
+	if (family == MV_ALLEYCAT3_DEV_ID) {
+		if (val >= AC3_MARVELL_BOARD_NUM) {
+			mvOsPrintf("%s: Error: Unsupported board ID (%d)\n", __func__, val);
+			return MV_ERROR;
+		}
+	} else {
+		if (val >= BC2_MARVELL_BOARD_NUM) {
+			mvOsPrintf("%s: Error: Unsupported board ID (%d)\n", __func__, val);
+			return MV_ERROR;
+		}
 	}
 
 	/* The Board Id is taken from the first address-value pair of the EEPROM initalization sequnce
diff --git a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvSpec.h b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvSpec.h
index 3434624..7846724 100644
--- a/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvSpec.h
+++ b/board/mv_ebu/msys/msys_family/boardEnv/mvBoardEnvSpec.h
@@ -105,8 +105,19 @@
 #define AC3_MARVELL_BOARD_NUM		(AC3_MARVELL_MAX_BOARD_ID - AC3_MARVELL_BOARD_ID_BASE)
 
 #define INVALID_BOARD_ID			0xFFFF
+#define BOARD_ID_INDEX_MASK			0x10	/* Mask used to return board index via board Id */
 
-#define BOARD_ID_INDEX_MASK		0x10	/* Mask used to return board index via board Id */
+#if defined CONFIG_ALLEYCAT3
+	#define MARVELL_BOARD_ID_BASE		AC3_MARVELL_BOARD_ID_BASE
+	#define MV_MAX_MARVELL_BOARD_ID		AC3_MARVELL_MAX_BOARD_ID
+	#define MV_MARVELL_BOARD_NUM		AC3_MARVELL_BOARD_NUM
+	#define MV_DEFAULT_BOARD_ID			DB_AC3_ID
+#else
+	#define MARVELL_BOARD_ID_BASE		BC2_MARVELL_BOARD_ID_BASE
+	#define MV_MAX_MARVELL_BOARD_ID		BC2_MARVELL_MAX_BOARD_ID
+	#define MV_MARVELL_BOARD_NUM		BC2_MARVELL_BOARD_NUM
+	#define MV_DEFAULT_BOARD_ID			DB_DX_BC2_ID
+#endif
 
 /********************************************
 *		Bobcat2 Boards
diff --git a/tools/marvell/bin_hdr/platform/sysEnv/msys/mvSysEnvLib.c b/tools/marvell/bin_hdr/platform/sysEnv/msys/mvSysEnvLib.c
index 3548638..0534261 100755
--- a/tools/marvell/bin_hdr/platform/sysEnv/msys/mvSysEnvLib.c
+++ b/tools/marvell/bin_hdr/platform/sysEnv/msys/mvSysEnvLib.c
@@ -87,41 +87,40 @@
 	if (gBoardId != -1)
 		return gBoardId;
 
-/* Customer board ID's */
 #ifdef CONFIG_CUSTOMER_BOARD_SUPPORT
-	#ifdef CONFIG_BOBCAT2
-	#ifdef CONFIG_CUSTOMER_BOARD_0
-			gBoardId = BC2_CUSTOMER_BOARD_ID0;
-		#elif CONFIG_CUSTOMER_BOARD_1
-			gBoardId = BC2_CUSTOMER_BOARD_ID1;
-		#endif
-	#elif defined CONFIG_ALLEYCAT3
+
+	#if defined CONFIG_ALLEYCAT3
 		#ifdef CONFIG_CUSTOMER_BOARD_0
 			gBoardId = AC3_CUSTOMER_BOARD_ID0;
 		#elif CONFIG_CUSTOMER_BOARD_1
 			gBoardId = AC3_CUSTOMER_BOARD_ID1;
 		#endif
+	#else /* BC2 */
+		#ifdef CONFIG_CUSTOMER_BOARD_0
+			gBoardId = BC2_CUSTOMER_BOARD_ID0;
+		#elif CONFIG_CUSTOMER_BOARD_1
+			gBoardId = BC2_CUSTOMER_BOARD_ID1;
+		#endif
 	#endif
-#else
-/* BobCat2 Board ID's */
-	#if defined(DB_BOBCAT2)
-		gBoardId = DB_DX_BC2_ID;
-	#elif defined(RD_BOBCAT2)
-		gBoardId = RD_DX_BC2_ID;
-	#elif defined(RD_MTL_BOBCAT2)
-		gBoardId = RD_MTL_BC2;
-	#else
-		MV_U8 readValue = 0;
-		/* AlleyCat3 Board ID's */
-		if (mvBoardSarBoardIdGet(&readValue) != MV_OK || readValue >= AC3_MARVELL_BOARD_NUM) {
-			mvPrintf("%s: Error obtaining Board ID from EEPROM (%d)\n", __func__, readValue);
-			mvPrintf("%s: Setting default board: DB-DXAC3-MM\n", __func__);
-			readValue = DB_AC3_ID - AC3_MARVELL_BOARD_ID_BASE;
-		}
 
-		gBoardId = AC3_MARVELL_BOARD_ID_BASE + readValue;
-	#endif
-#endif
+#else	/* !CONFIG_CUSTOMER_BOARD_SUPPORT */
+
+	MV_U8 readValue;
+
+	if (mvBoardSarBoardIdGet(&readValue) != MV_OK) {
+		mvPrintf("%s: Error obtaining Board ID from EEPROM (%d)\n", __func__, readValue);
+		mvPrintf("%s: Setting default board to: %d\n", __func__, MV_DEFAULT_BOARD_ID);
+		readValue = MV_DEFAULT_BOARD_ID;
+	}
+	readValue = readValue & (BOARD_ID_INDEX_MASK - 1);
+
+	if (readValue >= MV_MARVELL_BOARD_NUM) {
+		mvPrintf("%s: Error: read wrong board ID (%d)\n", __func__, readValue);
+		return INVALID_BOARD_ID;
+	}
+	gBoardId = MARVELL_BOARD_ID_BASE + readValue;
+
+#endif /* CONFIG_CUSTOMER_BOARD_SUPPORT */
 
 	return gBoardId;
 }
diff --git a/tools/marvell/bin_hdr/platform/sysEnv/msys/mvSysEnvLib.h b/tools/marvell/bin_hdr/platform/sysEnv/msys/mvSysEnvLib.h
index 46970f3..a7a1867 100755
--- a/tools/marvell/bin_hdr/platform/sysEnv/msys/mvSysEnvLib.h
+++ b/tools/marvell/bin_hdr/platform/sysEnv/msys/mvSysEnvLib.h
@@ -104,6 +104,18 @@
 #define INVALID_BOARD_ID			0xFFFF
 #define BOARD_ID_INDEX_MASK			0x10	/* Mask used to return board index via board Id */
 
+#if defined CONFIG_ALLEYCAT3
+	#define MARVELL_BOARD_ID_BASE		AC3_MARVELL_BOARD_ID_BASE
+	#define MV_MAX_MARVELL_BOARD_ID		AC3_MARVELL_MAX_BOARD_ID
+	#define MV_MARVELL_BOARD_NUM		AC3_MARVELL_BOARD_NUM
+	#define MV_DEFAULT_BOARD_ID			DB_AC3_ID
+#else
+	#define MARVELL_BOARD_ID_BASE		BC2_MARVELL_BOARD_ID_BASE
+	#define MV_MAX_MARVELL_BOARD_ID		BC2_MARVELL_MAX_BOARD_ID
+	#define MV_MARVELL_BOARD_NUM		BC2_MARVELL_BOARD_NUM
+	#define MV_DEFAULT_BOARD_ID			DB_DX_BC2_ID
+#endif
+
 
 /* Bobcat2 device revision */
 #define BC2_DEV_VERSION_ID_REG		           0xF8240	/* under server space */