soc/qualcomm/sc7280: Add API to differentiate PRO and NON_PRO SKUs

The API socinfo_pro_part() returns 1 for Pro and 0 for NON_PRO SKUs. To
reduce the binary footprint for chipinfo structure, change its members
range from uint32_t to uint16_t. Add helper functions for reading and
matching jtagid. Modified socinfo_modem_supported() API to utilize
helper functions.

BUG=b:248187555
TEST=Validate boards are detected correctly on PRO and NON_PRO SKUs

Signed-off-by: Taniya Das <quic_tdas@quicinc.com>
Change-Id: Id9f23696384a6c1a89000292eafebd8a16c273ca
Reviewed-on: https://review.coreboot.org/c/coreboot/+/68384
Reviewed-by: Shelley Chen <shchen@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Sudheer Kumar Amrabadi 2022-10-13 08:51:22 +05:30 committed by Felix Held
parent 0110e1abe0
commit 8139fc4be5
2 changed files with 68 additions and 57 deletions

View File

@ -1,31 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
/**
Chip identification type. Any new ids must be added to the end.
*/
typedef enum{
CHIPINFO_ID_UNKNOWN = 0,
CHIPINFO_ID_SM_KODIAK = 475,
CHIPINFO_ID_SC_KODIAK_CHROME = 487,
CHIPINFO_ID_SC_7CPLUSGEN3 = CHIPINFO_ID_SC_KODIAK_CHROME,
CHIPINFO_ID_SC_KODIAK_WINDOWS = 488,
CHIPINFO_ID_QCM_KODIAK = 497,
CHIPINFO_ID_QCS_KODIAK = 498,
CHIPINFO_ID_SMP_KODIAK = 499,
CHIPINFO_ID_SM_KODIAK_LTE_ONLY = 515,
CHIPINFO_ID_SCP_KODIAK = 546,
CHIPINFO_ID_SCP_7CPLUSGEN3 = CHIPINFO_ID_SCP_KODIAK,
CHIPINFO_ID_SC_8CGEN3 = 553,
CHIPINFO_ID_SCP_8CGEN3 = 563,
CHIPINFO_ID_KODIAK_SCP_7CGEN3 = 567,
CHIPINFO_ID_QCS_KODIAK_LITE = 575,
CHIPINFO_ID_QCM_KODIAK_LITE = 576,
CHIPINFO_NUM_IDS,
CHIPINFO_ID_32BITS = 0x7FFFFFF
} ChipInfoIdType;
/* /*
* CHIPINFO_PARTNUM_* * CHIPINFO_PARTNUM_*
* *
@ -46,14 +20,13 @@ typedef enum{
#define CHIPINFO_PARTNUM_QCM_KODIAK_LITE 0x20E #define CHIPINFO_PARTNUM_QCM_KODIAK_LITE 0x20E
#define CHIPINFO_MODEM_SUPPORTED 0x1
#define CHIPINFO_MODEM_UNKNOWN 0x0
#define DEVICE_ID 0xFFFF #define DEVICE_ID 0xFFFF
struct chipinfo { struct chipinfo {
uint32_t chipid; uint16_t jtagid : 14;
uint32_t jtagid; uint16_t modem : 1;
bool modem; uint16_t pro : 1;
}; };
bool socinfo_modem_supported(void); uint16_t socinfo_modem_supported(void);
uint16_t socinfo_pro_part(void);

View File

@ -10,37 +10,75 @@
#define JTAG_OFFSET 0xB1014 #define JTAG_OFFSET 0xB1014
static struct chipinfo chipinfolut[] = { static struct chipinfo chipinfolut[] = {
{ CHIPINFO_ID_SM_KODIAK, CHIPINFO_PARTNUM_SM_KODIAK, CHIPINFO_MODEM_SUPPORTED}, /* CHIPINFO_ID_SM_KODIAK = 475 */
{ CHIPINFO_ID_SC_KODIAK_CHROME, CHIPINFO_PARTNUM_SC_KODIAK_CHROME, { .jtagid = CHIPINFO_PARTNUM_SM_KODIAK, .modem = 1, .pro = 0 },
CHIPINFO_MODEM_SUPPORTED }, /* CHIPINFO_ID_SC_KODIAK_CHROME = 487 */
{ CHIPINFO_ID_SC_KODIAK_WINDOWS, CHIPINFO_PARTNUM_SC_KODIAK_WINDOWS, { .jtagid = CHIPINFO_PARTNUM_SC_KODIAK_CHROME, .modem = 1, .pro = 0 },
CHIPINFO_MODEM_SUPPORTED}, /* CHIPINFO_ID_SC_KODIAK_WINDOWS = 488 */
{ CHIPINFO_ID_QCM_KODIAK, CHIPINFO_PARTNUM_QCM_KODIAK, CHIPINFO_MODEM_SUPPORTED }, { .jtagid = CHIPINFO_PARTNUM_SC_KODIAK_WINDOWS, .modem = 1, .pro = 0 },
{ CHIPINFO_ID_QCS_KODIAK, CHIPINFO_PARTNUM_QCS_KODIAK, CHIPINFO_MODEM_UNKNOWN }, /* CHIPINFO_ID_QCM_KODIAK = 497 */
{ CHIPINFO_ID_SMP_KODIAK, CHIPINFO_PARTNUM_SMP_KODIAK, CHIPINFO_MODEM_UNKNOWN }, { .jtagid = CHIPINFO_PARTNUM_QCM_KODIAK, .modem = 1, .pro = 0 },
{ CHIPINFO_ID_SM_KODIAK_LTE_ONLY, CHIPINFO_PARTNUM_SM_KODIAK_LTE_ONLY, /* CHIPINFO_ID_QCS_KODIAK = 498 */
CHIPINFO_MODEM_SUPPORTED }, { .jtagid = CHIPINFO_PARTNUM_QCS_KODIAK, .modem = 0, .pro = 0 },
{ CHIPINFO_ID_SCP_KODIAK, CHIPINFO_PARTNUM_SCP_KODIAK, CHIPINFO_MODEM_UNKNOWN }, /* CHIPINFO_ID_SMP_KODIAK = 499 */
{ CHIPINFO_ID_SC_8CGEN3, CHIPINFO_PARTNUM_SC_8CGEN3, CHIPINFO_MODEM_SUPPORTED }, { .jtagid = CHIPINFO_PARTNUM_SMP_KODIAK, .modem = 0, .pro = 0 },
{ CHIPINFO_ID_SCP_8CGEN3, CHIPINFO_PARTNUM_SCP_8CGEN3, CHIPINFO_MODEM_UNKNOWN }, /* CHIPINFO_ID_SM_KODIAK_LTE_ONLY = 515 */
{ CHIPINFO_ID_KODIAK_SCP_7CGEN3, CHIPINFO_PARTNUM_KODIAK_SCP_7CGEN3, { .jtagid = CHIPINFO_PARTNUM_SM_KODIAK_LTE_ONLY, .modem = 1, .pro = 0 },
CHIPINFO_MODEM_UNKNOWN }, /* CHIPINFO_ID_SCP_KODIAK = 546 */
{ CHIPINFO_ID_QCS_KODIAK_LITE, CHIPINFO_PARTNUM_QCS_KODIAK_LITE, { .jtagid = CHIPINFO_PARTNUM_SCP_KODIAK, .modem = 0, .pro = 0 },
CHIPINFO_MODEM_UNKNOWN }, /* CHIPINFO_ID_SC_8CGEN3 = 553 */
{ CHIPINFO_ID_QCM_KODIAK_LITE, CHIPINFO_PARTNUM_QCM_KODIAK_LITE, { .jtagid = CHIPINFO_PARTNUM_SC_8CGEN3, .modem = 1, .pro = 1 },
CHIPINFO_MODEM_UNKNOWN }, /* 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 },
}; };
bool socinfo_modem_supported(void) static uint16_t read_jtagid(void)
{ {
uint32_t jtagid; return (read32((void *)(TLMM_TILE_BASE + JTAG_OFFSET)) & DEVICE_ID);
int i; }
jtagid = 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++) for (i = 0; i < ARRAY_SIZE(chipinfolut); i++)
if (chipinfolut[i].jtagid == jtagid) if (chipinfolut[i].jtagid == jtagid)
return chipinfolut[i].modem; 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");
return false;
} }