qcacmn: Featurization of DP_TX_DESC_POOL_OPTIMIZE
1. In lowmem profiles the number of tx_desc in 4th pool is reduced to quarter for memory optimizations. Added new API dp_get_updated_tx_desc which will return the desc value from INI based on the flag DP_TX_DESC_POOL_OPTIMIZE. 2. Changes to introduce new INI to get reduced desc value for 4th tx desc pool. This helps optimize 0.75M per SOC in lowmem profiles. Change-Id: I033fcaeb843019fb03bb77e0d05a3ebf60fa806a CRs-Fixed: 3557483
This commit is contained in:

committed by
Rahul Choudhary

parent
4c2b8d81e4
commit
ab649e0622
@@ -6300,7 +6300,7 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|||||||
{
|
{
|
||||||
uint8_t i, num_pool;
|
uint8_t i, num_pool;
|
||||||
uint32_t j;
|
uint32_t j;
|
||||||
uint32_t num_desc, page_id, offset;
|
uint32_t num_desc, num_desc_t, page_id, offset;
|
||||||
uint16_t num_desc_per_page;
|
uint16_t num_desc_per_page;
|
||||||
struct dp_soc *soc = pdev->soc;
|
struct dp_soc *soc = pdev->soc;
|
||||||
struct dp_tx_desc_s *tx_desc = NULL;
|
struct dp_tx_desc_s *tx_desc = NULL;
|
||||||
@@ -6319,9 +6319,11 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
|
|||||||
if (!tx_desc_pool->desc_pages.cacheable_pages)
|
if (!tx_desc_pool->desc_pages.cacheable_pages)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
num_desc_t = dp_get_updated_tx_desc(soc->ctrl_psoc, i,
|
||||||
|
num_desc);
|
||||||
num_desc_per_page =
|
num_desc_per_page =
|
||||||
tx_desc_pool->desc_pages.num_element_per_page;
|
tx_desc_pool->desc_pages.num_element_per_page;
|
||||||
for (j = 0; j < num_desc; j++) {
|
for (j = 0; j < num_desc_t; j++) {
|
||||||
page_id = j / num_desc_per_page;
|
page_id = j / num_desc_per_page;
|
||||||
offset = j % num_desc_per_page;
|
offset = j % num_desc_per_page;
|
||||||
tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
|
tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
|
||||||
|
@@ -430,6 +430,36 @@ dp_ppeds_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_get_updated_tx_desc() - get updated tx_desc value
|
||||||
|
* @psoc: psoc object
|
||||||
|
* @pool_num: Tx desc pool Id
|
||||||
|
* @current_desc: Current Tx Desc value
|
||||||
|
*
|
||||||
|
* In Lowmem profiles the number of Tx desc in 4th pool is reduced to quarter
|
||||||
|
* for memory optimizations via this flag DP_TX_DESC_POOL_OPTIMIZE
|
||||||
|
*
|
||||||
|
* Return: Updated Tx Desc value
|
||||||
|
*/
|
||||||
|
#ifdef DP_TX_DESC_POOL_OPTIMIZE
|
||||||
|
static inline uint32_t dp_get_updated_tx_desc(struct cdp_ctrl_objmgr_psoc *psoc,
|
||||||
|
uint8_t pool_num,
|
||||||
|
uint32_t current_desc)
|
||||||
|
{
|
||||||
|
if (pool_num == 3)
|
||||||
|
return cfg_get(psoc, CFG_DP_TX_DESC_POOL_3);
|
||||||
|
else
|
||||||
|
return current_desc;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline uint32_t dp_get_updated_tx_desc(struct cdp_ctrl_objmgr_psoc *psoc,
|
||||||
|
uint8_t pool_num,
|
||||||
|
uint32_t current_desc)
|
||||||
|
{
|
||||||
|
return current_desc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DP_TX_EXT_DESC_POOL_OPTIMIZE
|
#ifdef DP_TX_EXT_DESC_POOL_OPTIMIZE
|
||||||
/**
|
/**
|
||||||
* dp_tx_ext_desc_pool_override() - Override tx ext desc pool Id
|
* dp_tx_ext_desc_pool_override() - Override tx ext desc pool Id
|
||||||
|
@@ -118,16 +118,17 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list)
|
|||||||
QDF_STATUS dp_tx_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
|
QDF_STATUS dp_tx_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
|
||||||
uint32_t num_elem)
|
uint32_t num_elem)
|
||||||
{
|
{
|
||||||
uint32_t desc_size;
|
uint32_t desc_size, num_elem_t;
|
||||||
struct dp_tx_desc_pool_s *tx_desc_pool;
|
struct dp_tx_desc_pool_s *tx_desc_pool;
|
||||||
QDF_STATUS status;
|
QDF_STATUS status;
|
||||||
|
|
||||||
|
num_elem_t = dp_get_updated_tx_desc(soc->ctrl_psoc, pool_id, num_elem);
|
||||||
desc_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s));
|
desc_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s));
|
||||||
tx_desc_pool = &((soc)->tx_desc[(pool_id)]);
|
tx_desc_pool = &((soc)->tx_desc[(pool_id)]);
|
||||||
tx_desc_pool->desc_pages.page_size = DP_BLOCKMEM_SIZE;
|
tx_desc_pool->desc_pages.page_size = DP_BLOCKMEM_SIZE;
|
||||||
dp_desc_multi_pages_mem_alloc(soc, QDF_DP_TX_DESC_TYPE,
|
dp_desc_multi_pages_mem_alloc(soc, QDF_DP_TX_DESC_TYPE,
|
||||||
&tx_desc_pool->desc_pages,
|
&tx_desc_pool->desc_pages,
|
||||||
desc_size, num_elem,
|
desc_size, num_elem_t,
|
||||||
0, true);
|
0, true);
|
||||||
|
|
||||||
if (!tx_desc_pool->desc_pages.num_pages) {
|
if (!tx_desc_pool->desc_pages.num_pages) {
|
||||||
@@ -136,7 +137,7 @@ QDF_STATUS dp_tx_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Arch specific TX descriptor allocation */
|
/* Arch specific TX descriptor allocation */
|
||||||
status = soc->arch_ops.dp_tx_desc_pool_alloc(soc, num_elem, pool_id);
|
status = soc->arch_ops.dp_tx_desc_pool_alloc(soc, num_elem_t, pool_id);
|
||||||
if (QDF_IS_STATUS_ERROR(status)) {
|
if (QDF_IS_STATUS_ERROR(status)) {
|
||||||
dp_err("failed to allocate arch specific descriptors");
|
dp_err("failed to allocate arch specific descriptors");
|
||||||
return QDF_STATUS_E_NOMEM;
|
return QDF_STATUS_E_NOMEM;
|
||||||
@@ -164,14 +165,15 @@ QDF_STATUS dp_tx_desc_pool_init(struct dp_soc *soc, uint8_t pool_id,
|
|||||||
uint32_t num_elem)
|
uint32_t num_elem)
|
||||||
{
|
{
|
||||||
struct dp_tx_desc_pool_s *tx_desc_pool;
|
struct dp_tx_desc_pool_s *tx_desc_pool;
|
||||||
uint32_t desc_size;
|
uint32_t desc_size, num_elem_t;
|
||||||
|
|
||||||
desc_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s));
|
desc_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s));
|
||||||
|
|
||||||
|
num_elem_t = dp_get_updated_tx_desc(soc->ctrl_psoc, pool_id, num_elem);
|
||||||
tx_desc_pool = &soc->tx_desc[pool_id];
|
tx_desc_pool = &soc->tx_desc[pool_id];
|
||||||
if (qdf_mem_multi_page_link(soc->osdev,
|
if (qdf_mem_multi_page_link(soc->osdev,
|
||||||
&tx_desc_pool->desc_pages,
|
&tx_desc_pool->desc_pages,
|
||||||
desc_size, num_elem, true)) {
|
desc_size, num_elem_t, true)) {
|
||||||
dp_err("invalid tx desc allocation -overflow num link");
|
dp_err("invalid tx desc allocation -overflow num link");
|
||||||
return QDF_STATUS_E_FAULT;
|
return QDF_STATUS_E_FAULT;
|
||||||
}
|
}
|
||||||
@@ -180,14 +182,14 @@ QDF_STATUS dp_tx_desc_pool_init(struct dp_soc *soc, uint8_t pool_id,
|
|||||||
*tx_desc_pool->desc_pages.cacheable_pages;
|
*tx_desc_pool->desc_pages.cacheable_pages;
|
||||||
/* Set unique IDs for each Tx descriptor */
|
/* Set unique IDs for each Tx descriptor */
|
||||||
if (QDF_STATUS_SUCCESS != soc->arch_ops.dp_tx_desc_pool_init(
|
if (QDF_STATUS_SUCCESS != soc->arch_ops.dp_tx_desc_pool_init(
|
||||||
soc, num_elem, pool_id)) {
|
soc, num_elem_t, pool_id)) {
|
||||||
dp_err("initialization per target failed");
|
dp_err("initialization per target failed");
|
||||||
return QDF_STATUS_E_FAULT;
|
return QDF_STATUS_E_FAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
tx_desc_pool->elem_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s));
|
tx_desc_pool->elem_size = DP_TX_DESC_SIZE(sizeof(struct dp_tx_desc_s));
|
||||||
|
|
||||||
dp_tx_desc_pool_counter_initialize(tx_desc_pool, num_elem);
|
dp_tx_desc_pool_counter_initialize(tx_desc_pool, num_elem_t);
|
||||||
TX_DESC_LOCK_CREATE(&tx_desc_pool->lock);
|
TX_DESC_LOCK_CREATE(&tx_desc_pool->lock);
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
|
@@ -726,6 +726,13 @@
|
|||||||
WLAN_CFG_NUM_TX_DESC, \
|
WLAN_CFG_NUM_TX_DESC, \
|
||||||
CFG_VALUE_OR_DEFAULT, "DP Tx Descriptors")
|
CFG_VALUE_OR_DEFAULT, "DP Tx Descriptors")
|
||||||
|
|
||||||
|
#define CFG_DP_TX_DESC_POOL_3 \
|
||||||
|
CFG_INI_UINT("dp_tx_desc_pool_3", \
|
||||||
|
WLAN_CFG_NUM_TX_DESC_MIN, \
|
||||||
|
WLAN_CFG_NUM_TX_DESC_MAX, \
|
||||||
|
WLAN_CFG_NUM_TX_DESC, \
|
||||||
|
CFG_VALUE_OR_DEFAULT, "DP Tx Descriptor of 3rd pool")
|
||||||
|
|
||||||
#define CFG_DP_TX_SPL_DESC \
|
#define CFG_DP_TX_SPL_DESC \
|
||||||
CFG_INI_UINT("dp_tx_spl_desc", \
|
CFG_INI_UINT("dp_tx_spl_desc", \
|
||||||
WLAN_CFG_NUM_TX_SPL_DESC_MIN, \
|
WLAN_CFG_NUM_TX_SPL_DESC_MIN, \
|
||||||
@@ -2011,6 +2018,7 @@
|
|||||||
CFG(CFG_DP_NSS_REO_DEST_RINGS) \
|
CFG(CFG_DP_NSS_REO_DEST_RINGS) \
|
||||||
CFG(CFG_DP_NSS_TCL_DATA_RINGS) \
|
CFG(CFG_DP_NSS_TCL_DATA_RINGS) \
|
||||||
CFG(CFG_DP_TX_DESC) \
|
CFG(CFG_DP_TX_DESC) \
|
||||||
|
CFG(CFG_DP_TX_DESC_POOL_3) \
|
||||||
CFG(CFG_DP_TX_SPL_DESC) \
|
CFG(CFG_DP_TX_SPL_DESC) \
|
||||||
CFG(CFG_DP_TX_EXT_DESC) \
|
CFG(CFG_DP_TX_EXT_DESC) \
|
||||||
CFG(CFG_DP_TX_EXT_DESC_POOLS) \
|
CFG(CFG_DP_TX_EXT_DESC_POOLS) \
|
||||||
|
Reference in New Issue
Block a user