diff --git a/arch/arm/cpu/armv7/qca/common/scm.c b/arch/arm/cpu/armv7/qca/common/scm.c index e4ac70efcc..dd55e21bf8 100644 --- a/arch/arm/cpu/armv7/qca/common/scm.c +++ b/arch/arm/cpu/armv7/qca/common/scm.c @@ -493,7 +493,8 @@ int qca_scm_fuseipq(u32 svc_id, u32 cmd_id, void *buf, size_t len) return ret; } -int qca_scm_list_ipq5332_fuse(u32 svc_id, u32 cmd_id, +#ifdef CONFIG_LIST_FUSE +int qca_scm_list_fuse(u32 svc_id, u32 cmd_id, struct fuse_payload *fuse, size_t len) { int ret = 0; @@ -515,6 +516,7 @@ int qca_scm_list_ipq5332_fuse(u32 svc_id, u32 cmd_id, } return ret; } +#endif int qca_scm_part_info(void *cmd_buf, size_t cmd_len) @@ -777,7 +779,7 @@ int qca_scm_fuseipq(u32 svc_id, u32 cmd_id, void *buf, size_t len) { return 0; } -int qca_scm_list_ipq5332_fuse(u32 svc_id, u32 cmd_id, void *buf, size_t len) +int qca_scm_list_fuse(u32 svc_id, u32 cmd_id, void *buf, size_t len) { return 0; } diff --git a/arch/arm/include/asm/arch-qca-common/scm.h b/arch/arm/include/asm/arch-qca-common/scm.h index d827b5a46f..242fc33d62 100644 --- a/arch/arm/include/asm/arch-qca-common/scm.h +++ b/arch/arm/include/asm/arch-qca-common/scm.h @@ -119,12 +119,6 @@ struct scm_response { u32 is_complete; }; -struct fuse_payload { - u32 fuse_addr; - u32 lsb_val; - u32 msb_val; -}; - int scm_init(void); extern int scm_call(u32 svc_id, u32 cmd_id, const void *cmd_buf, size_t cmd_len, void *resp_buf, size_t resp_len); @@ -140,7 +134,9 @@ int qca_scm_clear_key(u32, u32); int qca_scm_sdi(void); int qca_scm_dload(u32); int qca_scm_fuseipq(u32, u32, void *, size_t); -int qca_scm_list_ipq5332_fuse(u32, u32, struct fuse_payload *, size_t); +#ifdef CONFIG_LIST_FUSE +int qca_scm_list_fuse(u32, u32, struct fuse_payload *, size_t); +#endif bool is_scm_armv8(void); int qca_scm_secure_authenticate(void *cmd_buf, size_t cmd_len); int qca_scm_part_info(void *cmd_buf, size_t cmd_len); diff --git a/board/ipq5018/Kconfig b/board/ipq5018/Kconfig index e28e7fe224..6462ca5eca 100644 --- a/board/ipq5018/Kconfig +++ b/board/ipq5018/Kconfig @@ -57,4 +57,8 @@ config BOARD_TYPES config LIST_OF_CONFIG_NAMES_SUPPORT bool "List of config names support" + +config LIST_FUSE + bool "Enable fuse list command" + default n endif diff --git a/board/ipq5332/Kconfig b/board/ipq5332/Kconfig index d77482d15b..88518f756c 100644 --- a/board/ipq5332/Kconfig +++ b/board/ipq5332/Kconfig @@ -67,4 +67,8 @@ config LIST_OF_CONFIG_NAMES_SUPPORT config IPQ_TINY2 select IPQ_TINY bool "Enable tiny2 profile" + +config LIST_FUSE + bool "Enable fuse list command" + default y endif diff --git a/board/ipq6018/Kconfig b/board/ipq6018/Kconfig index 4c3cda30b7..9777402062 100644 --- a/board/ipq6018/Kconfig +++ b/board/ipq6018/Kconfig @@ -27,4 +27,8 @@ config BOARD_TYPES config LIST_OF_CONFIG_NAMES_SUPPORT bool "List of config names support" + +config LIST_FUSE + bool "Enable fuse list command" + default n endif diff --git a/board/ipq807x/Kconfig b/board/ipq807x/Kconfig index 876c6f25fc..d7c08daf1d 100644 --- a/board/ipq807x/Kconfig +++ b/board/ipq807x/Kconfig @@ -37,3 +37,7 @@ config BOARD_TYPES config LIST_OF_CONFIG_NAMES_SUPPORT bool "List of config names support" + +config LIST_FUSE + bool "Enable fuse list command" + default n diff --git a/board/ipq9574/Kconfig b/board/ipq9574/Kconfig index d484072027..e51570fa6b 100644 --- a/board/ipq9574/Kconfig +++ b/board/ipq9574/Kconfig @@ -24,4 +24,8 @@ config BOARD_TYPES config LIST_OF_CONFIG_NAMES_SUPPORT bool "List of config names support" + +config LIST_FUSE + bool "Enable fuse list command" + default y endif diff --git a/board/qca/arm/common/cmd_blowsecfuse.c b/board/qca/arm/common/cmd_blowsecfuse.c index 1bcd8295ee..f8b0f55db8 100644 --- a/board/qca/arm/common/cmd_blowsecfuse.c +++ b/board/qca/arm/common/cmd_blowsecfuse.c @@ -66,34 +66,46 @@ int do_fuseipq(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) return 0; } -#ifdef CONFIG_IPQ5332 -int do_list_ipq5332_fuse(cmd_tbl_t *cmdtp, int flag, int argc, +#ifdef CONFIG_LIST_FUSE +int do_list_fuse(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { + extern unsigned long fuse_addr[]; int ret; - int index, next = 0; - unsigned long addr = 0xA00E8; + int index; struct fuse_payload *fuse = NULL; + size_t fuse_cnt = FUSE_CNT; - fuse = malloc(sizeof(struct fuse_payload ) * MAX_FUSE_ADDR_SIZE); + fuse = malloc(sizeof(struct fuse_payload ) * fuse_cnt); if (fuse == NULL) { return 1; } - memset(fuse, 0, MAX_FUSE_ADDR_SIZE * sizeof(struct fuse_payload)); + memset(fuse, 0, fuse_cnt * sizeof(struct fuse_payload)); - fuse[0].fuse_addr = 0xA00D0; - for (index = 1; index < MAX_FUSE_ADDR_SIZE; index++) { - fuse[index].fuse_addr = addr + next; - next += 0x8; + for (index = 0; index < fuse_cnt; index++) { + fuse[index].fuse_addr = fuse_addr[index]; } - ret = qca_scm_list_ipq5332_fuse(SCM_SVC_FUSE, TZ_READ_FUSE_VALUE, fuse, - sizeof(struct fuse_payload ) * MAX_FUSE_ADDR_SIZE); + ret = qca_scm_list_fuse(SCM_SVC_FUSE, TZ_READ_FUSE_VALUE, fuse, + sizeof(struct fuse_payload ) * fuse_cnt); printf("Fuse Name\tAddress\t\tValue\n"); printf("------------------------------------------------\n"); +#ifdef CONFIG_ARCH_IPQ9574 + printf("TME_AUTH_EN\t0x%08X\t0x%08X\n", fuse[0].fuse_addr, + fuse[0].val & 0x41); + printf("TME_OEM_ID\t0x%08X\t0x%08X\n", fuse[0].fuse_addr, + fuse[0].val & 0xFFFF0000); + printf("TME_PRODUCT_ID\t0x%08X\t0x%08X\n", fuse[1].fuse_addr, + fuse[1].val & 0xFFFF); + + for (index = 2; index < fuse_cnt; index++) { + printf("TME_MRC_HASH\t0x%08X\t0x%08X\n", + fuse[index].fuse_addr, fuse[index].val); + } +#elif CONFIG_ARCH_IPQ5332 printf("TME_AUTH_EN\t0x%08X\t0x%08X\n", fuse[0].fuse_addr, fuse[0].lsb_val & 0x41); printf("TME_OEM_ID\t0x%08X\t0x%08X\n", fuse[0].fuse_addr, @@ -101,12 +113,13 @@ int do_list_ipq5332_fuse(cmd_tbl_t *cmdtp, int flag, int argc, printf("TME_PRODUCT_ID\t0x%08X\t0x%08X\n", fuse[0].fuse_addr + 0x4, fuse[0].msb_val & 0xFFFF); - for (index = 1; index < MAX_FUSE_ADDR_SIZE; index++) { + for (index = 1; index < fuse_cnt; index++) { printf("TME_MRC_HASH\t0x%08X\t0x%08X\n", fuse[index].fuse_addr, fuse[index].lsb_val); printf("TME_MRC_HASH\t0x%08X\t0x%08X\n", fuse[index].fuse_addr + 0x4, fuse[index].msb_val); } +#endif if (ret) { printf("Failed to read OEM parameters at Address 0x%X\n", ret); @@ -115,7 +128,7 @@ int do_list_ipq5332_fuse(cmd_tbl_t *cmdtp, int flag, int argc, return 0; } -U_BOOT_CMD(list_ipq5332_fuse, 1, 0, do_list_ipq5332_fuse, +U_BOOT_CMD(list_fuse, 1, 0, do_list_fuse, "fuse set of QFPROM registers from memory\n", ""); #endif diff --git a/board/qca/arm/ipq5332/ipq5332.c b/board/qca/arm/ipq5332/ipq5332.c index 380ea311e3..c9658d4e78 100644 --- a/board/qca/arm/ipq5332/ipq5332.c +++ b/board/qca/arm/ipq5332/ipq5332.c @@ -62,6 +62,17 @@ DECLARE_GLOBAL_DATA_PTR; +unsigned long fuse_addr[FUSE_CNT] = { + 0x000A00D0, + 0x000A00E8, + 0x000A00F0, + 0x000A00F8, + 0x000A0100, + 0x000A0108, + 0x000A0110, + 0x000A0118, +}; + static int aq_phy_initialised = 0; extern int ipq5332_edma_init(void *cfg); extern int ipq_spi_init(u16); diff --git a/board/qca/arm/ipq5332/ipq5332.h b/board/qca/arm/ipq5332/ipq5332.h index 393fefb0f0..6ed0f78629 100644 --- a/board/qca/arm/ipq5332/ipq5332.h +++ b/board/qca/arm/ipq5332/ipq5332.h @@ -315,6 +315,13 @@ typedef enum { SMEM_MAX_SIZE = SMEM_RUNTIME_FAILSAFE_INFO + 1, } smem_mem_type_t; +#define FUSE_CNT 8 +struct fuse_payload { + u32 fuse_addr; + u32 lsb_val; + u32 msb_val; +}; + /* * function declaration */ diff --git a/board/qca/arm/ipq9574/ipq9574.c b/board/qca/arm/ipq9574/ipq9574.c index a01b9a22c2..e1dc44c231 100644 --- a/board/qca/arm/ipq9574/ipq9574.c +++ b/board/qca/arm/ipq9574/ipq9574.c @@ -40,6 +40,31 @@ DECLARE_GLOBAL_DATA_PTR; +unsigned long fuse_addr[FUSE_CNT] = { + 0x000A00C0, + 0x000A00C4, + 0x000A00D8, + 0x000A00DC, + 0x000A00E0, + 0x000A00E4, + 0x000A00E8, + 0x000A00EC, + 0x000A00F0, + 0x000A00F4, + 0x000A00F8, + 0x000A00FC, + 0x000A0100, + 0x000A0104, + 0x000A0108, + 0x000A010C, + 0x000A0110, + 0x000A0114, + 0x000A0118, + 0x000A011C, + 0x000A0120, + 0x000A0124, +}; + struct sdhci_host mmc_host; extern int ipq9574_edma_init(void *cfg); extern int ipq_spi_init(u16); diff --git a/board/qca/arm/ipq9574/ipq9574.h b/board/qca/arm/ipq9574/ipq9574.h index 51c7ae3c4f..2fc1e4a888 100644 --- a/board/qca/arm/ipq9574/ipq9574.h +++ b/board/qca/arm/ipq9574/ipq9574.h @@ -379,6 +379,12 @@ typedef enum { #define MSM_SDC1_BASE 0x7800000 #define MSM_SDC1_SDHCI_BASE 0x7804000 +#define FUSE_CNT 22 +struct fuse_payload { + u32 fuse_addr; + u32 val; +}; + __weak void qgic_init(void) {} __weak void handle_noc_err(void) {} extern const char *rsvd_node;