From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0065.outbound.protection.outlook.com [104.47.41.65]) by dpdk.org (Postfix) with ESMTP id 58C6E1B1EF for ; Thu, 28 Sep 2017 13:23:40 +0200 (CEST) Received: from BN6PR03CA0070.namprd03.prod.outlook.com (10.173.137.32) by MWHPR03MB2703.namprd03.prod.outlook.com (10.168.207.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Thu, 28 Sep 2017 11:23:38 +0000 Received: from BY2FFO11FD037.protection.gbl (2a01:111:f400:7c0c::121) by BN6PR03CA0070.outlook.office365.com (2603:10b6:404:4c::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.56.11 via Frontend Transport; Thu, 28 Sep 2017 11:23:38 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.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 BY2FFO11FD037.mail.protection.outlook.com (10.1.14.222) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.56.11 via Frontend Transport; Thu, 28 Sep 2017 11:23:37 +0000 Received: from Tophie.ap.freescale.net ([10.232.14.39]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v8SBMpFt016035; Thu, 28 Sep 2017 04:23:35 -0700 From: Shreyansh Jain To: CC: , Date: Thu, 28 Sep 2017 17:03:23 +0530 Message-ID: <20170928113344.12248-20-shreyansh.jain@nxp.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170928113344.12248-1-shreyansh.jain@nxp.com> References: <20170909112132.13936-1-shreyansh.jain@nxp.com> <20170928113344.12248-1-shreyansh.jain@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131510714180887034; (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)(7966004)(336005)(346002)(376002)(39860400002)(39380400002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(1076002)(498600001)(54906003)(50226002)(68736007)(2351001)(2906002)(106466001)(305945005)(36756003)(5003940100001)(33646002)(316002)(575784001)(8656003)(5660300001)(85426001)(8936002)(16586007)(86362001)(48376002)(76176999)(50986999)(6666003)(104016004)(81166006)(50466002)(81156014)(77096006)(47776003)(53936002)(6916009)(2950100002)(105606002)(189998001)(97736004)(8676002)(356003)(4326008)(217873001); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR03MB2703; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD037; 1:A6//Spvz8igF4mlGwUc3JkKz2hFsCvqR94oYzbrTDLPn1GPSQ2qUNSTVnNvGKd3F6AhV8oikkwvDNpWUsmfYONtwU+EoDGR/X6S1pvFcjkfAWb/M/cp2xs0/5w2S35Ox MIME-Version: 1.0 Content-Type: text/plain X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 7cc7389c-e405-417d-e1fa-08d506635d5f X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017052603199)(201703131430075)(201703131517081); SRVR:MWHPR03MB2703; X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2703; 3:cY5Ur3V0w+D9zV9GB+j84CdHEKJZfDJ6+t4SUmywNsca/stwRRVagR37h24i6McTKjfHxDBwjH9plPVuQuaGVItrMPAMkyEjK+qb5XAbqnWbdfKti6zzVbG4DPrLbjAP+nYwG8AjDqiu87bzHv+2c4GE4tGAYB1Z134/bY6cHSVFLJNjzuR6itxPJIJD4PNJJ+4FjzLN1U0sZczETUataxi5OaevpxSWptSIy2ig1tmOPV66arofvaBMLyloyZc2Gi8MTUKJVgNnwz1DGw8X0Er/0E/SZ263ELuUbs1g/Li0PDdeE446p9hAcs1VxqRQSVyA3dcIwr2tqz2VzQrvjuuZmvn8qlCR0e2QJkSQTC4=; 25:M0tBs5MN7kRuT9UTnTmAvXEWz0Rp1Ff7lcL67qUrgXyzpAx/gpK8ndA620OB6nWytt+9JvAZ9kZUFfzDC1UBXd4bs9QUrePjVfEhJnxXd4DQ/86+frQDe7beBhfTke5+s1j3itEfUQ9SyKEvqckeexVLn+XBnbPA3KpZa+wUDa8YVL2kWmT2K0YcoEIhX+VUKEX9g6rynltUpMMIOFzvEdqt5+J5sniAs7HwmRVuXfGR5PQFSy88DL+UZ+L1m5h0Xxl0WfOoOEZ7xwPf8DXTyKiHm2oNDoc0cDoZsNMOV8atw+KZJVAdy3ai11+q6CsoXIjvhnefQ5PedL+nCPMG7Q== X-MS-TrafficTypeDiagnostic: MWHPR03MB2703: X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2703; 31:cdiDwoYYTjAHak21E8Ch9VKgkPFhusASAiLUNJgiBHgNK1unx3Bno21/hqYBm6ZRRm3EfW3cE6SspbQQE10sSGWveEarw6FL2uSRaGaH7RrAb70CEzXkBSFXKWp5DaTHvyyk1DCJ9ILJJh6lZzFTqnEGq29zTkJ7rWndquRnCx24rh66WuiEJppKx3Z2R/TfsErGIGoU3NUCUq5gjU4Di23MZmAuSwse2uzoGTI71jQ=; 4:ZqcuDlXm0LvWJ2HnGklEgS/XmPu+4gcTRiufopq89dKrdzWZAJJtTfAorpt54y/qDnNxY1IOW6g+BIEaOsMwRB6w+AwlcGcqSmYSBh6dgakT64tEwfyojm/2nW8mgj1LUMmGsJOiJ/+JOl5pYl//6dtB3iXM1RXSuCGXM/aa4N28zflUosN4Hajmnkq7LdqoTq1Nt/XXHZ/7A53OQybbwRlnAoBULOwbUCCrEjkMLox1p5pnQ3+qaICtY9ewauYt1+bCe4DXh1suKUXNhnVDuWp3krsNaISy5gbETaaFbLw= X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(2401047)(8121501046)(5005006)(100000703101)(100105400095)(10201501046)(3002001)(93006095)(93001095)(6055026)(6096035)(20161123561025)(20161123563025)(20161123559100)(20161123565025)(201703131430075)(201703131441075)(201703131448075)(201703131433075)(201703161259150)(20161123556025)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:MWHPR03MB2703; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:MWHPR03MB2703; X-Forefront-PRVS: 0444EB1997 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR03MB2703; 23:F6bIjE1BWkA0Rid2P+F+0FcjWRR4qwtGKADWzTXMR?= =?us-ascii?Q?PtKpJ/VmZxuVx7tuTzIjRORv6IrGeiGtB+vCoUsOwXvLbIrU/Xhu4vEigSIB?= =?us-ascii?Q?wF5uvLbBY7+EJX1zyyIhacBsRbVKQzML55JG8ruQWhAi3daWhzNPG5I+7UW+?= =?us-ascii?Q?lClb0Z0RYaxljgzC4Rujx8B5wE8t5WAveQT+ffNlmP8NxXgOrDtyXItFxqyo?= =?us-ascii?Q?tkVSb8ejgwhUciL0JoPIzYcyq0BJ1JGc7Kgn/LJgY43l+l5Caab4HESnwU7s?= =?us-ascii?Q?uIpjfOefCBczIXa3mmg85L7NNg1xXo+I3AuQrrYaK60G0mm94a+S26Tuk4oR?= =?us-ascii?Q?yjVC+5/C0yldMnYuRCHNgYzAc7gOK5oQa55heO2q6y6ab4TaqTzdIfzOoXbc?= =?us-ascii?Q?lFp63cIilDIvWouaQScsId+FopWdaKUY9V23lTKHcV9MDKwFrbTxOzUfnJwb?= =?us-ascii?Q?MGleu1EUVcSjYjy6HNF1g9HFQ8Oy6n9TJNHhOFHof/ldWAl/uGFmeYvRI/At?= =?us-ascii?Q?ynCetpaAnMCLbt5Cfk7rLDI9WQEgZoOltQK4yS3SE+1MwS+sDEdXnu/gJIIL?= =?us-ascii?Q?HIXpegWALUO0JY7vRwSy0GEdufDxKvUWxBEEyDuKCz7QyWzM1MxVVWrMrdd+?= =?us-ascii?Q?61ZfNnsrbTCjpdDa8NcYg04v8HDorvO2eAlvUe68GJz79qbGsk+Fvre0RhlW?= =?us-ascii?Q?SdkflmMUrYx5+J44PGxWZtvMbym6rPrCrQSTR/sww1ZlFoKlm+SwhIEfMVmX?= =?us-ascii?Q?KwmpzOuGWKo0HsZpToKTgJj1vlmcZpkl+0VZrerTHDJaqWjcx7ci8v1fDz1u?= =?us-ascii?Q?jqDhoJtNaWuGBgFM2rf4e/p0k6Rb7juBCwJ4Ydw4SH+nkp+PTh74kqmYJnOU?= =?us-ascii?Q?rk4KpUNvdAc+AJxuYz6E0UlYu0PmhpicAQOdGGVCdjmRmb6z+Tkm9/z062uC?= =?us-ascii?Q?16m/XpRVRVQeYklD1jMUjRuBUlwdo+7P3wkaDzJRcMknBTA6wRW5TpB8FAeo?= =?us-ascii?Q?djFqNatfebp+9+v7TFhLlCV0o8kiLaC7qpg6wrmXU8dkXtseHyEN+Jirv5TO?= =?us-ascii?Q?Y5Yb5Cs11meV2j0WwPsILy4/jpweihJeI1vYvWG9VBFaBkNjqRG3HPqgU0qc?= =?us-ascii?Q?+93wVMZ8318APGcjAPHXJq6qfVS3JlqEgcfRP8J8tkqMK21EdwBQrQro+jmX?= =?us-ascii?Q?g310EC36Jhc7vK1HU9q7kIQJtr69owSeWDoTIDx3n/cbcvt/rSxTk749lMST?= =?us-ascii?Q?ktcSPI0AF9n+vS7cJo=3D?= X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2703; 6:XpD/YvKFC2OLo41nsM96EwQp7AtJZhbrUd+fKCAvk9sKRYW/Se3+OuTQlIlQkOQizxvhwwEWPdz2EtbXC/EaS/sWf3N7z9cu6OXzyr1XnLlx1Gfa+LU2xHpPfxO9QHjd+j1TO0wTQw/u9FMuFO7cofEjJThVZ3IOm83l9igoilOGCBf+LZsBMkLDuP7fGuUFQrUTEyTK+nPhL3qaMUBB23zjtq9cmebyREktlkFhrLPyLxSAAc6Oqyf8/6WxLQejeSIQciowmJ1uKs4lzSkgpfVhpVvAXDNrCmOuSAANWYLAbho2HXCtMd8AZx6cIY2pmijW4tp/gfnL3MV+B4OhrQ==; 5:0T07btJZ+SYWWhf909/7zR86Qqa/RAdFuj9Y4yjY5NWWfsb19oME3mcVNeckXvFvnK9rxnW0shJHLuXkN8vf/M3e0jMUtWwsdKJgXQOEYh7336SlIyeMAw3ngHDQgqQOPUDIlLVwVFXqoZKI0dMG4A==; 24:iNZ+a9Im/XkJ33sUMWATTDIj+iNv1uwRQjd+7G/FNegaMHZxe4G8VNuvh/SyZ5+VnZKzuuyRexBLgITNCCc8wy1XaHW424pBqDtlXbcdrQM=; 7:gRk8YF5mUTPfyskKxpi7cCKSXKd0kuFV21+6BXG/5Hq7J4w/W28lTXIurLNKwtQKZpN8sUGzQ4as6ivryNgyIV1lmJBN/LUVT3QyEpF1HEUDZhaQSP5ucP/6nxd4+4KOzFaFpn7naI5vap23l8yLbM0trsAJDFAm6+TajmdBeOHsjjEI9cNCzcptvLfb7/gS8S4evjByaM/Wf0tLsQgR+ylTUBQIs+af17hPbcpVmLk= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Sep 2017 11:23:37.8859 (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: MWHPR03MB2703 Subject: [dpdk-dev] [PATCH v5 19/40] mempool/dpaa: support NXP DPAA Mempool 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: , X-List-Received-Date: Thu, 28 Sep 2017 11:23:41 -0000 This Mempool driver works with DPAA BMan hardware block. This block manages data buffers in memory, and provides efficient interface with other hardware and software components for buffer requests. This patch adds support for BMan. Compilation would be enabled in subsequent patches. Signed-off-by: Shreyansh Jain --- MAINTAINERS | 1 + drivers/mempool/Makefile | 2 + drivers/mempool/dpaa/Makefile | 58 +++++ drivers/mempool/dpaa/dpaa_mempool.c | 286 ++++++++++++++++++++++ drivers/mempool/dpaa/dpaa_mempool.h | 77 ++++++ drivers/mempool/dpaa/rte_mempool_dpaa_version.map | 8 + 6 files changed, 432 insertions(+) create mode 100644 drivers/mempool/dpaa/Makefile create mode 100644 drivers/mempool/dpaa/dpaa_mempool.c create mode 100644 drivers/mempool/dpaa/dpaa_mempool.h create mode 100644 drivers/mempool/dpaa/rte_mempool_dpaa_version.map diff --git a/MAINTAINERS b/MAINTAINERS index dad876f..022715f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -412,6 +412,7 @@ NXP dpaa M: Hemant Agrawal M: Shreyansh Jain F: drivers/bus/dpaa/ +F: drivers/mempool/dpaa/ F: doc/guides/nics/dpaa.rst F: doc/guides/nics/features/dpaa.ini diff --git a/drivers/mempool/Makefile b/drivers/mempool/Makefile index efd55f2..bfc5f00 100644 --- a/drivers/mempool/Makefile +++ b/drivers/mempool/Makefile @@ -32,6 +32,8 @@ include $(RTE_SDK)/mk/rte.vars.mk core-libs := librte_eal librte_mempool librte_ring +DIRS-$(CONFIG_RTE_LIBRTE_DPAA_MEMPOOL) += dpaa +DEPDIRS-dpaa = $(core-libs) DIRS-$(CONFIG_RTE_LIBRTE_DPAA2_MEMPOOL) += dpaa2 DEPDIRS-dpaa2 = $(core-libs) DIRS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING) += ring diff --git a/drivers/mempool/dpaa/Makefile b/drivers/mempool/dpaa/Makefile new file mode 100644 index 0000000..25312a0 --- /dev/null +++ b/drivers/mempool/dpaa/Makefile @@ -0,0 +1,58 @@ +# BSD LICENSE +# +# Copyright 2016 NXP. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of NXP nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include $(RTE_SDK)/mk/rte.vars.mk + +# +# library name +# +LIB = librte_mempool_dpaa.a + +CFLAGS := -I$(SRCDIR) $(CFLAGS) +CFLAGS += -O3 $(WERROR_FLAGS) +CFLAGS += -D _GNU_SOURCE +CFLAGS += -I$(RTE_SDK)/drivers/bus/dpaa +CFLAGS += -I$(RTE_SDK)/drivers/bus/dpaa/include/ +CFLAGS += -I$(RTE_SDK)/drivers/mempool/dpaa +CFLAGS += -I$(RTE_SDK)/lib/librte_mempool + +# versioning export map +EXPORT_MAP := rte_mempool_dpaa_version.map + +# Lbrary version +LIBABIVER := 1 + +# all source are stored in SRCS-y +# +SRCS-$(CONFIG_RTE_LIBRTE_DPAA_MEMPOOL) += dpaa_mempool.c + +LDLIBS += -lrte_bus_dpaa + +include $(RTE_SDK)/mk/rte.lib.mk diff --git a/drivers/mempool/dpaa/dpaa_mempool.c b/drivers/mempool/dpaa/dpaa_mempool.c new file mode 100644 index 0000000..921c36b --- /dev/null +++ b/drivers/mempool/dpaa/dpaa_mempool.c @@ -0,0 +1,286 @@ +/*- + * BSD LICENSE + * + * Copyright 2017 NXP. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of NXP nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* System headers */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +struct dpaa_bp_info rte_dpaa_bpid_info[DPAA_MAX_BPOOLS]; + +static int +dpaa_mbuf_create_pool(struct rte_mempool *mp) +{ + struct bman_pool *bp; + struct bm_buffer bufs[8]; + struct dpaa_bp_info *bp_info; + uint8_t bpid; + int num_bufs = 0, ret = 0; + struct bman_pool_params params = { + .flags = BMAN_POOL_FLAG_DYNAMIC_BPID + }; + + MEMPOOL_INIT_FUNC_TRACE(); + + bp = bman_new_pool(¶ms); + if (!bp) { + DPAA_MEMPOOL_ERR("bman_new_pool() failed"); + return -ENODEV; + } + bpid = bman_get_params(bp)->bpid; + + /* Drain the pool of anything already in it. */ + do { + /* Acquire is all-or-nothing, so we drain in 8s, + * then in 1s for the remainder. + */ + if (ret != 1) + ret = bman_acquire(bp, bufs, 8, 0); + if (ret < 8) + ret = bman_acquire(bp, bufs, 1, 0); + if (ret > 0) + num_bufs += ret; + } while (ret > 0); + if (num_bufs) + DPAA_MEMPOOL_WARN("drained %u bufs from BPID %d", + num_bufs, bpid); + + rte_dpaa_bpid_info[bpid].mp = mp; + rte_dpaa_bpid_info[bpid].bpid = bpid; + rte_dpaa_bpid_info[bpid].size = mp->elt_size; + rte_dpaa_bpid_info[bpid].bp = bp; + rte_dpaa_bpid_info[bpid].meta_data_size = + sizeof(struct rte_mbuf) + rte_pktmbuf_priv_size(mp); + rte_dpaa_bpid_info[bpid].dpaa_ops_index = mp->ops_index; + + bp_info = rte_malloc(NULL, + sizeof(struct dpaa_bp_info), + RTE_CACHE_LINE_SIZE); + if (!bp_info) { + DPAA_MEMPOOL_WARN("Memory allocation failed for bp_info"); + bman_free_pool(bp); + return -ENOMEM; + } + + rte_memcpy(bp_info, (void *)&rte_dpaa_bpid_info[bpid], + sizeof(struct dpaa_bp_info)); + mp->pool_data = (void *)bp_info; + + DPAA_MEMPOOL_INFO("BMAN pool created for bpid =%d", bpid); + return 0; +} + +static void +dpaa_mbuf_free_pool(struct rte_mempool *mp) +{ + struct dpaa_bp_info *bp_info = DPAA_MEMPOOL_TO_POOL_INFO(mp); + + MEMPOOL_INIT_FUNC_TRACE(); + + if (bp_info) { + bman_free_pool(bp_info->bp); + DPAA_MEMPOOL_INFO("BMAN pool freed for bpid =%d", + bp_info->bpid); + rte_free(mp->pool_data); + mp->pool_data = NULL; + } +} + +static void +dpaa_buf_free(struct dpaa_bp_info *bp_info, uint64_t addr) +{ + struct bm_buffer buf; + int ret; + + DPAA_MEMPOOL_DEBUG("Free 0x%lx to bpid: %d", addr, bp_info->bpid); + + bm_buffer_set64(&buf, addr); +retry: + ret = bman_release(bp_info->bp, &buf, 1, 0); + if (ret) { + DPAA_MEMPOOL_DEBUG("BMAN busy. Retrying..."); + cpu_spin(CPU_SPIN_BACKOFF_CYCLES); + goto retry; + } +} + +static int +dpaa_mbuf_free_bulk(struct rte_mempool *pool, + void *const *obj_table, + unsigned int n) +{ + struct dpaa_bp_info *bp_info = DPAA_MEMPOOL_TO_POOL_INFO(pool); + int ret; + unsigned int i = 0; + + DPAA_MEMPOOL_DPDEBUG("Request to free %d buffers in bpid = %d", + n, bp_info->bpid); + + ret = rte_dpaa_portal_init((void *)0); + if (ret) { + DPAA_MEMPOOL_ERR("rte_dpaa_portal_init failed with ret: %d", + ret); + return 0; + } + + while (i < n) { + dpaa_buf_free(bp_info, + (uint64_t)rte_mempool_virt2phy(pool, + obj_table[i]) + bp_info->meta_data_size); + i = i + 1; + } + + DPAA_MEMPOOL_DPDEBUG("freed %d buffers in bpid =%d", + n, bp_info->bpid); + + return 0; +} + +static int +dpaa_mbuf_alloc_bulk(struct rte_mempool *pool, + void **obj_table, + unsigned int count) +{ + struct rte_mbuf **m = (struct rte_mbuf **)obj_table; + struct bm_buffer bufs[DPAA_MBUF_MAX_ACQ_REL]; + struct dpaa_bp_info *bp_info; + void *bufaddr; + int i, ret; + unsigned int n = 0; + + bp_info = DPAA_MEMPOOL_TO_POOL_INFO(pool); + + DPAA_MEMPOOL_DPDEBUG("Request to alloc %d buffers in bpid = %d", + count, bp_info->bpid); + + if (unlikely(count >= (RTE_MEMPOOL_CACHE_MAX_SIZE * 2))) { + DPAA_MEMPOOL_ERR("Unable to allocate requested (%u) buffers", + count); + return -1; + } + + ret = rte_dpaa_portal_init((void *)0); + if (ret) { + DPAA_MEMPOOL_ERR("rte_dpaa_portal_init failed with ret: %d", + ret); + return -1; + } + + while (n < count) { + /* Acquire is all-or-nothing, so we drain in 7s, + * then the remainder. + */ + if ((count - n) > DPAA_MBUF_MAX_ACQ_REL) { + ret = bman_acquire(bp_info->bp, bufs, + DPAA_MBUF_MAX_ACQ_REL, 0); + } else { + ret = bman_acquire(bp_info->bp, bufs, count - n, 0); + } + /* In case of less than requested number of buffers available + * in pool, qbman_swp_acquire returns 0 + */ + if (ret <= 0) { + DPAA_MEMPOOL_DPDEBUG("Buffer acquire failed (%d)", + ret); + /* The API expect the exact number of requested + * buffers. Releasing all buffers allocated + */ + dpaa_mbuf_free_bulk(pool, obj_table, n); + return -ENOBUFS; + } + /* assigning mbuf from the acquired objects */ + for (i = 0; (i < ret) && bufs[i].addr; i++) { + /* TODO-errata - objerved that bufs may be null + * i.e. first buffer is valid, remaining 6 buffers + * may be null. + */ + bufaddr = (void *)rte_dpaa_mem_ptov(bufs[i].addr); + m[n] = (struct rte_mbuf *)((char *)bufaddr + - bp_info->meta_data_size); + DPAA_MEMPOOL_DPDEBUG("Paddr (%p), FD (%p) from BMAN", + (void *)bufaddr, (void *)m[n]); + n++; + } + } + + DPAA_MEMPOOL_DPDEBUG("Allocated %d buffers from bpid=%d", + n, bp_info->bpid); + return 0; +} + +static unsigned int +dpaa_mbuf_get_count(const struct rte_mempool *mp) +{ + struct dpaa_bp_info *bp_info; + + MEMPOOL_INIT_FUNC_TRACE(); + + if (!mp || !mp->pool_data) { + DPAA_MEMPOOL_ERR("Invalid mempool provided\n"); + return 0; + } + + bp_info = DPAA_MEMPOOL_TO_POOL_INFO(mp); + + return bman_query_free_buffers(bp_info->bp); +} + +struct rte_mempool_ops dpaa_mpool_ops = { + .name = "dpaa", + .alloc = dpaa_mbuf_create_pool, + .free = dpaa_mbuf_free_pool, + .enqueue = dpaa_mbuf_free_bulk, + .dequeue = dpaa_mbuf_alloc_bulk, + .get_count = dpaa_mbuf_get_count, +}; + +MEMPOOL_REGISTER_OPS(dpaa_mpool_ops); diff --git a/drivers/mempool/dpaa/dpaa_mempool.h b/drivers/mempool/dpaa/dpaa_mempool.h new file mode 100644 index 0000000..de33c0c --- /dev/null +++ b/drivers/mempool/dpaa/dpaa_mempool.h @@ -0,0 +1,77 @@ +/*- + * BSD LICENSE + * + * Copyright 2017 NXP. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of NXP nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __DPAA_MEMPOOL_H__ +#define __DPAA_MEMPOOL_H__ + +/* System headers */ +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#define CPU_SPIN_BACKOFF_CYCLES 512 + +/* total number of bpools on SoC */ +#define DPAA_MAX_BPOOLS 256 + +/* Maximum release/acquire from BMAN */ +#define DPAA_MBUF_MAX_ACQ_REL 8 + +struct dpaa_bp_info { + struct rte_mempool *mp; + struct bman_pool *bp; + uint32_t bpid; + uint32_t size; + uint32_t meta_data_size; + int32_t dpaa_ops_index; +}; + +#define DPAA_MEMPOOL_TO_POOL_INFO(__mp) \ + ((struct dpaa_bp_info *)__mp->pool_data) + +#define DPAA_MEMPOOL_TO_BPID(__mp) \ + (((struct dpaa_bp_info *)__mp->pool_data)->bpid) + +extern struct dpaa_bp_info rte_dpaa_bpid_info[DPAA_MAX_BPOOLS]; + +#define DPAA_BPID_TO_POOL_INFO(__bpid) (&rte_dpaa_bpid_info[__bpid]) + +#endif diff --git a/drivers/mempool/dpaa/rte_mempool_dpaa_version.map b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map new file mode 100644 index 0000000..cc635c7 --- /dev/null +++ b/drivers/mempool/dpaa/rte_mempool_dpaa_version.map @@ -0,0 +1,8 @@ +DPDK_17.11 { + global: + + rte_dpaa_bpid_info; + rte_dpaa_pool_table; + + local: *; +}; -- 2.9.3