Embedded Design


FPGA bootloader

Loading an FPGA image for an I/O subsystem from within an already booted Linux system.

While the mechanism for loading the FPGA was simple, the interactions between the FPGA, before and after loading, and the host machine was interesting. The FPGA image was loaded through a multi stage boot sequence by a Linux system. The first of the boot loader would spin until a command from Linux graphics subsystem was published. While the FPGA was spinning waiting for graphics subsystem to allow the FPGA to proceed, the second stage boot sequence was loading the Microblaze instructions and data into the FPGA instruction space. Once this stage of the boot sequence was complete and the FPGA was told to proceed and the third stage of booting sequence commenced. The FPGA then would initialise the system default jump table and move the data into the correct memory locations. The FPGA would then proceed to boot the I/O subsystem.

One of the circular peculiarities of this loading sequence was Linux would not see the I/O PCI device until after the FPGA firmware was loaded. Linux then had to be told a new PCI device existed and to include it in its own internal tables before the device drivers associated with the I/O subsystem could be started.

The images loaded as well as all other secure data was managed by the Linux system.