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