platform: msm_shared: Add support for SMEM v9 and v10

SMEM v9 added support for foundary id and SMEM v10 added
support for chip serial.

Change-Id: Ia3a280638df28589dc389458d7573b4117d51754
diff --git a/platform/msm_shared/board.c b/platform/msm_shared/board.c
index 07d4f8a..538d381 100644
--- a/platform/msm_shared/board.c
+++ b/platform/msm_shared/board.c
@@ -48,6 +48,8 @@
 	struct smem_board_info_v6 board_info_v6;
 	struct smem_board_info_v7 board_info_v7;
 	struct smem_board_info_v8 board_info_v8;
+	struct smem_board_info_v9 board_info_v9;
+	struct smem_board_info_v10 board_info_v10;
 	unsigned int board_info_len = 0;
 	unsigned ret = 0;
 	unsigned format = 0;
@@ -102,10 +104,8 @@
 			board.pmic_info[0].pmic_type = board_info_v7.pmic_type;
 			board.pmic_info[0].pmic_version = board_info_v7.pmic_version;
 		}
-		else if (format_minor >= 8)
+		else if (format_minor == 8)
 		{
-			dprintf(INFO, "Minor socinfo format detected: %u.%u\n", format_major, format_minor);
-
 			board_info_len = sizeof(board_info_v8);
 
 			ret = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
@@ -145,12 +145,93 @@
 				board.pmic_info[i].pmic_target = (((board_info_v8.pmic_info[i].pmic_version >> 16) & 0xff) << 16) |
 					   ((board_info_v8.pmic_info[i].pmic_version & 0xff) << 8) | (pmic_type & 0xff);
 			}
+		}
+		else if (format_minor == 0x9)
+		{
+			board_info_len = sizeof(board_info_v9);
 
-			if (format_minor == 0x9)
-				board.foundry_id = board_info_v8.foundry_id;
+			ret = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
+					&board_info_v9,
+					board_info_len);
+			if (ret)
+				return;
 
-			if (format_minor == 0xA)
-				board.chip_serial = board_info_v8.chip_serial;
+			board.platform = board_info_v9.board_info_v3.msm_id;
+			board.platform_version = board_info_v9.board_info_v3.msm_version;
+			board.platform_hw = board_info_v9.board_info_v3.hw_platform;
+			board.platform_subtype = board_info_v9.platform_subtype;
+
+			/*
+			 * fill in board.target with variant_id information
+			 * bit no         |31  24 | 23   16            | 15   8             |7         0|
+			 * board.target = |subtype| plat_hw_ver major  | plat_hw_ver minor  |hw_platform|
+			 *
+			 */
+			board.target = (((board_info_v9.platform_subtype & 0xff) << 24) |
+						   (((board_info_v9.platform_version >> 16) & 0xff) << 16) |
+						   ((board_info_v9.platform_version & 0xff) << 8) |
+						   (board_info_v9.board_info_v3.hw_platform & 0xff));
+
+			for (i = 0; i < SMEM_V8_SMEM_MAX_PMIC_DEVICES; i++) {
+				board.pmic_info[i].pmic_type = board_info_v9.pmic_info[i].pmic_type;
+				board.pmic_info[i].pmic_version = board_info_v9.pmic_info[i].pmic_version;
+
+				/*
+				 * fill in pimc_board_info with pmic type and pmic version information
+				 * bit no  		  	    |31  24   | 23  16 	    | 15   8 	     |7		  0|
+				 * pimc_board_info = |Unused | Major version | Minor version|PMIC_MODEL|
+				 *
+				 */
+				pmic_type = board_info_v9.pmic_info[i].pmic_type == PMIC_IS_INVALID? 0 : board_info_v9.pmic_info[i].pmic_type;
+
+				board.pmic_info[i].pmic_target = (((board_info_v9.pmic_info[i].pmic_version >> 16) & 0xff) << 16) |
+					   ((board_info_v9.pmic_info[i].pmic_version & 0xff) << 8) | (pmic_type & 0xff);
+			}
+			board.foundry_id = board_info_v9.foundry_id;
+		}
+		else if (format_minor >= 0xA)
+		{
+			board_info_len = sizeof(board_info_v10);
+
+			ret = smem_read_alloc_entry(SMEM_BOARD_INFO_LOCATION,
+					&board_info_v10,
+					board_info_len);
+			if (ret)
+				return;
+
+			board.platform = board_info_v10.board_info_v3.msm_id;
+			board.platform_version = board_info_v10.board_info_v3.msm_version;
+			board.platform_hw = board_info_v10.board_info_v3.hw_platform;
+			board.platform_subtype = board_info_v10.platform_subtype;
+
+			/*
+			 * fill in board.target with variant_id information
+			 * bit no         |31  24 | 23   16            | 15   8             |7         0|
+			 * board.target = |subtype| plat_hw_ver major  | plat_hw_ver minor  |hw_platform|
+			 *
+			 */
+			board.target = (((board_info_v10.platform_subtype & 0xff) << 24) |
+						   (((board_info_v10.platform_version >> 16) & 0xff) << 16) |
+						   ((board_info_v10.platform_version & 0xff) << 8) |
+						   (board_info_v10.board_info_v3.hw_platform & 0xff));
+
+			for (i = 0; i < SMEM_V8_SMEM_MAX_PMIC_DEVICES; i++) {
+				board.pmic_info[i].pmic_type = board_info_v10.pmic_info[i].pmic_type;
+				board.pmic_info[i].pmic_version = board_info_v10.pmic_info[i].pmic_version;
+
+				/*
+				 * fill in pimc_board_info with pmic type and pmic version information
+				 * bit no  		  	    |31  24   | 23  16 	    | 15   8 	     |7		  0|
+				 * pimc_board_info = |Unused | Major version | Minor version|PMIC_MODEL|
+				 *
+				 */
+				pmic_type = board_info_v10.pmic_info[i].pmic_type == PMIC_IS_INVALID? 0 : board_info_v10.pmic_info[i].pmic_type;
+
+				board.pmic_info[i].pmic_target = (((board_info_v10.pmic_info[i].pmic_version >> 16) & 0xff) << 16) |
+					   ((board_info_v10.pmic_info[i].pmic_version & 0xff) << 8) | (pmic_type & 0xff);
+			}
+			board.foundry_id = board_info_v10.foundry_id;
+			board.chip_serial = board_info_v10.chip_serial;
 		}
 
 		/* HLOS subtype