
When porting from old barebox the follwing steps must be taken (please complain
if there's something missing here ;)


- Most of the macros in include/configs/yourboard.h can be removed, especially
  the CONFIG_COMMANDS section. The goal is to remove this file entirely, but
  for now some values are still needed here. If you think some things are better
  configured with the Kconfig system feel free to add them there.

- The linker script needs a new section for the initcalls. The handling of the
  barebox command table has changed, too. (The commands are now sorted by the
  linker instead at runtime.) To change it you need an entry like the following
  in your linker script:

#include <asm-generic/barebox.lds.h>

	__barebox_cmd_start = .;
	.barebox_cmd : { BAREBOX_CMDS }
	__barebox_cmd_end = .;

	__barebox_initcalls_start = .;
	.barebox_initcalls : { INITCALLS }
	__barebox_initcalls_end = .;

- Rename your linker script to barebox.lds.S and add the following entry to the
  Makefile to make sure the linker script is generated:

extra-y += barebox.lds

- Register the devices present in your system in the board specific .c file.
  To see anything you have to at least register a console. In scb9328.c this
  looks like this:

	static struct device_d scb9328_serial_device = {
		.name     = "imx_serial",
		.map_base = IMX_UART1_BASE,
		.size     = 4096,
	};

	static int scb9328_console_init(void)
	{
		register_device(&scb9328_serial_device);
		return 0;
	}

	console_initcall(scb9328_console_init);

- For most boards you will have to register a cfi_flash device. NAND flash
  is not ported yet.

- Call devfs_add_partition() to add an environment partition for your device:
  devfs_add_partition("nor0", 0x40000, 0x20000, "env0");
  This will add an area starting at 0x40000 of size 0x20000 of the device
  nor0 as env0.

- Port missing drivers. Depending on the driver this can a be rather simple
  process:

  Serial drivers
  - Declare all functions static.
  - in your probe function fill in a struct console_device and register it
    with console_register()

  Ethernet drivers
  - Basically do the same as with serial drivers.
  - Identify the parts of the driver which handle the MAC address. There are
    now two functions handling them in struct eth_device. 

    get_mac_address() retrieve the MAC address from the EEPROM if one is
                      connected. If you don't have an EEPROM just return -1.
    set_mac_address() set the MAC address in the device. All magic previously
                      done with getenv/setenv(ethaddr) must be removed.

    During startup barebox calls get_mac_address() to see if an EEPROM is
    connected. If so, it calls set_mac_address() with this address. This
    is done even if networking is not used during startup. This makes sure
    that the MAC address is set in the device and Linux can pick it up later.
  - There is now (the beginning of) generic phy support. When porting drivers
    it is recommended to use it. The phy support currently only starts generic
    autonegotiation, so if you have some fancy things to do (or have gigabit
    ethernet) you'll have to extend the phy layer first. Although this is
    extra work, it will pay off some day, as phy support is a great source
    of duplicated code. see drivers/net/dm9000.c or drivers/net/fec_mpc5200.c
    for examples.

- Add a clocksource for your system. PowerPCs have a generic decrementer
  counter, so if you have a PowerPC you have nothing to do here. On ARM
  this is SoC dependent. See Documentation/timekeeping.txt for further
  information.

- Adjust start.S. On PowerPC there is at least the Problem that the relocation
  offset is defined at compile time. It is easily possible to determine the
  address barebox is currently starting from at runtime and thus allowing it
  barebox to be started at any address. Look at the relocation code and replace
  TEXT_BASE with the following calculation of the runtime address:

	bl     calc_source     /* Calculate Source Address             */
calc_source:
	mfspr   r4,  LR
	subi    r4, r4, (calc_source - _start)
	subi    r4, r4, 0x100

  (I'm almost sure that PowerPC has a dedicated instruction for this, un-
  fortunately I know next to nothing of PowerPC assembler, so if you have
  a better way to archieve this, please write to the list.)

  On PowerPC barebox now runs at the address it was linked to, so you have
  to adjust TEXT_BASE to be in RAM. This makes the various fixup relocation
  functions unnecessary. On PowerPC the removal of -fPIC saves around 10% of
  binary space. It also simplifies debugging because you will see the correct
  addresses in the objdump without doing offset calculation.

- On ARM most of the duplicate code under cpu/arm* is already merged into
  arch/arm/cpu. The start.S files are missing though.
