Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/92525/?format=api
https://patches.dpdk.org/api/patches/92525/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210430135336.2749-14-pbhagavatula@marvell.com/", "project": { "id": 1, "url": "https://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": "<20210430135336.2749-14-pbhagavatula@marvell.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20210430135336.2749-14-pbhagavatula@marvell.com", "date": "2021-04-30T13:53:16", "name": "[v3,13/33] event/cnxk: add SSO HW device operations", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "71d2a759e4068024ec19692d0f70766efe9c5e0d", "submitter": { "id": 1183, "url": "https://patches.dpdk.org/api/people/1183/?format=api", "name": "Pavan Nikhilesh Bhagavatula", "email": "pbhagavatula@marvell.com" }, "delegate": { "id": 310, "url": "https://patches.dpdk.org/api/users/310/?format=api", "username": "jerin", "first_name": "Jerin", "last_name": "Jacob", "email": "jerinj@marvell.com" }, "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210430135336.2749-14-pbhagavatula@marvell.com/mbox/", "series": [ { "id": 16775, "url": "https://patches.dpdk.org/api/series/16775/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=16775", "date": "2021-04-30T13:53:03", "name": "Marvell CNXK Event device Driver", "version": 3, "mbox": "https://patches.dpdk.org/series/16775/mbox/" } ], "comments": "https://patches.dpdk.org/api/patches/92525/comments/", "check": "warning", "checks": "https://patches.dpdk.org/api/patches/92525/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id B22CDA0546;\n\tFri, 30 Apr 2021 15:55:32 +0200 (CEST)", "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A2FC64113F;\n\tFri, 30 Apr 2021 15:54:27 +0200 (CEST)", "from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com\n [67.231.156.173])\n by mails.dpdk.org (Postfix) with ESMTP id 979DF41243\n for <dev@dpdk.org>; Fri, 30 Apr 2021 15:54:20 +0200 (CEST)", "from pps.filterd (m0045851.ppops.net [127.0.0.1])\n by mx0b-0016f401.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id\n 13UDpJIb016402 for <dev@dpdk.org>; Fri, 30 Apr 2021 06:54:20 -0700", "from dc5-exch02.marvell.com ([199.233.59.182])\n by mx0b-0016f401.pphosted.com with ESMTP id 387rpneavf-1\n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT)\n for <dev@dpdk.org>; Fri, 30 Apr 2021 06:54:19 -0700", "from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com\n (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2;\n Fri, 30 Apr 2021 06:54:17 -0700", "from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com\n (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend\n Transport; Fri, 30 Apr 2021 06:54:17 -0700", "from BG-LT7430.marvell.com (BG-LT7430.marvell.com [10.28.177.176])\n by maili.marvell.com (Postfix) with ESMTP id 1B3DB3F704E;\n Fri, 30 Apr 2021 06:54:15 -0700 (PDT)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n h=from : to : cc :\n subject : date : message-id : in-reply-to : references : mime-version :\n content-transfer-encoding : content-type; s=pfpt0220;\n bh=sYVuGJXL2H+2XJpmaD8uvZbfy0DSg+uCLJ6tDyLgRWo=;\n b=bzOyzmGzRun92qu4a+CR+r8WkhXwDEHE5fAxsaCTmlcWxnbviL255Yer4/T2+AQ4kVGX\n 0Iu4hOMp9NhuKBCwibwJpeDgGMzf7ILL1fNW3UpV2SSes8q4Jea7pBG6c92ymxKjyGds\n hctu8RaZ70K9R7exVu2RUfAh9xHRdoHgvHpTHjVn4l+/I9tij18hbLXwM2cj49TcQlPU\n lYgHSQQ4SaZa4q1HjoRmmX7rkFbdslUXWf7gSYzn4kr3yIk44TG64K8prSMnnCW1kEUt\n yIxYp2PL4WSVBUfvpKzNqlDy9gyWbg+2VYLtxCGqM5khTV4xokU6sK2TGIlG64Riw6ZU 9g==", "From": "<pbhagavatula@marvell.com>", "To": "<jerinj@marvell.com>, Pavan Nikhilesh <pbhagavatula@marvell.com>, \"Shijith\n Thotton\" <sthotton@marvell.com>", "CC": "<dev@dpdk.org>", "Date": "Fri, 30 Apr 2021 19:23:16 +0530", "Message-ID": "<20210430135336.2749-14-pbhagavatula@marvell.com>", "X-Mailer": "git-send-email 2.17.1", "In-Reply-To": "<20210430135336.2749-1-pbhagavatula@marvell.com>", "References": "<20210426174441.2302-1-pbhagavatula@marvell.com>\n <20210430135336.2749-1-pbhagavatula@marvell.com>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "Content-Type": "text/plain", "X-Proofpoint-GUID": "G2Aa3qN91yrhoMbSesYNVieLW4AawL8m", "X-Proofpoint-ORIG-GUID": "G2Aa3qN91yrhoMbSesYNVieLW4AawL8m", "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:6.0.391, 18.0.761\n definitions=2021-04-30_08:2021-04-30,\n 2021-04-30 signatures=0", "Subject": "[dpdk-dev] [PATCH v3 13/33] event/cnxk: add SSO HW device operations", "X-BeenThere": "dev@dpdk.org", "X-Mailman-Version": "2.1.29", "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": "From: Pavan Nikhilesh <pbhagavatula@marvell.com>\n\nAdd SSO HW device operations used for enqueue/dequeue.\n\nSigned-off-by: Pavan Nikhilesh <pbhagavatula@marvell.com>\n---\n drivers/event/cnxk/cn10k_worker.c | 7 +\n drivers/event/cnxk/cn10k_worker.h | 151 +++++++++++++++++\n drivers/event/cnxk/cn9k_worker.c | 7 +\n drivers/event/cnxk/cn9k_worker.h | 249 +++++++++++++++++++++++++++++\n drivers/event/cnxk/cnxk_eventdev.h | 10 ++\n drivers/event/cnxk/cnxk_worker.h | 101 ++++++++++++\n drivers/event/cnxk/meson.build | 4 +-\n 7 files changed, 528 insertions(+), 1 deletion(-)\n create mode 100644 drivers/event/cnxk/cn10k_worker.c\n create mode 100644 drivers/event/cnxk/cn10k_worker.h\n create mode 100644 drivers/event/cnxk/cn9k_worker.c\n create mode 100644 drivers/event/cnxk/cn9k_worker.h\n create mode 100644 drivers/event/cnxk/cnxk_worker.h", "diff": "diff --git a/drivers/event/cnxk/cn10k_worker.c b/drivers/event/cnxk/cn10k_worker.c\nnew file mode 100644\nindex 000000000..63b587301\n--- /dev/null\n+++ b/drivers/event/cnxk/cn10k_worker.c\n@@ -0,0 +1,7 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2021 Marvell.\n+ */\n+\n+#include \"cn10k_worker.h\"\n+#include \"cnxk_eventdev.h\"\n+#include \"cnxk_worker.h\"\ndiff --git a/drivers/event/cnxk/cn10k_worker.h b/drivers/event/cnxk/cn10k_worker.h\nnew file mode 100644\nindex 000000000..04517055d\n--- /dev/null\n+++ b/drivers/event/cnxk/cn10k_worker.h\n@@ -0,0 +1,151 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2021 Marvell.\n+ */\n+\n+#ifndef __CN10K_WORKER_H__\n+#define __CN10K_WORKER_H__\n+\n+#include \"cnxk_eventdev.h\"\n+#include \"cnxk_worker.h\"\n+\n+/* SSO Operations */\n+\n+static __rte_always_inline uint8_t\n+cn10k_sso_hws_new_event(struct cn10k_sso_hws *ws, const struct rte_event *ev)\n+{\n+\tconst uint32_t tag = (uint32_t)ev->event;\n+\tconst uint8_t new_tt = ev->sched_type;\n+\tconst uint64_t event_ptr = ev->u64;\n+\tconst uint16_t grp = ev->queue_id;\n+\n+\trte_atomic_thread_fence(__ATOMIC_ACQ_REL);\n+\tif (ws->xaq_lmt <= *ws->fc_mem)\n+\t\treturn 0;\n+\n+\tcnxk_sso_hws_add_work(event_ptr, tag, new_tt, ws->grps_base[grp]);\n+\treturn 1;\n+}\n+\n+static __rte_always_inline void\n+cn10k_sso_hws_fwd_swtag(struct cn10k_sso_hws *ws, const struct rte_event *ev)\n+{\n+\tconst uint32_t tag = (uint32_t)ev->event;\n+\tconst uint8_t new_tt = ev->sched_type;\n+\tconst uint8_t cur_tt = CNXK_TT_FROM_TAG(plt_read64(ws->tag_wqe_op));\n+\n+\t/* CNXK model\n+\t * cur_tt/new_tt SSO_TT_ORDERED SSO_TT_ATOMIC SSO_TT_UNTAGGED\n+\t *\n+\t * SSO_TT_ORDERED norm norm untag\n+\t * SSO_TT_ATOMIC norm norm\t\t untag\n+\t * SSO_TT_UNTAGGED norm norm NOOP\n+\t */\n+\n+\tif (new_tt == SSO_TT_UNTAGGED) {\n+\t\tif (cur_tt != SSO_TT_UNTAGGED)\n+\t\t\tcnxk_sso_hws_swtag_untag(ws->swtag_untag_op);\n+\t} else {\n+\t\tcnxk_sso_hws_swtag_norm(tag, new_tt, ws->swtag_norm_op);\n+\t}\n+\tws->swtag_req = 1;\n+}\n+\n+static __rte_always_inline void\n+cn10k_sso_hws_fwd_group(struct cn10k_sso_hws *ws, const struct rte_event *ev,\n+\t\t\tconst uint16_t grp)\n+{\n+\tconst uint32_t tag = (uint32_t)ev->event;\n+\tconst uint8_t new_tt = ev->sched_type;\n+\n+\tplt_write64(ev->u64, ws->updt_wqe_op);\n+\tcnxk_sso_hws_swtag_desched(tag, new_tt, grp, ws->swtag_desched_op);\n+}\n+\n+static __rte_always_inline void\n+cn10k_sso_hws_forward_event(struct cn10k_sso_hws *ws,\n+\t\t\t const struct rte_event *ev)\n+{\n+\tconst uint8_t grp = ev->queue_id;\n+\n+\t/* Group hasn't changed, Use SWTAG to forward the event */\n+\tif (CNXK_GRP_FROM_TAG(plt_read64(ws->tag_wqe_op)) == grp)\n+\t\tcn10k_sso_hws_fwd_swtag(ws, ev);\n+\telse\n+\t\t/*\n+\t\t * Group has been changed for group based work pipelining,\n+\t\t * Use deschedule/add_work operation to transfer the event to\n+\t\t * new group/core\n+\t\t */\n+\t\tcn10k_sso_hws_fwd_group(ws, ev, grp);\n+}\n+\n+static __rte_always_inline uint16_t\n+cn10k_sso_hws_get_work(struct cn10k_sso_hws *ws, struct rte_event *ev)\n+{\n+\tunion {\n+\t\t__uint128_t get_work;\n+\t\tuint64_t u64[2];\n+\t} gw;\n+\n+\tgw.get_work = ws->gw_wdata;\n+#if defined(RTE_ARCH_ARM64) && !defined(__clang__)\n+\tasm volatile(\n+\t\tPLT_CPU_FEATURE_PREAMBLE\n+\t\t\"caspl %[wdata], %H[wdata], %[wdata], %H[wdata], [%[gw_loc]]\\n\"\n+\t\t: [wdata] \"+r\"(gw.get_work)\n+\t\t: [gw_loc] \"r\"(ws->getwrk_op)\n+\t\t: \"memory\");\n+#else\n+\tplt_write64(gw.u64[0], ws->getwrk_op);\n+\tdo {\n+\t\troc_load_pair(gw.u64[0], gw.u64[1], ws->tag_wqe_op);\n+\t} while (gw.u64[0] & BIT_ULL(63));\n+#endif\n+\tgw.u64[0] = (gw.u64[0] & (0x3ull << 32)) << 6 |\n+\t\t (gw.u64[0] & (0x3FFull << 36)) << 4 |\n+\t\t (gw.u64[0] & 0xffffffff);\n+\n+\tev->event = gw.u64[0];\n+\tev->u64 = gw.u64[1];\n+\n+\treturn !!gw.u64[1];\n+}\n+\n+/* Used in cleaning up workslot. */\n+static __rte_always_inline uint16_t\n+cn10k_sso_hws_get_work_empty(struct cn10k_sso_hws *ws, struct rte_event *ev)\n+{\n+\tunion {\n+\t\t__uint128_t get_work;\n+\t\tuint64_t u64[2];\n+\t} gw;\n+\n+#ifdef RTE_ARCH_ARM64\n+\tasm volatile(PLT_CPU_FEATURE_PREAMBLE\n+\t\t \"\t\tldp %[tag], %[wqp], [%[tag_loc]]\t\\n\"\n+\t\t \"\t\ttbz %[tag], 63, done%=\t\t\t\\n\"\n+\t\t \"\t\tsevl\t\t\t\t\t\\n\"\n+\t\t \"rty%=:\twfe\t\t\t\t\t\\n\"\n+\t\t \"\t\tldp %[tag], %[wqp], [%[tag_loc]]\t\\n\"\n+\t\t \"\t\ttbnz %[tag], 63, rty%=\t\t\t\\n\"\n+\t\t \"done%=:\tdmb ld\t\t\t\t\t\\n\"\n+\t\t : [tag] \"=&r\"(gw.u64[0]), [wqp] \"=&r\"(gw.u64[1])\n+\t\t : [tag_loc] \"r\"(ws->tag_wqe_op)\n+\t\t : \"memory\");\n+#else\n+\tdo {\n+\t\troc_load_pair(gw.u64[0], gw.u64[1], ws->tag_wqe_op);\n+\t} while (gw.u64[0] & BIT_ULL(63));\n+#endif\n+\n+\tgw.u64[0] = (gw.u64[0] & (0x3ull << 32)) << 6 |\n+\t\t (gw.u64[0] & (0x3FFull << 36)) << 4 |\n+\t\t (gw.u64[0] & 0xffffffff);\n+\n+\tev->event = gw.u64[0];\n+\tev->u64 = gw.u64[1];\n+\n+\treturn !!gw.u64[1];\n+}\n+\n+#endif\ndiff --git a/drivers/event/cnxk/cn9k_worker.c b/drivers/event/cnxk/cn9k_worker.c\nnew file mode 100644\nindex 000000000..836914163\n--- /dev/null\n+++ b/drivers/event/cnxk/cn9k_worker.c\n@@ -0,0 +1,7 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2021 Marvell.\n+ */\n+\n+#include \"roc_api.h\"\n+\n+#include \"cn9k_worker.h\"\ndiff --git a/drivers/event/cnxk/cn9k_worker.h b/drivers/event/cnxk/cn9k_worker.h\nnew file mode 100644\nindex 000000000..85be742c1\n--- /dev/null\n+++ b/drivers/event/cnxk/cn9k_worker.h\n@@ -0,0 +1,249 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2021 Marvell.\n+ */\n+\n+#ifndef __CN9K_WORKER_H__\n+#define __CN9K_WORKER_H__\n+\n+#include \"cnxk_eventdev.h\"\n+#include \"cnxk_worker.h\"\n+\n+/* SSO Operations */\n+\n+static __rte_always_inline uint8_t\n+cn9k_sso_hws_new_event(struct cn9k_sso_hws *ws, const struct rte_event *ev)\n+{\n+\tconst uint32_t tag = (uint32_t)ev->event;\n+\tconst uint8_t new_tt = ev->sched_type;\n+\tconst uint64_t event_ptr = ev->u64;\n+\tconst uint16_t grp = ev->queue_id;\n+\n+\trte_atomic_thread_fence(__ATOMIC_ACQ_REL);\n+\tif (ws->xaq_lmt <= *ws->fc_mem)\n+\t\treturn 0;\n+\n+\tcnxk_sso_hws_add_work(event_ptr, tag, new_tt, ws->grps_base[grp]);\n+\treturn 1;\n+}\n+\n+static __rte_always_inline void\n+cn9k_sso_hws_fwd_swtag(struct cn9k_sso_hws_state *vws,\n+\t\t const struct rte_event *ev)\n+{\n+\tconst uint32_t tag = (uint32_t)ev->event;\n+\tconst uint8_t new_tt = ev->sched_type;\n+\tconst uint8_t cur_tt = CNXK_TT_FROM_TAG(plt_read64(vws->tag_op));\n+\n+\t/* CNXK model\n+\t * cur_tt/new_tt SSO_TT_ORDERED SSO_TT_ATOMIC SSO_TT_UNTAGGED\n+\t *\n+\t * SSO_TT_ORDERED norm norm untag\n+\t * SSO_TT_ATOMIC norm norm\t\t untag\n+\t * SSO_TT_UNTAGGED norm norm NOOP\n+\t */\n+\n+\tif (new_tt == SSO_TT_UNTAGGED) {\n+\t\tif (cur_tt != SSO_TT_UNTAGGED)\n+\t\t\tcnxk_sso_hws_swtag_untag(\n+\t\t\t\tCN9K_SSOW_GET_BASE_ADDR(vws->getwrk_op) +\n+\t\t\t\tSSOW_LF_GWS_OP_SWTAG_UNTAG);\n+\t} else {\n+\t\tcnxk_sso_hws_swtag_norm(tag, new_tt, vws->swtag_norm_op);\n+\t}\n+}\n+\n+static __rte_always_inline void\n+cn9k_sso_hws_fwd_group(struct cn9k_sso_hws_state *ws,\n+\t\t const struct rte_event *ev, const uint16_t grp)\n+{\n+\tconst uint32_t tag = (uint32_t)ev->event;\n+\tconst uint8_t new_tt = ev->sched_type;\n+\n+\tplt_write64(ev->u64, CN9K_SSOW_GET_BASE_ADDR(ws->getwrk_op) +\n+\t\t\t\t SSOW_LF_GWS_OP_UPD_WQP_GRP1);\n+\tcnxk_sso_hws_swtag_desched(tag, new_tt, grp, ws->swtag_desched_op);\n+}\n+\n+static __rte_always_inline void\n+cn9k_sso_hws_forward_event(struct cn9k_sso_hws *ws, const struct rte_event *ev)\n+{\n+\tconst uint8_t grp = ev->queue_id;\n+\n+\t/* Group hasn't changed, Use SWTAG to forward the event */\n+\tif (CNXK_GRP_FROM_TAG(plt_read64(ws->tag_op)) == grp) {\n+\t\tcn9k_sso_hws_fwd_swtag((struct cn9k_sso_hws_state *)ws, ev);\n+\t\tws->swtag_req = 1;\n+\t} else {\n+\t\t/*\n+\t\t * Group has been changed for group based work pipelining,\n+\t\t * Use deschedule/add_work operation to transfer the event to\n+\t\t * new group/core\n+\t\t */\n+\t\tcn9k_sso_hws_fwd_group((struct cn9k_sso_hws_state *)ws, ev,\n+\t\t\t\t grp);\n+\t}\n+}\n+\n+/* Dual ws ops. */\n+\n+static __rte_always_inline uint8_t\n+cn9k_sso_hws_dual_new_event(struct cn9k_sso_hws_dual *dws,\n+\t\t\t const struct rte_event *ev)\n+{\n+\tconst uint32_t tag = (uint32_t)ev->event;\n+\tconst uint8_t new_tt = ev->sched_type;\n+\tconst uint64_t event_ptr = ev->u64;\n+\tconst uint16_t grp = ev->queue_id;\n+\n+\trte_atomic_thread_fence(__ATOMIC_ACQ_REL);\n+\tif (dws->xaq_lmt <= *dws->fc_mem)\n+\t\treturn 0;\n+\n+\tcnxk_sso_hws_add_work(event_ptr, tag, new_tt, dws->grps_base[grp]);\n+\treturn 1;\n+}\n+\n+static __rte_always_inline void\n+cn9k_sso_hws_dual_forward_event(struct cn9k_sso_hws_dual *dws,\n+\t\t\t\tstruct cn9k_sso_hws_state *vws,\n+\t\t\t\tconst struct rte_event *ev)\n+{\n+\tconst uint8_t grp = ev->queue_id;\n+\n+\t/* Group hasn't changed, Use SWTAG to forward the event */\n+\tif (CNXK_GRP_FROM_TAG(plt_read64(vws->tag_op)) == grp) {\n+\t\tcn9k_sso_hws_fwd_swtag(vws, ev);\n+\t\tdws->swtag_req = 1;\n+\t} else {\n+\t\t/*\n+\t\t * Group has been changed for group based work pipelining,\n+\t\t * Use deschedule/add_work operation to transfer the event to\n+\t\t * new group/core\n+\t\t */\n+\t\tcn9k_sso_hws_fwd_group(vws, ev, grp);\n+\t}\n+}\n+\n+static __rte_always_inline uint16_t\n+cn9k_sso_hws_dual_get_work(struct cn9k_sso_hws_state *ws,\n+\t\t\t struct cn9k_sso_hws_state *ws_pair,\n+\t\t\t struct rte_event *ev)\n+{\n+\tconst uint64_t set_gw = BIT_ULL(16) | 1;\n+\tunion {\n+\t\t__uint128_t get_work;\n+\t\tuint64_t u64[2];\n+\t} gw;\n+\n+#ifdef RTE_ARCH_ARM64\n+\tasm volatile(PLT_CPU_FEATURE_PREAMBLE\n+\t\t \"rty%=:\t\t\t\t\t\\n\"\n+\t\t \"\t\tldr %[tag], [%[tag_loc]]\t\\n\"\n+\t\t \"\t\tldr %[wqp], [%[wqp_loc]]\t\\n\"\n+\t\t \"\t\ttbnz %[tag], 63, rty%=\t\t\\n\"\n+\t\t \"done%=:\tstr %[gw], [%[pong]]\t\t\\n\"\n+\t\t \"\t\tdmb ld\t\t\t\t\\n\"\n+\t\t : [tag] \"=&r\"(gw.u64[0]), [wqp] \"=&r\"(gw.u64[1])\n+\t\t : [tag_loc] \"r\"(ws->tag_op), [wqp_loc] \"r\"(ws->wqp_op),\n+\t\t [gw] \"r\"(set_gw), [pong] \"r\"(ws_pair->getwrk_op));\n+#else\n+\tgw.u64[0] = plt_read64(ws->tag_op);\n+\twhile ((BIT_ULL(63)) & gw.u64[0])\n+\t\tgw.u64[0] = plt_read64(ws->tag_op);\n+\tgw.u64[1] = plt_read64(ws->wqp_op);\n+\tplt_write64(set_gw, ws_pair->getwrk_op);\n+#endif\n+\n+\tgw.u64[0] = (gw.u64[0] & (0x3ull << 32)) << 6 |\n+\t\t (gw.u64[0] & (0x3FFull << 36)) << 4 |\n+\t\t (gw.u64[0] & 0xffffffff);\n+\n+\tev->event = gw.u64[0];\n+\tev->u64 = gw.u64[1];\n+\n+\treturn !!gw.u64[1];\n+}\n+\n+static __rte_always_inline uint16_t\n+cn9k_sso_hws_get_work(struct cn9k_sso_hws *ws, struct rte_event *ev)\n+{\n+\tunion {\n+\t\t__uint128_t get_work;\n+\t\tuint64_t u64[2];\n+\t} gw;\n+\n+\tplt_write64(BIT_ULL(16) | /* wait for work. */\n+\t\t\t 1,\t /* Use Mask set 0. */\n+\t\t ws->getwrk_op);\n+#ifdef RTE_ARCH_ARM64\n+\tasm volatile(PLT_CPU_FEATURE_PREAMBLE\n+\t\t \"\t\tldr %[tag], [%[tag_loc]]\t\\n\"\n+\t\t \"\t\tldr %[wqp], [%[wqp_loc]]\t\\n\"\n+\t\t \"\t\ttbz %[tag], 63, done%=\t\t\\n\"\n+\t\t \"\t\tsevl\t\t\t\t\\n\"\n+\t\t \"rty%=:\twfe\t\t\t\t\\n\"\n+\t\t \"\t\tldr %[tag], [%[tag_loc]]\t\\n\"\n+\t\t \"\t\tldr %[wqp], [%[wqp_loc]]\t\\n\"\n+\t\t \"\t\ttbnz %[tag], 63, rty%=\t\t\\n\"\n+\t\t \"done%=:\tdmb ld\t\t\t\t\\n\"\n+\t\t : [tag] \"=&r\"(gw.u64[0]), [wqp] \"=&r\"(gw.u64[1])\n+\t\t : [tag_loc] \"r\"(ws->tag_op), [wqp_loc] \"r\"(ws->wqp_op));\n+#else\n+\tgw.u64[0] = plt_read64(ws->tag_op);\n+\twhile ((BIT_ULL(63)) & gw.u64[0])\n+\t\tgw.u64[0] = plt_read64(ws->tag_op);\n+\n+\tgw.u64[1] = plt_read64(ws->wqp_op);\n+#endif\n+\n+\tgw.u64[0] = (gw.u64[0] & (0x3ull << 32)) << 6 |\n+\t\t (gw.u64[0] & (0x3FFull << 36)) << 4 |\n+\t\t (gw.u64[0] & 0xffffffff);\n+\n+\tev->event = gw.u64[0];\n+\tev->u64 = gw.u64[1];\n+\n+\treturn !!gw.u64[1];\n+}\n+\n+/* Used in cleaning up workslot. */\n+static __rte_always_inline uint16_t\n+cn9k_sso_hws_get_work_empty(struct cn9k_sso_hws_state *ws, struct rte_event *ev)\n+{\n+\tunion {\n+\t\t__uint128_t get_work;\n+\t\tuint64_t u64[2];\n+\t} gw;\n+\n+#ifdef RTE_ARCH_ARM64\n+\tasm volatile(PLT_CPU_FEATURE_PREAMBLE\n+\t\t \"\t\tldr %[tag], [%[tag_loc]]\t\\n\"\n+\t\t \"\t\tldr %[wqp], [%[wqp_loc]]\t\\n\"\n+\t\t \"\t\ttbz %[tag], 63, done%=\t\t\\n\"\n+\t\t \"\t\tsevl\t\t\t\t\\n\"\n+\t\t \"rty%=:\twfe\t\t\t\t\\n\"\n+\t\t \"\t\tldr %[tag], [%[tag_loc]]\t\\n\"\n+\t\t \"\t\tldr %[wqp], [%[wqp_loc]]\t\\n\"\n+\t\t \"\t\ttbnz %[tag], 63, rty%=\t\t\\n\"\n+\t\t \"done%=:\tdmb ld\t\t\t\t\\n\"\n+\t\t : [tag] \"=&r\"(gw.u64[0]), [wqp] \"=&r\"(gw.u64[1])\n+\t\t : [tag_loc] \"r\"(ws->tag_op), [wqp_loc] \"r\"(ws->wqp_op));\n+#else\n+\tgw.u64[0] = plt_read64(ws->tag_op);\n+\twhile ((BIT_ULL(63)) & gw.u64[0])\n+\t\tgw.u64[0] = plt_read64(ws->tag_op);\n+\n+\tgw.u64[1] = plt_read64(ws->wqp_op);\n+#endif\n+\n+\tgw.u64[0] = (gw.u64[0] & (0x3ull << 32)) << 6 |\n+\t\t (gw.u64[0] & (0x3FFull << 36)) << 4 |\n+\t\t (gw.u64[0] & 0xffffffff);\n+\n+\tev->event = gw.u64[0];\n+\tev->u64 = gw.u64[1];\n+\n+\treturn !!gw.u64[1];\n+}\n+\n+#endif\ndiff --git a/drivers/event/cnxk/cnxk_eventdev.h b/drivers/event/cnxk/cnxk_eventdev.h\nindex 437cdf3db..0a3ab71e4 100644\n--- a/drivers/event/cnxk/cnxk_eventdev.h\n+++ b/drivers/event/cnxk/cnxk_eventdev.h\n@@ -29,6 +29,16 @@\n #define CNXK_SSO_XAQ_CACHE_CNT (0x7)\n #define CNXK_SSO_XAQ_SLACK (8)\n \n+#define CNXK_TT_FROM_TAG(x)\t (((x) >> 32) & SSO_TT_EMPTY)\n+#define CNXK_TT_FROM_EVENT(x)\t (((x) >> 38) & SSO_TT_EMPTY)\n+#define CNXK_EVENT_TYPE_FROM_TAG(x) (((x) >> 28) & 0xf)\n+#define CNXK_SUB_EVENT_FROM_TAG(x) (((x) >> 20) & 0xff)\n+#define CNXK_CLR_SUB_EVENT(x)\t (~(0xffu << 20) & x)\n+#define CNXK_GRP_FROM_TAG(x)\t (((x) >> 36) & 0x3ff)\n+#define CNXK_SWTAG_PEND(x)\t (BIT_ULL(62) & x)\n+\n+#define CN9K_SSOW_GET_BASE_ADDR(_GW) ((_GW)-SSOW_LF_GWS_OP_GET_WORK0)\n+\n #define CN10K_GW_MODE_NONE 0\n #define CN10K_GW_MODE_PREF 1\n #define CN10K_GW_MODE_PREF_WFE 2\ndiff --git a/drivers/event/cnxk/cnxk_worker.h b/drivers/event/cnxk/cnxk_worker.h\nnew file mode 100644\nindex 000000000..4eb46ae16\n--- /dev/null\n+++ b/drivers/event/cnxk/cnxk_worker.h\n@@ -0,0 +1,101 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(C) 2021 Marvell.\n+ */\n+\n+#ifndef __CNXK_WORKER_H__\n+#define __CNXK_WORKER_H__\n+\n+#include \"cnxk_eventdev.h\"\n+\n+/* SSO Operations */\n+\n+static __rte_always_inline void\n+cnxk_sso_hws_add_work(const uint64_t event_ptr, const uint32_t tag,\n+\t\t const uint8_t new_tt, const uintptr_t grp_base)\n+{\n+\tuint64_t add_work0;\n+\n+\tadd_work0 = tag | ((uint64_t)(new_tt) << 32);\n+\troc_store_pair(add_work0, event_ptr, grp_base);\n+}\n+\n+static __rte_always_inline void\n+cnxk_sso_hws_swtag_desched(uint32_t tag, uint8_t new_tt, uint16_t grp,\n+\t\t\t uintptr_t swtag_desched_op)\n+{\n+\tuint64_t val;\n+\n+\tval = tag | ((uint64_t)(new_tt & 0x3) << 32) | ((uint64_t)grp << 34);\n+\t__atomic_store_n((uint64_t *)swtag_desched_op, val, __ATOMIC_RELEASE);\n+}\n+\n+static __rte_always_inline void\n+cnxk_sso_hws_swtag_norm(uint32_t tag, uint8_t new_tt, uintptr_t swtag_norm_op)\n+{\n+\tuint64_t val;\n+\n+\tval = tag | ((uint64_t)(new_tt & 0x3) << 32);\n+\tplt_write64(val, swtag_norm_op);\n+}\n+\n+static __rte_always_inline void\n+cnxk_sso_hws_swtag_untag(uintptr_t swtag_untag_op)\n+{\n+\tplt_write64(0, swtag_untag_op);\n+}\n+\n+static __rte_always_inline void\n+cnxk_sso_hws_swtag_flush(uint64_t tag_op, uint64_t flush_op)\n+{\n+\tif (CNXK_TT_FROM_TAG(plt_read64(tag_op)) == SSO_TT_EMPTY)\n+\t\treturn;\n+\tplt_write64(0, flush_op);\n+}\n+\n+static __rte_always_inline void\n+cnxk_sso_hws_swtag_wait(uintptr_t tag_op)\n+{\n+#ifdef RTE_ARCH_ARM64\n+\tuint64_t swtp;\n+\n+\tasm volatile(PLT_CPU_FEATURE_PREAMBLE\n+\t\t \"\t\tldr %[swtb], [%[swtp_loc]]\t\\n\"\n+\t\t \"\t\ttbz %[swtb], 62, done%=\t\t\\n\"\n+\t\t \"\t\tsevl\t\t\t\t\\n\"\n+\t\t \"rty%=:\twfe\t\t\t\t\\n\"\n+\t\t \"\t\tldr %[swtb], [%[swtp_loc]]\t\\n\"\n+\t\t \"\t\ttbnz %[swtb], 62, rty%=\t\t\\n\"\n+\t\t \"done%=:\t\t\t\t\t\\n\"\n+\t\t : [swtb] \"=&r\"(swtp)\n+\t\t : [swtp_loc] \"r\"(tag_op));\n+#else\n+\t/* Wait for the SWTAG/SWTAG_FULL operation */\n+\twhile (plt_read64(tag_op) & BIT_ULL(62))\n+\t\t;\n+#endif\n+}\n+\n+static __rte_always_inline void\n+cnxk_sso_hws_head_wait(uintptr_t tag_op)\n+{\n+#ifdef RTE_ARCH_ARM64\n+\tuint64_t swtp;\n+\n+\tasm volatile(PLT_CPU_FEATURE_PREAMBLE\n+\t\t \"\t\tldr %[swtb], [%[swtp_loc]]\t\\n\"\n+\t\t \"\t\ttbz %[swtb], 35, done%=\t\t\\n\"\n+\t\t \"\t\tsevl\t\t\t\t\\n\"\n+\t\t \"rty%=:\twfe\t\t\t\t\\n\"\n+\t\t \"\t\tldr %[swtb], [%[swtp_loc]]\t\\n\"\n+\t\t \"\t\ttbnz %[swtb], 35, rty%=\t\t\\n\"\n+\t\t \"done%=:\t\t\t\t\t\\n\"\n+\t\t : [swtb] \"=&r\"(swtp)\n+\t\t : [swtp_loc] \"r\"(tag_op));\n+#else\n+\t/* Wait for the SWTAG/SWTAG_FULL operation */\n+\twhile (plt_read64(tag_op) & BIT_ULL(35))\n+\t\t;\n+#endif\n+}\n+\n+#endif\ndiff --git a/drivers/event/cnxk/meson.build b/drivers/event/cnxk/meson.build\nindex 888aeb064..3617d707b 100644\n--- a/drivers/event/cnxk/meson.build\n+++ b/drivers/event/cnxk/meson.build\n@@ -8,7 +8,9 @@ if not is_linux or not dpdk_conf.get('RTE_ARCH_64')\n subdir_done()\n endif\n \n-sources = files('cn10k_eventdev.c',\n+sources = files('cn10k_worker.c',\n+ 'cn10k_eventdev.c',\n+ 'cn9k_worker.c',\n 'cn9k_eventdev.c',\n 'cnxk_eventdev.c',\n )\n", "prefixes": [ "v3", "13/33" ] }{ "id": 92525, "url": "