net/ice/base: support FDIR
[dpdk.git] / drivers / net / ice / base / ice_common.c
index 2025927..425f76e 100644 (file)
@@ -805,6 +805,9 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
        if (status)
                goto err_unroll_cqinit;
 
+       /* Set bit to enable Flow Director filters */
+       wr32(hw, PFQF_FD_ENA, PFQF_FD_ENA_FD_ENA_M);
+       INIT_LIST_HEAD(&hw->fdir_list_head);
 
        ice_clear_pxe_mode(hw);
 
@@ -901,6 +904,10 @@ enum ice_status ice_init_hw(struct ice_hw *hw)
        ice_init_flex_flds(hw, ICE_RXDID_FLEX_NIC);
        ice_init_flex_flds(hw, ICE_RXDID_FLEX_NIC_2);
 
+       /* Obtain counter base index which would be used by flow director */
+       status = ice_alloc_fd_res_cntr(hw, &hw->fd_ctr_base);
+       if (status)
+               goto err_unroll_fltr_mgmt_struct;
 
        return ICE_SUCCESS;
 
@@ -926,6 +933,7 @@ err_unroll_cqinit:
  */
 void ice_deinit_hw(struct ice_hw *hw)
 {
+       ice_free_fd_res_cntr(hw, hw->fd_ctr_base);
        ice_cleanup_fltr_mgmt_struct(hw);
 
        ice_sched_cleanup_all(hw);
@@ -1980,6 +1988,34 @@ ice_parse_caps(struct ice_hw *hw, void *buf, u32 cap_count,
                                  "HW caps: MSIX first vector index = %d\n",
                                  caps->msix_vector_first_id);
                        break;
+               case ICE_AQC_CAPS_FD:
+               {
+                       u32 reg_val, val;
+
+                       if (dev_p) {
+                               dev_p->num_flow_director_fltr = number;
+                               ice_debug(hw, ICE_DBG_INIT,
+                                         "HW caps: Dev.fd_fltr =%d\n",
+                                         dev_p->num_flow_director_fltr);
+                       }
+                       if (func_p) {
+                               reg_val = rd32(hw, GLQF_FD_SIZE);
+                               val = (reg_val & GLQF_FD_SIZE_FD_GSIZE_M) >>
+                                     GLQF_FD_SIZE_FD_GSIZE_S;
+                               func_p->fd_fltr_guar =
+                                       ice_get_num_per_func(hw, val);
+                               val = (reg_val & GLQF_FD_SIZE_FD_BSIZE_M) >>
+                                     GLQF_FD_SIZE_FD_BSIZE_S;
+                               func_p->fd_fltr_best_effort = val;
+                               ice_debug(hw, ICE_DBG_INIT,
+                                         "HW:func.fd_fltr guar= %d\n",
+                                         func_p->fd_fltr_guar);
+                               ice_debug(hw, ICE_DBG_INIT,
+                                         "HW:func.fd_fltr best effort=%d\n",
+                                         func_p->fd_fltr_best_effort);
+                       }
+                       break;
+               }
                case ICE_AQC_CAPS_MAX_MTU:
                        caps->max_mtu = number;
                        if (dev_p)