FPGAFS
It 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 layers of abstraction. First, the directory
representation to the user application. This interface provides for each context
one directory with a specified content to transfer data. The second layer
provides an interface for low level driver. It gives the flexibility to register
a lot of different low level drivers for different accelerators which can be
operate at the same time in one target system.
Concept
Overall Design
As the name already mentioned the project provides a virtual filesystem for the operating system. The filesystem abstrect each each reconfigurable part inside a host system or inside one chip by a directory. The permissions of the files can provide access control for different users. The following listing shows the directory entries which will be created. These entries can be seen as the assigned context to the FPGA 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 on the main FPGAFS. On top of the low-level drivers, different contexts are shown which are represented by directories.
Low Level Driver
All low level drivers implement an interface which will be used by more generalized functions from the low level management. The structure "fpgafs_lldrv" provides at least the defined function pointers. Each low level driver can be loaded and unloaded as a common Linux module. The init function of each low level driver has to call the registration function of the FPGAFS low level management module. At unloading the module the unregistration function will be called. With this concept different hardware accelerators can be supported and each low level driver can implement its own communication functions. So 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. But the framework will support such and other functionalities because of the flexible layer concept.
More documentation can be found in the repository and can be enquired (see Contact). Also the dissertation can be downloaded where the FPGAFS was developed.
Download
FPGAFS keeps its development tree in a GIT repository. It can be downloaded with GIT clone.$ git clone http://fpgafs.codiert.org/fpgafs.git
Contact
Benjamin Krill: ben@codiert.org