Consolidate arch-specific mem_malloc_init() implementations
[platform/kernel/u-boot.git] / lib_m68k / board.c
1 /*
2  * (C) Copyright 2003
3  * Josef Baumgartner <josef.baumgartner@telex.de>
4  *
5  * (C) Copyright 2000-2002
6  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
7  *
8  * See file CREDITS for list of people who contributed to this
9  * project.
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License as
13  * published by the Free Software Foundation; either version 2 of
14  * the License, or (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24  * MA 02111-1307 USA
25  */
26
27 #include <common.h>
28 #include <watchdog.h>
29 #include <command.h>
30 #include <malloc.h>
31 #include <stdio_dev.h>
32
33 #include <asm/immap.h>
34
35 #if defined(CONFIG_CMD_IDE)
36 #include <ide.h>
37 #endif
38 #if defined(CONFIG_CMD_SCSI)
39 #include <scsi.h>
40 #endif
41 #if defined(CONFIG_CMD_KGDB)
42 #include <kgdb.h>
43 #endif
44 #ifdef CONFIG_STATUS_LED
45 #include <status_led.h>
46 #endif
47 #include <net.h>
48 #include <serial.h>
49 #if defined(CONFIG_CMD_BEDBUG)
50 #include <cmd_bedbug.h>
51 #endif
52 #ifdef CONFIG_SYS_ALLOC_DPRAM
53 #include <commproc.h>
54 #endif
55 #include <version.h>
56
57 #if defined(CONFIG_HARD_I2C) || \
58     defined(CONFIG_SOFT_I2C)
59 #include <i2c.h>
60 #endif
61
62 #ifdef CONFIG_CMD_SPI
63 #include <spi.h>
64 #endif
65
66 #include <nand.h>
67
68 DECLARE_GLOBAL_DATA_PTR;
69
70 static char *failed = "*** failed ***\n";
71
72 #ifdef  CONFIG_PCU_E
73 extern flash_info_t flash_info[];
74 #endif
75
76 #include <environment.h>
77
78 #if ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \
79       (CONFIG_ENV_ADDR >= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)) ) || \
80     defined(CONFIG_ENV_IS_IN_NVRAM)
81 #define TOTAL_MALLOC_LEN        (CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE)
82 #else
83 #define TOTAL_MALLOC_LEN        CONFIG_SYS_MALLOC_LEN
84 #endif
85
86 extern ulong __init_end;
87 extern ulong _end;
88
89 extern  void timer_init(void);
90
91 #if defined(CONFIG_WATCHDOG)
92 # define INIT_FUNC_WATCHDOG_INIT        watchdog_init,
93 # define WATCHDOG_DISABLE               watchdog_disable
94
95 extern int watchdog_init(void);
96 extern int watchdog_disable(void);
97 #else
98 # define INIT_FUNC_WATCHDOG_INIT        /* undef */
99 # define WATCHDOG_DISABLE               /* undef */
100 #endif /* CONFIG_WATCHDOG */
101
102 ulong monitor_flash_len;
103
104 /************************************************************************
105  * Utilities                                                            *
106  ************************************************************************
107  */
108
109 /*
110  * All attempts to come up with a "common" initialization sequence
111  * that works for all boards and architectures failed: some of the
112  * requirements are just _too_ different. To get rid of the resulting
113  * mess of board dependend #ifdef'ed code we now make the whole
114  * initialization sequence configurable to the user.
115  *
116  * The requirements for any new initalization function is simple: it
117  * receives a pointer to the "global data" structure as it's only
118  * argument, and returns an integer return code, where 0 means
119  * "continue" and != 0 means "fatal error, hang the system".
120  */
121 typedef int (init_fnc_t) (void);
122
123 /************************************************************************
124  * Init Utilities
125  ************************************************************************
126  * Some of this code should be moved into the core functions,
127  * but let's get it working (again) first...
128  */
129
130 static int init_baudrate (void)
131 {
132         char tmp[64];   /* long enough for environment variables */
133         int i = getenv_r ("baudrate", tmp, sizeof (tmp));
134
135         gd->baudrate = (i > 0)
136                         ? (int) simple_strtoul (tmp, NULL, 10)
137                         : CONFIG_BAUDRATE;
138         return (0);
139 }
140
141 /***********************************************************************/
142
143 static int init_func_ram (void)
144 {
145         int board_type = 0;     /* use dummy arg */
146         puts ("DRAM:  ");
147
148         if ((gd->ram_size = initdram (board_type)) > 0) {
149                 print_size (gd->ram_size, "\n");
150                 return (0);
151         }
152         puts (failed);
153         return (1);
154 }
155
156 /***********************************************************************/
157
158 #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
159 static int init_func_i2c (void)
160 {
161         puts ("I2C:   ");
162         i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
163         puts ("ready\n");
164         return (0);
165 }
166 #endif
167
168 #if defined(CONFIG_HARD_SPI)
169 static int init_func_spi (void)
170 {
171         puts ("SPI:   ");
172         spi_init ();
173         puts ("ready\n");
174         return (0);
175 }
176 #endif
177
178 /***********************************************************************/
179
180 /************************************************************************
181  * Initialization sequence                                              *
182  ************************************************************************
183  */
184
185 init_fnc_t *init_sequence[] = {
186         get_clocks,
187         env_init,
188         init_baudrate,
189         serial_init,
190         console_init_f,
191         display_options,
192         checkcpu,
193         checkboard,
194 #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
195         init_func_i2c,
196 #endif
197 #if defined(CONFIG_HARD_SPI)
198         init_func_spi,
199 #endif
200         init_func_ram,
201 #if defined(CONFIG_SYS_DRAM_TEST)
202         testdram,
203 #endif /* CONFIG_SYS_DRAM_TEST */
204         INIT_FUNC_WATCHDOG_INIT
205         NULL,                   /* Terminate this list */
206 };
207
208
209 /************************************************************************
210  *
211  * This is the first part of the initialization sequence that is
212  * implemented in C, but still running from ROM.
213  *
214  * The main purpose is to provide a (serial) console interface as
215  * soon as possible (so we can see any error messages), and to
216  * initialize the RAM so that we can relocate the monitor code to
217  * RAM.
218  *
219  * Be aware of the restrictions: global data is read-only, BSS is not
220  * initialized, and stack space is limited to a few kB.
221  *
222  ************************************************************************
223  */
224
225 void
226 board_init_f (ulong bootflag)
227 {
228         bd_t *bd;
229         ulong len, addr, addr_sp;
230         ulong *paddr;
231         gd_t *id;
232         init_fnc_t **init_fnc_ptr;
233 #ifdef CONFIG_PRAM
234         int i;
235         ulong reg;
236         char tmp[64];           /* long enough for environment variables */
237 #endif
238
239         /* Pointer is writable since we allocated a register for it */
240         gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
241         /* compiler optimization barrier needed for GCC >= 3.4 */
242         __asm__ __volatile__("": : :"memory");
243
244         /* Clear initial global data */
245         memset ((void *) gd, 0, sizeof (gd_t));
246
247         for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
248                 if ((*init_fnc_ptr)() != 0) {
249                         hang ();
250                 }
251         }
252
253         /*
254          * Now that we have DRAM mapped and working, we can
255          * relocate the code and continue running from DRAM.
256          *
257          * Reserve memory at end of RAM for (top down in that order):
258          *      - protected RAM
259          *      - LCD framebuffer
260          *      - monitor code
261          *      - board info struct
262          */
263         len = (ulong)&_end - CONFIG_SYS_MONITOR_BASE;
264
265         addr = CONFIG_SYS_SDRAM_BASE + gd->ram_size;
266
267 #ifdef CONFIG_LOGBUFFER
268         /* reserve kernel log buffer */
269         addr -= (LOGBUFF_RESERVE);
270         debug ("Reserving %dk for kernel logbuffer at %08lx\n", LOGBUFF_LEN, addr);
271 #endif
272
273 #ifdef CONFIG_PRAM
274         /*
275          * reserve protected RAM
276          */
277         i = getenv_r ("pram", tmp, sizeof (tmp));
278         reg = (i > 0) ? simple_strtoul (tmp, NULL, 10) : CONFIG_PRAM;
279         addr -= (reg << 10);            /* size is in kB */
280         debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
281 #endif /* CONFIG_PRAM */
282
283         /* round down to next 4 kB limit */
284         addr &= ~(4096 - 1);
285         debug ("Top of RAM usable for U-Boot at: %08lx\n", addr);
286
287 #ifdef CONFIG_LCD
288         /* reserve memory for LCD display (always full pages) */
289         addr = lcd_setmem (addr);
290         gd->fb_base = addr;
291 #endif /* CONFIG_LCD */
292
293         /*
294          * reserve memory for U-Boot code, data & bss
295          * round down to next 4 kB limit
296          */
297         addr -= len;
298         addr &= ~(4096 - 1);
299
300         debug ("Reserving %ldk for U-Boot at: %08lx\n", len >> 10, addr);
301
302         /*
303          * reserve memory for malloc() arena
304          */
305         addr_sp = addr - TOTAL_MALLOC_LEN;
306         debug ("Reserving %dk for malloc() at: %08lx\n",
307                         TOTAL_MALLOC_LEN >> 10, addr_sp);
308
309         /*
310          * (permanently) allocate a Board Info struct
311          * and a permanent copy of the "global" data
312          */
313         addr_sp -= sizeof (bd_t);
314         bd = (bd_t *) addr_sp;
315         gd->bd = bd;
316         debug ("Reserving %zu Bytes for Board Info at: %08lx\n",
317                         sizeof (bd_t), addr_sp);
318         addr_sp -= sizeof (gd_t);
319         id = (gd_t *) addr_sp;
320         debug ("Reserving %zu Bytes for Global Data at: %08lx\n",
321                         sizeof (gd_t), addr_sp);
322
323         /* Reserve memory for boot params. */
324         addr_sp -= CONFIG_SYS_BOOTPARAMS_LEN;
325         bd->bi_boot_params = addr_sp;
326         debug ("Reserving %dk for boot parameters at: %08lx\n",
327                         CONFIG_SYS_BOOTPARAMS_LEN >> 10, addr_sp);
328
329         /*
330          * Finally, we set up a new (bigger) stack.
331          *
332          * Leave some safety gap for SP, force alignment on 16 byte boundary
333          * Clear initial stack frame
334          */
335         addr_sp -= 16;
336         addr_sp &= ~0xF;
337
338         paddr = (ulong *)addr_sp;
339         *paddr-- = 0;
340         *paddr-- = 0;
341         addr_sp = (ulong)paddr;
342
343         debug ("Stack Pointer at: %08lx\n", addr_sp);
344
345         /*
346          * Save local variables to board info struct
347          */
348         bd->bi_memstart  = CONFIG_SYS_SDRAM_BASE;       /* start of  DRAM memory      */
349         bd->bi_memsize   = gd->ram_size;        /* size  of  DRAM memory in bytes */
350 #ifdef CONFIG_SYS_INIT_RAM_ADDR
351         bd->bi_sramstart = CONFIG_SYS_INIT_RAM_ADDR;    /* start of  SRAM memory        */
352         bd->bi_sramsize  = CONFIG_SYS_INIT_RAM_END;     /* size  of  SRAM memory        */
353 #endif
354         bd->bi_mbar_base = CONFIG_SYS_MBAR;             /* base of internal registers */
355
356         bd->bi_bootflags = bootflag;            /* boot / reboot flag (for LynxOS)    */
357
358         WATCHDOG_RESET ();
359         bd->bi_intfreq = gd->cpu_clk;   /* Internal Freq, in Hz */
360         bd->bi_busfreq = gd->bus_clk;   /* Bus Freq,      in Hz */
361 #ifdef CONFIG_PCI
362         bd->bi_pcifreq = gd->pci_clk;           /* PCI Freq in Hz */
363 #endif
364 #ifdef CONFIG_EXTRA_CLOCK
365         bd->bi_inpfreq = gd->inp_clk;           /* input Freq in Hz */
366         bd->bi_vcofreq = gd->vco_clk;           /* vco Freq in Hz */
367         bd->bi_flbfreq = gd->flb_clk;           /* flexbus Freq in Hz */
368 #endif
369         bd->bi_baudrate = gd->baudrate; /* Console Baudrate     */
370
371 #ifdef CONFIG_SYS_EXTBDINFO
372         strncpy (bd->bi_s_version, "1.2", sizeof (bd->bi_s_version));
373         strncpy (bd->bi_r_version, U_BOOT_VERSION, sizeof (bd->bi_r_version));
374 #endif
375
376         WATCHDOG_RESET ();
377
378 #ifdef CONFIG_POST
379         post_bootmode_init();
380         post_run (NULL, POST_ROM | post_bootmode_get(0));
381 #endif
382
383         WATCHDOG_RESET();
384
385         memcpy (id, (void *)gd, sizeof (gd_t));
386
387         debug ("Start relocate of code from %08x to %08lx\n", CONFIG_SYS_MONITOR_BASE, addr);
388         relocate_code (addr_sp, id, addr);
389
390         /* NOTREACHED - jump_to_ram() does not return */
391 }
392
393 /************************************************************************
394  *
395  * This is the next part if the initialization sequence: we are now
396  * running from RAM and have a "normal" C environment, i. e. global
397  * data can be written, BSS has been cleared, the stack size in not
398  * that critical any more, etc.
399  *
400  ************************************************************************
401  */
402 void board_init_r (gd_t *id, ulong dest_addr)
403 {
404         cmd_tbl_t *cmdtp;
405         char *s;
406         bd_t *bd;
407         extern void malloc_bin_reloc (void);
408
409 #ifndef CONFIG_ENV_IS_NOWHERE
410         extern char * env_name_spec;
411 #endif
412 #ifndef CONFIG_SYS_NO_FLASH
413         ulong flash_size;
414 #endif
415         gd = id;                /* initialize RAM version of global data */
416         bd = gd->bd;
417
418         gd->flags |= GD_FLG_RELOC;      /* tell others: relocation done */
419
420 #ifdef CONFIG_SERIAL_MULTI
421         serial_initialize();
422 #endif
423
424         debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
425
426         WATCHDOG_RESET ();
427
428         gd->reloc_off =  dest_addr - CONFIG_SYS_MONITOR_BASE;
429
430         monitor_flash_len = (ulong)&__init_end - dest_addr;
431
432         /*
433          * We have to relocate the command table manually
434          */
435         for (cmdtp = &__u_boot_cmd_start; cmdtp !=  &__u_boot_cmd_end; cmdtp++) {
436                 ulong addr;
437                 addr = (ulong) (cmdtp->cmd) + gd->reloc_off;
438 #if 0
439                 printf ("Command \"%s\": 0x%08lx => 0x%08lx\n",
440                                 cmdtp->name, (ulong) (cmdtp->cmd), addr);
441 #endif
442                 cmdtp->cmd =
443                         (int (*)(struct cmd_tbl_s *, int, int, char *[]))addr;
444
445                 addr = (ulong)(cmdtp->name) + gd->reloc_off;
446                 cmdtp->name = (char *)addr;
447
448                 if (cmdtp->usage) {
449                         addr = (ulong)(cmdtp->usage) + gd->reloc_off;
450                         cmdtp->usage = (char *)addr;
451                 }
452 #ifdef  CONFIG_SYS_LONGHELP
453                 if (cmdtp->help) {
454                         addr = (ulong)(cmdtp->help) + gd->reloc_off;
455                         cmdtp->help = (char *)addr;
456                 }
457 #endif
458         }
459         /* there are some other pointer constants we must deal with */
460 #ifndef CONFIG_ENV_IS_NOWHERE
461         env_name_spec += gd->reloc_off;
462 #endif
463
464         WATCHDOG_RESET ();
465
466 #ifdef CONFIG_LOGBUFFER
467         logbuff_init_ptrs ();
468 #endif
469 #ifdef CONFIG_POST
470         post_output_backlog ();
471         post_reloc ();
472 #endif
473         WATCHDOG_RESET();
474
475 #if 0
476         /* instruction cache enabled in cpu_init_f() for faster relocation */
477         icache_enable ();       /* it's time to enable the instruction cache */
478 #endif
479
480         /*
481          * Setup trap handlers
482          */
483         trap_init (CONFIG_SYS_SDRAM_BASE);
484
485         /* The Malloc area is immediately below the monitor copy in DRAM */
486         mem_malloc_init (CONFIG_SYS_MONITOR_BASE + gd->reloc_off -
487                         TOTAL_MALLOC_LEN, TOTAL_MALLOC_LEN);
488         malloc_bin_reloc ();
489
490 #if !defined(CONFIG_SYS_NO_FLASH)
491         puts ("FLASH: ");
492
493         if ((flash_size = flash_init ()) > 0) {
494 # ifdef CONFIG_SYS_FLASH_CHECKSUM
495                 print_size (flash_size, "");
496                 /*
497                  * Compute and print flash CRC if flashchecksum is set to 'y'
498                  *
499                  * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
500                  */
501                 s = getenv ("flashchecksum");
502                 if (s && (*s == 'y')) {
503                         printf ("  CRC: %08X",
504                                         crc32 (0,
505                                                    (const unsigned char *) CONFIG_SYS_FLASH_BASE,
506                                                    flash_size)
507                                         );
508                 }
509                 putc ('\n');
510 # else  /* !CONFIG_SYS_FLASH_CHECKSUM */
511                 print_size (flash_size, "\n");
512 # endif /* CONFIG_SYS_FLASH_CHECKSUM */
513         } else {
514                 puts (failed);
515                 hang ();
516         }
517
518         bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;      /* update start of FLASH memory    */
519         bd->bi_flashsize = flash_size;  /* size of FLASH memory (final value) */
520         bd->bi_flashoffset = 0;
521 #else   /* CONFIG_SYS_NO_FLASH */
522         bd->bi_flashsize = 0;
523         bd->bi_flashstart = 0;
524         bd->bi_flashoffset = 0;
525 #endif /* !CONFIG_SYS_NO_FLASH */
526
527         WATCHDOG_RESET ();
528
529         /* initialize higher level parts of CPU like time base and timers */
530         cpu_init_r ();
531
532         WATCHDOG_RESET ();
533
534 #ifdef CONFIG_SPI
535 # if !defined(CONFIG_ENV_IS_IN_EEPROM)
536         spi_init_f ();
537 # endif
538         spi_init_r ();
539 #endif
540
541         /* relocate environment function pointers etc. */
542         env_relocate ();
543
544         /*
545          * Fill in missing fields of bd_info.
546          * We do this here, where we have "normal" access to the
547          * environment; we used to do this still running from ROM,
548          * where had to use getenv_r(), which can be pretty slow when
549          * the environment is in EEPROM.
550          */
551         bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
552
553         WATCHDOG_RESET ();
554
555 #if defined(CONFIG_PCI)
556         /*
557          * Do pci configuration
558          */
559         pci_init ();
560 #endif
561
562         /** leave this here (after malloc(), environment and PCI are working) **/
563         /* Initialize stdio devices */
564         stdio_init ();
565
566         /* Initialize the jump table for applications */
567         jumptable_init ();
568
569         /* Initialize the console (after the relocation and devices init) */
570         console_init_r ();
571
572 #if defined(CONFIG_MISC_INIT_R)
573         /* miscellaneous platform dependent initialisations */
574         misc_init_r ();
575 #endif
576
577 #if defined(CONFIG_CMD_KGDB)
578         WATCHDOG_RESET ();
579         puts ("KGDB:  ");
580         kgdb_init ();
581 #endif
582
583         debug ("U-Boot relocated to %08lx\n", dest_addr);
584
585         /*
586          * Enable Interrupts
587          */
588         interrupt_init ();
589
590         /* Must happen after interrupts are initialized since
591          * an irq handler gets installed
592          */
593         timer_init();
594
595 #ifdef CONFIG_SERIAL_SOFTWARE_FIFO
596         serial_buffered_init();
597 #endif
598
599 #ifdef CONFIG_STATUS_LED
600         status_led_set (STATUS_LED_BOOT, STATUS_LED_BLINKING);
601 #endif
602
603         udelay (20);
604
605         set_timer (0);
606
607         /* Insert function pointers now that we have relocated the code */
608
609         /* Initialize from environment */
610         if ((s = getenv ("loadaddr")) != NULL) {
611                 load_addr = simple_strtoul (s, NULL, 16);
612         }
613 #if defined(CONFIG_CMD_NET)
614         if ((s = getenv ("bootfile")) != NULL) {
615                 copy_filename (BootFile, s, sizeof (BootFile));
616         }
617 #endif
618
619         WATCHDOG_RESET ();
620
621 #if defined(CONFIG_CMD_DOC)
622         WATCHDOG_RESET ();
623         puts ("DOC:   ");
624         doc_init ();
625 #endif
626
627 #if defined(CONFIG_CMD_NAND)
628         WATCHDOG_RESET ();
629         puts ("NAND:  ");
630         nand_init();            /* go init the NAND */
631 #endif
632
633 #if defined(CONFIG_CMD_NET)
634         WATCHDOG_RESET();
635 #if defined(FEC_ENET)
636         eth_init(bd);
637 #endif
638 #if defined(CONFIG_NET_MULTI)
639         puts ("Net:   ");
640         eth_initialize (bd);
641 #endif
642 #endif
643
644 #ifdef CONFIG_POST
645         post_run (NULL, POST_RAM | post_bootmode_get(0));
646 #endif
647
648 #if defined(CONFIG_CMD_PCMCIA) \
649     && !defined(CONFIG_CMD_IDE)
650         WATCHDOG_RESET ();
651         puts ("PCMCIA:");
652         pcmcia_init ();
653 #endif
654
655 #if defined(CONFIG_CMD_IDE)
656         WATCHDOG_RESET ();
657         puts ("IDE:   ");
658         ide_init ();
659 #endif
660
661 #ifdef CONFIG_LAST_STAGE_INIT
662         WATCHDOG_RESET ();
663         /*
664          * Some parts can be only initialized if all others (like
665          * Interrupts) are up and running (i.e. the PC-style ISA
666          * keyboard).
667          */
668         last_stage_init ();
669 #endif
670
671 #if defined(CONFIG_CMD_BEDBUG)
672         WATCHDOG_RESET ();
673         bedbug_init ();
674 #endif
675
676 #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
677         /*
678          * Export available size of memory for Linux,
679          * taking into account the protected RAM at top of memory
680          */
681         {
682                 ulong pram;
683                 char memsz[32];
684 #ifdef CONFIG_PRAM
685                 char *s;
686
687                 if ((s = getenv ("pram")) != NULL) {
688                         pram = simple_strtoul (s, NULL, 10);
689                 } else {
690                         pram = CONFIG_PRAM;
691                 }
692 #else
693                 pram=0;
694 #endif
695 #ifdef CONFIG_LOGBUFFER
696                 /* Also take the logbuffer into account (pram is in kB) */
697                 pram += (LOGBUFF_LEN+LOGBUFF_OVERHEAD)/1024;
698 #endif
699                 sprintf (memsz, "%ldk", (bd->bi_memsize / 1024) - pram);
700                 setenv ("mem", memsz);
701         }
702 #endif
703
704 #ifdef CONFIG_MODEM_SUPPORT
705  {
706          extern int do_mdm_init;
707          do_mdm_init = gd->do_mdm_init;
708  }
709 #endif
710
711 #ifdef CONFIG_WATCHDOG
712         /* disable watchdog if environment is set */
713         if ((s = getenv ("watchdog")) != NULL) {
714                 if (strncmp (s, "off", 3) == 0) {
715                         WATCHDOG_DISABLE ();
716                 }
717         }
718 #endif /* CONFIG_WATCHDOG*/
719
720
721         /* Initialization complete - start the monitor */
722
723         /* main_loop() can return to retry autoboot, if so just run it again. */
724         for (;;) {
725                 WATCHDOG_RESET ();
726                 main_loop ();
727         }
728
729         /* NOTREACHED - no way out of command loop except booting */
730 }
731
732
733 void hang(void)
734 {
735         puts ("### ERROR ### Please RESET the board ###\n");
736         for (;;);
737 }