xref: /OK3568_Linux_fs/u-boot/arch/sandbox/lib/bootm.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2011 The Chromium OS Authors.
3*4882a593Smuzhiyun  * Copyright (c) 2015 Sjoerd Simons <sjoerd.simons@collabora.co.uk>
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <asm/io.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define	LINUX_ARM_ZIMAGE_MAGIC	0x016f2818
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun struct arm_z_header {
15*4882a593Smuzhiyun 	uint32_t	code[9];
16*4882a593Smuzhiyun 	uint32_t	zi_magic;
17*4882a593Smuzhiyun 	uint32_t	zi_start;
18*4882a593Smuzhiyun 	uint32_t	zi_end;
19*4882a593Smuzhiyun } __attribute__ ((__packed__));
20*4882a593Smuzhiyun 
bootz_setup(ulong image,ulong * start,ulong * end)21*4882a593Smuzhiyun int bootz_setup(ulong image, ulong *start, ulong *end)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun 	uint8_t *zimage = map_sysmem(image, 0);
24*4882a593Smuzhiyun 	struct arm_z_header *arm_hdr = (struct arm_z_header *)zimage;
25*4882a593Smuzhiyun 	int ret = 0;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	if (memcmp(zimage + 0x202, "HdrS", 4) == 0) {
28*4882a593Smuzhiyun 		uint8_t setup_sects = *(zimage + 0x1f1);
29*4882a593Smuzhiyun 		uint32_t syssize =
30*4882a593Smuzhiyun 			le32_to_cpu(*(uint32_t *)(zimage + 0x1f4));
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 		*start = 0;
33*4882a593Smuzhiyun 		*end = (setup_sects + 1) * 512 + syssize * 16;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 		printf("setting up X86 zImage [ %ld - %ld ]\n",
36*4882a593Smuzhiyun 		       *start, *end);
37*4882a593Smuzhiyun 	} else if (le32_to_cpu(arm_hdr->zi_magic) == LINUX_ARM_ZIMAGE_MAGIC) {
38*4882a593Smuzhiyun 		*start = le32_to_cpu(arm_hdr->zi_start);
39*4882a593Smuzhiyun 		*end = le32_to_cpu(arm_hdr->zi_end);
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 		printf("setting up ARM zImage [ %ld - %ld ]\n",
42*4882a593Smuzhiyun 		       *start, *end);
43*4882a593Smuzhiyun 	} else {
44*4882a593Smuzhiyun 		printf("Unrecognized zImage\n");
45*4882a593Smuzhiyun 		ret = 1;
46*4882a593Smuzhiyun 	}
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	unmap_sysmem((void *)image);
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	return ret;
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun 
do_bootm_linux(int flag,int argc,char * argv[],bootm_headers_t * images)53*4882a593Smuzhiyun int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) {
56*4882a593Smuzhiyun 		bootstage_mark(BOOTSTAGE_ID_RUN_OS);
57*4882a593Smuzhiyun 		printf("## Transferring control to Linux (at address %08lx)...\n",
58*4882a593Smuzhiyun 		       images->ep);
59*4882a593Smuzhiyun 		printf("sandbox: continuing, as we cannot run Linux\n");
60*4882a593Smuzhiyun 	}
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	return 0;
63*4882a593Smuzhiyun }
64