ce07a121c7
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>
94 lines
2.2 KiB
C
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_ */
|