/* Copyright (c) 2013, Linaro Limited * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include #include struct odp_global_data_s odp_global_data; int odp_init_global(const odp_init_t *params, const odp_platform_init_t *platform_params ODP_UNUSED) { enum init_stage stage = NO_INIT; odp_global_data.log_fn = odp_override_log; odp_global_data.abort_fn = odp_override_abort; if (params != NULL) { if (params->log_fn != NULL) odp_global_data.log_fn = params->log_fn; if (params->abort_fn != NULL) odp_global_data.abort_fn = params->abort_fn; } if (odp_time_init_global()) { ODP_ERR("ODP time init failed.\n"); goto init_failed; } stage = TIME_INIT; if (odp_system_info_init()) { ODP_ERR("ODP system_info init failed.\n"); goto init_failed; } stage = SYSINFO_INIT; if (odp_shm_init_global()) { ODP_ERR("ODP shm init failed.\n"); goto init_failed; } stage = SHM_INIT; if (odp_thread_init_global()) { ODP_ERR("ODP thread init failed.\n"); goto init_failed; } stage = THREAD_INIT; if (odp_pool_init_global()) { ODP_ERR("ODP pool init failed.\n"); goto init_failed; } stage = POOL_INIT; if (odp_queue_init_global()) { ODP_ERR("ODP queue init failed.\n"); goto init_failed; } stage = QUEUE_INIT; if (odp_schedule_init_global()) { ODP_ERR("ODP schedule init failed.\n"); goto init_failed; } stage = SCHED_INIT; if (odp_pktio_init_global()) { ODP_ERR("ODP packet io init failed.\n"); goto init_failed; } stage = PKTIO_INIT; if (odp_timer_init_global()) { ODP_ERR("ODP timer init failed.\n"); goto init_failed; } stage = TIMER_INIT; if (odp_crypto_init_global()) { ODP_ERR("ODP crypto init failed.\n"); goto init_failed; } stage = CRYPTO_INIT; if (odp_classification_init_global()) { ODP_ERR("ODP classification init failed.\n"); goto init_failed; } stage = CLASSIFICATION_INIT; return 0; init_failed: _odp_term_global(stage); return -1; } int odp_term_global(void) { return _odp_term_global(ALL_INIT); } int _odp_term_global(enum init_stage stage) { int rc = 0; switch (stage) { case ALL_INIT: case CLASSIFICATION_INIT: if (odp_classification_term_global()) { ODP_ERR("ODP classificatio term failed.\n"); rc = -1; } /* Fall through */ case CRYPTO_INIT: if (odp_crypto_term_global()) { ODP_ERR("ODP crypto term failed.\n"); rc = -1; } /* Fall through */ case TIMER_INIT: if (odp_timer_term_global()) { ODP_ERR("ODP timer term failed.\n"); rc = -1; } /* Fall through */ case PKTIO_INIT: if (odp_pktio_term_global()) { ODP_ERR("ODP pktio term failed.\n"); rc = -1; } /* Fall through */ case SCHED_INIT: if (odp_schedule_term_global()) { ODP_ERR("ODP schedule term failed.\n"); rc = -1; } /* Fall through */ case QUEUE_INIT: if (odp_queue_term_global()) { ODP_ERR("ODP queue term failed.\n"); rc = -1; } /* Fall through */ case POOL_INIT: if (odp_pool_term_global()) { ODP_ERR("ODP buffer pool term failed.\n"); rc = -1; } /* Fall through */ case THREAD_INIT: if (odp_thread_term_global()) { ODP_ERR("ODP thread term failed.\n"); rc = -1; } /* Fall through */ case SHM_INIT: if (odp_shm_term_global()) { ODP_ERR("ODP shm term failed.\n"); rc = -1; } /* Fall through */ case SYSINFO_INIT: if (odp_system_info_term()) { ODP_ERR("ODP system info term failed.\n"); rc = -1; } /* Fall through */ case TIME_INIT: if (odp_time_term_global()) { ODP_ERR("ODP time term failed.\n"); rc = -1; } /* Fall through */ case NO_INIT: ; } return rc; } int odp_init_local(odp_thread_type_t thr_type) { enum init_stage stage = NO_INIT; if (odp_shm_init_local()) { ODP_ERR("ODP shm local init failed.\n"); goto init_fail; } stage = SHM_INIT; if (odp_thread_init_local(thr_type)) { ODP_ERR("ODP thread local init failed.\n"); goto init_fail; } stage = THREAD_INIT; if (odp_pktio_init_local()) { ODP_ERR("ODP packet io local init failed.\n"); goto init_fail; } stage = PKTIO_INIT; if (odp_pool_init_local()) { ODP_ERR("ODP pool local init failed.\n"); goto init_fail; } stage = POOL_INIT; if (odp_schedule_init_local()) { ODP_ERR("ODP schedule local init failed.\n"); goto init_fail; } stage = SCHED_INIT; return 0; init_fail: _odp_term_local(stage); return -1; } int odp_term_local(void) { return _odp_term_local(ALL_INIT); } int _odp_term_local(enum init_stage stage) { int rc = 0; int rc_thd = 0; switch (stage) { case ALL_INIT: case SCHED_INIT: if (odp_schedule_term_local()) { ODP_ERR("ODP schedule local term failed.\n"); rc = -1; } /* Fall through */ case POOL_INIT: if (odp_pool_term_local()) { ODP_ERR("ODP buffer pool local term failed.\n"); rc = -1; } /* Fall through */ case THREAD_INIT: rc_thd = odp_thread_term_local(); if (rc_thd < 0) { ODP_ERR("ODP thread local term failed.\n"); rc = -1; } else { if (!rc) rc = rc_thd; } /* Fall through */ default: break; } return rc; }