aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gunthorpe <jgunthorpe@obsidianresearch.com>2016-11-22 13:22:09 -0500
committerAlan Tull <atull@opensource.altera.com>2016-11-29 16:51:49 -0500
commit1d7f1589d341344c0c598b00de44891a7968c6a0 (patch)
treef1fd0d74131222096b584ebe16a11a9c0e476d34
parent340c0c53ea3073107d5bb7a61f3158e50bf189e0 (diff)
fpga: Clarify how write_init works streaming modes
This interface was designed for streaming, but write_init's buf argument has an unclear purpose. Define it to be the first bytes of the bitstream. Each driver gets to set how many bytes (at most) it wants to see. Short bitstreams will be passed through as-is, while long ones will be truncated. The intent is to allow drivers to peek at the header before the transfer actually starts. Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Acked-by: Alan Tull <atull@opensource.altera.com>
-rw-r--r--Documentation/fpga/fpga-mgr.txt5
-rw-r--r--drivers/fpga/fpga-mgr.c6
-rw-r--r--drivers/fpga/socfpga-a10.c1
-rw-r--r--include/linux/fpga/fpga-mgr.h2
4 files changed, 11 insertions, 3 deletions
diff --git a/Documentation/fpga/fpga-mgr.txt b/Documentation/fpga/fpga-mgr.txt
index 087924f2b20c..86ee5078fd03 100644
--- a/Documentation/fpga/fpga-mgr.txt
+++ b/Documentation/fpga/fpga-mgr.txt
@@ -169,7 +169,10 @@ The programming sequence is:
169 2. .write (may be called once or multiple times) 169 2. .write (may be called once or multiple times)
170 3. .write_complete 170 3. .write_complete
171 171
172The .write_init function will prepare the FPGA to receive the image data. 172The .write_init function will prepare the FPGA to receive the image data. The
173buffer passed into .write_init will be atmost .initial_header_size bytes long,
174if the whole bitstream is not immediately available then the core code will
175buffer up at least this much before starting.
173 176
174The .write function writes a buffer to the FPGA. The buffer may be contain the 177The .write function writes a buffer to the FPGA. The buffer may be contain the
175whole FPGA image or may be a smaller chunk of an FPGA image. In the latter 178whole FPGA image or may be a smaller chunk of an FPGA image. In the latter
diff --git a/drivers/fpga/fpga-mgr.c b/drivers/fpga/fpga-mgr.c
index 79ce2eea44db..f0a69d3e60a5 100644
--- a/drivers/fpga/fpga-mgr.c
+++ b/drivers/fpga/fpga-mgr.c
@@ -53,10 +53,12 @@ int fpga_mgr_buf_load(struct fpga_manager *mgr, struct fpga_image_info *info,
53 /* 53 /*
54 * Call the low level driver's write_init function. This will do the 54 * Call the low level driver's write_init function. This will do the
55 * device-specific things to get the FPGA into the state where it is 55 * device-specific things to get the FPGA into the state where it is
56 * ready to receive an FPGA image. 56 * ready to receive an FPGA image. The low level driver only gets to
57 * see the first initial_header_size bytes in the buffer.
57 */ 58 */
58 mgr->state = FPGA_MGR_STATE_WRITE_INIT; 59 mgr->state = FPGA_MGR_STATE_WRITE_INIT;
59 ret = mgr->mops->write_init(mgr, info, buf, count); 60 ret = mgr->mops->write_init(mgr, info, buf,
61 min(mgr->mops->initial_header_size, count));
60 if (ret) { 62 if (ret) {
61 dev_err(dev, "Error preparing FPGA for writing\n"); 63 dev_err(dev, "Error preparing FPGA for writing\n");
62 mgr->state = FPGA_MGR_STATE_WRITE_INIT_ERR; 64 mgr->state = FPGA_MGR_STATE_WRITE_INIT_ERR;
diff --git a/drivers/fpga/socfpga-a10.c b/drivers/fpga/socfpga-a10.c
index ccd9fb23bd52..f8770af0f6b5 100644
--- a/drivers/fpga/socfpga-a10.c
+++ b/drivers/fpga/socfpga-a10.c
@@ -470,6 +470,7 @@ static enum fpga_mgr_states socfpga_a10_fpga_state(struct fpga_manager *mgr)
470} 470}
471 471
472static const struct fpga_manager_ops socfpga_a10_fpga_mgr_ops = { 472static const struct fpga_manager_ops socfpga_a10_fpga_mgr_ops = {
473 .initial_header_size = (RBF_DECOMPRESS_OFFSET + 1) * 4,
473 .state = socfpga_a10_fpga_state, 474 .state = socfpga_a10_fpga_state,
474 .write_init = socfpga_a10_fpga_write_init, 475 .write_init = socfpga_a10_fpga_write_init,
475 .write = socfpga_a10_fpga_write, 476 .write = socfpga_a10_fpga_write,
diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h
index 96a1a3311649..16551d5eac36 100644
--- a/include/linux/fpga/fpga-mgr.h
+++ b/include/linux/fpga/fpga-mgr.h
@@ -84,6 +84,7 @@ struct fpga_image_info {
84 84
85/** 85/**
86 * struct fpga_manager_ops - ops for low level fpga manager drivers 86 * struct fpga_manager_ops - ops for low level fpga manager drivers
87 * @initial_header_size: Maximum number of bytes that should be passed into write_init
87 * @state: returns an enum value of the FPGA's state 88 * @state: returns an enum value of the FPGA's state
88 * @write_init: prepare the FPGA to receive confuration data 89 * @write_init: prepare the FPGA to receive confuration data
89 * @write: write count bytes of configuration data to the FPGA 90 * @write: write count bytes of configuration data to the FPGA
@@ -95,6 +96,7 @@ struct fpga_image_info {
95 * called, so leaving them out is fine. 96 * called, so leaving them out is fine.
96 */ 97 */
97struct fpga_manager_ops { 98struct fpga_manager_ops {
99 size_t initial_header_size;
98 enum fpga_mgr_states (*state)(struct fpga_manager *mgr); 100 enum fpga_mgr_states (*state)(struct fpga_manager *mgr);
99 int (*write_init)(struct fpga_manager *mgr, 101 int (*write_init)(struct fpga_manager *mgr,
100 struct fpga_image_info *info, 102 struct fpga_image_info *info,