net/ice/base: add functions for resource counter
authorQi Zhang <qi.z.zhang@intel.com>
Mon, 25 Mar 2019 05:44:26 +0000 (13:44 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 29 Mar 2019 16:25:31 +0000 (17:25 +0100)
1. ice_alloc_res_cntr - allocate resource counter
2. ice_free_res_cntr - free resource counter
3. ice_alloc_vlan_res_counter - allocate vlan resource counter
4. ice_free_vlan_res_counter - free vlan resource counter

These APIs will be used when try to count the number of a flow be
hit.

Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Reviewed-by: Qiming Yang <qiming.yang@intel.com>
Reviewed-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
drivers/net/ice/base/ice_switch.c
drivers/net/ice/base/ice_switch.h

index c985c1e..26fc0b4 100644 (file)
@@ -3238,9 +3238,106 @@ void ice_remove_vsi_fltr(struct ice_hw *hw, u16 vsi_handle)
        ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_PROMISC_VLAN);
 }
 
+/**
+ * ice_alloc_res_cntr - allocating resource counter
+ * @hw: pointer to the hardware structure
+ * @type: type of resource
+ * @alloc_shared: if set it is shared else dedicated
+ * @num_items: number of entries requested for FD resource type
+ * @counter_id: counter index returned by AQ call
+ */
+enum ice_status
+ice_alloc_res_cntr(struct ice_hw *hw, u8 type, u8 alloc_shared, u16 num_items,
+                  u16 *counter_id)
+{
+       struct ice_aqc_alloc_free_res_elem *buf;
+       enum ice_status status;
+       u16 buf_len;
+
+       /* Allocate resource */
+       buf_len = sizeof(*buf);
+       buf = (struct ice_aqc_alloc_free_res_elem *)
+               ice_malloc(hw, buf_len);
+       if (!buf)
+               return ICE_ERR_NO_MEMORY;
+
+       buf->num_elems = CPU_TO_LE16(num_items);
+       buf->res_type = CPU_TO_LE16(((type << ICE_AQC_RES_TYPE_S) &
+                                     ICE_AQC_RES_TYPE_M) | alloc_shared);
+
+       status = ice_aq_alloc_free_res(hw, 1, buf, buf_len,
+                                      ice_aqc_opc_alloc_res, NULL);
+       if (status)
+               goto exit;
+
+       *counter_id = LE16_TO_CPU(buf->elem[0].e.sw_resp);
+
+exit:
+       ice_free(hw, buf);
+       return status;
+}
+
+/**
+ * ice_free_res_cntr - free resource counter
+ * @hw: pointer to the hardware structure
+ * @type: type of resource
+ * @alloc_shared: if set it is shared else dedicated
+ * @num_items: number of entries to be freed for FD resource type
+ * @counter_id: counter ID resource which needs to be freed
+ */
+enum ice_status
+ice_free_res_cntr(struct ice_hw *hw, u8 type, u8 alloc_shared, u16 num_items,
+                 u16 counter_id)
+{
+       struct ice_aqc_alloc_free_res_elem *buf;
+       enum ice_status status;
+       u16 buf_len;
 
+       /* Free resource */
+       buf_len = sizeof(*buf);
+       buf = (struct ice_aqc_alloc_free_res_elem *)
+               ice_malloc(hw, buf_len);
+       if (!buf)
+               return ICE_ERR_NO_MEMORY;
 
+       buf->num_elems = CPU_TO_LE16(num_items);
+       buf->res_type = CPU_TO_LE16(((type << ICE_AQC_RES_TYPE_S) &
+                                     ICE_AQC_RES_TYPE_M) | alloc_shared);
+       buf->elem[0].e.sw_resp = CPU_TO_LE16(counter_id);
 
+       status = ice_aq_alloc_free_res(hw, 1, buf, buf_len,
+                                      ice_aqc_opc_free_res, NULL);
+       if (status)
+               ice_debug(hw, ICE_DBG_SW,
+                         "counter resource could not be freed\n");
+
+       ice_free(hw, buf);
+       return status;
+}
+
+/**
+ * ice_alloc_vlan_res_counter - obtain counter resource for VLAN type
+ * @hw: pointer to the hardware structure
+ * @counter_id: returns counter index
+ */
+enum ice_status ice_alloc_vlan_res_counter(struct ice_hw *hw, u16 *counter_id)
+{
+       return ice_alloc_res_cntr(hw, ICE_AQC_RES_TYPE_VLAN_COUNTER,
+                                 ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1,
+                                 counter_id);
+}
+
+/**
+ * ice_free_vlan_res_counter - Free counter resource for VLAN type
+ * @hw: pointer to the hardware structure
+ * @counter_id: counter index to be freed
+ */
+enum ice_status ice_free_vlan_res_counter(struct ice_hw *hw, u16 counter_id)
+{
+       return ice_free_res_cntr(hw, ICE_AQC_RES_TYPE_VLAN_COUNTER,
+                                ICE_AQC_RES_TYPE_FLAG_DEDICATED, 1,
+                                counter_id);
+}
 
 /**
  * ice_replay_vsi_fltr - Replay filters for requested VSI
index 4b77d92..364083e 100644 (file)
@@ -338,6 +338,12 @@ enum ice_status
 ice_alloc_vlan_res_counter(struct ice_hw *hw, u16 *counter_id);
 enum ice_status
 ice_free_vlan_res_counter(struct ice_hw *hw, u16 counter_id);
+enum ice_status
+ice_alloc_res_cntr(struct ice_hw *hw, u8 type, u8 alloc_shared, u16 num_items,
+                  u16 *counter_id);
+enum ice_status
+ice_free_res_cntr(struct ice_hw *hw, u8 type, u8 alloc_shared, u16 num_items,
+                 u16 counter_id);
 
 /* Switch/bridge related commands */
 enum ice_status ice_update_sw_rule_bridge_mode(struct ice_hw *hw);