145ce6f9eSNobuhiro Iwamatsu /*
245ce6f9eSNobuhiro Iwamatsu * (C) Copyright 2010
345ce6f9eSNobuhiro Iwamatsu * Renesas Solutions Corp.
445ce6f9eSNobuhiro Iwamatsu * Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
545ce6f9eSNobuhiro Iwamatsu *
61a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
745ce6f9eSNobuhiro Iwamatsu */
845ce6f9eSNobuhiro Iwamatsu
945ce6f9eSNobuhiro Iwamatsu /*
1045ce6f9eSNobuhiro Iwamatsu * Linux SuperH zImage loading and boot
1145ce6f9eSNobuhiro Iwamatsu */
1245ce6f9eSNobuhiro Iwamatsu
1345ce6f9eSNobuhiro Iwamatsu #include <common.h>
1445ce6f9eSNobuhiro Iwamatsu #include <asm/io.h>
1545ce6f9eSNobuhiro Iwamatsu #include <asm/zimage.h>
1645ce6f9eSNobuhiro Iwamatsu
do_sh_zimageboot(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1745ce6f9eSNobuhiro Iwamatsu int do_sh_zimageboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
1845ce6f9eSNobuhiro Iwamatsu {
1945ce6f9eSNobuhiro Iwamatsu ulong (*zboot_entry)(int, char * const []) = NULL;
2045ce6f9eSNobuhiro Iwamatsu char *s0, *s1;
2145ce6f9eSNobuhiro Iwamatsu unsigned char *param = NULL;
2245ce6f9eSNobuhiro Iwamatsu char *cmdline;
2345ce6f9eSNobuhiro Iwamatsu char *bootargs;
2445ce6f9eSNobuhiro Iwamatsu
2545ce6f9eSNobuhiro Iwamatsu disable_interrupts();
2645ce6f9eSNobuhiro Iwamatsu
2745ce6f9eSNobuhiro Iwamatsu if (argc >= 3) {
2845ce6f9eSNobuhiro Iwamatsu /* argv[1] holds the address of the zImage */
2945ce6f9eSNobuhiro Iwamatsu s0 = argv[1];
3045ce6f9eSNobuhiro Iwamatsu /* argv[2] holds the address of zero page */
3145ce6f9eSNobuhiro Iwamatsu s1 = argv[2];
3245ce6f9eSNobuhiro Iwamatsu } else {
3345ce6f9eSNobuhiro Iwamatsu goto exit;
3445ce6f9eSNobuhiro Iwamatsu }
3545ce6f9eSNobuhiro Iwamatsu
3645ce6f9eSNobuhiro Iwamatsu if (s0)
3745ce6f9eSNobuhiro Iwamatsu zboot_entry = (ulong (*)(int, char * const []))simple_strtoul(s0, NULL, 16);
3845ce6f9eSNobuhiro Iwamatsu
3945ce6f9eSNobuhiro Iwamatsu /* empty_zero_page */
4045ce6f9eSNobuhiro Iwamatsu if (s1)
4145ce6f9eSNobuhiro Iwamatsu param = (unsigned char*)simple_strtoul(s1, NULL, 16);
4245ce6f9eSNobuhiro Iwamatsu
4345ce6f9eSNobuhiro Iwamatsu /* Linux kernel command line */
4445ce6f9eSNobuhiro Iwamatsu cmdline = (char *)param + COMMAND_LINE;
45*00caae6dSSimon Glass bootargs = env_get("bootargs");
4645ce6f9eSNobuhiro Iwamatsu
4745ce6f9eSNobuhiro Iwamatsu /* Clear zero page */
480060517aSWolfgang Denk /* cppcheck-suppress nullPointer */
4945ce6f9eSNobuhiro Iwamatsu memset(param, 0, 0x1000);
5045ce6f9eSNobuhiro Iwamatsu
5145ce6f9eSNobuhiro Iwamatsu /* Set commandline */
5245ce6f9eSNobuhiro Iwamatsu strcpy(cmdline, bootargs);
5345ce6f9eSNobuhiro Iwamatsu
5445ce6f9eSNobuhiro Iwamatsu /* Boot */
5545ce6f9eSNobuhiro Iwamatsu zboot_entry(0, NULL);
5645ce6f9eSNobuhiro Iwamatsu
5745ce6f9eSNobuhiro Iwamatsu exit:
5845ce6f9eSNobuhiro Iwamatsu return -1;
5945ce6f9eSNobuhiro Iwamatsu }
6045ce6f9eSNobuhiro Iwamatsu
6145ce6f9eSNobuhiro Iwamatsu U_BOOT_CMD(
6245ce6f9eSNobuhiro Iwamatsu zimageboot, 3, 0, do_sh_zimageboot,
6345ce6f9eSNobuhiro Iwamatsu "Boot zImage for Renesas SH",
6445ce6f9eSNobuhiro Iwamatsu ""
6545ce6f9eSNobuhiro Iwamatsu );
66