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
此提交包含在:
Hariharan Ramanathan
2023-07-20 08:40:43 +05:30
提交者 Rahul Choudhary
父節點 4c2b8d81e4
當前提交 ab649e0622
共有 4 個檔案被更改,包括 51 行新增9 行删除

查看文件

@@ -6300,7 +6300,7 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
{
uint8_t i, num_pool;
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;
struct dp_soc *soc = pdev->soc;
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)
continue;
num_desc_t = dp_get_updated_tx_desc(soc->ctrl_psoc, i,
num_desc);
num_desc_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;
offset = j % num_desc_per_page;
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
/**
* 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
/**
* 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,
uint32_t num_elem)
{
uint32_t desc_size;
uint32_t desc_size, num_elem_t;
struct dp_tx_desc_pool_s *tx_desc_pool;
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));
tx_desc_pool = &((soc)->tx_desc[(pool_id)]);
tx_desc_pool->desc_pages.page_size = DP_BLOCKMEM_SIZE;
dp_desc_multi_pages_mem_alloc(soc, QDF_DP_TX_DESC_TYPE,
&tx_desc_pool->desc_pages,
desc_size, num_elem,
desc_size, num_elem_t,
0, true);
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 */
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)) {
dp_err("failed to allocate arch specific descriptors");
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)
{
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));
num_elem_t = dp_get_updated_tx_desc(soc->ctrl_psoc, pool_id, num_elem);
tx_desc_pool = &soc->tx_desc[pool_id];
if (qdf_mem_multi_page_link(soc->osdev,
&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");
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;
/* Set unique IDs for each Tx descriptor */
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");
return QDF_STATUS_E_FAULT;
}
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);
return QDF_STATUS_SUCCESS;

查看文件

@@ -726,6 +726,13 @@
WLAN_CFG_NUM_TX_DESC, \
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 \
CFG_INI_UINT("dp_tx_spl_desc", \
WLAN_CFG_NUM_TX_SPL_DESC_MIN, \
@@ -2011,6 +2018,7 @@
CFG(CFG_DP_NSS_REO_DEST_RINGS) \
CFG(CFG_DP_NSS_TCL_DATA_RINGS) \
CFG(CFG_DP_TX_DESC) \
CFG(CFG_DP_TX_DESC_POOL_3) \
CFG(CFG_DP_TX_SPL_DESC) \
CFG(CFG_DP_TX_EXT_DESC) \
CFG(CFG_DP_TX_EXT_DESC_POOLS) \