xref: /dpdk/drivers/raw/ifpga/base/opae_hw_api.h (revision 089e5ed727a15da2729cfee9b63533dd120bd04c)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2018 Intel Corporation
3  */
4 
5 #ifndef _OPAE_HW_API_H_
6 #define _OPAE_HW_API_H_
7 
8 #include <stdint.h>
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <sys/queue.h>
12 
13 #include "opae_osdep.h"
14 #include "opae_intel_max10.h"
15 #include "opae_eth_group.h"
16 
17 #ifndef PCI_MAX_RESOURCE
18 #define PCI_MAX_RESOURCE 6
19 #endif
20 
21 struct opae_adapter;
22 
23 enum opae_adapter_type {
24 	OPAE_FPGA_PCI,
25 	OPAE_FPGA_NET,
26 };
27 
28 /* OPAE Manager Data Structure */
29 struct opae_manager_ops;
30 struct opae_manager_networking_ops;
31 
32 /*
33  * opae_manager has pointer to its parent adapter, as it could be able to manage
34  * all components on this FPGA device (adapter). If not the case, don't set this
35  * adapter, which limit opae_manager ops to manager itself.
36  */
37 struct opae_manager {
38 	const char *name;
39 	struct opae_adapter *adapter;
40 	struct opae_manager_ops *ops;
41 	struct opae_manager_networking_ops *network_ops;
42 	void *data;
43 };
44 
45 /* FIXME: add more management ops, e.g power/thermal and etc */
46 struct opae_manager_ops {
47 	int (*flash)(struct opae_manager *mgr, int id, const char *buffer,
48 		     u32 size, u64 *status);
49 	int (*get_eth_group_region_info)(struct opae_manager *mgr,
50 			struct opae_eth_group_region_info *info);
51 };
52 
53 /* networking management ops in FME */
54 struct opae_manager_networking_ops {
55 	int (*read_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
56 			int size);
57 	int (*write_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
58 			int size);
59 	int (*get_eth_group_nums)(struct opae_manager *mgr);
60 	int (*get_eth_group_info)(struct opae_manager *mgr,
61 			u8 group_id, struct opae_eth_group_info *info);
62 	int (*eth_group_reg_read)(struct opae_manager *mgr, u8 group_id,
63 			u8 type, u8 index, u16 addr, u32 *data);
64 	int (*eth_group_reg_write)(struct opae_manager *mgr, u8 group_id,
65 			u8 type, u8 index, u16 addr, u32 data);
66 	int (*get_retimer_info)(struct opae_manager *mgr,
67 			struct opae_retimer_info *info);
68 	int (*get_retimer_status)(struct opae_manager *mgr,
69 			struct opae_retimer_status *status);
70 };
71 
72 /* OPAE Manager APIs */
73 struct opae_manager *
74 opae_manager_alloc(const char *name, struct opae_manager_ops *ops,
75 		struct opae_manager_networking_ops *network_ops, void *data);
76 #define opae_manager_free(mgr) opae_free(mgr)
77 int opae_manager_flash(struct opae_manager *mgr, int acc_id, const char *buf,
78 		       u32 size, u64 *status);
79 int opae_manager_get_eth_group_region_info(struct opae_manager *mgr,
80 		u8 group_id, struct opae_eth_group_region_info *info);
81 
82 /* OPAE Bridge Data Structure */
83 struct opae_bridge_ops;
84 
85 /*
86  * opae_bridge only has pointer to its downstream accelerator.
87  */
88 struct opae_bridge {
89 	const char *name;
90 	int id;
91 	struct opae_accelerator *acc;
92 	struct opae_bridge_ops *ops;
93 	void *data;
94 };
95 
96 struct opae_bridge_ops {
97 	int (*reset)(struct opae_bridge *br);
98 };
99 
100 /* OPAE Bridge APIs */
101 struct opae_bridge *
102 opae_bridge_alloc(const char *name, struct opae_bridge_ops *ops, void *data);
103 int opae_bridge_reset(struct opae_bridge *br);
104 #define opae_bridge_free(br) opae_free(br)
105 
106 /* OPAE Acceleraotr Data Structure */
107 struct opae_accelerator_ops;
108 
109 /*
110  * opae_accelerator has pointer to its upstream bridge(port).
111  * In some cases, if we allow same user to do PR on its own accelerator, then
112  * set the manager pointer during the enumeration. But in other cases, the PR
113  * functions only could be done via manager in another module / thread / service
114  * / application for better protection.
115  */
116 struct opae_accelerator {
117 	TAILQ_ENTRY(opae_accelerator) node;
118 	const char *name;
119 	int index;
120 	struct opae_bridge *br;
121 	struct opae_manager *mgr;
122 	struct opae_accelerator_ops *ops;
123 	void *data;
124 };
125 
126 struct opae_acc_info {
127 	unsigned int num_regions;
128 	unsigned int num_irqs;
129 };
130 
131 struct opae_acc_region_info {
132 	u32 flags;
133 #define ACC_REGION_READ		(1 << 0)
134 #define ACC_REGION_WRITE	(1 << 1)
135 #define ACC_REGION_MMIO		(1 << 2)
136 	u32 index;
137 	u64 phys_addr;
138 	u64 len;
139 	u8 *addr;
140 };
141 
142 struct opae_accelerator_ops {
143 	int (*read)(struct opae_accelerator *acc, unsigned int region_idx,
144 		    u64 offset, unsigned int byte, void *data);
145 	int (*write)(struct opae_accelerator *acc, unsigned int region_idx,
146 		     u64 offset, unsigned int byte, void *data);
147 	int (*get_info)(struct opae_accelerator *acc,
148 			struct opae_acc_info *info);
149 	int (*get_region_info)(struct opae_accelerator *acc,
150 			       struct opae_acc_region_info *info);
151 	int (*set_irq)(struct opae_accelerator *acc,
152 		       u32 start, u32 count, s32 evtfds[]);
153 	int (*get_uuid)(struct opae_accelerator *acc,
154 			struct uuid *uuid);
155 };
156 
157 /* OPAE accelerator APIs */
158 struct opae_accelerator *
159 opae_accelerator_alloc(const char *name, struct opae_accelerator_ops *ops,
160 		       void *data);
161 #define opae_accelerator_free(acc) opae_free(acc)
162 int opae_acc_get_info(struct opae_accelerator *acc, struct opae_acc_info *info);
163 int opae_acc_get_region_info(struct opae_accelerator *acc,
164 			     struct opae_acc_region_info *info);
165 int opae_acc_set_irq(struct opae_accelerator *acc,
166 		     u32 start, u32 count, s32 evtfds[]);
167 int opae_acc_get_uuid(struct opae_accelerator *acc,
168 		      struct uuid *uuid);
169 
170 static inline struct opae_bridge *
171 opae_acc_get_br(struct opae_accelerator *acc)
172 {
173 	return acc ? acc->br : NULL;
174 }
175 
176 static inline struct opae_manager *
177 opae_acc_get_mgr(struct opae_accelerator *acc)
178 {
179 	return acc ? acc->mgr : NULL;
180 }
181 
182 int opae_acc_reg_read(struct opae_accelerator *acc, unsigned int region_idx,
183 		      u64 offset, unsigned int byte, void *data);
184 int opae_acc_reg_write(struct opae_accelerator *acc, unsigned int region_idx,
185 		       u64 offset, unsigned int byte, void *data);
186 
187 #define opae_acc_reg_read64(acc, region, offset, data) \
188 	opae_acc_reg_read(acc, region, offset, 8, data)
189 #define opae_acc_reg_write64(acc, region, offset, data) \
190 	opae_acc_reg_write(acc, region, offset, 8, data)
191 #define opae_acc_reg_read32(acc, region, offset, data) \
192 	opae_acc_reg_read(acc, region, offset, 4, data)
193 #define opae_acc_reg_write32(acc, region, offset, data) \
194 	opae_acc_reg_write(acc, region, offset, 4, data)
195 #define opae_acc_reg_read16(acc, region, offset, data) \
196 	opae_acc_reg_read(acc, region, offset, 2, data)
197 #define opae_acc_reg_write16(acc, region, offset, data) \
198 	opae_acc_reg_write(acc, region, offset, 2, data)
199 #define opae_acc_reg_read8(acc, region, offset, data) \
200 	opae_acc_reg_read(acc, region, offset, 1, data)
201 #define opae_acc_reg_write8(acc, region, offset, data) \
202 	opae_acc_reg_write(acc, region, offset, 1, data)
203 
204 /*for data stream read/write*/
205 int opae_acc_data_read(struct opae_accelerator *acc, unsigned int flags,
206 		       u64 offset, unsigned int byte, void *data);
207 int opae_acc_data_write(struct opae_accelerator *acc, unsigned int flags,
208 			u64 offset, unsigned int byte, void *data);
209 
210 /* OPAE Adapter Data Structure */
211 struct opae_adapter_data {
212 	enum opae_adapter_type type;
213 };
214 
215 struct opae_reg_region {
216 	u64 phys_addr;
217 	u64 len;
218 	u8 *addr;
219 };
220 
221 struct opae_adapter_data_pci {
222 	enum opae_adapter_type type;
223 	u16 device_id;
224 	u16 vendor_id;
225 	struct opae_reg_region region[PCI_MAX_RESOURCE];
226 	int vfio_dev_fd;  /* VFIO device file descriptor */
227 };
228 
229 /* FIXME: OPAE_FPGA_NET type */
230 struct opae_adapter_data_net {
231 	enum opae_adapter_type type;
232 };
233 
234 struct opae_adapter_ops {
235 	int (*enumerate)(struct opae_adapter *adapter);
236 	void (*destroy)(struct opae_adapter *adapter);
237 };
238 
239 TAILQ_HEAD(opae_accelerator_list, opae_accelerator);
240 
241 #define opae_adapter_for_each_acc(adatper, acc) \
242 	TAILQ_FOREACH(acc, &adapter->acc_list, node)
243 
244 struct opae_adapter {
245 	const char *name;
246 	struct opae_manager *mgr;
247 	struct opae_accelerator_list acc_list;
248 	struct opae_adapter_ops *ops;
249 	void *data;
250 };
251 
252 /* OPAE Adapter APIs */
253 void *opae_adapter_data_alloc(enum opae_adapter_type type);
254 #define opae_adapter_data_free(data) opae_free(data)
255 
256 int opae_adapter_init(struct opae_adapter *adapter,
257 		const char *name, void *data);
258 #define opae_adapter_free(adapter) opae_free(adapter)
259 
260 int opae_adapter_enumerate(struct opae_adapter *adapter);
261 void opae_adapter_destroy(struct opae_adapter *adapter);
262 static inline struct opae_manager *
263 opae_adapter_get_mgr(struct opae_adapter *adapter)
264 {
265 	return adapter ? adapter->mgr : NULL;
266 }
267 
268 struct opae_accelerator *
269 opae_adapter_get_acc(struct opae_adapter *adapter, int acc_id);
270 
271 static inline void opae_adapter_add_acc(struct opae_adapter *adapter,
272 					struct opae_accelerator *acc)
273 {
274 	TAILQ_INSERT_TAIL(&adapter->acc_list, acc, node);
275 }
276 
277 static inline void opae_adapter_remove_acc(struct opae_adapter *adapter,
278 					   struct opae_accelerator *acc)
279 {
280 	TAILQ_REMOVE(&adapter->acc_list, acc, node);
281 }
282 
283 /* OPAE vBNG network datastruct */
284 #define OPAE_ETHER_ADDR_LEN 6
285 
286 struct opae_ether_addr {
287 	unsigned char addr_bytes[OPAE_ETHER_ADDR_LEN];
288 } __attribute__((__packed__));
289 
290 /* OPAE vBNG network API*/
291 int opae_manager_read_mac_rom(struct opae_manager *mgr, int port,
292 		struct opae_ether_addr *addr);
293 int opae_manager_write_mac_rom(struct opae_manager *mgr, int port,
294 		struct opae_ether_addr *addr);
295 int opae_manager_get_retimer_info(struct opae_manager *mgr,
296 		struct opae_retimer_info *info);
297 int opae_manager_get_retimer_status(struct opae_manager *mgr,
298 		struct opae_retimer_status *status);
299 int opae_manager_get_eth_group_nums(struct opae_manager *mgr);
300 int opae_manager_get_eth_group_info(struct opae_manager *mgr,
301 		u8 group_id, struct opae_eth_group_info *info);
302 int opae_manager_eth_group_write_reg(struct opae_manager *mgr, u8 group_id,
303 		u8 type, u8 index, u16 addr, u32 data);
304 int opae_manager_eth_group_read_reg(struct opae_manager *mgr, u8 group_id,
305 		u8 type, u8 index, u16 addr, u32 *data);
306 #endif /* _OPAE_HW_API_H_*/
307