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_*/