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