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