aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTuomas Taipale <tuomas.taipale@nokia.com>2023-06-26 10:40:06 +0000
committerPetri Savolainen <petri.savolainen@nokia.com>2023-07-11 15:11:12 +0300
commit3a8f63d29bab98a706a5fdfde2ec01ac616ce01e (patch)
tree4ea1dab3515506fb3ea95af03bf704f02db472e6
parentf2fca4ddfa0ad5a293b4f222c1d2cb0af4274e1c (diff)
linux-gen: implement pool user area initialization
Add pool, external pool and dma specific implementations for user area initialization. Signed-off-by: Tuomas Taipale <tuomas.taipale@nokia.com> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
-rw-r--r--platform/linux-generic/odp_dma.c25
-rw-r--r--platform/linux-generic/odp_pool.c25
2 files changed, 38 insertions, 12 deletions
diff --git a/platform/linux-generic/odp_dma.c b/platform/linux-generic/odp_dma.c
index eef7e5c02..8ac18260c 100644
--- a/platform/linux-generic/odp_dma.c
+++ b/platform/linux-generic/odp_dma.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2021-2022, Nokia
+/* Copyright (c) 2021-2023, Nokia
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -99,11 +99,12 @@ int odp_dma_capability(odp_dma_capability_t *capa)
capa->queue_type_sched = 1;
capa->queue_type_plain = 1;
- capa->pool.max_pools = _odp_dma_glb->pool_capa.buf.max_pools;
- capa->pool.max_num = _odp_dma_glb->pool_capa.buf.max_num;
- capa->pool.max_uarea_size = _odp_dma_glb->pool_capa.buf.max_uarea_size;
- capa->pool.min_cache_size = _odp_dma_glb->pool_capa.buf.min_cache_size;
- capa->pool.max_cache_size = _odp_dma_glb->pool_capa.buf.max_cache_size;
+ capa->pool.max_pools = _odp_dma_glb->pool_capa.buf.max_pools;
+ capa->pool.max_num = _odp_dma_glb->pool_capa.buf.max_num;
+ capa->pool.max_uarea_size = _odp_dma_glb->pool_capa.buf.max_uarea_size;
+ capa->pool.uarea_persistence = _odp_dma_glb->pool_capa.buf.uarea_persistence;
+ capa->pool.min_cache_size = _odp_dma_glb->pool_capa.buf.min_cache_size;
+ capa->pool.max_cache_size = _odp_dma_glb->pool_capa.buf.max_cache_size;
return 0;
}
@@ -738,11 +739,13 @@ odp_pool_t odp_dma_pool_create(const char *name, const odp_dma_pool_param_t *dma
}
odp_pool_param_init(&pool_param);
- pool_param.type = ODP_POOL_BUFFER;
- pool_param.buf.num = num;
- pool_param.buf.uarea_size = uarea_size;
- pool_param.buf.cache_size = cache_size;
- pool_param.buf.size = sizeof(odp_dma_result_t);
+ pool_param.type = ODP_POOL_BUFFER;
+ pool_param.uarea_init.init_fn = dma_pool_param->uarea_init.init_fn;
+ pool_param.uarea_init.args = dma_pool_param->uarea_init.args;
+ pool_param.buf.num = num;
+ pool_param.buf.uarea_size = uarea_size;
+ pool_param.buf.cache_size = cache_size;
+ pool_param.buf.size = sizeof(odp_dma_result_t);
pool = _odp_pool_create(name, &pool_param, ODP_POOL_DMA_COMPL);
diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c
index 672b92c02..e7b2398de 100644
--- a/platform/linux-generic/odp_pool.c
+++ b/platform/linux-generic/odp_pool.c
@@ -604,6 +604,14 @@ static void init_buffers(pool_t *pool)
ring_ptr_enq(ring, mask, event_hdr);
}
pool->skipped_blocks = skipped_blocks;
+
+ if (pool->uarea_size && pool->params.uarea_init.init_fn) {
+ for (uint32_t i = 0; i < pool->num; i++) {
+ uarea = &pool->uarea_base_addr[i * pool->uarea_size];
+ pool->params.uarea_init.init_fn(uarea, pool->param_uarea_size,
+ pool->params.uarea_init.args, i);
+ }
+ }
}
static bool shm_is_from_huge_pages(odp_shm_t shm)
@@ -1479,6 +1487,7 @@ int odp_pool_capability(odp_pool_capability_t *capa)
capa->buf.max_size = MAX_SIZE;
capa->buf.max_num = CONFIG_POOL_MAX_NUM;
capa->buf.max_uarea_size = MAX_UAREA_SIZE;
+ capa->buf.uarea_persistence = true;
capa->buf.min_cache_size = 0;
capa->buf.max_cache_size = CONFIG_POOL_CACHE_MAX_SIZE;
capa->buf.stats.all = supported_stats.all;
@@ -1495,6 +1504,7 @@ int odp_pool_capability(odp_pool_capability_t *capa)
capa->pkt.min_seg_len = CONFIG_PACKET_SEG_LEN_MIN;
capa->pkt.max_seg_len = max_seg_len;
capa->pkt.max_uarea_size = MAX_UAREA_SIZE;
+ capa->pkt.uarea_persistence = true;
capa->pkt.min_cache_size = 0;
capa->pkt.max_cache_size = CONFIG_POOL_CACHE_MAX_SIZE;
capa->pkt.stats.all = supported_stats.all;
@@ -1503,6 +1513,7 @@ int odp_pool_capability(odp_pool_capability_t *capa)
capa->tmo.max_pools = max_pools;
capa->tmo.max_num = CONFIG_POOL_MAX_NUM;
capa->tmo.max_uarea_size = MAX_UAREA_SIZE;
+ capa->tmo.uarea_persistence = true;
capa->tmo.min_cache_size = 0;
capa->tmo.max_cache_size = CONFIG_POOL_CACHE_MAX_SIZE;
capa->tmo.stats.all = supported_stats.all;
@@ -1512,6 +1523,7 @@ int odp_pool_capability(odp_pool_capability_t *capa)
capa->vector.max_num = CONFIG_POOL_MAX_NUM;
capa->vector.max_size = CONFIG_PACKET_VECTOR_MAX_SIZE;
capa->vector.max_uarea_size = MAX_UAREA_SIZE;
+ capa->vector.uarea_persistence = true;
capa->vector.min_cache_size = 0;
capa->vector.max_cache_size = CONFIG_POOL_CACHE_MAX_SIZE;
capa->vector.stats.all = supported_stats.all;
@@ -1869,6 +1881,7 @@ int odp_pool_ext_capability(odp_pool_type_t type, odp_pool_ext_capability_t *cap
capa->pkt.max_headroom_size = CONFIG_PACKET_HEADROOM;
capa->pkt.max_segs_per_pkt = PKT_MAX_SEGS;
capa->pkt.max_uarea_size = MAX_UAREA_SIZE;
+ capa->pkt.uarea_persistence = true;
return 0;
}
@@ -2096,8 +2109,18 @@ int odp_pool_ext_populate(odp_pool_t pool_hdl, void *buf[], uint32_t buf_size, u
pool->base_addr = min_addr;
pool->max_addr = max_addr;
- if (flags & ODP_POOL_POPULATE_DONE)
+ if (flags & ODP_POOL_POPULATE_DONE) {
pool->max_addr = max_addr + buf_size - 1;
+ if (pool->uarea_size && pool->ext_param.uarea_init.init_fn) {
+ for (i = 0; i < pool->num_populated; i++) {
+ uarea = &pool->uarea_base_addr[i * pool->uarea_size];
+ pool->ext_param.uarea_init.init_fn(uarea, pool->param_uarea_size,
+ pool->ext_param.uarea_init.args,
+ i);
+ }
+ }
+ }
+
return 0;
}