net/ice/base: revert workaround for resource allocation

Revert the workaround for allocating TCAM and FV entries to align
with latest firmware.

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>
Reviewed-by: Qiming Yang <qiming.yang@intel.com>
Reviewed-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
This commit is contained in:
Qi Zhang 2019-03-25 13:44:51 +08:00 committed by Ferruh Yigit
parent 6e1db8a61d
commit bcb1f28386
4 changed files with 17 additions and 233 deletions

View File

@ -1786,11 +1786,11 @@ ice_aq_alloc_free_res(struct ice_hw *hw, u16 num_entries,
* @hw: pointer to the HW struct
* @type: type of resource
* @num: number of resources to allocate
* @sh: shared if true, dedicated if false
* @btm: allocate from bottom
* @res: pointer to array that will receive the resources
*/
enum ice_status
ice_alloc_hw_res(struct ice_hw *hw, u16 type, u16 num, bool sh, u16 *res)
ice_alloc_hw_res(struct ice_hw *hw, u16 type, u16 num, bool btm, u16 *res)
{
struct ice_aqc_alloc_free_res_elem *buf;
enum ice_status status;
@ -1804,8 +1804,11 @@ ice_alloc_hw_res(struct ice_hw *hw, u16 type, u16 num, bool sh, u16 *res)
/* Prepare buffer to allocate resource. */
buf->num_elems = CPU_TO_LE16(num);
buf->res_type = CPU_TO_LE16(type | (sh ? ICE_AQC_RES_TYPE_FLAG_SHARED :
ICE_AQC_RES_TYPE_FLAG_DEDICATED));
buf->res_type = CPU_TO_LE16(type | ICE_AQC_RES_TYPE_FLAG_DEDICATED |
ICE_AQC_RES_TYPE_FLAG_IGNORE_INDEX);
if (btm)
buf->res_type |= CPU_TO_LE16(ICE_AQC_RES_TYPE_FLAG_SCAN_BOTTOM);
status = ice_aq_alloc_free_res(hw, 1, buf, buf_len,
ice_aqc_opc_alloc_res, NULL);
if (status)

View File

@ -41,7 +41,7 @@ ice_acquire_res(struct ice_hw *hw, enum ice_aq_res_ids res,
enum ice_aq_res_access_type access, u32 timeout);
void ice_release_res(struct ice_hw *hw, enum ice_aq_res_ids res);
enum ice_status
ice_alloc_hw_res(struct ice_hw *hw, u16 type, u16 num, bool sh, u16 *res);
ice_alloc_hw_res(struct ice_hw *hw, u16 type, u16 num, bool btm, u16 *res);
enum ice_status
ice_free_hw_res(struct ice_hw *hw, u16 type, u16 num, u16 *res);
enum ice_status

View File

@ -2535,199 +2535,6 @@ static bool ice_tcam_ent_rsrc_type(enum ice_block blk, u16 *rsrc_type)
return true;
}
/**
* ice_workaround_get_res_blk - determine the block from a resource type
* @type: type of resource
* @blk: pointer to a enum that will receive the block type
* @tcam: pointer to variable that will be set to true for a TCAM resource type
*/
static enum
ice_status ice_workaround_get_res_blk(u16 type, enum ice_block *blk, bool *tcam)
{
/* just need to support TCAM entries and Profile IDs for now */
*tcam = false;
switch (type) {
case ICE_AQC_RES_TYPE_SWITCH_PROF_BLDR_TCAM:
*blk = ICE_BLK_SW;
*tcam = true;
break;
case ICE_AQC_RES_TYPE_ACL_PROF_BLDR_TCAM:
*blk = ICE_BLK_ACL;
*tcam = true;
break;
case ICE_AQC_RES_TYPE_FD_PROF_BLDR_TCAM:
*blk = ICE_BLK_FD;
*tcam = true;
break;
case ICE_AQC_RES_TYPE_HASH_PROF_BLDR_TCAM:
*blk = ICE_BLK_RSS;
*tcam = true;
break;
case ICE_AQC_RES_TYPE_QHASH_PROF_BLDR_TCAM:
*blk = ICE_BLK_PE;
*tcam = true;
break;
case ICE_AQC_RES_TYPE_SWITCH_PROF_BLDR_PROFID:
*blk = ICE_BLK_SW;
break;
case ICE_AQC_RES_TYPE_ACL_PROF_BLDR_PROFID:
*blk = ICE_BLK_ACL;
break;
case ICE_AQC_RES_TYPE_FD_PROF_BLDR_PROFID:
*blk = ICE_BLK_FD;
break;
case ICE_AQC_RES_TYPE_HASH_PROF_BLDR_PROFID:
*blk = ICE_BLK_RSS;
break;
case ICE_AQC_RES_TYPE_QHASH_PROF_BLDR_PROFID:
*blk = ICE_BLK_PE;
break;
default:
return ICE_ERR_PARAM;
}
return ICE_SUCCESS;
}
/**
* ice_alloc_res_workaround
* @hw: pointer to the hw struct
* @type: type of resource
* @num: number of resources to allocate
* @res: pointer to array that will receive the resources
*/
static enum ice_status
ice_alloc_res_workaround(struct ice_hw *hw, u16 type, u16 num, u16 *res)
{
enum ice_block blk;
u16 count = 0;
bool tcam;
u16 first;
u16 last;
u16 max;
u16 i;
/* Number of PFs we support with this workaround */
#define ICE_WA_PF_COUNT 4
#define ICE_WA_1ST_TCAM 4
#define ICE_WA_1ST_FV 4
/* Only allow our supported PFs */
if (hw->pf_id >= ICE_WA_PF_COUNT)
return ICE_ERR_AQ_ERROR;
if (ice_workaround_get_res_blk(type, &blk, &tcam))
return ICE_ERR_AQ_ERROR;
if (tcam) {
/* range of entries based on PF */
max = hw->blk[blk].prof.count / ICE_WA_PF_COUNT;
first = max * hw->pf_id;
last = first + max;
/* Profile IDs - start at non-zero index for PROF ID TCAM table
* The first few entries are for bypass, default and errors
* (only relevant for PF 0)
*/
first += hw->pf_id ? 0 : ICE_WA_1ST_TCAM;
for (i = first; i < last && count < num; i++) {
if (!hw->blk[blk].prof.resource_used_hack[i]) {
res[count++] = i;
hw->blk[blk].prof.resource_used_hack[i] = true;
}
}
/* handle failure case */
if (count < num) {
for (i = 0; i < count; i++) {
hw->blk[blk].prof.resource_used_hack[res[i]] =
false;
res[i] = 0;
}
return ICE_ERR_AQ_ERROR;
}
} else {
/* range of entries based on PF */
max = hw->blk[blk].es.count / ICE_WA_PF_COUNT;
first = max * hw->pf_id;
last = first + max;
/* FV index - start at non-zero index for Field vector table
* The first few entries are for bypass, default and errors
* (only relevant for PF 0)
*/
first += hw->pf_id ? 0 : ICE_WA_1ST_FV;
for (i = first; i < last && count < num; i++) {
if (!hw->blk[blk].es.resource_used_hack[i]) {
res[count++] = i;
hw->blk[blk].es.resource_used_hack[i] = true;
}
}
/* handle failure case */
if (count < num) {
for (i = 0; i < count; i++) {
hw->blk[blk].es.resource_used_hack[res[i]] =
false;
res[i] = 0;
}
return ICE_ERR_AQ_ERROR;
}
}
return ICE_SUCCESS;
}
/**
* ice_free_res_workaround
* @hw: pointer to the hw struct
* @type: type of resource to free
* @num: number of resources
* @res: array of resource ids to free
*/
static enum ice_status
ice_free_res_workaround(struct ice_hw *hw, u16 type, u16 num, u16 *res)
{
enum ice_block blk;
bool tcam = false;
u16 i;
if (ice_workaround_get_res_blk(type, &blk, &tcam))
return ICE_ERR_AQ_ERROR;
if (tcam) {
/* TCAM entries */
for (i = 0; i < num; i++) {
if (res[i] < hw->blk[blk].prof.count) {
u16 idx = res[i];
ice_free_hw_res(hw, type, 1, &idx);
hw->blk[blk].prof.resource_used_hack[res[i]] =
false;
}
}
} else {
/* Profile IDs */
for (i = 0; i < num; i++) {
if (res[i] < hw->blk[blk].es.count) {
u16 idx = res[i];
ice_free_hw_res(hw, type, 1, &idx);
hw->blk[blk].es.resource_used_hack[res[i]] =
false;
}
}
}
return ICE_SUCCESS;
}
/**
* ice_alloc_tcam_ent - allocate hardware TCAM entry
* @hw: pointer to the HW struct
@ -2745,7 +2552,7 @@ ice_alloc_tcam_ent(struct ice_hw *hw, enum ice_block blk, u16 *tcam_idx)
if (!ice_tcam_ent_rsrc_type(blk, &res_type))
return ICE_ERR_PARAM;
return ice_alloc_res_workaround(hw, res_type, 1, tcam_idx);
return ice_alloc_hw_res(hw, res_type, 1, true, tcam_idx);
}
/**
@ -2764,7 +2571,7 @@ ice_free_tcam_ent(struct ice_hw *hw, enum ice_block blk, u16 tcam_idx)
if (!ice_tcam_ent_rsrc_type(blk, &res_type))
return ICE_ERR_PARAM;
return ice_free_res_workaround(hw, res_type, 1, &tcam_idx);
return ice_free_hw_res(hw, res_type, 1, &tcam_idx);
}
/**
@ -2786,7 +2593,7 @@ ice_alloc_prof_id(struct ice_hw *hw, enum ice_block blk, u8 *prof_id)
if (!ice_prof_id_rsrc_type(blk, &res_type))
return ICE_ERR_PARAM;
status = ice_alloc_res_workaround(hw, res_type, 1, &get_prof);
status = ice_alloc_hw_res(hw, res_type, 1, false, &get_prof);
if (!status)
*prof_id = (u8)get_prof;
@ -2810,15 +2617,7 @@ ice_free_prof_id(struct ice_hw *hw, enum ice_block blk, u8 prof_id)
if (!ice_prof_id_rsrc_type(blk, &res_type))
return ICE_ERR_PARAM;
return ice_free_res_workaround(hw, res_type, 1, &tmp_prof_id);
/* The following code is a WORKAROUND until DCR 076 is available.
* DCR 076 - Update to Profile ID TCAM Resource Allocation
*
* Once the DCR 076 changes are available in FW, this code can be
* restored. Original code:
*
* return ice_free_res(hw, res_type, 1, &tmp_prof_id);
*/
return ice_free_hw_res(hw, res_type, 1, &tmp_prof_id);
}
/**
@ -3125,8 +2924,7 @@ static void ice_free_prof_map(struct ice_hw *hw, enum ice_block blk)
LIST_FOR_EACH_ENTRY_SAFE(del, tmp, &hw->blk[blk].es.prof_map,
ice_prof_map, list) {
LIST_DEL(&del->list);
ice_free(hw, del);
ice_rem_prof(hw, blk, del->profile_cookie);
}
}
@ -3168,9 +2966,6 @@ void ice_free_hw_tbls(struct ice_hw *hw)
ice_free(hw, hw->blk[i].prof_redir.t);
ice_free(hw, hw->blk[i].es.t);
ice_free(hw, hw->blk[i].es.ref_count);
ice_free(hw, hw->blk[i].es.resource_used_hack);
ice_free(hw, hw->blk[i].prof.resource_used_hack);
ice_free(hw, hw->blk[i].es.written);
}
@ -3347,18 +3142,6 @@ enum ice_status ice_init_hw_tbls(struct ice_hw *hw)
if (!es->ref_count)
goto err;
es->resource_used_hack = (u8 *)
ice_calloc(hw, hw->blk[i].es.count, sizeof(u8));
if (!es->resource_used_hack)
goto err;
prof->resource_used_hack = (u8 *)ice_calloc(hw, prof->count,
sizeof(u8));
if (!prof->resource_used_hack)
goto err;
INIT_LIST_HEAD(&es->prof_map);
/* Now that tables are allocated, read in package data */
@ -4390,13 +4173,13 @@ enum ice_status ice_rem_prof(struct ice_hw *hw, enum ice_block blk, u64 id)
if (!pmap)
return ICE_ERR_DOES_NOT_EXIST;
status = ice_free_prof_id(hw, blk, pmap->prof_id);
/* remove all flows with this profile */
status = ice_rem_flow_all(hw, blk, pmap->profile_cookie);
if (status)
return status;
/* remove all flows with this profile */
status = ice_rem_flow_all(hw, blk, pmap->profile_cookie);
/* remove profile */
status = ice_free_prof_id(hw, blk, pmap->prof_id);
if (status)
return status;
/* dereference profile, and possibly remove */

View File

@ -507,7 +507,6 @@ struct ice_es {
u8 reverse; /* set to true to reverse FV order */
struct LIST_HEAD_TYPE prof_map;
struct ice_fv_word *t;
u8 *resource_used_hack; /* hack for testing */
};
/* PTYPE Group management */
@ -660,7 +659,6 @@ struct ice_prof_tcam {
u16 max_prof_id;
u8 cdid_bits; /* # cdid bits to use in key, 0, 2, 4, or 8 */
struct ice_prof_tcam_entry *t;
u8 *resource_used_hack;
};
struct ice_prof_redir {