IPL code structure

The IPL code is structured in two stages. The first stage is written in assembly language; it sets up just enough of an environment for the second stage, written in C, to run. Generally, the minimum work done here is to set up the DRAM controllers, initialize the various registers, and set up the chip selects so that you can address your hardware.

Generally, the IPL assembly-language source name begins with "init" (e.g. init8xx.s for the MPC8xxFADS board); the C file is always called main.c.

Once your assembly-language routine has set up the minimum amount required to transfer control to the C language portion, the main() program calls the following functions in order:

image_download_8250()
This function is responsible for getting the image from wherever it may be located. If the image is located in linear memory, this function isn't required (the image is already "downloaded").

If you're downloading the image from a custom piece of hardware, you should call your function image_download_hw(), where the hw part is replaced with a descriptive name for the hardware, e.g. image_download_x25().

image_scan()
This function is given a start and an end address to search for a boot image. If successful, it returns a pointer to the start of the image. It's possible to search within an address range that contains more than one image. If there are multiple images, and one of them has a bad checksum, then the next image is used. If there are multiple images with good checksums, the startup header is examined, and the one with the higher version number is used. Note that the scan will occur only between the specified addresses.
image_setup()
This function does the work of copying the necessary part of the image into RAM.
image_start()
This function will jump to the start of the image loaded into RAM, which will turn control over to the startup program.