mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-23 05:03:52 +07:00
96 lines
2.6 KiB
Plaintext
96 lines
2.6 KiB
Plaintext
|
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
|