FPGAFS provides a framework for a high performance reconfigurable computer environment for Linux. The abstraction between the reconfigurable device and the user application is simplified by using a virtual filesystem and a thread abstraction per device context. FPGAFS consists of two major abstraction layers. First, the directory representation to the user application, providing one directory for a context including specified files to control and data transfers. The second layer provides an interface for low level driver. It gives the flexibility to register multiple low level drivers for different accelerators, operating at the same time in one target system.
As the name already mentioned the project provides a virtual filesystem for the operating system. The filesystem abstract each reconfigurable part inside a host system or inside one chip by a directory. The permissions of the files can provide access control for users. The following listing shows the directory entries, created during context allocation. These entries can be seen as the assigned context to the FPGA/accelerator interface: /fpgafs/example/cmd: write only file, this is the interface to send defined commands to the context. /fpgafs/example/stat: read only file, from which the context’s status can be received. /fpgafs/example/din: write only file, sends data to the reconfigurable device. /fpgafs/example/dout: read only file, receives calculated data from the device. /fpgafs/example/load: write only file, writes data which should be loaded onto the reconfigurable device. /fpgafs/foobar/lldrv: write only file, selects the low level driver which should be used. In general, the complete framework provides a generic interface to the userspace and a flexible and changeable interface to the hardware. Figure 1 shows the design of the framework. At the bottom, there are low level drivers which must be registered to the main FPGAFS part. On top of the low-level drivers, different contexts are shown, represented by directories.
Low Level Driver
All low level drivers implement an interface used by more generalized functions from the low level management. The structure “fpgafs_lldrv” provides the defined function pointers. Each low level driver can be loaded and unloaded as a common Linux module. With this concept different hardware accelerators can be supported and each low level driver can implement its own communication functions. Each low level driver brings its own programming routine for the accelerator. This gives the possibility to create accelerators that can handle more than one application at once. For example, the accelerator can reprogram parts of the accelerator and can be used without reconfiguring the whole accelerator. However, this functionality totally depends on the underlying hardware and the programming mechanism. More documentation can be found in the repository and can be enquirer (see Contact).