New upstream version 18.08
[deb_dpdk.git] / 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_*/