139a72345SMasahiro Yamada /*
239a72345SMasahiro Yamada * K2HK: secure kernel command file
339a72345SMasahiro Yamada *
439a72345SMasahiro Yamada * (C) Copyright 2012-2014
539a72345SMasahiro Yamada * Texas Instruments Incorporated, <www.ti.com>
639a72345SMasahiro Yamada *
739a72345SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+
839a72345SMasahiro Yamada */
939a72345SMasahiro Yamada
1039a72345SMasahiro Yamada #include <common.h>
1139a72345SMasahiro Yamada #include <command.h>
125d214065SLokesh Vutla #include <image.h>
13aadd3360STom Rini #include <mach/mon.h>
1439a72345SMasahiro Yamada asm(".arch_extension sec\n\t");
1539a72345SMasahiro Yamada
do_mon_install(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1639a72345SMasahiro Yamada static int do_mon_install(cmd_tbl_t *cmdtp, int flag, int argc,
1739a72345SMasahiro Yamada char * const argv[])
1839a72345SMasahiro Yamada {
195d214065SLokesh Vutla u32 addr, dpsc_base = 0x1E80000, freq, load_addr, size;
2039a72345SMasahiro Yamada int rcode = 0;
215d214065SLokesh Vutla struct image_header *header;
22*1d73ce6fSMadan Srinivas u32 ecrypt_bm_addr = 0;
2339a72345SMasahiro Yamada
2439a72345SMasahiro Yamada if (argc < 2)
2539a72345SMasahiro Yamada return CMD_RET_USAGE;
2639a72345SMasahiro Yamada
27e6d71e1cSVitaly Andrianov freq = CONFIG_SYS_HZ_CLOCK;
2839a72345SMasahiro Yamada
2939a72345SMasahiro Yamada addr = simple_strtoul(argv[1], NULL, 16);
3039a72345SMasahiro Yamada
315d214065SLokesh Vutla header = (struct image_header *)addr;
325d214065SLokesh Vutla
335d214065SLokesh Vutla if (image_get_magic(header) != IH_MAGIC) {
345d214065SLokesh Vutla printf("## Please update monitor image\n");
355d214065SLokesh Vutla return -EFAULT;
365d214065SLokesh Vutla }
375d214065SLokesh Vutla
385d214065SLokesh Vutla load_addr = image_get_load(header);
395d214065SLokesh Vutla size = image_get_data_size(header);
405d214065SLokesh Vutla memcpy((void *)load_addr, (void *)(addr + sizeof(struct image_header)),
415d214065SLokesh Vutla size);
425d214065SLokesh Vutla
43*1d73ce6fSMadan Srinivas if (argc >= 3)
44*1d73ce6fSMadan Srinivas ecrypt_bm_addr = simple_strtoul(argv[2], NULL, 16);
45*1d73ce6fSMadan Srinivas
46*1d73ce6fSMadan Srinivas rcode = mon_install(load_addr, dpsc_base, freq, ecrypt_bm_addr);
475d214065SLokesh Vutla printf("## installed monitor @ 0x%x, freq [%d], status %d\n",
485d214065SLokesh Vutla load_addr, freq, rcode);
4939a72345SMasahiro Yamada
5039a72345SMasahiro Yamada return 0;
5139a72345SMasahiro Yamada }
5239a72345SMasahiro Yamada
53*1d73ce6fSMadan Srinivas U_BOOT_CMD(mon_install, 3, 0, do_mon_install,
5439a72345SMasahiro Yamada "Install boot kernel at 'addr'",
5539a72345SMasahiro Yamada ""
5639a72345SMasahiro Yamada );
5739a72345SMasahiro Yamada
core_spin(void)5839a72345SMasahiro Yamada static void core_spin(void)
5939a72345SMasahiro Yamada {
6017c5bda2SVitaly Andrianov while (1) {
6117c5bda2SVitaly Andrianov asm volatile (
6217c5bda2SVitaly Andrianov "dsb\n"
6317c5bda2SVitaly Andrianov "isb\n"
6417c5bda2SVitaly Andrianov "wfi\n"
6517c5bda2SVitaly Andrianov );
6617c5bda2SVitaly Andrianov }
6739a72345SMasahiro Yamada }
6839a72345SMasahiro Yamada
do_mon_power(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])6939a72345SMasahiro Yamada int do_mon_power(cmd_tbl_t *cmdtp, int flag, int argc,
7039a72345SMasahiro Yamada char * const argv[])
7139a72345SMasahiro Yamada {
7239a72345SMasahiro Yamada int rcode = 0, core_id, on;
7339a72345SMasahiro Yamada void (*fn)(void);
7439a72345SMasahiro Yamada
7539a72345SMasahiro Yamada fn = core_spin;
7639a72345SMasahiro Yamada
7739a72345SMasahiro Yamada if (argc < 3)
7839a72345SMasahiro Yamada return CMD_RET_USAGE;
7939a72345SMasahiro Yamada
8039a72345SMasahiro Yamada core_id = simple_strtoul(argv[1], NULL, 16);
8139a72345SMasahiro Yamada on = simple_strtoul(argv[2], NULL, 16);
8239a72345SMasahiro Yamada
8339a72345SMasahiro Yamada if (on)
8439a72345SMasahiro Yamada rcode = mon_power_on(core_id, fn);
8539a72345SMasahiro Yamada else
8639a72345SMasahiro Yamada rcode = mon_power_off(core_id);
8739a72345SMasahiro Yamada
8839a72345SMasahiro Yamada if (on) {
8939a72345SMasahiro Yamada if (!rcode)
9039a72345SMasahiro Yamada printf("core %d powered on successfully\n", core_id);
9139a72345SMasahiro Yamada else
9239a72345SMasahiro Yamada printf("core %d power on failure\n", core_id);
9339a72345SMasahiro Yamada } else {
9439a72345SMasahiro Yamada printf("core %d powered off successfully\n", core_id);
9539a72345SMasahiro Yamada }
9639a72345SMasahiro Yamada
9739a72345SMasahiro Yamada return 0;
9839a72345SMasahiro Yamada }
9939a72345SMasahiro Yamada
10039a72345SMasahiro Yamada U_BOOT_CMD(mon_power, 3, 0, do_mon_power,
10139a72345SMasahiro Yamada "Power On/Off secondary core",
10239a72345SMasahiro Yamada "mon_power <coreid> <oper>\n"
10339a72345SMasahiro Yamada "- coreid (1-3) and oper (1 - ON, 0 - OFF)\n"
10439a72345SMasahiro Yamada ""
10539a72345SMasahiro Yamada );
106