implement operation to get flow director information in i40e pmd driver Signed-off-by: Jingjing Wu <jingjing.wu at intel.com> --- lib/librte_pmd_i40e/i40e_fdir.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
diff --git a/lib/librte_pmd_i40e/i40e_fdir.c b/lib/librte_pmd_i40e/i40e_fdir.c index 8996a1c..d2c8304 100644 --- a/lib/librte_pmd_i40e/i40e_fdir.c +++ b/lib/librte_pmd_i40e/i40e_fdir.c @@ -89,6 +89,8 @@ static int i40e_fdir_filter_programming(struct i40e_pf *pf, enum i40e_filter_pctype pctype, struct rte_eth_fdir_filter *filter, bool add); +static void i40e_fdir_info_get(struct i40e_pf *pf, + struct rte_eth_fdir_info *fdir); static int i40e_fdir_rx_queue_init(struct i40e_rx_queue *rxq) @@ -874,6 +876,36 @@ i40e_fdir_filter_programming(struct i40e_pf *pf, } /* + * i40e_fdir_info_get - get information of Flow Director + * @pf: ethernet device to get info from + * @fdir: a pointer to a structure of type *rte_eth_fdir_info* to be filled with + * the flow director information. + */ +static void +i40e_fdir_info_get(struct i40e_pf *pf, struct rte_eth_fdir_info *fdir) +{ + struct i40e_hw *hw = I40E_PF_TO_HW(pf); + uint32_t pfqf_ctl; + + pfqf_ctl = I40E_READ_REG(hw, I40E_PFQF_CTL_0); + fdir->mode = pfqf_ctl & I40E_PFQF_CTL_0_FD_ENA_MASK ? + RTE_FDIR_MODE_PERFECT : RTE_FDIR_MODE_NONE; + fdir->info_ext.guarant_spc = + (uint16_t)hw->func_caps.fd_filters_guaranteed; + fdir->info_ext.guarant_cnt = + (uint16_t)((I40E_READ_REG(hw, I40E_PFQF_FDSTAT) & + I40E_PFQF_FDSTAT_GUARANT_CNT_MASK) >> + I40E_PFQF_FDSTAT_GUARANT_CNT_SHIFT); + fdir->info_ext.best_spc = + (uint16_t)hw->func_caps.fd_filters_best_effort; + fdir->info_ext.best_cnt = + (uint16_t)((I40E_READ_REG(hw, I40E_PFQF_FDSTAT) & + I40E_PFQF_FDSTAT_BEST_CNT_MASK) >> + I40E_PFQF_FDSTAT_BEST_CNT_SHIFT); + return; +} + +/* * i40e_fdir_ctrl_func - deal with all operations on flow director. * @pf: board private structure * @filter_op:operation will be taken. @@ -903,6 +935,9 @@ i40e_fdir_ctrl_func(struct i40e_pf *pf, enum rte_filter_op filter_op, void *arg) (struct rte_eth_fdir_filter *)arg, FALSE); break; + case RTE_ETH_FILTER_INFO: + i40e_fdir_info_get(pf, (struct rte_eth_fdir_info *)arg); + break; default: PMD_DRV_LOG(ERR, "unknown operation %u.", filter_op); ret = -EINVAL; -- 1.8.1.4