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
diff --git a/platform/msm_shared/smem.h b/platform/msm_shared/smem.h
index 7760e69..41d0dc0 100644
--- a/platform/msm_shared/smem.h
+++ b/platform/msm_shared/smem.h
@@ -184,10 +184,23 @@
unsigned fused_chip;
unsigned platform_subtype;
struct smem_pmic_info pmic_info[SMEM_V8_SMEM_MAX_PMIC_DEVICES];
- /*
- * Need for 8 bytes alignment
- * while reading from shared memory
- */
+};
+
+struct smem_board_info_v9 {
+ struct smem_board_info_v3 board_info_v3;
+ unsigned platform_version;
+ unsigned fused_chip;
+ unsigned platform_subtype;
+ struct smem_pmic_info pmic_info[SMEM_V8_SMEM_MAX_PMIC_DEVICES];
+ uint32_t foundry_id; /* Used as foundry_id only for v9 */
+};
+
+struct smem_board_info_v10 {
+ struct smem_board_info_v3 board_info_v3;
+ unsigned platform_version;
+ unsigned fused_chip;
+ unsigned platform_subtype;
+ struct smem_pmic_info pmic_info[SMEM_V8_SMEM_MAX_PMIC_DEVICES];
uint32_t foundry_id; /* Used as foundry_id only for v9 */
uint32_t chip_serial; /* Used as serial number for v10 */
};