diff --git a/efuse-hal-lib/lib/src/efuse-api.h b/efuse-hal-lib/lib/src/efuse-api.h index 1406e7d..5e592b5 100644 --- a/efuse-hal-lib/lib/src/efuse-api.h +++ b/efuse-hal-lib/lib/src/efuse-api.h @@ -43,6 +43,18 @@ typedef enum { SECURE_BOOT_EN = 0x5a5a5a5a, } sboot_st_t; +enum life_cycle_e { + LC_INIT = 0, + LC_DEV, + LC_OEM, + LC_PRO, + LC_RMA, + LC_RIP, + LC_KILL_KEY1, + LC_KILL_KEY0, + LC_MAX, +}; + /** * csi_efuse_get_chipid() - Get chip id in eFuse * @@ -374,4 +386,18 @@ int csi_efuse_update_lc_rma(); */ int csi_efuse_update_lc_rip(); +/** + * csi_efuse_get_lc_preld() - get efuse life cycle preld + * @lc_name: the output name of life cycle preld + * Return: 0: Success others: Failed + */ +int csi_efuse_get_lc_preld(char *lc_name); + +/* + * csi_efuse_update_lc(enum life_cycle_e life_cycle) + * @life_cycle: the life cycle to set + * Return: 0: Success others: Failed + */ +int csi_efuse_update_lc(enum life_cycle_e life_cycle); + #endif diff --git a/efuse-hal-lib/lib/src/light-efuse-hal.c b/efuse-hal-lib/lib/src/light-efuse-hal.c index 935147d..4f70004 100644 --- a/efuse-hal-lib/lib/src/light-efuse-hal.c +++ b/efuse-hal-lib/lib/src/light-efuse-hal.c @@ -1505,3 +1505,113 @@ int csi_efuse_update_lc_rip() return 0; } +int csi_efuse_get_lc_preld(char *lc_name) +{ + int fd, ret; + char data[30] = {0}; + unsigned int lf = 0; + const char *dev_path = "/sys/devices/platform/soc/ffff210000.efuse/lc_preld"; + char *str; + + assert(lc_name); + + fd = open(dev_path, O_RDONLY); + if (fd < 0) { + printf("failed to open device '%s' (%d)\n", dev_path, -errno); + return -errno; + } + + ret = read(fd, data, 30); + if (ret < 0){ + printf("failed to read lifecycle from preld area\n"); + return -errno; + } + + lf = strtoul(data, NULL, 16); + + switch (lf) { + case 0xC44ACFCF: + str = "LC_INIT"; + break; + case 0xCA410C33: + str = "LC_DEV"; + break; + case 0x548411A6: + str = "LC_OEM"; + break; + case 0xABB00F15: + str = "LC_PRO"; + break; + case 0x67E93416: + str = "LC_RMA"; + break; + case 0x9fCAE0EA: + str = "LC_RIP"; + break; + default: + str = "LC_MAX"; + return -EINVAL; + } + + strcpy(lc_name, str); + + close(fd); + + return 0; +} + +/* + * csi_efuse_update_lc(enum life_cycle_e life_cycle) + * @life_cycle: the life cycle to set + * Return: 0: Success others: Failed + */ +int csi_efuse_update_lc(enum life_cycle_e life_cycle) +{ + int fd, ret = 0; + char *lf; + const char *dev_path = "/sys/devices/platform/soc/ffff210000.efuse/update_lc"; + + fd = open(dev_path, O_WRONLY); + if (fd < 0) { + printf("failed to open device '%s' (%d)\n", dev_path, -errno); + return -errno; + } + + switch (life_cycle) { + case LC_DEV: + lf = "LC_DEV"; + break; + case LC_OEM: + lf = "LC_OEM"; + break; + case LC_PRO: + lf = "LC_PRO"; + break; + case LC_RMA: + lf = "LC_RMA"; + break; + case LC_RIP: + lf = "LC_RIP"; + break; + case LC_KILL_KEY1: + lf = "LC_KILL_KEY1"; + break; + case LC_KILL_KEY0: + lf = "LC_KILL_KEY0"; + break; + default: + ret = -EINVAL; + goto exit; + } + + ret = write(fd, lf, strlen(lf)); + if (ret < 0) + printf("failed to update efuse life cycle(%d)\n", ret); + else + ret = 0; + +exit: + close(fd); + + return ret; +} diff --git a/efuse-hal-lib/lib/src/light-efuse-hal.o b/efuse-hal-lib/lib/src/light-efuse-hal.o deleted file mode 100644 index 853ea5b..0000000 Binary files a/efuse-hal-lib/lib/src/light-efuse-hal.o and /dev/null differ diff --git a/efuse-hal-lib/test/efuse_demo/efuse-api.h b/efuse-hal-lib/test/efuse_demo/efuse-api.h index 1406e7d..5e592b5 100644 --- a/efuse-hal-lib/test/efuse_demo/efuse-api.h +++ b/efuse-hal-lib/test/efuse_demo/efuse-api.h @@ -43,6 +43,18 @@ typedef enum { SECURE_BOOT_EN = 0x5a5a5a5a, } sboot_st_t; +enum life_cycle_e { + LC_INIT = 0, + LC_DEV, + LC_OEM, + LC_PRO, + LC_RMA, + LC_RIP, + LC_KILL_KEY1, + LC_KILL_KEY0, + LC_MAX, +}; + /** * csi_efuse_get_chipid() - Get chip id in eFuse * @@ -374,4 +386,18 @@ int csi_efuse_update_lc_rma(); */ int csi_efuse_update_lc_rip(); +/** + * csi_efuse_get_lc_preld() - get efuse life cycle preld + * @lc_name: the output name of life cycle preld + * Return: 0: Success others: Failed + */ +int csi_efuse_get_lc_preld(char *lc_name); + +/* + * csi_efuse_update_lc(enum life_cycle_e life_cycle) + * @life_cycle: the life cycle to set + * Return: 0: Success others: Failed + */ +int csi_efuse_update_lc(enum life_cycle_e life_cycle); + #endif diff --git a/efuse-hal-lib/test/efuse_demo/light-efuse-test.c b/efuse-hal-lib/test/efuse_demo/light-efuse-test.c index fb1775e..98d1428 100644 --- a/efuse-hal-lib/test/efuse_demo/light-efuse-test.c +++ b/efuse-hal-lib/test/efuse_demo/light-efuse-test.c @@ -410,18 +410,38 @@ void csi_efuse_gmac_macaddr_test() printf("gmac mac0 address: %2x:%2x:%2x:%2x:%2x:%2x\n", r_mac1[0], r_mac1[1], r_mac1[2], r_mac1[3], r_mac1[4], r_mac1[5]); } +void csi_efuse_get_lc_preld_test() +{ + char life_cycle[12] = {0}; + int ret; + + ret = csi_efuse_get_lc_preld(life_cycle); + if (ret) { + printf("ret = %d\n", ret); + return; + } + printf("lc_preld: %s\n", life_cycle); +} + +void csi_efuse_update_lc_test() +{ + csi_efuse_update_lc(LC_DEV); + csi_efuse_update_lc(LC_RMA); +} + int main() { + printf("efuse testing....\n"); + csi_efuse_update_lc_test(); #if 0 + csi_efuse_get_lc_preld_test(); csi_efuse_bl4_img_encrypt_test(); csi_efuse_bl2_img_encrypt_test(); csi_efuse_bl3_img_encrypt_test(); csi_efuse_get_bl1_version_test(); csi_efuse_get_hash_challenge_test(); csi_efuse_get_secure_boot_st_test(); -#endif csi_efuse_offset_test(); -#if 0 csi_efuse_usr_brom_cct_test(); csi_efuse_usr_brom_usb_fastboot_test(); csi_efuse_boot_index_test(); @@ -432,9 +452,7 @@ int main() csi_efuse_get_secure_boot_st_test(); csi_efuse_get_hash_challenge_test(); csi_efuse_userdata_group_test(); -#endif -#if 0 efuse_chip_id_get_test(); csi_efuse_user_dbg_mode_test(); csi_efuse_boot_offset_test(); @@ -442,9 +460,7 @@ int main() csi_efuse_bak_boot_offset_test(); csi_efuse_bak_boot_index_test(); csi_efuse_usr_brom_usb_fastboot_test(); -#endif -#if 0 csi_efuse_usr_brom_cct_test(); printf("welcome to riscv world!!!\n"); @@ -457,13 +473,9 @@ int main() csi_efuse_get_hash_challenge_test(); csi_efuse_userdata_group_test(); csi_efuse_offset_test(); -#endif -#if 0 csi_efuse_update_lc_rma_test(); csi_efuse_update_lc_rip_test(); -#endif -#if 0 csi_efuse_gmac_macaddr_test(); #endif return 0; diff --git a/efuse-hal-lib/test/efuse_demo/light-efuse-test.o b/efuse-hal-lib/test/efuse_demo/light-efuse-test.o deleted file mode 100644 index ae07ac8..0000000 Binary files a/efuse-hal-lib/test/efuse_demo/light-efuse-test.o and /dev/null differ diff --git a/efuse-hal-lib/test/output/efuse_demo b/efuse-hal-lib/test/output/efuse_demo deleted file mode 100755 index fb47c5e..0000000 Binary files a/efuse-hal-lib/test/output/efuse_demo and /dev/null differ