From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EE0F5C4338F for ; Thu, 19 Aug 2021 07:59:29 +0000 (UTC) Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by mail.kernel.org (Postfix) with ESMTP id 1B62F610A6 for ; Thu, 19 Aug 2021 07:59:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 1B62F610A6 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=marvell.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=dpdk.org Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2F5584067E; Thu, 19 Aug 2021 09:59:27 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id DED3140141 for ; Thu, 19 Aug 2021 09:59:25 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.1.2/8.16.0.43) with SMTP id 17J1G3Bn026770; Thu, 19 Aug 2021 00:59:24 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=v+6vtVgVBXKWv3VoKF74COufCTFP26lPdz0w21MgD3c=; b=DwK2S2wpWDSnAmwKJWnxHN9bwX4XcoGKOW5UJY0Jia71t/zW2fvbIKVPKFsRXXI6tAdb YXps7xCvTWNfo6PYZwR42zfl+BS9TFo3n3+KwgA4q+J99CUnokSAAuzstOhhKXg9z3Cv ebawRZ1pO86rCLLllesQk/kLVcSxZ3edkDtLHYJIsIr5sbL1C682IBZs4Eg8s2/932Xk PILwzdssyp9YxHIcBndZYYFPV8tkgHN12o/vhsCDms7sVzLtdTps8IW/dYNvk8YGcd5D 6wT1PZ7B0Dqqjf2OrVPPKl1KWytGJvlniZpaQ3FnlZ2TmGY+YCmCIX/FKjyepbYz153a aA== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0a-0016f401.pphosted.com with ESMTP id 3ahdg2s7tr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Thu, 19 Aug 2021 00:59:24 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.18; Thu, 19 Aug 2021 00:59:22 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.18 via Frontend Transport; Thu, 19 Aug 2021 00:59:22 -0700 Received: from rchin-dellt430.marvell.com (rchin-dellt430.marvell.com [10.85.176.141]) by maili.marvell.com (Postfix) with ESMTP id 8D7303F7075; Thu, 19 Aug 2021 00:59:22 -0700 (PDT) From: Radha Mohan Chintakuntla To: , CC: , , , "Radha Mohan Chintakuntla" Date: Thu, 19 Aug 2021 00:59:20 -0700 Message-ID: <20210819075920.103301-1-radhac@marvell.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20210813070104.176246-1-radhac@marvell.com> References: <20210813070104.176246-1-radhac@marvell.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-GUID: gln4JvFcRrPx4XAKuMyLHtFoGZZ1WQgl X-Proofpoint-ORIG-GUID: gln4JvFcRrPx4XAKuMyLHtFoGZZ1WQgl X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.182.1,Aquarius:18.0.790,Hydra:6.0.391,FMLib:17.0.607.475 definitions=2021-08-19_04,2021-08-17_02,2020-04-07_01 Subject: [dpdk-dev] [PATCH v4 2/2] drivers/raw: remove octeontx2-ep driver X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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" Removing the rawdev based octeontx2-ep driver as the dependent common/octeontx2 will soon be going away. Moreover this driver is no longer required as the net/octeontx_ep driver is sufficient. Signed-off-by: Radha Mohan Chintakuntla --- Changes from v3: Fixed patch application failure due to conflict on main branch. Changes from v2: Fixed DPDK CI reported issues for more documentation failure. Changes from v1: Fixed compilation issues in documentation MAINTAINERS | 6 - doc/guides/rawdevs/index.rst | 1 - doc/guides/rawdevs/octeontx2_ep.rst | 82 --- drivers/raw/meson.build | 1 - drivers/raw/octeontx2_ep/meson.build | 11 - drivers/raw/octeontx2_ep/otx2_ep_enqdeq.c | 846 ---------------------- drivers/raw/octeontx2_ep/otx2_ep_enqdeq.h | 52 -- drivers/raw/octeontx2_ep/otx2_ep_rawdev.c | 362 --------- drivers/raw/octeontx2_ep/otx2_ep_rawdev.h | 499 ------------- drivers/raw/octeontx2_ep/otx2_ep_test.c | 172 ----- drivers/raw/octeontx2_ep/otx2_ep_vf.c | 475 ------------ drivers/raw/octeontx2_ep/otx2_ep_vf.h | 10 - drivers/raw/octeontx2_ep/version.map | 3 - 13 files changed, 2520 deletions(-) delete mode 100644 doc/guides/rawdevs/octeontx2_ep.rst delete mode 100644 drivers/raw/octeontx2_ep/meson.build delete mode 100644 drivers/raw/octeontx2_ep/otx2_ep_enqdeq.c delete mode 100644 drivers/raw/octeontx2_ep/otx2_ep_enqdeq.h delete mode 100644 drivers/raw/octeontx2_ep/otx2_ep_rawdev.c delete mode 100644 drivers/raw/octeontx2_ep/otx2_ep_rawdev.h delete mode 100644 drivers/raw/octeontx2_ep/otx2_ep_test.c delete mode 100644 drivers/raw/octeontx2_ep/otx2_ep_vf.c delete mode 100644 drivers/raw/octeontx2_ep/otx2_ep_vf.h delete mode 100644 drivers/raw/octeontx2_ep/version.map diff --git a/MAINTAINERS b/MAINTAINERS index 9f9aa37c68..1d6a408f49 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1321,12 +1321,6 @@ M: Tomasz Duszynski F: doc/guides/rawdevs/cnxk_bphy.rst F: drivers/raw/cnxk_bphy/ -Marvell OCTEON TX2 EP -M: Radha Mohan Chintakuntla -M: Veerasenareddy Burru -F: drivers/raw/octeontx2_ep/ -F: doc/guides/rawdevs/octeontx2_ep.rst - NTB M: Xiaoyun Li M: Jingjing Wu diff --git a/doc/guides/rawdevs/index.rst b/doc/guides/rawdevs/index.rst index 228d4a7743..b6cf917443 100644 --- a/doc/guides/rawdevs/index.rst +++ b/doc/guides/rawdevs/index.rst @@ -17,4 +17,3 @@ application through rawdev API. ifpga ioat ntb - octeontx2_ep diff --git a/doc/guides/rawdevs/octeontx2_ep.rst b/doc/guides/rawdevs/octeontx2_ep.rst deleted file mode 100644 index fb9d346ccf..0000000000 --- a/doc/guides/rawdevs/octeontx2_ep.rst +++ /dev/null @@ -1,82 +0,0 @@ -.. SPDX-License-Identifier: BSD-3-Clause - Copyright(c) 2019 Marvell International Ltd. - -Marvell OCTEON TX2 End Point Rawdev Driver -========================================== - -OCTEON TX2 has an internal SDP unit which provides End Point mode of operation -by exposing its IOQs to Host, IOQs are used for packet I/O between Host and -OCTEON TX2. Each OCTEON TX2 SDP PF supports a max of 128 VFs and Each VF is -associated with a set of IOQ pairs. - -Features --------- - -This OCTEON TX2 End Point mode PMD supports - -#. Packet Input - Host to OCTEON TX2 with direct data instruction mode. - -#. Packet Output - OCTEON TX2 to Host with info pointer mode. - - -Initialization --------------- - -The number of SDP VFs enabled, can be controlled by setting sysfs -entry `sriov_numvfs` for the corresponding PF driver. - -.. code-block:: console - - echo > /sys/bus/pci/drivers/octeontx2-ep/0000\:04\:00.0/sriov_numvfs - -Once the required VFs are enabled, to be accessible from DPDK, VFs need to be -bound to vfio-pci driver. - -Device Setup ------------- - -The OCTEON TX2 SDP End Point VF devices will need to be bound to a -user-space IO driver for use. The script ``dpdk-devbind.py`` script -included with DPDK can be used to view the state of the devices and to bind -them to a suitable DPDK-supported kernel driver. When querying the status -of the devices, they will appear under the category of "Misc (rawdev) -devices", i.e. the command ``dpdk-devbind.py --status-dev misc`` can be -used to see the state of those devices alone. - -Device Configuration --------------------- - -Configuring SDP EP rawdev device is done using the ``rte_rawdev_configure()`` -API, which takes the mempool as parameter. PMD uses this pool to send/receive -packets to/from the HW. - -The following code shows how the device is configured - -.. code-block:: c - - struct sdp_rawdev_info config = {0}; - struct rte_rawdev_info rdev_info = {.dev_private = &config}; - config.enqdeq_mpool = (void *)rte_mempool_create(...); - - rte_rawdev_configure(dev_id, (rte_rawdev_obj_t)&rdev_info, - sizeof(config)); - -Performing Data Transfer ------------------------- - -To perform data transfer using SDP VF EP rawdev devices use standard -``rte_rawdev_enqueue_buffers()`` and ``rte_rawdev_dequeue_buffers()`` APIs. - -Self test ---------- - -On EAL initialization, SDP VF devices will be probed and populated into the -raw devices. The rawdev ID of the device can be obtained using - -* Invoke ``rte_rawdev_get_dev_id("SDPEP:x")`` from the test application - where x is the VF device's bus id specified in "bus:device.func"(BDF) - format. Use this index for further rawdev function calls. - -* The driver's selftest rawdev API can be used to verify the SDP EP mode - functional tests which can send/receive the raw data packets to/from the - EP device. diff --git a/drivers/raw/meson.build b/drivers/raw/meson.build index f25d5f322c..87694a758e 100644 --- a/drivers/raw/meson.build +++ b/drivers/raw/meson.build @@ -12,7 +12,6 @@ drivers = [ 'ifpga', 'ioat', 'ntb', - 'octeontx2_ep', 'skeleton', ] std_deps = ['rawdev'] diff --git a/drivers/raw/octeontx2_ep/meson.build b/drivers/raw/octeontx2_ep/meson.build deleted file mode 100644 index 8d7c69aa3c..0000000000 --- a/drivers/raw/octeontx2_ep/meson.build +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright(C) 2019 Marvell International Ltd. -# - -deps += ['bus_pci', 'common_octeontx2', 'rawdev'] -sources = files( - 'otx2_ep_enqdeq.c', - 'otx2_ep_rawdev.c', - 'otx2_ep_test.c', - 'otx2_ep_vf.c', -) diff --git a/drivers/raw/octeontx2_ep/otx2_ep_enqdeq.c b/drivers/raw/octeontx2_ep/otx2_ep_enqdeq.c deleted file mode 100644 index d04e957d82..0000000000 --- a/drivers/raw/octeontx2_ep/otx2_ep_enqdeq.c +++ /dev/null @@ -1,846 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2019 Marvell International Ltd. - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "otx2_common.h" -#include "otx2_ep_enqdeq.h" - -static void -sdp_dmazone_free(const struct rte_memzone *mz) -{ - const struct rte_memzone *mz_tmp; - int ret = 0; - - if (mz == NULL) { - otx2_err("Memzone %s : NULL", mz->name); - return; - } - - mz_tmp = rte_memzone_lookup(mz->name); - if (mz_tmp == NULL) { - otx2_err("Memzone %s Not Found", mz->name); - return; - } - - ret = rte_memzone_free(mz); - if (ret) - otx2_err("Memzone free failed : ret = %d", ret); - -} - -/* Free IQ resources */ -int -sdp_delete_iqs(struct sdp_device *sdpvf, uint32_t iq_no) -{ - struct sdp_instr_queue *iq; - - iq = sdpvf->instr_queue[iq_no]; - if (iq == NULL) { - otx2_err("Invalid IQ[%d]\n", iq_no); - return -ENOMEM; - } - - rte_free(iq->req_list); - iq->req_list = NULL; - - if (iq->iq_mz) { - sdp_dmazone_free(iq->iq_mz); - iq->iq_mz = NULL; - } - - rte_free(sdpvf->instr_queue[iq_no]); - sdpvf->instr_queue[iq_no] = NULL; - - sdpvf->num_iqs--; - - otx2_info("IQ[%d] is deleted", iq_no); - - return 0; -} - -/* IQ initialization */ -static int -sdp_init_instr_queue(struct sdp_device *sdpvf, int iq_no) -{ - const struct sdp_config *conf; - struct sdp_instr_queue *iq; - uint32_t q_size; - - conf = sdpvf->conf; - iq = sdpvf->instr_queue[iq_no]; - q_size = conf->iq.instr_type * conf->num_iqdef_descs; - - /* IQ memory creation for Instruction submission to OCTEON TX2 */ - iq->iq_mz = rte_memzone_reserve_aligned("iqmz", - q_size, - rte_socket_id(), - RTE_MEMZONE_IOVA_CONTIG, - RTE_CACHE_LINE_SIZE); - if (iq->iq_mz == NULL) { - otx2_err("IQ[%d] memzone alloc failed", iq_no); - goto iq_init_fail; - } - - iq->base_addr_dma = iq->iq_mz->iova; - iq->base_addr = (uint8_t *)iq->iq_mz->addr; - - if (conf->num_iqdef_descs & (conf->num_iqdef_descs - 1)) { - otx2_err("IQ[%d] descs not in power of 2", iq_no); - goto iq_init_fail; - } - - iq->nb_desc = conf->num_iqdef_descs; - - /* Create a IQ request list to hold requests that have been - * posted to OCTEON TX2. This list will be used for freeing the IQ - * data buffer(s) later once the OCTEON TX2 fetched the requests. - */ - iq->req_list = rte_zmalloc_socket("request_list", - (iq->nb_desc * SDP_IQREQ_LIST_SIZE), - RTE_CACHE_LINE_SIZE, - rte_socket_id()); - if (iq->req_list == NULL) { - otx2_err("IQ[%d] req_list alloc failed", iq_no); - goto iq_init_fail; - } - - otx2_info("IQ[%d]: base: %p basedma: %lx count: %d", - iq_no, iq->base_addr, (unsigned long)iq->base_addr_dma, - iq->nb_desc); - - iq->sdp_dev = sdpvf; - iq->q_no = iq_no; - iq->fill_cnt = 0; - iq->host_write_index = 0; - iq->otx_read_index = 0; - iq->flush_index = 0; - - /* Initialize the spinlock for this instruction queue */ - rte_spinlock_init(&iq->lock); - rte_spinlock_init(&iq->post_lock); - - rte_atomic64_clear(&iq->iq_flush_running); - - sdpvf->io_qmask.iq |= (1ull << iq_no); - - /* Set 32B/64B mode for each input queue */ - if (conf->iq.instr_type == 64) - sdpvf->io_qmask.iq64B |= (1ull << iq_no); - - iq->iqcmd_64B = (conf->iq.instr_type == 64); - - /* Set up IQ registers */ - sdpvf->fn_list.setup_iq_regs(sdpvf, iq_no); - - return 0; - -iq_init_fail: - return -ENOMEM; - -} - -int -sdp_setup_iqs(struct sdp_device *sdpvf, uint32_t iq_no) -{ - struct sdp_instr_queue *iq; - - iq = (struct sdp_instr_queue *)rte_zmalloc("sdp_IQ", sizeof(*iq), - RTE_CACHE_LINE_SIZE); - if (iq == NULL) - return -ENOMEM; - - sdpvf->instr_queue[iq_no] = iq; - - if (sdp_init_instr_queue(sdpvf, iq_no)) { - otx2_err("IQ init is failed"); - goto delete_IQ; - } - otx2_info("IQ[%d] is created.", sdpvf->num_iqs); - - sdpvf->num_iqs++; - - - return 0; - -delete_IQ: - sdp_delete_iqs(sdpvf, iq_no); - return -ENOMEM; -} - -static void -sdp_droq_reset_indices(struct sdp_droq *droq) -{ - droq->read_idx = 0; - droq->write_idx = 0; - droq->refill_idx = 0; - droq->refill_count = 0; - rte_atomic64_set(&droq->pkts_pending, 0); -} - -static void -sdp_droq_destroy_ring_buffers(struct sdp_device *sdpvf, - struct sdp_droq *droq) -{ - uint32_t idx; - - for (idx = 0; idx < droq->nb_desc; idx++) { - if (droq->recv_buf_list[idx].buffer) { - rte_mempool_put(sdpvf->enqdeq_mpool, - droq->recv_buf_list[idx].buffer); - - droq->recv_buf_list[idx].buffer = NULL; - } - } - - sdp_droq_reset_indices(droq); -} - -/* Free OQs resources */ -int -sdp_delete_oqs(struct sdp_device *sdpvf, uint32_t oq_no) -{ - struct sdp_droq *droq; - - droq = sdpvf->droq[oq_no]; - if (droq == NULL) { - otx2_err("Invalid droq[%d]", oq_no); - return -ENOMEM; - } - - sdp_droq_destroy_ring_buffers(sdpvf, droq); - rte_free(droq->recv_buf_list); - droq->recv_buf_list = NULL; - - if (droq->info_mz) { - sdp_dmazone_free(droq->info_mz); - droq->info_mz = NULL; - } - - if (droq->desc_ring_mz) { - sdp_dmazone_free(droq->desc_ring_mz); - droq->desc_ring_mz = NULL; - } - - memset(droq, 0, SDP_DROQ_SIZE); - - rte_free(sdpvf->droq[oq_no]); - sdpvf->droq[oq_no] = NULL; - - sdpvf->num_oqs--; - - otx2_info("OQ[%d] is deleted", oq_no); - return 0; -} - -static int -sdp_droq_setup_ring_buffers(struct sdp_device *sdpvf, - struct sdp_droq *droq) -{ - struct sdp_droq_desc *desc_ring = droq->desc_ring; - uint32_t idx; - void *buf; - - for (idx = 0; idx < droq->nb_desc; idx++) { - if (rte_mempool_get(sdpvf->enqdeq_mpool, &buf) || - (buf == NULL)) { - otx2_err("OQ buffer alloc failed"); - droq->stats.rx_alloc_failure++; - /* sdp_droq_destroy_ring_buffers(droq);*/ - return -ENOMEM; - } - - droq->recv_buf_list[idx].buffer = buf; - droq->info_list[idx].length = 0; - - /* Map ring buffers into memory */ - desc_ring[idx].info_ptr = (uint64_t)(droq->info_list_dma + - (idx * SDP_DROQ_INFO_SIZE)); - - desc_ring[idx].buffer_ptr = rte_mem_virt2iova(buf); - } - - sdp_droq_reset_indices(droq); - - return 0; -} - -static void * -sdp_alloc_info_buffer(struct sdp_device *sdpvf __rte_unused, - struct sdp_droq *droq) -{ - droq->info_mz = rte_memzone_reserve_aligned("OQ_info_list", - (droq->nb_desc * SDP_DROQ_INFO_SIZE), - rte_socket_id(), - RTE_MEMZONE_IOVA_CONTIG, - RTE_CACHE_LINE_SIZE); - - if (droq->info_mz == NULL) - return NULL; - - droq->info_list_dma = droq->info_mz->iova; - droq->info_alloc_size = droq->info_mz->len; - droq->info_base_addr = (size_t)droq->info_mz->addr; - - return droq->info_mz->addr; -} - -/* OQ initialization */ -static int -sdp_init_droq(struct sdp_device *sdpvf, uint32_t q_no) -{ - const struct sdp_config *conf = sdpvf->conf; - uint32_t c_refill_threshold; - uint32_t desc_ring_size; - struct sdp_droq *droq; - - otx2_info("OQ[%d] Init start", q_no); - - droq = sdpvf->droq[q_no]; - droq->sdp_dev = sdpvf; - droq->q_no = q_no; - - c_refill_threshold = conf->oq.refill_threshold; - droq->nb_desc = conf->num_oqdef_descs; - droq->buffer_size = conf->oqdef_buf_size; - - /* OQ desc_ring set up */ - desc_ring_size = droq->nb_desc * SDP_DROQ_DESC_SIZE; - droq->desc_ring_mz = rte_memzone_reserve_aligned("sdp_oqmz", - desc_ring_size, - rte_socket_id(), - RTE_MEMZONE_IOVA_CONTIG, - RTE_CACHE_LINE_SIZE); - - if (droq->desc_ring_mz == NULL) { - otx2_err("OQ:%d desc_ring allocation failed", q_no); - goto init_droq_fail; - } - - droq->desc_ring_dma = droq->desc_ring_mz->iova; - droq->desc_ring = (struct sdp_droq_desc *)droq->desc_ring_mz->addr; - - otx2_sdp_dbg("OQ[%d]: desc_ring: virt: 0x%p, dma: %lx", - q_no, droq->desc_ring, (unsigned long)droq->desc_ring_dma); - otx2_sdp_dbg("OQ[%d]: num_desc: %d", q_no, droq->nb_desc); - - - /* OQ info_list set up */ - droq->info_list = sdp_alloc_info_buffer(sdpvf, droq); - if (droq->info_list == NULL) { - otx2_err("memory allocation failed for OQ[%d] info_list", q_no); - goto init_droq_fail; - } - - /* OQ buf_list set up */ - droq->recv_buf_list = rte_zmalloc_socket("recv_buf_list", - (droq->nb_desc * SDP_DROQ_RECVBUF_SIZE), - RTE_CACHE_LINE_SIZE, rte_socket_id()); - if (droq->recv_buf_list == NULL) { - otx2_err("OQ recv_buf_list alloc failed"); - goto init_droq_fail; - } - - if (sdp_droq_setup_ring_buffers(sdpvf, droq)) - goto init_droq_fail; - - droq->refill_threshold = c_refill_threshold; - rte_spinlock_init(&droq->lock); - - - /* Set up OQ registers */ - sdpvf->fn_list.setup_oq_regs(sdpvf, q_no); - - sdpvf->io_qmask.oq |= (1ull << q_no); - - return 0; - -init_droq_fail: - return -ENOMEM; -} - -/* OQ configuration and setup */ -int -sdp_setup_oqs(struct sdp_device *sdpvf, uint32_t oq_no) -{ - struct sdp_droq *droq; - - /* Allocate new droq. */ - droq = (struct sdp_droq *)rte_zmalloc("sdp_OQ", - sizeof(*droq), RTE_CACHE_LINE_SIZE); - if (droq == NULL) { - otx2_err("Droq[%d] Creation Failed", oq_no); - return -ENOMEM; - } - sdpvf->droq[oq_no] = droq; - - if (sdp_init_droq(sdpvf, oq_no)) { - otx2_err("Droq[%d] Initialization failed", oq_no); - goto delete_OQ; - } - otx2_info("OQ[%d] is created.", oq_no); - - sdpvf->num_oqs++; - - return 0; - -delete_OQ: - sdp_delete_oqs(sdpvf, oq_no); - return -ENOMEM; -} - -static inline void -sdp_iqreq_delete(struct sdp_device *sdpvf, - struct sdp_instr_queue *iq, uint32_t idx) -{ - uint32_t reqtype; - void *buf; - - buf = iq->req_list[idx].buf; - reqtype = iq->req_list[idx].reqtype; - - switch (reqtype) { - case SDP_REQTYPE_NORESP: - rte_mempool_put(sdpvf->enqdeq_mpool, buf); - otx2_sdp_dbg("IQ buffer freed at idx[%d]", idx); - break; - - case SDP_REQTYPE_NORESP_GATHER: - case SDP_REQTYPE_NONE: - default: - otx2_info("This iqreq mode is not supported:%d", reqtype); - - } - - /* Reset the request list at this index */ - iq->req_list[idx].buf = NULL; - iq->req_list[idx].reqtype = 0; -} - -static inline void -sdp_iqreq_add(struct sdp_instr_queue *iq, void *buf, - uint32_t reqtype) -{ - iq->req_list[iq->host_write_index].buf = buf; - iq->req_list[iq->host_write_index].reqtype = reqtype; - - otx2_sdp_dbg("IQ buffer added at idx[%d]", iq->host_write_index); - -} - -static void -sdp_flush_iq(struct sdp_device *sdpvf, - struct sdp_instr_queue *iq, - uint32_t pending_thresh __rte_unused) -{ - uint32_t instr_processed = 0; - - rte_spinlock_lock(&iq->lock); - - iq->otx_read_index = sdpvf->fn_list.update_iq_read_idx(iq); - while (iq->flush_index != iq->otx_read_index) { - /* Free the IQ data buffer to the pool */ - sdp_iqreq_delete(sdpvf, iq, iq->flush_index); - iq->flush_index = - sdp_incr_index(iq->flush_index, 1, iq->nb_desc); - - instr_processed++; - } - - iq->stats.instr_processed = instr_processed; - rte_atomic64_sub(&iq->instr_pending, instr_processed); - - rte_spinlock_unlock(&iq->lock); -} - -static inline void -sdp_ring_doorbell(struct sdp_device *sdpvf __rte_unused, - struct sdp_instr_queue *iq) -{ - otx2_write64(iq->fill_cnt, iq->doorbell_reg); - - /* Make sure doorbell writes observed by HW */ - rte_io_wmb(); - iq->fill_cnt = 0; - -} - -static inline int -post_iqcmd(struct sdp_instr_queue *iq, uint8_t *iqcmd) -{ - uint8_t *iqptr, cmdsize; - - /* This ensures that the read index does not wrap around to - * the same position if queue gets full before OCTEON TX2 could - * fetch any instr. - */ - if (rte_atomic64_read(&iq->instr_pending) >= - (int32_t)(iq->nb_desc - 1)) { - otx2_err("IQ is full, pending:%ld", - (long)rte_atomic64_read(&iq->instr_pending)); - - return SDP_IQ_SEND_FAILED; - } - - /* Copy cmd into iq */ - cmdsize = ((iq->iqcmd_64B) ? 64 : 32); - iqptr = iq->base_addr + (cmdsize * iq->host_write_index); - - rte_memcpy(iqptr, iqcmd, cmdsize); - - otx2_sdp_dbg("IQ cmd posted @ index:%d", iq->host_write_index); - - /* Increment the host write index */ - iq->host_write_index = - sdp_incr_index(iq->host_write_index, 1, iq->nb_desc); - - iq->fill_cnt++; - - /* Flush the command into memory. We need to be sure the data - * is in memory before indicating that the instruction is - * pending. - */ - rte_smp_wmb(); - rte_atomic64_inc(&iq->instr_pending); - - /* SDP_IQ_SEND_SUCCESS */ - return 0; -} - - -static int -sdp_send_data(struct sdp_device *sdpvf, - struct sdp_instr_queue *iq, void *cmd) -{ - uint32_t ret; - - /* Lock this IQ command queue before posting instruction */ - rte_spinlock_lock(&iq->post_lock); - - /* Submit IQ command */ - ret = post_iqcmd(iq, cmd); - - if (ret == SDP_IQ_SEND_SUCCESS) { - sdp_ring_doorbell(sdpvf, iq); - - iq->stats.instr_posted++; - otx2_sdp_dbg("Instr submit success posted: %ld\n", - (long)iq->stats.instr_posted); - - } else { - iq->stats.instr_dropped++; - otx2_err("Instr submit failed, dropped: %ld\n", - (long)iq->stats.instr_dropped); - - } - - rte_spinlock_unlock(&iq->post_lock); - - return ret; -} - - -/* Enqueue requests/packets to SDP IQ queue. - * returns number of requests enqueued successfully - */ -int -sdp_rawdev_enqueue(struct rte_rawdev *rawdev, - struct rte_rawdev_buf **buffers __rte_unused, - unsigned int count, rte_rawdev_obj_t context) -{ - struct sdp_instr_64B *iqcmd; - struct sdp_instr_queue *iq; - struct sdp_soft_instr *si; - struct sdp_device *sdpvf; - - struct sdp_instr_ih ihx; - - sdpvf = (struct sdp_device *)rawdev->dev_private; - si = (struct sdp_soft_instr *)context; - - iq = sdpvf->instr_queue[si->q_no]; - - if ((count > 1) || (count < 1)) { - otx2_err("This mode not supported: req[%d]", count); - goto enq_fail; - } - - memset(&ihx, 0, sizeof(struct sdp_instr_ih)); - - iqcmd = &si->command; - memset(iqcmd, 0, sizeof(struct sdp_instr_64B)); - - iqcmd->dptr = (uint64_t)si->dptr; - - /* Populate SDP IH */ - ihx.pkind = sdpvf->pkind; - ihx.fsz = si->ih.fsz + 8; /* 8B for NIX IH */ - ihx.gather = si->ih.gather; - - /* Direct data instruction */ - ihx.tlen = si->ih.tlen + ihx.fsz; - - switch (ihx.gather) { - case 0: /* Direct data instr */ - ihx.tlen = si->ih.tlen + ihx.fsz; - break; - - default: /* Gather */ - switch (si->ih.gsz) { - case 0: /* Direct gather instr */ - otx2_err("Direct Gather instr : not supported"); - goto enq_fail; - - default: /* Indirect gather instr */ - otx2_err("Indirect Gather instr : not supported"); - goto enq_fail; - } - } - - rte_memcpy(&iqcmd->ih, &ihx, sizeof(uint64_t)); - iqcmd->rptr = (uint64_t)si->rptr; - rte_memcpy(&iqcmd->irh, &si->irh, sizeof(uint64_t)); - - /* Swap FSZ(front data) here, to avoid swapping on OCTEON TX2 side */ - sdp_swap_8B_data(&iqcmd->rptr, 1); - sdp_swap_8B_data(&iqcmd->irh, 1); - - otx2_sdp_dbg("After swapping"); - otx2_sdp_dbg("Word0 [dptr]: 0x%016lx", (unsigned long)iqcmd->dptr); - otx2_sdp_dbg("Word1 [ihtx]: 0x%016lx", (unsigned long)iqcmd->ih); - otx2_sdp_dbg("Word2 [rptr]: 0x%016lx", (unsigned long)iqcmd->rptr); - otx2_sdp_dbg("Word3 [irh]: 0x%016lx", (unsigned long)iqcmd->irh); - otx2_sdp_dbg("Word4 [exhdr[0]]: 0x%016lx", - (unsigned long)iqcmd->exhdr[0]); - - sdp_iqreq_add(iq, si->dptr, si->reqtype); - - if (sdp_send_data(sdpvf, iq, iqcmd)) { - otx2_err("Data send failed :"); - sdp_iqreq_delete(sdpvf, iq, iq->host_write_index); - goto enq_fail; - } - - if (rte_atomic64_read(&iq->instr_pending) >= 1) - sdp_flush_iq(sdpvf, iq, 1 /*(iq->nb_desc / 2)*/); - - /* Return no# of instructions posted successfully. */ - return count; - -enq_fail: - return SDP_IQ_SEND_FAILED; -} - -static uint32_t -sdp_droq_refill(struct sdp_device *sdpvf, struct sdp_droq *droq) -{ - struct sdp_droq_desc *desc_ring; - uint32_t desc_refilled = 0; - void *buf = NULL; - - desc_ring = droq->desc_ring; - - while (droq->refill_count && (desc_refilled < droq->nb_desc)) { - /* If a valid buffer exists (happens if there is no dispatch), - * reuse the buffer, else allocate. - */ - if (droq->recv_buf_list[droq->refill_idx].buffer != NULL) - break; - - if (rte_mempool_get(sdpvf->enqdeq_mpool, &buf) || - (buf == NULL)) { - /* If a buffer could not be allocated, no point in - * continuing - */ - droq->stats.rx_alloc_failure++; - break; - } - - droq->recv_buf_list[droq->refill_idx].buffer = buf; - desc_ring[droq->refill_idx].buffer_ptr = rte_mem_virt2iova(buf); - - /* Reset any previous values in the length field. */ - droq->info_list[droq->refill_idx].length = 0; - - droq->refill_idx = sdp_incr_index(droq->refill_idx, 1, - droq->nb_desc); - - desc_refilled++; - droq->refill_count--; - - } - - return desc_refilled; -} - -static int -sdp_droq_read_packet(struct sdp_device *sdpvf __rte_unused, - struct sdp_droq *droq, - struct sdp_droq_pkt *droq_pkt) -{ - struct sdp_droq_info *info; - uint32_t total_len = 0; - uint32_t pkt_len = 0; - - info = &droq->info_list[droq->read_idx]; - sdp_swap_8B_data((uint64_t *)&info->length, 1); - if (!info->length) { - otx2_err("OQ info_list->length[%ld]", (long)info->length); - goto oq_read_fail; - } - - /* Deduce the actual data size */ - info->length -= SDP_RH_SIZE; - total_len += (uint32_t)info->length; - - otx2_sdp_dbg("OQ: pkt_len[%ld], buffer_size %d", - (long)info->length, droq->buffer_size); - if (info->length > droq->buffer_size) { - otx2_err("This mode is not supported: pkt_len > buffer_size"); - goto oq_read_fail; - } - - if (info->length <= droq->buffer_size) { - pkt_len = (uint32_t)info->length; - droq_pkt->data = droq->recv_buf_list[droq->read_idx].buffer; - droq_pkt->len = pkt_len; - - droq->recv_buf_list[droq->read_idx].buffer = NULL; - droq->read_idx = sdp_incr_index(droq->read_idx, 1,/* count */ - droq->nb_desc /* max rd idx */); - droq->refill_count++; - - } - - info->length = 0; - - return SDP_OQ_RECV_SUCCESS; - -oq_read_fail: - return SDP_OQ_RECV_FAILED; -} - -static inline uint32_t -sdp_check_droq_pkts(struct sdp_droq *droq, uint32_t burst_size) -{ - uint32_t min_pkts = 0; - uint32_t new_pkts; - uint32_t pkt_count; - - /* Latest available OQ packets */ - pkt_count = rte_read32(droq->pkts_sent_reg); - - /* Newly arrived packets */ - new_pkts = pkt_count - droq->last_pkt_count; - otx2_sdp_dbg("Recvd [%d] new OQ pkts", new_pkts); - - min_pkts = (new_pkts > burst_size) ? burst_size : new_pkts; - if (min_pkts) { - rte_atomic64_add(&droq->pkts_pending, min_pkts); - /* Back up the aggregated packet count so far */ - droq->last_pkt_count += min_pkts; - } - - return min_pkts; -} - -/* Check for response arrival from OCTEON TX2 - * returns number of requests completed - */ -int -sdp_rawdev_dequeue(struct rte_rawdev *rawdev, - struct rte_rawdev_buf **buffers, unsigned int count, - rte_rawdev_obj_t context __rte_unused) -{ - struct sdp_droq_pkt *oq_pkt; - struct sdp_device *sdpvf; - struct sdp_droq *droq; - - uint32_t q_no = 0, pkts; - uint32_t new_pkts; - uint32_t ret; - - sdpvf = (struct sdp_device *)rawdev->dev_private; - - droq = sdpvf->droq[q_no]; - if (!droq) { - otx2_err("Invalid droq[%d]", q_no); - goto droq_err; - } - - /* Grab the lock */ - rte_spinlock_lock(&droq->lock); - - new_pkts = sdp_check_droq_pkts(droq, count); - if (!new_pkts) { - otx2_sdp_dbg("Zero new_pkts:%d", new_pkts); - goto deq_fail; /* No pkts at this moment */ - } - - otx2_sdp_dbg("Received new_pkts = %d", new_pkts); - - for (pkts = 0; pkts < new_pkts; pkts++) { - - /* Push the received pkt to application */ - oq_pkt = (struct sdp_droq_pkt *)buffers[pkts]; - - ret = sdp_droq_read_packet(sdpvf, droq, oq_pkt); - if (ret) { - otx2_err("DROQ read pakt failed."); - goto deq_fail; - } - - /* Stats */ - droq->stats.pkts_received++; - droq->stats.bytes_received += oq_pkt->len; - } - - /* Ack the h/w with no# of pkts read by Host */ - rte_write32(pkts, droq->pkts_sent_reg); - rte_io_wmb(); - - droq->last_pkt_count -= pkts; - - otx2_sdp_dbg("DROQ pkts[%d] pushed to application", pkts); - - /* Refill DROQ buffers */ - if (droq->refill_count >= 2 /* droq->refill_threshold */) { - int desc_refilled = sdp_droq_refill(sdpvf, droq); - - /* Flush the droq descriptor data to memory to be sure - * that when we update the credits the data in memory is - * accurate. - */ - rte_write32(desc_refilled, droq->pkts_credit_reg); - - /* Ensure mmio write completes */ - rte_wmb(); - otx2_sdp_dbg("Refilled count = %d", desc_refilled); - } - - /* Release the spin lock */ - rte_spinlock_unlock(&droq->lock); - - return pkts; - -deq_fail: - rte_spinlock_unlock(&droq->lock); - -droq_err: - return SDP_OQ_RECV_FAILED; -} diff --git a/drivers/raw/octeontx2_ep/otx2_ep_enqdeq.h b/drivers/raw/octeontx2_ep/otx2_ep_enqdeq.h deleted file mode 100644 index 172fdc5568..0000000000 --- a/drivers/raw/octeontx2_ep/otx2_ep_enqdeq.h +++ /dev/null @@ -1,52 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2019 Marvell International Ltd. - */ - -#ifndef _OTX2_EP_ENQDEQ_H_ -#define _OTX2_EP_ENQDEQ_H_ - -#include -#include "otx2_ep_rawdev.h" - -#define SDP_IQ_SEND_FAILED (-1) -#define SDP_IQ_SEND_SUCCESS (0) - -#define SDP_OQ_RECV_FAILED (-1) -#define SDP_OQ_RECV_SUCCESS (0) - -static inline uint64_t -sdp_endian_swap_8B(uint64_t _d) -{ - return ((((((uint64_t)(_d)) >> 0) & (uint64_t)0xff) << 56) | - (((((uint64_t)(_d)) >> 8) & (uint64_t)0xff) << 48) | - (((((uint64_t)(_d)) >> 16) & (uint64_t)0xff) << 40) | - (((((uint64_t)(_d)) >> 24) & (uint64_t)0xff) << 32) | - (((((uint64_t)(_d)) >> 32) & (uint64_t)0xff) << 24) | - (((((uint64_t)(_d)) >> 40) & (uint64_t)0xff) << 16) | - (((((uint64_t)(_d)) >> 48) & (uint64_t)0xff) << 8) | - (((((uint64_t)(_d)) >> 56) & (uint64_t)0xff) << 0)); -} - -static inline void -sdp_swap_8B_data(uint64_t *data, uint32_t blocks) -{ - /* Swap 8B blocks */ - while (blocks) { - *data = sdp_endian_swap_8B(*data); - blocks--; - data++; - } -} - -static inline uint32_t -sdp_incr_index(uint32_t index, uint32_t count, uint32_t max) -{ - if ((index + count) >= max) - index = index + count - max; - else - index += count; - - return index; -} - -#endif /* _OTX2_EP_ENQDEQ_H_ */ diff --git a/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c b/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c deleted file mode 100644 index b2ccdda83e..0000000000 --- a/drivers/raw/octeontx2_ep/otx2_ep_rawdev.c +++ /dev/null @@ -1,362 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2019 Marvell International Ltd. - */ -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "otx2_common.h" -#include "otx2_ep_rawdev.h" -#include "otx2_ep_vf.h" - -static const struct rte_pci_id pci_sdp_vf_map[] = { - { - RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, - PCI_DEVID_OCTEONTX2_EP_RAW_VF) - }, - { - .vendor_id = 0, - }, -}; - -/* SDP_VF default configuration */ -const struct sdp_config default_sdp_conf = { - /* IQ attributes */ - .iq = { - .max_iqs = SDP_VF_CFG_IO_QUEUES, - .instr_type = SDP_VF_64BYTE_INSTR, - .pending_list_size = (SDP_VF_MAX_IQ_DESCRIPTORS * - SDP_VF_CFG_IO_QUEUES), - }, - - /* OQ attributes */ - .oq = { - .max_oqs = SDP_VF_CFG_IO_QUEUES, - .info_ptr = SDP_VF_OQ_INFOPTR_MODE, - .refill_threshold = SDP_VF_OQ_REFIL_THRESHOLD, - }, - - .num_iqdef_descs = SDP_VF_MAX_IQ_DESCRIPTORS, - .num_oqdef_descs = SDP_VF_MAX_OQ_DESCRIPTORS, - .oqdef_buf_size = SDP_VF_OQ_BUF_SIZE, - -}; - -const struct sdp_config* -sdp_get_defconf(struct sdp_device *sdp_dev __rte_unused) -{ - const struct sdp_config *default_conf = NULL; - - default_conf = &default_sdp_conf; - - return default_conf; -} - -static int -sdp_vfdev_exit(struct rte_rawdev *rawdev) -{ - struct sdp_device *sdpvf; - uint32_t rawdev_queues, q; - - otx2_info("%s:", __func__); - - sdpvf = (struct sdp_device *)rawdev->dev_private; - - sdpvf->fn_list.disable_io_queues(sdpvf); - - rawdev_queues = sdpvf->num_oqs; - for (q = 0; q < rawdev_queues; q++) { - if (sdp_delete_oqs(sdpvf, q)) { - otx2_err("Failed to delete OQ:%d", q); - return -ENOMEM; - } - } - otx2_info("Num OQs:%d freed", sdpvf->num_oqs); - - /* Free the oqbuf_pool */ - rte_mempool_free(sdpvf->enqdeq_mpool); - sdpvf->enqdeq_mpool = NULL; - - otx2_info("Enqdeq_mpool free done"); - - rawdev_queues = sdpvf->num_iqs; - for (q = 0; q < rawdev_queues; q++) { - if (sdp_delete_iqs(sdpvf, q)) { - otx2_err("Failed to delete IQ:%d", q); - return -ENOMEM; - } - } - otx2_sdp_dbg("Num IQs:%d freed", sdpvf->num_iqs); - - return 0; -} - -static int -sdp_chip_specific_setup(struct sdp_device *sdpvf) -{ - struct rte_pci_device *pdev = sdpvf->pci_dev; - uint32_t dev_id = pdev->id.device_id; - int ret; - - switch (dev_id) { - case PCI_DEVID_OCTEONTX2_EP_RAW_VF: - sdpvf->chip_id = PCI_DEVID_OCTEONTX2_EP_RAW_VF; - ret = sdp_vf_setup_device(sdpvf); - - break; - default: - otx2_err("Unsupported device"); - ret = -EINVAL; - } - - if (!ret) - otx2_info("SDP dev_id[%d]", dev_id); - - return ret; -} - -/* SDP VF device initialization */ -static int -sdp_vfdev_init(struct sdp_device *sdpvf) -{ - uint32_t rawdev_queues, q; - - if (sdp_chip_specific_setup(sdpvf)) { - otx2_err("Chip specific setup failed"); - goto setup_fail; - } - - if (sdpvf->fn_list.setup_device_regs(sdpvf)) { - otx2_err("Failed to configure device registers"); - goto setup_fail; - } - - rawdev_queues = (uint32_t)(sdpvf->sriov_info.rings_per_vf); - - /* Rawdev queues setup for enqueue/dequeue */ - for (q = 0; q < rawdev_queues; q++) { - if (sdp_setup_iqs(sdpvf, q)) { - otx2_err("Failed to setup IQs"); - goto iq_fail; - } - } - otx2_info("Total[%d] IQs setup", sdpvf->num_iqs); - - for (q = 0; q < rawdev_queues; q++) { - if (sdp_setup_oqs(sdpvf, q)) { - otx2_err("Failed to setup OQs"); - goto oq_fail; - } - } - otx2_info("Total [%d] OQs setup", sdpvf->num_oqs); - - /* Enable IQ/OQ for this device */ - sdpvf->fn_list.enable_io_queues(sdpvf); - - /* Send OQ desc credits for OQs, credits are always - * sent after the OQs are enabled. - */ - for (q = 0; q < rawdev_queues; q++) { - rte_write32(sdpvf->droq[q]->nb_desc, - sdpvf->droq[q]->pkts_credit_reg); - - rte_io_mb(); - otx2_info("OQ[%d] dbells [%d]", q, - rte_read32(sdpvf->droq[q]->pkts_credit_reg)); - } - - rte_wmb(); - - otx2_info("SDP Device is Ready"); - - return 0; - -/* Error handling */ -oq_fail: - /* Free the allocated OQs */ - for (q = 0; q < sdpvf->num_oqs; q++) - sdp_delete_oqs(sdpvf, q); - -iq_fail: - /* Free the allocated IQs */ - for (q = 0; q < sdpvf->num_iqs; q++) - sdp_delete_iqs(sdpvf, q); - -setup_fail: - return -ENOMEM; -} - -static int -sdp_rawdev_start(struct rte_rawdev *dev) -{ - dev->started = 1; - - return 0; -} - -static void -sdp_rawdev_stop(struct rte_rawdev *dev) -{ - dev->started = 0; -} - -static int -sdp_rawdev_close(struct rte_rawdev *dev) -{ - int ret; - ret = sdp_vfdev_exit(dev); - if (ret) { - otx2_err(" SDP_EP rawdev exit error"); - return ret; - } - - return 0; -} - -static int -sdp_rawdev_configure(const struct rte_rawdev *dev, rte_rawdev_obj_t config, - size_t config_size) -{ - struct sdp_rawdev_info *app_info = (struct sdp_rawdev_info *)config; - struct sdp_device *sdpvf; - - if (app_info == NULL || config_size != sizeof(*app_info)) { - otx2_err("Application config info [NULL] or incorrect size"); - return -EINVAL; - } - - sdpvf = (struct sdp_device *)dev->dev_private; - - sdpvf->conf = app_info->app_conf; - sdpvf->enqdeq_mpool = app_info->enqdeq_mpool; - - sdp_vfdev_init(sdpvf); - - return 0; - -} - -/* SDP VF endpoint rawdev ops */ -static const struct rte_rawdev_ops sdp_rawdev_ops = { - .dev_configure = sdp_rawdev_configure, - .dev_start = sdp_rawdev_start, - .dev_stop = sdp_rawdev_stop, - .dev_close = sdp_rawdev_close, - .enqueue_bufs = sdp_rawdev_enqueue, - .dequeue_bufs = sdp_rawdev_dequeue, - .dev_selftest = sdp_rawdev_selftest, -}; - -static int -otx2_sdp_rawdev_probe(struct rte_pci_driver *pci_drv __rte_unused, - struct rte_pci_device *pci_dev) -{ - char name[RTE_RAWDEV_NAME_MAX_LEN]; - struct sdp_device *sdpvf = NULL; - struct rte_rawdev *sdp_rawdev; - uint16_t vf_id; - - /* Single process support */ - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return 0; - - if (pci_dev->mem_resource[0].addr) - otx2_info("SDP_EP BAR0 is mapped:"); - else { - otx2_err("SDP_EP: Failed to map device BARs"); - otx2_err("BAR0 %p\n BAR2 %p", - pci_dev->mem_resource[0].addr, - pci_dev->mem_resource[2].addr); - return -ENODEV; - } - - memset(name, 0, sizeof(name)); - snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "SDPEP:%x:%02x.%x", - pci_dev->addr.bus, pci_dev->addr.devid, - pci_dev->addr.function); - - /* Allocate rawdev pmd */ - sdp_rawdev = rte_rawdev_pmd_allocate(name, - sizeof(struct sdp_device), - rte_socket_id()); - - if (sdp_rawdev == NULL) { - otx2_err("SDP_EP VF rawdev allocation failed"); - return -ENOMEM; - } - - sdp_rawdev->dev_ops = &sdp_rawdev_ops; - sdp_rawdev->device = &pci_dev->device; - sdp_rawdev->driver_name = pci_dev->driver->driver.name; - - sdpvf = (struct sdp_device *)sdp_rawdev->dev_private; - sdpvf->hw_addr = pci_dev->mem_resource[0].addr; - sdpvf->pci_dev = pci_dev; - - /* Discover the VF number being probed */ - vf_id = ((pci_dev->addr.devid & 0x1F) << 3) | - (pci_dev->addr.function & 0x7); - - vf_id -= 1; - sdpvf->vf_num = vf_id; - - otx2_info("SDP_EP VF[%d] probe done", vf_id); - - return 0; -} - -static int -otx2_sdp_rawdev_remove(struct rte_pci_device *pci_dev) -{ - char name[RTE_RAWDEV_NAME_MAX_LEN]; - struct rte_rawdev *rawdev; - struct sdp_device *sdpvf; - - /* Single process support */ - if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return 0; - - if (pci_dev == NULL) { - otx2_err("SDP_EP:invalid pci_dev!"); - return -EINVAL; - } - - - memset(name, 0, sizeof(name)); - snprintf(name, RTE_RAWDEV_NAME_MAX_LEN, "SDPEP:%x:%02x.%x", - pci_dev->addr.bus, pci_dev->addr.devid, - pci_dev->addr.function); - - rawdev = rte_rawdev_pmd_get_named_dev(name); - if (rawdev == NULL) { - otx2_err("SDP_EP: invalid device name (%s)", name); - return -EINVAL; - } - - sdpvf = (struct sdp_device *)rawdev->dev_private; - otx2_info("Removing SDP_EP VF[%d] ", sdpvf->vf_num); - - /* rte_rawdev_close is called by pmd_release */ - return rte_rawdev_pmd_release(rawdev); -} - -static struct rte_pci_driver rte_sdp_rawdev_pmd = { - .id_table = pci_sdp_vf_map, - .drv_flags = (RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA), - .probe = otx2_sdp_rawdev_probe, - .remove = otx2_sdp_rawdev_remove, -}; - -RTE_PMD_REGISTER_PCI(sdp_rawdev_pci_driver, rte_sdp_rawdev_pmd); -RTE_PMD_REGISTER_PCI_TABLE(sdp_rawdev_pci_driver, pci_sdp_vf_map); -RTE_PMD_REGISTER_KMOD_DEP(sdp_rawdev_pci_driver, "vfio-pci"); diff --git a/drivers/raw/octeontx2_ep/otx2_ep_rawdev.h b/drivers/raw/octeontx2_ep/otx2_ep_rawdev.h deleted file mode 100644 index dab2fb7541..0000000000 --- a/drivers/raw/octeontx2_ep/otx2_ep_rawdev.h +++ /dev/null @@ -1,499 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2019 Marvell International Ltd. - */ - -#ifndef _OTX2_EP_RAWDEV_H_ -#define _OTX2_EP_RAWDEV_H_ - -#include -#include - -/* IQ instruction req types */ -#define SDP_REQTYPE_NONE (0) -#define SDP_REQTYPE_NORESP (1) -#define SDP_REQTYPE_NORESP_GATHER (2) - -/* Input Request Header format */ -struct sdp_instr_irh { - /* Request ID */ - uint64_t rid:16; - - /* PCIe port to use for response */ - uint64_t pcie_port:3; - - /* Scatter indicator 1=scatter */ - uint64_t scatter:1; - - /* Size of Expected result OR no. of entries in scatter list */ - uint64_t rlenssz:14; - - /* Desired destination port for result */ - uint64_t dport:6; - - /* Opcode Specific parameters */ - uint64_t param:8; - - /* Opcode for the return packet */ - uint64_t opcode:16; -}; - -/* SDP 32B instruction format */ -struct sdp_instr_32B { - /* Pointer where the input data is available. */ - uint64_t dptr; - - /* SDP Instruction Header. */ - uint64_t ih; - - /** Pointer where the response for a RAW mode packet - * will be written by OCTEON TX2. - */ - uint64_t rptr; - - /* Input Request Header. Additional info about the input. */ - uint64_t irh; -}; -#define SDP_32B_INSTR_SIZE (sizeof(sdp_instr_32B)) - -/* SDP 64B instruction format */ -struct sdp_instr_64B { - /* Pointer where the input data is available. */ - uint64_t dptr; - - /* SDP Instruction Header. */ - uint64_t ih; - - /** Pointer where the response for a RAW mode packet - * will be written by OCTEON TX2. - */ - uint64_t rptr; - - /* Input Request Header. */ - uint64_t irh; - - /* Additional headers available in a 64-byte instruction. */ - uint64_t exhdr[4]; -}; -#define SDP_64B_INSTR_SIZE (sizeof(sdp_instr_64B)) - -struct sdp_soft_instr { - /** Input data pointer. It is either pointing directly to input data - * or to a gather list. - */ - void *dptr; - - /** Response from OCTEON TX2 comes at this address. It is either - * directlty pointing to output data buffer or to a scatter list. - */ - void *rptr; - - /* The instruction header. All input commands have this field. */ - struct sdp_instr_ih ih; - - /* Input request header. */ - struct sdp_instr_irh irh; - - /** The PCI instruction to be sent to OCTEON TX2. This is stored in the - * instr to retrieve the physical address of buffers when instr is - * freed. - */ - struct sdp_instr_64B command; - - /** If a gather list was allocated, this ptr points to the buffer used - * for the gather list. The gather list has to be 8B aligned, so this - * value may be different from dptr. - */ - void *gather_ptr; - - /* Total data bytes transferred in the gather mode request. */ - uint64_t gather_bytes; - - /** If a scatter list was allocated, this ptr points to the buffer used - * for the scatter list. The scatter list has to be 8B aligned, so - * this value may be different from rptr. - */ - void *scatter_ptr; - - /* Total data bytes to be received in the scatter mode request. */ - uint64_t scatter_bytes; - - /* IQ number to which this instruction has to be submitted. */ - uint32_t q_no; - - /* IQ instruction request type. */ - uint32_t reqtype; -}; -#define SDP_SOFT_INSTR_SIZE (sizeof(sdp_soft_instr)) - -/* SDP IQ request list */ -struct sdp_instr_list { - void *buf; - uint32_t reqtype; -}; -#define SDP_IQREQ_LIST_SIZE (sizeof(struct sdp_instr_list)) - -/* Input Queue statistics. Each input queue has four stats fields. */ -struct sdp_iq_stats { - uint64_t instr_posted; /* Instructions posted to this queue. */ - uint64_t instr_processed; /* Instructions processed in this queue. */ - uint64_t instr_dropped; /* Instructions that could not be processed */ -}; - -/* Structure to define the configuration attributes for each Input queue. */ -struct sdp_iq_config { - /* Max number of IQs available */ - uint16_t max_iqs; - - /* Command size - 32 or 64 bytes */ - uint16_t instr_type; - - /* Pending list size, usually set to the sum of the size of all IQs */ - uint32_t pending_list_size; -}; - -/** The instruction (input) queue. - * The input queue is used to post raw (instruction) mode data or packet data - * to OCTEON TX2 device from the host. Each IQ of a SDP EP VF device has one - * such structure to represent it. - */ -struct sdp_instr_queue { - /* A spinlock to protect access to the input ring. */ - rte_spinlock_t lock; - rte_spinlock_t post_lock; - - struct sdp_device *sdp_dev; - rte_atomic64_t iq_flush_running; - - uint32_t q_no; - uint32_t pkt_in_done; - - /* Flag for 64 byte commands. */ - uint32_t iqcmd_64B:1; - uint32_t rsvd:17; - uint32_t status:8; - - /* Number of descriptors in this ring. */ - uint32_t nb_desc; - - /* Input ring index, where the driver should write the next packet */ - uint32_t host_write_index; - - /* Input ring index, where the OCTEON TX2 should read the next packet */ - uint32_t otx_read_index; - - /** This index aids in finding the window in the queue where OCTEON TX2 - * has read the commands. - */ - uint32_t flush_index; - - /* This keeps track of the instructions pending in this queue. */ - rte_atomic64_t instr_pending; - - uint32_t reset_instr_cnt; - - /* Pointer to the Virtual Base addr of the input ring. */ - uint8_t *base_addr; - - /* This IQ request list */ - struct sdp_instr_list *req_list; - - /* SDP doorbell register for the ring. */ - void *doorbell_reg; - - /* SDP instruction count register for this ring. */ - void *inst_cnt_reg; - - /* Number of instructions pending to be posted to OCTEON TX2. */ - uint32_t fill_cnt; - - /* Statistics for this input queue. */ - struct sdp_iq_stats stats; - - /* DMA mapped base address of the input descriptor ring. */ - uint64_t base_addr_dma; - - /* Memory zone */ - const struct rte_memzone *iq_mz; -}; - -/* DROQ packet format for application i/f. */ -struct sdp_droq_pkt { - /* DROQ packet data buffer pointer. */ - uint8_t *data; - - /* DROQ packet data length */ - uint32_t len; - - uint32_t misc; -}; - -/** Descriptor format. - * The descriptor ring is made of descriptors which have 2 64-bit values: - * -# Physical (bus) address of the data buffer. - * -# Physical (bus) address of a sdp_droq_info structure. - * The device DMA's incoming packets and its information at the address - * given by these descriptor fields. - */ -struct sdp_droq_desc { - /* The buffer pointer */ - uint64_t buffer_ptr; - - /* The Info pointer */ - uint64_t info_ptr; -}; -#define SDP_DROQ_DESC_SIZE (sizeof(struct sdp_droq_desc)) - -/* Receive Header */ -union sdp_rh { - uint64_t rh64; -}; -#define SDP_RH_SIZE (sizeof(union sdp_rh)) - -/** Information about packet DMA'ed by OCTEON TX2. - * The format of the information available at Info Pointer after OCTEON TX2 - * has posted a packet. Not all descriptors have valid information. Only - * the Info field of the first descriptor for a packet has information - * about the packet. - */ -struct sdp_droq_info { - /* The Output Receive Header. */ - union sdp_rh rh; - - /* The Length of the packet. */ - uint64_t length; -}; -#define SDP_DROQ_INFO_SIZE (sizeof(struct sdp_droq_info)) - -/** Pointer to data buffer. - * Driver keeps a pointer to the data buffer that it made available to - * the OCTEON TX2 device. Since the descriptor ring keeps physical (bus) - * addresses, this field is required for the driver to keep track of - * the virtual address pointers. - */ -struct sdp_recv_buffer { - /* Packet buffer, including meta data. */ - void *buffer; - - /* Data in the packet buffer. */ - /* uint8_t *data; */ -}; -#define SDP_DROQ_RECVBUF_SIZE (sizeof(struct sdp_recv_buffer)) - -/* DROQ statistics. Each output queue has four stats fields. */ -struct sdp_droq_stats { - /* Number of packets received in this queue. */ - uint64_t pkts_received; - - /* Bytes received by this queue. */ - uint64_t bytes_received; - - /* Num of failures of rte_pktmbuf_alloc() */ - uint64_t rx_alloc_failure; -}; - -/* Structure to define the configuration attributes for each Output queue. */ -struct sdp_oq_config { - /* Max number of OQs available */ - uint16_t max_oqs; - - /* If set, the Output queue uses info-pointer mode. (Default: 1 ) */ - uint16_t info_ptr; - - /** The number of buffers that were consumed during packet processing by - * the driver on this Output queue before the driver attempts to - * replenish the descriptor ring with new buffers. - */ - uint32_t refill_threshold; -}; - -/* The Descriptor Ring Output Queue(DROQ) structure. */ -struct sdp_droq { - /* A spinlock to protect access to this ring. */ - rte_spinlock_t lock; - - struct sdp_device *sdp_dev; - /* The 8B aligned descriptor ring starts at this address. */ - struct sdp_droq_desc *desc_ring; - - uint32_t q_no; - uint32_t last_pkt_count; - - /* Driver should read the next packet at this index */ - uint32_t read_idx; - - /* OCTEON TX2 will write the next packet at this index */ - uint32_t write_idx; - - /* At this index, the driver will refill the descriptor's buffer */ - uint32_t refill_idx; - - /* Packets pending to be processed */ - rte_atomic64_t pkts_pending; - - /* Number of descriptors in this ring. */ - uint32_t nb_desc; - - /* The number of descriptors pending to refill. */ - uint32_t refill_count; - - uint32_t refill_threshold; - - /* The 8B aligned info ptrs begin from this address. */ - struct sdp_droq_info *info_list; - - /* receive buffer list contains virtual addresses of the buffers. */ - struct sdp_recv_buffer *recv_buf_list; - - /* The size of each buffer pointed by the buffer pointer. */ - uint32_t buffer_size; - - /** Pointer to the mapped packet credit register. - * Host writes number of info/buffer ptrs available to this register - */ - void *pkts_credit_reg; - - /** Pointer to the mapped packet sent register. OCTEON TX2 writes the - * number of packets DMA'ed to host memory in this register. - */ - void *pkts_sent_reg; - - /* Statistics for this DROQ. */ - struct sdp_droq_stats stats; - - /* DMA mapped address of the DROQ descriptor ring. */ - size_t desc_ring_dma; - - /* Info_ptr list is allocated at this virtual address. */ - size_t info_base_addr; - - /* DMA mapped address of the info list */ - size_t info_list_dma; - - /* Allocated size of info list. */ - uint32_t info_alloc_size; - - /* Memory zone **/ - const struct rte_memzone *desc_ring_mz; - const struct rte_memzone *info_mz; -}; -#define SDP_DROQ_SIZE (sizeof(struct sdp_droq)) - -/* IQ/OQ mask */ -struct sdp_io_enable { - uint64_t iq; - uint64_t oq; - uint64_t iq64B; -}; - -/* Structure to define the configuration. */ -struct sdp_config { - /* Input Queue attributes. */ - struct sdp_iq_config iq; - - /* Output Queue attributes. */ - struct sdp_oq_config oq; - - /* Num of desc for IQ rings */ - uint32_t num_iqdef_descs; - - /* Num of desc for OQ rings */ - uint32_t num_oqdef_descs; - - /* OQ buffer size */ - uint32_t oqdef_buf_size; -}; - -/* Required functions for each VF device */ -struct sdp_fn_list { - void (*setup_iq_regs)(struct sdp_device *sdpvf, uint32_t q_no); - void (*setup_oq_regs)(struct sdp_device *sdpvf, uint32_t q_no); - - int (*setup_device_regs)(struct sdp_device *sdpvf); - uint32_t (*update_iq_read_idx)(struct sdp_instr_queue *iq); - - void (*enable_io_queues)(struct sdp_device *sdpvf); - void (*disable_io_queues)(struct sdp_device *sdpvf); - - void (*enable_iq)(struct sdp_device *sdpvf, uint32_t q_no); - void (*disable_iq)(struct sdp_device *sdpvf, uint32_t q_no); - - void (*enable_oq)(struct sdp_device *sdpvf, uint32_t q_no); - void (*disable_oq)(struct sdp_device *sdpvf, uint32_t q_no); -}; - -/* SRIOV information */ -struct sdp_sriov_info { - /* Number of rings assigned to VF */ - uint32_t rings_per_vf; - - /* Number of VF devices enabled */ - uint32_t num_vfs; -}; - - -/* Information to be passed from application */ -struct sdp_rawdev_info { - struct rte_mempool *enqdeq_mpool; - const struct sdp_config *app_conf; -}; - -/* SDP EP VF device */ -struct sdp_device { - /* PCI device pointer */ - struct rte_pci_device *pci_dev; - uint16_t chip_id; - uint16_t pf_num; - uint16_t vf_num; - - /* This device's PCIe port used for traffic. */ - uint16_t pcie_port; - uint32_t pkind; - - /* The state of this device */ - rte_atomic64_t status; - - /* Memory mapped h/w address */ - uint8_t *hw_addr; - - struct sdp_fn_list fn_list; - - /* Num IQs */ - uint32_t num_iqs; - - /* The input instruction queues */ - struct sdp_instr_queue *instr_queue[SDP_VF_MAX_IOQS_PER_RAWDEV]; - - /* Num OQs */ - uint32_t num_oqs; - - /* The DROQ output queues */ - struct sdp_droq *droq[SDP_VF_MAX_IOQS_PER_RAWDEV]; - - /* IOQ data buffer pool */ - struct rte_mempool *enqdeq_mpool; - - /* IOQ mask */ - struct sdp_io_enable io_qmask; - - /* SR-IOV info */ - struct sdp_sriov_info sriov_info; - - /* Device configuration */ - const struct sdp_config *conf; -}; - -const struct sdp_config *sdp_get_defconf(struct sdp_device *sdp_dev); -int sdp_setup_iqs(struct sdp_device *sdpvf, uint32_t iq_no); -int sdp_delete_iqs(struct sdp_device *sdpvf, uint32_t iq_no); - -int sdp_setup_oqs(struct sdp_device *sdpvf, uint32_t oq_no); -int sdp_delete_oqs(struct sdp_device *sdpvf, uint32_t oq_no); - -int sdp_rawdev_enqueue(struct rte_rawdev *dev, struct rte_rawdev_buf **buffers, - unsigned int count, rte_rawdev_obj_t context); -int sdp_rawdev_dequeue(struct rte_rawdev *dev, struct rte_rawdev_buf **buffers, - unsigned int count, rte_rawdev_obj_t context); - -int sdp_rawdev_selftest(uint16_t dev_id); - -#endif /* _OTX2_EP_RAWDEV_H_ */ diff --git a/drivers/raw/octeontx2_ep/otx2_ep_test.c b/drivers/raw/octeontx2_ep/otx2_ep_test.c deleted file mode 100644 index b876275f7a..0000000000 --- a/drivers/raw/octeontx2_ep/otx2_ep_test.c +++ /dev/null @@ -1,172 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2019 Marvell International Ltd. - */ - -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "otx2_common.h" -#include "otx2_ep_rawdev.h" - -#define SDP_IOQ_NUM_BUFS (4 * 1024) -#define SDP_IOQ_BUF_SIZE (2 * 1024) - -#define SDP_TEST_PKT_FSZ (0) -#define SDP_TEST_PKT_SIZE (1024) - -static int -sdp_validate_data(struct sdp_droq_pkt *oq_pkt, uint8_t *iq_pkt, - uint32_t pkt_len) -{ - if (!oq_pkt) - return -EINVAL; - - if (pkt_len != oq_pkt->len) { - otx2_err("Invalid packet length"); - return -EINVAL; - } - - if (memcmp(oq_pkt->data, iq_pkt, pkt_len) != 0) { - otx2_err("Data validation failed"); - return -EINVAL; - } - otx2_sdp_dbg("Data validation successful"); - - return 0; -} - -static void -sdp_ioq_buffer_fill(uint8_t *addr, uint32_t len) -{ - uint32_t idx; - - memset(addr, 0, len); - - for (idx = 0; idx < len; idx++) - addr[idx] = idx; -} - -static struct rte_mempool* -sdp_ioq_mempool_create(void) -{ - struct rte_mempool *mpool; - - mpool = rte_mempool_create("ioqbuf_pool", - SDP_IOQ_NUM_BUFS /*num elt*/, - SDP_IOQ_BUF_SIZE /*elt size*/, - 0 /*cache_size*/, - 0 /*private_data_size*/, - NULL /*mp_init*/, - NULL /*mp_init arg*/, - NULL /*obj_init*/, - NULL /*obj_init arg*/, - rte_socket_id() /*socket id*/, - (MEMPOOL_F_SP_PUT | MEMPOOL_F_SC_GET)); - - return mpool; -} - - -int -sdp_rawdev_selftest(uint16_t dev_id) -{ - struct sdp_rawdev_info app_info = {0}; - struct rte_rawdev_info dev_info = {0}; - - struct rte_rawdev_buf *d_buf[1]; - struct sdp_droq_pkt oq_pkt; - struct sdp_soft_instr si; - struct sdp_device sdpvf; - - uint32_t buf_size; - int ret = 0; - void *buf; - - otx2_info("SDP RAWDEV Self Test: Started"); - - memset(&oq_pkt, 0x00, sizeof(oq_pkt)); - d_buf[0] = (struct rte_rawdev_buf *)&oq_pkt; - - struct rte_mempool *ioq_mpool = sdp_ioq_mempool_create(); - if (!ioq_mpool) { - otx2_err("IOQ mpool creation failed"); - return -ENOMEM; - } - - app_info.enqdeq_mpool = ioq_mpool; - app_info.app_conf = NULL; /* Use default conf */ - - dev_info.dev_private = &app_info; - - ret = rte_rawdev_configure(dev_id, &dev_info, sizeof(app_info)); - if (ret) { - otx2_err("Unable to configure SDP_VF %d", dev_id); - rte_mempool_free(ioq_mpool); - return -ENOMEM; - } - otx2_info("SDP VF rawdev[%d] configured successfully", dev_id); - - memset(&si, 0x00, sizeof(si)); - memset(&sdpvf, 0x00, sizeof(sdpvf)); - - buf_size = SDP_TEST_PKT_SIZE; - - si.q_no = 0; - si.reqtype = SDP_REQTYPE_NORESP; - si.rptr = NULL; - - si.ih.fsz = SDP_TEST_PKT_FSZ; - si.ih.tlen = buf_size; - si.ih.gather = 0; - - /* Enqueue raw pkt data */ - rte_mempool_get(ioq_mpool, &buf); - if (!buf) { - otx2_err("Buffer allocation failed"); - rte_mempool_free(ioq_mpool); - rte_rawdev_close(dev_id); - return -ENOMEM; - } - - sdp_ioq_buffer_fill(buf, buf_size); - si.dptr = (uint8_t *)buf; - - rte_rawdev_enqueue_buffers(dev_id, NULL, 1, &si); - usleep(10000); - - /* Dequeue raw pkt data */ - ret = 0; - while (ret < 1) { - ret = rte_rawdev_dequeue_buffers(dev_id, &d_buf[0], 1, &si); - rte_pause(); - } - - /* Validate the dequeued raw pkt data */ - if (sdp_validate_data((struct sdp_droq_pkt *)d_buf[0], - buf, buf_size) != 0) { - otx2_err("Data invalid"); - rte_mempool_put(ioq_mpool, - ((struct sdp_droq_pkt *)d_buf[0])->data); - rte_mempool_free(ioq_mpool); - rte_rawdev_close(dev_id); - return -EINVAL; - } - - rte_mempool_put(ioq_mpool, ((struct sdp_droq_pkt *)d_buf[0])->data); - rte_mempool_free(ioq_mpool); - rte_rawdev_close(dev_id); - - otx2_info("SDP RAWDEV Self Test: Successful"); - - return 0; -} diff --git a/drivers/raw/octeontx2_ep/otx2_ep_vf.c b/drivers/raw/octeontx2_ep/otx2_ep_vf.c deleted file mode 100644 index bf2a19e369..0000000000 --- a/drivers/raw/octeontx2_ep/otx2_ep_vf.c +++ /dev/null @@ -1,475 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2019 Marvell International Ltd. - */ - -#include -#include -#include - -#include "otx2_common.h" -#include "otx2_ep_rawdev.h" -#include "otx2_ep_vf.h" - -static int -sdp_vf_reset_iq(struct sdp_device *sdpvf, int q_no) -{ - uint64_t loop = SDP_VF_BUSY_LOOP_COUNT; - volatile uint64_t d64 = 0ull; - - /* There is no RST for a ring. - * Clear all registers one by one after disabling the ring - */ - - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_IN_ENABLE(q_no)); - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_IN_INSTR_BADDR(q_no)); - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_IN_INSTR_RSIZE(q_no)); - - d64 = 0xFFFFFFFF; /* ~0ull */ - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_IN_INSTR_DBELL(q_no)); - d64 = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_INSTR_DBELL(q_no)); - - while ((d64 != 0) && loop--) { - otx2_write64(d64, sdpvf->hw_addr + - SDP_VF_R_IN_INSTR_DBELL(q_no)); - - rte_delay_ms(1); - - d64 = otx2_read64(sdpvf->hw_addr + - SDP_VF_R_IN_INSTR_DBELL(q_no)); - } - - loop = SDP_VF_BUSY_LOOP_COUNT; - d64 = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_CNTS(q_no)); - while ((d64 != 0) && loop--) { - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_IN_CNTS(q_no)); - - rte_delay_ms(1); - - d64 = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_CNTS(q_no)); - } - - d64 = 0ull; - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_IN_INT_LEVELS(q_no)); - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_IN_PKT_CNT(q_no)); - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_IN_BYTE_CNT(q_no)); - - return 0; -} - -static int -sdp_vf_reset_oq(struct sdp_device *sdpvf, int q_no) -{ - uint64_t loop = SDP_VF_BUSY_LOOP_COUNT; - volatile uint64_t d64 = 0ull; - - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_OUT_ENABLE(q_no)); - - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_OUT_SLIST_BADDR(q_no)); - - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_OUT_SLIST_RSIZE(q_no)); - - d64 = 0xFFFFFFFF; - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_OUT_SLIST_DBELL(q_no)); - d64 = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_SLIST_DBELL(q_no)); - - while ((d64 != 0) && loop--) { - otx2_write64(d64, sdpvf->hw_addr + - SDP_VF_R_OUT_SLIST_DBELL(q_no)); - - rte_delay_ms(1); - - d64 = otx2_read64(sdpvf->hw_addr + - SDP_VF_R_OUT_SLIST_DBELL(q_no)); - } - - loop = SDP_VF_BUSY_LOOP_COUNT; - d64 = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_CNTS(q_no)); - while ((d64 != 0) && (loop--)) { - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_OUT_CNTS(q_no)); - - rte_delay_ms(1); - - d64 = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_CNTS(q_no)); - } - - d64 = 0ull; - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_OUT_INT_LEVELS(q_no)); - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_OUT_PKT_CNT(q_no)); - otx2_write64(d64, sdpvf->hw_addr + SDP_VF_R_OUT_BYTE_CNT(q_no)); - - return 0; -} - -static void -sdp_vf_setup_global_iq_reg(struct sdp_device *sdpvf, int q_no) -{ - volatile uint64_t reg_val = 0ull; - - /* Select ES, RO, NS, RDSIZE,DPTR Fomat#0 for IQs - * IS_64B is by default enabled. - */ - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_CONTROL(q_no)); - - reg_val |= SDP_VF_R_IN_CTL_RDSIZE; - reg_val |= SDP_VF_R_IN_CTL_IS_64B; - reg_val |= SDP_VF_R_IN_CTL_ESR; - - otx2_write64(reg_val, sdpvf->hw_addr + SDP_VF_R_IN_CONTROL(q_no)); - -} - -static void -sdp_vf_setup_global_oq_reg(struct sdp_device *sdpvf, int q_no) -{ - volatile uint64_t reg_val = 0ull; - - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_CONTROL(q_no)); - - reg_val |= (SDP_VF_R_OUT_CTL_IMODE); - - reg_val &= ~(SDP_VF_R_OUT_CTL_ROR_P); - reg_val &= ~(SDP_VF_R_OUT_CTL_NSR_P); - reg_val &= ~(SDP_VF_R_OUT_CTL_ROR_I); - reg_val &= ~(SDP_VF_R_OUT_CTL_NSR_I); - reg_val &= ~(SDP_VF_R_OUT_CTL_ES_I); - reg_val &= ~(SDP_VF_R_OUT_CTL_ROR_D); - reg_val &= ~(SDP_VF_R_OUT_CTL_NSR_D); - reg_val &= ~(SDP_VF_R_OUT_CTL_ES_D); - - /* INFO/DATA ptr swap is required */ - reg_val |= (SDP_VF_R_OUT_CTL_ES_P); - - otx2_write64(reg_val, sdpvf->hw_addr + SDP_VF_R_OUT_CONTROL(q_no)); - -} - -static int -sdp_vf_reset_input_queues(struct sdp_device *sdpvf) -{ - uint32_t q_no = 0; - - otx2_sdp_dbg("%s :", __func__); - - for (q_no = 0; q_no < sdpvf->sriov_info.rings_per_vf; q_no++) - sdp_vf_reset_iq(sdpvf, q_no); - - return 0; -} - -static int -sdp_vf_reset_output_queues(struct sdp_device *sdpvf) -{ - uint64_t q_no = 0ull; - - otx2_sdp_dbg(" %s :", __func__); - - for (q_no = 0; q_no < sdpvf->sriov_info.rings_per_vf; q_no++) - sdp_vf_reset_oq(sdpvf, q_no); - - return 0; -} - -static void -sdp_vf_setup_global_input_regs(struct sdp_device *sdpvf) -{ - uint64_t q_no = 0ull; - - sdp_vf_reset_input_queues(sdpvf); - - for (q_no = 0; q_no < (sdpvf->sriov_info.rings_per_vf); q_no++) - sdp_vf_setup_global_iq_reg(sdpvf, q_no); -} - -static void -sdp_vf_setup_global_output_regs(struct sdp_device *sdpvf) -{ - uint32_t q_no; - - sdp_vf_reset_output_queues(sdpvf); - - for (q_no = 0; q_no < (sdpvf->sriov_info.rings_per_vf); q_no++) - sdp_vf_setup_global_oq_reg(sdpvf, q_no); - -} - -static int -sdp_vf_setup_device_regs(struct sdp_device *sdpvf) -{ - sdp_vf_setup_global_input_regs(sdpvf); - sdp_vf_setup_global_output_regs(sdpvf); - - return 0; -} - -static void -sdp_vf_setup_iq_regs(struct sdp_device *sdpvf, uint32_t iq_no) -{ - struct sdp_instr_queue *iq = sdpvf->instr_queue[iq_no]; - volatile uint64_t reg_val = 0ull; - - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_CONTROL(iq_no)); - - /* Wait till IDLE to set to 1, not supposed to configure BADDR - * as long as IDLE is 0 - */ - if (!(reg_val & SDP_VF_R_IN_CTL_IDLE)) { - do { - reg_val = otx2_read64(sdpvf->hw_addr + - SDP_VF_R_IN_CONTROL(iq_no)); - } while (!(reg_val & SDP_VF_R_IN_CTL_IDLE)); - } - - /* Write the start of the input queue's ring and its size */ - otx2_write64(iq->base_addr_dma, sdpvf->hw_addr + - SDP_VF_R_IN_INSTR_BADDR(iq_no)); - otx2_write64(iq->nb_desc, sdpvf->hw_addr + - SDP_VF_R_IN_INSTR_RSIZE(iq_no)); - - /* Remember the doorbell & instruction count register addr - * for this queue - */ - iq->doorbell_reg = (uint8_t *) sdpvf->hw_addr + - SDP_VF_R_IN_INSTR_DBELL(iq_no); - iq->inst_cnt_reg = (uint8_t *) sdpvf->hw_addr + - SDP_VF_R_IN_CNTS(iq_no); - - otx2_sdp_dbg("InstQ[%d]:dbell reg @ 0x%p instcnt_reg @ 0x%p", - iq_no, iq->doorbell_reg, iq->inst_cnt_reg); - - /* Store the current instrn counter(used in flush_iq calculation) */ - iq->reset_instr_cnt = rte_read32(iq->inst_cnt_reg); - - /* IN INTR_THRESHOLD is set to max(FFFFFFFF) which disable the IN INTR - * to raise - */ - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_INT_LEVELS(iq_no)); - reg_val = 0xffffffff; - - otx2_write64(reg_val, sdpvf->hw_addr + SDP_VF_R_IN_INT_LEVELS(iq_no)); - -} - -static void -sdp_vf_setup_oq_regs(struct sdp_device *sdpvf, uint32_t oq_no) -{ - volatile uint64_t reg_val = 0ull; - uint64_t oq_ctl = 0ull; - - struct sdp_droq *droq = sdpvf->droq[oq_no]; - - /* Wait on IDLE to set to 1, supposed to configure BADDR - * as log as IDLE is 0 - */ - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_CONTROL(oq_no)); - - while (!(reg_val & SDP_VF_R_OUT_CTL_IDLE)) { - reg_val = otx2_read64(sdpvf->hw_addr + - SDP_VF_R_OUT_CONTROL(oq_no)); - } - - otx2_write64(droq->desc_ring_dma, sdpvf->hw_addr + - SDP_VF_R_OUT_SLIST_BADDR(oq_no)); - otx2_write64(droq->nb_desc, sdpvf->hw_addr + - SDP_VF_R_OUT_SLIST_RSIZE(oq_no)); - - oq_ctl = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_CONTROL(oq_no)); - - /* Clear the ISIZE and BSIZE (22-0) */ - oq_ctl &= ~(0x7fffffull); - - /* Populate the BSIZE (15-0) */ - oq_ctl |= (droq->buffer_size & 0xffff); - - /* Populate ISIZE(22-16) */ - oq_ctl |= ((SDP_RH_SIZE << 16) & 0x7fffff); - otx2_write64(oq_ctl, sdpvf->hw_addr + SDP_VF_R_OUT_CONTROL(oq_no)); - - /* Mapped address of the pkt_sent and pkts_credit regs */ - droq->pkts_sent_reg = (uint8_t *) sdpvf->hw_addr + - SDP_VF_R_OUT_CNTS(oq_no); - droq->pkts_credit_reg = (uint8_t *) sdpvf->hw_addr + - SDP_VF_R_OUT_SLIST_DBELL(oq_no); - - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_INT_LEVELS(oq_no)); - - /* Clear PKT_CNT register */ - rte_write64(0xFFFFFFFFF, (uint8_t *)sdpvf->hw_addr + - SDP_VF_R_OUT_PKT_CNT(oq_no)); - - /* Clear the OQ doorbell */ - rte_write32(0xFFFFFFFF, droq->pkts_credit_reg); - while ((rte_read32(droq->pkts_credit_reg) != 0ull)) { - rte_write32(0xFFFFFFFF, droq->pkts_credit_reg); - rte_delay_ms(1); - } - otx2_sdp_dbg("SDP_R[%d]_credit:%x", oq_no, - rte_read32(droq->pkts_credit_reg)); - - /* Clear the OQ_OUT_CNTS doorbell */ - reg_val = rte_read32(droq->pkts_sent_reg); - rte_write32((uint32_t)reg_val, droq->pkts_sent_reg); - - otx2_sdp_dbg("SDP_R[%d]_sent: %x", oq_no, - rte_read32(droq->pkts_sent_reg)); - - while (((rte_read32(droq->pkts_sent_reg)) != 0ull)) { - reg_val = rte_read32(droq->pkts_sent_reg); - rte_write32((uint32_t)reg_val, droq->pkts_sent_reg); - rte_delay_ms(1); - } - -} - -static void -sdp_vf_enable_iq(struct sdp_device *sdpvf, uint32_t q_no) -{ - volatile uint64_t reg_val = 0ull; - uint64_t loop = SDP_VF_BUSY_LOOP_COUNT; - - /* Resetting doorbells during IQ enabling also to handle abrupt - * guest reboot. IQ reset does not clear the doorbells. - */ - otx2_write64(0xFFFFFFFF, sdpvf->hw_addr + - SDP_VF_R_IN_INSTR_DBELL(q_no)); - - while (((otx2_read64(sdpvf->hw_addr + - SDP_VF_R_IN_INSTR_DBELL(q_no))) != 0ull) && loop--) { - - rte_delay_ms(1); - } - - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_ENABLE(q_no)); - reg_val |= 0x1ull; - - otx2_write64(reg_val, sdpvf->hw_addr + SDP_VF_R_IN_ENABLE(q_no)); - - otx2_info("IQ[%d] enable done", q_no); - -} - -static void -sdp_vf_enable_oq(struct sdp_device *sdpvf, uint32_t q_no) -{ - volatile uint64_t reg_val = 0ull; - - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_ENABLE(q_no)); - reg_val |= 0x1ull; - otx2_write64(reg_val, sdpvf->hw_addr + SDP_VF_R_OUT_ENABLE(q_no)); - - otx2_info("OQ[%d] enable done", q_no); -} - -static void -sdp_vf_enable_io_queues(struct sdp_device *sdpvf) -{ - uint32_t q_no = 0; - - for (q_no = 0; q_no < sdpvf->num_iqs; q_no++) - sdp_vf_enable_iq(sdpvf, q_no); - - for (q_no = 0; q_no < sdpvf->num_oqs; q_no++) - sdp_vf_enable_oq(sdpvf, q_no); -} - -static void -sdp_vf_disable_iq(struct sdp_device *sdpvf, uint32_t q_no) -{ - volatile uint64_t reg_val = 0ull; - - /* Reset the doorbell register for this Input Queue. */ - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_ENABLE(q_no)); - reg_val &= ~0x1ull; - - otx2_write64(reg_val, sdpvf->hw_addr + SDP_VF_R_IN_ENABLE(q_no)); -} - -static void -sdp_vf_disable_oq(struct sdp_device *sdpvf, uint32_t q_no) -{ - volatile uint64_t reg_val = 0ull; - - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_OUT_ENABLE(q_no)); - reg_val &= ~0x1ull; - - otx2_write64(reg_val, sdpvf->hw_addr + SDP_VF_R_OUT_ENABLE(q_no)); - -} - -static void -sdp_vf_disable_io_queues(struct sdp_device *sdpvf) -{ - uint32_t q_no = 0; - - /* Disable Input Queues. */ - for (q_no = 0; q_no < sdpvf->num_iqs; q_no++) - sdp_vf_disable_iq(sdpvf, q_no); - - /* Disable Output Queues. */ - for (q_no = 0; q_no < sdpvf->num_oqs; q_no++) - sdp_vf_disable_oq(sdpvf, q_no); -} - -static uint32_t -sdp_vf_update_read_index(struct sdp_instr_queue *iq) -{ - uint32_t new_idx = rte_read32(iq->inst_cnt_reg); - - /* The new instr cnt reg is a 32-bit counter that can roll over. - * We have noted the counter's initial value at init time into - * reset_instr_cnt - */ - if (iq->reset_instr_cnt < new_idx) - new_idx -= iq->reset_instr_cnt; - else - new_idx += (0xffffffff - iq->reset_instr_cnt) + 1; - - /* Modulo of the new index with the IQ size will give us - * the new index. - */ - new_idx %= iq->nb_desc; - - return new_idx; -} - -int -sdp_vf_setup_device(struct sdp_device *sdpvf) -{ - uint64_t reg_val = 0ull; - - /* If application doesn't provide its conf, use driver default conf */ - if (sdpvf->conf == NULL) { - sdpvf->conf = sdp_get_defconf(sdpvf); - if (sdpvf->conf == NULL) { - otx2_err("SDP VF default config not found"); - return -ENOMEM; - } - otx2_info("Default config is used"); - } - - /* Get IOQs (RPVF] count */ - reg_val = otx2_read64(sdpvf->hw_addr + SDP_VF_R_IN_CONTROL(0)); - - sdpvf->sriov_info.rings_per_vf = ((reg_val >> SDP_VF_R_IN_CTL_RPVF_POS) - & SDP_VF_R_IN_CTL_RPVF_MASK); - - otx2_info("SDP RPVF: %d", sdpvf->sriov_info.rings_per_vf); - - sdpvf->fn_list.setup_iq_regs = sdp_vf_setup_iq_regs; - sdpvf->fn_list.setup_oq_regs = sdp_vf_setup_oq_regs; - - sdpvf->fn_list.setup_device_regs = sdp_vf_setup_device_regs; - sdpvf->fn_list.update_iq_read_idx = sdp_vf_update_read_index; - - sdpvf->fn_list.enable_io_queues = sdp_vf_enable_io_queues; - sdpvf->fn_list.disable_io_queues = sdp_vf_disable_io_queues; - - sdpvf->fn_list.enable_iq = sdp_vf_enable_iq; - sdpvf->fn_list.disable_iq = sdp_vf_disable_iq; - - sdpvf->fn_list.enable_oq = sdp_vf_enable_oq; - sdpvf->fn_list.disable_oq = sdp_vf_disable_oq; - - - return 0; - -} diff --git a/drivers/raw/octeontx2_ep/otx2_ep_vf.h b/drivers/raw/octeontx2_ep/otx2_ep_vf.h deleted file mode 100644 index 996f2e51eb..0000000000 --- a/drivers/raw/octeontx2_ep/otx2_ep_vf.h +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2019 Marvell International Ltd. - */ -#ifndef _OTX2_EP_VF_H_ -#define _OTX2_EP_VF_H_ - -int -sdp_vf_setup_device(struct sdp_device *sdpvf); - -#endif /*_OTX2_EP_VF_H_ */ diff --git a/drivers/raw/octeontx2_ep/version.map b/drivers/raw/octeontx2_ep/version.map deleted file mode 100644 index c2e0723b4c..0000000000 --- a/drivers/raw/octeontx2_ep/version.map +++ /dev/null @@ -1,3 +0,0 @@ -DPDK_22 { - local: *; -}; -- 2.24.1