1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2020 Intel Corporation 3 */ 4 5 #ifndef _ICE_DCF_H_ 6 #define _ICE_DCF_H_ 7 8 #include <ethdev_driver.h> 9 #include <rte_tm_driver.h> 10 11 #include <iavf_prototype.h> 12 #include <iavf_adminq_cmd.h> 13 #include <iavf_type.h> 14 15 #include "base/ice_type.h" 16 #include "ice_logs.h" 17 18 struct dcf_virtchnl_cmd { 19 TAILQ_ENTRY(dcf_virtchnl_cmd) next; 20 21 enum virtchnl_ops v_op; 22 enum iavf_status v_ret; 23 24 uint16_t req_msglen; 25 uint8_t *req_msg; 26 27 uint16_t rsp_msglen; 28 uint16_t rsp_buflen; 29 uint8_t *rsp_msgbuf; 30 31 volatile int pending; 32 }; 33 34 struct ice_dcf_tm_shaper_profile { 35 TAILQ_ENTRY(ice_dcf_tm_shaper_profile) node; 36 uint32_t shaper_profile_id; 37 uint32_t reference_count; 38 struct rte_tm_shaper_params profile; 39 }; 40 41 TAILQ_HEAD(ice_dcf_shaper_profile_list, ice_dcf_tm_shaper_profile); 42 43 /* Struct to store Traffic Manager node configuration. */ 44 struct ice_dcf_tm_node { 45 TAILQ_ENTRY(ice_dcf_tm_node) node; 46 uint32_t id; 47 uint32_t tc; 48 uint32_t priority; 49 uint32_t weight; 50 uint32_t reference_count; 51 struct ice_dcf_tm_node *parent; 52 struct ice_dcf_tm_shaper_profile *shaper_profile; 53 struct rte_tm_node_params params; 54 }; 55 56 TAILQ_HEAD(ice_dcf_tm_node_list, ice_dcf_tm_node); 57 58 /* node type of Traffic Manager */ 59 enum ice_dcf_tm_node_type { 60 ICE_DCF_TM_NODE_TYPE_PORT, 61 ICE_DCF_TM_NODE_TYPE_TC, 62 ICE_DCF_TM_NODE_TYPE_VSI, 63 ICE_DCF_TM_NODE_TYPE_MAX, 64 }; 65 66 /* Struct to store all the Traffic Manager configuration. */ 67 struct ice_dcf_tm_conf { 68 struct ice_dcf_shaper_profile_list shaper_profile_list; 69 struct ice_dcf_tm_node *root; /* root node - port */ 70 struct ice_dcf_tm_node_list tc_list; /* node list for all the TCs */ 71 struct ice_dcf_tm_node_list vsi_list; /* node list for all the queues */ 72 uint32_t nb_tc_node; 73 uint32_t nb_vsi_node; 74 bool committed; 75 }; 76 77 struct ice_dcf_hw { 78 struct iavf_hw avf; 79 80 rte_spinlock_t vc_cmd_send_lock; 81 rte_spinlock_t vc_cmd_queue_lock; 82 TAILQ_HEAD(, dcf_virtchnl_cmd) vc_cmd_queue; 83 void (*vc_event_msg_cb)(struct ice_dcf_hw *dcf_hw, 84 uint8_t *msg, uint16_t msglen); 85 86 uint8_t *arq_buf; 87 88 uint16_t num_vfs; 89 uint16_t *vf_vsi_map; 90 uint16_t pf_vsi_id; 91 92 struct ice_dcf_tm_conf tm_conf; 93 struct virtchnl_dcf_bw_cfg_list **qos_bw_cfg; 94 struct ice_aqc_port_ets_elem *ets_config; 95 struct virtchnl_version_info virtchnl_version; 96 struct virtchnl_vf_resource *vf_res; /* VF resource */ 97 struct virtchnl_vsi_resource *vsi_res; /* LAN VSI */ 98 uint16_t vsi_id; 99 100 struct rte_eth_dev *eth_dev; 101 uint8_t *rss_lut; 102 uint8_t *rss_key; 103 uint64_t supported_rxdid; 104 uint16_t num_queue_pairs; 105 106 uint16_t msix_base; 107 uint16_t nb_msix; 108 uint16_t rxq_map[16]; 109 struct virtchnl_eth_stats eth_stats_offset; 110 111 /* Link status */ 112 bool link_up; 113 uint32_t link_speed; 114 115 bool resetting; 116 }; 117 118 int ice_dcf_execute_virtchnl_cmd(struct ice_dcf_hw *hw, 119 struct dcf_virtchnl_cmd *cmd); 120 int ice_dcf_send_aq_cmd(void *dcf_hw, struct ice_aq_desc *desc, 121 void *buf, uint16_t buf_size); 122 int ice_dcf_handle_vsi_update_event(struct ice_dcf_hw *hw); 123 int ice_dcf_init_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw); 124 void ice_dcf_uninit_hw(struct rte_eth_dev *eth_dev, struct ice_dcf_hw *hw); 125 int ice_dcf_init_rss(struct ice_dcf_hw *hw); 126 int ice_dcf_configure_queues(struct ice_dcf_hw *hw); 127 int ice_dcf_config_irq_map(struct ice_dcf_hw *hw); 128 int ice_dcf_switch_queue(struct ice_dcf_hw *hw, uint16_t qid, bool rx, bool on); 129 int ice_dcf_disable_queues(struct ice_dcf_hw *hw); 130 int ice_dcf_query_stats(struct ice_dcf_hw *hw, 131 struct virtchnl_eth_stats *pstats); 132 int ice_dcf_add_del_all_mac_addr(struct ice_dcf_hw *hw, bool add); 133 int ice_dcf_link_update(struct rte_eth_dev *dev, 134 __rte_unused int wait_to_complete); 135 void ice_dcf_tm_conf_init(struct rte_eth_dev *dev); 136 void ice_dcf_tm_conf_uninit(struct rte_eth_dev *dev); 137 int ice_dcf_replay_vf_bw(struct ice_dcf_hw *hw, uint16_t vf_id); 138 int ice_dcf_clear_bw(struct ice_dcf_hw *hw); 139 140 #endif /* _ICE_DCF_H_ */ 141