0d7be0193ccb70b4993a45ff469f8dff414f7898
[dpdk.git] / drivers / raw / ifpga / base / opae_hw_api.h
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         int (*get_sensor_value)(struct opae_manager *mgr,
52                         struct opae_sensor_info *sensor,
53                         unsigned int *value);
54 };
55
56 /* networking management ops in FME */
57 struct opae_manager_networking_ops {
58         int (*read_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
59                         int size);
60         int (*write_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
61                         int size);
62         int (*get_eth_group_nums)(struct opae_manager *mgr);
63         int (*get_eth_group_info)(struct opae_manager *mgr,
64                         u8 group_id, struct opae_eth_group_info *info);
65         int (*eth_group_reg_read)(struct opae_manager *mgr, u8 group_id,
66                         u8 type, u8 index, u16 addr, u32 *data);
67         int (*eth_group_reg_write)(struct opae_manager *mgr, u8 group_id,
68                         u8 type, u8 index, u16 addr, u32 data);
69         int (*get_retimer_info)(struct opae_manager *mgr,
70                         struct opae_retimer_info *info);
71         int (*get_retimer_status)(struct opae_manager *mgr,
72                         struct opae_retimer_status *status);
73 };
74
75 extern struct opae_sensor_list opae_sensor_list;
76 #define opae_mgr_for_each_sensor(sensor) \
77         TAILQ_FOREACH(sensor, &opae_sensor_list, node)
78
79 /* OPAE Manager APIs */
80 struct opae_manager *
81 opae_manager_alloc(const char *name, struct opae_manager_ops *ops,
82                 struct opae_manager_networking_ops *network_ops, void *data);
83 #define opae_manager_free(mgr) opae_free(mgr)
84 int opae_manager_flash(struct opae_manager *mgr, int acc_id, const char *buf,
85                        u32 size, u64 *status);
86 int opae_manager_get_eth_group_region_info(struct opae_manager *mgr,
87                 u8 group_id, struct opae_eth_group_region_info *info);
88 struct opae_sensor_info *opae_mgr_get_sensor_by_name(const char *name);
89 struct opae_sensor_info *opae_mgr_get_sensor_by_id(unsigned int id);
90 int opae_mgr_get_sensor_value_by_name(struct opae_manager *mgr,
91                 const char *name, unsigned int *value);
92 int opae_mgr_get_sensor_value_by_id(struct opae_manager *mgr,
93                 unsigned int id, unsigned int *value);
94 int opae_mgr_get_sensor_value(struct opae_manager *mgr,
95                 struct opae_sensor_info *sensor,
96                 unsigned int *value);
97
98 /* OPAE Bridge Data Structure */
99 struct opae_bridge_ops;
100
101 /*
102  * opae_bridge only has pointer to its downstream accelerator.
103  */
104 struct opae_bridge {
105         const char *name;
106         int id;
107         struct opae_accelerator *acc;
108         struct opae_bridge_ops *ops;
109         void *data;
110 };
111
112 struct opae_bridge_ops {
113         int (*reset)(struct opae_bridge *br);
114 };
115
116 /* OPAE Bridge APIs */
117 struct opae_bridge *
118 opae_bridge_alloc(const char *name, struct opae_bridge_ops *ops, void *data);
119 int opae_bridge_reset(struct opae_bridge *br);
120 #define opae_bridge_free(br) opae_free(br)
121
122 /* OPAE Acceleraotr Data Structure */
123 struct opae_accelerator_ops;
124
125 /*
126  * opae_accelerator has pointer to its upstream bridge(port).
127  * In some cases, if we allow same user to do PR on its own accelerator, then
128  * set the manager pointer during the enumeration. But in other cases, the PR
129  * functions only could be done via manager in another module / thread / service
130  * / application for better protection.
131  */
132 struct opae_accelerator {
133         TAILQ_ENTRY(opae_accelerator) node;
134         const char *name;
135         int index;
136         struct opae_bridge *br;
137         struct opae_manager *mgr;
138         struct opae_accelerator_ops *ops;
139         void *data;
140 };
141
142 struct opae_acc_info {
143         unsigned int num_regions;
144         unsigned int num_irqs;
145 };
146
147 struct opae_acc_region_info {
148         u32 flags;
149 #define ACC_REGION_READ         (1 << 0)
150 #define ACC_REGION_WRITE        (1 << 1)
151 #define ACC_REGION_MMIO         (1 << 2)
152         u32 index;
153         u64 phys_addr;
154         u64 len;
155         u8 *addr;
156 };
157
158 struct opae_accelerator_ops {
159         int (*read)(struct opae_accelerator *acc, unsigned int region_idx,
160                     u64 offset, unsigned int byte, void *data);
161         int (*write)(struct opae_accelerator *acc, unsigned int region_idx,
162                      u64 offset, unsigned int byte, void *data);
163         int (*get_info)(struct opae_accelerator *acc,
164                         struct opae_acc_info *info);
165         int (*get_region_info)(struct opae_accelerator *acc,
166                                struct opae_acc_region_info *info);
167         int (*set_irq)(struct opae_accelerator *acc,
168                        u32 start, u32 count, s32 evtfds[]);
169         int (*get_uuid)(struct opae_accelerator *acc,
170                         struct uuid *uuid);
171 };
172
173 /* OPAE accelerator APIs */
174 struct opae_accelerator *
175 opae_accelerator_alloc(const char *name, struct opae_accelerator_ops *ops,
176                        void *data);
177 #define opae_accelerator_free(acc) opae_free(acc)
178 int opae_acc_get_info(struct opae_accelerator *acc, struct opae_acc_info *info);
179 int opae_acc_get_region_info(struct opae_accelerator *acc,
180                              struct opae_acc_region_info *info);
181 int opae_acc_set_irq(struct opae_accelerator *acc,
182                      u32 start, u32 count, s32 evtfds[]);
183 int opae_acc_get_uuid(struct opae_accelerator *acc,
184                       struct uuid *uuid);
185
186 static inline struct opae_bridge *
187 opae_acc_get_br(struct opae_accelerator *acc)
188 {
189         return acc ? acc->br : NULL;
190 }
191
192 static inline struct opae_manager *
193 opae_acc_get_mgr(struct opae_accelerator *acc)
194 {
195         return acc ? acc->mgr : NULL;
196 }
197
198 int opae_acc_reg_read(struct opae_accelerator *acc, unsigned int region_idx,
199                       u64 offset, unsigned int byte, void *data);
200 int opae_acc_reg_write(struct opae_accelerator *acc, unsigned int region_idx,
201                        u64 offset, unsigned int byte, void *data);
202
203 #define opae_acc_reg_read64(acc, region, offset, data) \
204         opae_acc_reg_read(acc, region, offset, 8, data)
205 #define opae_acc_reg_write64(acc, region, offset, data) \
206         opae_acc_reg_write(acc, region, offset, 8, data)
207 #define opae_acc_reg_read32(acc, region, offset, data) \
208         opae_acc_reg_read(acc, region, offset, 4, data)
209 #define opae_acc_reg_write32(acc, region, offset, data) \
210         opae_acc_reg_write(acc, region, offset, 4, data)
211 #define opae_acc_reg_read16(acc, region, offset, data) \
212         opae_acc_reg_read(acc, region, offset, 2, data)
213 #define opae_acc_reg_write16(acc, region, offset, data) \
214         opae_acc_reg_write(acc, region, offset, 2, data)
215 #define opae_acc_reg_read8(acc, region, offset, data) \
216         opae_acc_reg_read(acc, region, offset, 1, data)
217 #define opae_acc_reg_write8(acc, region, offset, data) \
218         opae_acc_reg_write(acc, region, offset, 1, data)
219
220 /*for data stream read/write*/
221 int opae_acc_data_read(struct opae_accelerator *acc, unsigned int flags,
222                        u64 offset, unsigned int byte, void *data);
223 int opae_acc_data_write(struct opae_accelerator *acc, unsigned int flags,
224                         u64 offset, unsigned int byte, void *data);
225
226 /* OPAE Adapter Data Structure */
227 struct opae_adapter_data {
228         enum opae_adapter_type type;
229 };
230
231 struct opae_reg_region {
232         u64 phys_addr;
233         u64 len;
234         u8 *addr;
235 };
236
237 struct opae_adapter_data_pci {
238         enum opae_adapter_type type;
239         u16 device_id;
240         u16 vendor_id;
241         struct opae_reg_region region[PCI_MAX_RESOURCE];
242         int vfio_dev_fd;  /* VFIO device file descriptor */
243 };
244
245 /* FIXME: OPAE_FPGA_NET type */
246 struct opae_adapter_data_net {
247         enum opae_adapter_type type;
248 };
249
250 struct opae_adapter_ops {
251         int (*enumerate)(struct opae_adapter *adapter);
252         void (*destroy)(struct opae_adapter *adapter);
253 };
254
255 TAILQ_HEAD(opae_accelerator_list, opae_accelerator);
256
257 #define opae_adapter_for_each_acc(adatper, acc) \
258         TAILQ_FOREACH(acc, &adapter->acc_list, node)
259
260 struct opae_adapter {
261         const char *name;
262         struct opae_manager *mgr;
263         struct opae_accelerator_list acc_list;
264         struct opae_adapter_ops *ops;
265         void *data;
266 };
267
268 /* OPAE Adapter APIs */
269 void *opae_adapter_data_alloc(enum opae_adapter_type type);
270 #define opae_adapter_data_free(data) opae_free(data)
271
272 int opae_adapter_init(struct opae_adapter *adapter,
273                 const char *name, void *data);
274 #define opae_adapter_free(adapter) opae_free(adapter)
275
276 int opae_adapter_enumerate(struct opae_adapter *adapter);
277 void opae_adapter_destroy(struct opae_adapter *adapter);
278 static inline struct opae_manager *
279 opae_adapter_get_mgr(struct opae_adapter *adapter)
280 {
281         return adapter ? adapter->mgr : NULL;
282 }
283
284 struct opae_accelerator *
285 opae_adapter_get_acc(struct opae_adapter *adapter, int acc_id);
286
287 static inline void opae_adapter_add_acc(struct opae_adapter *adapter,
288                                         struct opae_accelerator *acc)
289 {
290         TAILQ_INSERT_TAIL(&adapter->acc_list, acc, node);
291 }
292
293 static inline void opae_adapter_remove_acc(struct opae_adapter *adapter,
294                                            struct opae_accelerator *acc)
295 {
296         TAILQ_REMOVE(&adapter->acc_list, acc, node);
297 }
298
299 /* OPAE vBNG network datastruct */
300 #define OPAE_ETHER_ADDR_LEN 6
301
302 struct opae_ether_addr {
303         unsigned char addr_bytes[OPAE_ETHER_ADDR_LEN];
304 } __attribute__((__packed__));
305
306 /* OPAE vBNG network API*/
307 int opae_manager_read_mac_rom(struct opae_manager *mgr, int port,
308                 struct opae_ether_addr *addr);
309 int opae_manager_write_mac_rom(struct opae_manager *mgr, int port,
310                 struct opae_ether_addr *addr);
311 int opae_manager_get_retimer_info(struct opae_manager *mgr,
312                 struct opae_retimer_info *info);
313 int opae_manager_get_retimer_status(struct opae_manager *mgr,
314                 struct opae_retimer_status *status);
315 int opae_manager_get_eth_group_nums(struct opae_manager *mgr);
316 int opae_manager_get_eth_group_info(struct opae_manager *mgr,
317                 u8 group_id, struct opae_eth_group_info *info);
318 int opae_manager_eth_group_write_reg(struct opae_manager *mgr, u8 group_id,
319                 u8 type, u8 index, u16 addr, u32 data);
320 int opae_manager_eth_group_read_reg(struct opae_manager *mgr, u8 group_id,
321                 u8 type, u8 index, u16 addr, u32 *data);
322 #endif /* _OPAE_HW_API_H_*/