Blame view

common/board_r.c 17.7 KB
6f6430d72   Simon Glass   Introduce generic...
1
2
3
4
5
6
7
8
9
  /*
   * Copyright (c) 2011 The Chromium OS Authors.
   * (C) Copyright 2002-2006
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
   * (C) Copyright 2002
   * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
   * Marius Groeger <mgroeger@sysgo.de>
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
10
   * SPDX-License-Identifier:	GPL-2.0+
6f6430d72   Simon Glass   Introduce generic...
11
12
13
   */
  
  #include <common.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
14
15
16
17
  /* TODO: can we just include all these headers whether needed or not? */
  #if defined(CONFIG_CMD_BEDBUG)
  #include <bedbug/type.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
18
19
20
21
22
  #ifdef CONFIG_HAS_DATAFLASH
  #include <dataflash.h>
  #endif
  #include <environment.h>
  #include <fdtdec.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
23
24
25
  #if defined(CONFIG_CMD_IDE)
  #include <ide.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
26
  #include <initcall.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
27
28
29
30
31
32
  #ifdef CONFIG_PS2KBD
  #include <keyboard.h>
  #endif
  #if defined(CONFIG_CMD_KGDB)
  #include <kgdb.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
33
34
  #include <logbuff.h>
  #include <malloc.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
35
36
37
  #ifdef CONFIG_BITBANGMII
  #include <miiphy.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
38
39
40
  #include <mmc.h>
  #include <nand.h>
  #include <onenand_uboot.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
41
  #include <scsi.h>
6f6430d72   Simon Glass   Introduce generic...
42
  #include <serial.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
43
  #include <spi.h>
6f6430d72   Simon Glass   Introduce generic...
44
  #include <stdio_dev.h>
71c52dba2   Simon Glass   Add trace support...
45
  #include <trace.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
46
47
48
49
  #include <watchdog.h>
  #ifdef CONFIG_ADDR_MAP
  #include <asm/mmu.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
50
  #include <asm/sections.h>
be274b99a   Simon Glass   x86: Adjust board...
51
52
53
  #ifdef CONFIG_X86
  #include <asm/init_helpers.h>
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
54
  #include <linux/compiler.h>
6f6430d72   Simon Glass   Introduce generic...
55
56
57
58
  
  DECLARE_GLOBAL_DATA_PTR;
  
  ulong monitor_flash_len;
c2240d4db   Simon Glass   Adjust board_r.c ...
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  int __board_flash_wp_on(void)
  {
  	/*
  	 * Most flashes can't be detected when write protection is enabled,
  	 * so provide a way to let U-Boot gracefully ignore write protected
  	 * devices.
  	 */
  	return 0;
  }
  
  int board_flash_wp_on(void)
  	__attribute__ ((weak, alias("__board_flash_wp_on")));
  
  void __cpu_secondary_init_r(void)
  {
  }
  
  void cpu_secondary_init_r(void)
  	__attribute__ ((weak, alias("__cpu_secondary_init_r")));
  
  static int initr_secondary_cpu(void)
  {
  	/*
  	 * after non-volatile devices & environment is setup and cpu code have
  	 * another round to deal with any initialization that might require
  	 * full access to the environment or loading of some image (firmware)
  	 * from a non-volatile device
  	 */
  	/* TODO: maybe define this for all archs? */
  	cpu_secondary_init_r();
  
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
92

71c52dba2   Simon Glass   Add trace support...
93
94
95
96
97
98
99
100
  static int initr_trace(void)
  {
  #ifdef CONFIG_TRACE
  	trace_init(gd->trace_buff, CONFIG_TRACE_BUFFER_SIZE);
  #endif
  
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  static int initr_reloc(void)
  {
  	gd->flags |= GD_FLG_RELOC;	/* tell others: relocation done */
  	bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r");
  
  	return 0;
  }
  
  #ifdef CONFIG_ARM
  /*
   * Some of these functions are needed purely because the functions they
   * call return void. If we change them to return 0, these stubs can go away.
   */
  static int initr_caches(void)
  {
  	/* Enable caches */
  	enable_caches();
  	return 0;
  }
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
121
122
123
124
  __weak int fixup_cpu(void)
  {
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
125
126
127
128
  static int initr_reloc_global_data(void)
  {
  #ifdef CONFIG_SYS_SYM_OFFSETS
  	monitor_flash_len = _end_ofs;
a733b06b6   Simon Glass   sandbox: Switch o...
129
  #elif !defined(CONFIG_SANDBOX)
a0ba279ac   Masahiro Yamada   generic_board: re...
130
  	monitor_flash_len = (ulong)&__init_end - gd->relocaddr;
6f6430d72   Simon Glass   Introduce generic...
131
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
132
133
134
135
136
137
  #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
  	/*
  	 * The gd->cpu pointer is set to an address in flash before relocation.
  	 * We need to update it to point to the same CPU entry in RAM.
  	 * TODO: why not just add gd->reloc_ofs?
  	 */
a0ba279ac   Masahiro Yamada   generic_board: re...
138
  	gd->arch.cpu += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
c2240d4db   Simon Glass   Adjust board_r.c ...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  
  	/*
  	 * If we didn't know the cpu mask & # cores, we can save them of
  	 * now rather than 'computing' them constantly
  	 */
  	fixup_cpu();
  #endif
  #ifdef CONFIG_SYS_EXTRA_ENV_RELOC
  	/*
  	 * Some systems need to relocate the env_addr pointer early because the
  	 * location it points to will get invalidated before env_relocate is
  	 * called.  One example is on systems that might use a L2 or L3 cache
  	 * in SRAM mode and initialize that cache from SRAM mode back to being
  	 * a cache in cpu_init_r.
  	 */
a0ba279ac   Masahiro Yamada   generic_board: re...
154
  	gd->env_addr += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
c2240d4db   Simon Glass   Adjust board_r.c ...
155
156
  #endif
  	return 0;
6f6430d72   Simon Glass   Introduce generic...
157
158
159
160
161
162
163
  }
  
  static int initr_serial(void)
  {
  	serial_initialize();
  	return 0;
  }
c2240d4db   Simon Glass   Adjust board_r.c ...
164
165
166
167
168
169
  #ifdef CONFIG_PPC
  static int initr_trap(void)
  {
  	/*
  	 * Setup trap handlers
  	 */
a0ba279ac   Masahiro Yamada   generic_board: re...
170
  	trap_init(gd->relocaddr);
c2240d4db   Simon Glass   Adjust board_r.c ...
171
172
173
174
175
176
177
178
179
180
181
182
183
  
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_ADDR_MAP
  static int initr_addr_map(void)
  {
  	init_addr_map();
  
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
  #ifdef CONFIG_LOGBUFFER
  unsigned long logbuffer_base(void)
  {
  	return gd->ram_top - LOGBUFF_LEN;
  }
  
  static int initr_logbuffer(void)
  {
  	logbuff_init_ptrs();
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_POST
  static int initr_post_backlog(void)
  {
  	post_output_backlog();
  	return 0;
  }
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
  #ifdef CONFIG_SYS_DELAYED_ICACHE
  static int initr_icache_enable(void)
  {
  	return 0;
  }
  #endif
  
  #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
  static int initr_unlock_ram_in_cache(void)
  {
  	unlock_ram_in_cache();	/* it's time to unlock D-cache in e500 */
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_PCI
  static int initr_pci(void)
  {
  	pci_init();
  
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_WINBOND_83C553
  static int initr_w83c553f(void)
  {
  	/*
  	 * Initialise the ISA bridge
  	 */
  	initialise_w83c553f();
  	return 0;
  }
  #endif
  
  static int initr_barrier(void)
  {
  #ifdef CONFIG_PPC
  	/* TODO: Can we not use dmb() macros for this? */
  	asm("sync ; isync");
  #endif
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
247
248
249
250
251
  static int initr_malloc(void)
  {
  	ulong malloc_start;
  
  	/* The malloc area is immediately below the monitor copy in DRAM */
a0ba279ac   Masahiro Yamada   generic_board: re...
252
  	malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN;
a733b06b6   Simon Glass   sandbox: Switch o...
253
254
  	mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN),
  			TOTAL_MALLOC_LEN);
6f6430d72   Simon Glass   Introduce generic...
255
256
257
258
259
260
261
262
263
264
  	return 0;
  }
  
  __weak int power_init_board(void)
  {
  	return 0;
  }
  
  static int initr_announce(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
265
266
  	debug("Now running in RAM - U-Boot at: %08lx
  ", gd->relocaddr);
6f6430d72   Simon Glass   Introduce generic...
267
268
269
270
271
272
  	return 0;
  }
  
  #if !defined(CONFIG_SYS_NO_FLASH)
  static int initr_flash(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
273
274
275
  	ulong flash_size = 0;
  	bd_t *bd = gd->bd;
  	int ok;
6f6430d72   Simon Glass   Introduce generic...
276
277
  
  	puts("Flash: ");
c2240d4db   Simon Glass   Adjust board_r.c ...
278
279
280
281
282
283
284
285
286
287
  	if (board_flash_wp_on()) {
  		printf("Uninitialized - Write Protect On
  ");
  		/* Since WP is on, we can't find real size.  Set to 0 */
  		ok = 1;
  	} else {
  		flash_size = flash_init();
  		ok = flash_size > 0;
  	}
  	if (!ok) {
6f6430d72   Simon Glass   Introduce generic...
288
289
  		puts("*** failed ***
  ");
c2240d4db   Simon Glass   Adjust board_r.c ...
290
291
292
293
  #ifdef CONFIG_PPC
  		/* Why does PPC do this? */
  		hang();
  #endif
6f6430d72   Simon Glass   Introduce generic...
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
  		return -1;
  	}
  	print_size(flash_size, "");
  #ifdef CONFIG_SYS_FLASH_CHECKSUM
  	/*
  	* Compute and print flash CRC if flashchecksum is set to 'y'
  	*
  	* NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
  	*/
  	if (getenv_yesno("flashchecksum") == 1) {
  		printf("  CRC: %08X", crc32(0,
  			(const unsigned char *) CONFIG_SYS_FLASH_BASE,
  			flash_size));
  	}
  #endif /* CONFIG_SYS_FLASH_CHECKSUM */
  	putc('
  ');
c2240d4db   Simon Glass   Adjust board_r.c ...
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
  	/* update start of FLASH memory    */
  #ifdef CONFIG_SYS_FLASH_BASE
  	bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
  #endif
  	/* size of FLASH memory (final value) */
  	bd->bi_flashsize = flash_size;
  
  #if defined(CONFIG_SYS_UPDATE_FLASH_SIZE)
  	/* Make a update of the Memctrl. */
  	update_flash_size(flash_size);
  #endif
  
  
  #if defined(CONFIG_OXC) || defined(CONFIG_RMU)
  	/* flash mapped at end of memory map */
  	bd->bi_flashoffset = CONFIG_SYS_TEXT_BASE + flash_size;
  #elif CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE
  	bd->bi_flashoffset = monitor_flash_len;	/* reserved area for monitor */
  #endif
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_PPC
  static int initr_spi(void)
  {
  	/* PPC does this here */
  #ifdef CONFIG_SPI
  #if !defined(CONFIG_ENV_IS_IN_EEPROM)
  	spi_init_f();
  #endif
  	spi_init_r();
  #endif
6f6430d72   Simon Glass   Introduce generic...
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_CMD_NAND
  /* go init the NAND */
  int initr_nand(void)
  {
  	puts("NAND:  ");
  	nand_init();
  	return 0;
  }
  #endif
  
  #if defined(CONFIG_CMD_ONENAND)
  /* go init the NAND */
  int initr_onenand(void)
  {
  	puts("NAND:  ");
  	onenand_init();
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_GENERIC_MMC
  int initr_mmc(void)
  {
  	puts("MMC:   ");
  	mmc_initialize(gd->bd);
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_HAS_DATAFLASH
  int initr_dataflash(void)
  {
  	AT91F_DataflashInit();
  	dataflash_print_info();
  	return 0;
  }
  #endif
  
  /*
   * Tell if it's OK to load the environment early in boot.
   *
   * If CONFIG_OF_CONFIG is defined, we'll check with the FDT to see
   * if this is OK (defaulting to saying it's OK).
   *
   * NOTE: Loading the environment early can be a bad idea if security is
   *       important, since no verification is done on the environment.
   *
   * @return 0 if environment should not be loaded, !=0 if it is ok to load
   */
  static int should_load_env(void)
  {
  #ifdef CONFIG_OF_CONTROL
  	return fdtdec_get_config_int(gd->fdt_blob, "load-environment", 1);
  #elif defined CONFIG_DELAY_ENVIRONMENT
  	return 0;
  #else
  	return 1;
  #endif
  }
  
  static int initr_env(void)
  {
  	/* initialize environment */
  	if (should_load_env())
  		env_relocate();
  	else
  		set_default_env(NULL);
  
  	/* Initialize from environment */
  	load_addr = getenv_ulong("loadaddr", 16, load_addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
  #if defined(CONFIG_SYS_EXTBDINFO)
  #if defined(CONFIG_405GP) || defined(CONFIG_405EP)
  #if defined(CONFIG_I2CFAST)
  	/*
  	 * set bi_iic_fast for linux taking environment variable
  	 * "i2cfast" into account
  	 */
  	{
  		char *s = getenv("i2cfast");
  
  		if (s && ((*s == 'y') || (*s == 'Y'))) {
  			gd->bd->bi_iic_fast[0] = 1;
  			gd->bd->bi_iic_fast[1] = 1;
  		}
  	}
  #endif /* CONFIG_I2CFAST */
  #endif /* CONFIG_405GP, CONFIG_405EP */
  #endif /* CONFIG_SYS_EXTBDINFO */
  	return 0;
  }
  
  #ifdef	CONFIG_HERMES
  static int initr_hermes(void)
  {
  	if ((gd->board_type >> 16) == 2)
  		gd->bd->bi_ethspeed = gd->board_type & 0xFFFF;
  	else
  		gd->bd->bi_ethspeed = 0xFFFF;
  	return 0;
  }
  
  static int initr_hermes_start(void)
  {
  	if (gd->bd->bi_ethspeed != 0xFFFF)
  		hermes_start_lxt980((int) gd->bd->bi_ethspeed);
6f6430d72   Simon Glass   Introduce generic...
453
454
  	return 0;
  }
c2240d4db   Simon Glass   Adjust board_r.c ...
455
456
457
458
459
460
461
462
463
464
465
466
  #endif
  
  #ifdef CONFIG_SC3
  /* TODO: with new initcalls, move this into the driver */
  extern void sc3_read_eeprom(void);
  
  static int initr_sc3_read_eeprom(void)
  {
  	sc3_read_eeprom();
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
  
  static int initr_jumptable(void)
  {
  	jumptable_init();
  	return 0;
  }
  
  #if defined(CONFIG_API)
  static int initr_api(void)
  {
  	/* Initialize API */
  	api_init();
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_DISPLAY_BOARDINFO_LATE
  static int show_model_r(void)
  {
  	/* Put this here so it appears on the LCD, now it is ready */
  # ifdef CONFIG_OF_CONTROL
  	const char *model;
  
  	model = (char *)fdt_getprop(gd->fdt_blob, 0, "model", NULL);
  	printf("Model: %s
  ", model ? model : "<unknown>");
  # else
  	checkboard();
  # endif
  }
  #endif
  
  /* enable exceptions */
e424c15c1   Simon Glass   x86: Enable gener...
500
  #ifdef CONFIG_ARM
6f6430d72   Simon Glass   Introduce generic...
501
502
503
504
505
  static int initr_enable_interrupts(void)
  {
  	enable_interrupts();
  	return 0;
  }
e424c15c1   Simon Glass   x86: Enable gener...
506
  #endif
6f6430d72   Simon Glass   Introduce generic...
507
508
509
510
  
  #ifdef CONFIG_CMD_NET
  static int initr_ethaddr(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
  	bd_t *bd = gd->bd;
  
  	/* kept around for legacy kernels only ... ignore the next section */
  	eth_getenv_enetaddr("ethaddr", bd->bi_enetaddr);
  #ifdef CONFIG_HAS_ETH1
  	eth_getenv_enetaddr("eth1addr", bd->bi_enet1addr);
  #endif
  #ifdef CONFIG_HAS_ETH2
  	eth_getenv_enetaddr("eth2addr", bd->bi_enet2addr);
  #endif
  #ifdef CONFIG_HAS_ETH3
  	eth_getenv_enetaddr("eth3addr", bd->bi_enet3addr);
  #endif
  #ifdef CONFIG_HAS_ETH4
  	eth_getenv_enetaddr("eth4addr", bd->bi_enet4addr);
  #endif
  #ifdef CONFIG_HAS_ETH5
  	eth_getenv_enetaddr("eth5addr", bd->bi_enet5addr);
  #endif
  	return 0;
  }
  #endif /* CONFIG_CMD_NET */
  
  #ifdef CONFIG_CMD_KGDB
  static int initr_kgdb(void)
  {
  	puts("KGDB:  ");
  	kgdb_init();
  	return 0;
  }
  #endif
  
  #if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
  static int initr_status_led(void)
  {
  	status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
  
  	return 0;
  }
  #endif
  
  #if defined(CONFIG_CMD_SCSI)
  static int initr_scsi(void)
  {
  	/* Not supported properly on ARM yet */
  #ifndef CONFIG_ARM
  	puts("SCSI:  ");
  	scsi_init();
  #endif
6f6430d72   Simon Glass   Introduce generic...
560
561
562
563
  
  	return 0;
  }
  #endif /* CONFIG_CMD_NET */
c2240d4db   Simon Glass   Adjust board_r.c ...
564
565
566
567
568
569
570
  #if defined(CONFIG_CMD_DOC)
  static int initr_doc(void)
  {
  	puts("DOC:   ");
  	doc_init();
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
  #ifdef CONFIG_BITBANGMII
  static int initr_bbmii(void)
  {
  	bb_miiphy_init();
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_CMD_NET
  static int initr_net(void)
  {
  	puts("Net:   ");
  	eth_initialize(gd->bd);
  #if defined(CONFIG_RESET_PHY_R)
  	debug("Reset Ethernet PHY
  ");
  	reset_phy();
  #endif
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_POST
  static int initr_post(void)
  {
  	post_run(NULL, POST_RAM | post_bootmode_get(0));
  	return 0;
  }
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
  #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
  static int initr_pcmcia(void)
  {
  	puts("PCMCIA:");
  	pcmcia_init();
  	return 0;
  }
  #endif
  
  #if defined(CONFIG_CMD_IDE)
  static int initr_ide(void)
  {
  #ifdef	CONFIG_IDE_8xx_PCCARD
  	puts("PCMCIA:");
  #else
  	puts("IDE:   ");
  #endif
  #if defined(CONFIG_START_IDE)
  	if (board_start_ide())
  		ide_init();
  #else
  	ide_init();
  #endif
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
  #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
  /*
   * Export available size of memory for Linux, taking into account the
   * protected RAM at top of memory
   */
  int initr_mem(void)
  {
  	ulong pram = 0;
  	char memsz[32];
  
  # ifdef CONFIG_PRAM
  	pram = getenv_ulong("pram", 10, CONFIG_PRAM);
  # endif
  # if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR)
  	/* Also take the logbuffer into account (pram is in kB) */
  	pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / 1024;
  # endif
  	sprintf(memsz, "%ldk", (gd->ram_size / 1024) - pram);
  	setenv("mem", memsz);
c2240d4db   Simon Glass   Adjust board_r.c ...
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
  
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_CMD_BEDBUG
  static int initr_bedbug(void)
  {
  	bedbug_init();
  
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_PS2KBD
  static int initr_kbd(void)
  {
  	puts("PS/2:  ");
  	kbd_init();
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_MODEM_SUPPORT
  static int initr_modem(void)
  {
  	/* TODO: with new initcalls, move this into the driver */
  	extern int do_mdm_init;
  
  	do_mdm_init = gd->do_mdm_init;
  	return 0;
6f6430d72   Simon Glass   Introduce generic...
676
677
678
679
680
  }
  #endif
  
  static int run_main_loop(void)
  {
a733b06b6   Simon Glass   sandbox: Switch o...
681
682
683
  #ifdef CONFIG_SANDBOX
  	sandbox_main_loop_init();
  #endif
6f6430d72   Simon Glass   Introduce generic...
684
685
686
687
688
689
690
691
692
693
694
695
  	/* main_loop() can return to retry autoboot, if so just run it again */
  	for (;;)
  		main_loop();
  	return 0;
  }
  
  /*
   * Over time we hope to remove these functions with code fragments and
   * stub funtcions, and instead call the relevant function directly.
   *
   * We also hope to remove most of the driver-related init and do it if/when
   * the driver is later used.
c2240d4db   Simon Glass   Adjust board_r.c ...
696
697
   *
   * TODO: perhaps reset the watchdog in the initcall function after each call?
6f6430d72   Simon Glass   Introduce generic...
698
699
   */
  init_fnc_t init_sequence_r[] = {
71c52dba2   Simon Glass   Add trace support...
700
  	initr_trace,
6f6430d72   Simon Glass   Introduce generic...
701
  	initr_reloc,
c2240d4db   Simon Glass   Adjust board_r.c ...
702
  	/* TODO: could x86/PPC have this also perhaps? */
6f6430d72   Simon Glass   Introduce generic...
703
704
705
706
  #ifdef CONFIG_ARM
  	initr_caches,
  	board_init,	/* Setup chipselects */
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
707
708
709
710
711
712
713
714
715
  	/*
  	 * TODO: printing of the clock inforamtion of the board is now
  	 * implemented as part of bdinfo command. Currently only support for
  	 * davinci SOC's is added. Remove this check once all the board
  	 * implement this.
  	 */
  #ifdef CONFIG_CLOCKS
  	set_cpu_clk_info, /* Setup clock information */
  #endif
6f6430d72   Simon Glass   Introduce generic...
716
717
718
  	initr_reloc_global_data,
  	initr_serial,
  	initr_announce,
c2240d4db   Simon Glass   Adjust board_r.c ...
719
720
721
722
723
724
725
726
727
728
729
  	INIT_FUNC_WATCHDOG_RESET
  #ifdef CONFIG_PPC
  	initr_trap,
  #endif
  #ifdef CONFIG_ADDR_MAP
  	initr_addr_map,
  #endif
  #if defined(CONFIG_BOARD_EARLY_INIT_R)
  	board_early_init_r,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
6f6430d72   Simon Glass   Introduce generic...
730
731
732
733
734
735
  #ifdef CONFIG_LOGBUFFER
  	initr_logbuffer,
  #endif
  #ifdef CONFIG_POST
  	initr_post_backlog,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
  	INIT_FUNC_WATCHDOG_RESET
  #ifdef CONFIG_SYS_DELAYED_ICACHE
  	initr_icache_enable,
  #endif
  #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
  	initr_unlock_ram_in_cache,
  #endif
  #if defined(CONFIG_PCI) && defined(CONFIG_SYS_EARLY_PCI_INIT)
  	/*
  	 * Do early PCI configuration _before_ the flash gets initialised,
  	 * because PCU ressources are crucial for flash access on some boards.
  	 */
  	initr_pci,
  #endif
  #ifdef CONFIG_WINBOND_83C553
  	initr_w83c553f,
  #endif
  	initr_barrier,
6f6430d72   Simon Glass   Introduce generic...
754
  	initr_malloc,
158e7d059   Doug Anderson   Call bootstage_re...
755
  	bootstage_relocate,
6f6430d72   Simon Glass   Introduce generic...
756
757
758
759
760
761
762
  #ifdef CONFIG_ARCH_EARLY_INIT_R
  	arch_early_init_r,
  #endif
  	power_init_board,
  #ifndef CONFIG_SYS_NO_FLASH
  	initr_flash,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
763
  	INIT_FUNC_WATCHDOG_RESET
be274b99a   Simon Glass   x86: Adjust board...
764
  #if defined(CONFIG_PPC) || defined(CONFIG_X86)
c2240d4db   Simon Glass   Adjust board_r.c ...
765
766
  	/* initialize higher level parts of CPU like time base and timers */
  	cpu_init_r,
be274b99a   Simon Glass   x86: Adjust board...
767
768
  #endif
  #ifdef CONFIG_PPC
c2240d4db   Simon Glass   Adjust board_r.c ...
769
770
  	initr_spi,
  #endif
be274b99a   Simon Glass   x86: Adjust board...
771
772
773
  #if defined(CONFIG_X86) && defined(CONFIG_SPI)
  	init_func_spi,
  #endif
6f6430d72   Simon Glass   Introduce generic...
774
775
776
777
778
779
780
781
782
783
784
785
786
  #ifdef CONFIG_CMD_NAND
  	initr_nand,
  #endif
  #ifdef CONFIG_CMD_ONENAND
  	initr_onenand,
  #endif
  #ifdef CONFIG_GENERIC_MMC
  	initr_mmc,
  #endif
  #ifdef CONFIG_HAS_DATAFLASH
  	initr_dataflash,
  #endif
  	initr_env,
c2240d4db   Simon Glass   Adjust board_r.c ...
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
  	INIT_FUNC_WATCHDOG_RESET
  	initr_secondary_cpu,
  #ifdef CONFIG_SC3
  	initr_sc3_read_eeprom,
  #endif
  #ifdef	CONFIG_HERMES
  	initr_hermes,
  #endif
  #if defined(CONFIG_ID_EEPROM) || defined(CONFIG_SYS_I2C_MAC_OFFSET)
  	mac_read_from_eeprom,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
  #if defined(CONFIG_PCI) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
  	/*
  	 * Do pci configuration
  	 */
  	initr_pci,
  #endif
6f6430d72   Simon Glass   Introduce generic...
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
  	stdio_init,
  	initr_jumptable,
  #ifdef CONFIG_API
  	initr_api,
  #endif
  	console_init_r,		/* fully init console as a device */
  #ifdef CONFIG_DISPLAY_BOARDINFO_LATE
  	show_model_r,
  #endif
  #ifdef CONFIG_ARCH_MISC_INIT
  	arch_misc_init,		/* miscellaneous arch-dependent init */
  #endif
  #ifdef CONFIG_MISC_INIT_R
  	misc_init_r,		/* miscellaneous platform-dependent init */
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
820
821
822
823
824
825
826
  #ifdef CONFIG_HERMES
  	initr_hermes_start,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
  #ifdef CONFIG_CMD_KGDB
  	initr_kgdb,
  #endif
be274b99a   Simon Glass   x86: Adjust board...
827
828
829
  #ifdef CONFIG_X86
  	board_early_init_r,
  #endif
6f6430d72   Simon Glass   Introduce generic...
830
  	interrupt_init,
be274b99a   Simon Glass   x86: Adjust board...
831
  #if defined(CONFIG_ARM) || defined(CONFIG_x86)
6f6430d72   Simon Glass   Introduce generic...
832
  	initr_enable_interrupts,
c2240d4db   Simon Glass   Adjust board_r.c ...
833
  #endif
be274b99a   Simon Glass   x86: Adjust board...
834
835
836
  #ifdef CONFIG_X86
  	timer_init,		/* initialize timer */
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
837
838
839
840
  #if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
  	initr_status_led,
  #endif
  	/* PPC has a udelay(20) here dating from 2002. Why? */
6f6430d72   Simon Glass   Introduce generic...
841
842
843
844
845
846
  #ifdef CONFIG_CMD_NET
  	initr_ethaddr,
  #endif
  #ifdef CONFIG_BOARD_LATE_INIT
  	board_late_init,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
847
848
849
850
851
852
853
854
  #ifdef CONFIG_CMD_SCSI
  	INIT_FUNC_WATCHDOG_RESET
  	initr_scsi,
  #endif
  #ifdef CONFIG_CMD_DOC
  	INIT_FUNC_WATCHDOG_RESET
  	initr_doc,
  #endif
6f6430d72   Simon Glass   Introduce generic...
855
856
857
858
  #ifdef CONFIG_BITBANGMII
  	initr_bbmii,
  #endif
  #ifdef CONFIG_CMD_NET
c2240d4db   Simon Glass   Adjust board_r.c ...
859
  	INIT_FUNC_WATCHDOG_RESET
6f6430d72   Simon Glass   Introduce generic...
860
861
862
863
864
  	initr_net,
  #endif
  #ifdef CONFIG_POST
  	initr_post,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
  #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
  	initr_pcmcia,
  #endif
  #if defined(CONFIG_CMD_IDE)
  	initr_ide,
  #endif
  #ifdef CONFIG_LAST_STAGE_INIT
  	INIT_FUNC_WATCHDOG_RESET
  	/*
  	 * Some parts can be only initialized if all others (like
  	 * Interrupts) are up and running (i.e. the PC-style ISA
  	 * keyboard).
  	 */
  	last_stage_init,
  #endif
  #ifdef CONFIG_CMD_BEDBUG
  	INIT_FUNC_WATCHDOG_RESET
  	initr_bedbug,
  #endif
  #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
  	initr_mem,
  #endif
  #ifdef CONFIG_PS2KBD
  	initr_kbd,
  #endif
  #ifdef CONFIG_MODEM_SUPPORT
  	initr_modem,
  #endif
6f6430d72   Simon Glass   Introduce generic...
893
894
895
896
897
  	run_main_loop,
  };
  
  void board_init_r(gd_t *new_gd, ulong dest_addr)
  {
7395398ad   Alexey Brodkin   board_r - fixup f...
898
899
900
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  	int i;
  #endif
be274b99a   Simon Glass   x86: Adjust board...
901
  #ifndef CONFIG_X86
6f6430d72   Simon Glass   Introduce generic...
902
  	gd = new_gd;
be274b99a   Simon Glass   x86: Adjust board...
903
  #endif
7395398ad   Alexey Brodkin   board_r - fixup f...
904
905
906
907
908
  
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  	for (i = 0; i < ARRAY_SIZE(init_sequence_r); i++)
  		init_sequence_r[i] += gd->reloc_off;
  #endif
6f6430d72   Simon Glass   Introduce generic...
909
910
911
912
913
914
  	if (initcall_run_list(init_sequence_r))
  		hang();
  
  	/* NOTREACHED - run_main_loop() does not return */
  	hang();
  }