diff options
Diffstat (limited to 'include/linux/fpga/fpga-mgr.h')
-rw-r--r-- | include/linux/fpga/fpga-mgr.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/include/linux/fpga/fpga-mgr.h b/include/linux/fpga/fpga-mgr.h new file mode 100644 index 000000000000..0940bf45e2f2 --- /dev/null +++ b/include/linux/fpga/fpga-mgr.h | |||
@@ -0,0 +1,127 @@ | |||
1 | /* | ||
2 | * FPGA Framework | ||
3 | * | ||
4 | * Copyright (C) 2013-2015 Altera Corporation | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms and conditions of the GNU General Public License, | ||
8 | * version 2, as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
13 | * more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License along with | ||
16 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | #include <linux/mutex.h> | ||
19 | #include <linux/platform_device.h> | ||
20 | |||
21 | #ifndef _LINUX_FPGA_MGR_H | ||
22 | #define _LINUX_FPGA_MGR_H | ||
23 | |||
24 | struct fpga_manager; | ||
25 | |||
26 | /** | ||
27 | * enum fpga_mgr_states - fpga framework states | ||
28 | * @FPGA_MGR_STATE_UNKNOWN: can't determine state | ||
29 | * @FPGA_MGR_STATE_POWER_OFF: FPGA power is off | ||
30 | * @FPGA_MGR_STATE_POWER_UP: FPGA reports power is up | ||
31 | * @FPGA_MGR_STATE_RESET: FPGA in reset state | ||
32 | * @FPGA_MGR_STATE_FIRMWARE_REQ: firmware request in progress | ||
33 | * @FPGA_MGR_STATE_FIRMWARE_REQ_ERR: firmware request failed | ||
34 | * @FPGA_MGR_STATE_WRITE_INIT: preparing FPGA for programming | ||
35 | * @FPGA_MGR_STATE_WRITE_INIT_ERR: Error during WRITE_INIT stage | ||
36 | * @FPGA_MGR_STATE_WRITE: writing image to FPGA | ||
37 | * @FPGA_MGR_STATE_WRITE_ERR: Error while writing FPGA | ||
38 | * @FPGA_MGR_STATE_WRITE_COMPLETE: Doing post programming steps | ||
39 | * @FPGA_MGR_STATE_WRITE_COMPLETE_ERR: Error during WRITE_COMPLETE | ||
40 | * @FPGA_MGR_STATE_OPERATING: FPGA is programmed and operating | ||
41 | */ | ||
42 | enum fpga_mgr_states { | ||
43 | /* default FPGA states */ | ||
44 | FPGA_MGR_STATE_UNKNOWN, | ||
45 | FPGA_MGR_STATE_POWER_OFF, | ||
46 | FPGA_MGR_STATE_POWER_UP, | ||
47 | FPGA_MGR_STATE_RESET, | ||
48 | |||
49 | /* getting an image for loading */ | ||
50 | FPGA_MGR_STATE_FIRMWARE_REQ, | ||
51 | FPGA_MGR_STATE_FIRMWARE_REQ_ERR, | ||
52 | |||
53 | /* write sequence: init, write, complete */ | ||
54 | FPGA_MGR_STATE_WRITE_INIT, | ||
55 | FPGA_MGR_STATE_WRITE_INIT_ERR, | ||
56 | FPGA_MGR_STATE_WRITE, | ||
57 | FPGA_MGR_STATE_WRITE_ERR, | ||
58 | FPGA_MGR_STATE_WRITE_COMPLETE, | ||
59 | FPGA_MGR_STATE_WRITE_COMPLETE_ERR, | ||
60 | |||
61 | /* fpga is programmed and operating */ | ||
62 | FPGA_MGR_STATE_OPERATING, | ||
63 | }; | ||
64 | |||
65 | /* | ||
66 | * FPGA Manager flags | ||
67 | * FPGA_MGR_PARTIAL_RECONFIG: do partial reconfiguration if supported | ||
68 | */ | ||
69 | #define FPGA_MGR_PARTIAL_RECONFIG BIT(0) | ||
70 | |||
71 | /** | ||
72 | * struct fpga_manager_ops - ops for low level fpga manager drivers | ||
73 | * @state: returns an enum value of the FPGA's state | ||
74 | * @write_init: prepare the FPGA to receive confuration data | ||
75 | * @write: write count bytes of configuration data to the FPGA | ||
76 | * @write_complete: set FPGA to operating state after writing is done | ||
77 | * @fpga_remove: optional: Set FPGA into a specific state during driver remove | ||
78 | * | ||
79 | * fpga_manager_ops are the low level functions implemented by a specific | ||
80 | * fpga manager driver. The optional ones are tested for NULL before being | ||
81 | * called, so leaving them out is fine. | ||
82 | */ | ||
83 | struct fpga_manager_ops { | ||
84 | enum fpga_mgr_states (*state)(struct fpga_manager *mgr); | ||
85 | int (*write_init)(struct fpga_manager *mgr, u32 flags, | ||
86 | const char *buf, size_t count); | ||
87 | int (*write)(struct fpga_manager *mgr, const char *buf, size_t count); | ||
88 | int (*write_complete)(struct fpga_manager *mgr, u32 flags); | ||
89 | void (*fpga_remove)(struct fpga_manager *mgr); | ||
90 | }; | ||
91 | |||
92 | /** | ||
93 | * struct fpga_manager - fpga manager structure | ||
94 | * @name: name of low level fpga manager | ||
95 | * @dev: fpga manager device | ||
96 | * @ref_mutex: only allows one reference to fpga manager | ||
97 | * @state: state of fpga manager | ||
98 | * @mops: pointer to struct of fpga manager ops | ||
99 | * @priv: low level driver private date | ||
100 | */ | ||
101 | struct fpga_manager { | ||
102 | const char *name; | ||
103 | struct device dev; | ||
104 | struct mutex ref_mutex; | ||
105 | enum fpga_mgr_states state; | ||
106 | const struct fpga_manager_ops *mops; | ||
107 | void *priv; | ||
108 | }; | ||
109 | |||
110 | #define to_fpga_manager(d) container_of(d, struct fpga_manager, dev) | ||
111 | |||
112 | int fpga_mgr_buf_load(struct fpga_manager *mgr, u32 flags, | ||
113 | const char *buf, size_t count); | ||
114 | |||
115 | int fpga_mgr_firmware_load(struct fpga_manager *mgr, u32 flags, | ||
116 | const char *image_name); | ||
117 | |||
118 | struct fpga_manager *of_fpga_mgr_get(struct device_node *node); | ||
119 | |||
120 | void fpga_mgr_put(struct fpga_manager *mgr); | ||
121 | |||
122 | int fpga_mgr_register(struct device *dev, const char *name, | ||
123 | const struct fpga_manager_ops *mops, void *priv); | ||
124 | |||
125 | void fpga_mgr_unregister(struct device *dev); | ||
126 | |||
127 | #endif /*_LINUX_FPGA_MGR_H */ | ||