xref: /rk3399_rockchip-uboot/arch/sh/lib/zimageboot.c (revision 00caae6d47645e68d6e5277aceb69592b49381a6)
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