Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 1 | /* |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 2 | * U-boot - bootm.c - misc boot helper functions |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 3 | * |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 4 | * Copyright (c) 2005-2008 Analog Devices Inc. |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 5 | * |
| 6 | * (C) Copyright 2000-2004 |
| 7 | * Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
| 8 | * |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 9 | * Licensed under the GPL-2 or later. |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 10 | */ |
| 11 | |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 12 | #include <common.h> |
| 13 | #include <command.h> |
| 14 | #include <image.h> |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 15 | #include <asm/blackfin.h> |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 16 | |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 17 | extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 18 | |
| 19 | #ifdef SHARED_RESOURCES |
Aubrey.Li | 3f0606a | 2007-03-09 13:38:44 +0800 | [diff] [blame] | 20 | extern void swap_to(int device_id); |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 21 | #endif |
| 22 | |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 23 | static char *make_command_line(void) |
| 24 | { |
| 25 | char *dest = (char *)CMD_LINE_ADDR; |
| 26 | char *bootargs = getenv("bootargs"); |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 27 | |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 28 | if (bootargs == NULL) |
| 29 | return NULL; |
| 30 | |
| 31 | strncpy(dest, bootargs, 0x1000); |
| 32 | dest[0xfff] = 0; |
| 33 | return dest; |
| 34 | } |
| 35 | |
| 36 | void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], |
Marian Balakowicz | 8a5ea3e | 2008-02-27 11:01:04 +0100 | [diff] [blame] | 37 | bootm_headers_t *images) |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 38 | { |
Marian Balakowicz | d5934ad | 2008-02-04 08:28:09 +0100 | [diff] [blame] | 39 | int (*appl) (char *cmdline); |
| 40 | char *cmdline; |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 41 | |
| 42 | #ifdef SHARED_RESOURCES |
| 43 | swap_to(FLASH); |
| 44 | #endif |
| 45 | |
Kumar Gala | c160a95 | 2008-08-15 08:24:36 -0500 | [diff] [blame^] | 46 | appl = (int (*)(char *))images->ep; |
Marian Balakowicz | d5934ad | 2008-02-04 08:28:09 +0100 | [diff] [blame] | 47 | |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 48 | printf("Starting Kernel at = %x\n", appl); |
| 49 | cmdline = make_command_line(); |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 50 | icache_disable(); |
| 51 | dcache_disable(); |
Aubrey.Li | 3f0606a | 2007-03-09 13:38:44 +0800 | [diff] [blame] | 52 | (*appl) (cmdline); |
Marian Balakowicz | cd7c596 | 2008-03-12 10:33:00 +0100 | [diff] [blame] | 53 | /* does not return */ |
| 54 | return; |
| 55 | |
Mike Frysinger | 9171fc8 | 2008-03-30 15:46:13 -0400 | [diff] [blame] | 56 | error: |
Kumar Gala | 3216ca9 | 2008-08-11 09:20:53 -0500 | [diff] [blame] | 57 | do_reset (cmdtp, flag, argc, argv); |
Wolfgang Denk | 6cb142f | 2006-03-12 02:12:27 +0100 | [diff] [blame] | 58 | } |