blob: 4f9aae613e8ff6e56bf0f1894a5755192f3203f6 [file] [log] [blame]
wdenkc6097192002-11-03 00:24:07 +00001/*
2 * (C) Copyright 2002
3 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
4 * Marius Groeger <mgroeger@sysgo.de>
5 *
6 * Copyright (C) 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl)
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wdenk232c1502004-03-12 00:14:09 +000015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wdenkc6097192002-11-03 00:24:07 +000016 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
wdenk232c1502004-03-12 00:14:09 +000020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
wdenkc6097192002-11-03 00:24:07 +000021 *
22 */
23
24#include <common.h>
25#include <command.h>
wdenkc6097192002-11-03 00:24:07 +000026#include <image.h>
27#include <zlib.h>
28#include <asm/byteorder.h>
wdenk2abbe072003-06-16 23:50:08 +000029#ifdef CONFIG_HAS_DATAFLASH
30#include <dataflash.h>
31#endif
wdenkc6097192002-11-03 00:24:07 +000032
Wolfgang Denkd87080b2006-03-31 18:32:53 +020033DECLARE_GLOBAL_DATA_PTR;
34
wdenk8bde7f72003-06-27 21:31:46 +000035/*cmd_boot.c*/
36extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
37
wdenkc6097192002-11-03 00:24:07 +000038#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
39 defined (CONFIG_CMDLINE_TAG) || \
40 defined (CONFIG_INITRD_TAG) || \
wdenkb6e4c402004-01-02 16:05:07 +000041 defined (CONFIG_SERIAL_TAG) || \
42 defined (CONFIG_REVISION_TAG) || \
wdenk8655b6f2004-10-09 23:25:58 +000043 defined (CONFIG_VFD) || \
44 defined (CONFIG_LCD)
wdenk5779d8d2003-12-06 23:55:10 +000045static void setup_start_tag (bd_t *bd);
46
wdenk699b13a2002-11-03 18:03:52 +000047# ifdef CONFIG_SETUP_MEMORY_TAGS
wdenk5779d8d2003-12-06 23:55:10 +000048static void setup_memory_tags (bd_t *bd);
wdenk699b13a2002-11-03 18:03:52 +000049# endif
wdenk5779d8d2003-12-06 23:55:10 +000050static void setup_commandline_tag (bd_t *bd, char *commandline);
51
wdenkc6097192002-11-03 00:24:07 +000052#if 0
wdenk5779d8d2003-12-06 23:55:10 +000053static void setup_ramdisk_tag (bd_t *bd);
wdenkc6097192002-11-03 00:24:07 +000054#endif
wdenk699b13a2002-11-03 18:03:52 +000055# ifdef CONFIG_INITRD_TAG
wdenk5779d8d2003-12-06 23:55:10 +000056static void setup_initrd_tag (bd_t *bd, ulong initrd_start,
57 ulong initrd_end);
wdenk699b13a2002-11-03 18:03:52 +000058# endif
wdenk5779d8d2003-12-06 23:55:10 +000059static void setup_end_tag (bd_t *bd);
60
wdenk8655b6f2004-10-09 23:25:58 +000061# if defined (CONFIG_VFD) || defined (CONFIG_LCD)
wdenk5779d8d2003-12-06 23:55:10 +000062static void setup_videolfb_tag (gd_t *gd);
wdenk699b13a2002-11-03 18:03:52 +000063# endif
wdenkc6097192002-11-03 00:24:07 +000064
65
66static struct tag *params;
67#endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */
68
wdenk5779d8d2003-12-06 23:55:10 +000069void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
Marian Balakowiczf13e7b22008-01-08 18:12:17 +010070 image_header_t *hdr, int verify)
wdenkc6097192002-11-03 00:24:07 +000071{
Marian Balakowiczf13e7b22008-01-08 18:12:17 +010072 ulong rd_addr;
73 ulong rd_data, rd_len = 0;
wdenk5779d8d2003-12-06 23:55:10 +000074 ulong initrd_start, initrd_end;
Marian Balakowiczf13e7b22008-01-08 18:12:17 +010075 image_header_t *rd_hdr;
wdenka2663ea2003-12-07 18:32:37 +000076 void (*theKernel)(int zero, int arch, uint params);
wdenk5779d8d2003-12-06 23:55:10 +000077 bd_t *bd = gd->bd;
78
wdenkc6097192002-11-03 00:24:07 +000079#ifdef CONFIG_CMDLINE_TAG
wdenk5779d8d2003-12-06 23:55:10 +000080 char *commandline = getenv ("bootargs");
wdenkc6097192002-11-03 00:24:07 +000081#endif
82
Marian Balakowiczb97a2a02008-01-08 18:14:09 +010083 theKernel = (void (*)(int, int, uint))image_get_ep (hdr);
wdenkc6097192002-11-03 00:24:07 +000084
85 /*
wdenk5779d8d2003-12-06 23:55:10 +000086 * Check if there is an initrd image
wdenkc6097192002-11-03 00:24:07 +000087 */
wdenk5779d8d2003-12-06 23:55:10 +000088 if (argc >= 3) {
Heiko Schocherfad63402007-07-13 09:54:17 +020089 show_boot_progress (9);
wdenkc6097192002-11-03 00:24:07 +000090
Marian Balakowiczf13e7b22008-01-08 18:12:17 +010091 rd_addr = simple_strtoul (argv[2], NULL, 16);
92 printf ("## Loading Ramdisk Image at %08lx ...\n", rd_addr);
wdenk5779d8d2003-12-06 23:55:10 +000093
94 /* Copy header so we can blank CRC field for re-calculation */
95#ifdef CONFIG_HAS_DATAFLASH
Marian Balakowiczf13e7b22008-01-08 18:12:17 +010096 if (addr_dataflash (rd_addr)) {
97 rd_hdr = (image_header_t *)CFG_LOAD_ADDR;
98 read_dataflash (rd_addr, image_get_header_size (),
99 (char *)rd_hdr);
wdenk5779d8d2003-12-06 23:55:10 +0000100 } else
101#endif
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100102 rd_hdr = (image_header_t *)rd_addr;
wdenk5779d8d2003-12-06 23:55:10 +0000103
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100104 if (!image_check_magic (rd_hdr)) {
wdenk5779d8d2003-12-06 23:55:10 +0000105 printf ("Bad Magic Number\n");
Heiko Schocherfad63402007-07-13 09:54:17 +0200106 show_boot_progress (-10);
wdenk5779d8d2003-12-06 23:55:10 +0000107 do_reset (cmdtp, flag, argc, argv);
108 }
109
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100110 if (!image_check_hcrc (rd_hdr)) {
wdenk5779d8d2003-12-06 23:55:10 +0000111 printf ("Bad Header Checksum\n");
Heiko Schocherfad63402007-07-13 09:54:17 +0200112 show_boot_progress (-11);
wdenk5779d8d2003-12-06 23:55:10 +0000113 do_reset (cmdtp, flag, argc, argv);
114 }
115
Heiko Schocherfad63402007-07-13 09:54:17 +0200116 show_boot_progress (10);
wdenk5779d8d2003-12-06 23:55:10 +0000117
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100118 print_image_hdr (rd_hdr);
wdenk5779d8d2003-12-06 23:55:10 +0000119
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100120 rd_data = image_get_data (rd_hdr);
121 rd_len = image_get_data_size (rd_hdr);
wdenk5779d8d2003-12-06 23:55:10 +0000122
123#ifdef CONFIG_HAS_DATAFLASH
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100124 if (addr_dataflash (rd_addr))
125 read_dataflash (rd_addr + image_get_header_size (),
126 rd_len, (char *)rd_data);
wdenk5779d8d2003-12-06 23:55:10 +0000127#endif
128
129 if (verify) {
wdenk5779d8d2003-12-06 23:55:10 +0000130 printf (" Verifying Checksum ... ");
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100131 if (!image_get_dcrc (rd_hdr)) {
wdenk5779d8d2003-12-06 23:55:10 +0000132 printf ("Bad Data CRC\n");
Heiko Schocherfad63402007-07-13 09:54:17 +0200133 show_boot_progress (-12);
wdenk5779d8d2003-12-06 23:55:10 +0000134 do_reset (cmdtp, flag, argc, argv);
135 }
136 printf ("OK\n");
137 }
138
Heiko Schocherfad63402007-07-13 09:54:17 +0200139 show_boot_progress (11);
wdenk5779d8d2003-12-06 23:55:10 +0000140
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100141 if (!image_check_os (rd_hdr, IH_OS_LINUX) ||
142 !image_check_arch (rd_hdr, IH_ARCH_ARM) ||
143 !image_check_type (rd_hdr, IH_TYPE_RAMDISK)) {
wdenk5779d8d2003-12-06 23:55:10 +0000144 printf ("No Linux ARM Ramdisk Image\n");
Heiko Schocherfad63402007-07-13 09:54:17 +0200145 show_boot_progress (-13);
wdenk5779d8d2003-12-06 23:55:10 +0000146 do_reset (cmdtp, flag, argc, argv);
147 }
148
Wolfgang Denkc570b2f2005-09-26 01:06:33 +0200149#if defined(CONFIG_B2) || defined(CONFIG_EVB4510) || defined(CONFIG_ARMADILLO)
wdenk074cff02004-02-24 00:16:43 +0000150 /*
151 *we need to copy the ramdisk to SRAM to let Linux boot
152 */
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100153 memmove ((void *)image_get_load (rd_hdr), (uchar *)rd_data, rd_len);
154 rd_data = image_get_load (rd_hdr);
wdenka1f4a3d2004-07-11 22:19:26 +0000155#endif /* CONFIG_B2 || CONFIG_EVB4510 */
wdenk074cff02004-02-24 00:16:43 +0000156
wdenk5779d8d2003-12-06 23:55:10 +0000157 /*
158 * Now check if we have a multifile image
159 */
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100160 } else if (image_check_type (hdr, IH_TYPE_MULTI)) {
161 /*
162 * Get second entry data start address and len
163 */
Heiko Schocherfad63402007-07-13 09:54:17 +0200164 show_boot_progress (13);
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100165 image_multi_getimg (hdr, 1, &rd_data, &rd_len);
wdenk5779d8d2003-12-06 23:55:10 +0000166 } else {
167 /*
168 * no initrd image
169 */
Heiko Schocherfad63402007-07-13 09:54:17 +0200170 show_boot_progress (14);
wdenk5779d8d2003-12-06 23:55:10 +0000171
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100172 rd_len = rd_data = 0;
wdenkc6097192002-11-03 00:24:07 +0000173 }
174
wdenkc6097192002-11-03 00:24:07 +0000175#ifdef DEBUG
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100176 if (!rd_data) {
wdenk5779d8d2003-12-06 23:55:10 +0000177 printf ("No initrd\n");
178 }
wdenkc6097192002-11-03 00:24:07 +0000179#endif
180
Marian Balakowiczf13e7b22008-01-08 18:12:17 +0100181 if (rd_data) {
182 initrd_start = rd_data;
183 initrd_end = initrd_start + rd_len;
wdenk5779d8d2003-12-06 23:55:10 +0000184 } else {
185 initrd_start = 0;
186 initrd_end = 0;
187 }
wdenkc6097192002-11-03 00:24:07 +0000188
Heiko Schocherfad63402007-07-13 09:54:17 +0200189 show_boot_progress (15);
wdenk384ae022002-11-05 00:17:55 +0000190
wdenk5779d8d2003-12-06 23:55:10 +0000191 debug ("## Transferring control to Linux (at address %08lx) ...\n",
192 (ulong) theKernel);
wdenkc6097192002-11-03 00:24:07 +0000193
194#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
195 defined (CONFIG_CMDLINE_TAG) || \
196 defined (CONFIG_INITRD_TAG) || \
wdenkb6e4c402004-01-02 16:05:07 +0000197 defined (CONFIG_SERIAL_TAG) || \
198 defined (CONFIG_REVISION_TAG) || \
wdenk8655b6f2004-10-09 23:25:58 +0000199 defined (CONFIG_LCD) || \
wdenkc6097192002-11-03 00:24:07 +0000200 defined (CONFIG_VFD)
wdenk5779d8d2003-12-06 23:55:10 +0000201 setup_start_tag (bd);
wdenkb6e4c402004-01-02 16:05:07 +0000202#ifdef CONFIG_SERIAL_TAG
203 setup_serial_tag (&params);
204#endif
205#ifdef CONFIG_REVISION_TAG
206 setup_revision_tag (&params);
207#endif
wdenkc6097192002-11-03 00:24:07 +0000208#ifdef CONFIG_SETUP_MEMORY_TAGS
wdenk5779d8d2003-12-06 23:55:10 +0000209 setup_memory_tags (bd);
wdenkc6097192002-11-03 00:24:07 +0000210#endif
211#ifdef CONFIG_CMDLINE_TAG
wdenk5779d8d2003-12-06 23:55:10 +0000212 setup_commandline_tag (bd, commandline);
wdenkc6097192002-11-03 00:24:07 +0000213#endif
214#ifdef CONFIG_INITRD_TAG
wdenk5779d8d2003-12-06 23:55:10 +0000215 if (initrd_start && initrd_end)
216 setup_initrd_tag (bd, initrd_start, initrd_end);
wdenkc6097192002-11-03 00:24:07 +0000217#endif
wdenk8655b6f2004-10-09 23:25:58 +0000218#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
wdenk5779d8d2003-12-06 23:55:10 +0000219 setup_videolfb_tag ((gd_t *) gd);
wdenkc6097192002-11-03 00:24:07 +0000220#endif
wdenk5779d8d2003-12-06 23:55:10 +0000221 setup_end_tag (bd);
wdenkc6097192002-11-03 00:24:07 +0000222#endif
223
wdenk5779d8d2003-12-06 23:55:10 +0000224 /* we assume that the kernel is in place */
225 printf ("\nStarting kernel ...\n\n");
wdenkc6097192002-11-03 00:24:07 +0000226
wdenk232c1502004-03-12 00:14:09 +0000227#ifdef CONFIG_USB_DEVICE
228 {
229 extern void udc_disconnect (void);
230 udc_disconnect ();
231 }
232#endif
233
wdenk5779d8d2003-12-06 23:55:10 +0000234 cleanup_before_linux ();
wdenkc6097192002-11-03 00:24:07 +0000235
wdenka2663ea2003-12-07 18:32:37 +0000236 theKernel (0, bd->bi_arch_number, bd->bi_boot_params);
wdenkc6097192002-11-03 00:24:07 +0000237}
238
239
240#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
241 defined (CONFIG_CMDLINE_TAG) || \
242 defined (CONFIG_INITRD_TAG) || \
wdenkb6e4c402004-01-02 16:05:07 +0000243 defined (CONFIG_SERIAL_TAG) || \
244 defined (CONFIG_REVISION_TAG) || \
wdenk8655b6f2004-10-09 23:25:58 +0000245 defined (CONFIG_LCD) || \
wdenkc6097192002-11-03 00:24:07 +0000246 defined (CONFIG_VFD)
wdenk5779d8d2003-12-06 23:55:10 +0000247static void setup_start_tag (bd_t *bd)
wdenkc6097192002-11-03 00:24:07 +0000248{
wdenk5779d8d2003-12-06 23:55:10 +0000249 params = (struct tag *) bd->bi_boot_params;
wdenkc6097192002-11-03 00:24:07 +0000250
wdenk5779d8d2003-12-06 23:55:10 +0000251 params->hdr.tag = ATAG_CORE;
252 params->hdr.size = tag_size (tag_core);
wdenkc6097192002-11-03 00:24:07 +0000253
wdenk5779d8d2003-12-06 23:55:10 +0000254 params->u.core.flags = 0;
255 params->u.core.pagesize = 0;
256 params->u.core.rootdev = 0;
wdenkc6097192002-11-03 00:24:07 +0000257
wdenk5779d8d2003-12-06 23:55:10 +0000258 params = tag_next (params);
wdenkc6097192002-11-03 00:24:07 +0000259}
260
261
wdenk699b13a2002-11-03 18:03:52 +0000262#ifdef CONFIG_SETUP_MEMORY_TAGS
wdenk5779d8d2003-12-06 23:55:10 +0000263static void setup_memory_tags (bd_t *bd)
wdenkc6097192002-11-03 00:24:07 +0000264{
wdenk5779d8d2003-12-06 23:55:10 +0000265 int i;
wdenkc6097192002-11-03 00:24:07 +0000266
wdenk5779d8d2003-12-06 23:55:10 +0000267 for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
268 params->hdr.tag = ATAG_MEM;
269 params->hdr.size = tag_size (tag_mem32);
wdenkc6097192002-11-03 00:24:07 +0000270
wdenk5779d8d2003-12-06 23:55:10 +0000271 params->u.mem.start = bd->bi_dram[i].start;
272 params->u.mem.size = bd->bi_dram[i].size;
wdenkc6097192002-11-03 00:24:07 +0000273
wdenk5779d8d2003-12-06 23:55:10 +0000274 params = tag_next (params);
275 }
wdenkc6097192002-11-03 00:24:07 +0000276}
wdenk5779d8d2003-12-06 23:55:10 +0000277#endif /* CONFIG_SETUP_MEMORY_TAGS */
wdenkc6097192002-11-03 00:24:07 +0000278
279
wdenk5779d8d2003-12-06 23:55:10 +0000280static void setup_commandline_tag (bd_t *bd, char *commandline)
wdenkc6097192002-11-03 00:24:07 +0000281{
wdenk5779d8d2003-12-06 23:55:10 +0000282 char *p;
wdenkc6097192002-11-03 00:24:07 +0000283
wdenk109c0e32004-03-23 21:43:07 +0000284 if (!commandline)
285 return;
286
wdenk5779d8d2003-12-06 23:55:10 +0000287 /* eat leading white space */
288 for (p = commandline; *p == ' '; p++);
wdenkc6097192002-11-03 00:24:07 +0000289
wdenk5779d8d2003-12-06 23:55:10 +0000290 /* skip non-existent command lines so the kernel will still
291 * use its default command line.
292 */
293 if (*p == '\0')
294 return;
wdenkc6097192002-11-03 00:24:07 +0000295
wdenk5779d8d2003-12-06 23:55:10 +0000296 params->hdr.tag = ATAG_CMDLINE;
297 params->hdr.size =
298 (sizeof (struct tag_header) + strlen (p) + 1 + 4) >> 2;
wdenkc6097192002-11-03 00:24:07 +0000299
wdenk5779d8d2003-12-06 23:55:10 +0000300 strcpy (params->u.cmdline.cmdline, p);
wdenkc6097192002-11-03 00:24:07 +0000301
wdenk5779d8d2003-12-06 23:55:10 +0000302 params = tag_next (params);
wdenkc6097192002-11-03 00:24:07 +0000303}
304
305
wdenk699b13a2002-11-03 18:03:52 +0000306#ifdef CONFIG_INITRD_TAG
wdenk5779d8d2003-12-06 23:55:10 +0000307static void setup_initrd_tag (bd_t *bd, ulong initrd_start, ulong initrd_end)
wdenkc6097192002-11-03 00:24:07 +0000308{
wdenk5779d8d2003-12-06 23:55:10 +0000309 /* an ATAG_INITRD node tells the kernel where the compressed
310 * ramdisk can be found. ATAG_RDIMG is a better name, actually.
311 */
wdenk498b8db2004-04-18 22:26:17 +0000312 params->hdr.tag = ATAG_INITRD2;
wdenk5779d8d2003-12-06 23:55:10 +0000313 params->hdr.size = tag_size (tag_initrd);
wdenkc6097192002-11-03 00:24:07 +0000314
wdenk5779d8d2003-12-06 23:55:10 +0000315 params->u.initrd.start = initrd_start;
316 params->u.initrd.size = initrd_end - initrd_start;
wdenkc6097192002-11-03 00:24:07 +0000317
wdenk5779d8d2003-12-06 23:55:10 +0000318 params = tag_next (params);
wdenkc6097192002-11-03 00:24:07 +0000319}
wdenk5779d8d2003-12-06 23:55:10 +0000320#endif /* CONFIG_INITRD_TAG */
wdenkc6097192002-11-03 00:24:07 +0000321
322
wdenk8655b6f2004-10-09 23:25:58 +0000323#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
324extern ulong calc_fbsize (void);
wdenk5779d8d2003-12-06 23:55:10 +0000325static void setup_videolfb_tag (gd_t *gd)
wdenkc6097192002-11-03 00:24:07 +0000326{
wdenk5779d8d2003-12-06 23:55:10 +0000327 /* An ATAG_VIDEOLFB node tells the kernel where and how large
328 * the framebuffer for video was allocated (among other things).
329 * Note that a _physical_ address is passed !
330 *
331 * We only use it to pass the address and size, the other entries
332 * in the tag_videolfb are not of interest.
333 */
334 params->hdr.tag = ATAG_VIDEOLFB;
335 params->hdr.size = tag_size (tag_videolfb);
wdenkc6097192002-11-03 00:24:07 +0000336
wdenk5779d8d2003-12-06 23:55:10 +0000337 params->u.videolfb.lfb_base = (u32) gd->fb_base;
wdenk8655b6f2004-10-09 23:25:58 +0000338 /* Fb size is calculated according to parameters for our panel
339 */
340 params->u.videolfb.lfb_size = calc_fbsize();
wdenkc6097192002-11-03 00:24:07 +0000341
wdenk5779d8d2003-12-06 23:55:10 +0000342 params = tag_next (params);
wdenkc6097192002-11-03 00:24:07 +0000343}
wdenk8655b6f2004-10-09 23:25:58 +0000344#endif /* CONFIG_VFD || CONFIG_LCD */
wdenkc6097192002-11-03 00:24:07 +0000345
wdenk3a574cb2005-05-19 22:39:42 +0000346#ifdef CONFIG_SERIAL_TAG
347void setup_serial_tag (struct tag **tmp)
348{
349 struct tag *params = *tmp;
350 struct tag_serialnr serialnr;
351 void get_board_serial(struct tag_serialnr *serialnr);
352
353 get_board_serial(&serialnr);
354 params->hdr.tag = ATAG_SERIAL;
355 params->hdr.size = tag_size (tag_serialnr);
356 params->u.serialnr.low = serialnr.low;
357 params->u.serialnr.high= serialnr.high;
358 params = tag_next (params);
359 *tmp = params;
360}
361#endif
362
wdenk289f9322005-01-12 00:15:14 +0000363#ifdef CONFIG_REVISION_TAG
364void setup_revision_tag(struct tag **in_params)
365{
366 u32 rev = 0;
wdenk289f9322005-01-12 00:15:14 +0000367 u32 get_board_rev(void);
368
369 rev = get_board_rev();
wdenk289f9322005-01-12 00:15:14 +0000370 params->hdr.tag = ATAG_REVISION;
371 params->hdr.size = tag_size (tag_revision);
372 params->u.revision.rev = rev;
373 params = tag_next (params);
374}
375#endif /* CONFIG_REVISION_TAG */
376
377
wdenk5779d8d2003-12-06 23:55:10 +0000378static void setup_end_tag (bd_t *bd)
wdenkc6097192002-11-03 00:24:07 +0000379{
wdenk5779d8d2003-12-06 23:55:10 +0000380 params->hdr.tag = ATAG_NONE;
381 params->hdr.size = 0;
wdenkc6097192002-11-03 00:24:07 +0000382}
383
384#endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */