123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
- /*
- * Copyright (C) 2019, STMicroelectronics - All Rights Reserved
- */
- #include <common.h>
- #include <command.h>
- #include <console.h>
- #include <misc.h>
- #include <dm/device.h>
- #include <dm/uclass.h>
- #define STM32_OTP_HASH_KEY_START 24
- #define STM32_OTP_HASH_KEY_SIZE 8
- static void read_hash_value(u32 addr)
- {
- int i;
- for (i = 0; i < STM32_OTP_HASH_KEY_SIZE; i++) {
- printf("OTP value %i: %x\n", STM32_OTP_HASH_KEY_START + i,
- __be32_to_cpu(*(u32 *)addr));
- addr += 4;
- }
- }
- static void fuse_hash_value(u32 addr, bool print)
- {
- struct udevice *dev;
- u32 word, val;
- int i, ret;
- ret = uclass_get_device_by_driver(UCLASS_MISC,
- DM_GET_DRIVER(stm32mp_bsec),
- &dev);
- if (ret) {
- pr_err("Can't find stm32mp_bsec driver\n");
- return;
- }
- for (i = 0; i < STM32_OTP_HASH_KEY_SIZE; i++) {
- if (print)
- printf("Fuse OTP %i : %x\n",
- STM32_OTP_HASH_KEY_START + i,
- __be32_to_cpu(*(u32 *)addr));
- word = STM32_OTP_HASH_KEY_START + i;
- val = __be32_to_cpu(*(u32 *)addr);
- misc_write(dev, STM32_BSEC_OTP(word), &val, 4);
- addr += 4;
- }
- }
- static int confirm_prog(void)
- {
- puts("Warning: Programming fuses is an irreversible operation!\n"
- " This may brick your system.\n"
- " Use this command only if you are sure of what you are doing!\n"
- "\nReally perform this fuse programming? <y/N>\n");
- if (confirm_yesno())
- return 1;
- puts("Fuse programming aborted\n");
- return 0;
- }
- static int do_stm32key(struct cmd_tbl *cmdtp, int flag, int argc,
- char *const argv[])
- {
- u32 addr;
- const char *op = argc >= 2 ? argv[1] : NULL;
- int confirmed = argc > 3 && !strcmp(argv[2], "-y");
- argc -= 2 + confirmed;
- argv += 2 + confirmed;
- if (argc < 1)
- return CMD_RET_USAGE;
- addr = simple_strtoul(argv[0], NULL, 16);
- if (!addr)
- return CMD_RET_USAGE;
- if (!strcmp(op, "read"))
- read_hash_value(addr);
- if (!strcmp(op, "fuse")) {
- if (!confirmed && !confirm_prog())
- return CMD_RET_FAILURE;
- fuse_hash_value(addr, !confirmed);
- }
- return CMD_RET_SUCCESS;
- }
- U_BOOT_CMD(stm32key, 4, 1, do_stm32key,
- "Fuse ST Hash key",
- "read <addr>: Read the hash store at addr in memory\n"
- "stm32key fuse [-y] <addr> : Fuse hash store at addr in otp\n");
|