forked from mirrors/linux
		
	ice: Add NDO callback to set the maximum per-queue bitrate
Allow for rate limiting Tx queues. Bitrate is set in
Mbps(megabits per second).
Mbps max-rate is set for the queue via sysfs:
/sys/class/net/<iface>/queues/tx-<queue>/tx_maxrate
ex: echo 100 >/sys/class/net/ens7/queues/tx-0/tx_maxrate
    echo 200 >/sys/class/net/ens7/queues/tx-1/tx_maxrate
Note: A value of zero for tx_maxrate means disabled,
default is disabled.
Signed-off-by: Usha Ketineni <usha.k.ketineni@intel.com>
Co-developed-by: Tarun Singh <tarun.k.singh@intel.com>
Signed-off-by: Tarun Singh <tarun.k.singh@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									9d614b6425
								
							
						
					
					
						commit
						1ddef455f4
					
				
					 10 changed files with 1482 additions and 12 deletions
				
			
		| 
						 | 
					@ -742,6 +742,10 @@ struct ice_aqc_add_elem {
 | 
				
			||||||
	struct ice_aqc_txsched_elem_data generic[1];
 | 
						struct ice_aqc_txsched_elem_data generic[1];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ice_aqc_conf_elem {
 | 
				
			||||||
 | 
						struct ice_aqc_txsched_elem_data generic[1];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ice_aqc_get_elem {
 | 
					struct ice_aqc_get_elem {
 | 
				
			||||||
	struct ice_aqc_txsched_elem_data generic[1];
 | 
						struct ice_aqc_txsched_elem_data generic[1];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -783,6 +787,44 @@ struct ice_aqc_port_ets_elem {
 | 
				
			||||||
	__le32 tc_node_teid[8]; /* Used for response, reserved in command */
 | 
						__le32 tc_node_teid[8]; /* Used for response, reserved in command */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Rate limiting profile for
 | 
				
			||||||
 | 
					 * Add RL profile (indirect 0x0410)
 | 
				
			||||||
 | 
					 * Query RL profile (indirect 0x0411)
 | 
				
			||||||
 | 
					 * Remove RL profile (indirect 0x0415)
 | 
				
			||||||
 | 
					 * These indirect commands acts on single or multiple
 | 
				
			||||||
 | 
					 * RL profiles with specified data.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct ice_aqc_rl_profile {
 | 
				
			||||||
 | 
						__le16 num_profiles;
 | 
				
			||||||
 | 
						__le16 num_processed; /* Only for response. Reserved in Command. */
 | 
				
			||||||
 | 
						u8 reserved[4];
 | 
				
			||||||
 | 
						__le32 addr_high;
 | 
				
			||||||
 | 
						__le32 addr_low;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ice_aqc_rl_profile_elem {
 | 
				
			||||||
 | 
						u8 level;
 | 
				
			||||||
 | 
						u8 flags;
 | 
				
			||||||
 | 
					#define ICE_AQC_RL_PROFILE_TYPE_S	0x0
 | 
				
			||||||
 | 
					#define ICE_AQC_RL_PROFILE_TYPE_M	(0x3 << ICE_AQC_RL_PROFILE_TYPE_S)
 | 
				
			||||||
 | 
					#define ICE_AQC_RL_PROFILE_TYPE_CIR	0
 | 
				
			||||||
 | 
					#define ICE_AQC_RL_PROFILE_TYPE_EIR	1
 | 
				
			||||||
 | 
					#define ICE_AQC_RL_PROFILE_TYPE_SRL	2
 | 
				
			||||||
 | 
					/* The following flag is used for Query RL Profile Data */
 | 
				
			||||||
 | 
					#define ICE_AQC_RL_PROFILE_INVAL_S	0x7
 | 
				
			||||||
 | 
					#define ICE_AQC_RL_PROFILE_INVAL_M	(0x1 << ICE_AQC_RL_PROFILE_INVAL_S)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						__le16 profile_id;
 | 
				
			||||||
 | 
						__le16 max_burst_size;
 | 
				
			||||||
 | 
						__le16 rl_multiply;
 | 
				
			||||||
 | 
						__le16 wake_up_calc;
 | 
				
			||||||
 | 
						__le16 rl_encode;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ice_aqc_rl_profile_generic_elem {
 | 
				
			||||||
 | 
						struct ice_aqc_rl_profile_elem generic[1];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Query Scheduler Resource Allocation (indirect 0x0412)
 | 
					/* Query Scheduler Resource Allocation (indirect 0x0412)
 | 
				
			||||||
 * This indirect command retrieves the scheduler resources allocated by
 | 
					 * This indirect command retrieves the scheduler resources allocated by
 | 
				
			||||||
 * EMP Firmware to the given PF.
 | 
					 * EMP Firmware to the given PF.
 | 
				
			||||||
| 
						 | 
					@ -1657,6 +1699,7 @@ struct ice_aq_desc {
 | 
				
			||||||
		struct ice_aqc_sched_elem_cmd sched_elem_cmd;
 | 
							struct ice_aqc_sched_elem_cmd sched_elem_cmd;
 | 
				
			||||||
		struct ice_aqc_query_txsched_res query_sched_res;
 | 
							struct ice_aqc_query_txsched_res query_sched_res;
 | 
				
			||||||
		struct ice_aqc_query_port_ets port_ets;
 | 
							struct ice_aqc_query_port_ets port_ets;
 | 
				
			||||||
 | 
							struct ice_aqc_rl_profile rl_profile;
 | 
				
			||||||
		struct ice_aqc_nvm nvm;
 | 
							struct ice_aqc_nvm nvm;
 | 
				
			||||||
		struct ice_aqc_nvm_checksum nvm_checksum;
 | 
							struct ice_aqc_nvm_checksum nvm_checksum;
 | 
				
			||||||
		struct ice_aqc_pf_vf_msg virt;
 | 
							struct ice_aqc_pf_vf_msg virt;
 | 
				
			||||||
| 
						 | 
					@ -1758,12 +1801,15 @@ enum ice_adminq_opc {
 | 
				
			||||||
	/* transmit scheduler commands */
 | 
						/* transmit scheduler commands */
 | 
				
			||||||
	ice_aqc_opc_get_dflt_topo			= 0x0400,
 | 
						ice_aqc_opc_get_dflt_topo			= 0x0400,
 | 
				
			||||||
	ice_aqc_opc_add_sched_elems			= 0x0401,
 | 
						ice_aqc_opc_add_sched_elems			= 0x0401,
 | 
				
			||||||
 | 
						ice_aqc_opc_cfg_sched_elems			= 0x0403,
 | 
				
			||||||
	ice_aqc_opc_get_sched_elems			= 0x0404,
 | 
						ice_aqc_opc_get_sched_elems			= 0x0404,
 | 
				
			||||||
	ice_aqc_opc_suspend_sched_elems			= 0x0409,
 | 
						ice_aqc_opc_suspend_sched_elems			= 0x0409,
 | 
				
			||||||
	ice_aqc_opc_resume_sched_elems			= 0x040A,
 | 
						ice_aqc_opc_resume_sched_elems			= 0x040A,
 | 
				
			||||||
	ice_aqc_opc_query_port_ets			= 0x040E,
 | 
						ice_aqc_opc_query_port_ets			= 0x040E,
 | 
				
			||||||
	ice_aqc_opc_delete_sched_elems			= 0x040F,
 | 
						ice_aqc_opc_delete_sched_elems			= 0x040F,
 | 
				
			||||||
 | 
						ice_aqc_opc_add_rl_profiles			= 0x0410,
 | 
				
			||||||
	ice_aqc_opc_query_sched_res			= 0x0412,
 | 
						ice_aqc_opc_query_sched_res			= 0x0412,
 | 
				
			||||||
 | 
						ice_aqc_opc_remove_rl_profiles			= 0x0415,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* PHY commands */
 | 
						/* PHY commands */
 | 
				
			||||||
	ice_aqc_opc_get_phy_caps			= 0x0600,
 | 
						ice_aqc_opc_get_phy_caps			= 0x0600,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -855,6 +855,9 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
 | 
				
			||||||
		goto err_unroll_sched;
 | 
							goto err_unroll_sched;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	INIT_LIST_HEAD(&hw->agg_list);
 | 
						INIT_LIST_HEAD(&hw->agg_list);
 | 
				
			||||||
 | 
						/* Initialize max burst size */
 | 
				
			||||||
 | 
						if (!hw->max_burst_size)
 | 
				
			||||||
 | 
							ice_cfg_rl_burst_size(hw, ICE_SCHED_DFLT_BURST_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	status = ice_init_fltr_mgmt_struct(hw);
 | 
						status = ice_init_fltr_mgmt_struct(hw);
 | 
				
			||||||
	if (status)
 | 
						if (status)
 | 
				
			||||||
| 
						 | 
					@ -3260,7 +3263,7 @@ ice_set_ctx(u8 *src_ctx, u8 *dest_ctx, const struct ice_ctx_ele *ce_info)
 | 
				
			||||||
 * @tc: TC number
 | 
					 * @tc: TC number
 | 
				
			||||||
 * @q_handle: software queue handle
 | 
					 * @q_handle: software queue handle
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static struct ice_q_ctx *
 | 
					struct ice_q_ctx *
 | 
				
			||||||
ice_get_lan_q_ctx(struct ice_hw *hw, u16 vsi_handle, u8 tc, u16 q_handle)
 | 
					ice_get_lan_q_ctx(struct ice_hw *hw, u16 vsi_handle, u8 tc, u16 q_handle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ice_vsi_ctx *vsi;
 | 
						struct ice_vsi_ctx *vsi;
 | 
				
			||||||
| 
						 | 
					@ -3357,9 +3360,12 @@ ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u16 q_handle,
 | 
				
			||||||
	node.node_teid = buf->txqs[0].q_teid;
 | 
						node.node_teid = buf->txqs[0].q_teid;
 | 
				
			||||||
	node.data.elem_type = ICE_AQC_ELEM_TYPE_LEAF;
 | 
						node.data.elem_type = ICE_AQC_ELEM_TYPE_LEAF;
 | 
				
			||||||
	q_ctx->q_handle = q_handle;
 | 
						q_ctx->q_handle = q_handle;
 | 
				
			||||||
 | 
						q_ctx->q_teid = le32_to_cpu(node.node_teid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* add a leaf node into schduler tree queue layer */
 | 
						/* add a leaf node into scheduler tree queue layer */
 | 
				
			||||||
	status = ice_sched_add_node(pi, hw->num_tx_sched_layers - 1, &node);
 | 
						status = ice_sched_add_node(pi, hw->num_tx_sched_layers - 1, &node);
 | 
				
			||||||
 | 
						if (!status)
 | 
				
			||||||
 | 
							status = ice_sched_replay_q_bw(pi, q_ctx);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ena_txq_exit:
 | 
					ena_txq_exit:
 | 
				
			||||||
	mutex_unlock(&pi->sched_lock);
 | 
						mutex_unlock(&pi->sched_lock);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -141,6 +141,8 @@ ice_ena_vsi_txq(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u16 q_handle,
 | 
				
			||||||
enum ice_status ice_replay_vsi(struct ice_hw *hw, u16 vsi_handle);
 | 
					enum ice_status ice_replay_vsi(struct ice_hw *hw, u16 vsi_handle);
 | 
				
			||||||
void ice_replay_post(struct ice_hw *hw);
 | 
					void ice_replay_post(struct ice_hw *hw);
 | 
				
			||||||
void ice_output_fw_log(struct ice_hw *hw, struct ice_aq_desc *desc, void *buf);
 | 
					void ice_output_fw_log(struct ice_hw *hw, struct ice_aq_desc *desc, void *buf);
 | 
				
			||||||
 | 
					struct ice_q_ctx *
 | 
				
			||||||
 | 
					ice_get_lan_q_ctx(struct ice_hw *hw, u16 vsi_handle, u8 tc, u16 q_handle);
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
ice_stat_update40(struct ice_hw *hw, u32 reg, bool prev_stat_loaded,
 | 
					ice_stat_update40(struct ice_hw *hw, u32 reg, bool prev_stat_loaded,
 | 
				
			||||||
		  u64 *prev_stat, u64 *cur_stat);
 | 
							  u64 *prev_stat, u64 *cur_stat);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -101,6 +101,16 @@ u8 ice_dcb_get_num_tc(struct ice_dcbx_cfg *dcbcfg)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * ice_dcb_get_tc - Get the TC associated with the queue
 | 
				
			||||||
 | 
					 * @vsi: ptr to the VSI
 | 
				
			||||||
 | 
					 * @queue_index: queue number associated with VSI
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					u8 ice_dcb_get_tc(struct ice_vsi *vsi, int queue_index)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return vsi->tx_rings[queue_index]->dcb_tc;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * ice_vsi_cfg_dcb_rings - Update rings to reflect DCB TC
 | 
					 * ice_vsi_cfg_dcb_rings - Update rings to reflect DCB TC
 | 
				
			||||||
 * @vsi: VSI owner of rings being updated
 | 
					 * @vsi: VSI owner of rings being updated
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,6 +14,7 @@
 | 
				
			||||||
void ice_dcb_rebuild(struct ice_pf *pf);
 | 
					void ice_dcb_rebuild(struct ice_pf *pf);
 | 
				
			||||||
u8 ice_dcb_get_ena_tc(struct ice_dcbx_cfg *dcbcfg);
 | 
					u8 ice_dcb_get_ena_tc(struct ice_dcbx_cfg *dcbcfg);
 | 
				
			||||||
u8 ice_dcb_get_num_tc(struct ice_dcbx_cfg *dcbcfg);
 | 
					u8 ice_dcb_get_num_tc(struct ice_dcbx_cfg *dcbcfg);
 | 
				
			||||||
 | 
					u8 ice_dcb_get_tc(struct ice_vsi *vsi, int queue_index);
 | 
				
			||||||
void ice_vsi_cfg_dcb_rings(struct ice_vsi *vsi);
 | 
					void ice_vsi_cfg_dcb_rings(struct ice_vsi *vsi);
 | 
				
			||||||
int ice_init_pf_dcb(struct ice_pf *pf, bool locked);
 | 
					int ice_init_pf_dcb(struct ice_pf *pf, bool locked);
 | 
				
			||||||
void ice_update_dcb_stats(struct ice_pf *pf);
 | 
					void ice_update_dcb_stats(struct ice_pf *pf);
 | 
				
			||||||
| 
						 | 
					@ -42,6 +43,13 @@ static inline u8 ice_dcb_get_num_tc(struct ice_dcbx_cfg __always_unused *dcbcfg)
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline u8
 | 
				
			||||||
 | 
					ice_dcb_get_tc(struct ice_vsi __always_unused *vsi,
 | 
				
			||||||
 | 
						       int __always_unused queue_index)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int
 | 
					static inline int
 | 
				
			||||||
ice_init_pf_dcb(struct ice_pf *pf, bool __always_unused locked)
 | 
					ice_init_pf_dcb(struct ice_pf *pf, bool __always_unused locked)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3648,6 +3648,48 @@ static void ice_set_rx_mode(struct net_device *netdev)
 | 
				
			||||||
	ice_service_task_schedule(vsi->back);
 | 
						ice_service_task_schedule(vsi->back);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * ice_set_tx_maxrate - NDO callback to set the maximum per-queue bitrate
 | 
				
			||||||
 | 
					 * @netdev: network interface device structure
 | 
				
			||||||
 | 
					 * @queue_index: Queue ID
 | 
				
			||||||
 | 
					 * @maxrate: maximum bandwidth in Mbps
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					ice_set_tx_maxrate(struct net_device *netdev, int queue_index, u32 maxrate)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct ice_netdev_priv *np = netdev_priv(netdev);
 | 
				
			||||||
 | 
						struct ice_vsi *vsi = np->vsi;
 | 
				
			||||||
 | 
						enum ice_status status;
 | 
				
			||||||
 | 
						u16 q_handle;
 | 
				
			||||||
 | 
						u8 tc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Validate maxrate requested is within permitted range */
 | 
				
			||||||
 | 
						if (maxrate && (maxrate > (ICE_SCHED_MAX_BW / 1000))) {
 | 
				
			||||||
 | 
							netdev_err(netdev,
 | 
				
			||||||
 | 
								   "Invalid max rate %d specified for the queue %d\n",
 | 
				
			||||||
 | 
								   maxrate, queue_index);
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						q_handle = vsi->tx_rings[queue_index]->q_handle;
 | 
				
			||||||
 | 
						tc = ice_dcb_get_tc(vsi, queue_index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Set BW back to default, when user set maxrate to 0 */
 | 
				
			||||||
 | 
						if (!maxrate)
 | 
				
			||||||
 | 
							status = ice_cfg_q_bw_dflt_lmt(vsi->port_info, vsi->idx, tc,
 | 
				
			||||||
 | 
										       q_handle, ICE_MAX_BW);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							status = ice_cfg_q_bw_lmt(vsi->port_info, vsi->idx, tc,
 | 
				
			||||||
 | 
										  q_handle, ICE_MAX_BW, maxrate * 1000);
 | 
				
			||||||
 | 
						if (status) {
 | 
				
			||||||
 | 
							netdev_err(netdev,
 | 
				
			||||||
 | 
								   "Unable to set Tx max rate, error %d\n", status);
 | 
				
			||||||
 | 
							return -EIO;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * ice_fdb_add - add an entry to the hardware database
 | 
					 * ice_fdb_add - add an entry to the hardware database
 | 
				
			||||||
 * @ndm: the input from the stack
 | 
					 * @ndm: the input from the stack
 | 
				
			||||||
| 
						 | 
					@ -5159,6 +5201,7 @@ static const struct net_device_ops ice_netdev_ops = {
 | 
				
			||||||
	.ndo_validate_addr = eth_validate_addr,
 | 
						.ndo_validate_addr = eth_validate_addr,
 | 
				
			||||||
	.ndo_change_mtu = ice_change_mtu,
 | 
						.ndo_change_mtu = ice_change_mtu,
 | 
				
			||||||
	.ndo_get_stats64 = ice_get_stats64,
 | 
						.ndo_get_stats64 = ice_get_stats64,
 | 
				
			||||||
 | 
						.ndo_set_tx_maxrate = ice_set_tx_maxrate,
 | 
				
			||||||
	.ndo_set_vf_spoofchk = ice_set_vf_spoofchk,
 | 
						.ndo_set_vf_spoofchk = ice_set_vf_spoofchk,
 | 
				
			||||||
	.ndo_set_vf_mac = ice_set_vf_mac,
 | 
						.ndo_set_vf_mac = ice_set_vf_mac,
 | 
				
			||||||
	.ndo_get_vf_config = ice_get_vf_cfg,
 | 
						.ndo_get_vf_config = ice_get_vf_cfg,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
					@ -8,6 +8,36 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ICE_QGRP_LAYER_OFFSET	2
 | 
					#define ICE_QGRP_LAYER_OFFSET	2
 | 
				
			||||||
#define ICE_VSI_LAYER_OFFSET	4
 | 
					#define ICE_VSI_LAYER_OFFSET	4
 | 
				
			||||||
 | 
					#define ICE_SCHED_INVAL_LAYER_NUM	0xFF
 | 
				
			||||||
 | 
					/* Burst size is a 12 bits register that is configured while creating the RL
 | 
				
			||||||
 | 
					 * profile(s). MSB is a granularity bit and tells the granularity type
 | 
				
			||||||
 | 
					 * 0 - LSB bits are in 64 bytes granularity
 | 
				
			||||||
 | 
					 * 1 - LSB bits are in 1K bytes granularity
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define ICE_64_BYTE_GRANULARITY			0
 | 
				
			||||||
 | 
					#define ICE_KBYTE_GRANULARITY			BIT(11)
 | 
				
			||||||
 | 
					#define ICE_MIN_BURST_SIZE_ALLOWED		64 /* In Bytes */
 | 
				
			||||||
 | 
					#define ICE_MAX_BURST_SIZE_ALLOWED \
 | 
				
			||||||
 | 
						((BIT(11) - 1) * 1024) /* In Bytes */
 | 
				
			||||||
 | 
					#define ICE_MAX_BURST_SIZE_64_BYTE_GRANULARITY \
 | 
				
			||||||
 | 
						((BIT(11) - 1) * 64) /* In Bytes */
 | 
				
			||||||
 | 
					#define ICE_MAX_BURST_SIZE_KBYTE_GRANULARITY	ICE_MAX_BURST_SIZE_ALLOWED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ICE_RL_PROF_FREQUENCY 446000000
 | 
				
			||||||
 | 
					#define ICE_RL_PROF_ACCURACY_BYTES 128
 | 
				
			||||||
 | 
					#define ICE_RL_PROF_MULTIPLIER 10000
 | 
				
			||||||
 | 
					#define ICE_RL_PROF_TS_MULTIPLIER 32
 | 
				
			||||||
 | 
					#define ICE_RL_PROF_FRACTION 512
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* BW rate limit profile parameters list entry along
 | 
				
			||||||
 | 
					 * with bandwidth maintained per layer in port info
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct ice_aqc_rl_profile_info {
 | 
				
			||||||
 | 
						struct ice_aqc_rl_profile_elem profile;
 | 
				
			||||||
 | 
						struct list_head list_entry;
 | 
				
			||||||
 | 
						u32 bw;			/* requested */
 | 
				
			||||||
 | 
						u16 prof_id_ref;	/* profile ID to node association ref count */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ice_sched_agg_vsi_info {
 | 
					struct ice_sched_agg_vsi_info {
 | 
				
			||||||
	struct list_head list_entry;
 | 
						struct list_head list_entry;
 | 
				
			||||||
| 
						 | 
					@ -48,4 +78,13 @@ enum ice_status
 | 
				
			||||||
ice_sched_cfg_vsi(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u16 maxqs,
 | 
					ice_sched_cfg_vsi(struct ice_port_info *pi, u16 vsi_handle, u8 tc, u16 maxqs,
 | 
				
			||||||
		  u8 owner, bool enable);
 | 
							  u8 owner, bool enable);
 | 
				
			||||||
enum ice_status ice_rm_vsi_lan_cfg(struct ice_port_info *pi, u16 vsi_handle);
 | 
					enum ice_status ice_rm_vsi_lan_cfg(struct ice_port_info *pi, u16 vsi_handle);
 | 
				
			||||||
 | 
					enum ice_status
 | 
				
			||||||
 | 
					ice_cfg_q_bw_lmt(struct ice_port_info *pi, u16 vsi_handle, u8 tc,
 | 
				
			||||||
 | 
							 u16 q_handle, enum ice_rl_type rl_type, u32 bw);
 | 
				
			||||||
 | 
					enum ice_status
 | 
				
			||||||
 | 
					ice_cfg_q_bw_dflt_lmt(struct ice_port_info *pi, u16 vsi_handle, u8 tc,
 | 
				
			||||||
 | 
							      u16 q_handle, enum ice_rl_type rl_type);
 | 
				
			||||||
 | 
					enum ice_status ice_cfg_rl_burst_size(struct ice_hw *hw, u32 bytes);
 | 
				
			||||||
 | 
					enum ice_status
 | 
				
			||||||
 | 
					ice_sched_replay_q_bw(struct ice_port_info *pi, struct ice_q_ctx *q_ctx);
 | 
				
			||||||
#endif /* _ICE_SCHED_H_ */
 | 
					#endif /* _ICE_SCHED_H_ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,11 +14,6 @@
 | 
				
			||||||
#define ICE_VSI_INVAL_ID 0xffff
 | 
					#define ICE_VSI_INVAL_ID 0xffff
 | 
				
			||||||
#define ICE_INVAL_Q_HANDLE 0xFFFF
 | 
					#define ICE_INVAL_Q_HANDLE 0xFFFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* VSI queue context structure */
 | 
					 | 
				
			||||||
struct ice_q_ctx {
 | 
					 | 
				
			||||||
	u16  q_handle;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* VSI context structure for add/get/update/free operations */
 | 
					/* VSI context structure for add/get/update/free operations */
 | 
				
			||||||
struct ice_vsi_ctx {
 | 
					struct ice_vsi_ctx {
 | 
				
			||||||
	u16 vsi_num;
 | 
						u16 vsi_num;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,17 @@ static inline bool ice_is_tc_ena(unsigned long bitmap, u8 tc)
 | 
				
			||||||
	return test_bit(tc, &bitmap);
 | 
						return test_bit(tc, &bitmap);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline u64 round_up_64bit(u64 a, u32 b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return div64_long(((a) + (b) / 2), (b));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline u32 ice_round_to_num(u32 N, u32 R)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return ((((N) % (R)) < ((R) / 2)) ? (((N) / (R)) * (R)) :
 | 
				
			||||||
 | 
							((((N) + (R) - 1) / (R)) * (R)));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Driver always calls main vsi_handle first */
 | 
					/* Driver always calls main vsi_handle first */
 | 
				
			||||||
#define ICE_MAIN_VSI_HANDLE		0
 | 
					#define ICE_MAIN_VSI_HANDLE		0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -272,10 +283,56 @@ enum ice_agg_type {
 | 
				
			||||||
	ICE_AGG_TYPE_QG
 | 
						ICE_AGG_TYPE_QG
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ICE_SCHED_DFLT_RL_PROF_ID	0
 | 
					/* Rate limit types */
 | 
				
			||||||
#define ICE_SCHED_DFLT_BW_WT		1
 | 
					enum ice_rl_type {
 | 
				
			||||||
 | 
						ICE_UNKNOWN_BW = 0,
 | 
				
			||||||
 | 
						ICE_MIN_BW,		/* for CIR profile */
 | 
				
			||||||
 | 
						ICE_MAX_BW,		/* for EIR profile */
 | 
				
			||||||
 | 
						ICE_SHARED_BW		/* for shared profile */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* VSI type list entry to locate corresponding VSI/ag nodes */
 | 
					#define ICE_SCHED_MIN_BW		500		/* in Kbps */
 | 
				
			||||||
 | 
					#define ICE_SCHED_MAX_BW		100000000	/* in Kbps */
 | 
				
			||||||
 | 
					#define ICE_SCHED_DFLT_BW		0xFFFFFFFF	/* unlimited */
 | 
				
			||||||
 | 
					#define ICE_SCHED_DFLT_RL_PROF_ID	0
 | 
				
			||||||
 | 
					#define ICE_SCHED_NO_SHARED_RL_PROF_ID	0xFFFF
 | 
				
			||||||
 | 
					#define ICE_SCHED_DFLT_BW_WT		1
 | 
				
			||||||
 | 
					#define ICE_SCHED_INVAL_PROF_ID		0xFFFF
 | 
				
			||||||
 | 
					#define ICE_SCHED_DFLT_BURST_SIZE	(15 * 1024)	/* in bytes (15k) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 /* Data structure for saving BW information */
 | 
				
			||||||
 | 
					enum ice_bw_type {
 | 
				
			||||||
 | 
						ICE_BW_TYPE_PRIO,
 | 
				
			||||||
 | 
						ICE_BW_TYPE_CIR,
 | 
				
			||||||
 | 
						ICE_BW_TYPE_CIR_WT,
 | 
				
			||||||
 | 
						ICE_BW_TYPE_EIR,
 | 
				
			||||||
 | 
						ICE_BW_TYPE_EIR_WT,
 | 
				
			||||||
 | 
						ICE_BW_TYPE_SHARED,
 | 
				
			||||||
 | 
						ICE_BW_TYPE_CNT		/* This must be last */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ice_bw {
 | 
				
			||||||
 | 
						u32 bw;
 | 
				
			||||||
 | 
						u16 bw_alloc;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ice_bw_type_info {
 | 
				
			||||||
 | 
						DECLARE_BITMAP(bw_t_bitmap, ICE_BW_TYPE_CNT);
 | 
				
			||||||
 | 
						u8 generic;
 | 
				
			||||||
 | 
						struct ice_bw cir_bw;
 | 
				
			||||||
 | 
						struct ice_bw eir_bw;
 | 
				
			||||||
 | 
						u32 shared_bw;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* VSI queue context structure for given TC */
 | 
				
			||||||
 | 
					struct ice_q_ctx {
 | 
				
			||||||
 | 
						u16  q_handle;
 | 
				
			||||||
 | 
						u32  q_teid;
 | 
				
			||||||
 | 
						/* bw_t_info saves queue BW information */
 | 
				
			||||||
 | 
						struct ice_bw_type_info bw_t_info;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* VSI type list entry to locate corresponding VSI/aggregator nodes */
 | 
				
			||||||
struct ice_sched_vsi_info {
 | 
					struct ice_sched_vsi_info {
 | 
				
			||||||
	struct ice_sched_node *vsi_node[ICE_MAX_TRAFFIC_CLASS];
 | 
						struct ice_sched_node *vsi_node[ICE_MAX_TRAFFIC_CLASS];
 | 
				
			||||||
	struct ice_sched_node *ag_node[ICE_MAX_TRAFFIC_CLASS];
 | 
						struct ice_sched_node *ag_node[ICE_MAX_TRAFFIC_CLASS];
 | 
				
			||||||
| 
						 | 
					@ -364,6 +421,8 @@ struct ice_port_info {
 | 
				
			||||||
	struct mutex sched_lock;	/* protect access to TXSched tree */
 | 
						struct mutex sched_lock;	/* protect access to TXSched tree */
 | 
				
			||||||
	struct ice_sched_node *
 | 
						struct ice_sched_node *
 | 
				
			||||||
		sib_head[ICE_MAX_TRAFFIC_CLASS][ICE_AQC_TOPO_MAX_LEVEL_NUM];
 | 
							sib_head[ICE_MAX_TRAFFIC_CLASS][ICE_AQC_TOPO_MAX_LEVEL_NUM];
 | 
				
			||||||
 | 
						/* List contain profile ID(s) and other params per layer */
 | 
				
			||||||
 | 
						struct list_head rl_prof_list[ICE_AQC_TOPO_MAX_LEVEL_NUM];
 | 
				
			||||||
	struct ice_dcbx_cfg local_dcbx_cfg;	/* Oper/Local Cfg */
 | 
						struct ice_dcbx_cfg local_dcbx_cfg;	/* Oper/Local Cfg */
 | 
				
			||||||
	/* DCBX info */
 | 
						/* DCBX info */
 | 
				
			||||||
	struct ice_dcbx_cfg remote_dcbx_cfg;	/* Peer Cfg */
 | 
						struct ice_dcbx_cfg remote_dcbx_cfg;	/* Peer Cfg */
 | 
				
			||||||
| 
						 | 
					@ -415,6 +474,8 @@ struct ice_hw {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	u8 pf_id;		/* device profile info */
 | 
						u8 pf_id;		/* device profile info */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						u16 max_burst_size;	/* driver sets this value */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Tx Scheduler values */
 | 
						/* Tx Scheduler values */
 | 
				
			||||||
	u16 num_tx_sched_layers;
 | 
						u16 num_tx_sched_layers;
 | 
				
			||||||
	u16 num_tx_sched_phys_layers;
 | 
						u16 num_tx_sched_phys_layers;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue