|  | FPGA Region | 
|  | =========== | 
|  |  | 
|  | Overview | 
|  | -------- | 
|  |  | 
|  | This document is meant to be a brief overview of the FPGA region API usage.  A | 
|  | more conceptual look at regions can be found in the Device Tree binding | 
|  | document [#f1]_. | 
|  |  | 
|  | 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 [#f1]_.  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 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 is for partial | 
|  | reconfiguration. | 
|  |  | 
|  | How to add a new FPGA region | 
|  | ---------------------------- | 
|  |  | 
|  | An example of usage can be seen in the probe function of [#f2]_. | 
|  |  | 
|  | .. [#f1] ../devicetree/bindings/fpga/fpga-region.txt | 
|  | .. [#f2] ../../drivers/fpga/of-fpga-region.c | 
|  |  | 
|  | API to add a new FPGA region | 
|  | ---------------------------- | 
|  |  | 
|  | * struct fpga_region - The FPGA region struct | 
|  | * struct fpga_region_info - Parameter structure for __fpga_region_register_full() | 
|  | * __fpga_region_register_full() -  Create and register an FPGA region using the | 
|  | fpga_region_info structure to provide the full flexibility of options | 
|  | * __fpga_region_register() -  Create and register an FPGA region using standard | 
|  | arguments | 
|  | * fpga_region_unregister() -  Unregister an FPGA region | 
|  |  | 
|  | Helper macros ``fpga_region_register()`` and ``fpga_region_register_full()`` | 
|  | automatically set the module that registers the FPGA region as the owner. | 
|  |  | 
|  | The FPGA region's probe function will need to get a reference to the FPGA | 
|  | Manager it will be using to do the programming.  This usually would happen | 
|  | during the region's probe function. | 
|  |  | 
|  | * fpga_mgr_get() - Get a reference to an FPGA manager, raise ref count | 
|  | * of_fpga_mgr_get() -  Get a reference to an FPGA manager, raise ref count, | 
|  | given a device node. | 
|  | * fpga_mgr_put() - Put an FPGA manager | 
|  |  | 
|  | The FPGA region will need to specify which bridges to control while programming | 
|  | the FPGA.  The region driver can build a list of bridges during probe time | 
|  | (:c:expr:`fpga_region->bridge_list`) or it can have a function that creates | 
|  | the list of bridges to program just before programming | 
|  | (:c:expr:`fpga_region->get_bridges`).  The FPGA bridge framework supplies the | 
|  | following APIs to handle building or tearing down that list. | 
|  |  | 
|  | * fpga_bridge_get_to_list() - Get a ref of an FPGA bridge, add it to a | 
|  | list | 
|  | * of_fpga_bridge_get_to_list() - Get a ref of an FPGA bridge, add it to a | 
|  | list, given a device node | 
|  | * fpga_bridges_put() - Given a list of bridges, put them | 
|  |  | 
|  | .. kernel-doc:: include/linux/fpga/fpga-region.h | 
|  | :functions: fpga_region | 
|  |  | 
|  | .. kernel-doc:: include/linux/fpga/fpga-region.h | 
|  | :functions: fpga_region_info | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-region.c | 
|  | :functions: __fpga_region_register_full | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-region.c | 
|  | :functions: __fpga_region_register | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-region.c | 
|  | :functions: fpga_region_unregister | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-mgr.c | 
|  | :functions: fpga_mgr_get | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-mgr.c | 
|  | :functions: of_fpga_mgr_get | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-mgr.c | 
|  | :functions: fpga_mgr_put | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-bridge.c | 
|  | :functions: fpga_bridge_get_to_list | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-bridge.c | 
|  | :functions: of_fpga_bridge_get_to_list | 
|  |  | 
|  | .. kernel-doc:: drivers/fpga/fpga-bridge.c | 
|  | :functions: fpga_bridges_put |