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> 14a3d7c00bSAndy Yan #include <asm/io.h> 15a3d7c00bSAndy 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 50a3d7c00bSAndy Yan static int do_reboot_brom(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 51a3d7c00bSAndy Yan { 52a3d7c00bSAndy Yan writel(BOOT_BROM_DOWNLOAD, CONFIG_ROCKCHIP_BOOT_MODE_REG); 53a3d7c00bSAndy Yan do_reset(NULL, 0, 0, NULL); 54a3d7c00bSAndy Yan 55a3d7c00bSAndy Yan return 0; 56a3d7c00bSAndy Yan } 57a3d7c00bSAndy 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 U_BOOT_CMD( 68a3d7c00bSAndy Yan rbrom, 1, 0, do_reboot_brom, 69a3d7c00bSAndy Yan "Perform RESET of the CPU", 70a3d7c00bSAndy Yan "" 71a3d7c00bSAndy Yan ); 72a3d7c00bSAndy Yan 73620cb656SKever Yang #endif 74620cb656SKever Yang 75a3d7c00bSAndy Yan U_BOOT_CMD( 76*f501ba44SJoseph Chen reset, 2, 0, do_reset, 772e192b24SSimon Glass "Perform RESET of the CPU", 782e192b24SSimon Glass "" 792e192b24SSimon Glass ); 802e192b24SSimon Glass 81*f501ba44SJoseph Chen U_BOOT_CMD( 82*f501ba44SJoseph Chen reboot, 2, 0, do_reset, 83*f501ba44SJoseph Chen "Perform RESET of the CPU, alias of 'reset'", 84*f501ba44SJoseph Chen "" 85*f501ba44SJoseph Chen ); 86*f501ba44SJoseph Chen 872e192b24SSimon Glass #ifdef CONFIG_CMD_POWEROFF 882e192b24SSimon Glass U_BOOT_CMD( 892e192b24SSimon Glass poweroff, 1, 0, do_poweroff, 902e192b24SSimon Glass "Perform POWEROFF of the device", 912e192b24SSimon Glass "" 922e192b24SSimon Glass ); 932e192b24SSimon Glass #endif 94