xref: /rk3399_rockchip-uboot/arch/arm/mach-keystone/cmd_mon.c (revision 1d73ce6f68f2799735d65448f8211de3f83110fd)
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