xref: /linux/Documentation/driver-api/fpga/fpga-mgr.rst (revision 084181fe8cc7472695b907f0018f4cd00934cb12)
1547b822cSAlan TullFPGA Manager
2547b822cSAlan Tull============
3547b822cSAlan Tull
4547b822cSAlan TullOverview
5547b822cSAlan Tull--------
6547b822cSAlan Tull
7547b822cSAlan TullThe FPGA manager core exports a set of functions for programming an FPGA with
8547b822cSAlan Tullan image.  The API is manufacturer agnostic.  All manufacturer specifics are
9547b822cSAlan Tullhidden away in a low level driver which registers a set of ops with the core.
10547b822cSAlan TullThe FPGA image data itself is very manufacturer specific, but for our purposes
11547b822cSAlan Tullit's just binary data.  The FPGA manager core won't parse it.
12547b822cSAlan Tull
13547b822cSAlan TullThe FPGA image to be programmed can be in a scatter gather list, a single
14547b822cSAlan Tullcontiguous buffer, or a firmware file.  Because allocating contiguous kernel
15547b822cSAlan Tullmemory for the buffer should be avoided, users are encouraged to use a scatter
16547b822cSAlan Tullgather list instead if possible.
17547b822cSAlan Tull
18547b822cSAlan TullThe particulars for programming the image are presented in a structure (struct
19547b822cSAlan Tullfpga_image_info).  This struct contains parameters such as pointers to the
20547b822cSAlan TullFPGA image as well as image-specific particulars such as whether the image was
21547b822cSAlan Tullbuilt for full or partial reconfiguration.
22547b822cSAlan Tull
23547b822cSAlan TullHow to support a new FPGA device
24547b822cSAlan Tull--------------------------------
25547b822cSAlan Tull
26547b822cSAlan TullTo add another FPGA manager, write a driver that implements a set of ops.  The
27547b822cSAlan Tullprobe function calls fpga_mgr_register(), such as::
28547b822cSAlan Tull
29547b822cSAlan Tull	static const struct fpga_manager_ops socfpga_fpga_ops = {
30547b822cSAlan Tull		.write_init = socfpga_fpga_ops_configure_init,
31547b822cSAlan Tull		.write = socfpga_fpga_ops_configure_write,
32547b822cSAlan Tull		.write_complete = socfpga_fpga_ops_configure_complete,
33547b822cSAlan Tull		.state = socfpga_fpga_ops_state,
34547b822cSAlan Tull	};
35547b822cSAlan Tull
36547b822cSAlan Tull	static int socfpga_fpga_probe(struct platform_device *pdev)
37547b822cSAlan Tull	{
38547b822cSAlan Tull		struct device *dev = &pdev->dev;
39547b822cSAlan Tull		struct socfpga_fpga_priv *priv;
40547b822cSAlan Tull		struct fpga_manager *mgr;
41547b822cSAlan Tull		int ret;
42547b822cSAlan Tull
43547b822cSAlan Tull		priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
44547b822cSAlan Tull		if (!priv)
45547b822cSAlan Tull			return -ENOMEM;
46547b822cSAlan Tull
47547b822cSAlan Tull		/*
48547b822cSAlan Tull		 * do ioremaps, get interrupts, etc. and save
49547b822cSAlan Tull		 * them in priv
50547b822cSAlan Tull		 */
51547b822cSAlan Tull
52*084181feSAlan Tull		mgr = devm_fpga_mgr_create(dev, "Altera SOCFPGA FPGA Manager",
53547b822cSAlan Tull					   &socfpga_fpga_ops, priv);
54547b822cSAlan Tull		if (!mgr)
55547b822cSAlan Tull			return -ENOMEM;
56547b822cSAlan Tull
57547b822cSAlan Tull		platform_set_drvdata(pdev, mgr);
58547b822cSAlan Tull
59*084181feSAlan Tull		return fpga_mgr_register(mgr);
60547b822cSAlan Tull	}
61547b822cSAlan Tull
62547b822cSAlan Tull	static int socfpga_fpga_remove(struct platform_device *pdev)
63547b822cSAlan Tull	{
64547b822cSAlan Tull		struct fpga_manager *mgr = platform_get_drvdata(pdev);
65547b822cSAlan Tull
66547b822cSAlan Tull		fpga_mgr_unregister(mgr);
67547b822cSAlan Tull
68547b822cSAlan Tull		return 0;
69547b822cSAlan Tull	}
70547b822cSAlan Tull
71547b822cSAlan Tull
72547b822cSAlan TullThe ops will implement whatever device specific register writes are needed to
73547b822cSAlan Tulldo the programming sequence for this particular FPGA.  These ops return 0 for
74547b822cSAlan Tullsuccess or negative error codes otherwise.
75547b822cSAlan Tull
76547b822cSAlan TullThe programming sequence is::
77547b822cSAlan Tull 1. .write_init
78547b822cSAlan Tull 2. .write or .write_sg (may be called once or multiple times)
79547b822cSAlan Tull 3. .write_complete
80547b822cSAlan Tull
81547b822cSAlan TullThe .write_init function will prepare the FPGA to receive the image data.  The
82a59f95c7SAlan Tullbuffer passed into .write_init will be at most .initial_header_size bytes long;
83547b822cSAlan Tullif the whole bitstream is not immediately available then the core code will
84547b822cSAlan Tullbuffer up at least this much before starting.
85547b822cSAlan Tull
86547b822cSAlan TullThe .write function writes a buffer to the FPGA. The buffer may be contain the
87547b822cSAlan Tullwhole FPGA image or may be a smaller chunk of an FPGA image.  In the latter
88547b822cSAlan Tullcase, this function is called multiple times for successive chunks. This interface
89547b822cSAlan Tullis suitable for drivers which use PIO.
90547b822cSAlan Tull
91547b822cSAlan TullThe .write_sg version behaves the same as .write except the input is a sg_table
92547b822cSAlan Tullscatter list. This interface is suitable for drivers which use DMA.
93547b822cSAlan Tull
94547b822cSAlan TullThe .write_complete function is called after all the image has been written
95547b822cSAlan Tullto put the FPGA into operating mode.
96547b822cSAlan Tull
97a59f95c7SAlan TullThe ops include a .state function which will determine the state the FPGA is in
98a59f95c7SAlan Tulland return a code of type enum fpga_mgr_states.  It doesn't result in a change
99a59f95c7SAlan Tullin state.
100547b822cSAlan Tull
101547b822cSAlan TullHow to write an image buffer to a supported FPGA
102547b822cSAlan Tull------------------------------------------------
103547b822cSAlan Tull
104547b822cSAlan TullSome sample code::
105547b822cSAlan Tull
106547b822cSAlan Tull	#include <linux/fpga/fpga-mgr.h>
107547b822cSAlan Tull
108547b822cSAlan Tull	struct fpga_manager *mgr;
109547b822cSAlan Tull	struct fpga_image_info *info;
110547b822cSAlan Tull	int ret;
111547b822cSAlan Tull
112547b822cSAlan Tull	/*
113547b822cSAlan Tull	 * Get a reference to FPGA manager.  The manager is not locked, so you can
114547b822cSAlan Tull	 * hold onto this reference without it preventing programming.
115547b822cSAlan Tull	 *
116547b822cSAlan Tull	 * This example uses the device node of the manager.  Alternatively, use
117547b822cSAlan Tull	 * fpga_mgr_get(dev) instead if you have the device.
118547b822cSAlan Tull	 */
119547b822cSAlan Tull	mgr = of_fpga_mgr_get(mgr_node);
120547b822cSAlan Tull
121547b822cSAlan Tull	/* struct with information about the FPGA image to program. */
122547b822cSAlan Tull	info = fpga_image_info_alloc(dev);
123547b822cSAlan Tull
124547b822cSAlan Tull	/* flags indicates whether to do full or partial reconfiguration */
125547b822cSAlan Tull	info->flags = FPGA_MGR_PARTIAL_RECONFIG;
126547b822cSAlan Tull
127547b822cSAlan Tull	/*
128547b822cSAlan Tull	 * At this point, indicate where the image is. This is pseudo-code; you're
129547b822cSAlan Tull	 * going to use one of these three.
130547b822cSAlan Tull	 */
131547b822cSAlan Tull	if (image is in a scatter gather table) {
132547b822cSAlan Tull
133547b822cSAlan Tull		info->sgt = [your scatter gather table]
134547b822cSAlan Tull
135547b822cSAlan Tull	} else if (image is in a buffer) {
136547b822cSAlan Tull
137547b822cSAlan Tull		info->buf = [your image buffer]
138547b822cSAlan Tull		info->count = [image buffer size]
139547b822cSAlan Tull
140547b822cSAlan Tull	} else if (image is in a firmware file) {
141547b822cSAlan Tull
142547b822cSAlan Tull		info->firmware_name = devm_kstrdup(dev, firmware_name, GFP_KERNEL);
143547b822cSAlan Tull
144547b822cSAlan Tull	}
145547b822cSAlan Tull
146547b822cSAlan Tull	/* Get exclusive control of FPGA manager */
147547b822cSAlan Tull	ret = fpga_mgr_lock(mgr);
148547b822cSAlan Tull
149547b822cSAlan Tull	/* Load the buffer to the FPGA */
150547b822cSAlan Tull	ret = fpga_mgr_buf_load(mgr, &info, buf, count);
151547b822cSAlan Tull
152547b822cSAlan Tull	/* Release the FPGA manager */
153547b822cSAlan Tull	fpga_mgr_unlock(mgr);
154547b822cSAlan Tull	fpga_mgr_put(mgr);
155547b822cSAlan Tull
156547b822cSAlan Tull	/* Deallocate the image info if you're done with it */
157547b822cSAlan Tull	fpga_image_info_free(info);
158547b822cSAlan Tull
159547b822cSAlan TullAPI for implementing a new FPGA Manager driver
160547b822cSAlan Tull----------------------------------------------
161547b822cSAlan Tull
162547b822cSAlan Tull.. kernel-doc:: include/linux/fpga/fpga-mgr.h
163547b822cSAlan Tull   :functions: fpga_manager
164547b822cSAlan Tull
165547b822cSAlan Tull.. kernel-doc:: include/linux/fpga/fpga-mgr.h
166547b822cSAlan Tull   :functions: fpga_manager_ops
167547b822cSAlan Tull
168547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
169*084181feSAlan Tull   :functions: devm_fpga_mgr_create
170*084181feSAlan Tull
171*084181feSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
172547b822cSAlan Tull   :functions: fpga_mgr_create
173547b822cSAlan Tull
174547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
175547b822cSAlan Tull   :functions: fpga_mgr_free
176547b822cSAlan Tull
177547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
178547b822cSAlan Tull   :functions: fpga_mgr_register
179547b822cSAlan Tull
180547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
181547b822cSAlan Tull   :functions: fpga_mgr_unregister
182547b822cSAlan Tull
183a59f95c7SAlan TullAPI for programming an FPGA
184a59f95c7SAlan Tull---------------------------
185547b822cSAlan Tull
186492ecf6dSAlan TullFPGA Manager flags
187492ecf6dSAlan Tull
188492ecf6dSAlan Tull.. kernel-doc:: include/linux/fpga/fpga-mgr.h
189492ecf6dSAlan Tull   :doc: FPGA Manager flags
190492ecf6dSAlan Tull
191547b822cSAlan Tull.. kernel-doc:: include/linux/fpga/fpga-mgr.h
192547b822cSAlan Tull   :functions: fpga_image_info
193547b822cSAlan Tull
194547b822cSAlan Tull.. kernel-doc:: include/linux/fpga/fpga-mgr.h
195547b822cSAlan Tull   :functions: fpga_mgr_states
196547b822cSAlan Tull
197547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
198547b822cSAlan Tull   :functions: fpga_image_info_alloc
199547b822cSAlan Tull
200547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
201547b822cSAlan Tull   :functions: fpga_image_info_free
202547b822cSAlan Tull
203547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
204547b822cSAlan Tull   :functions: of_fpga_mgr_get
205547b822cSAlan Tull
206547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
207547b822cSAlan Tull   :functions: fpga_mgr_get
208547b822cSAlan Tull
209547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
210547b822cSAlan Tull   :functions: fpga_mgr_put
211547b822cSAlan Tull
212547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
213547b822cSAlan Tull   :functions: fpga_mgr_lock
214547b822cSAlan Tull
215547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
216547b822cSAlan Tull   :functions: fpga_mgr_unlock
217547b822cSAlan Tull
218547b822cSAlan Tull.. kernel-doc:: include/linux/fpga/fpga-mgr.h
219547b822cSAlan Tull   :functions: fpga_mgr_states
220547b822cSAlan Tull
221547b822cSAlan TullNote - use :c:func:`fpga_region_program_fpga()` instead of :c:func:`fpga_mgr_load()`
222547b822cSAlan Tull
223547b822cSAlan Tull.. kernel-doc:: drivers/fpga/fpga-mgr.c
224547b822cSAlan Tull   :functions: fpga_mgr_load
225