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