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