f-stack/dpdk/drivers/raw/ifpga_rawdev/base/ifpga_hw.h

128 lines
2.6 KiB
C
Raw Normal View History

2019-06-25 11:12:58 +00:00
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2010-2018 Intel Corporation
*/
#ifndef _IFPGA_HW_H_
#define _IFPGA_HW_H_
#include "ifpga_defines.h"
#include "opae_ifpga_hw_api.h"
enum ifpga_feature_state {
IFPGA_FEATURE_UNUSED = 0,
IFPGA_FEATURE_ATTACHED,
};
struct feature_irq_ctx {
int eventfd;
int idx;
};
struct feature {
enum ifpga_feature_state state;
const char *name;
u64 id;
u8 *addr;
uint64_t phys_addr;
u32 size;
int revision;
u64 cap;
int vfio_dev_fd;
struct feature_irq_ctx *ctx;
unsigned int ctx_num;
void *parent; /* to parent hw data structure */
struct feature_ops *ops;/* callback to this private feature */
};
struct feature_ops {
int (*init)(struct feature *feature);
void (*uinit)(struct feature *feature);
int (*get_prop)(struct feature *feature, struct feature_prop *prop);
int (*set_prop)(struct feature *feature, struct feature_prop *prop);
int (*set_irq)(struct feature *feature, void *irq_set);
};
enum ifpga_fme_state {
IFPGA_FME_UNUSED = 0,
IFPGA_FME_IMPLEMENTED,
};
struct ifpga_fme_hw {
enum ifpga_fme_state state;
struct feature sub_feature[FME_FEATURE_ID_MAX];
spinlock_t lock; /* protect hardware access */
void *parent; /* pointer to ifpga_hw */
/* provied by HEADER feature */
u32 port_num;
struct uuid bitstream_id;
u64 bitstream_md;
size_t pr_bandwidth;
u32 socket_id;
u32 fabric_version_id;
u32 cache_size;
u32 capability;
};
enum ifpga_port_state {
IFPGA_PORT_UNUSED = 0,
IFPGA_PORT_ATTACHED,
IFPGA_PORT_DETACHED,
};
struct ifpga_port_hw {
enum ifpga_port_state state;
struct feature sub_feature[PORT_FEATURE_ID_MAX];
spinlock_t lock; /* protect access to hw */
void *parent; /* pointer to ifpga_hw */
int port_id; /* provied by HEADER feature */
struct uuid afu_id; /* provied by User AFU feature */
unsigned int disable_count;
u32 capability;
u32 num_umsgs; /* The number of allocated umsgs */
u32 num_uafu_irqs; /* The number of uafu interrupts */
u8 *stp_addr;
u32 stp_size;
};
#define AFU_MAX_REGION 1
struct ifpga_afu_info {
struct opae_reg_region region[AFU_MAX_REGION];
unsigned int num_regions;
unsigned int num_irqs;
};
struct ifpga_hw {
struct opae_adapter *adapter;
struct opae_adapter_data_pci *pci_data;
struct ifpga_fme_hw fme;
struct ifpga_port_hw port[MAX_FPGA_PORT_NUM];
};
static inline bool is_ifpga_hw_pf(struct ifpga_hw *hw)
{
return hw->fme.state != IFPGA_FME_UNUSED;
}
static inline bool is_valid_port_id(struct ifpga_hw *hw, u32 port_id)
{
if (port_id >= MAX_FPGA_PORT_NUM ||
hw->port[port_id].state != IFPGA_PORT_ATTACHED)
return false;
return true;
}
#endif /* _IFPGA_HW_H_ */