@@ -16,6 +16,7 @@ extern "C" {
#include <odp_module.h>
#include <odp/api/packet_io.h>
+#include <odp/drv/shm.h>
/* ODP packet IO operations subsystem declaration */
ODP_SUBSYSTEM_DECLARE(pktio_ops);
@@ -88,10 +89,40 @@ typedef ODP_MODULE_CLASS(pktio_ops) {
/* Maximum size of pktio specific ops data.*/
#define ODP_PKTIO_ODPS_DATA_MAX_SIZE 80000
+/* Pktio ops data pool */
+#define ODP_PKTIO_OPS_DATA_POOL_SIZE 160000
+#define ODP_PKTIO_OPS_DATA_POOL_NAME "ODP_PKTIO_OPS_DATA"
+
/* Extract pktio ops data from pktio entry structure */
#define odp_ops_data(_p, _mod) \
((pktio_ops_ ## _mod ## _data_t *)(uintptr_t)_p->s.ops_data)
+#define odp_ops_data_alloc(_p, _mod) \
+({ \
+ odpdrv_shm_pool_t _pool = ODPDRV_SHM_POOL_INVALID; \
+ uint64_t _size = sizeof(pktio_ops_ ## _mod ## _data_t); \
+ \
+ _p->s.ops_data = NULL; \
+ _pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME); \
+ if (_pool != ODPDRV_SHM_POOL_INVALID) \
+ _p->s.ops_data = odpdrv_shm_pool_alloc(_pool, _size); \
+ \
+ ((pktio_ops_ ## _mod ## _data_t *)_p->s.ops_data); \
+})
+
+#define odp_ops_data_free(_p) \
+({ \
+ int _result = -1; \
+ odpdrv_shm_pool_t _pool = ODPDRV_SHM_POOL_INVALID; \
+ \
+ _pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME); \
+ if (_pool != ODPDRV_SHM_POOL_INVALID) { \
+ odpdrv_shm_pool_free(_pool, _p->s.ops_data); \
+ _result = 0; \
+ } \
+ _result; \
+})
+
#ifdef __cplusplus
}
#endif
@@ -15,9 +15,55 @@
ODP_SUBSYSTEM_DEFINE(pktio_ops, "packet IO operations", SUBSYSTEM_VERSION);
/* Instantiate init and term functions */
-ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, init_global, ODP_ERR)
+SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, init_global, ODP_ERR)
+SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, term_global, ODP_ERR)
ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, init_local, ODP_ERR)
-ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, term_global, ODP_ABORT)
+
+int odp_pktio_ops_init_global(bool continue_on_errors)
+{
+ odpdrv_shm_pool_t pktio_ops_pool = ODPDRV_SHM_POOL_INVALID;
+ odpdrv_shm_pool_param_t pktio_ops_param;
+
+ pktio_ops_param.pool_size = ODP_PKTIO_OPS_DATA_POOL_SIZE;
+ pktio_ops_param.min_alloc = 1;
+ pktio_ops_param.max_alloc = ODP_PKTIO_OPS_DATA_POOL_SIZE;
+
+ pktio_ops_pool = odpdrv_shm_pool_create(ODP_PKTIO_OPS_DATA_POOL_NAME,
+ &pktio_ops_param);
+ if (pktio_ops_pool == ODPDRV_SHM_POOL_INVALID) {
+ ODP_ERR("error to pool_create pktio_ops pool\n");
+ if (!continue_on_errors)
+ return -1;
+ }
+
+ return pktio_ops_init_global(continue_on_errors);
+}
+
+int odp_pktio_ops_term_global(bool continue_on_errors)
+{
+ int result = 0;
+ odpdrv_shm_pool_t pktio_ops_pool = ODPDRV_SHM_POOL_INVALID;
+
+ result = pktio_ops_term_global(continue_on_errors);
+ if (result) {
+ ODP_ERR("error to pktio_ops_term_global\n");
+ if (!continue_on_errors)
+ return -1;
+ }
+
+ pktio_ops_pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME);
+ if (pktio_ops_pool != ODPDRV_SHM_POOL_INVALID) {
+ if (odpdrv_shm_pool_destroy(pktio_ops_pool)) {
+ ODP_ERR("error pool_destroy pktio_ops pool\n");
+ result = -1;
+ }
+ } else {
+ ODP_ERR("error pool_lookup pktio_ops pool\n");
+ result = -1;
+ }
+
+ return result;
+}
/* Temporary variable to enable link modules,
* will remove in Makefile scheme changes.