uboot/arch/arm/mach-keystone/cmd_mon.c
<<
>>
Prefs
   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>
  13asm(".arch_extension sec\n\t");
  14
  15static int do_mon_install(struct cmd_tbl *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 = hextoul(argv[1], NULL);
  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 = hextoul(argv[2], NULL);
  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
  52U_BOOT_CMD(mon_install, 3, 0, do_mon_install,
  53           "Install boot kernel at 'addr'",
  54           ""
  55);
  56
  57static void core_spin(void)
  58{
  59        while (1) {
  60                asm volatile (
  61                        "dsb\n"
  62                        "isb\n"
  63                        "wfi\n"
  64                );
  65        }
  66}
  67
  68int do_mon_power(struct cmd_tbl *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 = hextoul(argv[1], NULL);
  80        on = hextoul(argv[2], NULL);
  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
  99U_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