xref: /dpdk/drivers/net/hns3/hns3_dcb.h (revision 2ad146efb1f4f7881ce90299fd62fb004d2cdaf0)
162e3ccc2SWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause
253e6f86cSMin Hu (Connor)  * Copyright(c) 2018-2021 HiSilicon Limited.
362e3ccc2SWei Hu (Xavier)  */
462e3ccc2SWei Hu (Xavier) 
5*2ad146efSChengwen Feng #ifndef HNS3_DCB_H
6*2ad146efSChengwen Feng #define HNS3_DCB_H
762e3ccc2SWei Hu (Xavier) 
8445b0c8eSLijun Ou #include <stdint.h>
9445b0c8eSLijun Ou 
101c757dd5SChengwen Feng #include <ethdev_driver.h>
111c757dd5SChengwen Feng #include <rte_ethdev.h>
121c757dd5SChengwen Feng 
13445b0c8eSLijun Ou #include "hns3_cmd.h"
141c757dd5SChengwen Feng #include "hns3_ethdev.h"
15445b0c8eSLijun Ou 
169c740336SWei Hu (Xavier) #define HNS3_ETHER_MAX_RATE		100000
179c740336SWei Hu (Xavier) 
1862e3ccc2SWei Hu (Xavier) /* MAC Pause */
1962e3ccc2SWei Hu (Xavier) #define HNS3_TX_MAC_PAUSE_EN_MSK	BIT(0)
2062e3ccc2SWei Hu (Xavier) #define HNS3_RX_MAC_PAUSE_EN_MSK	BIT(1)
2162e3ccc2SWei Hu (Xavier) 
2262e3ccc2SWei Hu (Xavier) #define HNS3_DEFAULT_PAUSE_TRANS_GAP	0x18
2362e3ccc2SWei Hu (Xavier) #define HNS3_DEFAULT_PAUSE_TRANS_TIME	0xFFFF
2462e3ccc2SWei Hu (Xavier) 
2562e3ccc2SWei Hu (Xavier) /* SP or DWRR */
2662e3ccc2SWei Hu (Xavier) #define HNS3_DCB_TX_SCHD_DWRR_MSK	BIT(0)
275d78d42bSHuisong Li #define HNS3_DCB_TX_SCHD_SP_MSK		0xFE
2862e3ccc2SWei Hu (Xavier) 
2962e3ccc2SWei Hu (Xavier) enum hns3_shap_bucket {
3062e3ccc2SWei Hu (Xavier) 	HNS3_DCB_SHAP_C_BUCKET = 0,
3162e3ccc2SWei Hu (Xavier) 	HNS3_DCB_SHAP_P_BUCKET,
3262e3ccc2SWei Hu (Xavier) };
3362e3ccc2SWei Hu (Xavier) 
3462e3ccc2SWei Hu (Xavier) struct hns3_priority_weight_cmd {
3562e3ccc2SWei Hu (Xavier) 	uint8_t pri_id;
3662e3ccc2SWei Hu (Xavier) 	uint8_t dwrr;
37e2a8cae0SHuisong Li 	uint8_t rsvd[22];
3862e3ccc2SWei Hu (Xavier) };
3962e3ccc2SWei Hu (Xavier) 
4062e3ccc2SWei Hu (Xavier) struct hns3_qs_weight_cmd {
4162e3ccc2SWei Hu (Xavier) 	uint16_t qs_id;
4262e3ccc2SWei Hu (Xavier) 	uint8_t dwrr;
43e2a8cae0SHuisong Li 	uint8_t rsvd[21];
4462e3ccc2SWei Hu (Xavier) };
4562e3ccc2SWei Hu (Xavier) 
4662e3ccc2SWei Hu (Xavier) struct hns3_pg_weight_cmd {
4762e3ccc2SWei Hu (Xavier) 	uint8_t pg_id;
4862e3ccc2SWei Hu (Xavier) 	uint8_t dwrr;
49e2a8cae0SHuisong Li 	uint8_t rsvd[22];
5062e3ccc2SWei Hu (Xavier) };
5162e3ccc2SWei Hu (Xavier) 
5262e3ccc2SWei Hu (Xavier) struct hns3_ets_tc_weight_cmd {
5362e3ccc2SWei Hu (Xavier) 	uint8_t tc_weight[HNS3_MAX_TC_NUM];
5462e3ccc2SWei Hu (Xavier) 	uint8_t weight_offset;
5562e3ccc2SWei Hu (Xavier) 	uint8_t rsvd[15];
5662e3ccc2SWei Hu (Xavier) };
5762e3ccc2SWei Hu (Xavier) 
5862e3ccc2SWei Hu (Xavier) struct hns3_qs_to_pri_link_cmd {
5962e3ccc2SWei Hu (Xavier) 	uint16_t qs_id;
6062e3ccc2SWei Hu (Xavier) 	uint16_t rsvd;
6162e3ccc2SWei Hu (Xavier) 	uint8_t priority;
6262e3ccc2SWei Hu (Xavier) #define HNS3_DCB_QS_PRI_LINK_VLD_MSK	BIT(0)
6376d79456SWei Hu (Xavier) #define HNS3_DCB_QS_ID_L_MSK		GENMASK(9, 0)
6476d79456SWei Hu (Xavier) #define HNS3_DCB_QS_ID_L_S		0
6576d79456SWei Hu (Xavier) #define HNS3_DCB_QS_ID_H_MSK		GENMASK(14, 10)
6676d79456SWei Hu (Xavier) #define HNS3_DCB_QS_ID_H_S		10
6776d79456SWei Hu (Xavier) #define HNS3_DCB_QS_ID_H_EXT_S		11
6876d79456SWei Hu (Xavier) #define HNS3_DCB_QS_ID_H_EXT_MSK	GENMASK(15, 11)
6962e3ccc2SWei Hu (Xavier) 	uint8_t link_vld;
70e2a8cae0SHuisong Li 	uint8_t rsvd1[18];
7162e3ccc2SWei Hu (Xavier) };
7262e3ccc2SWei Hu (Xavier) 
7362e3ccc2SWei Hu (Xavier) struct hns3_nq_to_qs_link_cmd {
7462e3ccc2SWei Hu (Xavier) 	uint16_t nq_id;
7562e3ccc2SWei Hu (Xavier) 	uint16_t rsvd;
7662e3ccc2SWei Hu (Xavier) #define HNS3_DCB_Q_QS_LINK_VLD_MSK	BIT(10)
7762e3ccc2SWei Hu (Xavier) 	uint16_t qset_id;
78e2a8cae0SHuisong Li 	uint8_t rsvd1[18];
7962e3ccc2SWei Hu (Xavier) };
8062e3ccc2SWei Hu (Xavier) 
8162e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_IR_B_MSK  GENMASK(7, 0)
8262e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_IR_B_LSH	0
8362e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_IR_U_MSK  GENMASK(11, 8)
8462e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_IR_U_LSH	8
8562e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_IR_S_MSK  GENMASK(15, 12)
8662e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_IR_S_LSH	12
8762e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_BS_B_MSK  GENMASK(20, 16)
8862e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_BS_B_LSH	16
8962e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_BS_S_MSK  GENMASK(25, 21)
9062e3ccc2SWei Hu (Xavier) #define HNS3_DCB_SHAP_BS_S_LSH	21
9162e3ccc2SWei Hu (Xavier) 
925d78d42bSHuisong Li /*
935d78d42bSHuisong Li  * For more flexible selection of shapping algorithm in different network
945d78d42bSHuisong Li  * engine, the algorithm calculating shapping parameter is moved to firmware to
955d78d42bSHuisong Li  * execute. Bit HNS3_TM_RATE_VLD_B of flag field in hns3_pri_shapping_cmd,
965d78d42bSHuisong Li  * hns3_pg_shapping_cmd or hns3_port_shapping_cmd is set to 1 to require
975d78d42bSHuisong Li  * firmware to recalculate shapping parameters. However, whether the parameters
985d78d42bSHuisong Li  * are recalculated depends on the firmware version. If firmware doesn't support
995d78d42bSHuisong Li  * the calculation of shapping parameters, such as on network engine with
1005d78d42bSHuisong Li  * revision id 0x21, the value driver calculated will be used to configure to
1015d78d42bSHuisong Li  * hardware. On the contrary, firmware ignores configuration of driver
1025d78d42bSHuisong Li  * and recalculates the parameter.
1035d78d42bSHuisong Li  */
1045d78d42bSHuisong Li #define HNS3_TM_RATE_VLD_B	0
1055d78d42bSHuisong Li 
10662e3ccc2SWei Hu (Xavier) struct hns3_pri_shapping_cmd {
10762e3ccc2SWei Hu (Xavier) 	uint8_t pri_id;
10862e3ccc2SWei Hu (Xavier) 	uint8_t rsvd[3];
10962e3ccc2SWei Hu (Xavier) 	uint32_t pri_shapping_para;
1105d78d42bSHuisong Li 	uint8_t flag;
1115d78d42bSHuisong Li 	uint8_t rsvd1[3];
1125d78d42bSHuisong Li 	uint32_t pri_rate;  /* Unit Mbps */
1135d78d42bSHuisong Li 	uint8_t rsvd2[8];
11462e3ccc2SWei Hu (Xavier) };
11562e3ccc2SWei Hu (Xavier) 
11662e3ccc2SWei Hu (Xavier) struct hns3_pg_shapping_cmd {
11762e3ccc2SWei Hu (Xavier) 	uint8_t pg_id;
11862e3ccc2SWei Hu (Xavier) 	uint8_t rsvd[3];
11962e3ccc2SWei Hu (Xavier) 	uint32_t pg_shapping_para;
1205d78d42bSHuisong Li 	uint8_t flag;
1215d78d42bSHuisong Li 	uint8_t rsvd1[3];
1225d78d42bSHuisong Li 	uint32_t pg_rate; /* Unit Mbps */
1235d78d42bSHuisong Li 	uint8_t rsvd2[8];
1245d78d42bSHuisong Li };
1255d78d42bSHuisong Li 
1265d78d42bSHuisong Li struct hns3_port_shapping_cmd {
1275d78d42bSHuisong Li 	uint32_t port_shapping_para;
1285d78d42bSHuisong Li 	uint8_t flag;
1295d78d42bSHuisong Li 	uint8_t rsvd[3];
1305d78d42bSHuisong Li 	uint32_t port_rate;   /* Unit Mbps */
1315d78d42bSHuisong Li 	uint8_t rsvd1[12];
13262e3ccc2SWei Hu (Xavier) };
13362e3ccc2SWei Hu (Xavier) 
13462e3ccc2SWei Hu (Xavier) #define HNS3_BP_GRP_NUM			32
13562e3ccc2SWei Hu (Xavier) #define HNS3_BP_SUB_GRP_ID_S		0
13662e3ccc2SWei Hu (Xavier) #define HNS3_BP_SUB_GRP_ID_M		GENMASK(4, 0)
13762e3ccc2SWei Hu (Xavier) #define HNS3_BP_GRP_ID_S		5
13862e3ccc2SWei Hu (Xavier) #define HNS3_BP_GRP_ID_M		GENMASK(9, 5)
13976d79456SWei Hu (Xavier) 
14062e3ccc2SWei Hu (Xavier) struct hns3_bp_to_qs_map_cmd {
14162e3ccc2SWei Hu (Xavier) 	uint8_t tc_id;
14262e3ccc2SWei Hu (Xavier) 	uint8_t rsvd[2];
14362e3ccc2SWei Hu (Xavier) 	uint8_t qs_group_id;
14462e3ccc2SWei Hu (Xavier) 	uint32_t qs_bit_map;
145e2a8cae0SHuisong Li 	uint32_t rsvd1[4];
14662e3ccc2SWei Hu (Xavier) };
14762e3ccc2SWei Hu (Xavier) 
14862e3ccc2SWei Hu (Xavier) struct hns3_pfc_en_cmd {
14962e3ccc2SWei Hu (Xavier) 	uint8_t tx_rx_en_bitmap;
15062e3ccc2SWei Hu (Xavier) 	uint8_t pri_en_bitmap;
151e2a8cae0SHuisong Li 	uint8_t rsvd[22];
15262e3ccc2SWei Hu (Xavier) };
15362e3ccc2SWei Hu (Xavier) 
15462e3ccc2SWei Hu (Xavier) struct hns3_cfg_pause_param_cmd {
15562e3ccc2SWei Hu (Xavier) 	uint8_t mac_addr[RTE_ETHER_ADDR_LEN];
15662e3ccc2SWei Hu (Xavier) 	uint8_t pause_trans_gap;
15762e3ccc2SWei Hu (Xavier) 	uint8_t rsvd;
15862e3ccc2SWei Hu (Xavier) 	uint16_t pause_trans_time;
15962e3ccc2SWei Hu (Xavier) 	uint8_t rsvd1[6];
16062e3ccc2SWei Hu (Xavier) 	/* extra mac address to do double check for pause frame */
16162e3ccc2SWei Hu (Xavier) 	uint8_t mac_addr_extra[RTE_ETHER_ADDR_LEN];
16262e3ccc2SWei Hu (Xavier) 	uint16_t rsvd2;
16362e3ccc2SWei Hu (Xavier) };
16462e3ccc2SWei Hu (Xavier) 
16562e3ccc2SWei Hu (Xavier) struct hns3_pg_to_pri_link_cmd {
16662e3ccc2SWei Hu (Xavier) 	uint8_t pg_id;
16762e3ccc2SWei Hu (Xavier) 	uint8_t rsvd1[3];
16862e3ccc2SWei Hu (Xavier) 	uint8_t pri_bit_map;
169e2a8cae0SHuisong Li 	uint8_t rsvd2[19];
17062e3ccc2SWei Hu (Xavier) };
17162e3ccc2SWei Hu (Xavier) 
17262e3ccc2SWei Hu (Xavier) enum hns3_shaper_level {
17362e3ccc2SWei Hu (Xavier) 	HNS3_SHAPER_LVL_PRI	= 0,
17462e3ccc2SWei Hu (Xavier) 	HNS3_SHAPER_LVL_PG	= 1,
17562e3ccc2SWei Hu (Xavier) 	HNS3_SHAPER_LVL_PORT	= 2,
17662e3ccc2SWei Hu (Xavier) 	HNS3_SHAPER_LVL_QSET	= 3,
17762e3ccc2SWei Hu (Xavier) 	HNS3_SHAPER_LVL_CNT	= 4,
17862e3ccc2SWei Hu (Xavier) 	HNS3_SHAPER_LVL_VF	= 0,
17962e3ccc2SWei Hu (Xavier) 	HNS3_SHAPER_LVL_PF	= 1,
18062e3ccc2SWei Hu (Xavier) };
18162e3ccc2SWei Hu (Xavier) 
18262e3ccc2SWei Hu (Xavier) struct hns3_shaper_parameter {
18362e3ccc2SWei Hu (Xavier) 	uint32_t ir_b;  /* IR_B parameter of IR shaper */
18462e3ccc2SWei Hu (Xavier) 	uint32_t ir_u;  /* IR_U parameter of IR shaper */
18562e3ccc2SWei Hu (Xavier) 	uint32_t ir_s;  /* IR_S parameter of IR shaper */
18662e3ccc2SWei Hu (Xavier) };
18762e3ccc2SWei Hu (Xavier) 
18862e3ccc2SWei Hu (Xavier) #define hns3_dcb_set_field(dest, string, val) \
18962e3ccc2SWei Hu (Xavier) 			   hns3_set_field((dest), \
19062e3ccc2SWei Hu (Xavier) 			   (HNS3_DCB_SHAP_##string##_MSK), \
19162e3ccc2SWei Hu (Xavier) 			   (HNS3_DCB_SHAP_##string##_LSH), val)
19262e3ccc2SWei Hu (Xavier) #define hns3_dcb_get_field(src, string) \
19362e3ccc2SWei Hu (Xavier) 			hns3_get_field((src), (HNS3_DCB_SHAP_##string##_MSK), \
19462e3ccc2SWei Hu (Xavier) 				       (HNS3_DCB_SHAP_##string##_LSH))
19562e3ccc2SWei Hu (Xavier) 
19662e3ccc2SWei Hu (Xavier) int hns3_pause_addr_cfg(struct hns3_hw *hw, const uint8_t *mac_addr);
19762e3ccc2SWei Hu (Xavier) 
19862e3ccc2SWei Hu (Xavier) int hns3_dcb_configure(struct hns3_adapter *hns);
19962e3ccc2SWei Hu (Xavier) 
20062e3ccc2SWei Hu (Xavier) int hns3_dcb_init(struct hns3_hw *hw);
20162e3ccc2SWei Hu (Xavier) 
20262e3ccc2SWei Hu (Xavier) int hns3_dcb_init_hw(struct hns3_hw *hw);
20362e3ccc2SWei Hu (Xavier) 
20462e3ccc2SWei Hu (Xavier) int hns3_dcb_info_init(struct hns3_hw *hw);
20562e3ccc2SWei Hu (Xavier) 
20676d79456SWei Hu (Xavier) int hns3_fc_enable(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf);
20762e3ccc2SWei Hu (Xavier) 
20876d79456SWei Hu (Xavier) int hns3_dcb_pfc_enable(struct rte_eth_dev *dev,
20976d79456SWei Hu (Xavier) 			struct rte_eth_pfc_conf *pfc_conf);
21062e3ccc2SWei Hu (Xavier) 
21176d79456SWei Hu (Xavier) int hns3_queue_to_tc_mapping(struct hns3_hw *hw, uint16_t nb_rx_q,
21276d79456SWei Hu (Xavier) 			     uint16_t nb_tx_q);
21362e3ccc2SWei Hu (Xavier) 
2140b92fa1eSHuisong Li int hns3_update_queue_map_configure(struct hns3_adapter *hns);
215d75e0b4fSHuisong Li int hns3_port_shaper_update(struct hns3_hw *hw, uint32_t speed);
216c09c7847SChengwen Feng uint8_t hns3_txq_mapped_tc_get(struct hns3_hw *hw, uint16_t txq_no);
21762e3ccc2SWei Hu (Xavier) 
218*2ad146efSChengwen Feng #endif /* HNS3_DCB_H */
219