numam-dpdk/drivers/net/hinic/base/hinic_pmd_mbox.h
Xiaoyun Wang ce07a121c7 net/hinic/base: add mbox command channel for SR-IOV
Add mbox command channel for SR-IOV, which is used to
communicate between VF and VF, VF and PF. This patch
introduces data structures, initialization, interfaces
and commands of mbox channel.

Signed-off-by: Xiaoyun Wang <cloud.wangxiaoyun@huawei.com>
2019-10-23 16:43:08 +02:00

94 lines
2.2 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2017 Huawei Technologies Co., Ltd
*/
#ifndef _HINIC_PMD_MBOX_H_
#define _HINIC_PMD_MBOX_H_
#define HINIC_MBOX_RECV_AEQN 0
#define HINIC_MBOX_RSP_AEQN 2
#define HINIC_MBOX_PF_SEND_ERR 0x1
#define HINIC_MBOX_PF_BUSY_ACTIVE_FW 0x2
#define HINIC_MBOX_VF_CMD_ERROR 0x3
/* PFs do not support enable SR-IOV cap when PFs use PMD, VFs just receive
* mailbox message from PFs. The max number of PFs is 16, so the max number
* of mailbox buffer for functions is also 16.
*/
#define HINIC_MAX_FUNCTIONS 16
#define HINIC_MAX_PF_FUNCS 16
#define HINIC_MGMT_CMD_UNSUPPORTED 0xFF
#define HINIC_SEQ_ID_MAX_VAL 42
#define HINIC_MSG_SEG_LEN 48
enum hinic_mbox_ack_type {
MBOX_ACK,
MBOX_NO_ACK,
};
struct mbox_msg_info {
u8 msg_id;
u8 status; /*can only use 6 bit*/
};
struct hinic_recv_mbox {
void *mbox;
u8 cmd;
enum hinic_mod_type mod;
u16 mbox_len;
void *buf_out;
enum hinic_mbox_ack_type ack_type;
struct mbox_msg_info msg_info;
u8 sed_id;
};
struct hinic_send_mbox {
u8 *data;
volatile u64 *wb_status;
void *wb_vaddr;
dma_addr_t wb_paddr;
};
enum mbox_event_state {
EVENT_START = 0,
EVENT_TIMEOUT,
EVENT_END,
};
struct hinic_mbox_func_to_func {
struct hinic_hwdev *hwdev;
pthread_mutex_t mbox_send_mutex;
pthread_mutex_t msg_send_mutex;
struct hinic_send_mbox send_mbox;
struct hinic_recv_mbox mbox_resp[HINIC_MAX_FUNCTIONS];
struct hinic_recv_mbox mbox_send[HINIC_MAX_FUNCTIONS];
struct hinic_eq *rsp_aeq;
struct hinic_eq *recv_aeq;
u8 send_msg_id;
enum mbox_event_state event_flag;
spinlock_t mbox_lock; /* lock for mbox event flag */
};
/*
* mbox function prototypes
*/
int hinic_comm_func_to_func_init(struct hinic_hwdev *hwdev);
void hinic_comm_func_to_func_free(struct hinic_hwdev *hwdev);
int hinic_mbox_func_aeqe_handler(void *handle, u8 *header,
u8 size, void *param);
int hinic_mbox_to_pf(struct hinic_hwdev *hwdev, enum hinic_mod_type mod, u8 cmd,
void *buf_in, u16 in_size,
void *buf_out, u16 *out_size, u32 timeout);
int hinic_mbox_to_pf_no_ack(struct hinic_hwdev *hwdev, enum hinic_mod_type mod,
u8 cmd, void *buf_in, u16 in_size);
#endif /* _HINIC_PMD_MBOX_H_ */