qcacld-3.0: Add prealloc pools for direct link consistent memory

Add multi page prealloc pools for TX buffers and CE
TX buffers for direct link datapath.

Change-Id: I8c8be42b0530de39293ad8e45f47e16f90ea7767
CRs-Fixed: 3490109
This commit is contained in:
Yeshwanth Sriram Guntuka
2023-05-04 13:20:18 +05:30
committed by Madan Koyyalamudi
parent d807118e9c
commit f1620fb98b
2 changed files with 128 additions and 11 deletions

View File

@@ -344,6 +344,9 @@ static struct dp_consistent_prealloc g_dp_consistent_allocs[] = {
#define NON_CACHEABLE 0
#define CACHEABLE 1
#define TX_DIRECT_LINK_CE_BUF_PAGES 4
#define TX_DIRECT_LINK_BUF_PAGES 190
static struct dp_multi_page_prealloc g_dp_multi_page_allocs[] = {
/* 4 TX DESC pools */
{DP_TX_DESC_TYPE, TX_DESC_SIZE, 0, 0, CACHEABLE, { 0 } },
@@ -409,6 +412,12 @@ static struct dp_multi_page_prealloc g_dp_multi_page_allocs[] = {
((DP_TX_RX_DESC_MAX_NUM * sizeof(uint64_t)) / qdf_page_size),
0, NON_CACHEABLE, { 0 } },
#endif
#ifdef FEATURE_DIRECT_LINK
{DP_TX_DIRECT_LINK_CE_BUF_TYPE, qdf_page_size,
TX_DIRECT_LINK_CE_BUF_PAGES, 0, NON_CACHEABLE, { 0 } },
{DP_TX_DIRECT_LINK_BUF_TYPE, qdf_page_size,
TX_DIRECT_LINK_BUF_PAGES, 0, NON_CACHEABLE, { 0 } },
#endif
};
static struct dp_consistent_prealloc_unaligned

View File

@@ -21,6 +21,7 @@
#include "pld_common.h"
#include "wlan_objmgr_psoc_obj.h"
#include <qdf_mem.h>
#include "wlan_dp_prealloc.h"
static struct dp_direct_link_wfds_context *gp_dl_wfds_ctx;
@@ -368,14 +369,124 @@ dp_wfds_event_post(struct dp_direct_link_wfds_context *dl_wfds,
return QDF_STATUS_SUCCESS;
}
#ifdef DP_MEM_PRE_ALLOC
/**
* dp_wfds_get_desc_type_from_mem_arena() - Get descriptor type for the memory
* arena
* @mem_arena: memory arena
*
* Return: DP descriptor type
*/
static uint32_t
dp_wfds_get_desc_type_from_mem_arena(enum wlan_qmi_wfds_mem_arenas mem_arena)
{
switch (mem_arena) {
case QMI_WFDS_MEM_ARENA_TX_BUFFERS:
return DP_TX_DIRECT_LINK_BUF_TYPE;
case QMI_WFDS_MEM_ARENA_CE_TX_MSG_BUFFERS:
return DP_TX_DIRECT_LINK_CE_BUF_TYPE;
default:
dp_debug("No desc type for mem arena %d", mem_arena);
qdf_assert(0);
return DP_DESC_TYPE_MAX;
}
}
/**
* dp_wfds_alloc_mem_arena() - Allocate memory for the arena
* @dl_wfds: Direct Link QMI context
* @mem_arena: memory arena
* @entry_size: element size
* @num_entries: number of elements
*
* Return: None
*/
static void
dp_wfds_alloc_mem_arena(struct dp_direct_link_wfds_context *dl_wfds,
enum wlan_qmi_wfds_mem_arenas mem_arena,
uint16_t entry_size, uint16_t num_entries)
{
qdf_device_t qdf_ctx = dl_wfds->direct_link_ctx->dp_ctx->qdf_dev;
uint32_t desc_type;
uint32_t elem_per_page;
uint32_t num_pages;
desc_type = dp_wfds_get_desc_type_from_mem_arena(mem_arena);
if (desc_type != DP_DESC_TYPE_MAX) {
elem_per_page = qdf_page_size / entry_size;
num_pages = num_entries / elem_per_page;
if (num_entries % elem_per_page)
num_pages++;
dp_prealloc_get_multi_pages(desc_type, qdf_page_size,
num_pages,
&dl_wfds->mem_arena_pages[mem_arena],
false);
}
if (!dl_wfds->mem_arena_pages[mem_arena].num_pages)
qdf_mem_multi_pages_alloc(qdf_ctx,
&dl_wfds->mem_arena_pages[mem_arena],
entry_size, num_entries, 0, false);
}
/**
* dp_wfds_free_mem_arena() - Free memory for the arena
* @dl_wfds: Direct Link QMI context
* @mem_arena: memory arena
*
* Return: None
*/
static void
dp_wfds_free_mem_arena(struct dp_direct_link_wfds_context *dl_wfds,
enum wlan_qmi_wfds_mem_arenas mem_arena)
{
qdf_device_t qdf_ctx = dl_wfds->direct_link_ctx->dp_ctx->qdf_dev;
uint32_t desc_type;
if (dl_wfds->mem_arena_pages[mem_arena].is_mem_prealloc) {
desc_type = dp_wfds_get_desc_type_from_mem_arena(mem_arena);
dp_prealloc_put_multi_pages(desc_type,
&dl_wfds->mem_arena_pages[mem_arena]);
} else {
qdf_mem_multi_pages_free(qdf_ctx,
&dl_wfds->mem_arena_pages[mem_arena],
0, false);
}
}
#else
static void
dp_wfds_alloc_mem_arena(struct dp_direct_link_wfds_context *dl_wfds,
enum wlan_qmi_wfds_mem_arenas mem_arena,
uint16_t entry_size, uint16_t num_entries)
{
qdf_device_t qdf_ctx = dl_wfds->direct_link_ctx->dp_ctx->qdf_dev;
qdf_mem_multi_pages_alloc(qdf_ctx,
&dl_wfds->mem_arena_pages[mem_arena],
entry_size, num_entries, 0, false);
}
static void
dp_wfds_free_mem_arena(struct dp_direct_link_wfds_context *dl_wfds,
enum wlan_qmi_wfds_mem_arenas mem_arena)
{
qdf_device_t qdf_ctx = dl_wfds->direct_link_ctx->dp_ctx->qdf_dev;
qdf_mem_multi_pages_free(qdf_ctx,
&dl_wfds->mem_arena_pages[mem_arena],
0, false);
}
#endif
void
dp_wfds_handle_request_mem_ind(struct wlan_qmi_wfds_mem_ind_msg *mem_msg)
{
struct dp_direct_link_wfds_context *dl_wfds = gp_dl_wfds_ctx;
qdf_device_t qdf_ctx = dl_wfds->direct_link_ctx->dp_ctx->qdf_dev;
uint8_t i;
if (!dl_wfds || !qdf_ctx)
if (!dl_wfds)
return;
dp_debug("Received request mem indication from QMI server");
@@ -391,17 +502,14 @@ dp_wfds_handle_request_mem_ind(struct wlan_qmi_wfds_mem_ind_msg *mem_msg)
if (i == QMI_WFDS_MEM_ARENA_CE_RX_MSG_BUFFERS)
continue;
qdf_mem_multi_pages_alloc(qdf_ctx,
&dl_wfds->mem_arena_pages[i],
mem_msg->mem_arena_info[i].entry_size,
mem_msg->mem_arena_info[i].num_entries,
0, false);
dp_wfds_alloc_mem_arena(dl_wfds, i,
mem_msg->mem_arena_info[i].entry_size,
mem_msg->mem_arena_info[i].num_entries);
if (!dl_wfds->mem_arena_pages[i].num_pages) {
while (--i >= 0 &&
dl_wfds->mem_arena_pages[i].num_pages)
qdf_mem_multi_pages_free(qdf_ctx,
&dl_wfds->mem_arena_pages[i],
0, false);
dp_wfds_free_mem_arena(dl_wfds, i);
qdf_mem_free(dl_wfds->mem_arena_pages);
dl_wfds->mem_arena_pages = NULL;
@@ -503,7 +611,7 @@ void dp_wfds_del_server(void)
mp_info->dma_pages[page_idx].page_p_addr,
mp_info->page_size);
qdf_mem_multi_pages_free(qdf_ctx, mp_info, 0, false);
dp_wfds_free_mem_arena(dl_wfds, i);
}
qdf_mem_free(dl_wfds->mem_arena_pages);