xref: /dpdk/drivers/net/hns3/hns3_mbx.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
1463e7489SWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause
253e6f86cSMin Hu (Connor)  * Copyright(c) 2018-2021 HiSilicon Limited.
3463e7489SWei Hu (Xavier)  */
4463e7489SWei Hu (Xavier) 
52ad146efSChengwen Feng #ifndef HNS3_MBX_H
62ad146efSChengwen Feng #define HNS3_MBX_H
7463e7489SWei Hu (Xavier) 
81c757dd5SChengwen Feng #include <stdint.h>
91c757dd5SChengwen Feng 
101c757dd5SChengwen Feng #include <rte_spinlock.h>
111c757dd5SChengwen Feng 
12463e7489SWei Hu (Xavier) enum HNS3_MBX_OPCODE {
13463e7489SWei Hu (Xavier) 	HNS3_MBX_RESET = 0x01,          /* (VF -> PF) assert reset */
14463e7489SWei Hu (Xavier) 	HNS3_MBX_ASSERTING_RESET,       /* (PF -> VF) PF is asserting reset */
15463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_UNICAST,           /* (VF -> PF) set UC addr */
16463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_MULTICAST,         /* (VF -> PF) set MC addr */
17463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_VLAN,              /* (VF -> PF) set VLAN */
18463e7489SWei Hu (Xavier) 	HNS3_MBX_MAP_RING_TO_VECTOR,    /* (VF -> PF) map ring-to-vector */
19463e7489SWei Hu (Xavier) 	HNS3_MBX_UNMAP_RING_TO_VECTOR,  /* (VF -> PF) unamp ring-to-vector */
20463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_PROMISC_MODE,      /* (VF -> PF) set promiscuous mode */
21463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_MACVLAN,           /* (VF -> PF) set unicast filter */
22463e7489SWei Hu (Xavier) 	HNS3_MBX_API_NEGOTIATE,         /* (VF -> PF) negotiate API version */
23463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_QINFO,             /* (VF -> PF) get queue config */
24463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_QDEPTH,            /* (VF -> PF) get queue depth */
252735b355SChengchang Tang 	HNS3_MBX_GET_BASIC_INFO,        /* (VF -> PF) get basic info */
26463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_RETA,              /* (VF -> PF) get RETA */
27463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_RSS_KEY,           /* (VF -> PF) get RSS key */
28463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_MAC_ADDR,          /* (VF -> PF) get MAC addr */
297be78d02SJosh Soref 	HNS3_MBX_PF_VF_RESP,            /* (PF -> VF) generate response to VF */
30463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_BDNUM,             /* (VF -> PF) get BD num */
31463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_BUFSIZE,           /* (VF -> PF) get buffer size */
32463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_STREAMID,          /* (VF -> PF) get stream id */
33463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_AESTART,           /* (VF -> PF) start ae */
34463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_TSOSTATS,          /* (VF -> PF) get tso stats */
35463e7489SWei Hu (Xavier) 	HNS3_MBX_LINK_STAT_CHANGE,      /* (PF -> VF) link status has changed */
36463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_BASE_CONFIG,       /* (VF -> PF) get config */
37463e7489SWei Hu (Xavier) 	HNS3_MBX_BIND_FUNC_QUEUE,       /* (VF -> PF) bind function and queue */
38463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_LINK_STATUS,       /* (VF -> PF) get link status */
39463e7489SWei Hu (Xavier) 	HNS3_MBX_QUEUE_RESET,           /* (VF -> PF) reset queue */
40463e7489SWei Hu (Xavier) 	HNS3_MBX_KEEP_ALIVE,            /* (VF -> PF) send keep alive cmd */
41463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_ALIVE,             /* (VF -> PF) set alive state */
42463e7489SWei Hu (Xavier) 	HNS3_MBX_SET_MTU,               /* (VF -> PF) set mtu */
43463e7489SWei Hu (Xavier) 	HNS3_MBX_GET_QID_IN_PF,         /* (VF -> PF) get queue id in pf */
449e4dc675SWei Hu (Xavier) 
45b4e4d7acSChengchang Tang 	HNS3_MBX_PUSH_VLAN_INFO = 34,   /* (PF -> VF) push port base vlan */
46b4e4d7acSChengchang Tang 
4740486d38SChengchang Tang 	HNS3_MBX_PUSH_PROMISC_INFO = 36, /* (PF -> VF) push vf promisc info */
4840486d38SChengchang Tang 
499e4dc675SWei Hu (Xavier) 	HNS3_MBX_HANDLE_VF_TBL = 38,    /* (VF -> PF) store/clear hw cfg tbl */
50c05e0c5bSWei Hu (Xavier) 	HNS3_MBX_GET_RING_VECTOR_MAP,   /* (VF -> PF) get ring-to-vector map */
51109e4dd1SHongbo Zheng 	HNS3_MBX_PUSH_LINK_STATUS = 201, /* (IMP -> PF) get port link status */
52463e7489SWei Hu (Xavier) };
53463e7489SWei Hu (Xavier) 
542735b355SChengchang Tang struct hns3_basic_info {
552735b355SChengchang Tang 	uint8_t hw_tc_map;
562735b355SChengchang Tang 	uint8_t rsv;
572735b355SChengchang Tang 	uint16_t pf_vf_if_version;
582735b355SChengchang Tang 	/* capabilities of VF dependent on PF */
592735b355SChengchang Tang 	uint32_t caps;
602735b355SChengchang Tang };
612735b355SChengchang Tang 
62463e7489SWei Hu (Xavier) /* below are per-VF mac-vlan subcodes */
63463e7489SWei Hu (Xavier) enum hns3_mbx_mac_vlan_subcode {
64463e7489SWei Hu (Xavier) 	HNS3_MBX_MAC_VLAN_UC_MODIFY = 0,        /* modify UC mac addr */
65463e7489SWei Hu (Xavier) 	HNS3_MBX_MAC_VLAN_UC_ADD,               /* add a new UC mac addr */
66463e7489SWei Hu (Xavier) 	HNS3_MBX_MAC_VLAN_UC_REMOVE,            /* remove a new UC mac addr */
67463e7489SWei Hu (Xavier) 	HNS3_MBX_MAC_VLAN_MC_MODIFY,            /* modify MC mac addr */
68463e7489SWei Hu (Xavier) 	HNS3_MBX_MAC_VLAN_MC_ADD,               /* add new MC mac addr */
69463e7489SWei Hu (Xavier) 	HNS3_MBX_MAC_VLAN_MC_REMOVE,            /* remove MC mac addr */
70463e7489SWei Hu (Xavier) };
71463e7489SWei Hu (Xavier) 
72463e7489SWei Hu (Xavier) /* below are per-VF vlan cfg subcodes */
73463e7489SWei Hu (Xavier) enum hns3_mbx_vlan_cfg_subcode {
74463e7489SWei Hu (Xavier) 	HNS3_MBX_VLAN_FILTER = 0,               /* set vlan filter */
75463e7489SWei Hu (Xavier) 	HNS3_MBX_VLAN_TX_OFF_CFG,               /* set tx side vlan offload */
76463e7489SWei Hu (Xavier) 	HNS3_MBX_VLAN_RX_OFF_CFG,               /* set rx side vlan offload */
77b4e4d7acSChengchang Tang 	HNS3_MBX_GET_PORT_BASE_VLAN_STATE = 4,  /* get port based vlan state */
780f5bf5a8SChengchang Tang 	HNS3_MBX_ENABLE_VLAN_FILTER,            /* set vlan filter state */
79463e7489SWei Hu (Xavier) };
80463e7489SWei Hu (Xavier) 
819e4dc675SWei Hu (Xavier) enum hns3_mbx_tbl_cfg_subcode {
829e4dc675SWei Hu (Xavier) 	HNS3_MBX_VPORT_LIST_CLEAR = 0,
839e4dc675SWei Hu (Xavier) };
849e4dc675SWei Hu (Xavier) 
85109e4dd1SHongbo Zheng enum hns3_mbx_link_fail_subcode {
86109e4dd1SHongbo Zheng 	HNS3_MBX_LF_NORMAL = 0,
87109e4dd1SHongbo Zheng 	HNS3_MBX_LF_REF_CLOCK_LOST,
88109e4dd1SHongbo Zheng 	HNS3_MBX_LF_XSFP_TX_DISABLE,
89109e4dd1SHongbo Zheng 	HNS3_MBX_LF_XSFP_ABSENT,
90109e4dd1SHongbo Zheng };
91109e4dd1SHongbo Zheng 
92463e7489SWei Hu (Xavier) #define HNS3_MBX_MAX_RESP_DATA_SIZE	8
932fc3e696SChengchang Tang #define HNS3_MBX_DEF_TIME_LIMIT_MS	500
94463e7489SWei Hu (Xavier) 
95463e7489SWei Hu (Xavier) struct hns3_mbx_resp_status {
96463e7489SWei Hu (Xavier) 	rte_spinlock_t lock; /* protects against contending sync cmd resp */
97c8dec72dSChengwen Feng 
98c8dec72dSChengwen Feng 	/* The following fields used in the matching scheme for original */
99463e7489SWei Hu (Xavier) 	uint32_t req_msg_data;
100c8dec72dSChengwen Feng 
101c8dec72dSChengwen Feng 	/* The following fields used in the matching scheme for match_id */
102c8dec72dSChengwen Feng 	uint16_t match_id;
103c8dec72dSChengwen Feng 	bool received_match_resp;
104c8dec72dSChengwen Feng 
105463e7489SWei Hu (Xavier) 	int resp_status;
106463e7489SWei Hu (Xavier) 	uint8_t additional_info[HNS3_MBX_MAX_RESP_DATA_SIZE];
107463e7489SWei Hu (Xavier) };
108463e7489SWei Hu (Xavier) 
109692b35beSDengdui Huang struct hns3_ring_chain_param {
110692b35beSDengdui Huang 	uint8_t ring_type;
111692b35beSDengdui Huang 	uint8_t tqp_index;
112692b35beSDengdui Huang 	uint8_t int_gl_index;
113692b35beSDengdui Huang };
114692b35beSDengdui Huang 
115*e7750639SAndre Muezerie struct __rte_packed_begin hns3_mbx_vlan_filter {
116692b35beSDengdui Huang 	uint8_t is_kill;
117692b35beSDengdui Huang 	uint16_t vlan_id;
118692b35beSDengdui Huang 	uint16_t proto;
119*e7750639SAndre Muezerie } __rte_packed_end;
120692b35beSDengdui Huang 
121*e7750639SAndre Muezerie struct __rte_packed_begin hns3_mbx_link_status {
1224d534598SDengdui Huang 	uint16_t link_status;
1234d534598SDengdui Huang 	uint32_t speed;
1244d534598SDengdui Huang 	uint16_t duplex;
1254d534598SDengdui Huang 	uint8_t flag;
126*e7750639SAndre Muezerie } __rte_packed_end;
1274d534598SDengdui Huang 
128692b35beSDengdui Huang #define HNS3_MBX_MSG_MAX_DATA_SIZE	14
129692b35beSDengdui Huang #define HNS3_MBX_MAX_RING_CHAIN_PARAM_NUM	4
130692b35beSDengdui Huang struct hns3_vf_to_pf_msg {
131692b35beSDengdui Huang 	uint8_t code;
132692b35beSDengdui Huang 	union {
133692b35beSDengdui Huang 		struct {
134692b35beSDengdui Huang 			uint8_t subcode;
135692b35beSDengdui Huang 			uint8_t data[HNS3_MBX_MSG_MAX_DATA_SIZE];
136692b35beSDengdui Huang 		};
137692b35beSDengdui Huang 		struct {
138692b35beSDengdui Huang 			uint8_t en_bc;
139692b35beSDengdui Huang 			uint8_t en_uc;
140692b35beSDengdui Huang 			uint8_t en_mc;
141692b35beSDengdui Huang 			uint8_t en_limit_promisc;
142692b35beSDengdui Huang 		};
143692b35beSDengdui Huang 		struct {
144692b35beSDengdui Huang 			uint8_t vector_id;
145692b35beSDengdui Huang 			uint8_t ring_num;
146692b35beSDengdui Huang 			struct hns3_ring_chain_param
147692b35beSDengdui Huang 				ring_param[HNS3_MBX_MAX_RING_CHAIN_PARAM_NUM];
148692b35beSDengdui Huang 		};
149692b35beSDengdui Huang 		struct {
150692b35beSDengdui Huang 			uint8_t link_status;
151692b35beSDengdui Huang 			uint8_t link_fail_code;
152692b35beSDengdui Huang 		};
153692b35beSDengdui Huang 	};
154692b35beSDengdui Huang };
155692b35beSDengdui Huang 
1564d534598SDengdui Huang struct hns3_pf_to_vf_msg {
1574d534598SDengdui Huang 	uint16_t code;
1584d534598SDengdui Huang 	union {
1594d534598SDengdui Huang 		struct {
1604d534598SDengdui Huang 			uint16_t vf_mbx_msg_code;
1614d534598SDengdui Huang 			uint16_t vf_mbx_msg_subcode;
1624d534598SDengdui Huang 			uint16_t resp_status;
1634d534598SDengdui Huang 			uint8_t resp_data[HNS3_MBX_MAX_RESP_DATA_SIZE];
1644d534598SDengdui Huang 		};
1654d534598SDengdui Huang 		uint16_t promisc_en;
1664d534598SDengdui Huang 		uint16_t reset_level;
1674d534598SDengdui Huang 		uint16_t pvid_state;
1684d534598SDengdui Huang 		uint8_t msg_data[HNS3_MBX_MSG_MAX_DATA_SIZE];
1694d534598SDengdui Huang 	};
1704d534598SDengdui Huang };
1714d534598SDengdui Huang 
172463e7489SWei Hu (Xavier) struct errno_respcode_map {
173463e7489SWei Hu (Xavier) 	uint16_t resp_code;
174463e7489SWei Hu (Xavier) 	int err_no;
175463e7489SWei Hu (Xavier) };
176463e7489SWei Hu (Xavier) 
177463e7489SWei Hu (Xavier) #define HNS3_MBX_NEED_RESP_BIT                BIT(0)
178463e7489SWei Hu (Xavier) 
179463e7489SWei Hu (Xavier) struct hns3_mbx_vf_to_pf_cmd {
180463e7489SWei Hu (Xavier) 	uint8_t rsv;
181463e7489SWei Hu (Xavier) 	uint8_t mbx_src_vfid;                   /* Auto filled by IMP */
182463e7489SWei Hu (Xavier) 	uint8_t mbx_need_resp;
183463e7489SWei Hu (Xavier) 	uint8_t rsv1;
184463e7489SWei Hu (Xavier) 	uint8_t msg_len;
185c8dec72dSChengwen Feng 	uint8_t rsv2;
186c8dec72dSChengwen Feng 	uint16_t match_id;
187692b35beSDengdui Huang 	struct hns3_vf_to_pf_msg msg;
188463e7489SWei Hu (Xavier) };
189463e7489SWei Hu (Xavier) 
190463e7489SWei Hu (Xavier) struct hns3_mbx_pf_to_vf_cmd {
191463e7489SWei Hu (Xavier) 	uint8_t dest_vfid;
192463e7489SWei Hu (Xavier) 	uint8_t rsv[3];
193463e7489SWei Hu (Xavier) 	uint8_t msg_len;
194c8dec72dSChengwen Feng 	uint8_t rsv1;
195c8dec72dSChengwen Feng 	uint16_t match_id;
1964d534598SDengdui Huang 	struct hns3_pf_to_vf_msg msg;
197463e7489SWei Hu (Xavier) };
198463e7489SWei Hu (Xavier) 
199463e7489SWei Hu (Xavier) struct hns3_pf_rst_done_cmd {
200463e7489SWei Hu (Xavier) 	uint8_t pf_rst_done;
201463e7489SWei Hu (Xavier) 	uint8_t rsv[23];
202463e7489SWei Hu (Xavier) };
203463e7489SWei Hu (Xavier) 
204463e7489SWei Hu (Xavier) #define HNS3_PF_RESET_DONE_BIT		BIT(0)
205463e7489SWei Hu (Xavier) 
206463e7489SWei Hu (Xavier) #define hns3_mbx_ring_ptr_move_crq(crq) \
207463e7489SWei Hu (Xavier) 	((crq)->next_to_use = ((crq)->next_to_use + 1) % (crq)->desc_num)
208463e7489SWei Hu (Xavier) 
209463e7489SWei Hu (Xavier) struct hns3_hw;
210277d522aSDengdui Huang void hns3pf_handle_mbx_msg(struct hns3_hw *hw);
211277d522aSDengdui Huang void hns3vf_handle_mbx_msg(struct hns3_hw *hw);
212c9bd98d8SDengdui Huang void hns3vf_mbx_setup(struct hns3_vf_to_pf_msg *req,
213c9bd98d8SDengdui Huang 		      uint8_t code, uint8_t subcode);
214c9bd98d8SDengdui Huang int hns3vf_mbx_send(struct hns3_hw *hw,
215c9bd98d8SDengdui Huang 		    struct hns3_vf_to_pf_msg *req_msg, bool need_resp,
216463e7489SWei Hu (Xavier) 		    uint8_t *resp_data, uint16_t resp_len);
2172ad146efSChengwen Feng #endif /* HNS3_MBX_H */
218