xref: /dpdk/drivers/net/hinic/base/hinic_pmd_mgmt.h (revision cb99500de915040339f294b6ad2fc8edb4085b19)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Huawei Technologies Co., Ltd
3  */
4 
5 #ifndef _HINIC_PMD_MGMT_H_
6 #define _HINIC_PMD_MGMT_H_
7 
8 #include "hinic_pmd_api_cmd.h"
9 #include "hinic_pmd_eqs.h"
10 
11 #define HINIC_MSG_HEADER_MSG_LEN_SHIFT				0
12 #define HINIC_MSG_HEADER_MODULE_SHIFT				11
13 #define HINIC_MSG_HEADER_SEG_LEN_SHIFT				16
14 #define HINIC_MSG_HEADER_NO_ACK_SHIFT				22
15 #define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_SHIFT			23
16 #define HINIC_MSG_HEADER_SEQID_SHIFT				24
17 #define HINIC_MSG_HEADER_LAST_SHIFT				30
18 #define HINIC_MSG_HEADER_DIRECTION_SHIFT			31
19 #define HINIC_MSG_HEADER_CMD_SHIFT				32
20 #define HINIC_MSG_HEADER_PCI_INTF_IDX_SHIFT			48
21 #define HINIC_MSG_HEADER_P2P_IDX_SHIFT				50
22 #define HINIC_MSG_HEADER_MSG_ID_SHIFT				54
23 
24 #define HINIC_MSG_HEADER_MSG_LEN_MASK				0x7FF
25 #define HINIC_MSG_HEADER_MODULE_MASK				0x1F
26 #define HINIC_MSG_HEADER_SEG_LEN_MASK				0x3F
27 #define HINIC_MSG_HEADER_NO_ACK_MASK				0x1
28 #define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_MASK			0x1
29 #define HINIC_MSG_HEADER_SEQID_MASK				0x3F
30 #define HINIC_MSG_HEADER_LAST_MASK				0x1
31 #define HINIC_MSG_HEADER_DIRECTION_MASK				0x1
32 #define HINIC_MSG_HEADER_CMD_MASK				0xFF
33 #define HINIC_MSG_HEADER_PCI_INTF_IDX_MASK			0x3
34 #define HINIC_MSG_HEADER_P2P_IDX_MASK				0xF
35 #define HINIC_MSG_HEADER_MSG_ID_MASK				0x3FF
36 
37 #define HINIC_DEV_BUSY_ACTIVE_FW				0xFE
38 
39 #define HINIC_MSG_HEADER_GET(val, member)			\
40 		(((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \
41 		HINIC_MSG_HEADER_##member##_MASK)
42 
43 #define HINIC_MSG_HEADER_SET(val, member)			\
44 		((u64)((val) & HINIC_MSG_HEADER_##member##_MASK) << \
45 		HINIC_MSG_HEADER_##member##_SHIFT)
46 
47 #define HINIC_MGMT_RSP_AEQN		(1)
48 
49 enum hinic_msg_direction_type {
50 	HINIC_MSG_DIRECT_SEND	= 0,
51 	HINIC_MSG_RESPONSE	= 1
52 };
53 enum hinic_msg_segment_type {
54 	NOT_LAST_SEGMENT = 0,
55 	LAST_SEGMENT	= 1,
56 };
57 
58 enum hinic_msg_ack_type {
59 	HINIC_MSG_ACK = 0,
60 	HINIC_MSG_NO_ACK = 1,
61 };
62 
63 struct hinic_recv_msg {
64 	void			*msg;
65 	void			*buf_out;
66 
67 	u16			msg_len;
68 	enum hinic_mod_type	mod;
69 	u8			cmd;
70 	u16			msg_id;
71 	int			async_mgmt_to_pf;
72 	u8			seq_id;
73 };
74 
75 #define HINIC_COMM_SELF_CMD_MAX 8
76 
77 enum comm_pf_to_mgmt_event_state {
78 	SEND_EVENT_START = 0,
79 	SEND_EVENT_TIMEOUT,
80 	SEND_EVENT_END,
81 };
82 
83 struct hinic_msg_pf_to_mgmt {
84 	struct hinic_hwdev		*hwdev;
85 
86 	/* mutex for sync message */
87 	pthread_mutex_t			sync_msg_mutex;
88 
89 	void				*async_msg_buf;
90 	void				*sync_msg_buf;
91 
92 	struct hinic_recv_msg		recv_msg_from_mgmt;
93 	struct hinic_recv_msg		recv_resp_msg_from_mgmt;
94 
95 	u16				async_msg_id;
96 	u16				sync_msg_id;
97 
98 	struct hinic_api_cmd_chain	*cmd_chain[HINIC_API_CMD_MAX];
99 
100 	struct hinic_eq *rx_aeq;
101 };
102 
103 int hinic_msg_to_mgmt_no_ack(void *hwdev, enum hinic_mod_type mod, u8 cmd,
104 			     void *buf_in, u16 in_size);
105 
106 int hinic_comm_pf_to_mgmt_init(struct hinic_hwdev *hwdev);
107 
108 void hinic_comm_pf_to_mgmt_free(struct hinic_hwdev *hwdev);
109 
110 int hinic_aeq_poll_msg(struct hinic_eq *eq, u32 timeout, void *param);
111 
112 int hinic_msg_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd,
113 			   void *buf_in, u16 in_size,
114 			   void *buf_out, u16 *out_size, u32 timeout);
115 
116 void hinic_dev_handle_aeq_event(struct hinic_hwdev *hwdev, void *param);
117 
118 #endif /* _HINIC_PMD_MGMT_H_ */
119