diff --git a/arch/arm/mach-meson/sm.c b/arch/arm/mach-meson/sm.c index 1a8f23cb1f..6c28c0f5e4 100644 --- a/arch/arm/mach-meson/sm.c +++ b/arch/arm/mach-meson/sm.c @@ -68,6 +68,26 @@ ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size) return regs.regs[0]; } +ssize_t meson_sm_write_efuse(uintptr_t offset, void *buffer, size_t size) +{ + struct pt_regs regs; + + meson_init_shmem(); + + memcpy(shmem_input, buffer, size); + + regs.regs[0] = FN_EFUSE_WRITE; + regs.regs[1] = offset; + regs.regs[2] = size; + + smc_call(®s); + + if (regs.regs[0] == 0) + return -1; + + return 0; +} + #define SM_CHIP_ID_LENGTH 119 #define SM_CHIP_ID_OFFSET 4 #define SM_CHIP_ID_SIZE 12 @@ -187,9 +207,53 @@ static int do_sm_reboot_reason(struct cmd_tbl *cmdtp, int flag, int argc, return CMD_RET_SUCCESS; } +static int do_efuse_read(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + ulong address, offset, size; + int ret; + + if (argc < 4) + return CMD_RET_USAGE; + + offset = simple_strtoul(argv[1], NULL, 0); + size = simple_strtoul(argv[2], NULL, 0); + + address = simple_strtoul(argv[3], NULL, 0); + + ret = meson_sm_read_efuse(offset, (void *)address, size); + if (ret) + return CMD_RET_FAILURE; + + return CMD_RET_SUCCESS; +} + +static int do_efuse_write(struct cmd_tbl *cmdtp, int flag, int argc, + char *const argv[]) +{ + ulong address, offset, size; + int ret; + + if (argc < 4) + return CMD_RET_USAGE; + + offset = simple_strtoul(argv[1], NULL, 0); + size = simple_strtoul(argv[2], NULL, 0); + + address = simple_strtoul(argv[3], NULL, 0); + + ret = meson_sm_write_efuse(offset, (void *)address, size); + if (ret) + return CMD_RET_FAILURE; + + return CMD_RET_SUCCESS; +} + static struct cmd_tbl cmd_sm_sub[] = { U_BOOT_CMD_MKENT(serial, 2, 1, do_sm_serial, "", ""), U_BOOT_CMD_MKENT(reboot_reason, 1, 1, do_sm_reboot_reason, "", ""), + U_BOOT_CMD_MKENT(efuseread, 4, 1, do_efuse_read, "", ""), + U_BOOT_CMD_MKENT(efusewrite, 4, 0, do_efuse_write, "", ""), }; static int do_sm(struct cmd_tbl *cmdtp, int flag, int argc, @@ -216,5 +280,7 @@ U_BOOT_CMD( sm, 5, 0, do_sm, "Secure Monitor Control", "serial
- read chip unique id to memory address\n" - "sm reboot_reason [name] - get reboot reason and store to to environment" + "sm reboot_reason [name] - get reboot reason and store to to environment\n" + "sm efuseread
- read efuse to memory address\n" + "sm efusewrite
- write into efuse from memory address" ); diff --git a/board/amlogic/jethub-j100/MAINTAINERS b/board/amlogic/jethub-j100/MAINTAINERS new file mode 100644 index 0000000000..43f6a5fc86 --- /dev/null +++ b/board/amlogic/jethub-j100/MAINTAINERS @@ -0,0 +1,8 @@ +JetHome JetHub +M: Vyacheslav Bocharov +S: Maintained +L: u-boot-amlogic@groups.io +F: board/amlogic/jethub-j100/ +F: configs/jethub_j100_defconfig +F: doc/board/amlogic/jethub-j100.rst +F: include/configs/jethub.h diff --git a/board/amlogic/jethub-j100/Makefile b/board/amlogic/jethub-j100/Makefile new file mode 100644 index 0000000000..4d935af984 --- /dev/null +++ b/board/amlogic/jethub-j100/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# (C) Copyright 2021 Vyacheslav Bocharov +# Author: Vyacheslav Bocharov + +obj-y := jethub-j100.o diff --git a/board/amlogic/jethub-j100/jethub-j100.c b/board/amlogic/jethub-j100/jethub-j100.c new file mode 100644 index 0000000000..6a2c4ad4c3 --- /dev/null +++ b/board/amlogic/jethub-j100/jethub-j100.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2021 Vyacheslav Bocharov + * Author: Vyacheslav Bocharov + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int misc_init_r(void) +{ + u8 mac_addr[ARP_HLEN]; + char serial[SM_SERIAL_SIZE]; + u32 sid; + + if (!meson_sm_get_serial(serial, SM_SERIAL_SIZE)) { + sid = crc32(0, (unsigned char *)serial, SM_SERIAL_SIZE); + /* Ensure the NIC specific bytes of the mac are not all 0 */ + if ((sid & 0xffff) == 0) + sid |= 0x800000; + + /* OUI registered MAC address */ + mac_addr[0] = 0x10; + mac_addr[1] = 0x27; + mac_addr[2] = 0xBE; + mac_addr[3] = (sid >> 16) & 0xff; + mac_addr[4] = (sid >> 8) & 0xff; + mac_addr[5] = (sid >> 0) & 0xff; + + eth_env_set_enetaddr("ethaddr", mac_addr); + } + + return 0; +} diff --git a/board/amlogic/jethub-j80/MAINTAINERS b/board/amlogic/jethub-j80/MAINTAINERS index 459e9f89da..a899153117 100644 --- a/board/amlogic/jethub-j80/MAINTAINERS +++ b/board/amlogic/jethub-j80/MAINTAINERS @@ -4,6 +4,5 @@ S: Maintained L: u-boot-amlogic@groups.io F: board/amlogic/jethub-j80/ F: configs/jethub_j80_defconfig -F: configs/jethub_j100_defconfig F: doc/board/amlogic/jethub-j80.rst -F: doc/board/amlogic/jethub-j100.rst +F: include/configs/jethub.h diff --git a/configs/jethub_j100_defconfig b/configs/jethub_j100_defconfig index 533f251855..a81b16c0dd 100644 --- a/configs/jethub_j100_defconfig +++ b/configs/jethub_j100_defconfig @@ -1,4 +1,5 @@ CONFIG_ARM=y +CONFIG_SYS_BOARD="jethub-j100" CONFIG_SYS_CONFIG_NAME="jethub" CONFIG_ARCH_MESON=y CONFIG_SYS_TEXT_BASE=0x01000000