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 struct opae_adapter
*opae_adapter_alloc(const char *name
, void *data
);
229 #define opae_adapter_free(adapter) opae_free(adapter)
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
)
236 return adapter
? adapter
->mgr
: NULL
;
239 struct opae_accelerator
*
240 opae_adapter_get_acc(struct opae_adapter
*adapter
, int acc_id
);
242 static inline void opae_adapter_add_acc(struct opae_adapter
*adapter
,
243 struct opae_accelerator
*acc
)
245 TAILQ_INSERT_TAIL(&adapter
->acc_list
, acc
, node
);
248 static inline void opae_adapter_remove_acc(struct opae_adapter
*adapter
,
249 struct opae_accelerator
*acc
)
251 TAILQ_REMOVE(&adapter
->acc_list
, acc
, node
);
253 #endif /* _OPAE_HW_API_H_*/