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