From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id C1389A04DB; Thu, 15 Oct 2020 11:47:39 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 14E8C1DD89; Thu, 15 Oct 2020 11:47:23 +0200 (CEST) Received: from inva020.nxp.com (inva020.nxp.com [92.121.34.13]) by dpdk.org (Postfix) with ESMTP id 72B271DBA2 for ; Thu, 15 Oct 2020 11:47:20 +0200 (CEST) Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 3E1751A07DE; Thu, 15 Oct 2020 11:47:19 +0200 (CEST) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 5D3D81A07C8; Thu, 15 Oct 2020 11:47:16 +0200 (CEST) Received: from lsv11086.swis.cn-sha01.nxp.com (lsv11086.swis.cn-sha01.nxp.com [92.121.210.87]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id 929A54024F; Thu, 15 Oct 2020 11:47:12 +0200 (CEST) From: Gagandeep Singh To: dev@dpdk.org, nipun.gupta@nxp.com, hemant.agrawal@nxp.com Cc: thomas@monjalon.net, Gagandeep Singh Date: Thu, 15 Oct 2020 17:47:02 +0800 Message-Id: <1602755228-25535-2-git-send-email-g.singh@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1602755228-25535-1-git-send-email-g.singh@nxp.com> References: <1599470764-30569-1-git-send-email-g.singh@nxp.com> <1602755228-25535-1-git-send-email-g.singh@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Subject: [dpdk-dev] [PATCH v2 1/7] raw/dpaa2_qdma: change DPAA2 QDMA APIs to rawdev ops X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" dpaa2_qdma was partially using direct pmd APIs. This patch changes that and adapt the driver to use more of the rawdev APIs Signed-off-by: Gagandeep Singh --- drivers/raw/dpaa2_qdma/dpaa2_qdma.c | 339 ++++++++++---------- drivers/raw/dpaa2_qdma/dpaa2_qdma.h | 3 +- drivers/raw/dpaa2_qdma/rte_pmd_dpaa2_qdma.h | 207 ++---------- 3 files changed, 195 insertions(+), 354 deletions(-) diff --git a/drivers/raw/dpaa2_qdma/dpaa2_qdma.c b/drivers/raw/dpaa2_qdma/dpaa2_qdma.c index 4b8474951..530ee156d 100644 --- a/drivers/raw/dpaa2_qdma/dpaa2_qdma.c +++ b/drivers/raw/dpaa2_qdma/dpaa2_qdma.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright 2018-2019 NXP + * Copyright 2018-2020 NXP */ #include @@ -30,7 +30,7 @@ uint32_t dpaa2_coherent_no_alloc_cache; uint32_t dpaa2_coherent_alloc_cache; /* QDMA device */ -static struct qdma_device qdma_dev; +static struct qdma_device q_dev; /* QDMA H/W queues list */ TAILQ_HEAD(qdma_hw_queue_list, qdma_hw_queue); @@ -51,9 +51,11 @@ typedef int (dpdmai_dev_dequeue_multijob_t)(struct dpaa2_dpdmai_dev *dpdmai_dev, dpdmai_dev_dequeue_multijob_t *dpdmai_dev_dequeue_multijob; -typedef uint16_t (dpdmai_dev_get_job_t)(const struct qbman_fd *fd, +typedef uint16_t (dpdmai_dev_get_job_t)(struct qdma_device *qdma_dev, + const struct qbman_fd *fd, struct rte_qdma_job **job); -typedef int (dpdmai_dev_set_fd_t)(struct qbman_fd *fd, +typedef int (dpdmai_dev_set_fd_t)(struct qdma_device *qdma_dev, + struct qbman_fd *fd, struct rte_qdma_job *job, struct rte_qdma_rbp *rbp, uint16_t vq_id); @@ -201,10 +203,12 @@ dpaa2_qdma_populate_fle(struct qbman_fle *fle, DPAA2_SET_FLE_FIN(fle); } -static inline int dpdmai_dev_set_fd_us(struct qbman_fd *fd, - struct rte_qdma_job *job, - struct rte_qdma_rbp *rbp, - uint16_t vq_id) +static inline int dpdmai_dev_set_fd_us( + struct qdma_device *qdma_dev __rte_unused, + struct qbman_fd *fd, + struct rte_qdma_job *job, + struct rte_qdma_rbp *rbp, + uint16_t vq_id) { struct rte_qdma_job **ppjob; size_t iova; @@ -230,7 +234,8 @@ static inline int dpdmai_dev_set_fd_us(struct qbman_fd *fd, job->len, fd); return ret; } -static inline int dpdmai_dev_set_fd_lf(struct qbman_fd *fd, +static inline int dpdmai_dev_set_fd_lf(struct qdma_device *qdma_dev, + struct qbman_fd *fd, struct rte_qdma_job *job, struct rte_qdma_rbp *rbp, uint16_t vq_id) @@ -242,7 +247,7 @@ static inline int dpdmai_dev_set_fd_lf(struct qbman_fd *fd, * Get an FLE/SDD from FLE pool. * Note: IO metadata is before the FLE and SDD memory. */ - ret = rte_mempool_get(qdma_dev.fle_pool, (void **)(&ppjob)); + ret = rte_mempool_get(qdma_dev->fle_pool, (void **)(&ppjob)); if (ret) { DPAA2_QDMA_DP_DEBUG("Memory alloc failed for FLE"); return ret; @@ -266,8 +271,10 @@ static inline int dpdmai_dev_set_fd_lf(struct qbman_fd *fd, return 0; } -static inline uint16_t dpdmai_dev_get_job_us(const struct qbman_fd *fd, - struct rte_qdma_job **job) +static inline uint16_t dpdmai_dev_get_job_us( + struct qdma_device *qdma_dev __rte_unused, + const struct qbman_fd *fd, + struct rte_qdma_job **job) { uint16_t vqid; size_t iova; @@ -288,8 +295,9 @@ static inline uint16_t dpdmai_dev_get_job_us(const struct qbman_fd *fd, return vqid; } -static inline uint16_t dpdmai_dev_get_job_lf(const struct qbman_fd *fd, - struct rte_qdma_job **job) +static inline uint16_t dpdmai_dev_get_job_lf(struct qdma_device *qdma_dev, + const struct qbman_fd *fd, + struct rte_qdma_job **job) { struct rte_qdma_job **ppjob; uint16_t vqid; @@ -307,7 +315,7 @@ static inline uint16_t dpdmai_dev_get_job_lf(const struct qbman_fd *fd, vqid = (*job)->vq_id; /* Free FLE to the pool */ - rte_mempool_put(qdma_dev.fle_pool, (void *)ppjob); + rte_mempool_put(qdma_dev->fle_pool, (void *)ppjob); return vqid; } @@ -341,7 +349,7 @@ free_hw_queue(struct qdma_hw_queue *queue) static struct qdma_hw_queue * -get_hw_queue(uint32_t lcore_id) +get_hw_queue(struct qdma_device *qdma_dev, uint32_t lcore_id) { struct qdma_per_core_info *core_info; struct qdma_hw_queue *queue, *temp; @@ -357,7 +365,7 @@ get_hw_queue(uint32_t lcore_id) * Allocate a HW queue if there are less queues * than maximum per core queues configured */ - if (num_hw_queues < qdma_dev.max_hw_queues_per_core) { + if (num_hw_queues < qdma_dev->max_hw_queues_per_core) { queue = alloc_hw_queue(lcore_id); if (queue) { core_info->hw_queues[num_hw_queues] = queue; @@ -416,41 +424,41 @@ put_hw_queue(struct qdma_hw_queue *queue) } } -int -rte_qdma_init(void) +static int +dpaa2_qdma_attr_get(struct rte_rawdev *rawdev, + __rte_unused const char *attr_name, + uint64_t *attr_value) { + struct dpaa2_dpdmai_dev *dpdmai_dev = rawdev->dev_private; + struct qdma_device *qdma_dev = dpdmai_dev->qdma_dev; + struct rte_qdma_attr *qdma_attr = (struct rte_qdma_attr *)attr_value; + DPAA2_QDMA_FUNC_TRACE(); - rte_spinlock_init(&qdma_dev.lock); + qdma_attr->num_hw_queues = qdma_dev->num_hw_queues; return 0; } -void -rte_qdma_attr_get(struct rte_qdma_attr *qdma_attr) -{ - DPAA2_QDMA_FUNC_TRACE(); - - qdma_attr->num_hw_queues = qdma_dev.num_hw_queues; -} - -int -rte_qdma_reset(void) +static int +dpaa2_qdma_reset(struct rte_rawdev *rawdev) { struct qdma_hw_queue *queue; + struct dpaa2_dpdmai_dev *dpdmai_dev = rawdev->dev_private; + struct qdma_device *qdma_dev = dpdmai_dev->qdma_dev; int i; DPAA2_QDMA_FUNC_TRACE(); /* In case QDMA device is not in stopped state, return -EBUSY */ - if (qdma_dev.state == 1) { + if (qdma_dev->state == 1) { DPAA2_QDMA_ERR( "Device is in running state. Stop before reset."); return -EBUSY; } /* In case there are pending jobs on any VQ, return -EBUSY */ - for (i = 0; i < qdma_dev.max_vqs; i++) { + for (i = 0; i < qdma_dev->max_vqs; i++) { if (qdma_vqs[i].in_use && (qdma_vqs[i].num_enqueues != qdma_vqs[i].num_dequeues)) { DPAA2_QDMA_ERR("Jobs are still pending on VQ: %d", i); @@ -463,7 +471,7 @@ rte_qdma_reset(void) queue->num_users = 0; /* Reset and free virtual queues */ - for (i = 0; i < qdma_dev.max_vqs; i++) { + for (i = 0; i < qdma_dev->max_vqs; i++) { if (qdma_vqs[i].status_ring) rte_ring_free(qdma_vqs[i].status_ring); } @@ -476,43 +484,43 @@ rte_qdma_reset(void) sizeof(struct qdma_per_core_info) * RTE_MAX_LCORE); /* Free the FLE pool */ - if (qdma_dev.fle_pool) - rte_mempool_free(qdma_dev.fle_pool); + if (qdma_dev->fle_pool) + rte_mempool_free(qdma_dev->fle_pool); /* Reset QDMA device structure */ - qdma_dev.mode = RTE_QDMA_MODE_HW; - qdma_dev.max_hw_queues_per_core = 0; - qdma_dev.fle_pool = NULL; - qdma_dev.fle_pool_count = 0; - qdma_dev.max_vqs = 0; + qdma_dev->mode = RTE_QDMA_MODE_HW; + qdma_dev->max_hw_queues_per_core = 0; + qdma_dev->fle_pool = NULL; + qdma_dev->fle_pool_count = 0; + qdma_dev->max_vqs = 0; return 0; } -int -rte_qdma_configure(struct rte_qdma_config *qdma_config) +static int +dpaa2_qdma_configure(const struct rte_rawdev *rawdev, + rte_rawdev_obj_t config, + size_t config_size) { - int ret; char fle_pool_name[32]; /* RTE_MEMZONE_NAMESIZE = 32 */ + struct rte_qdma_config *qdma_config = (struct rte_qdma_config *)config; + struct dpaa2_dpdmai_dev *dpdmai_dev = rawdev->dev_private; + struct qdma_device *qdma_dev = dpdmai_dev->qdma_dev; DPAA2_QDMA_FUNC_TRACE(); + if (config_size != sizeof(*qdma_config)) + return -EINVAL; + /* In case QDMA device is not in stopped state, return -EBUSY */ - if (qdma_dev.state == 1) { + if (qdma_dev->state == 1) { DPAA2_QDMA_ERR( "Device is in running state. Stop before config."); return -1; } - /* Reset the QDMA device */ - ret = rte_qdma_reset(); - if (ret) { - DPAA2_QDMA_ERR("Resetting QDMA failed"); - return ret; - } - /* Set mode */ - qdma_dev.mode = qdma_config->mode; + qdma_dev->mode = qdma_config->mode; /* Set max HW queue per core */ if (qdma_config->max_hw_queues_per_core > MAX_HW_QUEUE_PER_CORE) { @@ -520,7 +528,7 @@ rte_qdma_configure(struct rte_qdma_config *qdma_config) MAX_HW_QUEUE_PER_CORE); return -EINVAL; } - qdma_dev.max_hw_queues_per_core = + qdma_dev->max_hw_queues_per_core = qdma_config->max_hw_queues_per_core; /* Allocate Virtual Queues */ @@ -531,24 +539,24 @@ rte_qdma_configure(struct rte_qdma_config *qdma_config) DPAA2_QDMA_ERR("qdma_virtual_queues allocation failed"); return -ENOMEM; } - qdma_dev.max_vqs = qdma_config->max_vqs; + qdma_dev->max_vqs = qdma_config->max_vqs; /* Allocate FLE pool; just append PID so that in case of * multiprocess, the pool's don't collide. */ snprintf(fle_pool_name, sizeof(fle_pool_name), "qdma_fle_pool%u", getpid()); - qdma_dev.fle_pool = rte_mempool_create(fle_pool_name, + qdma_dev->fle_pool = rte_mempool_create(fle_pool_name, qdma_config->fle_pool_count, QDMA_FLE_POOL_SIZE, QDMA_FLE_CACHE_SIZE(qdma_config->fle_pool_count), 0, NULL, NULL, NULL, NULL, SOCKET_ID_ANY, 0); - if (!qdma_dev.fle_pool) { + if (!qdma_dev->fle_pool) { DPAA2_QDMA_ERR("qdma_fle_pool create failed"); rte_free(qdma_vqs); qdma_vqs = NULL; return -ENOMEM; } - qdma_dev.fle_pool_count = qdma_config->fle_pool_count; + qdma_dev->fle_pool_count = qdma_config->fle_pool_count; if (qdma_config->format == RTE_QDMA_ULTRASHORT_FORMAT) { dpdmai_dev_get_job = dpdmai_dev_get_job_us; @@ -560,57 +568,71 @@ rte_qdma_configure(struct rte_qdma_config *qdma_config) return 0; } -int -rte_qdma_start(void) +static int +dpaa2_qdma_start(struct rte_rawdev *rawdev) { + struct dpaa2_dpdmai_dev *dpdmai_dev = rawdev->dev_private; + struct qdma_device *qdma_dev = dpdmai_dev->qdma_dev; + DPAA2_QDMA_FUNC_TRACE(); - qdma_dev.state = 1; + qdma_dev->state = 1; return 0; } -int -rte_qdma_vq_create(uint32_t lcore_id, uint32_t flags) +static int +dpaa2_qdma_queue_setup(struct rte_rawdev *rawdev, + __rte_unused uint16_t queue_id, + rte_rawdev_obj_t queue_conf, + size_t conf_size) { char ring_name[32]; int i; + struct dpaa2_dpdmai_dev *dpdmai_dev = rawdev->dev_private; + struct qdma_device *qdma_dev = dpdmai_dev->qdma_dev; + struct rte_qdma_queue_config *q_config = + (struct rte_qdma_queue_config *)queue_conf; DPAA2_QDMA_FUNC_TRACE(); - rte_spinlock_lock(&qdma_dev.lock); + if (conf_size != sizeof(*q_config)) + return -EINVAL; + + rte_spinlock_lock(&qdma_dev->lock); /* Get a free Virtual Queue */ - for (i = 0; i < qdma_dev.max_vqs; i++) { + for (i = 0; i < qdma_dev->max_vqs; i++) { if (qdma_vqs[i].in_use == 0) break; } /* Return in case no VQ is free */ - if (i == qdma_dev.max_vqs) { - rte_spinlock_unlock(&qdma_dev.lock); + if (i == qdma_dev->max_vqs) { + rte_spinlock_unlock(&qdma_dev->lock); DPAA2_QDMA_ERR("Unable to get lock on QDMA device"); return -ENODEV; } - if (qdma_dev.mode == RTE_QDMA_MODE_HW || - (flags & RTE_QDMA_VQ_EXCLUSIVE_PQ)) { + if (qdma_dev->mode == RTE_QDMA_MODE_HW || + (q_config->flags & RTE_QDMA_VQ_EXCLUSIVE_PQ)) { /* Allocate HW queue for a VQ */ - qdma_vqs[i].hw_queue = alloc_hw_queue(lcore_id); + qdma_vqs[i].hw_queue = alloc_hw_queue(q_config->lcore_id); qdma_vqs[i].exclusive_hw_queue = 1; } else { /* Allocate a Ring for Virutal Queue in VQ mode */ snprintf(ring_name, sizeof(ring_name), "status ring %d", i); qdma_vqs[i].status_ring = rte_ring_create(ring_name, - qdma_dev.fle_pool_count, rte_socket_id(), 0); + qdma_dev->fle_pool_count, rte_socket_id(), 0); if (!qdma_vqs[i].status_ring) { DPAA2_QDMA_ERR("Status ring creation failed for vq"); - rte_spinlock_unlock(&qdma_dev.lock); + rte_spinlock_unlock(&qdma_dev->lock); return rte_errno; } /* Get a HW queue (shared) for a VQ */ - qdma_vqs[i].hw_queue = get_hw_queue(lcore_id); + qdma_vqs[i].hw_queue = get_hw_queue(qdma_dev, + q_config->lcore_id); qdma_vqs[i].exclusive_hw_queue = 0; } @@ -619,28 +641,18 @@ rte_qdma_vq_create(uint32_t lcore_id, uint32_t flags) if (qdma_vqs[i].status_ring) rte_ring_free(qdma_vqs[i].status_ring); qdma_vqs[i].status_ring = NULL; - rte_spinlock_unlock(&qdma_dev.lock); + rte_spinlock_unlock(&qdma_dev->lock); return -ENODEV; } qdma_vqs[i].in_use = 1; - qdma_vqs[i].lcore_id = lcore_id; + qdma_vqs[i].lcore_id = q_config->lcore_id; memset(&qdma_vqs[i].rbp, 0, sizeof(struct rte_qdma_rbp)); - rte_spinlock_unlock(&qdma_dev.lock); + rte_spinlock_unlock(&qdma_dev->lock); - return i; -} - -/*create vq for route-by-port*/ -int -rte_qdma_vq_create_rbp(uint32_t lcore_id, uint32_t flags, - struct rte_qdma_rbp *rbp) -{ - int i; - - i = rte_qdma_vq_create(lcore_id, flags); - - memcpy(&qdma_vqs[i].rbp, rbp, sizeof(struct rte_qdma_rbp)); + if (q_config->rbp != NULL) + memcpy(&qdma_vqs[i].rbp, q_config->rbp, + sizeof(struct rte_qdma_rbp)); return i; } @@ -689,7 +701,7 @@ dpdmai_dev_enqueue_multi(struct dpaa2_dpdmai_dev *dpdmai_dev, dpaa2_eqcr_size : nb_jobs; for (loop = 0; loop < num_to_send; loop++) { - ret = dpdmai_dev_set_fd(&fd[loop], + ret = dpdmai_dev_set_fd(dpdmai_dev->qdma_dev, &fd[loop], job[num_tx], rbp, vq_id); if (ret < 0) { /* Set nb_jobs to loop, so outer while loop @@ -724,12 +736,14 @@ dpdmai_dev_enqueue_multi(struct dpaa2_dpdmai_dev *dpdmai_dev, return num_tx; } -int -rte_qdma_vq_enqueue_multi(uint16_t vq_id, - struct rte_qdma_job **job, - uint16_t nb_jobs) +static int +dpaa2_qdma_enqueue(__rte_unused struct rte_rawdev *rawdev, + __rte_unused struct rte_rawdev_buf **buffers, + unsigned int nb_jobs, + rte_rawdev_obj_t context) { - struct qdma_virt_queue *qdma_vq = &qdma_vqs[vq_id]; + struct rte_qdma_enqdeq *e_context = (struct rte_qdma_enqdeq *)context; + struct qdma_virt_queue *qdma_vq = &qdma_vqs[e_context->vq_id]; struct qdma_hw_queue *qdma_pq = qdma_vq->hw_queue; struct dpaa2_dpdmai_dev *dpdmai_dev = qdma_pq->dpdmai_dev; int ret; @@ -737,15 +751,15 @@ rte_qdma_vq_enqueue_multi(uint16_t vq_id, /* Return error in case of wrong lcore_id */ if (rte_lcore_id() != qdma_vq->lcore_id) { DPAA2_QDMA_ERR("QDMA enqueue for vqid %d on wrong core", - vq_id); + e_context->vq_id); return -EINVAL; } ret = dpdmai_dev_enqueue_multi(dpdmai_dev, qdma_pq->queue_id, - vq_id, + e_context->vq_id, &qdma_vq->rbp, - job, + e_context->job, nb_jobs); if (ret < 0) { DPAA2_QDMA_ERR("DPDMAI device enqueue failed: %d", ret); @@ -757,13 +771,6 @@ rte_qdma_vq_enqueue_multi(uint16_t vq_id, return ret; } -int -rte_qdma_vq_enqueue(uint16_t vq_id, - struct rte_qdma_job *job) -{ - return rte_qdma_vq_enqueue_multi(vq_id, &job, 1); -} - /* Function to receive a QDMA job for a given device and queue*/ static int dpdmai_dev_dequeue_multijob_prefetch( @@ -878,7 +885,8 @@ dpdmai_dev_dequeue_multijob_prefetch( } fd = qbman_result_DQ_fd(dq_storage); - vqid = dpdmai_dev_get_job(fd, &job[num_rx]); + vqid = dpdmai_dev_get_job(dpdmai_dev->qdma_dev, fd, + &job[num_rx]); if (vq_id) vq_id[num_rx] = vqid; @@ -994,7 +1002,8 @@ dpdmai_dev_dequeue_multijob_no_prefetch( } fd = qbman_result_DQ_fd(dq_storage); - vqid = dpdmai_dev_get_job(fd, &job[num_rx]); + vqid = dpdmai_dev_get_job(dpdmai_dev->qdma_dev, fd, + &job[num_rx]); if (vq_id) vq_id[num_rx] = vqid; @@ -1009,21 +1018,24 @@ dpdmai_dev_dequeue_multijob_no_prefetch( return num_rx; } -int -rte_qdma_vq_dequeue_multi(uint16_t vq_id, - struct rte_qdma_job **job, - uint16_t nb_jobs) +static int +dpaa2_qdma_dequeue(__rte_unused struct rte_rawdev *rawdev, + __rte_unused struct rte_rawdev_buf **buffers, + unsigned int nb_jobs, + rte_rawdev_obj_t cntxt) { - struct qdma_virt_queue *qdma_vq = &qdma_vqs[vq_id]; + struct rte_qdma_enqdeq *context = (struct rte_qdma_enqdeq *)cntxt; + struct qdma_virt_queue *qdma_vq = &qdma_vqs[context->vq_id]; struct qdma_hw_queue *qdma_pq = qdma_vq->hw_queue; struct qdma_virt_queue *temp_qdma_vq; struct dpaa2_dpdmai_dev *dpdmai_dev = qdma_pq->dpdmai_dev; - int ring_count, ret = 0, i; + int ret = 0, i; + unsigned int ring_count; /* Return error in case of wrong lcore_id */ if (rte_lcore_id() != (unsigned int)(qdma_vq->lcore_id)) { DPAA2_QDMA_WARN("QDMA dequeue for vqid %d on wrong core", - vq_id); + context->vq_id); return -1; } @@ -1037,7 +1049,7 @@ rte_qdma_vq_dequeue_multi(uint16_t vq_id, if (qdma_vq->exclusive_hw_queue) { /* In case of exclusive queue directly fetch from HW queue */ ret = dpdmai_dev_dequeue_multijob(dpdmai_dev, qdma_pq->queue_id, - NULL, job, nb_jobs); + NULL, context->job, nb_jobs); if (ret < 0) { DPAA2_QDMA_ERR( "Dequeue from DPDMAI device failed: %d", ret); @@ -1056,11 +1068,11 @@ rte_qdma_vq_dequeue_multi(uint16_t vq_id, /* TODO - How to have right budget */ ret = dpdmai_dev_dequeue_multijob(dpdmai_dev, qdma_pq->queue_id, - temp_vq_id, job, nb_jobs); + temp_vq_id, context->job, nb_jobs); for (i = 0; i < ret; i++) { temp_qdma_vq = &qdma_vqs[temp_vq_id[i]]; rte_ring_enqueue(temp_qdma_vq->status_ring, - (void *)(job[i])); + (void *)(context->job[i])); } ring_count = rte_ring_count( qdma_vq->status_ring); @@ -1071,7 +1083,8 @@ rte_qdma_vq_dequeue_multi(uint16_t vq_id, * to provide to the user */ ret = rte_ring_dequeue_bulk(qdma_vq->status_ring, - (void **)job, ring_count, NULL); + (void **)context->job, + ring_count, NULL); if (ret) qdma_vq->num_dequeues += ret; } @@ -1080,19 +1093,6 @@ rte_qdma_vq_dequeue_multi(uint16_t vq_id, return ret; } -struct rte_qdma_job * -rte_qdma_vq_dequeue(uint16_t vq_id) -{ - int ret; - struct rte_qdma_job *job = NULL; - - ret = rte_qdma_vq_dequeue_multi(vq_id, &job, 1); - if (ret < 0) - DPAA2_QDMA_DP_WARN("DPDMAI device dequeue failed: %d", ret); - - return job; -} - void rte_qdma_vq_stats(uint16_t vq_id, struct rte_qdma_vq_stats *vq_status) @@ -1109,9 +1109,13 @@ rte_qdma_vq_stats(uint16_t vq_id, } } -int -rte_qdma_vq_destroy(uint16_t vq_id) +static int +dpaa2_qdma_queue_release(struct rte_rawdev *rawdev, + uint16_t vq_id) { + struct dpaa2_dpdmai_dev *dpdmai_dev = rawdev->dev_private; + struct qdma_device *qdma_dev = dpdmai_dev->qdma_dev; + struct qdma_virt_queue *qdma_vq = &qdma_vqs[vq_id]; DPAA2_QDMA_FUNC_TRACE(); @@ -1120,7 +1124,7 @@ rte_qdma_vq_destroy(uint16_t vq_id) if (qdma_vq->num_enqueues != qdma_vq->num_dequeues) return -EBUSY; - rte_spinlock_lock(&qdma_dev.lock); + rte_spinlock_lock(&qdma_dev->lock); if (qdma_vq->exclusive_hw_queue) free_hw_queue(qdma_vq->hw_queue); @@ -1133,57 +1137,44 @@ rte_qdma_vq_destroy(uint16_t vq_id) memset(qdma_vq, 0, sizeof(struct qdma_virt_queue)); - rte_spinlock_unlock(&qdma_dev.lock); + rte_spinlock_unlock(&qdma_dev->lock); return 0; } -int -rte_qdma_vq_destroy_rbp(uint16_t vq_id) +static void +dpaa2_qdma_stop(struct rte_rawdev *rawdev) { - struct qdma_virt_queue *qdma_vq = &qdma_vqs[vq_id]; + struct dpaa2_dpdmai_dev *dpdmai_dev = rawdev->dev_private; + struct qdma_device *qdma_dev = dpdmai_dev->qdma_dev; DPAA2_QDMA_FUNC_TRACE(); - /* In case there are pending jobs on any VQ, return -EBUSY */ - if (qdma_vq->num_enqueues != qdma_vq->num_dequeues) - return -EBUSY; - - rte_spinlock_lock(&qdma_dev.lock); - - if (qdma_vq->exclusive_hw_queue) { - free_hw_queue(qdma_vq->hw_queue); - } else { - if (qdma_vqs->status_ring) - rte_ring_free(qdma_vqs->status_ring); - - put_hw_queue(qdma_vq->hw_queue); - } - - memset(qdma_vq, 0, sizeof(struct qdma_virt_queue)); - - rte_spinlock_unlock(&qdma_dev.lock); - - return 0; + qdma_dev->state = 0; } -void -rte_qdma_stop(void) +static int +dpaa2_qdma_close(struct rte_rawdev *rawdev) { DPAA2_QDMA_FUNC_TRACE(); - qdma_dev.state = 0; -} + dpaa2_qdma_reset(rawdev); -void -rte_qdma_destroy(void) -{ - DPAA2_QDMA_FUNC_TRACE(); - - rte_qdma_reset(); + return 0; } -static const struct rte_rawdev_ops dpaa2_qdma_ops; +static struct rte_rawdev_ops dpaa2_qdma_ops = { + .dev_configure = dpaa2_qdma_configure, + .dev_start = dpaa2_qdma_start, + .dev_stop = dpaa2_qdma_stop, + .dev_reset = dpaa2_qdma_reset, + .dev_close = dpaa2_qdma_close, + .queue_setup = dpaa2_qdma_queue_setup, + .queue_release = dpaa2_qdma_queue_release, + .attr_get = dpaa2_qdma_attr_get, + .enqueue_bufs = dpaa2_qdma_enqueue, + .dequeue_bufs = dpaa2_qdma_dequeue, +}; static int add_hw_queues_to_list(struct dpaa2_dpdmai_dev *dpdmai_dev) @@ -1205,7 +1196,7 @@ add_hw_queues_to_list(struct dpaa2_dpdmai_dev *dpdmai_dev) queue->queue_id = i; TAILQ_INSERT_TAIL(&qdma_queue_list, queue, next); - qdma_dev.num_hw_queues++; + dpdmai_dev->qdma_dev->num_hw_queues++; } return 0; @@ -1314,6 +1305,7 @@ dpaa2_dpdmai_dev_init(struct rte_rawdev *rawdev, int dpdmai_id) /* Open DPDMAI device */ dpdmai_dev->dpdmai_id = dpdmai_id; dpdmai_dev->dpdmai.regs = dpaa2_get_mcp_ptr(MC_PORTAL_INDEX); + dpdmai_dev->qdma_dev = &q_dev; ret = dpdmai_open(&dpdmai_dev->dpdmai, CMD_PRI_LOW, dpdmai_dev->dpdmai_id, &dpdmai_dev->token); if (ret) { @@ -1428,6 +1420,8 @@ dpaa2_dpdmai_dev_init(struct rte_rawdev *rawdev, int dpdmai_id) DPAA2_QDMA_DEBUG("Initialized dpdmai object successfully"); + rte_spinlock_init(&dpdmai_dev->qdma_dev->lock); + return 0; init_err: dpaa2_dpdmai_dev_uninit(rawdev); @@ -1463,6 +1457,13 @@ rte_dpaa2_qdma_probe(struct rte_dpaa2_driver *dpaa2_drv, return ret; } + /* Reset the QDMA device */ + ret = dpaa2_qdma_reset(rawdev); + if (ret) { + DPAA2_QDMA_ERR("Resetting QDMA failed"); + return ret; + } + return 0; } diff --git a/drivers/raw/dpaa2_qdma/dpaa2_qdma.h b/drivers/raw/dpaa2_qdma/dpaa2_qdma.h index 017638075..3c112d28f 100644 --- a/drivers/raw/dpaa2_qdma/dpaa2_qdma.h +++ b/drivers/raw/dpaa2_qdma/dpaa2_qdma.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright 2018-2019 NXP + * Copyright 2018-2020 NXP */ #ifndef __DPAA2_QDMA_H__ @@ -173,6 +173,7 @@ struct dpaa2_dpdmai_dev { struct dpaa2_queue rx_queue[DPAA2_DPDMAI_MAX_QUEUES]; /** TX queues */ struct dpaa2_queue tx_queue[DPAA2_DPDMAI_MAX_QUEUES]; + struct qdma_device *qdma_dev; }; #endif /* __DPAA2_QDMA_H__ */ diff --git a/drivers/raw/dpaa2_qdma/rte_pmd_dpaa2_qdma.h b/drivers/raw/dpaa2_qdma/rte_pmd_dpaa2_qdma.h index 4e1268cc5..71894d35e 100644 --- a/drivers/raw/dpaa2_qdma/rte_pmd_dpaa2_qdma.h +++ b/drivers/raw/dpaa2_qdma/rte_pmd_dpaa2_qdma.h @@ -1,10 +1,12 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright 2018-2019 NXP + * Copyright 2018-2020 NXP */ #ifndef __RTE_PMD_DPAA2_QDMA_H__ #define __RTE_PMD_DPAA2_QDMA_H__ +#include + /** * @file * @@ -154,150 +156,29 @@ struct rte_qdma_job { uint16_t vq_id; }; -/** - * Initialize the QDMA device. - * - * @returns - * - 0: Success. - * - <0: Error code. - */ -int -rte_qdma_init(void); - -/** - * Get the QDMA attributes. - * - * @param qdma_attr - * QDMA attributes providing total number of hw queues etc. - */ -void -rte_qdma_attr_get(struct rte_qdma_attr *qdma_attr); - -/** - * Reset the QDMA device. This API will completely reset the QDMA - * device, bringing it to original state as if only rte_qdma_init() API - * has been called. - * - * @returns - * - 0: Success. - * - <0: Error code. - */ -int -rte_qdma_reset(void); - -/** - * Configure the QDMA device. - * - * @returns - * - 0: Success. - * - <0: Error code. - */ -int -rte_qdma_configure(struct rte_qdma_config *qdma_config); - -/** - * Start the QDMA device. - * - * @returns - * - 0: Success. - * - <0: Error code. - */ -int -rte_qdma_start(void); - -/** - * Create a Virtual Queue on a particular lcore id. - * This API can be called from any thread/core. User can create/destroy - * VQ's at runtime. - * - * @param lcore_id - * LCORE ID on which this particular queue would be associated with. - * @param flags - * RTE_QDMA_VQ_ flags. See macro definitions. - * - * @returns - * - >= 0: Virtual queue ID. - * - <0: Error code. - */ -int -rte_qdma_vq_create(uint32_t lcore_id, uint32_t flags); - -/*create vq for route-by-port*/ -int -rte_qdma_vq_create_rbp(uint32_t lcore_id, uint32_t flags, - struct rte_qdma_rbp *rbp); - -/** - * Enqueue multiple jobs to a Virtual Queue. - * If the enqueue is successful, the H/W will perform DMA operations - * on the basis of the QDMA jobs provided. - * - * @param vq_id - * Virtual Queue ID. - * @param job - * List of QDMA Jobs containing relevant information related to DMA. - * @param nb_jobs - * Number of QDMA jobs provided by the user. - * - * @returns - * - >=0: Number of jobs successfully submitted - * - <0: Error code. - */ -int -rte_qdma_vq_enqueue_multi(uint16_t vq_id, - struct rte_qdma_job **job, - uint16_t nb_jobs); - -/** - * Enqueue a single job to a Virtual Queue. - * If the enqueue is successful, the H/W will perform DMA operations - * on the basis of the QDMA job provided. - * - * @param vq_id - * Virtual Queue ID. - * @param job - * A QDMA Job containing relevant information related to DMA. - * - * @returns - * - >=0: Number of jobs successfully submitted - * - <0: Error code. - */ -int -rte_qdma_vq_enqueue(uint16_t vq_id, - struct rte_qdma_job *job); +struct rte_qdma_enqdeq { + uint16_t vq_id; + struct rte_qdma_job **job; +}; -/** - * Dequeue multiple completed jobs from a Virtual Queue. - * Provides the list of completed jobs capped by nb_jobs. - * - * @param vq_id - * Virtual Queue ID. - * @param job - * List of QDMA Jobs returned from the API. - * @param nb_jobs - * Number of QDMA jobs requested for dequeue by the user. - * - * @returns - * - >=0: Number of jobs successfully received - * - <0: Error code. - */ -int -rte_qdma_vq_dequeue_multi(uint16_t vq_id, - struct rte_qdma_job **job, - uint16_t nb_jobs); +struct rte_qdma_queue_config { + uint32_t lcore_id; + uint32_t flags; + struct rte_qdma_rbp *rbp; +}; -/** - * Dequeue a single completed jobs from a Virtual Queue. - * - * @param vq_id - * Virtual Queue ID. - * - * @returns - * - A completed job or NULL if no job is there. - */ -struct rte_qdma_job * -rte_qdma_vq_dequeue(uint16_t vq_id); +#define rte_qdma_info rte_rawdev_info +#define rte_qdma_start(id) rte_rawdev_start(id) +#define rte_qdma_reset(id) rte_rawdev_reset(id) +#define rte_qdma_configure(id, cf) rte_rawdev_configure(id, cf) +#define rte_qdma_dequeue_buffers(id, buf, num, ctxt) \ + rte_rawdev_dequeue_buffers(id, buf, num, ctxt) +#define rte_qdma_enqueue_buffers(id, buf, num, ctxt) \ + rte_rawdev_enqueue_buffers(id, buf, num, ctxt) +#define rte_qdma_queue_setup(id, qid, cfg) \ + rte_rawdev_queue_setup(id, qid, cfg) +/*TODO introduce per queue stats API in rawdew */ /** * Get a Virtual Queue statistics. * @@ -310,46 +191,4 @@ void rte_qdma_vq_stats(uint16_t vq_id, struct rte_qdma_vq_stats *vq_stats); -/** - * Destroy the Virtual Queue specified by vq_id. - * This API can be called from any thread/core. User can create/destroy - * VQ's at runtime. - * - * @param vq_id - * Virtual Queue ID which needs to be uninitialized. - * - * @returns - * - 0: Success. - * - <0: Error code. - */ -int -rte_qdma_vq_destroy(uint16_t vq_id); - -/** - * Destroy the RBP specific Virtual Queue specified by vq_id. - * This API can be called from any thread/core. User can create/destroy - * VQ's at runtime. - * - * @param vq_id - * RBP based Virtual Queue ID which needs to be uninitialized. - * - * @returns - * - 0: Success. - * - <0: Error code. - */ - -int -rte_qdma_vq_destroy_rbp(uint16_t vq_id); -/** - * Stop QDMA device. - */ -void -rte_qdma_stop(void); - -/** - * Destroy the QDMA device. - */ -void -rte_qdma_destroy(void); - #endif /* __RTE_PMD_DPAA2_QDMA_H__*/ -- 2.17.1