| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- FPGA Regions
- Alan Tull 2017
- CONTENTS
- - Introduction
- - The FPGA region API
- - Usage example
- Introduction
- ============
- This document is meant to be an brief overview of the FPGA region API usage. A
- more conceptual look at regions can be found in [1].
- For the purposes of this API document, let's just say that a region associates
- an FPGA Manager and a bridge (or bridges) with a reprogrammable region of an
- FPGA or the whole FPGA. The API provides a way to register a region and to
- program a region.
- Currently the only layer above fpga-region.c in the kernel is the Device Tree
- support (of-fpga-region.c) described in [1]. The DT support layer uses regions
- to program the FPGA and then DT to handle enumeration. The common region code
- is intended to be used by other schemes that have other ways of accomplishing
- enumeration after programming.
- An fpga-region can be set up to know the following things:
- * which FPGA manager to use to do the programming
- * which bridges to disable before programming and enable afterwards.
- Additional info needed to program the FPGA image is passed in the struct
- fpga_image_info [2] including:
- * pointers to the image as either a scatter-gather buffer, a contiguous
- buffer, or the name of firmware file
- * flags indicating specifics such as whether the image if for partial
- reconfiguration.
- ===================
- The FPGA region API
- ===================
- To register or unregister a region:
- -----------------------------------
- int fpga_region_register(struct device *dev,
- struct fpga_region *region);
- int fpga_region_unregister(struct fpga_region *region);
- An example of usage can be seen in the probe function of [3]
- To program an FPGA:
- -------------------
- int fpga_region_program_fpga(struct fpga_region *region);
- This function operates on info passed in the fpga_image_info
- (region->info).
- This function will attempt to:
- * lock the region's mutex
- * lock the region's FPGA manager
- * build a list of FPGA bridges if a method has been specified to do so
- * disable the bridges
- * program the FPGA
- * re-enable the bridges
- * release the locks
- =============
- Usage example
- =============
- First, allocate the info struct:
- info = fpga_image_info_alloc(dev);
- if (!info)
- return -ENOMEM;
- Set flags as needed, i.e.
- info->flags |= FPGA_MGR_PARTIAL_RECONFIG;
- Point to your FPGA image, such as:
- info->sgt = &sgt;
- Add info to region and do the programming:
- region->info = info;
- ret = fpga_region_program_fpga(region);
- Then enumerate whatever hardware has appeared in the FPGA.
- --
- [1] ../devicetree/bindings/fpga/fpga-region.txt
- [2] ./fpga-mgr.txt
- [3] ../../drivers/fpga/of-fpga-region.c
|