| The U-Boot Driver Model Project |
| =============================== |
| I/O system analysis |
| =================== |
| Marek Vasut <marek.vasut@gmail.com> |
| 2012-02-21 |
| |
| I) Overview |
| ----------- |
| |
| The current FPGA implementation is handled by command "fpga". This command in |
| turn calls the following functions: |
| |
| fpga_info() |
| fpga_load() |
| fpga_dump() |
| |
| These functions are implemented by what appears to be FPGA multiplexer, located |
| in drivers/fpga/fpga.c . This code determines which device to operate with |
| depending on the device ID. |
| |
| The fpga_info() function is multiplexer of the functions providing information |
| about the particular FPGA device. These functions are implemented in the drivers |
| for the particular FPGA device: |
| |
| xilinx_info() |
| altera_info() |
| lattice_info() |
| |
| Similar approach is used for fpga_load(), which multiplexes "xilinx_load()", |
| "altera_load()" and "lattice_load()" and is used to load firmware into the FPGA |
| device. |
| |
| The fpga_dump() function, which prints the contents of the FPGA device, is no |
| different either, by multiplexing "xilinx_dump()", "altera_dump()" and |
| "lattice_dump()" functions. |
| |
| Finally, each new FPGA device is registered by calling "fpga_add()" function. |
| This function takes two arguments, the second one being particularly important, |
| because it's basically what will become platform_data. Currently, it's data that |
| are passed to the driver from the board/platform code. |
| |
| II) Approach |
| ------------ |
| |
| The path to conversion of the FPGA subsystem will be very straightforward, since |
| the FPGA subsystem is already quite dynamic. Multiple things will need to be |
| modified though. |
| |
| First is the registration of the new FPGA device towards the FPGA core. This |
| will be achieved by calling: |
| |
| fpga_device_register(struct instance *i, const struct fpga_ops *ops); |
| |
| The particularly interesting part is the struct fpga_ops, which contains |
| operations supported by the FPGA device. These are basically the already used |
| calls in the current implementation: |
| |
| struct fpga_ops { |
| int info(struct instance *i); |
| int load(struct instance *i, const char *buf, size_t size); |
| int dump(struct instance *i, const char *buf, size_t size); |
| } |
| |
| The other piece that'll have to be modified is how the devices are tracked. |
| It'll be necessary to introduce a linked list of devices within the FPGA core |
| instead of tracking them by ID number. |
| |
| Next, the "Xilinx_desc", "Lattice_desc" and "Altera_desc" structures will have |
| to be moved to driver's private_data. Finally, structures passed from the board |
| and/or platform files, like "Xilinx_Virtex2_Slave_SelectMap_fns" would be passed |
| via platform_data to the driver. |
| |
| III) Analysis of in-tree drivers |
| -------------------------------- |
| |
| 1) Altera driver |
| ---------------- |
| The driver is realized using the following files: |
| |
| drivers/fpga/altera.c |
| drivers/fpga/ACEX1K.c |
| drivers/fpga/cyclon2.c |
| drivers/fpga/stratixII.c |
| |
| All of the sub-drivers implement basically the same info-load-dump interface |
| and there's no expected problem during the conversion. The driver itself will |
| be realised by altera.c and all the sub-drivers will be linked in. The |
| distinction will be done by passing different platform data. |
| |
| 2) Lattice driver |
| ----------------- |
| The driver is realized using the following files: |
| |
| drivers/fpga/lattice.c |
| drivers/fpga/ivm_core.c |
| |
| This driver also implements the standard interface, but to realise the |
| operations with the FPGA device, uses functions from "ivm_core.c" file. This |
| file implements the main communications logic and has to be linked in together |
| with "lattice.c". No problem converting is expected here. |
| |
| 3) Xilinx driver |
| ---------------- |
| The driver is realized using the following files: |
| |
| drivers/fpga/xilinx.c |
| drivers/fpga/spartan2.c |
| drivers/fpga/spartan3.c |
| drivers/fpga/virtex2.c |
| |
| This set of sub-drivers is special by defining a big set of macros in |
| "include/spartan3.h" and similar files. These macros would need to be either |
| rewritten or replaced. Otherwise, there are no problems expected during the |
| conversion process. |