1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * K2HK: secure kernel command file 4 * 5 * (C) Copyright 2012-2014 6 * Texas Instruments Incorporated, <www.ti.com> 7 */ 8 9 #include <common.h> 10 #include <command.h> 11 #include <image.h> 12 #include <mach/mon.h> 13 asm(".arch_extension sec\n\t"); 14 15 static int do_mon_install(cmd_tbl_t *cmdtp, int flag, int argc, 16 char * const argv[]) 17 { 18 u32 addr, dpsc_base = 0x1E80000, freq, load_addr, size; 19 int rcode = 0; 20 struct image_header *header; 21 u32 ecrypt_bm_addr = 0; 22 23 if (argc < 2) 24 return CMD_RET_USAGE; 25 26 freq = CONFIG_SYS_HZ_CLOCK; 27 28 addr = simple_strtoul(argv[1], NULL, 16); 29 30 header = (struct image_header *)addr; 31 32 if (image_get_magic(header) != IH_MAGIC) { 33 printf("## Please update monitor image\n"); 34 return -EFAULT; 35 } 36 37 load_addr = image_get_load(header); 38 size = image_get_data_size(header); 39 memcpy((void *)load_addr, (void *)(addr + sizeof(struct image_header)), 40 size); 41 42 if (argc >= 3) 43 ecrypt_bm_addr = simple_strtoul(argv[2], NULL, 16); 44 45 rcode = mon_install(load_addr, dpsc_base, freq, ecrypt_bm_addr); 46 printf("## installed monitor @ 0x%x, freq [%d], status %d\n", 47 load_addr, freq, rcode); 48 49 return 0; 50 } 51 52 U_BOOT_CMD(mon_install, 3, 0, do_mon_install, 53 "Install boot kernel at 'addr'", 54 "" 55 ); 56 57 static void core_spin(void) 58 { 59 while (1) { 60 asm volatile ( 61 "dsb\n" 62 "isb\n" 63 "wfi\n" 64 ); 65 } 66 } 67 68 int do_mon_power(cmd_tbl_t *cmdtp, int flag, int argc, 69 char * const argv[]) 70 { 71 int rcode = 0, core_id, on; 72 void (*fn)(void); 73 74 fn = core_spin; 75 76 if (argc < 3) 77 return CMD_RET_USAGE; 78 79 core_id = simple_strtoul(argv[1], NULL, 16); 80 on = simple_strtoul(argv[2], NULL, 16); 81 82 if (on) 83 rcode = mon_power_on(core_id, fn); 84 else 85 rcode = mon_power_off(core_id); 86 87 if (on) { 88 if (!rcode) 89 printf("core %d powered on successfully\n", core_id); 90 else 91 printf("core %d power on failure\n", core_id); 92 } else { 93 printf("core %d powered off successfully\n", core_id); 94 } 95 96 return 0; 97 } 98 99 U_BOOT_CMD(mon_power, 3, 0, do_mon_power, 100 "Power On/Off secondary core", 101 "mon_power <coreid> <oper>\n" 102 "- coreid (1-3) and oper (1 - ON, 0 - OFF)\n" 103 "" 104 ); 105