From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <hemant.agrawal@nxp.com>
Received: from NAM01-SN1-obe.outbound.protection.outlook.com
 (mail-sn1nam01on0062.outbound.protection.outlook.com [104.47.32.62])
 by dpdk.org (Postfix) with ESMTP id 86AE337B0
 for <dev@dpdk.org>; Wed, 15 Feb 2017 20:06:20 +0100 (CET)
Received: from BN3PR0301CA0078.namprd03.prod.outlook.com (10.160.152.174) by
 BN6PR03MB2947.namprd03.prod.outlook.com (10.175.126.13) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id
 15.1.888.16; Wed, 15 Feb 2017 19:06:19 +0000
Received: from BN1AFFO11FD033.protection.gbl (2a01:111:f400:7c10::184) by
 BN3PR0301CA0078.outlook.office365.com (2a01:111:e400:401e::46) with Microsoft
 SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.888.16 via
 Frontend Transport; Wed, 15 Feb 2017 19:06:19 +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;caviumnetworks.com; dkim=none (message not signed)
 header.d=none;
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
 BN1AFFO11FD033.mail.protection.outlook.com (10.58.52.246) with Microsoft SMTP
 Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.904.16
 via Frontend Transport; Wed, 15 Feb 2017 19:06:18 +0000
Received: from bf-netperf1.idc ([10.232.134.28])
 by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v1FJ5fLf020023;
 Wed, 15 Feb 2017 12:06:15 -0700
From: Hemant Agrawal <hemant.agrawal@nxp.com>
To: <dev@dpdk.org>
CC: <thomas.monjalon@6wind.com>, <bruce.richardson@intel.com>,
 <shreyansh.jain@nxp.com>, <john.mcnamara@intel.com>,
 <ferruh.yigit@intel.com>, <jerin.jacob@caviumnetworks.com>
Date: Thu, 16 Feb 2017 06:09:10 +0530
Message-ID: <1487205586-6785-12-git-send-email-hemant.agrawal@nxp.com>
X-Mailer: git-send-email 1.9.1
In-Reply-To: <1487205586-6785-1-git-send-email-hemant.agrawal@nxp.com>
References: <1485172803-17288-1-git-send-email-hemant.agrawal@nxp.com>
 <1487205586-6785-1-git-send-email-hemant.agrawal@nxp.com>
X-EOPAttributedMessage: 0
X-Matching-Connectors: 131316591786851601;
 (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)(7916002)(39400400002)(39850400002)(39410400002)(39380400002)(39450400003)(39860400002)(39840400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(47776003)(68736007)(105606002)(50466002)(48376002)(8936002)(50226002)(5660300001)(189998001)(5003940100001)(81166006)(81156014)(92566002)(389900002)(6916009)(2950100002)(6666003)(2351001)(53936002)(106466001)(33646002)(8676002)(2906002)(104016004)(54906002)(97736004)(77096006)(356003)(8656002)(305945005)(36756003)(110136004)(86362001)(575784001)(76176999)(50986999)(4326007)(85426001)(38730400002)(626004);
 DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR03MB2947; H:tx30smr01.am.freescale.net;
 FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; 
X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD033;
 1:o2p39bjAM9YLybtePD6vBqFaysiDWlzY2ebm3M7sJ+3JAHJA9m6JKBX5DnPbhN/rGh63ypaw1Bqv6v4/BKatTDYIUnmGUEHufaGcdey5f1x8a7W1eqkwVBz/oBXUq99Pl645YDEDYEi6QQcClG7zq/BA7U4LgBbV9uxH43XUzBfjSjdMfq4/6Bxid7QzXWtAjypFcDU3+JcZyMF4tCXBgHkmBVyOq8xeIZiPvM9ZIcgzbAPab9+HDO+f0E31LvTy74CNGqpUuTf4TaAWDV0zusxEwOGXogTG9NxULb8vkYIj4z3yVAofvakEtAsi7J3J3Bg3hLxZY5REgQYkrg7FfMYq0BdgaSEJaefSVsvOYZkXR/3p7/LX+kUmBkC4/9HFp0+u775uJMG69mw5tnU/cbQWxQ9qLUetiy7GOjQMSaCTblPshK/+tED1YkWWoIE7Q0FSzpMMj2drIE6PUt3ysLj55/2JQbt4eGtTZiszBSEGI7UsiwvfgLN3g6zrmVwHVKWsCJmHhHc84fPRrNwfNlDxbvEmwSHHgaqb8MqGY41LczzGIg2gYMybGlhWw9+ullm/NHq5hndfQbX9C3SEi+N4/qVZtl/bt24ublk4kavVBk7xG/ApHu7V0YD10acvDnnwC7F6Q56E/0SlpQuUrA==
MIME-Version: 1.0
Content-Type: text/plain
X-MS-Office365-Filtering-Correlation-Id: 984e54bc-451c-4899-f209-08d455d5b8f5
X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:BN6PR03MB2947;
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2947;
 3:Zi0xWuuqNtZqz5PpxixyErtG5CnksZyhTPHT6/dSg741GYJJCDV70u8dbTwTCdLNaUQqPiPsrKXIhe/fVCQi+OtfePqEbR/YmIkFiX6evPhzr4Cb4OXQlKWvTOoxl6KYg0hfnQtUiJXQEYKwpzmMF2ZO7bZ2L9hV3bDuPvHhN8vppsco1RmBuTq9VmNzBpgTof10hKWJYCjTOd6Aiwz8nFWXkbXopRZ9timF6s8DQcTg9tsbWYymn6lxH3hd8G2T0pIwh36ZbGrbor3vMt5rtE0sYB5pVm+gJR/FDLivq9lPCIWGEGwb2gk7ZxsyM5ClguKlui6/B1HB6R117tpUoWuSqgyGTRlfhXHaOJLlAF/5CAxWUrjpeJK4KQ27dCNZ;
 25:p+ClTbpuWzEwZdTW4BLVuSfo9Lp8SUjdsM/WKGGWrnk/81MxCjQjCAXJXNTpQsnI7xrZpw1XHRILYLxPQZemK23mUb4Y3TCjb1jpghsKvgrdc7LgPZ1kYUwePksqbqPN8ePrzVLTkOUM1ajNEk4l/WEWp0QunwF6n5/lF2+ElbcjBfur2QAnywaE8kRaS8FMvY7y8MfyqziPRunIea6m1WKxyEcNJdFQK8g13KQVyK+efD5cvoH6VwZoa5IYtq+WgOWTu+TNwA/KdE2xT1v1+EscBBnBTSH/Fx151EGATiDCKX3ObvUdQpLAOPT6nhhzM/8Em0aGwTeq9ORvfk/cE7XwAz7LmuyoxdTy4OkRtE1yTZohtud/KnwzBX2C5gHmDAMb4+Gws0coJ+ONcyQkRO4WUQqgteYwgqDFQxY1Iz4nutNEzc0OdWanKz30w4UF//++6+lTLZzevD2P7KMtqg==
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2947;
 31:v9vgflbW6A5HCy69su29+Zy9Y/76Upp4fdzanq9/Vu5tyVBJWGfaFi62+QU0mDgIW1rxOsv4AjFFIEKvi9N4Q/o+5Z090UMY6QtpXznSyx74wurLXDnEvmBeheufiAW/feVf/pb9nf7eQn9vrHqfu+VbBDMawEMJGbSaFmaFrHlldqi4QFMWfd7NUewKuho/no8qJLdOsHrNt+V7x2UFkl6JXdpKwJl8+HQOQn5301B8IKTbOfNQPrjw2zUs7fBY9AphqXn0xZBZJ280dgSwRA==
X-Microsoft-Antispam-PRVS: <BN6PR03MB294771802966814D740672E6895B0@BN6PR03MB2947.namprd03.prod.outlook.com>
X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(275809806118684)(21532816269658); 
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(6095060)(601004)(2401047)(13018025)(13024025)(13023025)(13015025)(13017025)(5005006)(8121501046)(10201501046)(3002001)(6055026)(6096035)(20161123565025)(20161123556025)(20161123559025)(20161123563025)(20161123561025);
 SRVR:BN6PR03MB2947; BCL:0; PCL:0; RULEID:(400006); SRVR:BN6PR03MB2947; 
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2947;
 4:i6Epm8b8EcudcBaA6pJI/pSS1hortjQSa5eFMOb+O0fafK7j0bzCfD1eU46wDlZx89PTv/ZirnVJEvyGKvjjac/ZkwDZjaRCcVzVt5TzJEvtBBs3F8eEc0nZr1iRDqbWKpSOJkf7kOFb8uqgcBz5uoX5UOLeYWUPyuC/wNzy1MJilbzJXCckf1XFV20jys8DXw8uwFytvZROz827xpj4gIQ9m+4TIGljRLRbj/A69OdwLhh3MeS3idpJ1P0LRoxL/zXGBXuAz/hNXV34kelMQTA8kBIsv7z0UkXuLqBkBcZlp55wtH4vLSaU/098XEcZ5S6FGhJAdVHhwQ1kI704LYJ+Fm0bxF3d3eKZK+QaWzVCSSFN3LPm5Rqs2EwJc8vL/TzmEIedXD/iqc3el3yLDEZNJsNbyO96aXDrCgKgTpMMVxLcqjVBC+NNYxbp/XM4HlJv2TqhwQQMC14E42ftwRQBgNs3xyCMiQWtCSsw0hHwI3x/duVqsJ1wnKE+hMLo4EA1GxIyXCQRsRQMNg2qR3jBOttExzCkU7snXrAN0Y961p7NAYsdE5O/GToDGYeICv8cRbWWfujE+rLvt7gxYoJ7d2A6lNoXf4Sc0jFI43gTRjLrnWyKhxQfEcKnKuTPNxPFgh2OMIo7kCzc4CyYtro15L9NkJufbbVEGiJ72GcIIWIBe70eOQufn50h+Jso6HM/WvVBFEsEMFvDvNhXBx4P66K76cmD5UZZ8tLNb/9uId3BGzR8cIylh45S5GK7GDFtll9UTDFbz0psIA0HGAaVKAfGH4YmK3iguOl4G0HfF7gT47Yp2qCfPjR0eo3B
X-Forefront-PRVS: 021975AE46
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR03MB2947;
 23:jKVxQQMg3NEcmee3TabuUFEniWqWyiJW35c2eT0VT?=
 =?us-ascii?Q?IBFNh72Pr2nr/WlQu8Oj/gvrmXfnpX1un8Qpt3cgNYXumrhX7qyyKY1ZE4x6?=
 =?us-ascii?Q?7V2BApjlLt6GiXRlX77+0E4WNL3pbjzR90wxh9g7ltUCMMLdkpaWUhIDuuJm?=
 =?us-ascii?Q?CpqpzbgmXrFE1GdMS0oIkVtv7XgXyuY6PSwNPy0INh/q+XLkPKU8QLDBrSiO?=
 =?us-ascii?Q?C2CDcgTZixinMngLEjC42fAIKQES9OJ36hN/j/3uh3Z0ekY1t83Z8Aw5cabF?=
 =?us-ascii?Q?5q5Q2NqVXSbCMrWGnim4FVmDcTWuMM3zQ0GtQrxgefTxsOzmuXKVtnrgAi4y?=
 =?us-ascii?Q?7JRNe1WxgGHoQpkwyXAwtpnrlPvqTAOC1VS6KzCmahOlHy2Y2JjDhwv/Tj9j?=
 =?us-ascii?Q?4okEDxAfXp2Cjt9/g/KElfmwxHuZk5Ez1qtsGLdAeu1Y6QX6o4fDPpUWHBR0?=
 =?us-ascii?Q?jAwW/yqlS6WSlAK6JWyOD1mkkq8OiR4d9KUJg82zNztAJv/GJGi8IXtZ0YlZ?=
 =?us-ascii?Q?MOSpquZuZbazGgtedlBq0DdxjXuKU1jdYq2ho7j72+CI3KgDFz2v1w+FOrFj?=
 =?us-ascii?Q?mO78e2xydg4bGCL7ppNohPLj67hSz6Rfc2xWlim2bvunJAzmQ28i3pFNfXbD?=
 =?us-ascii?Q?SMqd6LliyfCpFBe86hNBWbb2r0G+z5ZL40xinT0s50k9sQXvy/kmHl6QWTUe?=
 =?us-ascii?Q?JZHYAmr6q5dHnkRKsf+KdQ2cuFyi6bL3XbzxuPrJVRZS49skSOzPqFM1ggvJ?=
 =?us-ascii?Q?x/F+V0dOuKUFOb64F/ZYaZjodkg6UrOgpl3IX3mM2HKY1vaQgYwIgzttfOjb?=
 =?us-ascii?Q?Maojx8mhHQNd0Yf2/B9pmGHZCQ7FGQr28QKbVozw6N2ezWEul3rSZDuJOY/U?=
 =?us-ascii?Q?KnN4yNp0i4DGFxSOiFETFRaEHIJgvOb1kyd76ILyLtdaIFD3R4Qs+MDjxYSQ?=
 =?us-ascii?Q?WtVFJRC0+H7nYob20g4CJavSyI/jS221udbdDdBZkKSyG1HlgM2txyNMCtm7?=
 =?us-ascii?Q?udd2llSKFZM611aXJ6epaj275stWBcywnGsh/sZaXYUaNoCL3AwaAUpL4Hfn?=
 =?us-ascii?Q?PrifGdI0k1Twuywsyay199kBjuRfVc9pnK9WmN9U+s3gQAClZ3GZuJHirncT?=
 =?us-ascii?Q?E5F7ngxVFzMkXQxR7L0Hsp5nl4SfCQNYiH3QkhVlsuSVVac49UkQtDIsS4kF?=
 =?us-ascii?Q?vSKBcEC/Ud/yBrxM13U4PJ0dJkmgVDwta31DY2NYc5N9zKHW4/vr56nTjlsJ?=
 =?us-ascii?Q?ARAS+awo1VyyVfvBjpJNrAaTShDNoJu5eqBYWCXvC48JumCtxR+frnSLk/rY?=
 =?us-ascii?Q?jBU+8jtgUYqsLOvjNR2H4LeJv+OxjMlXaROEvLFlujcgHEsdBuu6d5EhtI9c?=
 =?us-ascii?Q?XX5sA=3D=3D?=
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2947;
 6:7Xqu02kAjKhWGRbNF8taKQRMycePkqjTR6uuAP1hPQRqCYpsVJGLB5asg70+yBN47zLTGUOLL22j2yCm8e1uasf7W4ghc3S4AnJ80EDobGfZxoWxj5nCc8V+MKcZZO3sDgY8AM81htTHkPNd7q4c82uRfDj2GKD4jKQxAmZYKyIHJqvOAktEZL0Ud9C9UPba6ZiGHuo4MdkIPVybzkUSAkcNR1CEYo11wwdc55F9SfegDaN81g55lXD9zZKCFydXeimViQhGE0zu4HhIGJtE/9kaDwPL2L0WTLdLP7G7yjsIc+Lp5EuO5WLj0XoT/D4bgVPOa9HyHXzDn/bQmorY/n3s/ANmma+EP4f1Ked9tsds9xER/Y6QkL0ikzX0FYWH6obiyP4z3+t0d4+5MpIEcnrqFGxslj5w5QhdJSlXAbY=;
 5:LxsfAbEryGrpxTn3tJKdlpQ9N+fXvpHf01xroDh5FJS8c7lBx8477FSvet73ya6ONHtFnlovpsfYR/Xel+BtaceJxbiBwSN/948qQg5MOu31Ay9w+pFZMuZoShXp3tBhbACjcWihAQzJUSlV1WpihHUrQ3QwUf+Eix6OFPaaKKMglIf7wsIqGSqmy9gUyRvs;
 24:PpdrDbmhvoNSWIO8O+NhMfmoxEDjTpt/9dwFmtjErEwqqWA1PFOE/XZyoxJOmD7nfSv9QSFSxr2tZaKgTVNPMG2BX7Zm6N0aiulTEZoLRtE=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2947;
 7:JiJiYFzLVJ9kZKtd00lylhrh4u37x871oEUAOhHGgd+6bLLADRUaVBnvwn8/2bD/V6JaBMP+zuMeNf8oQBh73Bmlgx0AoxY1mNvPqTswUONvu9bNQMgGpdqmU5g50EUTmFvLHZrZ08W++2lVaNc2AM5PeEAOrpdUef8sdWAxjeBx6PZUYKYoycch6hck5Q5BFhcjBg7a7vuHBySuej1TJx1plAhCdIATGl3F9cbcM8hMaCw2MimRGGwqM4wnmwahEWfYv/m3DZ8zWc253AbAw2+RzFRfDnjZKSFbBIk0P7ek+KlZcbGV9bLE7lttyXo4GwsC6zGakJDW8RbJNn2CQg==
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2017 19:06:18.3731 (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: BN6PR03MB2947
Subject: [dpdk-dev] [PATCHv7 11/47] bus/fslmc: add vfio support
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Wed, 15 Feb 2017 19:06:21 -0000

Add support for using VFIO for dpaa2 based fsl-mc bus.

There are some differences in the way vfio used for fsl-mc bus
from the eal vfio.
 - The scanning of bus for individual objects on the basis of
   the DPRC container.
 - The use and mapping of MC portal for object access

With the evolution of bus model, they canbe further aligned with
eal vfio code.

Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 drivers/bus/fslmc/Makefile                  |   2 +
 drivers/bus/fslmc/fslmc_bus.c               |  10 +
 drivers/bus/fslmc/fslmc_vfio.c              | 450 ++++++++++++++++++++++++++++
 drivers/bus/fslmc/fslmc_vfio.h              |  74 +++++
 drivers/bus/fslmc/rte_bus_fslmc_version.map |   1 +
 5 files changed, 537 insertions(+)
 create mode 100644 drivers/bus/fslmc/fslmc_vfio.c
 create mode 100644 drivers/bus/fslmc/fslmc_vfio.h

diff --git a/drivers/bus/fslmc/Makefile b/drivers/bus/fslmc/Makefile
index 4a118a3..7cccc0e 100644
--- a/drivers/bus/fslmc/Makefile
+++ b/drivers/bus/fslmc/Makefile
@@ -41,6 +41,7 @@ CFLAGS += "-Wno-strict-aliasing"
 
 CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc
 CFLAGS += -I$(RTE_SDK)/drivers/bus/fslmc/mc
+CFLAGS += -I$(RTE_SDK)/lib/librte_eal/linuxapp/eal
 
 # versioning export map
 EXPORT_MAP := rte_bus_fslmc_version.map
@@ -55,6 +56,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += \
         mc/dpio.c \
         mc/mc_sys.c
 
+SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc_vfio.c
 SRCS-$(CONFIG_RTE_LIBRTE_FSLMC_BUS) += fslmc_bus.c
 
 # library dependencies
diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c
index 8a4f519..ee794e7 100644
--- a/drivers/bus/fslmc/fslmc_bus.c
+++ b/drivers/bus/fslmc/fslmc_bus.c
@@ -42,6 +42,7 @@
 #include <rte_ethdev.h>
 
 #include "rte_fslmc.h"
+#include "fslmc_vfio.h"
 
 #define FSLMC_BUS_LOG(level, fmt, args...) \
 	RTE_LOG(level, EAL, "%s(): " fmt "\n", __func__, ##args)
@@ -51,6 +52,15 @@
 static int
 rte_fslmc_scan(void)
 {
+	if (fslmc_vfio_setup_group()) {
+		FSLMC_BUS_LOG(ERR, "fslmc: Unable to setup VFIO");
+		return -1;
+	}
+	if (fslmc_vfio_process_group()) {
+		FSLMC_BUS_LOG(ERR, "fslmc: Unable to setup devices");
+		return -1;
+	}
+	RTE_LOG(INFO, EAL, "fslmc: Bus scan completed\n");
 	return 0;
 }
 
diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c
new file mode 100644
index 0000000..73db595
--- /dev/null
+++ b/drivers/bus/fslmc/fslmc_vfio.c
@@ -0,0 +1,450 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright (c) 2015-2016 Freescale Semiconductor, Inc. All rights reserved.
+ *   Copyright (c) 2016 NXP. All rights reserved.
+ *
+ *   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 Freescale Semiconductor, Inc 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 <unistd.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/vfs.h>
+#include <libgen.h>
+#include <dirent.h>
+#include <sys/eventfd.h>
+
+#include <rte_mbuf.h>
+#include <rte_ethdev.h>
+#include <rte_malloc.h>
+#include <rte_memcpy.h>
+#include <rte_string_fns.h>
+#include <rte_cycles.h>
+#include <rte_kvargs.h>
+#include <rte_dev.h>
+#include <rte_ethdev.h>
+#include <rte_bus.h>
+
+#include "rte_fslmc.h"
+#include "fslmc_vfio.h"
+
+#define VFIO_MAX_CONTAINERS	1
+
+#define FSLMC_VFIO_LOG(level, fmt, args...) \
+	RTE_LOG(level, EAL, "%s(): " fmt "\n", __func__, ##args)
+
+/** Pathname of FSL-MC devices directory. */
+#define SYSFS_FSL_MC_DEVICES "/sys/bus/fsl-mc/devices"
+
+/* Number of VFIO containers & groups with in */
+static struct fslmc_vfio_group vfio_groups[VFIO_MAX_GRP];
+static struct fslmc_vfio_container vfio_containers[VFIO_MAX_CONTAINERS];
+static int container_device_fd;
+void *(*rte_mcp_ptr_list);
+static uint32_t mcp_id;
+
+static int vfio_connect_container(struct fslmc_vfio_group *vfio_group)
+{
+	struct fslmc_vfio_container *container;
+	int i, fd, ret;
+
+	/* Try connecting to vfio container if already created */
+	for (i = 0; i < VFIO_MAX_CONTAINERS; i++) {
+		container = &vfio_containers[i];
+		if (!ioctl(vfio_group->fd, VFIO_GROUP_SET_CONTAINER,
+			   &container->fd)) {
+			FSLMC_VFIO_LOG(INFO, "Container pre-exists with"
+				    " FD[0x%x] for this group",
+				    container->fd);
+			vfio_group->container = container;
+			return 0;
+		}
+	}
+
+	/* Opens main vfio file descriptor which represents the "container" */
+	fd = vfio_get_container_fd();
+	if (fd < 0) {
+		FSLMC_VFIO_LOG(ERR, "Failed to open VFIO container");
+		return -errno;
+	}
+
+	/* Check whether support for SMMU type IOMMU present or not */
+	if (ioctl(fd, VFIO_CHECK_EXTENSION, VFIO_TYPE1_IOMMU)) {
+		/* Connect group to container */
+		ret = ioctl(vfio_group->fd, VFIO_GROUP_SET_CONTAINER, &fd);
+		if (ret) {
+			FSLMC_VFIO_LOG(ERR, "Failed to setup group container");
+			close(fd);
+			return -errno;
+		}
+
+		ret = ioctl(fd, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU);
+		if (ret) {
+			FSLMC_VFIO_LOG(ERR, "Failed to setup VFIO iommu");
+			close(fd);
+			return -errno;
+		}
+	} else {
+		FSLMC_VFIO_LOG(ERR, "No supported IOMMU available");
+		close(fd);
+		return -EINVAL;
+	}
+
+	container = NULL;
+	for (i = 0; i < VFIO_MAX_CONTAINERS; i++) {
+		if (vfio_containers[i].used)
+			continue;
+		FSLMC_VFIO_LOG(DEBUG, "Unused container at index %d", i);
+		container = &vfio_containers[i];
+	}
+	if (!container) {
+		FSLMC_VFIO_LOG(ERR, "No free container found");
+		close(fd);
+		return -ENOMEM;
+	}
+
+	container->used = 1;
+	container->fd = fd;
+	container->group_list[container->index] = vfio_group;
+	vfio_group->container = container;
+	container->index++;
+	return 0;
+}
+
+int vfio_dmamap_mem_region(uint64_t vaddr,
+			   uint64_t iova,
+			   uint64_t size)
+{
+	struct fslmc_vfio_group *group;
+	struct vfio_iommu_type1_dma_map dma_map = {
+		.argsz = sizeof(dma_map),
+		.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE,
+	};
+
+	dma_map.vaddr = vaddr;
+	dma_map.size = size;
+	dma_map.iova = iova;
+
+	/* SET DMA MAP for IOMMU */
+	group = &vfio_groups[0];
+	if (ioctl(group->container->fd, VFIO_IOMMU_MAP_DMA, &dma_map)) {
+		FSLMC_VFIO_LOG(ERR, "VFIO_IOMMU_MAP_DMA (errno = %d)", errno);
+		return -1;
+	}
+	return 0;
+}
+
+static int64_t vfio_map_mcp_obj(struct fslmc_vfio_group *group, char *mcp_obj)
+{
+	int64_t v_addr = (int64_t)MAP_FAILED;
+	int32_t ret, mc_fd;
+
+	struct vfio_device_info d_info = { .argsz = sizeof(d_info) };
+	struct vfio_region_info reg_info = { .argsz = sizeof(reg_info) };
+
+	/* getting the mcp object's fd*/
+	mc_fd = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, mcp_obj);
+	if (mc_fd < 0) {
+		FSLMC_VFIO_LOG(ERR, "error in VFIO get device %s fd from group"
+			    " %d", mcp_obj, group->fd);
+		return v_addr;
+	}
+
+	/* getting device info*/
+	ret = ioctl(mc_fd, VFIO_DEVICE_GET_INFO, &d_info);
+	if (ret < 0) {
+		FSLMC_VFIO_LOG(ERR, "error in VFIO getting DEVICE_INFO");
+		goto MC_FAILURE;
+	}
+
+	/* getting device region info*/
+	ret = ioctl(mc_fd, VFIO_DEVICE_GET_REGION_INFO, &reg_info);
+	if (ret < 0) {
+		FSLMC_VFIO_LOG(ERR, "error in VFIO getting REGION_INFO");
+		goto MC_FAILURE;
+	}
+
+	FSLMC_VFIO_LOG(DEBUG, "region offset = %llx  , region size = %llx",
+		     reg_info.offset, reg_info.size);
+
+	v_addr = (uint64_t)mmap(NULL, reg_info.size,
+		PROT_WRITE | PROT_READ, MAP_SHARED,
+		mc_fd, reg_info.offset);
+
+MC_FAILURE:
+	close(mc_fd);
+
+	return v_addr;
+}
+
+/* Following function shall fetch total available list of MC devices
+ * from VFIO container & populate private list of devices and other
+ * data structures
+ */
+int fslmc_vfio_process_group(void)
+{
+	struct fslmc_vfio_device *vdev;
+	struct vfio_device_info device_info = { .argsz = sizeof(device_info) };
+	char *temp_obj, *object_type __rte_unused, *mcp_obj, *dev_name;
+	int32_t object_id, i, dev_fd;
+	DIR *d;
+	struct dirent *dir;
+	char path[PATH_MAX];
+	int64_t v_addr;
+	int ndev_count;
+	struct fslmc_vfio_group *group = &vfio_groups[0];
+	static int process_once;
+
+	/* if already done once */
+	if (process_once) {
+		FSLMC_VFIO_LOG(DEBUG, "Already scanned once - re-scan "
+			    "not supported");
+		return 0;
+	}
+	process_once = 0;
+
+	sprintf(path, "/sys/kernel/iommu_groups/%d/devices", group->groupid);
+
+	d = opendir(path);
+	if (!d) {
+		FSLMC_VFIO_LOG(ERR, "Unable to open directory %s", path);
+		return -1;
+	}
+
+	/*Counting the number of devices in a group and getting the mcp ID*/
+	ndev_count = 0;
+	mcp_obj = NULL;
+	while ((dir = readdir(d)) != NULL) {
+		if (dir->d_type == DT_LNK) {
+			ndev_count++;
+			if (!strncmp("dpmcp", dir->d_name, 5)) {
+				if (mcp_obj)
+					free(mcp_obj);
+				mcp_obj = malloc(sizeof(dir->d_name));
+				if (!mcp_obj) {
+					FSLMC_VFIO_LOG(ERR, "mcp obj:Unable to"
+						    " allocate memory");
+					return -ENOMEM;
+				}
+				strcpy(mcp_obj, dir->d_name);
+				temp_obj = strtok(dir->d_name, ".");
+				temp_obj = strtok(NULL, ".");
+				sscanf(temp_obj, "%d", &mcp_id);
+			}
+		}
+	}
+	closedir(d);
+
+	if (!mcp_obj) {
+		FSLMC_VFIO_LOG(ERR, "DPAA2 MCP Object not Found");
+		return -ENODEV;
+	}
+	RTE_LOG(INFO, EAL, "fslmc: DPRC contains = %d devices\n", ndev_count);
+
+	/* Allocate the memory depends upon number of objects in a group*/
+	group->vfio_device = (struct fslmc_vfio_device *)malloc(ndev_count *
+			     sizeof(struct fslmc_vfio_device));
+	if (!(group->vfio_device)) {
+		FSLMC_VFIO_LOG(ERR, "vfio device: Unable to allocate memory\n");
+		free(mcp_obj);
+		return -ENOMEM;
+	}
+
+	/* Allocate memory for MC Portal list */
+	rte_mcp_ptr_list = malloc(sizeof(void *) * 1);
+	if (!rte_mcp_ptr_list) {
+		FSLMC_VFIO_LOG(ERR, "portal list: Unable to allocate memory!");
+		free(mcp_obj);
+		goto FAILURE;
+	}
+
+	v_addr = vfio_map_mcp_obj(group, mcp_obj);
+	free(mcp_obj);
+	if (v_addr == (int64_t)MAP_FAILED) {
+		FSLMC_VFIO_LOG(ERR, "Error mapping region (errno = %d)", errno);
+		goto FAILURE;
+	}
+
+	FSLMC_VFIO_LOG(DEBUG, "DPAA2 MC has VIR_ADD = %ld", v_addr);
+
+	rte_mcp_ptr_list[0] = (void *)v_addr;
+
+	d = opendir(path);
+	if (!d) {
+		FSLMC_VFIO_LOG(ERR, "Unable to open %s Directory", path);
+		goto FAILURE;
+	}
+
+	i = 0;
+	FSLMC_VFIO_LOG(DEBUG, "DPAA2 - Parsing devices:");
+	/* Parsing each object and initiating them*/
+	while ((dir = readdir(d)) != NULL) {
+		if (dir->d_type != DT_LNK)
+			continue;
+		if (!strncmp("dprc", dir->d_name, 4) ||
+		    !strncmp("dpmcp", dir->d_name, 5))
+			continue;
+		dev_name = malloc(sizeof(dir->d_name));
+		if (!dev_name) {
+			FSLMC_VFIO_LOG(ERR, "name: Unable to allocate memory");
+			goto FAILURE;
+		}
+		strcpy(dev_name, dir->d_name);
+		object_type = strtok(dir->d_name, ".");
+		temp_obj = strtok(NULL, ".");
+		sscanf(temp_obj, "%d", &object_id);
+		FSLMC_VFIO_LOG(DEBUG, " - %s ", dev_name);
+
+		/* getting the device fd*/
+		dev_fd = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, dev_name);
+		if (dev_fd < 0) {
+			FSLMC_VFIO_LOG(ERR, "VFIO_GROUP_GET_DEVICE_FD error"
+				    " Device fd: %s, Group: %d",
+				    dev_name, group->fd);
+			free(dev_name);
+			goto FAILURE;
+		}
+
+		free(dev_name);
+		vdev = &group->vfio_device[group->object_index++];
+		vdev->fd = dev_fd;
+		vdev->index = i;
+		i++;
+		/* Get Device inofrmation */
+		if (ioctl(vdev->fd, VFIO_DEVICE_GET_INFO, &device_info)) {
+			FSLMC_VFIO_LOG(ERR, "DPAA2 VFIO_DEVICE_GET_INFO fail");
+			goto FAILURE;
+		}
+	}
+	closedir(d);
+
+	return 0;
+
+FAILURE:
+	free(group->vfio_device);
+	group->vfio_device = NULL;
+	return -1;
+}
+
+int fslmc_vfio_setup_group(void)
+{
+	struct fslmc_vfio_group *group = NULL;
+	int groupid;
+	int ret, i;
+	char *container;
+	struct vfio_group_status status = { .argsz = sizeof(status) };
+
+	/* if already done once */
+	if (container_device_fd)
+		return 0;
+
+	container = getenv("DPRC");
+
+	if (container == NULL) {
+		FSLMC_VFIO_LOG(ERR, "VFIO container not set in env DPRC");
+		return -1;
+	}
+	/* get group number */
+	ret = vfio_get_group_no(SYSFS_FSL_MC_DEVICES, container, &groupid);
+	if (ret == 0) {
+		RTE_LOG(WARNING, EAL, "%s not managed by VFIO, skipping\n",
+			container);
+		return 1;
+	}
+
+	/* if negative, something failed */
+	if (ret < 0)
+		return -1;
+
+	FSLMC_VFIO_LOG(DEBUG, "VFIO iommu group id = %d", groupid);
+
+	/* Check if group already exists */
+	for (i = 0; i < VFIO_MAX_GRP; i++) {
+		group = &vfio_groups[i];
+		if (group->groupid == groupid) {
+			FSLMC_VFIO_LOG(ERR, "groupid already exists %d",
+				       groupid);
+			return 0;
+		}
+	}
+
+	/* get the actual group fd */
+	group->fd = vfio_get_group_fd(groupid);
+	if (group->fd < 0)
+		return -1;
+
+	/*
+	 * at this point, we know that this group is viable (meaning,
+	 * all devices are either bound to VFIO or not bound to anything)
+	 */
+
+	if (ioctl(group->fd, VFIO_GROUP_GET_STATUS, &status)) {
+		FSLMC_VFIO_LOG(ERR, " VFIO error getting group status");
+		close(group->fd);
+		return -1;
+	}
+	if (!(status.flags & VFIO_GROUP_FLAGS_VIABLE)) {
+		FSLMC_VFIO_LOG(ERR, "VFIO group not viable");
+		close(group->fd);
+		return -1;
+	}
+	/* Since Group is VIABLE, Store the groupid */
+	group->groupid = groupid;
+
+	/* check if group does not have a container yet */
+	if (!(status.flags & VFIO_GROUP_FLAGS_CONTAINER_SET)) {
+		/* Now connect this IOMMU group to given container */
+		if (vfio_connect_container(group)) {
+			FSLMC_VFIO_LOG(ERR, "VFIO error connecting container"
+				       " with groupid %d", groupid);
+			close(group->fd);
+			return -1;
+		}
+	}
+
+	/* Get Device information */
+	ret = ioctl(group->fd, VFIO_GROUP_GET_DEVICE_FD, container);
+	if (ret < 0) {
+		FSLMC_VFIO_LOG(ERR, "VFIO error getting device %s fd from"
+			       " group  %d", container, group->groupid);
+		return ret;
+	}
+	container_device_fd = ret;
+	FSLMC_VFIO_LOG(DEBUG, "VFIO Container FD is [0x%X]",
+		     container_device_fd);
+
+	return 0;
+}
diff --git a/drivers/bus/fslmc/fslmc_vfio.h b/drivers/bus/fslmc/fslmc_vfio.h
new file mode 100644
index 0000000..5e58211
--- /dev/null
+++ b/drivers/bus/fslmc/fslmc_vfio.h
@@ -0,0 +1,74 @@
+/*-
+ *   BSD LICENSE
+ *
+ *   Copyright (c) 2015-2016 Freescale Semiconductor, Inc. All rights reserved.
+ *   Copyright (c) 2016 NXP. All rights reserved.
+ *
+ *   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 Freescale Semiconductor, Inc 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 _FSLMC_VFIO_H_
+#define _FSLMC_VFIO_H_
+
+#include "eal_vfio.h"
+
+#define DPAA2_VENDOR_ID		0x1957
+#define DPAA2_MC_DPNI_DEVID	7
+#define DPAA2_MC_DPSECI_DEVID	3
+
+#define VFIO_MAX_GRP 1
+
+typedef struct fslmc_vfio_device {
+	int fd; /* fslmc root container device ?? */
+	int index; /*index of child object */
+	struct fslmc_vfio_device *child; /* Child object */
+} fslmc_vfio_device;
+
+typedef struct fslmc_vfio_group {
+	int fd; /* /dev/vfio/"groupid" */
+	int groupid;
+	struct fslmc_vfio_container *container;
+	int object_index;
+	struct fslmc_vfio_device *vfio_device;
+} fslmc_vfio_group;
+
+typedef struct fslmc_vfio_container {
+	int fd; /* /dev/vfio/vfio */
+	int used;
+	int index; /* index in group list */
+	struct fslmc_vfio_group *group_list[VFIO_MAX_GRP];
+} fslmc_vfio_container;
+
+int vfio_dmamap_mem_region(
+	uint64_t vaddr,
+	uint64_t iova,
+	uint64_t size);
+
+int fslmc_vfio_setup_group(void);
+int fslmc_vfio_process_group(void);
+
+#endif /* _FSLMC_VFIO_H_ */
diff --git a/drivers/bus/fslmc/rte_bus_fslmc_version.map b/drivers/bus/fslmc/rte_bus_fslmc_version.map
index c4b3408..23aff2e 100644
--- a/drivers/bus/fslmc/rte_bus_fslmc_version.map
+++ b/drivers/bus/fslmc/rte_bus_fslmc_version.map
@@ -47,6 +47,7 @@ DPDK_17.02 {
         dpseci_set_rx_queue;
         rte_fslmc_driver_register;
         rte_fslmc_driver_unregister;
+        rte_mcp_ptr_list;
 
 	local: *;
 };
-- 
1.9.1