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