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
Error
kernel-doc missing
FPGA Manager flags
Error
kernel-doc missing
Error
kernel-doc missing
Error
kernel-doc missing
Error
kernel-doc missing