net/bnxt: add TruFlow core identifier

- Add TruFlow Identifier resource support
- Add TruFlow public API for Identifier resources.
- Add support code and stack for Identifier resource allocation control.

Signed-off-by: Farah Smith <farah.smith@broadcom.com>
Reviewed-by: Randy Schacher <stuart.schacher@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
This commit is contained in:
Farah Smith 2020-04-15 13:48:46 +05:30 committed by Ferruh Yigit
parent 4943fad64c
commit 6cf2f95d4d
3 changed files with 224 additions and 0 deletions

View File

@ -284,3 +284,159 @@ tf_close_session(struct tf *tfp)
return rc_close;
}
/** allocate identifier resource
*
* Returns success or failure code.
*/
int tf_alloc_identifier(struct tf *tfp,
struct tf_alloc_identifier_parms *parms)
{
struct bitalloc *session_pool;
struct tf_session *tfs;
int id;
int rc;
if (parms == NULL || tfp == NULL)
return -EINVAL;
if (tfp->session == NULL || tfp->session->core_data == NULL) {
PMD_DRV_LOG(ERR, "%s: session error\n",
tf_dir_2_str(parms->dir));
return -EINVAL;
}
tfs = (struct tf_session *)(tfp->session->core_data);
switch (parms->ident_type) {
case TF_IDENT_TYPE_L2_CTXT:
TF_RM_GET_POOLS(tfs, parms->dir, &session_pool,
TF_L2_CTXT_REMAP_POOL_NAME,
rc);
break;
case TF_IDENT_TYPE_PROF_FUNC:
TF_RM_GET_POOLS(tfs, parms->dir, &session_pool,
TF_PROF_FUNC_POOL_NAME,
rc);
break;
case TF_IDENT_TYPE_EM_PROF:
TF_RM_GET_POOLS(tfs, parms->dir, &session_pool,
TF_EM_PROF_ID_POOL_NAME,
rc);
break;
case TF_IDENT_TYPE_WC_PROF:
TF_RM_GET_POOLS(tfs, parms->dir, &session_pool,
TF_WC_TCAM_PROF_ID_POOL_NAME,
rc);
break;
case TF_IDENT_TYPE_L2_FUNC:
PMD_DRV_LOG(ERR, "%s: unsupported %s\n",
tf_dir_2_str(parms->dir),
tf_ident_2_str(parms->ident_type));
rc = -EOPNOTSUPP;
break;
default:
PMD_DRV_LOG(ERR, "%s: %s\n",
tf_dir_2_str(parms->dir),
tf_ident_2_str(parms->ident_type));
rc = -EINVAL;
break;
}
if (rc) {
PMD_DRV_LOG(ERR, "%s: identifier pool %s failure\n",
tf_dir_2_str(parms->dir),
tf_ident_2_str(parms->ident_type));
return rc;
}
id = ba_alloc(session_pool);
if (id == BA_FAIL) {
PMD_DRV_LOG(ERR, "%s: %s: No resource available\n",
tf_dir_2_str(parms->dir),
tf_ident_2_str(parms->ident_type));
return -ENOMEM;
}
parms->id = id;
return 0;
}
/** free identifier resource
*
* Returns success or failure code.
*/
int tf_free_identifier(struct tf *tfp,
struct tf_free_identifier_parms *parms)
{
struct bitalloc *session_pool;
int rc;
int ba_rc;
struct tf_session *tfs;
if (parms == NULL || tfp == NULL)
return -EINVAL;
if (tfp->session == NULL || tfp->session->core_data == NULL) {
PMD_DRV_LOG(ERR, "%s: Session error\n",
tf_dir_2_str(parms->dir));
return -EINVAL;
}
tfs = (struct tf_session *)(tfp->session->core_data);
switch (parms->ident_type) {
case TF_IDENT_TYPE_L2_CTXT:
TF_RM_GET_POOLS(tfs, parms->dir, &session_pool,
TF_L2_CTXT_REMAP_POOL_NAME,
rc);
break;
case TF_IDENT_TYPE_PROF_FUNC:
TF_RM_GET_POOLS(tfs, parms->dir, &session_pool,
TF_PROF_FUNC_POOL_NAME,
rc);
break;
case TF_IDENT_TYPE_EM_PROF:
TF_RM_GET_POOLS(tfs, parms->dir, &session_pool,
TF_EM_PROF_ID_POOL_NAME,
rc);
break;
case TF_IDENT_TYPE_WC_PROF:
TF_RM_GET_POOLS(tfs, parms->dir, &session_pool,
TF_WC_TCAM_PROF_ID_POOL_NAME,
rc);
break;
case TF_IDENT_TYPE_L2_FUNC:
PMD_DRV_LOG(ERR, "%s: unsupported %s\n",
tf_dir_2_str(parms->dir),
tf_ident_2_str(parms->ident_type));
rc = -EOPNOTSUPP;
break;
default:
PMD_DRV_LOG(ERR, "%s: invalid %s\n",
tf_dir_2_str(parms->dir),
tf_ident_2_str(parms->ident_type));
rc = -EINVAL;
break;
}
if (rc) {
PMD_DRV_LOG(ERR, "%s: %s Identifier pool access failed\n",
tf_dir_2_str(parms->dir),
tf_ident_2_str(parms->ident_type));
return rc;
}
ba_rc = ba_inuse(session_pool, (int)parms->id);
if (ba_rc == BA_FAIL || ba_rc == BA_ENTRY_FREE) {
PMD_DRV_LOG(ERR, "%s: %s: Entry %d already free",
tf_dir_2_str(parms->dir),
tf_ident_2_str(parms->ident_type),
parms->id);
return -EINVAL;
}
ba_free(session_pool, (int)parms->id);
return 0;
}

View File

@ -402,6 +402,61 @@ enum tf_identifier_type {
TF_IDENT_TYPE_L2_FUNC
};
/** tf_alloc_identifier parameter definition
*/
struct tf_alloc_identifier_parms {
/**
* [in] receive or transmit direction
*/
enum tf_dir dir;
/**
* [in] Identifier type
*/
enum tf_identifier_type ident_type;
/**
* [out] Identifier allocated
*/
uint16_t id;
};
/** tf_free_identifier parameter definition
*/
struct tf_free_identifier_parms {
/**
* [in] receive or transmit direction
*/
enum tf_dir dir;
/**
* [in] Identifier type
*/
enum tf_identifier_type ident_type;
/**
* [in] ID to free
*/
uint16_t id;
};
/** allocate identifier resource
*
* TruFlow core will allocate a free id from the per identifier resource type
* pool reserved for the session during tf_open(). No firmware is involved.
*
* Returns success or failure code.
*/
int tf_alloc_identifier(struct tf *tfp,
struct tf_alloc_identifier_parms *parms);
/** free identifier resource
*
* TruFlow core will return an id back to the per identifier resource type pool
* reserved for the session. No firmware is involved. During tf_close, the
* complete pool is returned to the firmware.
*
* Returns success or failure code.
*/
int tf_free_identifier(struct tf *tfp,
struct tf_free_identifier_parms *parms);
/**
* TCAM table type
*/

View File

@ -93,6 +93,19 @@
tfp_le_to_cpu_16(response.element ## _stride); \
} while (0)
/**
* This is the MAX data we can transport across regular HWRM
*/
#define TF_PCI_BUF_SIZE_MAX 88
/**
* If data bigger than TF_PCI_BUF_SIZE_MAX then use DMA method
*/
struct tf_msg_dma_buf {
void *va_addr;
uint64_t pa_addr;
};
/**
* Sends session open request to TF Firmware
*/