get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 100685,
    "url": "http://patchwork.dpdk.org/api/patches/100685/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20211007093315.17384-7-nipun.gupta@nxp.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20211007093315.17384-7-nipun.gupta@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211007093315.17384-7-nipun.gupta@nxp.com",
    "date": "2021-10-07T09:33:13",
    "name": "[v9,6/8] baseband/la12xx: add enqueue and dequeue support",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "b3dfca94ceafa5a2ed27f58343d743c5c92d8ac7",
    "submitter": {
        "id": 471,
        "url": "http://patchwork.dpdk.org/api/people/471/?format=api",
        "name": "Nipun Gupta",
        "email": "nipun.gupta@nxp.com"
    },
    "delegate": {
        "id": 6690,
        "url": "http://patchwork.dpdk.org/api/users/6690/?format=api",
        "username": "akhil",
        "first_name": "akhil",
        "last_name": "goyal",
        "email": "gakhil@marvell.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20211007093315.17384-7-nipun.gupta@nxp.com/mbox/",
    "series": [
        {
            "id": 19424,
            "url": "http://patchwork.dpdk.org/api/series/19424/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=19424",
            "date": "2021-10-07T09:33:07",
            "name": "baseband: add NXP LA12xx driver",
            "version": 9,
            "mbox": "http://patchwork.dpdk.org/series/19424/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/100685/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/100685/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 48D87A0C47;\n\tThu,  7 Oct 2021 11:33:53 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4998D411E1;\n\tThu,  7 Oct 2021 11:33:28 +0200 (CEST)",
            "from inva020.nxp.com (inva020.nxp.com [92.121.34.13])\n by mails.dpdk.org (Postfix) with ESMTP id 9EFC3411A6\n for <dev@dpdk.org>; Thu,  7 Oct 2021 11:33:20 +0200 (CEST)",
            "from inva020.nxp.com (localhost [127.0.0.1])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 7B6881A1D5B;\n Thu,  7 Oct 2021 11:33:20 +0200 (CEST)",
            "from aprdc01srsp001v.ap-rdc01.nxp.com\n (aprdc01srsp001v.ap-rdc01.nxp.com [165.114.16.16])\n by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 170081A1D59;\n Thu,  7 Oct 2021 11:33:20 +0200 (CEST)",
            "from lsv03274.swis.in-blr01.nxp.com (lsv03274.swis.in-blr01.nxp.com\n [92.120.147.114])\n by aprdc01srsp001v.ap-rdc01.nxp.com (Postfix) with ESMTP id 7466D183AD05;\n Thu,  7 Oct 2021 17:33:19 +0800 (+08)"
        ],
        "From": "nipun.gupta@nxp.com",
        "To": "dev@dpdk.org,\n\tgakhil@marvell.com,\n\tnicolas.chautru@intel.com",
        "Cc": "david.marchand@redhat.com, hemant.agrawal@nxp.com,\n Nipun Gupta <nipun.gupta@nxp.com>",
        "Date": "Thu,  7 Oct 2021 15:03:13 +0530",
        "Message-Id": "<20211007093315.17384-7-nipun.gupta@nxp.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20211007093315.17384-1-nipun.gupta@nxp.com>",
        "References": "<20210318063421.14895-1-hemant.agrawal@nxp.com>\n <20211007093315.17384-1-nipun.gupta@nxp.com>",
        "X-Virus-Scanned": "ClamAV using ClamSMTP",
        "Subject": "[dpdk-dev] [PATCH v9 6/8] baseband/la12xx: add enqueue and dequeue\n support",
        "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: Hemant Agrawal <hemant.agrawal@nxp.com>\n\nAdd support for enqueue and dequeue the LDPC enc/dec\nfrom the modem device.\n\nSigned-off-by: Nipun Gupta <nipun.gupta@nxp.com>\nSigned-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n doc/guides/bbdevs/features/la12xx.ini      |  13 +\n doc/guides/bbdevs/la12xx.rst               |  44 +++\n drivers/baseband/la12xx/bbdev_la12xx.c     | 320 +++++++++++++++++++++\n drivers/baseband/la12xx/bbdev_la12xx_ipc.h |  37 +++\n 4 files changed, 414 insertions(+)\n create mode 100644 doc/guides/bbdevs/features/la12xx.ini",
    "diff": "diff --git a/doc/guides/bbdevs/features/la12xx.ini b/doc/guides/bbdevs/features/la12xx.ini\nnew file mode 100644\nindex 0000000000..0aec5eecb6\n--- /dev/null\n+++ b/doc/guides/bbdevs/features/la12xx.ini\n@@ -0,0 +1,13 @@\n+;\n+; Supported features of the 'la12xx' bbdev driver.\n+;\n+; Refer to default.ini for the full list of available PMD features.\n+;\n+[Features]\n+Turbo Decoder (4G)     = N\n+Turbo Encoder (4G)     = N\n+LDPC Decoder (5G)      = Y\n+LDPC Encoder (5G)      = Y\n+LLR/HARQ Compression   = N\n+HW Accelerated         = Y\n+BBDEV API              = Y\ndiff --git a/doc/guides/bbdevs/la12xx.rst b/doc/guides/bbdevs/la12xx.rst\nindex 1a711ef5e3..fe1bca4c5c 100644\n--- a/doc/guides/bbdevs/la12xx.rst\n+++ b/doc/guides/bbdevs/la12xx.rst\n@@ -78,3 +78,47 @@ For enabling logs, use the following EAL parameter:\n \n Using ``bb.la12xx`` as log matching criteria, all Baseband PMD logs can be\n enabled which are lower than logging ``level``.\n+\n+Test Application\n+----------------\n+\n+BBDEV provides a test application, ``test-bbdev.py`` and range of test data for testing\n+the functionality of LA12xx for FEC encode and decode, depending on the device\n+capabilities. The test application is located under app->test-bbdev folder and has the\n+following options:\n+\n+.. code-block:: console\n+\n+  \"-p\", \"--testapp-path\": specifies path to the bbdev test app.\n+  \"-e\", \"--eal-params\"\t: EAL arguments which are passed to the test app.\n+  \"-t\", \"--timeout\"\t: Timeout in seconds (default=300).\n+  \"-c\", \"--test-cases\"\t: Defines test cases to run. Run all if not specified.\n+  \"-v\", \"--test-vector\"\t: Test vector path (default=dpdk_path+/app/test-bbdev/test_vectors/bbdev_null.data).\n+  \"-n\", \"--num-ops\"\t: Number of operations to process on device (default=32).\n+  \"-b\", \"--burst-size\"\t: Operations enqueue/dequeue burst size (default=32).\n+  \"-s\", \"--snr\"\t\t: SNR in dB used when generating LLRs for bler tests.\n+  \"-s\", \"--iter_max\"\t: Number of iterations for LDPC decoder.\n+  \"-l\", \"--num-lcores\"\t: Number of lcores to run (default=16).\n+  \"-i\", \"--init-device\" : Initialise PF device with default values.\n+\n+\n+To execute the test application tool using simple decode or encode data,\n+type one of the following:\n+\n+.. code-block:: console\n+\n+  ./test-bbdev.py -e=\"--vdev=baseband_la12xx,socket_id=0,max_nb_queues=8\" -c validation -n 64 -b 1 -v ./ldpc_dec_default.data\n+  ./test-bbdev.py -e=\"--vdev=baseband_la12xx,socket_id=0,max_nb_queues=8\" -c validation -n 64 -b 1 -v ./ldpc_enc_default.data\n+\n+The test application ``test-bbdev.py``, supports the ability to configure the PF device with\n+a default set of values, if the \"-i\" or \"- -init-device\" option is included. The default values\n+are defined in test_bbdev_perf.c.\n+\n+\n+Test Vectors\n+~~~~~~~~~~~~\n+\n+In addition to the simple LDPC decoder and LDPC encoder tests, bbdev also provides\n+a range of additional tests under the test_vectors folder, which may be useful. The results\n+of these tests will depend on the LA12xx FEC capabilities which may cause some\n+testcases to be skipped, but no failure should be reported.\ndiff --git a/drivers/baseband/la12xx/bbdev_la12xx.c b/drivers/baseband/la12xx/bbdev_la12xx.c\nindex efd5b5c42d..eaadd4f6e9 100644\n--- a/drivers/baseband/la12xx/bbdev_la12xx.c\n+++ b/drivers/baseband/la12xx/bbdev_la12xx.c\n@@ -120,6 +120,10 @@ la12xx_queue_release(struct rte_bbdev *dev, uint16_t q_id)\n \t\t((uint64_t) ((unsigned long) (A) \\\n \t\t- ((uint64_t)ipc_priv->hugepg_start.host_vaddr)))\n \n+#define MODEM_P2V(A) \\\n+\t((uint64_t) ((unsigned long) (A) \\\n+\t\t+ (unsigned long)(ipc_priv->peb_start.host_vaddr)))\n+\n static int ipc_queue_configure(uint32_t channel_id,\n \t\tipc_t instance, struct bbdev_la12xx_q_priv *q_priv)\n {\n@@ -334,6 +338,318 @@ static const struct rte_bbdev_ops pmd_ops = {\n \t.queue_release = la12xx_queue_release,\n \t.start = la12xx_start\n };\n+\n+static inline int\n+is_bd_ring_full(uint32_t ci, uint32_t ci_flag,\n+\t\tuint32_t pi, uint32_t pi_flag)\n+{\n+\tif (pi == ci) {\n+\t\tif (pi_flag != ci_flag)\n+\t\t\treturn 1; /* Ring is Full */\n+\t}\n+\treturn 0;\n+}\n+\n+static inline int\n+prepare_ldpc_enc_op(struct rte_bbdev_enc_op *bbdev_enc_op,\n+\t\t    struct bbdev_la12xx_q_priv *q_priv __rte_unused,\n+\t\t    struct rte_bbdev_op_data *in_op_data __rte_unused,\n+\t\t    struct rte_bbdev_op_data *out_op_data)\n+{\n+\tstruct rte_bbdev_op_ldpc_enc *ldpc_enc = &bbdev_enc_op->ldpc_enc;\n+\tuint32_t total_out_bits;\n+\n+\ttotal_out_bits = (ldpc_enc->tb_params.cab *\n+\t\tldpc_enc->tb_params.ea) + (ldpc_enc->tb_params.c -\n+\t\tldpc_enc->tb_params.cab) * ldpc_enc->tb_params.eb;\n+\n+\tldpc_enc->output.length = (total_out_bits + 7)/8;\n+\n+\trte_pktmbuf_append(out_op_data->data, ldpc_enc->output.length);\n+\n+\treturn 0;\n+}\n+\n+static inline int\n+prepare_ldpc_dec_op(struct rte_bbdev_dec_op *bbdev_dec_op,\n+\t\t    struct bbdev_ipc_dequeue_op *bbdev_ipc_op,\n+\t\t    struct bbdev_la12xx_q_priv *q_priv  __rte_unused,\n+\t\t    struct rte_bbdev_op_data *out_op_data  __rte_unused)\n+{\n+\tstruct rte_bbdev_op_ldpc_dec *ldpc_dec = &bbdev_dec_op->ldpc_dec;\n+\tuint32_t total_out_bits;\n+\tuint32_t num_code_blocks = 0;\n+\tuint16_t sys_cols;\n+\n+\tsys_cols = (ldpc_dec->basegraph == 1) ? 22 : 10;\n+\tif (ldpc_dec->tb_params.c == 1) {\n+\t\ttotal_out_bits = ((sys_cols * ldpc_dec->z_c) -\n+\t\t\t\tldpc_dec->n_filler);\n+\t\t/* 5G-NR protocol uses 16 bit CRC when output packet\n+\t\t * size <= 3824 (bits). Otherwise 24 bit CRC is used.\n+\t\t * Adjust the output bits accordingly\n+\t\t */\n+\t\tif (total_out_bits - 16 <= 3824)\n+\t\t\ttotal_out_bits -= 16;\n+\t\telse\n+\t\t\ttotal_out_bits -= 24;\n+\t\tldpc_dec->hard_output.length = (total_out_bits / 8);\n+\t} else {\n+\t\ttotal_out_bits = (((sys_cols * ldpc_dec->z_c) -\n+\t\t\t\tldpc_dec->n_filler - 24) *\n+\t\t\t\tldpc_dec->tb_params.c);\n+\t\tldpc_dec->hard_output.length = (total_out_bits / 8) - 3;\n+\t}\n+\n+\tnum_code_blocks = ldpc_dec->tb_params.c;\n+\n+\tbbdev_ipc_op->num_code_blocks = rte_cpu_to_be_32(num_code_blocks);\n+\n+\treturn 0;\n+}\n+\n+static int\n+enqueue_single_op(struct bbdev_la12xx_q_priv *q_priv, void *bbdev_op)\n+{\n+\tstruct bbdev_la12xx_private *priv = q_priv->bbdev_priv;\n+\tipc_userspace_t *ipc_priv = priv->ipc_priv;\n+\tipc_instance_t *ipc_instance = ipc_priv->instance;\n+\tstruct bbdev_ipc_dequeue_op *bbdev_ipc_op;\n+\tstruct rte_bbdev_op_ldpc_enc *ldpc_enc;\n+\tstruct rte_bbdev_op_ldpc_dec *ldpc_dec;\n+\tuint32_t q_id = q_priv->q_id;\n+\tuint32_t ci, ci_flag, pi, pi_flag;\n+\tipc_ch_t *ch = &(ipc_instance->ch_list[q_id]);\n+\tipc_br_md_t *md = &(ch->md);\n+\tsize_t virt;\n+\tchar *huge_start_addr =\n+\t\t(char *)q_priv->bbdev_priv->ipc_priv->hugepg_start.host_vaddr;\n+\tstruct rte_bbdev_op_data *in_op_data, *out_op_data;\n+\tchar *data_ptr;\n+\tuint32_t l1_pcie_addr;\n+\tint ret;\n+\n+\tci = IPC_GET_CI_INDEX(q_priv->host_ci);\n+\tci_flag = IPC_GET_CI_FLAG(q_priv->host_ci);\n+\n+\tpi = IPC_GET_PI_INDEX(q_priv->host_pi);\n+\tpi_flag = IPC_GET_PI_FLAG(q_priv->host_pi);\n+\n+\trte_bbdev_dp_log(DEBUG, \"before bd_ring_full: pi: %u, ci: %u,\"\n+\t\t\"pi_flag: %u, ci_flag: %u, ring size: %u\",\n+\t\tpi, ci, pi_flag, ci_flag, q_priv->queue_size);\n+\n+\tif (is_bd_ring_full(ci, ci_flag, pi, pi_flag)) {\n+\t\trte_bbdev_dp_log(DEBUG, \"bd ring full for queue id: %d\", q_id);\n+\t\treturn IPC_CH_FULL;\n+\t}\n+\n+\tvirt = MODEM_P2V(q_priv->host_params->bd_m_modem_ptr[pi]);\n+\tbbdev_ipc_op = (struct bbdev_ipc_dequeue_op *)virt;\n+\tq_priv->bbdev_op[pi] = bbdev_op;\n+\n+\tswitch (q_priv->op_type) {\n+\tcase RTE_BBDEV_OP_LDPC_ENC:\n+\t\tldpc_enc = &(((struct rte_bbdev_enc_op *)bbdev_op)->ldpc_enc);\n+\t\tin_op_data = &ldpc_enc->input;\n+\t\tout_op_data = &ldpc_enc->output;\n+\n+\t\tret = prepare_ldpc_enc_op(bbdev_op, q_priv,\n+\t\t\t\t\t  in_op_data, out_op_data);\n+\t\tif (ret) {\n+\t\t\trte_bbdev_log(ERR, \"process_ldpc_enc_op fail, ret: %d\",\n+\t\t\t\tret);\n+\t\t\treturn ret;\n+\t\t}\n+\t\tbreak;\n+\n+\tcase RTE_BBDEV_OP_LDPC_DEC:\n+\t\tldpc_dec = &(((struct rte_bbdev_dec_op *)bbdev_op)->ldpc_dec);\n+\t\tin_op_data = &ldpc_dec->input;\n+\n+\t\tout_op_data = &ldpc_dec->hard_output;\n+\n+\t\tret = prepare_ldpc_dec_op(bbdev_op, bbdev_ipc_op,\n+\t\t\t\t\t  q_priv, out_op_data);\n+\t\tif (ret) {\n+\t\t\trte_bbdev_log(ERR, \"process_ldpc_dec_op fail, ret: %d\",\n+\t\t\t\tret);\n+\t\t\treturn ret;\n+\t\t}\n+\t\tbreak;\n+\n+\tdefault:\n+\t\trte_bbdev_log(ERR, \"unsupported bbdev_ipc op type\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (in_op_data->data) {\n+\t\tdata_ptr = rte_pktmbuf_mtod(in_op_data->data, char *);\n+\t\tl1_pcie_addr = (uint32_t)GUL_USER_HUGE_PAGE_ADDR +\n+\t\t\t       data_ptr - huge_start_addr;\n+\t\tbbdev_ipc_op->in_addr = l1_pcie_addr;\n+\t\tbbdev_ipc_op->in_len = in_op_data->length;\n+\t}\n+\n+\tif (out_op_data->data) {\n+\t\tdata_ptr = rte_pktmbuf_mtod(out_op_data->data, char *);\n+\t\tl1_pcie_addr = (uint32_t)GUL_USER_HUGE_PAGE_ADDR +\n+\t\t\t\tdata_ptr - huge_start_addr;\n+\t\tbbdev_ipc_op->out_addr = rte_cpu_to_be_32(l1_pcie_addr);\n+\t\tbbdev_ipc_op->out_len = rte_cpu_to_be_32(out_op_data->length);\n+\t}\n+\n+\t/* Move Producer Index forward */\n+\tpi++;\n+\t/* Flip the PI flag, if wrapping */\n+\tif (unlikely(q_priv->queue_size == pi)) {\n+\t\tpi = 0;\n+\t\tpi_flag = pi_flag ? 0 : 1;\n+\t}\n+\n+\tif (pi_flag)\n+\t\tIPC_SET_PI_FLAG(pi);\n+\telse\n+\t\tIPC_RESET_PI_FLAG(pi);\n+\tq_priv->host_pi = pi;\n+\n+\t/* Wait for Data Copy & pi_flag update to complete before updating pi */\n+\trte_mb();\n+\t/* now update pi */\n+\tmd->pi = rte_cpu_to_be_32(pi);\n+\n+\trte_bbdev_dp_log(DEBUG, \"enter: pi: %u, ci: %u,\"\n+\t\t\t\"pi_flag: %u, ci_flag: %u, ring size: %u\",\n+\t\t\tpi, ci, pi_flag, ci_flag, q_priv->queue_size);\n+\n+\treturn 0;\n+}\n+\n+/* Enqueue decode burst */\n+static uint16_t\n+enqueue_dec_ops(struct rte_bbdev_queue_data *q_data,\n+\t\tstruct rte_bbdev_dec_op **ops, uint16_t nb_ops)\n+{\n+\tstruct bbdev_la12xx_q_priv *q_priv = q_data->queue_private;\n+\tint nb_enqueued, ret;\n+\n+\tfor (nb_enqueued = 0; nb_enqueued < nb_ops; nb_enqueued++) {\n+\t\tret = enqueue_single_op(q_priv, ops[nb_enqueued]);\n+\t\tif (ret)\n+\t\t\tbreak;\n+\t}\n+\n+\tq_data->queue_stats.enqueue_err_count += nb_ops - nb_enqueued;\n+\tq_data->queue_stats.enqueued_count += nb_enqueued;\n+\n+\treturn nb_enqueued;\n+}\n+\n+/* Enqueue encode burst */\n+static uint16_t\n+enqueue_enc_ops(struct rte_bbdev_queue_data *q_data,\n+\t\tstruct rte_bbdev_enc_op **ops, uint16_t nb_ops)\n+{\n+\tstruct bbdev_la12xx_q_priv *q_priv = q_data->queue_private;\n+\tint nb_enqueued, ret;\n+\n+\tfor (nb_enqueued = 0; nb_enqueued < nb_ops; nb_enqueued++) {\n+\t\tret = enqueue_single_op(q_priv, ops[nb_enqueued]);\n+\t\tif (ret)\n+\t\t\tbreak;\n+\t}\n+\n+\tq_data->queue_stats.enqueue_err_count += nb_ops - nb_enqueued;\n+\tq_data->queue_stats.enqueued_count += nb_enqueued;\n+\n+\treturn nb_enqueued;\n+}\n+\n+/* Dequeue encode burst */\n+static void *\n+dequeue_single_op(struct bbdev_la12xx_q_priv *q_priv, void *dst)\n+{\n+\tvoid *op;\n+\tuint32_t ci, ci_flag;\n+\tuint32_t temp_ci;\n+\n+\ttemp_ci = q_priv->host_params->ci;\n+\tif (temp_ci == q_priv->host_ci)\n+\t\treturn NULL;\n+\n+\tci = IPC_GET_CI_INDEX(q_priv->host_ci);\n+\tci_flag = IPC_GET_CI_FLAG(q_priv->host_ci);\n+\n+\trte_bbdev_dp_log(DEBUG,\n+\t\t\"ci: %u, ci_flag: %u, ring size: %u\",\n+\t\tci, ci_flag, q_priv->queue_size);\n+\n+\top = q_priv->bbdev_op[ci];\n+\n+\trte_memcpy(dst, q_priv->msg_ch_vaddr[ci],\n+\t\tsizeof(struct bbdev_ipc_enqueue_op));\n+\n+\t/* Move Consumer Index forward */\n+\tci++;\n+\t/* Flip the CI flag, if wrapping */\n+\tif (q_priv->queue_size == ci) {\n+\t\tci = 0;\n+\t\tci_flag = ci_flag ? 0 : 1;\n+\t}\n+\tif (ci_flag)\n+\t\tIPC_SET_CI_FLAG(ci);\n+\telse\n+\t\tIPC_RESET_CI_FLAG(ci);\n+\n+\tq_priv->host_ci = ci;\n+\n+\trte_bbdev_dp_log(DEBUG,\n+\t\t\"exit: ci: %u, ci_flag: %u, ring size: %u\",\n+\t\tci, ci_flag, q_priv->queue_size);\n+\n+\treturn op;\n+}\n+\n+/* Dequeue decode burst */\n+static uint16_t\n+dequeue_dec_ops(struct rte_bbdev_queue_data *q_data,\n+\t\tstruct rte_bbdev_dec_op **ops, uint16_t nb_ops)\n+{\n+\tstruct bbdev_la12xx_q_priv *q_priv = q_data->queue_private;\n+\tstruct bbdev_ipc_enqueue_op bbdev_ipc_op;\n+\tint nb_dequeued;\n+\n+\tfor (nb_dequeued = 0; nb_dequeued < nb_ops; nb_dequeued++) {\n+\t\tops[nb_dequeued] = dequeue_single_op(q_priv, &bbdev_ipc_op);\n+\t\tif (!ops[nb_dequeued])\n+\t\t\tbreak;\n+\t\tops[nb_dequeued]->status = bbdev_ipc_op.status;\n+\t}\n+\tq_data->queue_stats.dequeued_count += nb_dequeued;\n+\n+\treturn nb_dequeued;\n+}\n+\n+/* Dequeue encode burst */\n+static uint16_t\n+dequeue_enc_ops(struct rte_bbdev_queue_data *q_data,\n+\t\tstruct rte_bbdev_enc_op **ops, uint16_t nb_ops)\n+{\n+\tstruct bbdev_la12xx_q_priv *q_priv = q_data->queue_private;\n+\tstruct bbdev_ipc_enqueue_op bbdev_ipc_op;\n+\tint nb_enqueued;\n+\n+\tfor (nb_enqueued = 0; nb_enqueued < nb_ops; nb_enqueued++) {\n+\t\tops[nb_enqueued] = dequeue_single_op(q_priv, &bbdev_ipc_op);\n+\t\tif (!ops[nb_enqueued])\n+\t\t\tbreak;\n+\t\tops[nb_enqueued]->status = bbdev_ipc_op.status;\n+\t}\n+\tq_data->queue_stats.enqueued_count += nb_enqueued;\n+\n+\treturn nb_enqueued;\n+}\n+\n static struct hugepage_info *\n get_hugepage_info(void)\n {\n@@ -715,6 +1031,10 @@ la12xx_bbdev_create(struct rte_vdev_device *vdev,\n \tbbdev->dequeue_dec_ops = NULL;\n \tbbdev->enqueue_enc_ops = NULL;\n \tbbdev->enqueue_dec_ops = NULL;\n+\tbbdev->dequeue_ldpc_enc_ops = dequeue_enc_ops;\n+\tbbdev->dequeue_ldpc_dec_ops = dequeue_dec_ops;\n+\tbbdev->enqueue_ldpc_enc_ops = enqueue_enc_ops;\n+\tbbdev->enqueue_ldpc_dec_ops = enqueue_dec_ops;\n \n \treturn 0;\n }\ndiff --git a/drivers/baseband/la12xx/bbdev_la12xx_ipc.h b/drivers/baseband/la12xx/bbdev_la12xx_ipc.h\nindex 5f613fb087..b6a7f677d0 100644\n--- a/drivers/baseband/la12xx/bbdev_la12xx_ipc.h\n+++ b/drivers/baseband/la12xx/bbdev_la12xx_ipc.h\n@@ -73,6 +73,25 @@ typedef struct {\n \t_IOWR(GUL_IPC_MAGIC, 5, struct ipc_msg *)\n #define IOCTL_GUL_IPC_CHANNEL_RAISE_INTERRUPT _IOW(GUL_IPC_MAGIC, 6, int *)\n \n+#define GUL_USER_HUGE_PAGE_OFFSET\t(0)\n+#define GUL_PCI1_ADDR_BASE\t(0x00000000ULL)\n+\n+#define GUL_USER_HUGE_PAGE_ADDR\t(GUL_PCI1_ADDR_BASE + GUL_USER_HUGE_PAGE_OFFSET)\n+\n+/* IPC PI/CI index & flag manipulation helpers */\n+#define IPC_PI_CI_FLAG_MASK\t0x80000000 /*  (1<<31) */\n+#define IPC_PI_CI_INDEX_MASK\t0x7FFFFFFF /* ~(1<<31) */\n+\n+#define IPC_SET_PI_FLAG(x)\t(x |= IPC_PI_CI_FLAG_MASK)\n+#define IPC_RESET_PI_FLAG(x)\t(x &= IPC_PI_CI_INDEX_MASK)\n+#define IPC_GET_PI_FLAG(x)\t(x >> 31)\n+#define IPC_GET_PI_INDEX(x)\t(x & IPC_PI_CI_INDEX_MASK)\n+\n+#define IPC_SET_CI_FLAG(x)\t(x |= IPC_PI_CI_FLAG_MASK)\n+#define IPC_RESET_CI_FLAG(x)\t(x &= IPC_PI_CI_INDEX_MASK)\n+#define IPC_GET_CI_FLAG(x)\t(x >> 31)\n+#define IPC_GET_CI_INDEX(x)\t(x & IPC_PI_CI_INDEX_MASK)\n+\n /** buffer ring common metadata */\n typedef struct ipc_bd_ring_md {\n \tvolatile uint32_t pi;\t\t/**< Producer index and flag (MSB)\n@@ -180,6 +199,24 @@ struct bbdev_ipc_enqueue_op {\n \tuint32_t rsvd;\n };\n \n+/** Structure specifying dequeue operation (dequeue at LA1224) */\n+struct bbdev_ipc_dequeue_op {\n+\t/** Input buffer memory address */\n+\tuint32_t in_addr;\n+\t/** Input buffer memory length */\n+\tuint32_t in_len;\n+\t/** Output buffer memory address */\n+\tuint32_t out_addr;\n+\t/** Output buffer memory length */\n+\tuint32_t out_len;\n+\t/* Number of code blocks. Only set when HARQ is used */\n+\tuint32_t num_code_blocks;\n+\t/** Dequeue Operation flags */\n+\tuint32_t op_flags;\n+\t/** Shared metadata between L1 and L2 */\n+\tuint32_t shared_metadata;\n+};\n+\n /* This shared memory would be on the host side which have copy of some\n  * of the parameters which are also part of Shared BD ring. Read access\n  * of these parameters from the host side would not be over PCI.\n",
    "prefixes": [
        "v9",
        "6/8"
    ]
}