1
2
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
22struct opae_adapter;
23
24enum opae_adapter_type {
25 OPAE_FPGA_PCI,
26 OPAE_FPGA_NET,
27};
28
29
30struct opae_manager_ops;
31struct opae_manager_networking_ops;
32
33
34
35
36
37
38struct 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 struct opae_sensor_list *sensor_list;
44 void *data;
45};
46
47
48struct opae_manager_ops {
49 int (*flash)(struct opae_manager *mgr, int id, const char *buffer,
50 u32 size, u64 *status);
51 int (*get_eth_group_region_info)(struct opae_manager *mgr,
52 struct opae_eth_group_region_info *info);
53 int (*get_sensor_value)(struct opae_manager *mgr,
54 struct opae_sensor_info *sensor,
55 unsigned int *value);
56 int (*get_board_info)(struct opae_manager *mgr,
57 struct opae_board_info **info);
58};
59
60
61struct opae_manager_networking_ops {
62 int (*read_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
63 int size);
64 int (*write_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
65 int size);
66 int (*get_eth_group_nums)(struct opae_manager *mgr);
67 int (*get_eth_group_info)(struct opae_manager *mgr,
68 u8 group_id, struct opae_eth_group_info *info);
69 int (*eth_group_reg_read)(struct opae_manager *mgr, u8 group_id,
70 u8 type, u8 index, u16 addr, u32 *data);
71 int (*eth_group_reg_write)(struct opae_manager *mgr, u8 group_id,
72 u8 type, u8 index, u16 addr, u32 data);
73 int (*get_retimer_info)(struct opae_manager *mgr,
74 struct opae_retimer_info *info);
75 int (*get_retimer_status)(struct opae_manager *mgr,
76 struct opae_retimer_status *status);
77};
78
79#define opae_mgr_for_each_sensor(mgr, sensor) \
80 TAILQ_FOREACH(sensor, mgr->sensor_list, node)
81
82
83struct opae_manager *
84opae_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)
87int opae_manager_flash(struct opae_manager *mgr, int acc_id, const char *buf,
88 u32 size, u64 *status);
89int opae_manager_get_eth_group_region_info(struct opae_manager *mgr,
90 u8 group_id, struct opae_eth_group_region_info *info);
91struct opae_sensor_info *opae_mgr_get_sensor_by_name(struct opae_manager *mgr,
92 const char *name);
93struct opae_sensor_info *opae_mgr_get_sensor_by_id(struct opae_manager *mgr,
94 unsigned int id);
95int opae_mgr_get_sensor_value_by_name(struct opae_manager *mgr,
96 const char *name, unsigned int *value);
97int opae_mgr_get_sensor_value_by_id(struct opae_manager *mgr,
98 unsigned int id, unsigned int *value);
99int opae_mgr_get_sensor_value(struct opae_manager *mgr,
100 struct opae_sensor_info *sensor,
101 unsigned int *value);
102
103
104struct opae_bridge_ops;
105
106
107
108
109struct opae_bridge {
110 const char *name;
111 int id;
112 struct opae_accelerator *acc;
113 struct opae_bridge_ops *ops;
114 void *data;
115};
116
117struct opae_bridge_ops {
118 int (*reset)(struct opae_bridge *br);
119};
120
121
122struct opae_bridge *
123opae_bridge_alloc(const char *name, struct opae_bridge_ops *ops, void *data);
124int opae_bridge_reset(struct opae_bridge *br);
125#define opae_bridge_free(br) opae_free(br)
126
127
128struct opae_accelerator_ops;
129
130
131
132
133
134
135
136
137struct opae_accelerator {
138 TAILQ_ENTRY(opae_accelerator) node;
139 const char *name;
140 int index;
141 struct opae_bridge *br;
142 struct opae_manager *mgr;
143 struct opae_accelerator_ops *ops;
144 void *data;
145};
146
147struct opae_acc_info {
148 unsigned int num_regions;
149 unsigned int num_irqs;
150};
151
152struct opae_acc_region_info {
153 u32 flags;
154#define ACC_REGION_READ (1 << 0)
155#define ACC_REGION_WRITE (1 << 1)
156#define ACC_REGION_MMIO (1 << 2)
157 u32 index;
158 u64 phys_addr;
159 u64 len;
160 u8 *addr;
161};
162
163struct opae_accelerator_ops {
164 int (*read)(struct opae_accelerator *acc, unsigned int region_idx,
165 u64 offset, unsigned int byte, void *data);
166 int (*write)(struct opae_accelerator *acc, unsigned int region_idx,
167 u64 offset, unsigned int byte, void *data);
168 int (*get_info)(struct opae_accelerator *acc,
169 struct opae_acc_info *info);
170 int (*get_region_info)(struct opae_accelerator *acc,
171 struct opae_acc_region_info *info);
172 int (*set_irq)(struct opae_accelerator *acc,
173 u32 start, u32 count, s32 evtfds[]);
174 int (*get_uuid)(struct opae_accelerator *acc,
175 struct uuid *uuid);
176};
177
178
179struct opae_accelerator *
180opae_accelerator_alloc(const char *name, struct opae_accelerator_ops *ops,
181 void *data);
182#define opae_accelerator_free(acc) opae_free(acc)
183int opae_acc_get_info(struct opae_accelerator *acc, struct opae_acc_info *info);
184int opae_acc_get_region_info(struct opae_accelerator *acc,
185 struct opae_acc_region_info *info);
186int opae_acc_set_irq(struct opae_accelerator *acc,
187 u32 start, u32 count, s32 evtfds[]);
188int opae_acc_get_uuid(struct opae_accelerator *acc,
189 struct uuid *uuid);
190
191static inline struct opae_bridge *
192opae_acc_get_br(struct opae_accelerator *acc)
193{
194 return acc ? acc->br : NULL;
195}
196
197static inline struct opae_manager *
198opae_acc_get_mgr(struct opae_accelerator *acc)
199{
200 return acc ? acc->mgr : NULL;
201}
202
203int opae_acc_reg_read(struct opae_accelerator *acc, unsigned int region_idx,
204 u64 offset, unsigned int byte, void *data);
205int opae_acc_reg_write(struct opae_accelerator *acc, unsigned int region_idx,
206 u64 offset, unsigned int byte, void *data);
207
208#define opae_acc_reg_read64(acc, region, offset, data) \
209 opae_acc_reg_read(acc, region, offset, 8, data)
210#define opae_acc_reg_write64(acc, region, offset, data) \
211 opae_acc_reg_write(acc, region, offset, 8, data)
212#define opae_acc_reg_read32(acc, region, offset, data) \
213 opae_acc_reg_read(acc, region, offset, 4, data)
214#define opae_acc_reg_write32(acc, region, offset, data) \
215 opae_acc_reg_write(acc, region, offset, 4, data)
216#define opae_acc_reg_read16(acc, region, offset, data) \
217 opae_acc_reg_read(acc, region, offset, 2, data)
218#define opae_acc_reg_write16(acc, region, offset, data) \
219 opae_acc_reg_write(acc, region, offset, 2, data)
220#define opae_acc_reg_read8(acc, region, offset, data) \
221 opae_acc_reg_read(acc, region, offset, 1, data)
222#define opae_acc_reg_write8(acc, region, offset, data) \
223 opae_acc_reg_write(acc, region, offset, 1, data)
224
225
226int opae_acc_data_read(struct opae_accelerator *acc, unsigned int flags,
227 u64 offset, unsigned int byte, void *data);
228int opae_acc_data_write(struct opae_accelerator *acc, unsigned int flags,
229 u64 offset, unsigned int byte, void *data);
230
231
232struct opae_adapter_data {
233 enum opae_adapter_type type;
234};
235
236struct opae_reg_region {
237 u64 phys_addr;
238 u64 len;
239 u8 *addr;
240};
241
242struct opae_adapter_data_pci {
243 enum opae_adapter_type type;
244 u16 device_id;
245 u16 vendor_id;
246 u16 bus;
247 u16 devid;
248 u16 function;
249 struct opae_reg_region region[PCI_MAX_RESOURCE];
250 int vfio_dev_fd;
251};
252
253
254struct opae_adapter_data_net {
255 enum opae_adapter_type type;
256};
257
258struct opae_adapter_ops {
259 int (*enumerate)(struct opae_adapter *adapter);
260 void (*destroy)(struct opae_adapter *adapter);
261};
262
263TAILQ_HEAD(opae_accelerator_list, opae_accelerator);
264
265#define opae_adapter_for_each_acc(adatper, acc) \
266 TAILQ_FOREACH(acc, &adapter->acc_list, node)
267
268#define SHM_PREFIX "/IFPGA:"
269#define SHM_BLK_SIZE 0x2000
270
271typedef struct {
272 union {
273 u8 byte[SHM_BLK_SIZE];
274 struct {
275 pthread_mutex_t spi_mutex;
276 pthread_mutex_t i2c_mutex;
277 u32 ref_cnt;
278 u32 dtb_size;
279 };
280 };
281 u8 dtb[SHM_BLK_SIZE];
282} opae_share_data;
283
284typedef struct {
285 int id;
286 u32 size;
287 void *ptr;
288} opae_share_memory;
289
290struct opae_adapter {
291 const char *name;
292 struct opae_manager *mgr;
293 struct opae_accelerator_list acc_list;
294 struct opae_adapter_ops *ops;
295 void *data;
296 pthread_mutex_t *lock;
297 opae_share_memory shm;
298};
299
300
301void *opae_adapter_data_alloc(enum opae_adapter_type type);
302#define opae_adapter_data_free(data) opae_free(data)
303
304int opae_adapter_init(struct opae_adapter *adapter,
305 const char *name, void *data);
306#define opae_adapter_free(adapter) opae_free(adapter)
307int opae_adapter_lock(struct opae_adapter *adapter, int timeout);
308int opae_adapter_unlock(struct opae_adapter *adapter);
309int opae_adapter_enumerate(struct opae_adapter *adapter);
310void opae_adapter_destroy(struct opae_adapter *adapter);
311static inline struct opae_manager *
312opae_adapter_get_mgr(struct opae_adapter *adapter)
313{
314 return adapter ? adapter->mgr : NULL;
315}
316
317struct opae_accelerator *
318opae_adapter_get_acc(struct opae_adapter *adapter, int acc_id);
319
320static inline void opae_adapter_add_acc(struct opae_adapter *adapter,
321 struct opae_accelerator *acc)
322{
323 TAILQ_INSERT_TAIL(&adapter->acc_list, acc, node);
324}
325
326static inline void opae_adapter_remove_acc(struct opae_adapter *adapter,
327 struct opae_accelerator *acc)
328{
329 TAILQ_REMOVE(&adapter->acc_list, acc, node);
330}
331
332
333#define OPAE_ETHER_ADDR_LEN 6
334
335struct opae_ether_addr {
336 unsigned char addr_bytes[OPAE_ETHER_ADDR_LEN];
337} __rte_packed;
338
339
340int opae_manager_read_mac_rom(struct opae_manager *mgr, int port,
341 struct opae_ether_addr *addr);
342int opae_manager_write_mac_rom(struct opae_manager *mgr, int port,
343 struct opae_ether_addr *addr);
344int opae_manager_get_retimer_info(struct opae_manager *mgr,
345 struct opae_retimer_info *info);
346int opae_manager_get_retimer_status(struct opae_manager *mgr,
347 struct opae_retimer_status *status);
348int opae_manager_get_eth_group_nums(struct opae_manager *mgr);
349int opae_manager_get_eth_group_info(struct opae_manager *mgr,
350 u8 group_id, struct opae_eth_group_info *info);
351int opae_manager_eth_group_write_reg(struct opae_manager *mgr, u8 group_id,
352 u8 type, u8 index, u16 addr, u32 data);
353int opae_manager_eth_group_read_reg(struct opae_manager *mgr, u8 group_id,
354 u8 type, u8 index, u16 addr, u32 *data);
355int opae_mgr_get_board_info(struct opae_manager *mgr,
356 struct opae_board_info **info);
357#endif
358