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"
15 #ifndef PCI_MAX_RESOURCE
16 #define PCI_MAX_RESOURCE 6
21 enum opae_adapter_type {
26 /* OPAE Manager Data Structure */
27 struct opae_manager_ops;
30 * opae_manager has pointer to its parent adapter, as it could be able to manage
31 * all components on this FPGA device (adapter). If not the case, don't set this
32 * adapter, which limit opae_manager ops to manager itself.
36 struct opae_adapter *adapter;
37 struct opae_manager_ops *ops;
41 /* FIXME: add more management ops, e.g power/thermal and etc */
42 struct opae_manager_ops {
43 int (*flash)(struct opae_manager *mgr, int id, void *buffer,
44 u32 size, u64 *status);
47 /* OPAE Manager APIs */
49 opae_manager_alloc(const char *name, struct opae_manager_ops *ops, void *data);
50 #define opae_manager_free(mgr) opae_free(mgr)
51 int opae_manager_flash(struct opae_manager *mgr, int acc_id, void *buf,
52 u32 size, u64 *status);
54 /* OPAE Bridge Data Structure */
55 struct opae_bridge_ops;
58 * opae_bridge only has pointer to its downstream accelerator.
63 struct opae_accelerator *acc;
64 struct opae_bridge_ops *ops;
68 struct opae_bridge_ops {
69 int (*reset)(struct opae_bridge *br);
72 /* OPAE Bridge APIs */
74 opae_bridge_alloc(const char *name, struct opae_bridge_ops *ops, void *data);
75 int opae_bridge_reset(struct opae_bridge *br);
76 #define opae_bridge_free(br) opae_free(br)
78 /* OPAE Acceleraotr Data Structure */
79 struct opae_accelerator_ops;
82 * opae_accelerator has pointer to its upstream bridge(port).
83 * In some cases, if we allow same user to do PR on its own accelerator, then
84 * set the manager pointer during the enumeration. But in other cases, the PR
85 * functions only could be done via manager in another module / thread / service
86 * / application for better protection.
88 struct opae_accelerator {
89 TAILQ_ENTRY(opae_accelerator) node;
92 struct opae_bridge *br;
93 struct opae_manager *mgr;
94 struct opae_accelerator_ops *ops;
98 struct opae_acc_info {
99 unsigned int num_regions;
100 unsigned int num_irqs;
103 struct opae_acc_region_info {
105 #define ACC_REGION_READ (1 << 0)
106 #define ACC_REGION_WRITE (1 << 1)
107 #define ACC_REGION_MMIO (1 << 2)
114 struct opae_accelerator_ops {
115 int (*read)(struct opae_accelerator *acc, unsigned int region_idx,
116 u64 offset, unsigned int byte, void *data);
117 int (*write)(struct opae_accelerator *acc, unsigned int region_idx,
118 u64 offset, unsigned int byte, void *data);
119 int (*get_info)(struct opae_accelerator *acc,
120 struct opae_acc_info *info);
121 int (*get_region_info)(struct opae_accelerator *acc,
122 struct opae_acc_region_info *info);
123 int (*set_irq)(struct opae_accelerator *acc,
124 u32 start, u32 count, s32 evtfds[]);
125 int (*get_uuid)(struct opae_accelerator *acc,
129 /* OPAE accelerator APIs */
130 struct opae_accelerator *
131 opae_accelerator_alloc(const char *name, struct opae_accelerator_ops *ops,
133 #define opae_accelerator_free(acc) opae_free(acc)
134 int opae_acc_get_info(struct opae_accelerator *acc, struct opae_acc_info *info);
135 int opae_acc_get_region_info(struct opae_accelerator *acc,
136 struct opae_acc_region_info *info);
137 int opae_acc_set_irq(struct opae_accelerator *acc,
138 u32 start, u32 count, s32 evtfds[]);
139 int opae_acc_get_uuid(struct opae_accelerator *acc,
142 static inline struct opae_bridge *
143 opae_acc_get_br(struct opae_accelerator *acc)
145 return acc ? acc->br : NULL;
148 static inline struct opae_manager *
149 opae_acc_get_mgr(struct opae_accelerator *acc)
151 return acc ? acc->mgr : NULL;
154 int opae_acc_reg_read(struct opae_accelerator *acc, unsigned int region_idx,
155 u64 offset, unsigned int byte, void *data);
156 int opae_acc_reg_write(struct opae_accelerator *acc, unsigned int region_idx,
157 u64 offset, unsigned int byte, void *data);
159 #define opae_acc_reg_read64(acc, region, offset, data) \
160 opae_acc_reg_read(acc, region, offset, 8, data)
161 #define opae_acc_reg_write64(acc, region, offset, data) \
162 opae_acc_reg_write(acc, region, offset, 8, data)
163 #define opae_acc_reg_read32(acc, region, offset, data) \
164 opae_acc_reg_read(acc, region, offset, 4, data)
165 #define opae_acc_reg_write32(acc, region, offset, data) \
166 opae_acc_reg_write(acc, region, offset, 4, data)
167 #define opae_acc_reg_read16(acc, region, offset, data) \
168 opae_acc_reg_read(acc, region, offset, 2, data)
169 #define opae_acc_reg_write16(acc, region, offset, data) \
170 opae_acc_reg_write(acc, region, offset, 2, data)
171 #define opae_acc_reg_read8(acc, region, offset, data) \
172 opae_acc_reg_read(acc, region, offset, 1, data)
173 #define opae_acc_reg_write8(acc, region, offset, data) \
174 opae_acc_reg_write(acc, region, offset, 1, data)
176 /*for data stream read/write*/
177 int opae_acc_data_read(struct opae_accelerator *acc, unsigned int flags,
178 u64 offset, unsigned int byte, void *data);
179 int opae_acc_data_write(struct opae_accelerator *acc, unsigned int flags,
180 u64 offset, unsigned int byte, void *data);
182 /* OPAE Adapter Data Structure */
183 struct opae_adapter_data {
184 enum opae_adapter_type type;
187 struct opae_reg_region {
193 struct opae_adapter_data_pci {
194 enum opae_adapter_type type;
197 struct opae_reg_region region[PCI_MAX_RESOURCE];
198 int vfio_dev_fd; /* VFIO device file descriptor */
201 /* FIXME: OPAE_FPGA_NET type */
202 struct opae_adapter_data_net {
203 enum opae_adapter_type type;
206 struct opae_adapter_ops {
207 int (*enumerate)(struct opae_adapter *adapter);
208 void (*destroy)(struct opae_adapter *adapter);
211 TAILQ_HEAD(opae_accelerator_list, opae_accelerator);
213 #define opae_adapter_for_each_acc(adatper, acc) \
214 TAILQ_FOREACH(acc, &adapter->acc_list, node)
216 struct opae_adapter {
218 struct opae_manager *mgr;
219 struct opae_accelerator_list acc_list;
220 struct opae_adapter_ops *ops;
224 /* OPAE Adapter APIs */
225 void *opae_adapter_data_alloc(enum opae_adapter_type type);
226 #define opae_adapter_data_free(data) opae_free(data)
228 int opae_adapter_init(struct opae_adapter *adapter,
229 const char *name, void *data);
230 #define opae_adapter_free(adapter) opae_free(adapter)
232 int opae_adapter_enumerate(struct opae_adapter *adapter);
233 void opae_adapter_destroy(struct opae_adapter *adapter);
234 static inline struct opae_manager *
235 opae_adapter_get_mgr(struct opae_adapter *adapter)
237 return adapter ? adapter->mgr : NULL;
240 struct opae_accelerator *
241 opae_adapter_get_acc(struct opae_adapter *adapter, int acc_id);
243 static inline void opae_adapter_add_acc(struct opae_adapter *adapter,
244 struct opae_accelerator *acc)
246 TAILQ_INSERT_TAIL(&adapter->acc_list, acc, node);
249 static inline void opae_adapter_remove_acc(struct opae_adapter *adapter,
250 struct opae_accelerator *acc)
252 TAILQ_REMOVE(&adapter->acc_list, acc, node);
254 #endif /* _OPAE_HW_API_H_*/