net/ice/base: add entries in profile TCAM with priority
authorQi Zhang <qi.z.zhang@intel.com>
Mon, 15 Jun 2020 02:05:00 +0000 (10:05 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 16 Jun 2020 17:21:08 +0000 (19:21 +0200)
The profile TCAM tables are implemented such that entries with a smaller
index in the table have a higher priority. When records to be added to
the table have flags to differentiate between standard PTG and VSIG
records, then these entries need to have higher priority in order to be
found and processed first.

Signed-off-by: Dan Nowlin <dan.nowlin@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Qiming Yang <qiming.yang@intel.com>
drivers/net/ice/base/ice_flex_pipe.c

index e147afb..f953d89 100644 (file)
@@ -2893,20 +2893,22 @@ static bool ice_tcam_ent_rsrc_type(enum ice_block blk, u16 *rsrc_type)
  * ice_alloc_tcam_ent - allocate hardware TCAM entry
  * @hw: pointer to the HW struct
  * @blk: the block to allocate the TCAM for
+ * @btm: true to allocate from bottom of table, false to allocate from top
  * @tcam_idx: pointer to variable to receive the TCAM entry
  *
  * This function allocates a new entry in a Profile ID TCAM for a specific
  * block.
  */
 static enum ice_status
-ice_alloc_tcam_ent(struct ice_hw *hw, enum ice_block blk, u16 *tcam_idx)
+ice_alloc_tcam_ent(struct ice_hw *hw, enum ice_block blk, bool btm,
+                  u16 *tcam_idx)
 {
        u16 res_type;
 
        if (!ice_tcam_ent_rsrc_type(blk, &res_type))
                return ICE_ERR_PARAM;
 
-       return ice_alloc_hw_res(hw, res_type, 1, true, tcam_idx);
+       return ice_alloc_hw_res(hw, res_type, 1, btm, tcam_idx);
 }
 
 /**
@@ -5225,7 +5227,12 @@ ice_prof_tcam_ena_dis(struct ice_hw *hw, enum ice_block blk, bool enable,
        }
 
        /* for re-enabling, reallocate a TCAM */
-       status = ice_alloc_tcam_ent(hw, blk, &tcam->tcam_idx);
+       /* for entries with empty attribute masks, allocate entry from
+        * the bottom of the tcam table; otherwise, allocate from the
+        * top of the table in order to give it higher priority
+        */
+       status = ice_alloc_tcam_ent(hw, blk, tcam->attr.mask == 0,
+                                   &tcam->tcam_idx);
        if (status)
                return status;
 
@@ -5426,7 +5433,12 @@ ice_add_prof_id_vsig(struct ice_hw *hw, enum ice_block blk, u16 vsig, u64 hdl,
                        goto err_ice_add_prof_id_vsig;
 
                /* allocate the TCAM entry index */
-               status = ice_alloc_tcam_ent(hw, blk, &tcam_idx);
+               /* for entries with empty attribute masks, allocate entry from
+                * the bottom of the tcam table; otherwise, allocate from the
+                * top of the table in order to give it higher priority
+                */
+               status = ice_alloc_tcam_ent(hw, blk, map->attr[i].mask == 0,
+                                           &tcam_idx);
                if (status) {
                        ice_free(hw, p);
                        goto err_ice_add_prof_id_vsig;