blob: f789e24edbecbbc8c10a88852bae3b790b6bed3b [file] [log] [blame]
Wolfgang Denk6cb142f2006-03-12 02:12:27 +01001/*
Mike Frysinger9171fc82008-03-30 15:46:13 -04002 * U-boot - bootm.c - misc boot helper functions
Wolfgang Denk6cb142f2006-03-12 02:12:27 +01003 *
Mike Frysinger9171fc82008-03-30 15:46:13 -04004 * Copyright (c) 2005-2008 Analog Devices Inc.
Wolfgang Denk6cb142f2006-03-12 02:12:27 +01005 *
6 * (C) Copyright 2000-2004
7 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
8 *
Mike Frysinger9171fc82008-03-30 15:46:13 -04009 * Licensed under the GPL-2 or later.
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010010 */
11
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010012#include <common.h>
13#include <command.h>
14#include <image.h>
Mike Frysinger9171fc82008-03-30 15:46:13 -040015#include <asm/blackfin.h>
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010016
Mike Frysinger9171fc82008-03-30 15:46:13 -040017extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010018
19#ifdef SHARED_RESOURCES
Aubrey.Li3f0606a2007-03-09 13:38:44 +080020extern void swap_to(int device_id);
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010021#endif
22
Mike Frysinger9171fc82008-03-30 15:46:13 -040023static char *make_command_line(void)
24{
25 char *dest = (char *)CMD_LINE_ADDR;
26 char *bootargs = getenv("bootargs");
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010027
Mike Frysinger9171fc82008-03-30 15:46:13 -040028 if (bootargs == NULL)
29 return NULL;
30
31 strncpy(dest, bootargs, 0x1000);
32 dest[0xfff] = 0;
33 return dest;
34}
35
36void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
Marian Balakowicz8a5ea3e2008-02-27 11:01:04 +010037 bootm_headers_t *images)
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010038{
Marian Balakowiczd5934ad2008-02-04 08:28:09 +010039 int (*appl) (char *cmdline);
40 char *cmdline;
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010041
42#ifdef SHARED_RESOURCES
43 swap_to(FLASH);
44#endif
45
Kumar Galac160a952008-08-15 08:24:36 -050046 appl = (int (*)(char *))images->ep;
Marian Balakowiczd5934ad2008-02-04 08:28:09 +010047
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010048 printf("Starting Kernel at = %x\n", appl);
49 cmdline = make_command_line();
Mike Frysinger9171fc82008-03-30 15:46:13 -040050 icache_disable();
51 dcache_disable();
Aubrey.Li3f0606a2007-03-09 13:38:44 +080052 (*appl) (cmdline);
Marian Balakowiczcd7c5962008-03-12 10:33:00 +010053 /* does not return */
54 return;
55
Mike Frysinger9171fc82008-03-30 15:46:13 -040056 error:
Kumar Gala3216ca92008-08-11 09:20:53 -050057 do_reset (cmdtp, flag, argc, argv);
Wolfgang Denk6cb142f2006-03-12 02:12:27 +010058}