1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2018 Intel Corporation
5 #ifndef _OPAE_HW_API_H_
6 #define _OPAE_HW_API_H_
11 #include <sys/queue.h>
13 #include "opae_osdep.h"
14 #include "opae_intel_max10.h"
15 #include "opae_eth_group.h"
16 #include "ifpga_defines.h"
18 #ifndef PCI_MAX_RESOURCE
19 #define PCI_MAX_RESOURCE 6
24 enum opae_adapter_type {
29 /* OPAE Manager Data Structure */
30 struct opae_manager_ops;
31 struct opae_manager_networking_ops;
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.
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;
47 /* FIXME: add more management ops, e.g power/thermal and etc */
48 struct 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,
56 int (*get_board_info)(struct opae_manager *mgr,
57 struct opae_board_info **info);
60 /* networking management ops in FME */
61 struct opae_manager_networking_ops {
62 int (*read_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
64 int (*write_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
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);
79 #define opae_mgr_for_each_sensor(mgr, sensor) \
80 TAILQ_FOREACH(sensor, mgr->sensor_list, node)
82 /* OPAE Manager APIs */
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(struct opae_manager *mgr,
93 struct opae_sensor_info *opae_mgr_get_sensor_by_id(struct opae_manager *mgr,
95 int opae_mgr_get_sensor_value_by_name(struct opae_manager *mgr,
96 const char *name, unsigned int *value);
97 int opae_mgr_get_sensor_value_by_id(struct opae_manager *mgr,
98 unsigned int id, unsigned int *value);
99 int opae_mgr_get_sensor_value(struct opae_manager *mgr,
100 struct opae_sensor_info *sensor,
101 unsigned int *value);
103 /* OPAE Bridge Data Structure */
104 struct opae_bridge_ops;
107 * opae_bridge only has pointer to its downstream accelerator.
112 struct opae_accelerator *acc;
113 struct opae_bridge_ops *ops;
117 struct opae_bridge_ops {
118 int (*reset)(struct opae_bridge *br);
121 /* OPAE Bridge APIs */
123 opae_bridge_alloc(const char *name, struct opae_bridge_ops *ops, void *data);
124 int opae_bridge_reset(struct opae_bridge *br);
125 #define opae_bridge_free(br) opae_free(br)
127 /* OPAE Acceleraotr Data Structure */
128 struct opae_accelerator_ops;
131 * opae_accelerator has pointer to its upstream bridge(port).
132 * In some cases, if we allow same user to do PR on its own accelerator, then
133 * set the manager pointer during the enumeration. But in other cases, the PR
134 * functions only could be done via manager in another module / thread / service
135 * / application for better protection.
137 struct opae_accelerator {
138 TAILQ_ENTRY(opae_accelerator) node;
141 struct opae_bridge *br;
142 struct opae_manager *mgr;
143 struct opae_accelerator_ops *ops;
147 struct opae_acc_info {
148 unsigned int num_regions;
149 unsigned int num_irqs;
152 struct opae_acc_region_info {
154 #define ACC_REGION_READ (1 << 0)
155 #define ACC_REGION_WRITE (1 << 1)
156 #define ACC_REGION_MMIO (1 << 2)
163 struct 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,
178 /* OPAE accelerator APIs */
179 struct opae_accelerator *
180 opae_accelerator_alloc(const char *name, struct opae_accelerator_ops *ops,
182 #define opae_accelerator_free(acc) opae_free(acc)
183 int opae_acc_get_info(struct opae_accelerator *acc, struct opae_acc_info *info);
184 int opae_acc_get_region_info(struct opae_accelerator *acc,
185 struct opae_acc_region_info *info);
186 int opae_acc_set_irq(struct opae_accelerator *acc,
187 u32 start, u32 count, s32 evtfds[]);
188 int opae_acc_get_uuid(struct opae_accelerator *acc,
191 static inline struct opae_bridge *
192 opae_acc_get_br(struct opae_accelerator *acc)
194 return acc ? acc->br : NULL;
197 static inline struct opae_manager *
198 opae_acc_get_mgr(struct opae_accelerator *acc)
200 return acc ? acc->mgr : NULL;
203 int opae_acc_reg_read(struct opae_accelerator *acc, unsigned int region_idx,
204 u64 offset, unsigned int byte, void *data);
205 int opae_acc_reg_write(struct opae_accelerator *acc, unsigned int region_idx,
206 u64 offset, unsigned int byte, void *data);
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)
225 /*for data stream read/write*/
226 int opae_acc_data_read(struct opae_accelerator *acc, unsigned int flags,
227 u64 offset, unsigned int byte, void *data);
228 int opae_acc_data_write(struct opae_accelerator *acc, unsigned int flags,
229 u64 offset, unsigned int byte, void *data);
231 /* OPAE Adapter Data Structure */
232 struct opae_adapter_data {
233 enum opae_adapter_type type;
236 struct opae_reg_region {
242 struct opae_adapter_data_pci {
243 enum opae_adapter_type type;
246 u16 bus; /*Device bus for PCI */
247 u16 devid; /* Device ID */
248 u16 function; /* Device function */
249 struct opae_reg_region region[PCI_MAX_RESOURCE];
250 int vfio_dev_fd; /* VFIO device file descriptor */
253 /* FIXME: OPAE_FPGA_NET type */
254 struct opae_adapter_data_net {
255 enum opae_adapter_type type;
258 struct opae_adapter_ops {
259 int (*enumerate)(struct opae_adapter *adapter);
260 void (*destroy)(struct opae_adapter *adapter);
263 TAILQ_HEAD(opae_accelerator_list, opae_accelerator);
265 #define opae_adapter_for_each_acc(adatper, acc) \
266 TAILQ_FOREACH(acc, &adapter->acc_list, node)
268 struct opae_adapter {
270 struct opae_manager *mgr;
271 struct opae_accelerator_list acc_list;
272 struct opae_adapter_ops *ops;
276 /* OPAE Adapter APIs */
277 void *opae_adapter_data_alloc(enum opae_adapter_type type);
278 #define opae_adapter_data_free(data) opae_free(data)
280 int opae_adapter_init(struct opae_adapter *adapter,
281 const char *name, void *data);
282 #define opae_adapter_free(adapter) opae_free(adapter)
284 int opae_adapter_enumerate(struct opae_adapter *adapter);
285 void opae_adapter_destroy(struct opae_adapter *adapter);
286 static inline struct opae_manager *
287 opae_adapter_get_mgr(struct opae_adapter *adapter)
289 return adapter ? adapter->mgr : NULL;
292 struct opae_accelerator *
293 opae_adapter_get_acc(struct opae_adapter *adapter, int acc_id);
295 static inline void opae_adapter_add_acc(struct opae_adapter *adapter,
296 struct opae_accelerator *acc)
298 TAILQ_INSERT_TAIL(&adapter->acc_list, acc, node);
301 static inline void opae_adapter_remove_acc(struct opae_adapter *adapter,
302 struct opae_accelerator *acc)
304 TAILQ_REMOVE(&adapter->acc_list, acc, node);
307 /* OPAE vBNG network datastruct */
308 #define OPAE_ETHER_ADDR_LEN 6
310 struct opae_ether_addr {
311 unsigned char addr_bytes[OPAE_ETHER_ADDR_LEN];
314 /* OPAE vBNG network API*/
315 int opae_manager_read_mac_rom(struct opae_manager *mgr, int port,
316 struct opae_ether_addr *addr);
317 int opae_manager_write_mac_rom(struct opae_manager *mgr, int port,
318 struct opae_ether_addr *addr);
319 int opae_manager_get_retimer_info(struct opae_manager *mgr,
320 struct opae_retimer_info *info);
321 int opae_manager_get_retimer_status(struct opae_manager *mgr,
322 struct opae_retimer_status *status);
323 int opae_manager_get_eth_group_nums(struct opae_manager *mgr);
324 int opae_manager_get_eth_group_info(struct opae_manager *mgr,
325 u8 group_id, struct opae_eth_group_info *info);
326 int opae_manager_eth_group_write_reg(struct opae_manager *mgr, u8 group_id,
327 u8 type, u8 index, u16 addr, u32 data);
328 int opae_manager_eth_group_read_reg(struct opae_manager *mgr, u8 group_id,
329 u8 type, u8 index, u16 addr, u32 *data);
330 int opae_mgr_get_board_info(struct opae_manager *mgr,
331 struct opae_board_info **info);
332 #endif /* _OPAE_HW_API_H_*/