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