From patchwork Fri Mar 17 13:08:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hemant Agrawal X-Patchwork-Id: 21865 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id D0D0FCF66; Fri, 17 Mar 2017 14:25:53 +0100 (CET) Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0046.outbound.protection.outlook.com [104.47.41.46]) by dpdk.org (Postfix) with ESMTP id DD1CECF80 for ; Fri, 17 Mar 2017 14:09:16 +0100 (CET) Received: from BLUPR0301CA0032.namprd03.prod.outlook.com (10.162.113.170) by BY2PR03MB190.namprd03.prod.outlook.com (10.242.36.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.977.11; Fri, 17 Mar 2017 13:09:15 +0000 Received: from BL2FFO11FD040.protection.gbl (2a01:111:f400:7c09::166) by BLUPR0301CA0032.outlook.office365.com (2a01:111:e400:5259::42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.977.11 via Frontend Transport; Fri, 17 Mar 2017 13:09:14 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; caviumnetworks.com; dkim=none (message not signed) header.d=none; caviumnetworks.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BL2FFO11FD040.mail.protection.outlook.com (10.173.161.136) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.961.10 via Frontend Transport; Fri, 17 Mar 2017 13:09:13 +0000 Received: from bf-netperf1.idc ([10.232.134.28]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v2HD8peS021077; Fri, 17 Mar 2017 06:09:11 -0700 From: Hemant Agrawal To: CC: , , , , , Date: Fri, 17 Mar 2017 18:38:28 +0530 Message-ID: <1489756124-10805-7-git-send-email-hemant.agrawal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1489756124-10805-1-git-send-email-hemant.agrawal@nxp.com> References: <1488545223-25739-1-git-send-email-hemant.agrawal@nxp.com> <1489756124-10805-1-git-send-email-hemant.agrawal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131342297538464396; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39450400003)(39860400002)(39840400002)(39380400002)(39850400002)(39410400002)(39400400002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(9170700003)(4326008)(356003)(105606002)(53936002)(50986999)(8676002)(76176999)(106466001)(8936002)(81156014)(2351001)(110136004)(47776003)(5003940100001)(81166006)(2950100002)(38730400002)(6916009)(189998001)(305945005)(36756003)(6666003)(33646002)(5660300001)(54906002)(8656002)(85426001)(50226002)(50466002)(48376002)(86362001)(77096006)(2906002)(104016004); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR03MB190; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; MX:1; A:1; PTR:InfoDomainNonexistent; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD040; 1:vqiTqlJkDPJg0sFhDU91s3poPyrCtzC9hJF9o1VJmRNbMKlmnkiWizHNBAc7RKmsHBu50woVaOzlQIZoiLeQnErcNbju8et7plAdLUxcKjmQ/6pCL1NZP7JNg1py+6TVTLq4LmjGXr4/2d+uzOTjD+nit77zo4gwO79teK4LadOtkdpNFGoXE4rVsoio3byOh3K7+psumNNar0tvUM8haZk34vg3+W8Vp0EFKW7Chio4ZfHvwM+Q0FZU7cLUOmQWcwRPZK7q8BsIvvfZjTLHJzZjStaEVtlX2KJd+o+ZD2LLewfCkPokn68PEDbv+SmMOy8jH44XFJd+PfCpaKIgEi0oOw8oGDwr4dz1sDECn8qb+X7tsZaJboocSWMRRve/gy5D2sSduHrengO/jMeq7V4ahP5K0lS6+QzpBGvhK/H5Wo1f9eqGQzNZAr8E1LUoz2hxE5p/sLheUaAOjLQ8llAt5V3+plkvtMH+gdT8fxMWq/E6UGx9/pyK4/PZi7si2/Llm42EIo50GdgjJJxHkpcUarBV9/AKHJphJGsD5pUrouJkOz/KUebvykMwLh8a5sW/7B4ktXYUpNeqSebpDiBEtUpl7NxLe2WiWmHA2SqB/8dnXKSSJKIaobStqvOkKpwOtvAcFHJvVoob3o4pQA== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: dc7fd590-0d42-4eda-8a8c-08d46d36cf3a X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:BY2PR03MB190; X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB190; 3:Ok/O/Ixz+kRO74NslzXkAQCA+KjgmA52DZuwOmYGYVoli1JdPpFDE22L2ei2rFFP1ldKM33HoG++NTXs/fZvq0ZOQf0zZfqMFTu51PJ6FOOE28eZg8LDFXmLk7SAAhEFHziMApE/621nDMGdaT8fR2OzZUWzOKJbkeZLRfILY1BzAxUMF6nxZhzr9guXsaX0VBPCxKG1TtzzU0Kh1MCdI1/qUj86lHACEx0tPMX3GyXb2CY/qoWrKxmwvaf5sztnOM6ZkyCoPbvuZRMwT3Y1ER0FP+64yQ2wjWx5mfnWgpblqx/TNHhmx2KW8AdBFArApjyAaBKiBU8VadYhiHntIGRjte5raqnU71Pt9CvUKsgJWoNko06DmWWrRzepQQ+V; 25:UwgvxeGjgoc0Z22EEr59kMg3WrmqUYyURDBWjQq6yGjLsd8vqcEih3dt18CGtPZO3uOJhfRXExP1NPjXEkrL7+vwUKU1bhgmbPW8K5JSFdr7WrLEPuvud0jGNw4BJ7WEOmTxSrCw2gE0i9OEtKUCqptRmOHyeAP0s7O4aeTfXRJGstWuOXbjIvUq2oso70DUEk51Ts1sIIb5OBbMUMO3ZpBC4680S/xuEf6Ckubo7vmpwVtGRG1jaiXiErIQWiYeBRHKTfI77yy5SZE/7jmdIM/7JOGxpjMxQrF/9hKqgbyH1JDRQKIdtt2y3LVGkgMYpeU9XqEOhOY51oApzya9aUGFnkeb2HhLae72c6EGrghN8eQw29sEfeTkR1QDecJbt18Ux2vOcynygKg8D4S3dWLbGNPyMxOhYwuVUCZGxI5u1MuS+PYasCFRbh7LTxZezLzAzbU/JnztSLX8EUqqCw== X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB190; 31:j9gUBmGmcyIfTrt/4MVtYdeaBT0VV5TeonJNSRt1B5E+3IDfTYGtTnLmnOwUYrFoJgN4fGAGfk/cTd9AfCDbPY4nW2oOpoe5Y1eOhSgVhOl7VdneAB6nVfo++vEybitYoC9W7uHpLWclvRpqzxUxm7YESYO2CRqgSdDs7+X0635FJAD+6RxWT1nc0WzzxCyyU5C7L63a1vfEivOikrkm8oxNSWzJ5bwx6uysRUjBAXuxO4oaaqurGqbJ205Cnd+aHjH4XFNRz0Gglr4S4XGtIVex50JomnJ+o3rFpxUVcGA= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(275809806118684); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095060)(601004)(2401047)(13024025)(13023025)(13015025)(13018025)(5005006)(8121501046)(13017025)(10201501046)(3002001)(6055026)(6096035)(20161123559025)(20161123563025)(20161123556025)(20161123561025)(20161123565025); SRVR:BY2PR03MB190; BCL:0; PCL:0; RULEID:(400006); SRVR:BY2PR03MB190; X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB190; 4:Th+GdyaN5Bh5z2tI21vJiRabw174pIhIdJCrO8zpMnUeXrU4+DXPV9mJYeMSBDWeMGhC4XsS5PmUivDUZ6jG9CfSzDhrKd5sDOLVegbLxaMHobLY9Y95EoJzupPMdbeRaGL3MmWUm8Ek0DbZZisYZ/ppmB6ahTPVLn2+hZxvsjlq+6Qk5dMD85uaIIoFgbMuf1ebBLm+9zWMh2rSHgmgWz0OgnZ/jgOqtKlCjNcr5+/N141DnJxjwBwCIOQqLkDTziOCuDMIq+UO+AMjjEbXPcgaZK9QpThrtVCIULofdZ74+p3VmJMivPWplR9XPjAjm0qttRsbBdufkK1ssBWyzN+l3CwBwN5ZP5ovYnXHRlSPGbUGymjl/T1mbdXUqi1vVCHWrL1P8O2uic74sQ96HAza/ksFzUs5Bh7Q7mlmLrmP9SbwqndqJwrxz2s8akP2ilk43YVZ+EWyzTUVKqSnfMVm4nJ+OV6t2QZNo4dfqx461iuw1AEJZD2gW4QJyTccut5O81quL2O81alpfGJQB1diHT9hEtH4Mp23Cq+kq4uUc7CXVgPO+UYx3PYEYd6DlweNlk1057HGObubL0tmRP8bJwAZUqAeAhpgg5Pq6rS9f7OD75Ln9pBqZYe3EnW9q4FlbIv3bM9OoreMdh2fXPJN4/KRGPMtqjIk4+1QS2lIh243ISXZ17p7EL4X4WRg1CMCY9O8E7vigMbjvpKmGT20q1LcViMqfW8DdYvkNR1ViBPmnK2qPZoh2K1f25ZFrFN/6WpeH99XMrwMahsjRg== X-Forefront-PRVS: 0249EFCB0B X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR03MB190; 23:ORf4Zfg2FifniC9KGDCHJkeYkI51dm/4D4BnquJNM9?= kEGVxf7OgLyVIyw5XRJNWgfGUMgppoLhgnspPs2D07VnpNP/7iucTi83RDgXviorfW1SFkDMvN7Z6n4TeF1CQmWw9fYL77NYkJova4lKyBsThqbAS/rj80Ri2lprP1IGawlx1hrL8OTAQ733y2qxok8iMJMPKWVhUXVo/0g4isMtWT4igQvKiX9HlWPLYRbQEJwTrzi4jkEwK6C0SlEqaaAMLuuflYHnbiSLyxPdq8slNCyGCcTz+TQsyis5uYfveKMKb1mxU9YTwbS9ZKlzMXra/9q7r/TXkDzr5SGw7rNk+AgudL+aKv5A/tY41z80kkPvHT+2Auv1vH4+8R9RqZdVTnoXFf4JjzTmTRf25s1TEdct5ye6HB5/yvfskN78ajYGzqsLE3fNjStGDwXgwXzYBvxpOag5U/PQwKsOs9TmVeXFRiuZmnSJN6WmIRGjxo02m2n4sAQ24gmormP0JV0EaKMPuNADcG8dK6mY9yMXBiJ92pJHpbsSX+vi5gaXnV+m6xLd7Kl3wthaO0nX4KV1WWruY00Epnln7v5stSV9H5vZC3SRDgSIe4E7fc3NVE5J/JAzQFwKikbmqA6A4zt9clsagudcRMWjBctMu75FqN1SR+9G3aE6DYNFFVgE6c0ax2Ewv0LZjdALyt9RRrGUHGQlqr+Zb4mU/OaMYKWf/BJV94Zf/2WZYb8j8GMrqHN0jfGaImq5qOW/bKQCDwGwl+O3x/ZRw10i94gJUJO/sDBDsoEUhvJ7tZsH4KZIcl51hrXt0VnbMx5iy7/W4NwiJK7/0+L3FsPhgZXRzxUph9SDb8vro941E3AqEjnVIWD3x/tsvk7a3NqvAq/fxwb8F7v8CiS5n4+jJiBz5xM44Yf0cO06UNZRPeEBPJFTpW9w3CWi+nBI99Sig/j0u/e0lUmtdyBCicsZOFs86t6mHil+PTP8qzyoibHDAJ4IY6J/2OFhaTLy9jFsTJqnWJ+Y5UHE3Ta9IxnTs93J4g8ahiGzX7yDej+P5bPb3H2R621Vv9Usi6p03YFULIra3yp1uUAwR/ot/5XcVGXsmnt5HYrh84YL/bI4oe1qMx8q2pRnGLxS3bjYar+YBkR3oqYdYGuzxgIzUMvPPzDyArVjFxTU9tUYdvdjCD+nY7ZsKpnhYvqCRZwyzhhiOK/20zijFTk4CBm1agD4HEwzd+Yg== X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB190; 6:Y2zIweUWzAGTJCGhGNQrlV0aX2w4FESrNw0D75CA0ZW8WzDWdeA/0UbKrGRtm+bFA4P3VJDDwidIU0Fs5TKs8nBMNMUAcnqykYZuvGCD17zoaKHjdfp64YY1UeJ/6CL9ip3nbfq4WSTy+zwVXYgVzpZxly6QBBS3g69sPIcl11BkyKwBfmOLd4aYQlJcFCqwo9KLYsBmYkeom2EJtwigFaQUO/nSd/KTUHlBUHCC3V42P4laTAgLh80cYs6MrK0gJUVe/Xax4dGSRd+j3Q3SD6Wx+YBRjOVhmqOPpkC50XhdG9ihzXPjUHtXEOKBSTbE2XnfPgdtpFnu+rFEbw7OR5kAruYbMLjPaT4gZsDg41Vz+2QqojHgM0vFKx8W6l1h+baTOi2l48xn5h2xgIn5dC6OajI4VvioLnQjtZSEgzA=; 5:C84y1whifU45QtYw0aod9lPOt0P+sksnojqSwBZlC1Jyo4YwmQOooypTxoykZsJQx2ZZD9KtH53C5wl7BCB4a+HQClcKrQW7HNBj3Ihhf5xMybrq5us1Vibhx9O2+81qtJvE46+gaQl0kdkJ4VvwnvgDTUpLHHA2wLH8Q/7jw389QbHHDWqWIvQBGsOEV7Tn; 24:a4g4BTFcJpH6Li8h6PVSFpbtxufOUNrst3ZnRb3e2PgEIpqcUtstLSvvp+ZNbRAHS3ycW8TgnjGCN5Y+ZD/Ks3AzqXAYy8+RbYRIXemAa3U= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB190; 7:dDychrVPlYM5/MLMZVu4uin05colpzKdBY43d6MSybkBq57mAsSbtBwnJHaxu6m2rZmOsTpXjJ782y12w2PqHgtHy7ZMh9bW0tCcAm2cY0ixlhmSCo8ItkzY06fn4E3txZL21KVxBDO1np+/+PO4DMlo1NGVPoyMW2cqCyHLEhNb7JNa3fDaBH8D68CWJylQjfPYLwZnIvowmOJlYPcewd/CTQYIuyWfpZDjdU8Sd/dyXosX1qTrq8AVwNMCMKKWwh7VMqortZ9D8Y8kzhFKgPBz6WWcCEeBRt9yyB4kwGyQBwcMv0fd9ZxrOyTDPo0ib47IP9f9PRS942nxb1DmIA== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Mar 2017 13:09:13.6748 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB190 Subject: [dpdk-dev] [PATCH v9 06/22] net/dpaa2: adding eth ops to dpaa2 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Signed-off-by: Hemant Agrawal --- doc/guides/nics/features/dpaa2.ini | 1 + drivers/net/dpaa2/Makefile | 1 + drivers/net/dpaa2/dpaa2_ethdev.c | 410 ++++++++++++++++++++++++++++++++++++- drivers/net/dpaa2/dpaa2_ethdev.h | 15 ++ 4 files changed, 426 insertions(+), 1 deletion(-) diff --git a/doc/guides/nics/features/dpaa2.ini b/doc/guides/nics/features/dpaa2.ini index b176208..0b59725 100644 --- a/doc/guides/nics/features/dpaa2.ini +++ b/doc/guides/nics/features/dpaa2.ini @@ -4,6 +4,7 @@ ; Refer to default.ini for the full list of available PMD features. ; [Features] +Queue start/stop = Y Linux VFIO = Y ARMv8 = Y Usage doc = Y diff --git a/drivers/net/dpaa2/Makefile b/drivers/net/dpaa2/Makefile index db94b45..4f78565 100644 --- a/drivers/net/dpaa2/Makefile +++ b/drivers/net/dpaa2/Makefile @@ -50,6 +50,7 @@ CFLAGS += -I$(RTE_SDK)/drivers/net/dpaa2/mc CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/qbman/include CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/mc +CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/portal CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal # versioning export map diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c index c2dffbb..ef826fb 100644 --- a/drivers/net/dpaa2/dpaa2_ethdev.c +++ b/drivers/net/dpaa2/dpaa2_ethdev.c @@ -47,32 +47,440 @@ #include #include +#include + #include "dpaa2_ethdev.h" static struct rte_dpaa2_driver rte_dpaa2_pmd; +static void +dpaa2_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) +{ + struct dpaa2_dev_priv *priv = dev->data->dev_private; + + PMD_INIT_FUNC_TRACE(); + + dev_info->if_index = priv->hw_id; + + dev_info->max_rx_queues = (uint16_t)priv->nb_rx_queues; + dev_info->max_tx_queues = (uint16_t)priv->nb_tx_queues; + + dev_info->speed_capa = ETH_LINK_SPEED_1G | + ETH_LINK_SPEED_2_5G | + ETH_LINK_SPEED_10G; +} + +static int +dpaa2_alloc_rx_tx_queues(struct rte_eth_dev *dev) +{ + struct dpaa2_dev_priv *priv = dev->data->dev_private; + uint16_t dist_idx; + uint32_t vq_id; + struct dpaa2_queue *mc_q, *mcq; + uint32_t tot_queues; + int i; + struct dpaa2_queue *dpaa2_q; + + PMD_INIT_FUNC_TRACE(); + + tot_queues = priv->nb_rx_queues + priv->nb_tx_queues; + mc_q = rte_malloc(NULL, sizeof(struct dpaa2_queue) * tot_queues, + RTE_CACHE_LINE_SIZE); + if (!mc_q) { + PMD_INIT_LOG(ERR, "malloc failed for rx/tx queues\n"); + return -1; + } + + for (i = 0; i < priv->nb_rx_queues; i++) { + mc_q->dev = dev; + priv->rx_vq[i] = mc_q++; + dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i]; + dpaa2_q->q_storage = rte_malloc("dq_storage", + sizeof(struct queue_storage_info_t), + RTE_CACHE_LINE_SIZE); + if (!dpaa2_q->q_storage) + goto fail; + + memset(dpaa2_q->q_storage, 0, + sizeof(struct queue_storage_info_t)); + dpaa2_q->q_storage->dq_storage[0] = rte_malloc(NULL, + DPAA2_DQRR_RING_SIZE * sizeof(struct qbman_result), + RTE_CACHE_LINE_SIZE); + } + + for (i = 0; i < priv->nb_tx_queues; i++) { + mc_q->dev = dev; + mc_q->flow_id = DPNI_NEW_FLOW_ID; + priv->tx_vq[i] = mc_q++; + } + + vq_id = 0; + for (dist_idx = 0; dist_idx < priv->nb_rx_queues; dist_idx++) { + mcq = (struct dpaa2_queue *)priv->rx_vq[vq_id]; + mcq->tc_index = DPAA2_DEF_TC; + mcq->flow_id = dist_idx; + vq_id++; + } + + return 0; +fail: + i -= 1; + mc_q = priv->rx_vq[0]; + while (i >= 0) { + dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i]; + rte_free(dpaa2_q->q_storage->dq_storage[0]); + rte_free(dpaa2_q->q_storage); + priv->rx_vq[i--] = NULL; + } + rte_free(mc_q); + return -1; +} + +static int +dpaa2_eth_dev_configure(struct rte_eth_dev *dev) +{ + struct rte_eth_dev_data *data = dev->data; + struct rte_eth_conf *eth_conf = &data->dev_conf; + + PMD_INIT_FUNC_TRACE(); + + /* Check for correct configuration */ + if (eth_conf->rxmode.mq_mode != ETH_MQ_RX_RSS && + data->nb_rx_queues > 1) { + PMD_INIT_LOG(ERR, "Distribution is not enabled, " + "but Rx queues more than 1\n"); + return -1; + } + + return 0; +} + +/* Function to setup RX flow information. It contains traffic class ID, + * flow ID, destination configuration etc. + */ +static int +dpaa2_dev_rx_queue_setup(struct rte_eth_dev *dev, + uint16_t rx_queue_id, + uint16_t nb_rx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_rxconf *rx_conf __rte_unused, + struct rte_mempool *mb_pool) +{ + struct dpaa2_dev_priv *priv = dev->data->dev_private; + struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; + struct dpaa2_queue *dpaa2_q; + struct dpni_queue cfg; + uint8_t options = 0; + uint8_t flow_id; + int ret; + + PMD_INIT_FUNC_TRACE(); + + PMD_INIT_LOG(DEBUG, "dev =%p, queue =%d, pool = %p, conf =%p", + dev, rx_queue_id, mb_pool, rx_conf); + + dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[rx_queue_id]; + dpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */ + + /*Get the tc id and flow id from given VQ id*/ + flow_id = rx_queue_id; + memset(&cfg, 0, sizeof(struct dpni_queue)); + + options = options | DPNI_QUEUE_OPT_USER_CTX; + cfg.user_context = (uint64_t)(dpaa2_q); + + ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_RX, + dpaa2_q->tc_index, flow_id, options, &cfg); + if (ret) { + PMD_INIT_LOG(ERR, "Error in setting the rx flow: = %d\n", ret); + return -1; + } + + dev->data->rx_queues[rx_queue_id] = dpaa2_q; + return 0; +} + +static int +dpaa2_dev_tx_queue_setup(struct rte_eth_dev *dev, + uint16_t tx_queue_id, + uint16_t nb_tx_desc __rte_unused, + unsigned int socket_id __rte_unused, + const struct rte_eth_txconf *tx_conf __rte_unused) +{ + struct dpaa2_dev_priv *priv = dev->data->dev_private; + struct dpaa2_queue *dpaa2_q = (struct dpaa2_queue *) + priv->tx_vq[tx_queue_id]; + struct fsl_mc_io *dpni = priv->hw; + struct dpni_queue tx_conf_cfg; + struct dpni_queue tx_flow_cfg; + uint8_t options = 0, flow_id; + uint32_t tc_id; + int ret; + + PMD_INIT_FUNC_TRACE(); + + /* Return if queue already configured */ + if (dpaa2_q->flow_id != DPNI_NEW_FLOW_ID) + return 0; + + memset(&tx_conf_cfg, 0, sizeof(struct dpni_queue)); + memset(&tx_flow_cfg, 0, sizeof(struct dpni_queue)); + + tc_id = 0; + flow_id = tx_queue_id; + + ret = dpni_set_queue(dpni, CMD_PRI_LOW, priv->token, DPNI_QUEUE_TX, + tc_id, flow_id, options, &tx_flow_cfg); + if (ret) { + PMD_INIT_LOG(ERR, "Error in setting the tx flow: " + "tc_id=%d, flow =%d ErrorCode = %x\n", + tc_id, flow_id, -ret); + return -1; + } + + dpaa2_q->flow_id = flow_id; + + if (tx_queue_id == 0) { + /*Set tx-conf and error configuration*/ + ret = dpni_set_tx_confirmation_mode(dpni, CMD_PRI_LOW, + priv->token, + DPNI_CONF_DISABLE); + if (ret) { + PMD_INIT_LOG(ERR, "Error in set tx conf mode settings" + " ErrorCode = %x", ret); + return -1; + } + } + dpaa2_q->tc_index = tc_id; + + dev->data->tx_queues[tx_queue_id] = dpaa2_q; + return 0; +} + +static void +dpaa2_dev_rx_queue_release(void *q __rte_unused) +{ + PMD_INIT_FUNC_TRACE(); +} + +static void +dpaa2_dev_tx_queue_release(void *q __rte_unused) +{ + PMD_INIT_FUNC_TRACE(); +} + +static int +dpaa2_dev_start(struct rte_eth_dev *dev) +{ + struct rte_eth_dev_data *data = dev->data; + struct dpaa2_dev_priv *priv = data->dev_private; + struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; + struct dpni_queue cfg; + uint16_t qdid; + struct dpni_queue_id qid; + struct dpaa2_queue *dpaa2_q; + int ret, i; + + PMD_INIT_FUNC_TRACE(); + + ret = dpni_enable(dpni, CMD_PRI_LOW, priv->token); + if (ret) { + PMD_INIT_LOG(ERR, "Failure %d in enabling dpni %d device\n", + ret, priv->hw_id); + return ret; + } + + ret = dpni_get_qdid(dpni, CMD_PRI_LOW, priv->token, + DPNI_QUEUE_TX, &qdid); + if (ret) { + PMD_INIT_LOG(ERR, "Error to get qdid:ErrorCode = %d\n", ret); + return ret; + } + priv->qdid = qdid; + + for (i = 0; i < data->nb_rx_queues; i++) { + dpaa2_q = (struct dpaa2_queue *)data->rx_queues[i]; + ret = dpni_get_queue(dpni, CMD_PRI_LOW, priv->token, + DPNI_QUEUE_RX, dpaa2_q->tc_index, + dpaa2_q->flow_id, &cfg, &qid); + if (ret) { + PMD_INIT_LOG(ERR, "Error to get flow " + "information Error code = %d\n", ret); + return ret; + } + dpaa2_q->fqid = qid.fqid; + } + + return 0; +} + +/** + * This routine disables all traffic on the adapter by issuing a + * global reset on the MAC. + */ +static void +dpaa2_dev_stop(struct rte_eth_dev *dev) +{ + struct dpaa2_dev_priv *priv = dev->data->dev_private; + struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; + int ret; + + PMD_INIT_FUNC_TRACE(); + + ret = dpni_disable(dpni, CMD_PRI_LOW, priv->token); + if (ret) { + PMD_INIT_LOG(ERR, "Failure (ret %d) in disabling dpni %d dev\n", + ret, priv->hw_id); + return; + } +} + +static void +dpaa2_dev_close(struct rte_eth_dev *dev) +{ + struct dpaa2_dev_priv *priv = dev->data->dev_private; + struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; + int ret; + + PMD_INIT_FUNC_TRACE(); + + /* Clean the device first */ + ret = dpni_reset(dpni, CMD_PRI_LOW, priv->token); + if (ret) { + PMD_INIT_LOG(ERR, "Failure cleaning dpni device with" + " error code %d\n", ret); + return; + } +} + +static struct eth_dev_ops dpaa2_ethdev_ops = { + .dev_configure = dpaa2_eth_dev_configure, + .dev_start = dpaa2_dev_start, + .dev_stop = dpaa2_dev_stop, + .dev_close = dpaa2_dev_close, + .dev_infos_get = dpaa2_dev_info_get, + .rx_queue_setup = dpaa2_dev_rx_queue_setup, + .rx_queue_release = dpaa2_dev_rx_queue_release, + .tx_queue_setup = dpaa2_dev_tx_queue_setup, + .tx_queue_release = dpaa2_dev_tx_queue_release, +}; + static int dpaa2_dev_init(struct rte_eth_dev *eth_dev) { + struct rte_device *dev = eth_dev->device; + struct rte_dpaa2_device *dpaa2_dev; + struct fsl_mc_io *dpni_dev; + struct dpni_attr attr; + struct dpaa2_dev_priv *priv = eth_dev->data->dev_private; + int ret, hw_id; + PMD_INIT_FUNC_TRACE(); /* For secondary processes, the primary has done all the work */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; + dpaa2_dev = container_of(dev, struct rte_dpaa2_device, device); + + hw_id = dpaa2_dev->object_id; + + dpni_dev = (struct fsl_mc_io *)malloc(sizeof(struct fsl_mc_io)); + if (!dpni_dev) { + PMD_INIT_LOG(ERR, "malloc failed for dpni device\n"); + return -1; + } + + dpni_dev->regs = rte_mcp_ptr_list[0]; + ret = dpni_open(dpni_dev, CMD_PRI_LOW, hw_id, &priv->token); + if (ret) { + PMD_INIT_LOG(ERR, "Failure in opening dpni@%d device with" + " error code %d\n", hw_id, ret); + return -1; + } + + /* Clean the device first */ + ret = dpni_reset(dpni_dev, CMD_PRI_LOW, priv->token); + if (ret) { + PMD_INIT_LOG(ERR, "Failure cleaning dpni@%d device with" + " error code %d\n", hw_id, ret); + return -1; + } + + ret = dpni_get_attributes(dpni_dev, CMD_PRI_LOW, priv->token, &attr); + if (ret) { + PMD_INIT_LOG(ERR, "Failure in getting dpni@%d attribute, " + " error code %d\n", hw_id, ret); + return -1; + } + + priv->num_tc = attr.num_tcs; + priv->nb_rx_queues = attr.num_queues; + priv->nb_tx_queues = attr.num_queues; + + priv->hw = dpni_dev; + priv->hw_id = hw_id; + priv->flags = 0; + + /* Allocate memory for hardware structure for queues */ + ret = dpaa2_alloc_rx_tx_queues(eth_dev); + if (ret) { + PMD_INIT_LOG(ERR, "dpaa2_alloc_rx_tx_queuesFailed\n"); + return -ret; + } + + eth_dev->dev_ops = &dpaa2_ethdev_ops; eth_dev->data->drv_name = rte_dpaa2_pmd.driver.name; return 0; } static int -dpaa2_dev_uninit(struct rte_eth_dev *eth_dev __rte_unused) +dpaa2_dev_uninit(struct rte_eth_dev *eth_dev) { + struct dpaa2_dev_priv *priv = eth_dev->data->dev_private; + struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw; + int i, ret; + struct dpaa2_queue *dpaa2_q; + PMD_INIT_FUNC_TRACE(); if (rte_eal_process_type() != RTE_PROC_PRIMARY) return -EPERM; + if (!dpni) { + PMD_INIT_LOG(WARNING, "Already closed or not started"); + return -1; + } + + dpaa2_dev_close(eth_dev); + + if (priv->rx_vq[0]) { + /* cleaning up queue storage */ + for (i = 0; i < priv->nb_rx_queues; i++) { + dpaa2_q = (struct dpaa2_queue *)priv->rx_vq[i]; + if (dpaa2_q->q_storage) + rte_free(dpaa2_q->q_storage); + } + /*free the all queue memory */ + rte_free(priv->rx_vq[0]); + priv->rx_vq[0] = NULL; + } + + + /*Close the device at underlying layer*/ + ret = dpni_close(dpni, CMD_PRI_LOW, priv->token); + if (ret) { + PMD_INIT_LOG(ERR, "Failure closing dpni device with" + " error code %d\n", ret); + } + + /*Free the allocated memory for ethernet private data and dpni*/ + priv->hw = NULL; + free(dpni); + + eth_dev->dev_ops = NULL; + return 0; } diff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h index 5778780..5f599a7 100644 --- a/drivers/net/dpaa2/dpaa2_ethdev.h +++ b/drivers/net/dpaa2/dpaa2_ethdev.h @@ -34,11 +34,26 @@ #ifndef _DPAA2_ETHDEV_H #define _DPAA2_ETHDEV_H +#include +#include + +#define MAX_RX_QUEUES 16 +#define MAX_TX_QUEUES 16 + +/*default tc to be used for ,congestion, distribution etc configuration. */ +#define DPAA2_DEF_TC 0 + struct dpaa2_dev_priv { void *hw; int32_t hw_id; + int32_t qdid; uint16_t token; + uint8_t nb_tx_queues; + uint8_t nb_rx_queues; + void *rx_vq[MAX_RX_QUEUES]; + void *tx_vq[MAX_TX_QUEUES]; + uint8_t num_tc; uint8_t flags; /*dpaa2 config flags */ }; #endif /* _DPAA2_ETHDEV_H */