diff options
Diffstat (limited to 'platform/linux-generic/include/odp_queue_basic_internal.h')
-rw-r--r-- | platform/linux-generic/include/odp_queue_basic_internal.h | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/platform/linux-generic/include/odp_queue_basic_internal.h b/platform/linux-generic/include/odp_queue_basic_internal.h new file mode 100644 index 000000000..e6edec1cd --- /dev/null +++ b/platform/linux-generic/include/odp_queue_basic_internal.h @@ -0,0 +1,124 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2013-2018 Linaro Limited + * Copyright (c) 2023 Nokia + */ + +#ifndef ODP_QUEUE_BASIC_INTERNAL_H_ +#define ODP_QUEUE_BASIC_INTERNAL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <odp/api/plat/strong_types.h> +#include <odp/api/queue.h> +#include <odp/api/shared_memory.h> +#include <odp_forward_typedefs_internal.h> +#include <odp_queue_if.h> +#include <odp_buffer_internal.h> +#include <odp/api/packet_io.h> +#include <odp/api/align.h> +#include <odp/api/hints.h> +#include <odp/api/ticketlock.h> +#include <odp_config_internal.h> +#include <odp_macros_internal.h> +#include <odp_ring_mpmc_u32_internal.h> +#include <odp_ring_st_internal.h> +#include <odp_ring_spsc_internal.h> +#include <odp_queue_lf.h> + +#define QUEUE_STATUS_FREE 0 +#define QUEUE_STATUS_DESTROYED 1 +#define QUEUE_STATUS_READY 2 +#define QUEUE_STATUS_NOTSCHED 3 +#define QUEUE_STATUS_SCHED 4 + +typedef struct ODP_ALIGNED_CACHE queue_entry_s { + /* The first cache line is read only */ + queue_enq_fn_t enqueue ODP_ALIGNED_CACHE; + queue_deq_fn_t dequeue; + queue_enq_multi_fn_t enqueue_multi; + queue_deq_multi_fn_t dequeue_multi; + uint32_t *ring_data; + uint32_t ring_mask; + uint32_t index; + odp_queue_t handle; + odp_queue_type_t type; + + /* MPMC ring (2 cache lines). */ + ring_mpmc_u32_t ring_mpmc; + + odp_ticketlock_t lock; + union { + ring_st_t ring_st; + ring_spsc_t ring_spsc; + }; + + odp_atomic_u64_t num_timers; + int status; + + queue_deq_multi_fn_t orig_dequeue_multi; + odp_queue_param_t param; + odp_pktin_queue_t pktin; + odp_pktout_queue_t pktout; + void *queue_lf; + int spsc; + char name[ODP_QUEUE_NAME_LEN]; +} queue_entry_t; + +typedef struct queue_global_t { + queue_entry_t queue[CONFIG_MAX_QUEUES]; + uint32_t *ring_data; + uint32_t queue_lf_num; + uint32_t queue_lf_size; + queue_lf_func_t queue_lf_func; + odp_shm_t queue_gbl_shm; + odp_shm_t queue_ring_shm; + + struct { + uint32_t max_queue_size; + uint32_t default_queue_size; + } config; + +} queue_global_t; + +extern queue_global_t *_odp_queue_glb; + +static inline uint32_t queue_to_index(odp_queue_t handle) +{ + queue_entry_t *qentry = (queue_entry_t *)(uintptr_t)handle; + + return qentry->index; +} + +static inline queue_entry_t *qentry_from_index(uint32_t queue_id) +{ + return &_odp_queue_glb->queue[queue_id]; +} + +static inline odp_queue_t queue_from_index(uint32_t queue_id) +{ + return (odp_queue_t)qentry_from_index(queue_id); +} + +static inline queue_entry_t *qentry_from_handle(odp_queue_t handle) +{ + return (queue_entry_t *)(uintptr_t)handle; +} + +void _odp_queue_spsc_init(queue_entry_t *queue, uint32_t queue_size); + +/* Functions for schedulers */ +void _odp_sched_queue_set_status(uint32_t queue_index, int status); +int _odp_sched_queue_deq(uint32_t queue_index, odp_event_t ev[], int num, + int update_status); +int _odp_sched_queue_empty(uint32_t queue_index); + +/* Functions by schedulers */ +int _odp_sched_basic_get_spread(uint32_t queue_index); + +#ifdef __cplusplus +} +#endif + +#endif |