In-kernel API for FPGA Programming¶
Overview¶
The in-kernel API for FPGA programming is a combination of APIs from
FPGA manager, bridge, and regions. The actual function used to
trigger FPGA programming is fpga_region_program_fpga()
.
fpga_region_program_fpga()
uses functionality supplied by
the FPGA manager and bridges. It will:
lock the region’s mutex
lock the mutex of 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 using info passed in
fpga_region->info
.re-enable the bridges
release the locks
The struct fpga_image_info specifies what FPGA image to program. It is
allocated/freed by fpga_image_info_alloc()
and freed with
fpga_image_info_free()
How to program an FPGA using a region¶
When the FPGA region driver probed, it was given a pointer to an FPGA manager driver so it knows which manager to use. The region also either has a list of bridges to control during programming or it has a pointer to a function that will generate that list. Here’s some sample code of what to do next:
#include <linux/fpga/fpga-mgr.h>
#include <linux/fpga/fpga-region.h>
struct fpga_image_info *info;
int ret;
/*
* First, alloc the struct with information about the FPGA image to
* program.
*/
info = fpga_image_info_alloc(dev);
if (!info)
return -ENOMEM;
/* Set flags as needed, such as: */
info->flags = FPGA_MGR_PARTIAL_RECONFIG;
/*
* Indicate where the FPGA image is. This is pseudo-code; you're
* going to use one of these three.
*/
if (image is in a scatter gather table) {
info->sgt = [your scatter gather table]
} else if (image is in a buffer) {
info->buf = [your image buffer]
info->count = [image buffer size]
} else if (image is in a firmware file) {
info->firmware_name = devm_kstrdup(dev, firmware_name,
GFP_KERNEL);
}
/* Add info to region and do the programming */
region->info = info;
ret = fpga_region_program_fpga(region);
/* Deallocate the image info if you're done with it */
region->info = NULL;
fpga_image_info_free(info);
if (ret)
return ret;
/* Now enumerate whatever hardware has appeared in the FPGA. */
API for programming an FPGA¶
fpga_region_program_fpga()
— Program an FPGAfpga_image_info
— Specifies what FPGA image to programfpga_image_info_alloc()
— Allocate an FPGA image info structfpga_image_info_free()
— Free an FPGA image info struct
-
int fpga_region_program_fpga(struct fpga_region *region)¶
program FPGA
Parameters
struct fpga_region * region
FPGA region
Description
Program an FPGA using fpga image info (region->info).
If the region has a get_bridges function, the exclusive reference for the
bridges will be held if programming succeeds. This is intended to prevent
reprogramming the region until the caller considers it safe to do so.
The caller will need to call fpga_bridges_put()
before attempting to
reprogram the region.
Return 0 for success or negative error code.
FPGA Manager flags
Flags used in the fpga_image_info->flags
field
FPGA_MGR_PARTIAL_RECONFIG
: do partial reconfiguration if supported
FPGA_MGR_EXTERNAL_CONFIG
: FPGA has been configured prior to Linux booting
FPGA_MGR_ENCRYPTED_BITSTREAM
: indicates bitstream is encrypted
FPGA_MGR_BITSTREAM_LSB_FIRST
: SPI bitstream bit order is LSB first
FPGA_MGR_COMPRESSED_BITSTREAM
: FPGA bitstream is compressed
- struct fpga_image_info
information specific to a FPGA image
Definition
struct fpga_image_info {
u32 flags;
u32 enable_timeout_us;
u32 disable_timeout_us;
u32 config_complete_timeout_us;
char *firmware_name;
struct sg_table *sgt;
const char *buf;
size_t count;
int region_id;
struct device *dev;
#ifdef CONFIG_OF;
struct device_node *overlay;
#endif;
};
Members
flags
boolean flags as defined above
enable_timeout_us
maximum time to enable traffic through bridge (uSec)
disable_timeout_us
maximum time to disable traffic through bridge (uSec)
config_complete_timeout_us
maximum time for FPGA to switch to operating status in the write_complete op.
firmware_name
name of FPGA image firmware file
sgt
scatter/gather table containing FPGA image
buf
contiguous buffer containing FPGA image
count
size of buf
region_id
id of target region
dev
device that owns this
overlay
Device Tree overlay
-
struct fpga_image_info *fpga_image_info_alloc(struct device *dev)¶
Allocate a FPGA image info struct
Parameters
struct device * dev
owning device
Return
struct fpga_image_info or NULL
-
void fpga_image_info_free(struct fpga_image_info *info)¶
Free a FPGA image info struct
Parameters
struct fpga_image_info * info
FPGA image info struct to free