12e192b24SSimon Glass /* 22e192b24SSimon Glass * (C) Copyright 2000-2003 32e192b24SSimon Glass * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 42e192b24SSimon Glass * 52e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 62e192b24SSimon Glass */ 72e192b24SSimon Glass 82e192b24SSimon Glass /* 92e192b24SSimon Glass * Misc boot support 102e192b24SSimon Glass */ 112e192b24SSimon Glass #include <common.h> 122e192b24SSimon Glass #include <command.h> 132e192b24SSimon Glass #include <net.h> 14*a3d7c00bSAndy Yan #include <asm/io.h> 15*a3d7c00bSAndy Yan #include <asm/arch/boot_mode.h> 162e192b24SSimon Glass 172e192b24SSimon Glass #ifdef CONFIG_CMD_GO 182e192b24SSimon Glass 192e192b24SSimon Glass /* Allow ports to override the default behavior */ 202e192b24SSimon Glass __attribute__((weak)) 212e192b24SSimon Glass unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc, 222e192b24SSimon Glass char * const argv[]) 232e192b24SSimon Glass { 242e192b24SSimon Glass return entry (argc, argv); 252e192b24SSimon Glass } 262e192b24SSimon Glass 272e192b24SSimon Glass static int do_go(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 282e192b24SSimon Glass { 292e192b24SSimon Glass ulong addr, rc; 302e192b24SSimon Glass int rcode = 0; 312e192b24SSimon Glass 322e192b24SSimon Glass if (argc < 2) 332e192b24SSimon Glass return CMD_RET_USAGE; 342e192b24SSimon Glass 352e192b24SSimon Glass addr = simple_strtoul(argv[1], NULL, 16); 362e192b24SSimon Glass 372e192b24SSimon Glass printf ("## Starting application at 0x%08lX ...\n", addr); 382e192b24SSimon Glass 392e192b24SSimon Glass /* 402e192b24SSimon Glass * pass address parameter as argv[0] (aka command name), 412e192b24SSimon Glass * and all remaining args 422e192b24SSimon Glass */ 432e192b24SSimon Glass rc = do_go_exec ((void *)addr, argc - 1, argv + 1); 442e192b24SSimon Glass if (rc != 0) rcode = 1; 452e192b24SSimon Glass 462e192b24SSimon Glass printf ("## Application terminated, rc = 0x%lX\n", rc); 472e192b24SSimon Glass return rcode; 482e192b24SSimon Glass } 492e192b24SSimon Glass 50*a3d7c00bSAndy Yan static int do_reboot_brom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 51*a3d7c00bSAndy Yan { 52*a3d7c00bSAndy Yan writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG); 53*a3d7c00bSAndy Yan do_reset(NULL, 0, 0, NULL); 54*a3d7c00bSAndy Yan 55*a3d7c00bSAndy Yan return 0; 56*a3d7c00bSAndy Yan } 57*a3d7c00bSAndy Yan 582e192b24SSimon Glass /* -------------------------------------------------------------------- */ 592e192b24SSimon Glass 602e192b24SSimon Glass U_BOOT_CMD( 612e192b24SSimon Glass go, CONFIG_SYS_MAXARGS, 1, do_go, 622e192b24SSimon Glass "start application at address 'addr'", 632e192b24SSimon Glass "addr [arg ...]\n - start application at address 'addr'\n" 642e192b24SSimon Glass " passing 'arg' as arguments" 652e192b24SSimon Glass ); 662e192b24SSimon Glass 672e192b24SSimon Glass #endif 682e192b24SSimon Glass 692e192b24SSimon Glass U_BOOT_CMD( 70*a3d7c00bSAndy Yan rbrom, 1, 0, do_reboot_brom, 71*a3d7c00bSAndy Yan "Perform RESET of the CPU", 72*a3d7c00bSAndy Yan "" 73*a3d7c00bSAndy Yan ); 74*a3d7c00bSAndy Yan 75*a3d7c00bSAndy Yan U_BOOT_CMD( 762e192b24SSimon Glass reset, 1, 0, do_reset, 772e192b24SSimon Glass "Perform RESET of the CPU", 782e192b24SSimon Glass "" 792e192b24SSimon Glass ); 802e192b24SSimon Glass 812e192b24SSimon Glass #ifdef CONFIG_CMD_POWEROFF 822e192b24SSimon Glass U_BOOT_CMD( 832e192b24SSimon Glass poweroff, 1, 0, do_poweroff, 842e192b24SSimon Glass "Perform POWEROFF of the device", 852e192b24SSimon Glass "" 862e192b24SSimon Glass ); 872e192b24SSimon Glass #endif 88