]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/dpdk/drivers/raw/ifpga_rawdev/base/opae_hw_api.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / spdk / dpdk / drivers / raw / ifpga_rawdev / 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
15 #ifndef PCI_MAX_RESOURCE
16 #define PCI_MAX_RESOURCE 6
17 #endif
18
19 struct opae_adapter;
20
21 enum opae_adapter_type {
22 OPAE_FPGA_PCI,
23 OPAE_FPGA_NET,
24 };
25
26 /* OPAE Manager Data Structure */
27 struct opae_manager_ops;
28
29 /*
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.
33 */
34 struct opae_manager {
35 const char *name;
36 struct opae_adapter *adapter;
37 struct opae_manager_ops *ops;
38 void *data;
39 };
40
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);
45 };
46
47 /* OPAE Manager APIs */
48 struct opae_manager *
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);
53
54 /* OPAE Bridge Data Structure */
55 struct opae_bridge_ops;
56
57 /*
58 * opae_bridge only has pointer to its downstream accelerator.
59 */
60 struct opae_bridge {
61 const char *name;
62 int id;
63 struct opae_accelerator *acc;
64 struct opae_bridge_ops *ops;
65 void *data;
66 };
67
68 struct opae_bridge_ops {
69 int (*reset)(struct opae_bridge *br);
70 };
71
72 /* OPAE Bridge APIs */
73 struct opae_bridge *
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)
77
78 /* OPAE Acceleraotr Data Structure */
79 struct opae_accelerator_ops;
80
81 /*
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.
87 */
88 struct opae_accelerator {
89 TAILQ_ENTRY(opae_accelerator) node;
90 const char *name;
91 int index;
92 struct opae_bridge *br;
93 struct opae_manager *mgr;
94 struct opae_accelerator_ops *ops;
95 void *data;
96 };
97
98 struct opae_acc_info {
99 unsigned int num_regions;
100 unsigned int num_irqs;
101 };
102
103 struct opae_acc_region_info {
104 u32 flags;
105 #define ACC_REGION_READ (1 << 0)
106 #define ACC_REGION_WRITE (1 << 1)
107 #define ACC_REGION_MMIO (1 << 2)
108 u32 index;
109 u64 phys_addr;
110 u64 len;
111 u8 *addr;
112 };
113
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,
126 struct uuid *uuid);
127 };
128
129 /* OPAE accelerator APIs */
130 struct opae_accelerator *
131 opae_accelerator_alloc(const char *name, struct opae_accelerator_ops *ops,
132 void *data);
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,
140 struct uuid *uuid);
141
142 static inline struct opae_bridge *
143 opae_acc_get_br(struct opae_accelerator *acc)
144 {
145 return acc ? acc->br : NULL;
146 }
147
148 static inline struct opae_manager *
149 opae_acc_get_mgr(struct opae_accelerator *acc)
150 {
151 return acc ? acc->mgr : NULL;
152 }
153
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);
158
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)
175
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);
181
182 /* OPAE Adapter Data Structure */
183 struct opae_adapter_data {
184 enum opae_adapter_type type;
185 };
186
187 struct opae_reg_region {
188 u64 phys_addr;
189 u64 len;
190 u8 *addr;
191 };
192
193 struct opae_adapter_data_pci {
194 enum opae_adapter_type type;
195 u16 device_id;
196 u16 vendor_id;
197 struct opae_reg_region region[PCI_MAX_RESOURCE];
198 int vfio_dev_fd; /* VFIO device file descriptor */
199 };
200
201 /* FIXME: OPAE_FPGA_NET type */
202 struct opae_adapter_data_net {
203 enum opae_adapter_type type;
204 };
205
206 struct opae_adapter_ops {
207 int (*enumerate)(struct opae_adapter *adapter);
208 void (*destroy)(struct opae_adapter *adapter);
209 };
210
211 TAILQ_HEAD(opae_accelerator_list, opae_accelerator);
212
213 #define opae_adapter_for_each_acc(adatper, acc) \
214 TAILQ_FOREACH(acc, &adapter->acc_list, node)
215
216 struct opae_adapter {
217 const char *name;
218 struct opae_manager *mgr;
219 struct opae_accelerator_list acc_list;
220 struct opae_adapter_ops *ops;
221 void *data;
222 };
223
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)
227
228 struct opae_adapter *opae_adapter_alloc(const char *name, void *data);
229 #define opae_adapter_free(adapter) opae_free(adapter)
230
231 int opae_adapter_enumerate(struct opae_adapter *adapter);
232 void opae_adapter_destroy(struct opae_adapter *adapter);
233 static inline struct opae_manager *
234 opae_adapter_get_mgr(struct opae_adapter *adapter)
235 {
236 return adapter ? adapter->mgr : NULL;
237 }
238
239 struct opae_accelerator *
240 opae_adapter_get_acc(struct opae_adapter *adapter, int acc_id);
241
242 static inline void opae_adapter_add_acc(struct opae_adapter *adapter,
243 struct opae_accelerator *acc)
244 {
245 TAILQ_INSERT_TAIL(&adapter->acc_list, acc, node);
246 }
247
248 static inline void opae_adapter_remove_acc(struct opae_adapter *adapter,
249 struct opae_accelerator *acc)
250 {
251 TAILQ_REMOVE(&adapter->acc_list, acc, node);
252 }
253 #endif /* _OPAE_HW_API_H_*/