From patchwork Tue Mar 10 15:31:10 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Taras Kondratiuk X-Patchwork-Id: 45593 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-lb0-f199.google.com (mail-lb0-f199.google.com [209.85.217.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 82055214BF for ; Tue, 10 Mar 2015 15:32:48 +0000 (UTC) Received: by lbiz11 with SMTP id z11sf2084339lbi.2 for ; Tue, 10 Mar 2015 08:32:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:cc:subject:precedence:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:mime-version :content-type:content-transfer-encoding:errors-to:sender :x-original-sender:x-original-authentication-results:mailing-list; bh=NzYe87KvUT0OGAV7EZwbD4qiTEmixJ67FaQjEDBwYMo=; b=IYCaKWoFJflhX8yBKkudCzyr7huGeGO940aWn1i6NwQ0DzVV/hgNl6jJKjxNsIGhZA wo6g0n54fv7DElnq58zEL1UlKdNMkbhj5xg79aZ9vt4kSP/4DzniCGvsC+nYIE1sv8GQ bej20kVjTCBoykYN81BGUr3T873b7cgFpQjlVZ+P4wpv4L/lhTbpxYKmfnJsoZdkJKOY j4nHKCXQdxYEDxjqOqTVw9sIhHDx0A0JAOR+W79dbmezXwc+l1BsofW+qaS1BPftCapn X1t+YAjOV7FGSsaOMBPijUKxj4LMSDgCUP/YqwalH5VyVW2Ktj1Gm303GdOWnJJuRNPZ ZUqQ== X-Gm-Message-State: ALoCoQk3FF3C9TlrJ1uDoRJnShtVRLoI55Jtgf+6WnqoU+a8cAw+sN4LoiSI6zC/IyxYgxCsOkn3 X-Received: by 10.152.45.7 with SMTP id i7mr4787215lam.9.1426001567470; Tue, 10 Mar 2015 08:32:47 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.228.136 with SMTP id si8ls47046lac.11.gmail; Tue, 10 Mar 2015 08:32:47 -0700 (PDT) X-Received: by 10.112.171.65 with SMTP id as1mr31005693lbc.45.1426001567046; Tue, 10 Mar 2015 08:32:47 -0700 (PDT) Received: from mail-lb0-f180.google.com (mail-lb0-f180.google.com. [209.85.217.180]) by mx.google.com with ESMTPS id zg6si519809lbb.123.2015.03.10.08.32.46 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 10 Mar 2015 08:32:46 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.180 as permitted sender) client-ip=209.85.217.180; Received: by lbjf15 with SMTP id f15so2603804lbj.2 for ; Tue, 10 Mar 2015 08:32:46 -0700 (PDT) X-Received: by 10.152.120.134 with SMTP id lc6mr30469682lab.72.1426001566891; Tue, 10 Mar 2015 08:32:46 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.35.133 with SMTP id h5csp2207170lbj; Tue, 10 Mar 2015 08:32:45 -0700 (PDT) X-Received: by 10.55.22.32 with SMTP id g32mr60614402qkh.4.1426001564889; Tue, 10 Mar 2015 08:32:44 -0700 (PDT) Received: from ip-10-35-177-41.ec2.internal (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTPS id a1si793205qco.31.2015.03.10.08.32.43 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 10 Mar 2015 08:32:44 -0700 (PDT) Received-SPF: none (google.com: lng-odp-bounces@lists.linaro.org does not designate permitted sender hosts) client-ip=54.225.227.206; Received: from localhost ([127.0.0.1] helo=ip-10-35-177-41.ec2.internal) by ip-10-35-177-41.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1YVM9B-00042g-6H; Tue, 10 Mar 2015 15:32:41 +0000 Received: from mail-lb0-f182.google.com ([209.85.217.182]) by ip-10-35-177-41.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1YVM89-0003pc-MB for lng-odp@lists.linaro.org; Tue, 10 Mar 2015 15:31:38 +0000 Received: by lbiw7 with SMTP id w7so2558693lbi.7 for ; Tue, 10 Mar 2015 08:31:32 -0700 (PDT) X-Received: by 10.152.87.3 with SMTP id t3mr31080391laz.19.1426001491981; Tue, 10 Mar 2015 08:31:31 -0700 (PDT) Received: from uglx0153363.synapse.com ([195.238.92.128]) by mx.google.com with ESMTPSA id a2sm106609lbm.32.2015.03.10.08.31.31 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 10 Mar 2015 08:31:31 -0700 (PDT) From: Taras Kondratiuk To: lng-odp@lists.linaro.org Date: Tue, 10 Mar 2015 17:31:10 +0200 Message-Id: <1426001473-14618-13-git-send-email-taras.kondratiuk@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1426001473-14618-1-git-send-email-taras.kondratiuk@linaro.org> References: <1426001473-14618-1-git-send-email-taras.kondratiuk@linaro.org> X-Topics: patch Cc: Taras Kondratiuk Subject: [lng-odp] [KEYSTONE2 PATCH 12/15] linux-ks2: queue: update module X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: lng-odp-bounces@lists.linaro.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: taras.kondratiuk@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.180 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 Signed-off-by: Taras Kondratiuk Signed-off-by: Taras Kondratiuk --- platform/linux-keystone2/Makefile.am | 6 +- platform/linux-keystone2/include/odp.h | 2 + .../linux-keystone2/include/odp/plat/queue_types.h | 95 +++++ platform/linux-keystone2/include/odp/queue.h | 153 ++++++++ .../linux-keystone2/include/odp_queue_internal.h | 98 +----- platform/linux-keystone2/odp_init.c | 3 +- platform/linux-keystone2/odp_queue.c | 384 +++++++++------------ 7 files changed, 429 insertions(+), 312 deletions(-) create mode 100644 platform/linux-keystone2/include/odp/plat/queue_types.h create mode 100644 platform/linux-keystone2/include/odp/queue.h diff --git a/platform/linux-keystone2/Makefile.am b/platform/linux-keystone2/Makefile.am index c482142..282f406 100644 --- a/platform/linux-keystone2/Makefile.am +++ b/platform/linux-keystone2/Makefile.am @@ -29,6 +29,7 @@ odpinclude_HEADERS = \ $(srcdir)/include/odp/packet_io.h \ $(srcdir)/include/odp/packet.h \ $(srcdir)/include/odp/pool.h \ + $(srcdir)/include/odp/queue.h \ $(linux_generic_srcdir)/include/odp/align.h \ $(linux_generic_srcdir)/include/odp/atomic.h \ $(linux_generic_srcdir)/include/odp/barrier.h \ @@ -42,7 +43,6 @@ odpinclude_HEADERS = \ $(linux_generic_srcdir)/include/odp/hints.h \ $(linux_generic_srcdir)/include/odp/init.h \ $(linux_generic_srcdir)/include/odp/random.h \ - $(linux_generic_srcdir)/include/odp/queue.h \ $(linux_generic_srcdir)/include/odp/rwlock.h \ $(linux_generic_srcdir)/include/odp/schedule.h \ $(linux_generic_srcdir)/include/odp/shared_memory.h \ @@ -66,6 +66,7 @@ odpplatinclude_HEADERS = \ $(srcdir)/include/odp/plat/osal.h \ $(srcdir)/include/odp/plat/packet_types.h \ $(srcdir)/include/odp/plat/pool_types.h \ + $(srcdir)/include/odp/plat/queue_types.h \ $(srcdir)/include/odp/plat/state.h \ $(srcdir)/include/odp/plat/ti_mcsdk.h \ $(linux_generic_srcdir)/include/odp/plat/atomic_types.h \ @@ -74,7 +75,6 @@ odpplatinclude_HEADERS = \ $(linux_generic_srcdir)/include/odp/plat/cpumask_types.h \ $(linux_generic_srcdir)/include/odp/plat/crypto_types.h \ $(linux_generic_srcdir)/include/odp/plat/packet_io_types.h \ - $(linux_generic_srcdir)/include/odp/plat/queue_types.h \ $(linux_generic_srcdir)/include/odp/plat/schedule_types.h \ $(linux_generic_srcdir)/include/odp/plat/shared_memory_types.h \ $(linux_generic_srcdir)/include/odp/plat/strong_types.h \ @@ -135,6 +135,7 @@ __LIB__libodp_la_SOURCES = \ odp_pool.c \ odp_buffer.c \ odp_packet.c \ + odp_queue.c \ mcsdk/mcsdk_init.c \ mcsdk/mcsdk_navig.c \ mcsdk/mcsdk_rmclient.c \ @@ -147,6 +148,7 @@ __LIB__libodp_la_SOURCES = \ ../linux-generic/odp_ring.c \ ../linux-generic/odp_rwlock.c \ ../linux-generic/odp_shared_memory.c \ + ../linux-generic/odp_schedule.c \ ../linux-generic/odp_spinlock.c \ ../linux-generic/odp_system_info.c \ ../linux-generic/odp_thread.c \ diff --git a/platform/linux-keystone2/include/odp.h b/platform/linux-keystone2/include/odp.h index 8737b9f..57fb5bc 100644 --- a/platform/linux-keystone2/include/odp.h +++ b/platform/linux-keystone2/include/odp.h @@ -39,6 +39,8 @@ extern "C" { #include #include #include +#include +#include #include #include #include diff --git a/platform/linux-keystone2/include/odp/plat/queue_types.h b/platform/linux-keystone2/include/odp/plat/queue_types.h new file mode 100644 index 0000000..8bf97b6 --- /dev/null +++ b/platform/linux-keystone2/include/odp/plat/queue_types.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2013, Linaro Limited + * Copyright (c) 2014, Texas Instruments Incorporated + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + +/** + * @file + * + * ODP queue types + */ + +#ifndef ODP_PLAT_QUEUE_TYPES_H_ +#define ODP_PLAT_QUEUE_TYPES_H_ + +#include +#include + +/** + * ODP queue + */ +typedef odp_handle_t odp_queue_t; + +/** + * Queue group instance type + */ +typedef odp_handle_t odp_queue_group_t; + +/** Invalid queue */ +#define ODP_QUEUE_INVALID ((odp_queue_t)-1) + +/** Maximum queue name lenght in chars */ +#define ODP_QUEUE_NAME_LEN 32 + + +/** + * ODP queue type + */ +typedef int odp_queue_type_t; + +#define ODP_QUEUE_TYPE_SCHED 0 /**< Scheduled queue */ +#define ODP_QUEUE_TYPE_POLL 1 /**< Not scheduled queue */ +#define ODP_QUEUE_TYPE_PKTIN 2 /**< Packet input queue */ +#define ODP_QUEUE_TYPE_PKTOUT 3 /**< Packet output queue */ + +/** + * ODP schedule priority + */ +typedef int odp_schedule_prio_t; + +/** Highest scheduling priority */ +#define ODP_SCHED_PRIO_HIGHEST 0 + +/** Normal scheduling priority */ +#define ODP_SCHED_PRIO_NORMAL (ODP_CONFIG_SCHED_PRIOS / 2) + +/** Lowest scheduling priority */ +#define ODP_SCHED_PRIO_LOWEST (ODP_CONFIG_SCHED_PRIOS - 1) + +/** Default scheduling priority */ +#define ODP_SCHED_PRIO_DEFAULT ODP_SCHED_PRIO_NORMAL + + +/** + * ODP schedule synchronisation + */ +typedef int odp_schedule_sync_t; + +#define ODP_SCHED_SYNC_NONE 0 /**< Queue not synchronised */ +#define ODP_SCHED_SYNC_ATOMIC 1 /**< Atomic queue */ +#define ODP_SCHED_SYNC_ORDERED 2 /**< Ordered queue */ + +/** Default queue synchronisation */ +#define ODP_SCHED_SYNC_DEFAULT ODP_SCHED_SYNC_ATOMIC + +/** + * ODP schedule core group + */ +typedef int odp_schedule_group_t; + +/** Group of all cores */ +#define ODP_SCHED_GROUP_ALL 0 + +/** Default core group */ +#define ODP_SCHED_GROUP_DEFAULT ODP_SCHED_GROUP_ALL + +static inline uint64_t odp_queue_to_u64(odp_queue_t hdl) +{ + return _odp_pri(hdl); +} + +#endif diff --git a/platform/linux-keystone2/include/odp/queue.h b/platform/linux-keystone2/include/odp/queue.h new file mode 100644 index 0000000..89a703a --- /dev/null +++ b/platform/linux-keystone2/include/odp/queue.h @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2014, Linaro Limited + * Copyright (c) 2014, Texas Instruments Incorporated + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + + +/** + * @file + * + * ODP queue + */ + +#ifndef ODP_QUEUE_H_ +#define ODP_QUEUE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Internal implementation structures + */ +#define QUEUE_MULTI_MAX 8 + +typedef struct queue_entry_s { + int status ODP_ALIGNED_CACHE; + odp_queue_type_t type; + Qmss_QueueHnd qmss_queue; + void *context; + int (*enqueue)(struct queue_entry_s *, odp_event_t); + odp_event_t (*dequeue)(struct queue_entry_s *); + int (*enqueue_multi)(struct queue_entry_s *, const odp_event_t *, int); + int (*dequeue_multi)(struct queue_entry_s *, odp_event_t *, int); + odp_ticketlock_t lock; + odp_queue_t handle; + + odp_buffer_t sched_buf; + struct { + odp_schedule_prio_t prio; + odp_schedule_sync_t sync; + odp_schedule_group_t group; + } sched; + char name[ODP_QUEUE_NAME_LEN]; +} queue_entry_t; + +typedef struct { + queue_entry_t queue[ODP_CONFIG_QUEUES]; +} queue_table_t; + + +extern queue_table_t *queue_tbl; +static inline queue_entry_t *queue_get_qentry(uint32_t queue_id) +{ + return &queue_tbl->queue[queue_id]; +} + +static inline uint32_t queue_to_id(odp_queue_t handle) +{ + return (uint32_t)handle; +} + +static inline odp_queue_t queue_from_id(uint32_t queue_id) +{ + return (odp_queue_t)queue_id; +} + +static inline queue_entry_t *_odp_queue_to_qentry(odp_queue_t handle) +{ + return queue_get_qentry(queue_to_id(handle)); +} + +static inline Qmss_QueueHnd _odp_queue_to_qmss_queue(odp_queue_t queue) +{ + queue_entry_t *entry = _odp_queue_to_qentry(queue); + return entry->qmss_queue; +} + +static inline int odp_queue_set_context(odp_queue_t queue, void *context) +{ + _odp_queue_to_qentry(queue)->context = context; + return 0; +} + +static inline void *odp_queue_get_context(odp_queue_t queue) +{ + return _odp_queue_to_qentry(queue)->context; +} + +static inline int odp_queue_enq(odp_queue_t queue, odp_event_t ev) +{ + queue_entry_t *qentry = _odp_queue_to_qentry(queue); + + odp_pr_vdbg(">>>>>> handle: %u, event: %p\n", queue, ev); + ODP_ASSERT(qentry->enqueue, "No enqueue function"); + return qentry->enqueue(qentry, ev); +} + +static inline int odp_queue_enq_multi(odp_queue_t queue, const odp_event_t ev[], + int num) +{ + queue_entry_t *qentry = _odp_queue_to_qentry(queue); + + if (num > QUEUE_MULTI_MAX) + num = QUEUE_MULTI_MAX; + + ODP_ASSERT(qentry->enqueue_multi, "No multi enqueue function"); + return qentry->enqueue_multi(qentry, ev, num); +} + +static inline odp_event_t odp_queue_deq(odp_queue_t queue) +{ + queue_entry_t *qentry = _odp_queue_to_qentry(queue); + ODP_ASSERT(qentry->dequeue, "No dequeue function"); + return qentry->dequeue(qentry); +} + +static inline int odp_queue_deq_multi(odp_queue_t queue, odp_event_t ev[], + int num) +{ + queue_entry_t *qentry = _odp_queue_to_qentry(queue); + + if (num > QUEUE_MULTI_MAX) + num = QUEUE_MULTI_MAX; + + ODP_ASSERT(qentry->dequeue_multi, "No multi dequeue function"); + return qentry->dequeue_multi(qentry, ev, num); +} + +static inline odp_queue_type_t odp_queue_type(odp_queue_t queue) +{ + return _odp_queue_to_qentry(queue)->type; +} + +#include + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/platform/linux-keystone2/include/odp_queue_internal.h b/platform/linux-keystone2/include/odp_queue_internal.h index a0df1ac..38a59d4 100644 --- a/platform/linux-keystone2/include/odp_queue_internal.h +++ b/platform/linux-keystone2/include/odp_queue_internal.h @@ -19,75 +19,21 @@ extern "C" { #endif -#include -#include -#include -#include -#include +#include +#include -#define USE_TICKETLOCK - -#ifdef USE_TICKETLOCK -#include -#else -#include -#endif - -#define QUEUE_MULTI_MAX 8 - #define QUEUE_STATUS_FREE 0 #define QUEUE_STATUS_READY 1 #define QUEUE_STATUS_NOTSCHED 2 #define QUEUE_STATUS_SCHED 3 +#define QUEUE_STATUS_DESTROYED 4 -/* forward declaration */ -union queue_entry_u; - -typedef int (*enq_func_t)(union queue_entry_u *, odp_buffer_t); -typedef odp_buffer_t (*deq_func_t)(union queue_entry_u *); - -typedef int (*enq_multi_func_t)(union queue_entry_u *, odp_buffer_t *, int); -typedef int (*deq_multi_func_t)(union queue_entry_u *, odp_buffer_t *, int); - -struct queue_entry_s { -#ifdef USE_TICKETLOCK - odp_ticketlock_t lock ODP_ALIGNED_CACHE; -#else - odp_spinlock_t lock ODP_ALIGNED_CACHE; -#endif - - int status; - void *context; - - enq_func_t enqueue ODP_ALIGNED_CACHE; - deq_func_t dequeue; - enq_multi_func_t enqueue_multi; - deq_multi_func_t dequeue_multi; +int queue_enq(queue_entry_t *queue, odp_event_t buf); +odp_event_t queue_deq(queue_entry_t *queue); - odp_queue_t handle; - odp_buffer_t sched_buf; - odp_queue_type_t type; - odp_queue_param_t param; - odp_pktio_t pktin; - pktio_entry_t *pktout_entry; - Qmss_QueueHnd qmss_queue; - char name[ODP_QUEUE_NAME_LEN]; -}; - -typedef union queue_entry_u { - struct queue_entry_s s; - uint8_t pad[ODP_CACHE_LINE_SIZE_ROUNDUP(sizeof(struct queue_entry_s))]; -} queue_entry_t; - - -queue_entry_t *get_qentry(uint32_t queue_id); - -int queue_enq(queue_entry_t *queue, odp_buffer_t buf); -odp_buffer_t queue_deq(queue_entry_t *queue); - -int queue_enq_multi(queue_entry_t *queue, odp_buffer_t buf[], int num); -int queue_deq_multi(queue_entry_t *queue, odp_buffer_t buf[], int num); +int queue_enq_multi(queue_entry_t *queue, const odp_event_t buf[], int num); +int queue_deq_multi(queue_entry_t *queue, odp_event_t buf[], int num); void queue_lock(queue_entry_t *queue); void queue_unlock(queue_entry_t *queue); @@ -95,39 +41,29 @@ void queue_unlock(queue_entry_t *queue); odp_buffer_t queue_sched_buf(odp_queue_t queue); int queue_sched_atomic(odp_queue_t handle); -static inline uint32_t queue_to_id(odp_queue_t handle) +static inline const char *odp_queue_name(odp_queue_t queue) { - return handle - 1; + return _odp_queue_to_qentry(queue)->name; } -static inline odp_queue_t queue_from_id(uint32_t queue_id) +static inline int queue_is_free(odp_queue_t handle) { - return queue_id + 1; -} + queue_entry_t *queue; -static inline queue_entry_t *queue_to_qentry(odp_queue_t handle) -{ - uint32_t queue_id; + queue = _odp_queue_to_qentry(handle); - queue_id = queue_to_id(handle); - return get_qentry(queue_id); + return queue->status == QUEUE_STATUS_FREE; } -static inline const char *odp_queue_name(odp_queue_t handle) +static inline int queue_is_sched(odp_queue_t handle) { - return queue_to_qentry(handle)->s.name; -} + queue_entry_t *queue; + queue = _odp_queue_to_qentry(handle); -static inline Qmss_QueueHnd _odp_queue_to_qmss_queue(odp_queue_t queue) -{ - queue_entry_t *entry = queue_to_qentry(queue); - return entry->s.qmss_queue; + return (queue->status == QUEUE_STATUS_SCHED); } -odp_queue_t _odp_queue_create(const char *name, odp_queue_type_t type, - odp_queue_param_t *param, int32_t hw_queue); - #ifdef __cplusplus } #endif diff --git a/platform/linux-keystone2/odp_init.c b/platform/linux-keystone2/odp_init.c index 38055e0..d6ac135 100644 --- a/platform/linux-keystone2/odp_init.c +++ b/platform/linux-keystone2/odp_init.c @@ -50,12 +50,11 @@ int odp_init_global(odp_init_t *params ODP_UNUSED, return -1; } -#if 0 if (odp_queue_init_global()) { odp_pr_err("ODP queue init failed.\n"); return -1; } - +#if 0 if (odp_schedule_init_global()) { odp_pr_err("ODP schedule init failed.\n"); return -1; diff --git a/platform/linux-keystone2/odp_queue.c b/platform/linux-keystone2/odp_queue.c index 6f77a41..f59a884 100644 --- a/platform/linux-keystone2/odp_queue.c +++ b/platform/linux-keystone2/odp_queue.c @@ -6,102 +6,87 @@ * SPDX-License-Identifier: BSD-3-Clause */ -#include -#include +#include +#include #include -#include -#include -#include +#include +#include +#include #include -#include +#include #include -#include +#include #include -#include -#include +#include #include -#include -#include +#include +#include -#ifdef USE_TICKETLOCK -#include +#include #define LOCK(a) odp_ticketlock_lock(a) #define UNLOCK(a) odp_ticketlock_unlock(a) #define LOCK_INIT(a) odp_ticketlock_init(a) -#else -#include -#define LOCK(a) odp_spinlock_lock(a) -#define UNLOCK(a) odp_spinlock_unlock(a) -#define LOCK_INIT(a) odp_spinlock_init(a) -#endif #include +queue_table_t *queue_tbl; -typedef struct queue_table_t { - queue_entry_t queue[ODP_CONFIG_QUEUES]; -} queue_table_t; - -static queue_table_t *queue_tbl; - - -queue_entry_t *get_qentry(uint32_t queue_id) -{ - return &queue_tbl->queue[queue_id]; -} - -static int queue_init(queue_entry_t *queue, const char *name, +static int queue_init(queue_entry_t *qentry, const char *name, odp_queue_type_t type, odp_queue_param_t *param) { - strncpy(queue->s.name, name, ODP_QUEUE_NAME_LEN - 1); - queue->s.type = type; + strncpy(qentry->name, name, ODP_QUEUE_NAME_LEN - 1); + qentry->type = type; if (type != ODP_QUEUE_TYPE_PKTOUT) { uint8_t allocated = 0; - queue->s.qmss_queue = Qmss_queueOpen( + qentry->qmss_queue = Qmss_queueOpen( Qmss_QueueType_GENERAL_PURPOSE_QUEUE, QMSS_PARAM_NOT_SPECIFIED, &allocated); if (allocated) - Qmss_queueEmpty(queue->s.qmss_queue); + Qmss_queueEmpty(qentry->qmss_queue); odp_pr_vdbg(">>>>>> queue_s: %p, qmss_queue: %d\n", - queue, queue->s.qmss_queue); - if (queue->s.qmss_queue < 0) + qentry, qentry->qmss_queue); + if (qentry->qmss_queue < 0) return -1; } if (param) { - memcpy(&queue->s.param, param, sizeof(odp_queue_param_t)); + qentry->sched.prio = param->sched.prio; + qentry->sched.sync = param->sched.sync; + qentry->sched.group = param->sched.group; + qentry->context = param->context; } else { /* Defaults */ - memset(&queue->s.param, 0, sizeof(odp_queue_param_t)); - queue->s.param.sched.prio = ODP_SCHED_PRIO_DEFAULT; - queue->s.param.sched.sync = ODP_SCHED_SYNC_DEFAULT; - queue->s.param.sched.group = ODP_SCHED_GROUP_DEFAULT; + qentry->sched.prio = ODP_SCHED_PRIO_DEFAULT; + qentry->sched.sync = ODP_SCHED_SYNC_DEFAULT; + qentry->sched.group = ODP_SCHED_GROUP_DEFAULT; + qentry->context = NULL; } switch (type) { +#if 0 case ODP_QUEUE_TYPE_PKTIN: - queue->s.enqueue = NULL; - queue->s.dequeue = pktin_dequeue; - queue->s.enqueue_multi = NULL; - queue->s.dequeue_multi = pktin_deq_multi; + qentry->enqueue = NULL; + qentry->dequeue = pktin_dequeue; + qentry->enqueue_multi = NULL; + qentry->dequeue_multi = pktin_deq_multi; break; case ODP_QUEUE_TYPE_PKTOUT: - queue->s.enqueue = pktout_enqueue; - queue->s.dequeue = NULL; - queue->s.enqueue_multi = pktout_enq_multi; - queue->s.dequeue_multi = NULL; + qentry->enqueue = pktout_enqueue; + qentry->dequeue = NULL; + qentry->enqueue_multi = pktout_enq_multi; + qentry->dequeue_multi = NULL; break; +#endif default: - queue->s.enqueue = queue_enq; - queue->s.dequeue = queue_deq; - queue->s.enqueue_multi = queue_enq_multi; - queue->s.dequeue_multi = queue_deq_multi; + qentry->enqueue = queue_enq; + qentry->dequeue = queue_deq; + qentry->enqueue_multi = queue_enq_multi; + qentry->dequeue_multi = queue_deq_multi; break; } - queue->s.sched_buf = ODP_BUFFER_INVALID; return 0; } @@ -126,16 +111,14 @@ int odp_queue_init_global(void) for (i = 0; i < ODP_CONFIG_QUEUES; i++) { /* init locks */ - queue_entry_t *queue = get_qentry(i); - LOCK_INIT(&queue->s.lock); - queue->s.handle = queue_from_id(i); - queue->s.status = QUEUE_STATUS_FREE; + queue_entry_t *qentry = queue_get_qentry(i); + LOCK_INIT(&qentry->lock); + qentry->handle = queue_from_id(i); + qentry->status = QUEUE_STATUS_FREE; } odp_pr_dbg("done\n"); odp_pr_dbg("Queue init global\n"); - odp_pr_dbg(" struct queue_entry_s size %zu\n", - sizeof(struct queue_entry_s)); odp_pr_dbg(" queue_entry_t size %zu\n", sizeof(queue_entry_t)); odp_pr_dbg("\n"); @@ -143,148 +126,161 @@ int odp_queue_init_global(void) return 0; } -odp_queue_type_t odp_queue_type(odp_queue_t handle) +int odp_queue_destroy(odp_queue_t queue) { - queue_entry_t *queue; + queue_entry_t *qentry = _odp_queue_to_qentry(queue); - queue = queue_to_qentry(handle); + if (qentry->type == ODP_QUEUE_TYPE_SCHED) { + ODP_ERR("Destroying of ODP_QUEUE_TYPE_SCHED is not implemented\n"); + return -1; + } + if (qentry->status == QUEUE_STATUS_FREE) { + ODP_ERR("Queue is already freed\n"); + return -1; + } - return queue->s.type; + LOCK(&qentry->lock); + if (qentry->type != ODP_QUEUE_TYPE_PKTOUT) { + uint32_t count = Qmss_getQueueEntryCount(qentry->qmss_queue); + if (count) { + ODP_ERR("Queue still has %d events\n", count); + UNLOCK(&qentry->lock); + return -1; + } + Qmss_Result qmss_ret = Qmss_queueClose(qentry->qmss_queue); + if (qmss_ret != QMSS_SOK) { + ODP_ERR("QMSS queue close failed: %d\n", qmss_ret); + UNLOCK(&qentry->lock); + return -1; + } + } + qentry->status = QUEUE_STATUS_FREE; + UNLOCK(&qentry->lock); + + return 0; } -odp_schedule_sync_t odp_queue_sched_type(odp_queue_t handle) +odp_schedule_sync_t odp_queue_sched_type(odp_queue_t queue) { - queue_entry_t *queue; - - queue = queue_to_qentry(handle); - - return queue->s.param.sched.sync; + return _odp_queue_to_qentry(queue)->sched.sync; } odp_queue_t odp_queue_create(const char *name, odp_queue_type_t type, odp_queue_param_t *param) { uint32_t i; - queue_entry_t *queue; - odp_queue_t handle = ODP_QUEUE_INVALID; + queue_entry_t *qentry; + odp_queue_t queue = ODP_QUEUE_INVALID; odp_pr_vdbg(">>>>>> name: %s, type: %d\n", name, type); for (i = 0; i < ODP_CONFIG_QUEUES; i++) { - queue = &queue_tbl->queue[i]; + qentry = &queue_tbl->queue[i]; - if (queue->s.status != QUEUE_STATUS_FREE) + if (qentry->status != QUEUE_STATUS_FREE) continue; - LOCK(&queue->s.lock); - if (queue->s.status != QUEUE_STATUS_FREE) { - UNLOCK(&queue->s.lock); + LOCK(&qentry->lock); + if (qentry->status != QUEUE_STATUS_FREE) { + UNLOCK(&qentry->lock); continue; } - if (queue_init(queue, name, type, param)) { - UNLOCK(&queue->s.lock); + if (queue_init(qentry, name, type, param)) { + UNLOCK(&qentry->lock); break; } if (type == ODP_QUEUE_TYPE_SCHED || type == ODP_QUEUE_TYPE_PKTIN) - queue->s.status = QUEUE_STATUS_NOTSCHED; + qentry->status = QUEUE_STATUS_NOTSCHED; else - queue->s.status = QUEUE_STATUS_READY; + qentry->status = QUEUE_STATUS_READY; - handle = queue->s.handle; - odp_pr_vdbg(">>>>>> handle: %u\n", handle); - UNLOCK(&queue->s.lock); + queue = qentry->handle; + odp_pr_vdbg(">>>>>> handle: %u\n", queue); + UNLOCK(&qentry->lock); break; } - if (handle != ODP_QUEUE_INVALID && + if (queue != ODP_QUEUE_INVALID && (type == ODP_QUEUE_TYPE_SCHED || type == ODP_QUEUE_TYPE_PKTIN)) { odp_buffer_t buf; - buf = odp_schedule_buffer_alloc(handle); + buf = odp_schedule_buffer_alloc(queue); if (buf == ODP_BUFFER_INVALID) { odp_pr_err("queue_init: sched buf alloc failed\n"); return ODP_QUEUE_INVALID; } - queue->s.sched_buf = buf; - odp_schedule_mask_set(handle, queue->s.param.sched.prio); + qentry->sched_buf = buf; + odp_schedule_mask_set(queue, qentry->sched.prio); } - return handle; + return queue; } -odp_buffer_t queue_sched_buf(odp_queue_t handle) -{ - queue_entry_t *queue; - queue = queue_to_qentry(handle); - return queue->s.sched_buf; +odp_buffer_t queue_sched_buf(odp_queue_t queue) +{ + return _odp_queue_to_qentry(queue)->sched_buf; } - int queue_sched_atomic(odp_queue_t handle) { - queue_entry_t *queue; - queue = queue_to_qentry(handle); - - return queue->s.param.sched.sync == ODP_SCHED_SYNC_ATOMIC; + queue_entry_t *qentry = _odp_queue_to_qentry(handle); + return qentry->sched.sync == ODP_SCHED_SYNC_ATOMIC; } - odp_queue_t odp_queue_lookup(const char *name) { uint32_t i; for (i = 0; i < ODP_CONFIG_QUEUES; i++) { - queue_entry_t *queue = &queue_tbl->queue[i]; + queue_entry_t *qentry = &queue_tbl->queue[i]; - if (queue->s.status == QUEUE_STATUS_FREE) + if (qentry->status == QUEUE_STATUS_FREE) continue; - LOCK(&queue->s.lock); - if (strcmp(name, queue->s.name) == 0) { + LOCK(&qentry->lock); + if (strcmp(name, qentry->name) == 0) { /* found it */ - UNLOCK(&queue->s.lock); - return queue->s.handle; + UNLOCK(&qentry->lock); + return qentry->handle; } - UNLOCK(&queue->s.lock); + UNLOCK(&qentry->lock); } return ODP_QUEUE_INVALID; } - -int queue_enq(queue_entry_t *queue, odp_buffer_t buf) +int queue_enq(queue_entry_t *qentry, odp_event_t ev) { odp_pr_vdbg("queue: %s, buf: %p, qmss_queue: %d\n", - queue->s.name, buf, queue->s.qmss_queue); - Qmss_queuePushDescSize(queue->s.qmss_queue, - _odp_buf_to_cppi_desc(buf), + qentry->name, ev, qentry->qmss_queue); + Qmss_queuePushDescSize(qentry->qmss_queue, + _odp_ev_to_cppi_desc(ev), NWAL_DESC_SIZE); #if 1 - if (queue->s.type == ODP_QUEUE_TYPE_SCHED) { + if (qentry->type == ODP_QUEUE_TYPE_SCHED) { int sched = 0; - LOCK(&queue->s.lock); - if (queue->s.status == QUEUE_STATUS_NOTSCHED) { - queue->s.status = QUEUE_STATUS_SCHED; + LOCK(&qentry->lock); + if (qentry->status == QUEUE_STATUS_NOTSCHED) { + qentry->status = QUEUE_STATUS_SCHED; sched = 1; } - odp_pr_vdbg("status: %d, sched: %d\n", queue->s.status, sched); - UNLOCK(&queue->s.lock); + odp_pr_vdbg("status: %d, sched: %d\n", qentry->status, sched); + UNLOCK(&qentry->lock); /* Add queue to scheduling */ if (sched) - odp_schedule_queue(queue->s.handle, - queue->s.param.sched.prio); + odp_schedule_queue(qentry->handle, + qentry->sched.prio); } #endif return 0; } - -int queue_enq_multi(queue_entry_t *queue, odp_buffer_t buf[], int num) +int queue_enq_multi(queue_entry_t *qentry, const odp_event_t ev[], int num) { int i; @@ -295,92 +291,67 @@ int queue_enq_multi(queue_entry_t *queue, odp_buffer_t buf[], int num) for (i = 0; i < num; i++) { /** @todo: Implement multi dequeue a lower level */ odp_pr_vdbg("queue: %s, buf: %p, qmss_queue: %d\n", - queue->s.name, buf[i], queue->s.qmss_queue); - Qmss_queuePushDescSize(queue->s.qmss_queue, - _odp_buf_to_cppi_desc(buf[i]), + qentry->name, ev[i], qentry->qmss_queue); + Qmss_queuePushDescSize(qentry->qmss_queue, + _odp_ev_to_cppi_desc(ev[i]), NWAL_DESC_SIZE); } - if (queue->s.type == ODP_QUEUE_TYPE_SCHED) { + if (qentry->type == ODP_QUEUE_TYPE_SCHED) { int sched = 0; - LOCK(&queue->s.lock); - if (queue->s.status == QUEUE_STATUS_NOTSCHED) { - queue->s.status = QUEUE_STATUS_SCHED; + LOCK(&qentry->lock); + if (qentry->status == QUEUE_STATUS_NOTSCHED) { + qentry->status = QUEUE_STATUS_SCHED; sched = 1; } - odp_pr_vdbg("status: %d, sched: %d\n", queue->s.status, sched); - UNLOCK(&queue->s.lock); + odp_pr_vdbg("status: %d, sched: %d\n", qentry->status, sched); + UNLOCK(&qentry->lock); /* Add queue to scheduling */ if (sched) - odp_schedule_queue(queue->s.handle, - queue->s.param.sched.prio); + odp_schedule_queue(qentry->handle, + qentry->sched.prio); } - return 0; -} - - -int odp_queue_enq_multi(odp_queue_t handle, odp_buffer_t buf[], int num) -{ - queue_entry_t *queue; - - if (num > QUEUE_MULTI_MAX) - num = QUEUE_MULTI_MAX; - - queue = queue_to_qentry(handle); - - ODP_ASSERT(queue->s.enqueue_multi, "No multi enqueue function"); - return queue->s.enqueue_multi(queue, buf, num); + return num; } -int odp_queue_enq(odp_queue_t handle, odp_buffer_t buf) -{ - queue_entry_t *queue; - - queue = queue_to_qentry(handle); - - odp_pr_vdbg(">>>>>> handle: %u, buf: %p\n", handle, buf); - ODP_ASSERT(queue->s.enqueue, "No enqueue function"); - return queue->s.enqueue(queue, buf); -} - -odp_buffer_t queue_deq(queue_entry_t *queue) +odp_event_t queue_deq(queue_entry_t *qentry) { Cppi_HostDesc *desc; - desc = (void *)QMSS_DESC_PTR(Qmss_queuePop(queue->s.qmss_queue)); + desc = (void *)QMSS_DESC_PTR(Qmss_queuePop(qentry->qmss_queue)); odp_pr_vdbg("queue: %s, buf: %p, qmss_queue: %d\n", - queue->s.name, desc, queue->s.qmss_queue); - - if (!desc && queue->s.type == ODP_QUEUE_TYPE_SCHED) { - LOCK(&queue->s.lock); - if (!desc && queue->s.status == QUEUE_STATUS_SCHED) - queue->s.status = QUEUE_STATUS_NOTSCHED; - odp_pr_vdbg("status: %d\n", queue->s.status); - UNLOCK(&queue->s.lock); + qentry->name, desc, qentry->qmss_queue); + + if (!desc && qentry->type == ODP_QUEUE_TYPE_SCHED) { + LOCK(&qentry->lock); + if (!desc && qentry->status == QUEUE_STATUS_SCHED) + qentry->status = QUEUE_STATUS_NOTSCHED; + odp_pr_vdbg("status: %d\n", qentry->status); + UNLOCK(&qentry->lock); } - return _cppi_desc_to_odp_buf(desc); + return _cppi_desc_to_odp_ev(desc); } -int queue_deq_multi(queue_entry_t *queue, odp_buffer_t buf[], int num) +int queue_deq_multi(queue_entry_t *qentry, odp_event_t ev[], int num) { int i; for (i = 0; i < num; i++) { Cppi_HostDesc *desc; /** @todo: Implement multi dequeue a lower level */ - desc = Qmss_queuePop(queue->s.qmss_queue); + desc = Qmss_queuePop(qentry->qmss_queue); desc = (void *)QMSS_DESC_PTR(desc); - buf[i] = _cppi_desc_to_odp_buf(desc); - if (!buf[i]) { - if (queue->s.type != ODP_QUEUE_TYPE_SCHED) + ev[i] = _cppi_desc_to_odp_ev(desc); + if (!ev[i]) { + if (qentry->type != ODP_QUEUE_TYPE_SCHED) break; - LOCK(&queue->s.lock); - if (queue->s.status == QUEUE_STATUS_SCHED) - queue->s.status = QUEUE_STATUS_NOTSCHED; - odp_pr_vdbg("status: %d\n", queue->s.status); - UNLOCK(&queue->s.lock); + LOCK(&qentry->lock); + if (qentry->status == QUEUE_STATUS_SCHED) + qentry->status = QUEUE_STATUS_NOTSCHED; + odp_pr_vdbg("status: %d\n", qentry->status); + UNLOCK(&qentry->lock); break; } } @@ -388,53 +359,12 @@ int queue_deq_multi(queue_entry_t *queue, odp_buffer_t buf[], int num) return i; } - -int odp_queue_deq_multi(odp_queue_t handle, odp_buffer_t buf[], int num) +void queue_lock(queue_entry_t *qentry) { - queue_entry_t *queue; - - if (num > QUEUE_MULTI_MAX) - num = QUEUE_MULTI_MAX; - - queue = queue_to_qentry(handle); - - ODP_ASSERT(queue->s.dequeue_multi, "No multi dequeue function"); - return queue->s.dequeue_multi(queue, buf, num); + LOCK(&qentry->lock); } - -odp_buffer_t odp_queue_deq(odp_queue_t handle) -{ - queue_entry_t *queue; - - queue = queue_to_qentry(handle); - ODP_ASSERT(queue->s.dequeue, "No dequeue function"); - return queue->s.dequeue(queue); -} - -int odp_queue_set_context(odp_queue_t handle, void *context) -{ - queue_entry_t *queue; - queue = queue_to_qentry(handle); - queue->s.context = context; - return 0; -} - -void *odp_queue_get_context(odp_queue_t handle) -{ - queue_entry_t *queue; - queue = queue_to_qentry(handle); - return queue->s.context; -} - - -void queue_lock(queue_entry_t *queue) -{ - LOCK(&queue->s.lock); -} - - -void queue_unlock(queue_entry_t *queue) +void queue_unlock(queue_entry_t *qentry) { - UNLOCK(&queue->s.lock); + UNLOCK(&qentry->lock); }