brintos

brintos / linux-shallow public Read only

0
0
Text · 2.9 KiB · fb4da42 Raw
108 lines · plain
1In-kernel API for FPGA Programming2==================================3 4Overview5--------6 7The in-kernel API for FPGA programming is a combination of APIs from8FPGA manager, bridge, and regions.  The actual function used to9trigger FPGA programming is fpga_region_program_fpga().10 11fpga_region_program_fpga() uses functionality supplied by12the FPGA manager and bridges.  It will:13 14 * lock the region's mutex15 * lock the mutex of the region's FPGA manager16 * build a list of FPGA bridges if a method has been specified to do so17 * disable the bridges18 * program the FPGA using info passed in :c:expr:`fpga_region->info`.19 * re-enable the bridges20 * release the locks21 22The struct fpga_image_info specifies what FPGA image to program.  It is23allocated/freed by fpga_image_info_alloc() and freed with24fpga_image_info_free()25 26How to program an FPGA using a region27-------------------------------------28 29When the FPGA region driver probed, it was given a pointer to an FPGA manager30driver so it knows which manager to use.  The region also either has a list of31bridges to control during programming or it has a pointer to a function that32will generate that list.  Here's some sample code of what to do next::33 34	#include <linux/fpga/fpga-mgr.h>35	#include <linux/fpga/fpga-region.h>36 37	struct fpga_image_info *info;38	int ret;39 40	/*41	 * First, alloc the struct with information about the FPGA image to42	 * program.43	 */44	info = fpga_image_info_alloc(dev);45	if (!info)46		return -ENOMEM;47 48	/* Set flags as needed, such as: */49	info->flags = FPGA_MGR_PARTIAL_RECONFIG;50 51	/*52	 * Indicate where the FPGA image is. This is pseudo-code; you're53	 * going to use one of these three.54	 */55	if (image is in a scatter gather table) {56 57		info->sgt = [your scatter gather table]58 59	} else if (image is in a buffer) {60 61		info->buf = [your image buffer]62		info->count = [image buffer size]63 64	} else if (image is in a firmware file) {65 66		info->firmware_name = devm_kstrdup(dev, firmware_name,67						   GFP_KERNEL);68 69	}70 71	/* Add info to region and do the programming */72	region->info = info;73	ret = fpga_region_program_fpga(region);74 75	/* Deallocate the image info if you're done with it */76	region->info = NULL;77	fpga_image_info_free(info);78 79	if (ret)80		return ret;81 82	/* Now enumerate whatever hardware has appeared in the FPGA. */83 84API for programming an FPGA85---------------------------86 87* fpga_region_program_fpga() -  Program an FPGA88* fpga_image_info() -  Specifies what FPGA image to program89* fpga_image_info_alloc() -  Allocate an FPGA image info struct90* fpga_image_info_free() -  Free an FPGA image info struct91 92.. kernel-doc:: drivers/fpga/fpga-region.c93   :functions: fpga_region_program_fpga94 95FPGA Manager flags96 97.. kernel-doc:: include/linux/fpga/fpga-mgr.h98   :doc: FPGA Manager flags99 100.. kernel-doc:: include/linux/fpga/fpga-mgr.h101   :functions: fpga_image_info102 103.. kernel-doc:: drivers/fpga/fpga-mgr.c104   :functions: fpga_image_info_alloc105 106.. kernel-doc:: drivers/fpga/fpga-mgr.c107   :functions: fpga_image_info_free108