net/hinic: add TCAM filter switch for flow director
[dpdk.git] / drivers / net / hinic / base / hinic_pmd_mbox.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Huawei Technologies Co., Ltd
3  */
4
5 #ifndef _HINIC_PMD_MBOX_H_
6 #define _HINIC_PMD_MBOX_H_
7
8 #define HINIC_MBOX_RECV_AEQN            0
9 #define HINIC_MBOX_RSP_AEQN             2
10
11 #define HINIC_MBOX_PF_SEND_ERR          0x1
12 #define HINIC_MBOX_PF_BUSY_ACTIVE_FW    0x2
13 #define HINIC_MBOX_VF_CMD_ERROR         0x3
14
15 /* PFs do not support enable SR-IOV cap when PFs use PMD, VFs just receive
16  * mailbox message from PFs. The max number of PFs is 16, so the max number
17  * of mailbox buffer for functions is also 16.
18  */
19 #define HINIC_MAX_FUNCTIONS             16
20 #define HINIC_MAX_PF_FUNCS              16
21
22 #define HINIC_MGMT_CMD_UNSUPPORTED      0xFF
23
24 #define HINIC_SEQ_ID_MAX_VAL            42
25 #define HINIC_MSG_SEG_LEN               48
26
27 enum hinic_mbox_ack_type {
28         MBOX_ACK,
29         MBOX_NO_ACK,
30 };
31
32 struct mbox_msg_info {
33         u8 msg_id;
34         u8 status; /*can only use 6 bit*/
35 };
36
37 struct hinic_recv_mbox {
38         void *mbox;
39         u8 cmd;
40         enum hinic_mod_type mod;
41         u16 mbox_len;
42         void *buf_out;
43         enum hinic_mbox_ack_type ack_type;
44         struct mbox_msg_info msg_info;
45         u8 sed_id;
46 };
47
48 struct hinic_send_mbox {
49         u8 *data;
50         volatile u64 *wb_status;
51         void *wb_vaddr;
52         dma_addr_t wb_paddr;
53 };
54
55 enum mbox_event_state {
56         EVENT_START = 0,
57         EVENT_TIMEOUT,
58         EVENT_END,
59 };
60
61 struct hinic_mbox_func_to_func {
62         struct hinic_hwdev *hwdev;
63
64         pthread_mutex_t     mbox_send_mutex;
65         pthread_mutex_t     msg_send_mutex;
66
67         struct hinic_send_mbox send_mbox;
68
69         struct hinic_recv_mbox mbox_resp[HINIC_MAX_FUNCTIONS];
70         struct hinic_recv_mbox mbox_send[HINIC_MAX_FUNCTIONS];
71
72         struct hinic_eq *rsp_aeq;
73         struct hinic_eq *recv_aeq;
74
75         u8 send_msg_id;
76         enum mbox_event_state event_flag;
77         spinlock_t mbox_lock; /* lock for mbox event flag */
78 };
79
80 /*
81  * mbox function prototypes
82  */
83 int hinic_comm_func_to_func_init(struct hinic_hwdev *hwdev);
84 void hinic_comm_func_to_func_free(struct hinic_hwdev *hwdev);
85 int hinic_mbox_func_aeqe_handler(void *handle, u8 *header,
86                                         u8 size, void *param);
87 int hinic_mbox_to_pf(struct hinic_hwdev *hwdev, enum hinic_mod_type mod, u8 cmd,
88                         void *buf_in, u16 in_size,
89                         void *buf_out, u16 *out_size, u32 timeout);
90 int hinic_mbox_to_pf_no_ack(struct hinic_hwdev *hwdev, enum hinic_mod_type mod,
91                                 u8 cmd, void *buf_in, u16 in_size);
92
93 #endif /* _HINIC_PMD_MBOX_H_ */