diff options
| author | Jason Gunthorpe <jgunthorpe@obsidianresearch.com> | 2017-02-01 14:48:44 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-02-10 09:20:44 -0500 |
| commit | baa6d396635129d8a67793e884f3b2182c7354b3 (patch) | |
| tree | e836ac87b5a67011ef9f1c14d0443b4de8f9c309 /include/linux/fpga | |
| parent | b496df86ac1bbe393a55ddbfed35d46e74ef9767 (diff) | |
fpga: Add scatterlist based programming
Requiring contiguous kernel memory is not a good idea, this is a limited
resource and allocation can fail under normal work loads.
This introduces a .write_sg op that supporting drivers can provide
to DMA directly from dis-contiguous memory and a new entry point
fpga_mgr_buf_load_sg that users can call to directly provide page
lists.
The full matrix of compatibility is provided, either the linear or sg
interface can be used by the user with a driver supporting either
interface.
A notable change for drivers is that the .write op can now be called
multiple times.
Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Acked-by: Alan Tull <atull@opensource.altera.com>
Acked-by: Moritz Fischer <moritz.fischer@ettus.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/fpga')
| -rw-r--r-- | include/linux/fpga/fpga-mgr.h | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h index 16551d5eac36..57beb5d09bfc 100644 --- a/include/linux/fpga/fpga-mgr.h +++ b/include/linux/fpga/fpga-mgr.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #define _LINUX_FPGA_MGR_H | 22 | #define _LINUX_FPGA_MGR_H |
| 23 | 23 | ||
| 24 | struct fpga_manager; | 24 | struct fpga_manager; |
| 25 | struct sg_table; | ||
| 25 | 26 | ||
| 26 | /** | 27 | /** |
| 27 | * enum fpga_mgr_states - fpga framework states | 28 | * enum fpga_mgr_states - fpga framework states |
| @@ -88,6 +89,7 @@ struct fpga_image_info { | |||
| 88 | * @state: returns an enum value of the FPGA's state | 89 | * @state: returns an enum value of the FPGA's state |
| 89 | * @write_init: prepare the FPGA to receive confuration data | 90 | * @write_init: prepare the FPGA to receive confuration data |
| 90 | * @write: write count bytes of configuration data to the FPGA | 91 | * @write: write count bytes of configuration data to the FPGA |
| 92 | * @write_sg: write the scatter list of configuration data to the FPGA | ||
| 91 | * @write_complete: set FPGA to operating state after writing is done | 93 | * @write_complete: set FPGA to operating state after writing is done |
| 92 | * @fpga_remove: optional: Set FPGA into a specific state during driver remove | 94 | * @fpga_remove: optional: Set FPGA into a specific state during driver remove |
| 93 | * | 95 | * |
| @@ -102,6 +104,7 @@ struct fpga_manager_ops { | |||
| 102 | struct fpga_image_info *info, | 104 | struct fpga_image_info *info, |
| 103 | const char *buf, size_t count); | 105 | const char *buf, size_t count); |
| 104 | int (*write)(struct fpga_manager *mgr, const char *buf, size_t count); | 106 | int (*write)(struct fpga_manager *mgr, const char *buf, size_t count); |
| 107 | int (*write_sg)(struct fpga_manager *mgr, struct sg_table *sgt); | ||
| 105 | int (*write_complete)(struct fpga_manager *mgr, | 108 | int (*write_complete)(struct fpga_manager *mgr, |
| 106 | struct fpga_image_info *info); | 109 | struct fpga_image_info *info); |
| 107 | void (*fpga_remove)(struct fpga_manager *mgr); | 110 | void (*fpga_remove)(struct fpga_manager *mgr); |
| @@ -129,6 +132,8 @@ struct fpga_manager { | |||
| 129 | 132 | ||
| 130 | int fpga_mgr_buf_load(struct fpga_manager *mgr, struct fpga_image_info *info, | 133 | int fpga_mgr_buf_load(struct fpga_manager *mgr, struct fpga_image_info *info, |
| 131 | const char *buf, size_t count); | 134 | const char *buf, size_t count); |
| 135 | int fpga_mgr_buf_load_sg(struct fpga_manager *mgr, struct fpga_image_info *info, | ||
| 136 | struct sg_table *sgt); | ||
| 132 | 137 | ||
| 133 | int fpga_mgr_firmware_load(struct fpga_manager *mgr, | 138 | int fpga_mgr_firmware_load(struct fpga_manager *mgr, |
| 134 | struct fpga_image_info *info, | 139 | struct fpga_image_info *info, |
