826da37333de6e870ea3054d71f7afef16d3257b
[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 #include "opae_intel_max10.h"
15
16 #ifndef PCI_MAX_RESOURCE
17 #define PCI_MAX_RESOURCE 6
18 #endif
19
20 struct opae_adapter;
21
22 enum opae_adapter_type {
23         OPAE_FPGA_PCI,
24         OPAE_FPGA_NET,
25 };
26
27 /* OPAE Manager Data Structure */
28 struct opae_manager_ops;
29 struct opae_manager_networking_ops;
30
31 /*
32  * opae_manager has pointer to its parent adapter, as it could be able to manage
33  * all components on this FPGA device (adapter). If not the case, don't set this
34  * adapter, which limit opae_manager ops to manager itself.
35  */
36 struct opae_manager {
37         const char *name;
38         struct opae_adapter *adapter;
39         struct opae_manager_ops *ops;
40         struct opae_manager_networking_ops *network_ops;
41         void *data;
42 };
43
44 /* FIXME: add more management ops, e.g power/thermal and etc */
45 struct opae_manager_ops {
46         int (*flash)(struct opae_manager *mgr, int id, void *buffer,
47                      u32 size, u64 *status);
48 };
49
50 /* networking management ops in FME */
51 struct opae_manager_networking_ops {
52         int (*read_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
53                         int size);
54         int (*write_mac_rom)(struct opae_manager *mgr, int offset, void *buf,
55                         int size);
56 };
57
58 /* OPAE Manager APIs */
59 struct opae_manager *
60 opae_manager_alloc(const char *name, struct opae_manager_ops *ops,
61                 struct opae_manager_networking_ops *network_ops, void *data);
62 #define opae_manager_free(mgr) opae_free(mgr)
63 int opae_manager_flash(struct opae_manager *mgr, int acc_id, void *buf,
64                        u32 size, u64 *status);
65
66 /* OPAE Bridge Data Structure */
67 struct opae_bridge_ops;
68
69 /*
70  * opae_bridge only has pointer to its downstream accelerator.
71  */
72 struct opae_bridge {
73         const char *name;
74         int id;
75         struct opae_accelerator *acc;
76         struct opae_bridge_ops *ops;
77         void *data;
78 };
79
80 struct opae_bridge_ops {
81         int (*reset)(struct opae_bridge *br);
82 };
83
84 /* OPAE Bridge APIs */
85 struct opae_bridge *
86 opae_bridge_alloc(const char *name, struct opae_bridge_ops *ops, void *data);
87 int opae_bridge_reset(struct opae_bridge *br);
88 #define opae_bridge_free(br) opae_free(br)
89
90 /* OPAE Acceleraotr Data Structure */
91 struct opae_accelerator_ops;
92
93 /*
94  * opae_accelerator has pointer to its upstream bridge(port).
95  * In some cases, if we allow same user to do PR on its own accelerator, then
96  * set the manager pointer during the enumeration. But in other cases, the PR
97  * functions only could be done via manager in another module / thread / service
98  * / application for better protection.
99  */
100 struct opae_accelerator {
101         TAILQ_ENTRY(opae_accelerator) node;
102         const char *name;
103         int index;
104         struct opae_bridge *br;
105         struct opae_manager *mgr;
106         struct opae_accelerator_ops *ops;
107         void *data;
108 };
109
110 struct opae_acc_info {
111         unsigned int num_regions;
112         unsigned int num_irqs;
113 };
114
115 struct opae_acc_region_info {
116         u32 flags;
117 #define ACC_REGION_READ         (1 << 0)
118 #define ACC_REGION_WRITE        (1 << 1)
119 #define ACC_REGION_MMIO         (1 << 2)
120         u32 index;
121         u64 phys_addr;
122         u64 len;
123         u8 *addr;
124 };
125
126 struct opae_accelerator_ops {
127         int (*read)(struct opae_accelerator *acc, unsigned int region_idx,
128                     u64 offset, unsigned int byte, void *data);
129         int (*write)(struct opae_accelerator *acc, unsigned int region_idx,
130                      u64 offset, unsigned int byte, void *data);
131         int (*get_info)(struct opae_accelerator *acc,
132                         struct opae_acc_info *info);
133         int (*get_region_info)(struct opae_accelerator *acc,
134                                struct opae_acc_region_info *info);
135         int (*set_irq)(struct opae_accelerator *acc,
136                        u32 start, u32 count, s32 evtfds[]);
137         int (*get_uuid)(struct opae_accelerator *acc,
138                         struct uuid *uuid);
139 };
140
141 /* OPAE accelerator APIs */
142 struct opae_accelerator *
143 opae_accelerator_alloc(const char *name, struct opae_accelerator_ops *ops,
144                        void *data);
145 #define opae_accelerator_free(acc) opae_free(acc)
146 int opae_acc_get_info(struct opae_accelerator *acc, struct opae_acc_info *info);
147 int opae_acc_get_region_info(struct opae_accelerator *acc,
148                              struct opae_acc_region_info *info);
149 int opae_acc_set_irq(struct opae_accelerator *acc,
150                      u32 start, u32 count, s32 evtfds[]);
151 int opae_acc_get_uuid(struct opae_accelerator *acc,
152                       struct uuid *uuid);
153
154 static inline struct opae_bridge *
155 opae_acc_get_br(struct opae_accelerator *acc)
156 {
157         return acc ? acc->br : NULL;
158 }
159
160 static inline struct opae_manager *
161 opae_acc_get_mgr(struct opae_accelerator *acc)
162 {
163         return acc ? acc->mgr : NULL;
164 }
165
166 int opae_acc_reg_read(struct opae_accelerator *acc, unsigned int region_idx,
167                       u64 offset, unsigned int byte, void *data);
168 int opae_acc_reg_write(struct opae_accelerator *acc, unsigned int region_idx,
169                        u64 offset, unsigned int byte, void *data);
170
171 #define opae_acc_reg_read64(acc, region, offset, data) \
172         opae_acc_reg_read(acc, region, offset, 8, data)
173 #define opae_acc_reg_write64(acc, region, offset, data) \
174         opae_acc_reg_write(acc, region, offset, 8, data)
175 #define opae_acc_reg_read32(acc, region, offset, data) \
176         opae_acc_reg_read(acc, region, offset, 4, data)
177 #define opae_acc_reg_write32(acc, region, offset, data) \
178         opae_acc_reg_write(acc, region, offset, 4, data)
179 #define opae_acc_reg_read16(acc, region, offset, data) \
180         opae_acc_reg_read(acc, region, offset, 2, data)
181 #define opae_acc_reg_write16(acc, region, offset, data) \
182         opae_acc_reg_write(acc, region, offset, 2, data)
183 #define opae_acc_reg_read8(acc, region, offset, data) \
184         opae_acc_reg_read(acc, region, offset, 1, data)
185 #define opae_acc_reg_write8(acc, region, offset, data) \
186         opae_acc_reg_write(acc, region, offset, 1, data)
187
188 /*for data stream read/write*/
189 int opae_acc_data_read(struct opae_accelerator *acc, unsigned int flags,
190                        u64 offset, unsigned int byte, void *data);
191 int opae_acc_data_write(struct opae_accelerator *acc, unsigned int flags,
192                         u64 offset, unsigned int byte, void *data);
193
194 /* OPAE Adapter Data Structure */
195 struct opae_adapter_data {
196         enum opae_adapter_type type;
197 };
198
199 struct opae_reg_region {
200         u64 phys_addr;
201         u64 len;
202         u8 *addr;
203 };
204
205 struct opae_adapter_data_pci {
206         enum opae_adapter_type type;
207         u16 device_id;
208         u16 vendor_id;
209         struct opae_reg_region region[PCI_MAX_RESOURCE];
210         int vfio_dev_fd;  /* VFIO device file descriptor */
211 };
212
213 /* FIXME: OPAE_FPGA_NET type */
214 struct opae_adapter_data_net {
215         enum opae_adapter_type type;
216 };
217
218 struct opae_adapter_ops {
219         int (*enumerate)(struct opae_adapter *adapter);
220         void (*destroy)(struct opae_adapter *adapter);
221 };
222
223 TAILQ_HEAD(opae_accelerator_list, opae_accelerator);
224
225 #define opae_adapter_for_each_acc(adatper, acc) \
226         TAILQ_FOREACH(acc, &adapter->acc_list, node)
227
228 struct opae_adapter {
229         const char *name;
230         struct opae_manager *mgr;
231         struct opae_accelerator_list acc_list;
232         struct opae_adapter_ops *ops;
233         void *data;
234 };
235
236 /* OPAE Adapter APIs */
237 void *opae_adapter_data_alloc(enum opae_adapter_type type);
238 #define opae_adapter_data_free(data) opae_free(data)
239
240 int opae_adapter_init(struct opae_adapter *adapter,
241                 const char *name, void *data);
242 #define opae_adapter_free(adapter) opae_free(adapter)
243
244 int opae_adapter_enumerate(struct opae_adapter *adapter);
245 void opae_adapter_destroy(struct opae_adapter *adapter);
246 static inline struct opae_manager *
247 opae_adapter_get_mgr(struct opae_adapter *adapter)
248 {
249         return adapter ? adapter->mgr : NULL;
250 }
251
252 struct opae_accelerator *
253 opae_adapter_get_acc(struct opae_adapter *adapter, int acc_id);
254
255 static inline void opae_adapter_add_acc(struct opae_adapter *adapter,
256                                         struct opae_accelerator *acc)
257 {
258         TAILQ_INSERT_TAIL(&adapter->acc_list, acc, node);
259 }
260
261 static inline void opae_adapter_remove_acc(struct opae_adapter *adapter,
262                                            struct opae_accelerator *acc)
263 {
264         TAILQ_REMOVE(&adapter->acc_list, acc, node);
265 }
266
267 /* OPAE vBNG network datastruct */
268 #define OPAE_ETHER_ADDR_LEN 6
269
270 struct opae_ether_addr {
271         unsigned char addr_bytes[OPAE_ETHER_ADDR_LEN];
272 } __attribute__((__packed__));
273
274 /* OPAE vBNG network API*/
275 int opae_manager_read_mac_rom(struct opae_manager *mgr, int port,
276                 struct opae_ether_addr *addr);
277 int opae_manager_write_mac_rom(struct opae_manager *mgr, int port,
278                 struct opae_ether_addr *addr);
279 #endif /* _OPAE_HW_API_H_*/