xref: /rk3399_rockchip-uboot/arch/arm/mach-keystone/cmd_mon.c (revision e6d71e1ca5dc40e871e53ad0d14d68676cf92601)
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>
1239a72345SMasahiro Yamada asm(".arch_extension sec\n\t");
1339a72345SMasahiro Yamada 
1439a72345SMasahiro Yamada static int mon_install(u32 addr, u32 dpsc, u32 freq)
1539a72345SMasahiro Yamada {
1639a72345SMasahiro Yamada 	int result;
1739a72345SMasahiro Yamada 
1839a72345SMasahiro Yamada 	__asm__ __volatile__ (
1939a72345SMasahiro Yamada 		"stmfd r13!, {lr}\n"
2039a72345SMasahiro Yamada 		"mov r0, %1\n"
2139a72345SMasahiro Yamada 		"mov r1, %2\n"
2239a72345SMasahiro Yamada 		"mov r2, %3\n"
2339a72345SMasahiro Yamada 		"blx r0\n"
2439a72345SMasahiro Yamada 		"ldmfd r13!, {lr}\n"
2539a72345SMasahiro Yamada 		: "=&r" (result)
2639a72345SMasahiro Yamada 		: "r" (addr), "r" (dpsc), "r" (freq)
2739a72345SMasahiro Yamada 		: "cc", "r0", "r1", "r2", "memory");
2839a72345SMasahiro Yamada 	return result;
2939a72345SMasahiro Yamada }
3039a72345SMasahiro Yamada 
3139a72345SMasahiro Yamada static int do_mon_install(cmd_tbl_t *cmdtp, int flag, int argc,
3239a72345SMasahiro Yamada 			  char * const argv[])
3339a72345SMasahiro Yamada {
3439a72345SMasahiro Yamada 	u32 addr, dpsc_base = 0x1E80000, freq;
3539a72345SMasahiro Yamada 	int     rcode = 0;
3639a72345SMasahiro Yamada 
3739a72345SMasahiro Yamada 	if (argc < 2)
3839a72345SMasahiro Yamada 		return CMD_RET_USAGE;
3939a72345SMasahiro Yamada 
40*e6d71e1cSVitaly Andrianov 	freq = CONFIG_SYS_HZ_CLOCK;
4139a72345SMasahiro Yamada 
4239a72345SMasahiro Yamada 	addr = simple_strtoul(argv[1], NULL, 16);
4339a72345SMasahiro Yamada 
4439a72345SMasahiro Yamada 	rcode = mon_install(addr, dpsc_base, freq);
4539a72345SMasahiro Yamada 	printf("## installed monitor, freq [%d], status %d\n",
4639a72345SMasahiro Yamada 	       freq, rcode);
4739a72345SMasahiro Yamada 
4839a72345SMasahiro Yamada 	return 0;
4939a72345SMasahiro Yamada }
5039a72345SMasahiro Yamada 
5139a72345SMasahiro Yamada U_BOOT_CMD(mon_install, 2, 0, do_mon_install,
5239a72345SMasahiro Yamada 	   "Install boot kernel at 'addr'",
5339a72345SMasahiro Yamada 	   ""
5439a72345SMasahiro Yamada );
5539a72345SMasahiro Yamada 
5639a72345SMasahiro Yamada static void core_spin(void)
5739a72345SMasahiro Yamada {
5817c5bda2SVitaly Andrianov 	while (1) {
5917c5bda2SVitaly Andrianov 		asm volatile (
6017c5bda2SVitaly Andrianov 			"dsb\n"
6117c5bda2SVitaly Andrianov 			"isb\n"
6217c5bda2SVitaly Andrianov 			"wfi\n"
6317c5bda2SVitaly Andrianov 		);
6417c5bda2SVitaly Andrianov 	}
6539a72345SMasahiro Yamada }
6639a72345SMasahiro Yamada 
6739a72345SMasahiro Yamada int mon_power_on(int core_id, void *ep)
6839a72345SMasahiro Yamada {
6939a72345SMasahiro Yamada 	int result;
7039a72345SMasahiro Yamada 
7139a72345SMasahiro Yamada 	asm volatile (
7239a72345SMasahiro Yamada 		"stmfd  r13!, {lr}\n"
7339a72345SMasahiro Yamada 		"mov r1, %1\n"
7439a72345SMasahiro Yamada 		"mov r2, %2\n"
7539a72345SMasahiro Yamada 		"mov r0, #0\n"
7639a72345SMasahiro Yamada 		"smc	#0\n"
7739a72345SMasahiro Yamada 		"ldmfd  r13!, {lr}\n"
7839a72345SMasahiro Yamada 		: "=&r" (result)
7939a72345SMasahiro Yamada 		: "r" (core_id), "r" (ep)
8039a72345SMasahiro Yamada 		: "cc", "r0", "r1", "r2", "memory");
8139a72345SMasahiro Yamada 	return  result;
8239a72345SMasahiro Yamada }
8339a72345SMasahiro Yamada 
8439a72345SMasahiro Yamada int mon_power_off(int core_id)
8539a72345SMasahiro Yamada {
8639a72345SMasahiro Yamada 	int result;
8739a72345SMasahiro Yamada 
8839a72345SMasahiro Yamada 	asm volatile (
8939a72345SMasahiro Yamada 		"stmfd  r13!, {lr}\n"
9039a72345SMasahiro Yamada 		"mov r1, %1\n"
9139a72345SMasahiro Yamada 		"mov r0, #1\n"
9239a72345SMasahiro Yamada 		"smc	#1\n"
9339a72345SMasahiro Yamada 		"ldmfd  r13!, {lr}\n"
9439a72345SMasahiro Yamada 		: "=&r" (result)
9539a72345SMasahiro Yamada 		: "r" (core_id)
9639a72345SMasahiro Yamada 		: "cc", "r0", "r1", "memory");
9739a72345SMasahiro Yamada 	return  result;
9839a72345SMasahiro Yamada }
9939a72345SMasahiro Yamada 
10039a72345SMasahiro Yamada int do_mon_power(cmd_tbl_t *cmdtp, int flag, int argc,
10139a72345SMasahiro Yamada 			char * const argv[])
10239a72345SMasahiro Yamada {
10339a72345SMasahiro Yamada 	int     rcode = 0, core_id, on;
10439a72345SMasahiro Yamada 	void (*fn)(void);
10539a72345SMasahiro Yamada 
10639a72345SMasahiro Yamada 	fn = core_spin;
10739a72345SMasahiro Yamada 
10839a72345SMasahiro Yamada 	if (argc < 3)
10939a72345SMasahiro Yamada 		return CMD_RET_USAGE;
11039a72345SMasahiro Yamada 
11139a72345SMasahiro Yamada 	core_id = simple_strtoul(argv[1], NULL, 16);
11239a72345SMasahiro Yamada 	on = simple_strtoul(argv[2], NULL, 16);
11339a72345SMasahiro Yamada 
11439a72345SMasahiro Yamada 	if (on)
11539a72345SMasahiro Yamada 		rcode = mon_power_on(core_id, fn);
11639a72345SMasahiro Yamada 	else
11739a72345SMasahiro Yamada 		rcode = mon_power_off(core_id);
11839a72345SMasahiro Yamada 
11939a72345SMasahiro Yamada 	if (on) {
12039a72345SMasahiro Yamada 		if (!rcode)
12139a72345SMasahiro Yamada 			printf("core %d powered on successfully\n", core_id);
12239a72345SMasahiro Yamada 		else
12339a72345SMasahiro Yamada 			printf("core %d power on failure\n", core_id);
12439a72345SMasahiro Yamada 	} else {
12539a72345SMasahiro Yamada 		printf("core %d powered off successfully\n", core_id);
12639a72345SMasahiro Yamada 	}
12739a72345SMasahiro Yamada 
12839a72345SMasahiro Yamada 	return 0;
12939a72345SMasahiro Yamada }
13039a72345SMasahiro Yamada 
13139a72345SMasahiro Yamada U_BOOT_CMD(mon_power, 3, 0, do_mon_power,
13239a72345SMasahiro Yamada 	   "Power On/Off secondary core",
13339a72345SMasahiro Yamada 	   "mon_power <coreid> <oper>\n"
13439a72345SMasahiro Yamada 	   "- coreid (1-3) and oper (1 - ON, 0 - OFF)\n"
13539a72345SMasahiro Yamada 	   ""
13639a72345SMasahiro Yamada );
137