/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #include #include #define JTAG_OFFSET 0xB1014 static struct chipinfo chipinfolut[] = { /* CHIPINFO_ID_SM_KODIAK = 475 */ { .jtagid = CHIPINFO_PARTNUM_SM_KODIAK, .modem = 1, .pro = 0 }, /* CHIPINFO_ID_SC_KODIAK_CHROME = 487 */ { .jtagid = CHIPINFO_PARTNUM_SC_KODIAK_CHROME, .modem = 1, .pro = 0 }, /* CHIPINFO_ID_SC_KODIAK_WINDOWS = 488 */ { .jtagid = CHIPINFO_PARTNUM_SC_KODIAK_WINDOWS, .modem = 1, .pro = 0 }, /* CHIPINFO_ID_QCM_KODIAK = 497 */ { .jtagid = CHIPINFO_PARTNUM_QCM_KODIAK, .modem = 1, .pro = 0 }, /* CHIPINFO_ID_QCS_KODIAK = 498 */ { .jtagid = CHIPINFO_PARTNUM_QCS_KODIAK, .modem = 0, .pro = 0 }, /* CHIPINFO_ID_SMP_KODIAK = 499 */ { .jtagid = CHIPINFO_PARTNUM_SMP_KODIAK, .modem = 0, .pro = 0 }, /* CHIPINFO_ID_SM_KODIAK_LTE_ONLY = 515 */ { .jtagid = CHIPINFO_PARTNUM_SM_KODIAK_LTE_ONLY, .modem = 1, .pro = 0 }, /* CHIPINFO_ID_SCP_KODIAK = 546 */ { .jtagid = CHIPINFO_PARTNUM_SCP_KODIAK, .modem = 0, .pro = 0 }, /* CHIPINFO_ID_SC_8CGEN3 = 553 */ { .jtagid = CHIPINFO_PARTNUM_SC_8CGEN3, .modem = 1, .pro = 1 }, /* CHIPINFO_ID_SCP_8CGEN3 = 563 */ { .jtagid = CHIPINFO_PARTNUM_SCP_8CGEN3, .modem = 0, .pro = 1 }, /* CHIPINFO_ID_KODIAK_SCP_7CGEN3 = 567 */ { .jtagid = CHIPINFO_PARTNUM_KODIAK_SCP_7CGEN3, .modem = 0, .pro = 0 }, /* CHIPINFO_ID_QCS_KODIAK_LITE = 575 */ { .jtagid = CHIPINFO_PARTNUM_QCS_KODIAK_LITE, .modem = 0, .pro = 0 }, /* CHIPINFO_ID_QCM_KODIAK_LITE = 576 */ { .jtagid = CHIPINFO_PARTNUM_QCM_KODIAK_LITE, .modem = 0, .pro = 0 }, }; static uint16_t read_jtagid(void) { return (read32((void *)(TLMM_TILE_BASE + JTAG_OFFSET)) & DEVICE_ID); } static int match_jtagid(uint16_t jtagid) { int i; for (i = 0; i < ARRAY_SIZE(chipinfolut); i++) if (chipinfolut[i].jtagid == jtagid) return i; return -1; } uint16_t socinfo_modem_supported(void) { uint16_t jtagid; int ret; jtagid = read_jtagid(); ret = match_jtagid(jtagid); if (ret != -1) return chipinfolut[ret].modem; die("could not match jtagid\n"); } uint16_t socinfo_pro_part(void) { uint16_t jtagid; int ret; jtagid = read_jtagid(); ret = match_jtagid(jtagid); if (ret != -1) return chipinfolut[ret].pro; die("could not match jtagid\n"); }