get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/75450/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 75450,
    "url": "http://patches.dpdk.org/api/patches/75450/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200812063127.8687-6-vikas.gupta@broadcom.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200812063127.8687-6-vikas.gupta@broadcom.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200812063127.8687-6-vikas.gupta@broadcom.com",
    "date": "2020-08-12T06:31:24",
    "name": "[v1,5/8] crypto/bcmfs: create a symmetric cryptodev",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "4b2cf4399ed2acb9cddcd2b8433b093615233b57",
    "submitter": {
        "id": 1907,
        "url": "http://patches.dpdk.org/api/people/1907/?format=api",
        "name": "Vikas Gupta",
        "email": "vikas.gupta@broadcom.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200812063127.8687-6-vikas.gupta@broadcom.com/mbox/",
    "series": [
        {
            "id": 11611,
            "url": "http://patches.dpdk.org/api/series/11611/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=11611",
            "date": "2020-08-12T06:31:19",
            "name": "Add Crypto PMD for Broadcom`s FlexSparc devices",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/11611/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/75450/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/75450/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id E1A5AA04C2;\n\tWed, 12 Aug 2020 08:32:53 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id B95731C10E;\n\tWed, 12 Aug 2020 08:31:59 +0200 (CEST)",
            "from mail-qt1-f194.google.com (mail-qt1-f194.google.com\n [209.85.160.194]) by dpdk.org (Postfix) with ESMTP id 4BDB31C0B5\n for <dev@dpdk.org>; Wed, 12 Aug 2020 08:31:58 +0200 (CEST)",
            "by mail-qt1-f194.google.com with SMTP id b25so770597qto.2\n for <dev@dpdk.org>; Tue, 11 Aug 2020 23:31:58 -0700 (PDT)",
            "from rahul_yocto_ubuntu18.ibn.broadcom.net ([192.19.234.250])\n by smtp.gmail.com with ESMTPSA id x3sm1301552qkx.3.2020.08.11.23.31.53\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 11 Aug 2020 23:31:56 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com;\n s=google;\n h=from:to:cc:subject:date:message-id:in-reply-to:references;\n bh=6g2jJ6dAyOZcXqDRa858yYE23ByzzEO7SfkQUplP7Bk=;\n b=WlfXnO4l2fgARayOtxE3VJzrQgr5AxsDXaiEsLw3vU5hKYe5tDEMFpCFbUbCjztfNa\n 0gmviMJBecU9/1ydQCkTh7ELFOdIxnfSLGup0NW1qFJuuP2PVvIHhLuRE8ec3DANt1Ws\n RuvpxGJuXNQCCp0FLhhJaW17BpMZdtiC96yV4=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references;\n bh=6g2jJ6dAyOZcXqDRa858yYE23ByzzEO7SfkQUplP7Bk=;\n b=RzyhY+Py5VVXHEuSrAxEhNeUGF+Yyvsz/QogogN7BNt1gn8fIvKB2iemQSIUUBgNx+\n MtiYOdWFYXhSj8PAZVfAbQiQmXP2PD5xv3mQ7I29pz/eMrTIfdurnscNH1vwnLsPiVeU\n wrg6unfLa2Ze1FEQaTMcR2S68r3vb0nJwXPgBJJ6u86+chSuipuooncPX6qhtq/RJSO1\n edwQurvN9+B7yNFrWT2bE3Y/xD99xu6fUE37jIs72xfSi54qdWYkE360YGiJS6v0gXoZ\n 6DPWGj8ErMXf81g00ckTDkBbt8ftC143i6lRQu7gWxgfd3XNwgsfi1K0EZ7SId2V+Wnx\n PQqw==",
        "X-Gm-Message-State": "AOAM530iVNgOI4iQ6XdXzlnia1fWiJA4SrH4/OTK1PpWysr6EGpI5R+F\n RlfBE5ttjmIWyMyr7LawyWK9xTgt2XhX5O6KXakEQSkinjd671HvCWjS/4rZzLMXtLUBATTfXHh\n WjpvHODtA7ngKbmQ9DJ4yvbHMFVBiPUqh+ZZK0LADB/Jvvs9DxpdxmdeH7npY",
        "X-Google-Smtp-Source": "\n ABdhPJzzchBp3JuDXkxIAeWco6H9q/LQL08/e8YQPWYkqXQm+QOmK0x0AL4TSBlsrffsv0wWj8R/2g==",
        "X-Received": "by 2002:aed:3e59:: with SMTP id m25mr4980965qtf.341.1597213916896;\n Tue, 11 Aug 2020 23:31:56 -0700 (PDT)",
        "From": "Vikas Gupta <vikas.gupta@broadcom.com>",
        "To": "dev@dpdk.org,\n\takhil.goyal@nxp.com",
        "Cc": "ajit.khaparde@broadcom.com, vikram.prakash@broadcom.com,\n Vikas Gupta <vikas.gupta@broadcom.com>,\n Raveendra Padasalagi <raveendra.padasalagi@broadcom.com>",
        "Date": "Wed, 12 Aug 2020 12:01:24 +0530",
        "Message-Id": "<20200812063127.8687-6-vikas.gupta@broadcom.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20200812063127.8687-1-vikas.gupta@broadcom.com>",
        "References": "<20200811145813.44754-1-vikas.gupta@broadcom.com>\n <20200812063127.8687-1-vikas.gupta@broadcom.com>",
        "Subject": "[dpdk-dev] [PATCH v1 5/8] crypto/bcmfs: create a symmetric cryptodev",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Create a symmetric crypto device and supported cryptodev ops.\n\nSigned-off-by: Vikas Gupta <vikas.gupta@broadcom.com>\nSigned-off-by: Raveendra Padasalagi <raveendra.padasalagi@broadcom.com>\nReviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>\n---\n drivers/crypto/bcmfs/bcmfs_device.c  |  15 ++\n drivers/crypto/bcmfs/bcmfs_device.h  |   9 +\n drivers/crypto/bcmfs/bcmfs_qp.c      |  37 +++\n drivers/crypto/bcmfs/bcmfs_qp.h      |  16 ++\n drivers/crypto/bcmfs/bcmfs_sym_pmd.c | 387 +++++++++++++++++++++++++++\n drivers/crypto/bcmfs/bcmfs_sym_pmd.h |  38 +++\n drivers/crypto/bcmfs/bcmfs_sym_req.h |  22 ++\n drivers/crypto/bcmfs/meson.build     |   3 +-\n 8 files changed, 526 insertions(+), 1 deletion(-)\n create mode 100644 drivers/crypto/bcmfs/bcmfs_sym_pmd.c\n create mode 100644 drivers/crypto/bcmfs/bcmfs_sym_pmd.h\n create mode 100644 drivers/crypto/bcmfs/bcmfs_sym_req.h",
    "diff": "diff --git a/drivers/crypto/bcmfs/bcmfs_device.c b/drivers/crypto/bcmfs/bcmfs_device.c\nindex bd2d64acf..c9263ec28 100644\n--- a/drivers/crypto/bcmfs/bcmfs_device.c\n+++ b/drivers/crypto/bcmfs/bcmfs_device.c\n@@ -13,6 +13,7 @@\n #include \"bcmfs_logs.h\"\n #include \"bcmfs_qp.h\"\n #include \"bcmfs_vfio.h\"\n+#include \"bcmfs_sym_pmd.h\"\n \n struct bcmfs_device_attr {\n \tconst char name[BCMFS_MAX_PATH_LEN];\n@@ -239,6 +240,7 @@ bcmfs_vdev_probe(struct rte_vdev_device *vdev)\n \tchar out_dirname[BCMFS_MAX_PATH_LEN];\n \tuint32_t fsdev_dev[BCMFS_MAX_NODES];\n \tenum bcmfs_device_type dtype;\n+\tint err;\n \tint i = 0;\n \tint dev_idx;\n \tint count = 0;\n@@ -290,7 +292,20 @@ bcmfs_vdev_probe(struct rte_vdev_device *vdev)\n \t\treturn -ENODEV;\n \t}\n \n+\terr = bcmfs_sym_dev_create(fsdev);\n+\tif (err) {\n+\t\tBCMFS_LOG(WARNING,\n+\t\t\t  \"Failed to create BCMFS SYM PMD for device %s\",\n+\t\t\t  fsdev->name);\n+\t\tgoto pmd_create_fail;\n+\t}\n+\n \treturn 0;\n+\n+pmd_create_fail:\n+\tfsdev_release(fsdev);\n+\n+\treturn err;\n }\n \n static int\ndiff --git a/drivers/crypto/bcmfs/bcmfs_device.h b/drivers/crypto/bcmfs/bcmfs_device.h\nindex 96beb10fa..37907b91f 100644\n--- a/drivers/crypto/bcmfs/bcmfs_device.h\n+++ b/drivers/crypto/bcmfs/bcmfs_device.h\n@@ -62,6 +62,15 @@ struct bcmfs_device {\n \tstruct bcmfs_qp *qps_in_use[BCMFS_MAX_HW_QUEUES];\n \t/* queue pair ops exported by symmetric crypto hw */\n \tstruct bcmfs_hw_queue_pair_ops *sym_hw_qp_ops;\n+\t/* a cryptodevice attached to bcmfs device */\n+\tstruct rte_cryptodev *cdev;\n+\t/* a rte_device to register with cryptodev */\n+\tstruct rte_device sym_rte_dev;\n+\t/* private info to keep with cryptodev */\n+\tstruct bcmfs_sym_dev_private *sym_dev;\n };\n \n+/* stats exported by device */\n+\n+\n #endif /* _BCMFS_DEV_H_ */\ndiff --git a/drivers/crypto/bcmfs/bcmfs_qp.c b/drivers/crypto/bcmfs/bcmfs_qp.c\nindex ec1327b78..cb5ff6c61 100644\n--- a/drivers/crypto/bcmfs/bcmfs_qp.c\n+++ b/drivers/crypto/bcmfs/bcmfs_qp.c\n@@ -344,3 +344,40 @@ bcmfs_dequeue_op_burst(void *qp, void **ops, uint16_t nb_ops)\n \n \treturn deq;\n }\n+\n+void bcmfs_qp_stats_get(struct bcmfs_qp **qp, int num_qp,\n+\t\t\tstruct bcmfs_qp_stats *stats)\n+{\n+\tint i;\n+\n+\tif (stats == NULL) {\n+\t\tBCMFS_LOG(ERR, \"invalid param: stats %p\",\n+\t\t\t  stats);\n+\t\treturn;\n+\t}\n+\n+\tfor (i = 0; i < num_qp; i++) {\n+\t\tif (qp[i] == NULL) {\n+\t\t\tBCMFS_LOG(DEBUG, \"Uninitialised qp %d\", i);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tstats->enqueued_count += qp[i]->stats.enqueued_count;\n+\t\tstats->dequeued_count += qp[i]->stats.dequeued_count;\n+\t\tstats->enqueue_err_count += qp[i]->stats.enqueue_err_count;\n+\t\tstats->dequeue_err_count += qp[i]->stats.dequeue_err_count;\n+\t}\n+}\n+\n+void bcmfs_qp_stats_reset(struct bcmfs_qp **qp, int num_qp)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < num_qp; i++) {\n+\t\tif (qp[i] == NULL) {\n+\t\t\tBCMFS_LOG(DEBUG, \"Uninitialised qp %d\", i);\n+\t\t\tcontinue;\n+\t\t}\n+\t\tmemset(&qp[i]->stats, 0, sizeof(qp[i]->stats));\n+\t}\n+}\ndiff --git a/drivers/crypto/bcmfs/bcmfs_qp.h b/drivers/crypto/bcmfs/bcmfs_qp.h\nindex e4b0c3f2f..fec58ca71 100644\n--- a/drivers/crypto/bcmfs/bcmfs_qp.h\n+++ b/drivers/crypto/bcmfs/bcmfs_qp.h\n@@ -24,6 +24,13 @@ enum bcmfs_queue_type {\n \tBCMFS_RM_CPLQ\n };\n \n+#define BCMFS_QP_IOBASE_XLATE(base, idx)\t\\\n+\t\t((base) + ((idx) * BCMFS_HW_QUEUE_IO_ADDR_LEN))\n+\n+/* Max pkts for preprocessing before submitting to h/w qp */\n+#define BCMFS_MAX_REQS_BUFF\t64\n+\n+/* qp stats */\n struct bcmfs_qp_stats {\n \t/* Count of all operations enqueued */\n \tuint64_t enqueued_count;\n@@ -92,6 +99,10 @@ struct bcmfs_qp {\n \tstruct bcmfs_qp_stats stats;\n \t/* h/w ops associated with qp */\n \tstruct bcmfs_hw_queue_pair_ops *ops;\n+\t/* bcmfs requests pool*/\n+\tstruct rte_mempool *sr_mp;\n+\t/* a temporary buffer to keep message pointers */\n+\tstruct bcmfs_qp_message *infl_msgs[BCMFS_MAX_REQS_BUFF];\n \n } __rte_cache_aligned;\n \n@@ -123,4 +134,9 @@ bcmfs_qp_setup(struct bcmfs_qp **qp_addr,\n \t       uint16_t queue_pair_id,\n \t       struct bcmfs_qp_config *bcmfs_conf);\n \n+/* stats functions*/\n+void bcmfs_qp_stats_get(struct bcmfs_qp **qp, int num_qp,\n+\t\t\tstruct bcmfs_qp_stats *stats);\n+void bcmfs_qp_stats_reset(struct bcmfs_qp **qp, int num_qp);\n+\n #endif /* _BCMFS_QP_H_ */\ndiff --git a/drivers/crypto/bcmfs/bcmfs_sym_pmd.c b/drivers/crypto/bcmfs/bcmfs_sym_pmd.c\nnew file mode 100644\nindex 000000000..0f96915f7\n--- /dev/null\n+++ b/drivers/crypto/bcmfs/bcmfs_sym_pmd.c\n@@ -0,0 +1,387 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2020 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#include <rte_common.h>\n+#include <rte_dev.h>\n+#include <rte_errno.h>\n+#include <rte_malloc.h>\n+#include <rte_cryptodev_pmd.h>\n+\n+#include \"bcmfs_device.h\"\n+#include \"bcmfs_logs.h\"\n+#include \"bcmfs_qp.h\"\n+#include \"bcmfs_sym_pmd.h\"\n+#include \"bcmfs_sym_req.h\"\n+\n+uint8_t cryptodev_bcmfs_driver_id;\n+\n+static int bcmfs_sym_qp_release(struct rte_cryptodev *dev,\n+\t\t\t\tuint16_t queue_pair_id);\n+\n+static int\n+bcmfs_sym_dev_config(__rte_unused struct rte_cryptodev *dev,\n+\t\t     __rte_unused struct rte_cryptodev_config *config)\n+{\n+\treturn 0;\n+}\n+\n+static int\n+bcmfs_sym_dev_start(__rte_unused struct rte_cryptodev *dev)\n+{\n+\treturn 0;\n+}\n+\n+static void\n+bcmfs_sym_dev_stop(__rte_unused struct rte_cryptodev *dev)\n+{\n+}\n+\n+static int\n+bcmfs_sym_dev_close(struct rte_cryptodev *dev)\n+{\n+\tint i, ret;\n+\n+\tfor (i = 0; i < dev->data->nb_queue_pairs; i++) {\n+\t\tret = bcmfs_sym_qp_release(dev, i);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+bcmfs_sym_dev_info_get(struct rte_cryptodev *dev,\n+\t\t       struct rte_cryptodev_info *dev_info)\n+{\n+\tstruct bcmfs_sym_dev_private *internals = dev->data->dev_private;\n+\tstruct bcmfs_device *fsdev = internals->fsdev;\n+\n+\tif (dev_info != NULL) {\n+\t\tdev_info->driver_id = cryptodev_bcmfs_driver_id;\n+\t\tdev_info->feature_flags = dev->feature_flags;\n+\t\tdev_info->max_nb_queue_pairs = fsdev->max_hw_qps;\n+\t\t/* No limit of number of sessions */\n+\t\tdev_info->sym.max_nb_sessions = 0;\n+\t}\n+}\n+\n+static void\n+bcmfs_sym_stats_get(struct rte_cryptodev *dev,\n+\t\t    struct rte_cryptodev_stats *stats)\n+{\n+\tstruct bcmfs_qp_stats bcmfs_stats = {0};\n+\tstruct bcmfs_sym_dev_private *bcmfs_priv;\n+\tstruct bcmfs_device *fsdev;\n+\n+\tif (stats == NULL || dev == NULL) {\n+\t\tBCMFS_LOG(ERR, \"invalid ptr: stats %p, dev %p\", stats, dev);\n+\t\treturn;\n+\t}\n+\tbcmfs_priv = dev->data->dev_private;\n+\tfsdev = bcmfs_priv->fsdev;\n+\n+\tbcmfs_qp_stats_get(fsdev->qps_in_use, fsdev->max_hw_qps, &bcmfs_stats);\n+\n+\tstats->enqueued_count = bcmfs_stats.enqueued_count;\n+\tstats->dequeued_count = bcmfs_stats.dequeued_count;\n+\tstats->enqueue_err_count = bcmfs_stats.enqueue_err_count;\n+\tstats->dequeue_err_count = bcmfs_stats.dequeue_err_count;\n+}\n+\n+static void\n+bcmfs_sym_stats_reset(struct rte_cryptodev *dev)\n+{\n+\tstruct bcmfs_sym_dev_private *bcmfs_priv;\n+\tstruct bcmfs_device *fsdev;\n+\n+\tif (dev == NULL) {\n+\t\tBCMFS_LOG(ERR, \"invalid cryptodev ptr %p\", dev);\n+\t\treturn;\n+\t}\n+\tbcmfs_priv = dev->data->dev_private;\n+\tfsdev = bcmfs_priv->fsdev;\n+\n+\tbcmfs_qp_stats_reset(fsdev->qps_in_use, fsdev->max_hw_qps);\n+}\n+\n+static int\n+bcmfs_sym_qp_release(struct rte_cryptodev *dev, uint16_t queue_pair_id)\n+{\n+\tstruct bcmfs_sym_dev_private *bcmfs_private = dev->data->dev_private;\n+\tstruct bcmfs_qp *qp = (struct bcmfs_qp *)\n+\t\t\t      (dev->data->queue_pairs[queue_pair_id]);\n+\n+\tBCMFS_LOG(DEBUG, \"Release sym qp %u on device %d\",\n+\t\t  queue_pair_id, dev->data->dev_id);\n+\n+\trte_mempool_free(qp->sr_mp);\n+\n+\tbcmfs_private->fsdev->qps_in_use[queue_pair_id] = NULL;\n+\n+\treturn bcmfs_qp_release((struct bcmfs_qp **)\n+\t\t\t\t&dev->data->queue_pairs[queue_pair_id]);\n+}\n+\n+static void\n+spu_req_init(struct bcmfs_sym_request *sr, rte_iova_t iova __rte_unused)\n+{\n+\tmemset(sr, 0, sizeof(*sr));\n+}\n+\n+static void\n+req_pool_obj_init(__rte_unused struct rte_mempool *mp,\n+\t\t  __rte_unused void *opaque, void *obj,\n+\t\t  __rte_unused unsigned int obj_idx)\n+{\n+\tspu_req_init(obj, rte_mempool_virt2iova(obj));\n+}\n+\n+static struct rte_mempool *\n+bcmfs_sym_req_pool_create(struct rte_cryptodev *cdev __rte_unused,\n+\t\t\t  uint32_t nobjs, uint16_t qp_id,\n+\t\t\t  int socket_id)\n+{\n+\tchar softreq_pool_name[RTE_RING_NAMESIZE];\n+\tstruct rte_mempool *mp;\n+\n+\tsnprintf(softreq_pool_name, RTE_RING_NAMESIZE, \"%s_%d\",\n+\t\t \"bcm_sym\", qp_id);\n+\n+\tmp = rte_mempool_create(softreq_pool_name,\n+\t\t\t\tRTE_ALIGN_MUL_CEIL(nobjs, 64),\n+\t\t\t\tsizeof(struct bcmfs_sym_request),\n+\t\t\t\t64, 0, NULL, NULL, req_pool_obj_init, NULL,\n+\t\t\t\tsocket_id, 0);\n+\tif (mp == NULL)\n+\t\tBCMFS_LOG(ERR, \"Failed to create req pool, qid %d, err %d\",\n+\t\t\t\tqp_id, rte_errno);\n+\n+\treturn mp;\n+}\n+\n+static int\n+bcmfs_sym_qp_setup(struct rte_cryptodev *cdev, uint16_t qp_id,\n+\t\t   const struct rte_cryptodev_qp_conf *qp_conf,\n+\t\t   int socket_id)\n+{\n+\tint ret = 0;\n+\tstruct bcmfs_qp *qp = NULL;\n+\tstruct bcmfs_qp_config bcmfs_qp_conf;\n+\n+\tstruct bcmfs_qp **qp_addr =\n+\t\t\t(struct bcmfs_qp **)&cdev->data->queue_pairs[qp_id];\n+\tstruct bcmfs_sym_dev_private *bcmfs_private = cdev->data->dev_private;\n+\tstruct bcmfs_device *fsdev = bcmfs_private->fsdev;\n+\n+\n+\t/* If qp is already in use free ring memory and qp metadata. */\n+\tif (*qp_addr != NULL) {\n+\t\tret = bcmfs_sym_qp_release(cdev, qp_id);\n+\t\tif (ret < 0)\n+\t\t\treturn ret;\n+\t}\n+\n+\tif (qp_id >= fsdev->max_hw_qps) {\n+\t\tBCMFS_LOG(ERR, \"qp_id %u invalid for this device\", qp_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tbcmfs_qp_conf.nb_descriptors = qp_conf->nb_descriptors;\n+\tbcmfs_qp_conf.socket_id = socket_id;\n+\tbcmfs_qp_conf.max_descs_req = BCMFS_CRYPTO_MAX_HW_DESCS_PER_REQ;\n+\tbcmfs_qp_conf.iobase = BCMFS_QP_IOBASE_XLATE(fsdev->mmap_addr, qp_id);\n+\tbcmfs_qp_conf.ops = fsdev->sym_hw_qp_ops;\n+\n+\tret = bcmfs_qp_setup(qp_addr, qp_id, &bcmfs_qp_conf);\n+\tif (ret != 0)\n+\t\treturn ret;\n+\n+\tqp = (struct bcmfs_qp *)*qp_addr;\n+\n+\tqp->sr_mp = bcmfs_sym_req_pool_create(cdev, qp_conf->nb_descriptors,\n+\t\t\t\t\t      qp_id, socket_id);\n+\tif (qp->sr_mp == NULL)\n+\t\treturn -ENOMEM;\n+\n+\t/* store a link to the qp in the bcmfs_device */\n+\tbcmfs_private->fsdev->qps_in_use[qp_id] = *qp_addr;\n+\n+\tcdev->data->queue_pairs[qp_id] = qp;\n+\tBCMFS_LOG(NOTICE, \"queue %d setup done\\n\", qp_id);\n+\n+\treturn 0;\n+}\n+\n+static struct rte_cryptodev_ops crypto_bcmfs_ops = {\n+\t/* Device related operations */\n+\t.dev_configure          = bcmfs_sym_dev_config,\n+\t.dev_start              = bcmfs_sym_dev_start,\n+\t.dev_stop               = bcmfs_sym_dev_stop,\n+\t.dev_close              = bcmfs_sym_dev_close,\n+\t.dev_infos_get          = bcmfs_sym_dev_info_get,\n+\t/* Stats Collection */\n+\t.stats_get              = bcmfs_sym_stats_get,\n+\t.stats_reset            = bcmfs_sym_stats_reset,\n+\t/* Queue-Pair management */\n+\t.queue_pair_setup       = bcmfs_sym_qp_setup,\n+\t.queue_pair_release     = bcmfs_sym_qp_release,\n+};\n+\n+/** Enqueue burst */\n+static uint16_t\n+bcmfs_sym_pmd_enqueue_op_burst(void *queue_pair,\n+\t\t\t       struct rte_crypto_op **ops,\n+\t\t\t       uint16_t nb_ops)\n+{\n+\tint i, j;\n+\tuint16_t enq = 0;\n+\tstruct bcmfs_sym_request *sreq;\n+\tstruct bcmfs_qp *qp = (struct bcmfs_qp *)queue_pair;\n+\n+\tif (nb_ops == 0)\n+\t\treturn 0;\n+\n+\tif (nb_ops > BCMFS_MAX_REQS_BUFF)\n+\t\tnb_ops = BCMFS_MAX_REQS_BUFF;\n+\n+\t /* We do not process more than available space */\n+\tif (nb_ops >  (qp->nb_descriptors - qp->nb_pending_requests))\n+\t\tnb_ops = qp->nb_descriptors - qp->nb_pending_requests;\n+\n+\tfor (i = 0; i < nb_ops; i++) {\n+\t\tif (rte_mempool_get(qp->sr_mp, (void **)&sreq))\n+\t\t\tgoto enqueue_err;\n+\n+\t\t/* save rte_crypto_op */\n+\t\tsreq->op = ops[i];\n+\n+\t\t/* save context */\n+\t\tqp->infl_msgs[i] = &sreq->msgs;\n+\t\tqp->infl_msgs[i]->ctx = (void *)sreq;\n+\t}\n+\t/* Send burst request to hw QP */\n+\tenq = bcmfs_enqueue_op_burst(qp, (void **)qp->infl_msgs, i);\n+\n+\tfor (j = enq; j < i; j++)\n+\t\trte_mempool_put(qp->sr_mp, qp->infl_msgs[j]->ctx);\n+\n+\treturn enq;\n+\n+enqueue_err:\n+\tfor (j = 0; j < i; j++)\n+\t\trte_mempool_put(qp->sr_mp, qp->infl_msgs[j]->ctx);\n+\n+\treturn enq;\n+}\n+\n+static uint16_t\n+bcmfs_sym_pmd_dequeue_op_burst(void *queue_pair,\n+\t\t\t       struct rte_crypto_op **ops,\n+\t\t\t       uint16_t nb_ops)\n+{\n+\tint i;\n+\tuint16_t deq = 0;\n+\tunsigned int pkts = 0;\n+\tstruct bcmfs_sym_request *sreq;\n+\tstruct bcmfs_qp *qp = queue_pair;\n+\n+\tif (nb_ops > BCMFS_MAX_REQS_BUFF)\n+\t\tnb_ops = BCMFS_MAX_REQS_BUFF;\n+\n+\tdeq = bcmfs_dequeue_op_burst(qp, (void **)qp->infl_msgs, nb_ops);\n+\t/* get rte_crypto_ops */\n+\tfor (i = 0; i < deq; i++) {\n+\t\tsreq = (struct bcmfs_sym_request *)qp->infl_msgs[i]->ctx;\n+\n+\t\tops[pkts++] = sreq->op;\n+\n+\t\trte_mempool_put(qp->sr_mp, sreq);\n+\t}\n+\n+\treturn pkts;\n+}\n+\n+/*\n+ * An rte_driver is needed in the registration of both the\n+ * device and the driver with cryptodev.\n+ */\n+static const char bcmfs_sym_drv_name[] = RTE_STR(CRYPTODEV_NAME_BCMFS_SYM_PMD);\n+static const struct rte_driver cryptodev_bcmfs_sym_driver = {\n+\t.name = bcmfs_sym_drv_name,\n+\t.alias = bcmfs_sym_drv_name\n+};\n+\n+int\n+bcmfs_sym_dev_create(struct bcmfs_device *fsdev)\n+{\n+\tstruct rte_cryptodev_pmd_init_params init_params = {\n+\t\t.name = \"\",\n+\t\t.socket_id = rte_socket_id(),\n+\t\t.private_data_size = sizeof(struct bcmfs_sym_dev_private)\n+\t};\n+\tchar name[RTE_CRYPTODEV_NAME_MAX_LEN];\n+\tstruct rte_cryptodev *cryptodev;\n+\tstruct bcmfs_sym_dev_private *internals;\n+\n+\tsnprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, \"%s_%s\",\n+\t\t fsdev->name, \"sym\");\n+\n+\t/* Populate subset device to use in cryptodev device creation */\n+\tfsdev->sym_rte_dev.driver = &cryptodev_bcmfs_sym_driver;\n+\tfsdev->sym_rte_dev.numa_node = 0;\n+\tfsdev->sym_rte_dev.devargs = NULL;\n+\n+\tcryptodev = rte_cryptodev_pmd_create(name,\n+\t\t\t\t\t     &fsdev->sym_rte_dev,\n+\t\t\t\t\t     &init_params);\n+\tif (cryptodev == NULL)\n+\t\treturn -ENODEV;\n+\n+\tfsdev->sym_rte_dev.name = cryptodev->data->name;\n+\tcryptodev->driver_id = cryptodev_bcmfs_driver_id;\n+\tcryptodev->dev_ops = &crypto_bcmfs_ops;\n+\n+\tcryptodev->enqueue_burst = bcmfs_sym_pmd_enqueue_op_burst;\n+\tcryptodev->dequeue_burst = bcmfs_sym_pmd_dequeue_op_burst;\n+\n+\tcryptodev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO |\n+\t\t\t\t   RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING |\n+\t\t\t\t   RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT;\n+\n+\tinternals = cryptodev->data->dev_private;\n+\tinternals->fsdev = fsdev;\n+\tfsdev->sym_dev = internals;\n+\n+\tinternals->sym_dev_id = cryptodev->data->dev_id;\n+\n+\tBCMFS_LOG(DEBUG, \"Created bcmfs-sym device %s as cryptodev instance %d\",\n+\t\t  cryptodev->data->name, internals->sym_dev_id);\n+\treturn 0;\n+}\n+\n+int\n+bcmfs_sym_dev_destroy(struct bcmfs_device *fsdev)\n+{\n+\tstruct rte_cryptodev *cryptodev;\n+\n+\tif (fsdev == NULL)\n+\t\treturn -ENODEV;\n+\tif (fsdev->sym_dev == NULL)\n+\t\treturn 0;\n+\n+\t/* free crypto device */\n+\tcryptodev = rte_cryptodev_pmd_get_dev(fsdev->sym_dev->sym_dev_id);\n+\trte_cryptodev_pmd_destroy(cryptodev);\n+\tfsdev->sym_rte_dev.name = NULL;\n+\tfsdev->sym_dev = NULL;\n+\n+\treturn 0;\n+}\n+\n+static struct cryptodev_driver bcmfs_crypto_drv;\n+RTE_PMD_REGISTER_CRYPTO_DRIVER(bcmfs_crypto_drv,\n+\t\t\t       cryptodev_bcmfs_sym_driver,\n+\t\t\t       cryptodev_bcmfs_driver_id);\ndiff --git a/drivers/crypto/bcmfs/bcmfs_sym_pmd.h b/drivers/crypto/bcmfs/bcmfs_sym_pmd.h\nnew file mode 100644\nindex 000000000..65d704609\n--- /dev/null\n+++ b/drivers/crypto/bcmfs/bcmfs_sym_pmd.h\n@@ -0,0 +1,38 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2020 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#ifndef _BCMFS_SYM_PMD_H_\n+#define _BCMFS_SYM_PMD_H_\n+\n+#include <rte_cryptodev.h>\n+\n+#include \"bcmfs_device.h\"\n+\n+#define CRYPTODEV_NAME_BCMFS_SYM_PMD\tcrypto_bcmfs\n+\n+#define BCMFS_CRYPTO_MAX_HW_DESCS_PER_REQ\t16\n+\n+extern uint8_t cryptodev_bcmfs_driver_id;\n+\n+/** private data structure for a BCMFS device.\n+ *  This BCMFS device is a device offering only symmetric crypto service,\n+ *  there can be one of these on each bcmfs_pci_device (VF).\n+ */\n+struct bcmfs_sym_dev_private {\n+\t/* The bcmfs device hosting the service */\n+\tstruct bcmfs_device *fsdev;\n+\t/* Device instance for this rte_cryptodev */\n+\tuint8_t sym_dev_id;\n+\t/* BCMFS device symmetric crypto capabilities */\n+\tconst struct rte_cryptodev_capabilities *fsdev_capabilities;\n+};\n+\n+int\n+bcmfs_sym_dev_create(struct bcmfs_device *fdev);\n+\n+int\n+bcmfs_sym_dev_destroy(struct bcmfs_device *fdev);\n+\n+#endif /* _BCMFS_SYM_PMD_H_ */\ndiff --git a/drivers/crypto/bcmfs/bcmfs_sym_req.h b/drivers/crypto/bcmfs/bcmfs_sym_req.h\nnew file mode 100644\nindex 000000000..0f0b051f1\n--- /dev/null\n+++ b/drivers/crypto/bcmfs/bcmfs_sym_req.h\n@@ -0,0 +1,22 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2020 Broadcom\n+ * All rights reserved.\n+ */\n+\n+#ifndef _BCMFS_SYM_REQ_H_\n+#define _BCMFS_SYM_REQ_H_\n+\n+#include \"bcmfs_dev_msg.h\"\n+\n+/*\n+ * This structure hold the supportive data required to process a\n+ * rte_crypto_op\n+ */\n+struct bcmfs_sym_request {\n+\t/* bcmfs qp message for h/w queues to process */\n+\tstruct bcmfs_qp_message msgs;\n+\t/* crypto op */\n+\tstruct rte_crypto_op *op;\n+};\n+\n+#endif /* _BCMFS_SYM_REQ_H_ */\ndiff --git a/drivers/crypto/bcmfs/meson.build b/drivers/crypto/bcmfs/meson.build\nindex cd58bd5e2..d9a3d73e9 100644\n--- a/drivers/crypto/bcmfs/meson.build\n+++ b/drivers/crypto/bcmfs/meson.build\n@@ -11,5 +11,6 @@ sources = files(\n \t\t'bcmfs_qp.c',\n \t\t'hw/bcmfs4_rm.c',\n \t\t'hw/bcmfs5_rm.c',\n-\t\t'hw/bcmfs_rm_common.c'\n+\t\t'hw/bcmfs_rm_common.c',\n+\t\t'bcmfs_sym_pmd.c'\n \t\t)\n",
    "prefixes": [
        "v1",
        "5/8"
    ]
}