113 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| 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
 |