Commit c2240d4dbef98f0bc5f5e99324d1eef8d6e9acdf

Authored by Simon Glass
Committed by Tom Rini
1 parent e4fef6cfcc

Adjust board_r.c for ppc

This adds ppc features to the generic post-relocation board init.

Signed-off-by: Simon Glass <sjg@chromium.org>

Showing 3 changed files with 485 additions and 3 deletions Side-by-side Diff

... ... @@ -27,26 +27,82 @@
27 27 */
28 28  
29 29 #include <common.h>
  30 +/* TODO: can we just include all these headers whether needed or not? */
  31 +#if defined(CONFIG_CMD_BEDBUG)
  32 +#include <bedbug/type.h>
  33 +#endif
30 34 #ifdef CONFIG_HAS_DATAFLASH
31 35 #include <dataflash.h>
32 36 #endif
33 37 #include <environment.h>
34 38 #include <fdtdec.h>
  39 +#if defined(CONFIG_CMD_IDE)
  40 +#include <ide.h>
  41 +#endif
35 42 #include <initcall.h>
  43 +#ifdef CONFIG_PS2KBD
  44 +#include <keyboard.h>
  45 +#endif
  46 +#if defined(CONFIG_CMD_KGDB)
  47 +#include <kgdb.h>
  48 +#endif
36 49 #include <logbuff.h>
37 50 #include <malloc.h>
  51 +#ifdef CONFIG_BITBANGMII
  52 +#include <miiphy.h>
  53 +#endif
38 54 #include <mmc.h>
39 55 #include <nand.h>
40 56 #include <onenand_uboot.h>
  57 +#include <scsi.h>
41 58 #include <serial.h>
  59 +#include <spi.h>
42 60 #include <stdio_dev.h>
  61 +#include <watchdog.h>
  62 +#ifdef CONFIG_ADDR_MAP
  63 +#include <asm/mmu.h>
  64 +#endif
43 65 #include <asm/sections.h>
  66 +#include <linux/compiler.h>
44 67  
45 68 DECLARE_GLOBAL_DATA_PTR;
46 69  
47 70 ulong monitor_flash_len;
48 71  
  72 +int __board_flash_wp_on(void)
  73 +{
  74 + /*
  75 + * Most flashes can't be detected when write protection is enabled,
  76 + * so provide a way to let U-Boot gracefully ignore write protected
  77 + * devices.
  78 + */
  79 + return 0;
  80 +}
49 81  
  82 +int board_flash_wp_on(void)
  83 + __attribute__ ((weak, alias("__board_flash_wp_on")));
  84 +
  85 +void __cpu_secondary_init_r(void)
  86 +{
  87 +}
  88 +
  89 +void cpu_secondary_init_r(void)
  90 + __attribute__ ((weak, alias("__cpu_secondary_init_r")));
  91 +
  92 +static int initr_secondary_cpu(void)
  93 +{
  94 + /*
  95 + * after non-volatile devices & environment is setup and cpu code have
  96 + * another round to deal with any initialization that might require
  97 + * full access to the environment or loading of some image (firmware)
  98 + * from a non-volatile device
  99 + */
  100 + /* TODO: maybe define this for all archs? */
  101 + cpu_secondary_init_r();
  102 +
  103 + return 0;
  104 +}
  105 +
50 106 static int initr_reloc(void)
51 107 {
52 108 gd->flags |= GD_FLG_RELOC; /* tell others: relocation done */
... ... @@ -68,6 +124,11 @@
68 124 }
69 125 #endif
70 126  
  127 +__weak int fixup_cpu(void)
  128 +{
  129 + return 0;
  130 +}
  131 +
71 132 static int initr_reloc_global_data(void)
72 133 {
73 134 #ifdef CONFIG_SYS_SYM_OFFSETS
... ... @@ -75,6 +136,31 @@
75 136 #else
76 137 monitor_flash_len = (ulong)&__init_end - gd->dest_addr;
77 138 #endif
  139 +#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
  140 + /*
  141 + * The gd->cpu pointer is set to an address in flash before relocation.
  142 + * We need to update it to point to the same CPU entry in RAM.
  143 + * TODO: why not just add gd->reloc_ofs?
  144 + */
  145 + gd->arch.cpu += gd->dest_addr - CONFIG_SYS_MONITOR_BASE;
  146 +
  147 + /*
  148 + * If we didn't know the cpu mask & # cores, we can save them of
  149 + * now rather than 'computing' them constantly
  150 + */
  151 + fixup_cpu();
  152 +#endif
  153 +#ifdef CONFIG_SYS_EXTRA_ENV_RELOC
  154 + /*
  155 + * Some systems need to relocate the env_addr pointer early because the
  156 + * location it points to will get invalidated before env_relocate is
  157 + * called. One example is on systems that might use a L2 or L3 cache
  158 + * in SRAM mode and initialize that cache from SRAM mode back to being
  159 + * a cache in cpu_init_r.
  160 + */
  161 + gd->env_addr += gd->dest_addr - CONFIG_SYS_MONITOR_BASE;
  162 +#endif
  163 + return 0;
78 164 }
79 165  
80 166 static int initr_serial(void)
... ... @@ -83,6 +169,27 @@
83 169 return 0;
84 170 }
85 171  
  172 +#ifdef CONFIG_PPC
  173 +static int initr_trap(void)
  174 +{
  175 + /*
  176 + * Setup trap handlers
  177 + */
  178 + trap_init(gd->dest_addr);
  179 +
  180 + return 0;
  181 +}
  182 +#endif
  183 +
  184 +#ifdef CONFIG_ADDR_MAP
  185 +static int initr_addr_map(void)
  186 +{
  187 + init_addr_map();
  188 +
  189 + return 0;
  190 +}
  191 +#endif
  192 +
86 193 #ifdef CONFIG_LOGBUFFER
87 194 unsigned long logbuffer_base(void)
88 195 {
... ... @@ -104,6 +211,50 @@
104 211 }
105 212 #endif
106 213  
  214 +#ifdef CONFIG_SYS_DELAYED_ICACHE
  215 +static int initr_icache_enable(void)
  216 +{
  217 + return 0;
  218 +}
  219 +#endif
  220 +
  221 +#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
  222 +static int initr_unlock_ram_in_cache(void)
  223 +{
  224 + unlock_ram_in_cache(); /* it's time to unlock D-cache in e500 */
  225 + return 0;
  226 +}
  227 +#endif
  228 +
  229 +#ifdef CONFIG_PCI
  230 +static int initr_pci(void)
  231 +{
  232 + pci_init();
  233 +
  234 + return 0;
  235 +}
  236 +#endif
  237 +
  238 +#ifdef CONFIG_WINBOND_83C553
  239 +static int initr_w83c553f(void)
  240 +{
  241 + /*
  242 + * Initialise the ISA bridge
  243 + */
  244 + initialise_w83c553f();
  245 + return 0;
  246 +}
  247 +#endif
  248 +
  249 +static int initr_barrier(void)
  250 +{
  251 +#ifdef CONFIG_PPC
  252 + /* TODO: Can we not use dmb() macros for this? */
  253 + asm("sync ; isync");
  254 +#endif
  255 + return 0;
  256 +}
  257 +
107 258 static int initr_malloc(void)
108 259 {
109 260 ulong malloc_start;
110 261  
111 262  
... ... @@ -128,13 +279,26 @@
128 279 #if !defined(CONFIG_SYS_NO_FLASH)
129 280 static int initr_flash(void)
130 281 {
131   - ulong flash_size;
  282 + ulong flash_size = 0;
  283 + bd_t *bd = gd->bd;
  284 + int ok;
132 285  
133 286 puts("Flash: ");
134 287  
135   - flash_size = flash_init();
136   - if (flash_size <= 0) {
  288 + if (board_flash_wp_on()) {
  289 + printf("Uninitialized - Write Protect On\n");
  290 + /* Since WP is on, we can't find real size. Set to 0 */
  291 + ok = 1;
  292 + } else {
  293 + flash_size = flash_init();
  294 + ok = flash_size > 0;
  295 + }
  296 + if (!ok) {
137 297 puts("*** failed ***\n");
  298 +#ifdef CONFIG_PPC
  299 + /* Why does PPC do this? */
  300 + hang();
  301 +#endif
138 302 return -1;
139 303 }
140 304 print_size(flash_size, "");
141 305  
... ... @@ -152,10 +316,43 @@
152 316 #endif /* CONFIG_SYS_FLASH_CHECKSUM */
153 317 putc('\n');
154 318  
  319 + /* update start of FLASH memory */
  320 +#ifdef CONFIG_SYS_FLASH_BASE
  321 + bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
  322 +#endif
  323 + /* size of FLASH memory (final value) */
  324 + bd->bi_flashsize = flash_size;
  325 +
  326 +#if defined(CONFIG_SYS_UPDATE_FLASH_SIZE)
  327 + /* Make a update of the Memctrl. */
  328 + update_flash_size(flash_size);
  329 +#endif
  330 +
  331 +
  332 +#if defined(CONFIG_OXC) || defined(CONFIG_RMU)
  333 + /* flash mapped at end of memory map */
  334 + bd->bi_flashoffset = CONFIG_SYS_TEXT_BASE + flash_size;
  335 +#elif CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE
  336 + bd->bi_flashoffset = monitor_flash_len; /* reserved area for monitor */
  337 +#endif
155 338 return 0;
156 339 }
157 340 #endif
158 341  
  342 +#ifdef CONFIG_PPC
  343 +static int initr_spi(void)
  344 +{
  345 + /* PPC does this here */
  346 +#ifdef CONFIG_SPI
  347 +#if !defined(CONFIG_ENV_IS_IN_EEPROM)
  348 + spi_init_f();
  349 +#endif
  350 + spi_init_r();
  351 +#endif
  352 + return 0;
  353 +}
  354 +#endif
  355 +
159 356 #ifdef CONFIG_CMD_NAND
160 357 /* go init the NAND */
161 358 int initr_nand(void)
162 359  
... ... @@ -226,9 +423,56 @@
226 423  
227 424 /* Initialize from environment */
228 425 load_addr = getenv_ulong("loadaddr", 16, load_addr);
  426 +#if defined(CONFIG_SYS_EXTBDINFO)
  427 +#if defined(CONFIG_405GP) || defined(CONFIG_405EP)
  428 +#if defined(CONFIG_I2CFAST)
  429 + /*
  430 + * set bi_iic_fast for linux taking environment variable
  431 + * "i2cfast" into account
  432 + */
  433 + {
  434 + char *s = getenv("i2cfast");
  435 +
  436 + if (s && ((*s == 'y') || (*s == 'Y'))) {
  437 + gd->bd->bi_iic_fast[0] = 1;
  438 + gd->bd->bi_iic_fast[1] = 1;
  439 + }
  440 + }
  441 +#endif /* CONFIG_I2CFAST */
  442 +#endif /* CONFIG_405GP, CONFIG_405EP */
  443 +#endif /* CONFIG_SYS_EXTBDINFO */
229 444 return 0;
230 445 }
231 446  
  447 +#ifdef CONFIG_HERMES
  448 +static int initr_hermes(void)
  449 +{
  450 + if ((gd->board_type >> 16) == 2)
  451 + gd->bd->bi_ethspeed = gd->board_type & 0xFFFF;
  452 + else
  453 + gd->bd->bi_ethspeed = 0xFFFF;
  454 + return 0;
  455 +}
  456 +
  457 +static int initr_hermes_start(void)
  458 +{
  459 + if (gd->bd->bi_ethspeed != 0xFFFF)
  460 + hermes_start_lxt980((int) gd->bd->bi_ethspeed);
  461 + return 0;
  462 +}
  463 +#endif
  464 +
  465 +#ifdef CONFIG_SC3
  466 +/* TODO: with new initcalls, move this into the driver */
  467 +extern void sc3_read_eeprom(void);
  468 +
  469 +static int initr_sc3_read_eeprom(void)
  470 +{
  471 + sc3_read_eeprom();
  472 + return 0;
  473 +}
  474 +#endif
  475 +
232 476 static int initr_jumptable(void)
233 477 {
234 478 jumptable_init();
235 479  
236 480  
... ... @@ -269,11 +513,68 @@
269 513 #ifdef CONFIG_CMD_NET
270 514 static int initr_ethaddr(void)
271 515 {
  516 + bd_t *bd = gd->bd;
272 517  
  518 + /* kept around for legacy kernels only ... ignore the next section */
  519 + eth_getenv_enetaddr("ethaddr", bd->bi_enetaddr);
  520 +#ifdef CONFIG_HAS_ETH1
  521 + eth_getenv_enetaddr("eth1addr", bd->bi_enet1addr);
  522 +#endif
  523 +#ifdef CONFIG_HAS_ETH2
  524 + eth_getenv_enetaddr("eth2addr", bd->bi_enet2addr);
  525 +#endif
  526 +#ifdef CONFIG_HAS_ETH3
  527 + eth_getenv_enetaddr("eth3addr", bd->bi_enet3addr);
  528 +#endif
  529 +#ifdef CONFIG_HAS_ETH4
  530 + eth_getenv_enetaddr("eth4addr", bd->bi_enet4addr);
  531 +#endif
  532 +#ifdef CONFIG_HAS_ETH5
  533 + eth_getenv_enetaddr("eth5addr", bd->bi_enet5addr);
  534 +#endif
273 535 return 0;
274 536 }
275 537 #endif /* CONFIG_CMD_NET */
276 538  
  539 +#ifdef CONFIG_CMD_KGDB
  540 +static int initr_kgdb(void)
  541 +{
  542 + puts("KGDB: ");
  543 + kgdb_init();
  544 + return 0;
  545 +}
  546 +#endif
  547 +
  548 +#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
  549 +static int initr_status_led(void)
  550 +{
  551 + status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
  552 +
  553 + return 0;
  554 +}
  555 +#endif
  556 +
  557 +#if defined(CONFIG_CMD_SCSI)
  558 +static int initr_scsi(void)
  559 +{
  560 + /* Not supported properly on ARM yet */
  561 +#ifndef CONFIG_ARM
  562 + puts("SCSI: ");
  563 + scsi_init();
  564 +#endif
  565 +
  566 + return 0;
  567 +}
  568 +#endif /* CONFIG_CMD_NET */
  569 +
  570 +#if defined(CONFIG_CMD_DOC)
  571 +static int initr_doc(void)
  572 +{
  573 + puts("DOC: ");
  574 + doc_init();
  575 +}
  576 +#endif
  577 +
277 578 #ifdef CONFIG_BITBANGMII
278 579 static int initr_bbmii(void)
279 580 {
... ... @@ -303,6 +604,33 @@
303 604 }
304 605 #endif
305 606  
  607 +#if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
  608 +static int initr_pcmcia(void)
  609 +{
  610 + puts("PCMCIA:");
  611 + pcmcia_init();
  612 + return 0;
  613 +}
  614 +#endif
  615 +
  616 +#if defined(CONFIG_CMD_IDE)
  617 +static int initr_ide(void)
  618 +{
  619 +#ifdef CONFIG_IDE_8xx_PCCARD
  620 + puts("PCMCIA:");
  621 +#else
  622 + puts("IDE: ");
  623 +#endif
  624 +#if defined(CONFIG_START_IDE)
  625 + if (board_start_ide())
  626 + ide_init();
  627 +#else
  628 + ide_init();
  629 +#endif
  630 + return 0;
  631 +}
  632 +#endif
  633 +
306 634 #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
307 635 /*
308 636 * Export available size of memory for Linux, taking into account the
309 637  
... ... @@ -322,9 +650,40 @@
322 650 # endif
323 651 sprintf(memsz, "%ldk", (gd->ram_size / 1024) - pram);
324 652 setenv("mem", memsz);
  653 +
  654 + return 0;
325 655 }
326 656 #endif
327 657  
  658 +#ifdef CONFIG_CMD_BEDBUG
  659 +static int initr_bedbug(void)
  660 +{
  661 + bedbug_init();
  662 +
  663 + return 0;
  664 +}
  665 +#endif
  666 +
  667 +#ifdef CONFIG_PS2KBD
  668 +static int initr_kbd(void)
  669 +{
  670 + puts("PS/2: ");
  671 + kbd_init();
  672 + return 0;
  673 +}
  674 +#endif
  675 +
  676 +#ifdef CONFIG_MODEM_SUPPORT
  677 +static int initr_modem(void)
  678 +{
  679 + /* TODO: with new initcalls, move this into the driver */
  680 + extern int do_mdm_init;
  681 +
  682 + do_mdm_init = gd->do_mdm_init;
  683 + return 0;
  684 +}
  685 +#endif
  686 +
328 687 static int run_main_loop(void)
329 688 {
330 689 /* main_loop() can return to retry autoboot, if so just run it again */
331 690  
332 691  
333 692  
334 693  
... ... @@ -339,22 +698,63 @@
339 698 *
340 699 * We also hope to remove most of the driver-related init and do it if/when
341 700 * the driver is later used.
  701 + *
  702 + * TODO: perhaps reset the watchdog in the initcall function after each call?
342 703 */
343 704 init_fnc_t init_sequence_r[] = {
344 705 initr_reloc,
  706 + /* TODO: could x86/PPC have this also perhaps? */
345 707 #ifdef CONFIG_ARM
346 708 initr_caches,
347 709 board_init, /* Setup chipselects */
348 710 #endif
  711 + /*
  712 + * TODO: printing of the clock inforamtion of the board is now
  713 + * implemented as part of bdinfo command. Currently only support for
  714 + * davinci SOC's is added. Remove this check once all the board
  715 + * implement this.
  716 + */
  717 +#ifdef CONFIG_CLOCKS
  718 + set_cpu_clk_info, /* Setup clock information */
  719 +#endif
349 720 initr_reloc_global_data,
350 721 initr_serial,
351 722 initr_announce,
  723 + INIT_FUNC_WATCHDOG_RESET
  724 +#ifdef CONFIG_PPC
  725 + initr_trap,
  726 +#endif
  727 +#ifdef CONFIG_ADDR_MAP
  728 + initr_addr_map,
  729 +#endif
  730 +#if defined(CONFIG_BOARD_EARLY_INIT_R)
  731 + board_early_init_r,
  732 +#endif
  733 + INIT_FUNC_WATCHDOG_RESET
352 734 #ifdef CONFIG_LOGBUFFER
353 735 initr_logbuffer,
354 736 #endif
355 737 #ifdef CONFIG_POST
356 738 initr_post_backlog,
357 739 #endif
  740 + INIT_FUNC_WATCHDOG_RESET
  741 +#ifdef CONFIG_SYS_DELAYED_ICACHE
  742 + initr_icache_enable,
  743 +#endif
  744 +#if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
  745 + initr_unlock_ram_in_cache,
  746 +#endif
  747 +#if defined(CONFIG_PCI) && defined(CONFIG_SYS_EARLY_PCI_INIT)
  748 + /*
  749 + * Do early PCI configuration _before_ the flash gets initialised,
  750 + * because PCU ressources are crucial for flash access on some boards.
  751 + */
  752 + initr_pci,
  753 +#endif
  754 +#ifdef CONFIG_WINBOND_83C553
  755 + initr_w83c553f,
  756 +#endif
  757 + initr_barrier,
358 758 initr_malloc,
359 759 #ifdef CONFIG_ARCH_EARLY_INIT_R
360 760 arch_early_init_r,
... ... @@ -363,6 +763,12 @@
363 763 #ifndef CONFIG_SYS_NO_FLASH
364 764 initr_flash,
365 765 #endif
  766 + INIT_FUNC_WATCHDOG_RESET
  767 +#ifdef CONFIG_PPC
  768 + /* initialize higher level parts of CPU like time base and timers */
  769 + cpu_init_r,
  770 + initr_spi,
  771 +#endif
366 772 #ifdef CONFIG_CMD_NAND
367 773 initr_nand,
368 774 #endif
... ... @@ -376,6 +782,24 @@
376 782 initr_dataflash,
377 783 #endif
378 784 initr_env,
  785 + INIT_FUNC_WATCHDOG_RESET
  786 + initr_secondary_cpu,
  787 +#ifdef CONFIG_SC3
  788 + initr_sc3_read_eeprom,
  789 +#endif
  790 +#ifdef CONFIG_HERMES
  791 + initr_hermes,
  792 +#endif
  793 +#if defined(CONFIG_ID_EEPROM) || defined(CONFIG_SYS_I2C_MAC_OFFSET)
  794 + mac_read_from_eeprom,
  795 +#endif
  796 + INIT_FUNC_WATCHDOG_RESET
  797 +#if defined(CONFIG_PCI) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
  798 + /*
  799 + * Do pci configuration
  800 + */
  801 + initr_pci,
  802 +#endif
379 803 stdio_init,
380 804 initr_jumptable,
381 805 #ifdef CONFIG_API
382 806  
383 807  
384 808  
385 809  
386 810  
... ... @@ -391,22 +815,72 @@
391 815 #ifdef CONFIG_MISC_INIT_R
392 816 misc_init_r, /* miscellaneous platform-dependent init */
393 817 #endif
  818 +#ifdef CONFIG_HERMES
  819 + initr_hermes_start,
  820 +#endif
  821 + INIT_FUNC_WATCHDOG_RESET
  822 +#ifdef CONFIG_CMD_KGDB
  823 + initr_kgdb,
  824 +#endif
394 825 interrupt_init,
  826 +#ifdef CONFIG_ARM
395 827 initr_enable_interrupts,
  828 +#endif
  829 +#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
  830 + initr_status_led,
  831 +#endif
  832 + /* PPC has a udelay(20) here dating from 2002. Why? */
396 833 #ifdef CONFIG_CMD_NET
397 834 initr_ethaddr,
398 835 #endif
399 836 #ifdef CONFIG_BOARD_LATE_INIT
400 837 board_late_init,
401 838 #endif
  839 +#ifdef CONFIG_CMD_SCSI
  840 + INIT_FUNC_WATCHDOG_RESET
  841 + initr_scsi,
  842 +#endif
  843 +#ifdef CONFIG_CMD_DOC
  844 + INIT_FUNC_WATCHDOG_RESET
  845 + initr_doc,
  846 +#endif
402 847 #ifdef CONFIG_BITBANGMII
403 848 initr_bbmii,
404 849 #endif
405 850 #ifdef CONFIG_CMD_NET
  851 + INIT_FUNC_WATCHDOG_RESET
406 852 initr_net,
407 853 #endif
408 854 #ifdef CONFIG_POST
409 855 initr_post,
  856 +#endif
  857 +#if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE)
  858 + initr_pcmcia,
  859 +#endif
  860 +#if defined(CONFIG_CMD_IDE)
  861 + initr_ide,
  862 +#endif
  863 +#ifdef CONFIG_LAST_STAGE_INIT
  864 + INIT_FUNC_WATCHDOG_RESET
  865 + /*
  866 + * Some parts can be only initialized if all others (like
  867 + * Interrupts) are up and running (i.e. the PC-style ISA
  868 + * keyboard).
  869 + */
  870 + last_stage_init,
  871 +#endif
  872 +#ifdef CONFIG_CMD_BEDBUG
  873 + INIT_FUNC_WATCHDOG_RESET
  874 + initr_bedbug,
  875 +#endif
  876 +#if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER)
  877 + initr_mem,
  878 +#endif
  879 +#ifdef CONFIG_PS2KBD
  880 + initr_kbd,
  881 +#endif
  882 +#ifdef CONFIG_MODEM_SUPPORT
  883 + initr_modem,
410 884 #endif
411 885 run_main_loop,
412 886 };
... ... @@ -312,6 +312,7 @@
312 312 extern u8 _binary_dt_dtb_start[]; /* embedded device tree blob */
313 313 int set_cpu_clk_info(void);
314 314 int print_cpuinfo(void);
  315 +int update_flash_size(int flash_size);
315 316  
316 317 /**
317 318 * Show the DRAM size in a board-specific way
... ... @@ -85,5 +85,12 @@
85 85 void ide_input_data_shorts(int dev, ushort *sect_buf, int shorts);
86 86 void ide_output_data_shorts(int dev, ushort *sect_buf, int shorts);
87 87  
  88 +/**
  89 + * board_start_ide() - Start up the board IDE interfac
  90 + *
  91 + * @return 0 if ok
  92 + */
  93 +int board_start_ide(void);
  94 +
88 95 #endif /* _IDE_H */