From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <hemant.agrawal@nxp.com>
Received: from NAM01-BY2-obe.outbound.protection.outlook.com
 (mail-by2nam01on0088.outbound.protection.outlook.com [104.47.34.88])
 by dpdk.org (Postfix) with ESMTP id DA48CF60C
 for <dev@dpdk.org>; Tue, 17 Jan 2017 14:19:53 +0100 (CET)
Received: from CY4PR03CA0022.namprd03.prod.outlook.com (10.168.162.32) by
 MWHPR03MB2477.namprd03.prod.outlook.com (10.169.200.147) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id
 15.1.860.13; Tue, 17 Jan 2017 13:19:52 +0000
Received: from BL2FFO11FD033.protection.gbl (2a01:111:f400:7c09::118) by
 CY4PR03CA0022.outlook.office365.com (2603:10b6:903:33::32) with Microsoft
 SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12 via
 Frontend Transport; Tue, 17 Jan 2017 13:19:52 +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;nxp.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
 BL2FFO11FD033.mail.protection.outlook.com (10.173.161.129) with Microsoft
 SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id
 15.1.803.8 via Frontend Transport; Tue, 17 Jan 2017 13:19:51 +0000
Received: from bf-netperf1.idc ([10.232.134.28])
 by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v0HDJ8mI021741;
 Tue, 17 Jan 2017 06:19:48 -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>, Hemant Agrawal
 <hemant.agrawal@nxp.com>
Date: Wed, 18 Jan 2017 00:22:32 +0530
Message-ID: <1484679174-4174-12-git-send-email-hemant.agrawal@nxp.com>
X-Mailer: git-send-email 1.9.1
In-Reply-To: <1484679174-4174-1-git-send-email-hemant.agrawal@nxp.com>
References: <1482988612-6638-1-git-send-email-shreyansh.jain@nxp.com>
 <1484679174-4174-1-git-send-email-hemant.agrawal@nxp.com>
X-EOPAttributedMessage: 0
X-Matching-Connectors: 131291327917735472;
 (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)(7916002)(336005)(39840400002)(39410400002)(39850400002)(39450400003)(39400400002)(39860400002)(39380400002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(104016004)(36756003)(85426001)(81156014)(106466001)(92566002)(4326007)(626004)(47776003)(68736007)(2906002)(50466002)(6666003)(50226002)(6916009)(2950100002)(33646002)(2351001)(110136003)(48376002)(97736004)(105606002)(8936002)(8676002)(81166006)(50986999)(77096006)(38730400001)(76176999)(305945005)(356003)(5660300001)(189998001)(8656002)(86362001)(30001)(54906002)(5003940100001);
 DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR03MB2477; H:tx30smr01.am.freescale.net;
 FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; 
X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD033;
 1:tnliQDgDtcFCBDCfH0WYGBzM00jH5l7PmiwIv0/vN+9CBZrDBlGBNcnGOBEpnX++Atx/E0CT9i4SVUJQSyk4XNrNV/ZfCxYPTIQhqPa6kAJCLcVMK1ia0mKnaIxNJgT5JXJyCPab8nNbxYtO6ZAQnm9JQ5XobdrmjzErTwXL68lZohpbeJb+hoTIOKypfc3tQwy0EvGKgIyvQ+ZiHKt0mFsZMxK8sqSoYKfnOGva4VaILLtWHY4gHkfg+WlTXp0UH+wi0AsttmbV1ielK1WvR7PhC9CNnd4crKhdWMIfLoEk7nWJOOTeeqm+X1FDX/SGf8sii0fRjr3TAdIZPFWouuTIUnAAIBPc1LTqmsiKhzBGZQq9d54MYolIqu+Q8nz111IwgbK3E3QGGK2q6LQVVsWn4awXYv4V9Nx1aeopHLUIjh6RTcYLfBjTLN4SjNr7Yi4kG5x/iRxV9A8q7xwJ+KIi05tZ5gC4+cBq0zrv5ux6Aev4+tqOJmFxM/WSchD3fW0dxXtIg3jY+Sjv4klX45CkKI1uHV4ellH/JrNAXVqU40GsPTOoaNpRAQ0uz+H1DsrSF+K8gBnsnwMxtjn4a8ES9vsrZxqbjEkkUZ8lcGwCYQiNwyqZFRmYB3CpWHwe6o4BI+J7rhFZlEa0CqFbiK3WCCuX/Yk5dpXNLCc6VRd3l7V9UywY8FDQLyusp4dV4wy/Lya6uFjAkKljddZ3o5nlS3wBNWHANSlon7MpkoB7EW29Uw9Y2rQMruz6rB+u
MIME-Version: 1.0
Content-Type: text/plain
X-MS-Office365-Filtering-Correlation-Id: ea02bff1-f045-4959-dccf-08d43edb8514
X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:MWHPR03MB2477;
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2477;
 3:nE4Sc//LeaqYsspducvAKCmnfaPsbvFeQwDvKonmS4iqTKR2dQbRqWRo3b4Jnfp4OdhpVxIPxJ4u9lPtOYSIytAA0PFUO1wcv9y/eZsgCZx8UPkdm9GU8HLTPZBG8qrOdqNTvGrriKGJKxZqW3d40tANiiTq00jf0+5IuXVeSiw4RF44P8Bo7/ULzf01xBSb30K3Z3CK7vNhMJKA4KsJ6TRod91AenrqCrhAJ3TwJz8zwYFPhTrmSdolH65TOXA5/P/o/V2wylm3A/kBOscX3BMACM1BDHZnqic5p5NyiPhxVYswmq+2TUAFWNquGB5Ls1zOJGhebzgKs9WO6x5vtNDpdUtIMZjhNL2jwLjbs/iPEWiuF14IkmHuM2mnE27B;
 25:ZwbwrtcYPz/p/dr+LldAG3OvbDyqKPGou8M1m7iLr4VgEwiP3elzJ/mcfwhTytdT4LXayqW7KHUbE+56U9DahBfGLipp+FBSE6fp1P/6TuI+DI/lNo3Otada2uvsLZ9+fzTb6IFobVC5LgiUO0UYmG7n758B/b9F++1FKKxd28tKWaKjv5I9rWLu0y52CogOd6K15Yfh7NKgNQZ1H5bYAXOR5FzIsUZ7Nqj4X7o6twFonKJt4U7orr/TAjmWimfmfaWucFo74Uy0sE8lqREjT2XDI5ilrGDw2VA+PIeLNXKpPhxHetP5P9MOVBvyJWR6h3PMflyH6nfUE0pzty/s8l8rKK4dw043Et4ZY/zK8Y6kNdftRRDCD8Ac+00/a5eeWxqXZ61EAD809ZBWg5PJJhcsU+D4o8w3TVgeUtRkmSLzq+eodAzR51hrWChD1i5aHlTgMeTye2PksYaVKVkXwQ==
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2477;
 31:H3wsimHbDKg6qfpkJXdWqufR9XBGsMPZGdWBG3AmaQw+0g0obuPvb63GERMVrk0azsGJ4SJKrrTZH3ymwZa7sHWwIc/Je2PQqgHWNwKkoR1uL9bkL6h38oBkUH6UE732zkj99LDvusQQDFZfpLvO6ozDdlDEaVHvLaOWe46yvx5OMsEzAnivefOBmxwx02yI0re/nF7/828yF5MWRZmLI4WTAE4bSBPTfj/WAAyK40TCNMmeoRZMZpfnV5cWRPTNj4OJWhU9Gcxxc52+cZRlBTUvmudgaell094V71SrIZY=
X-Microsoft-Antispam-PRVS: <MWHPR03MB2477196C6A6E6F06692616DE897C0@MWHPR03MB2477.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)(13023025)(13017025)(13015025)(13024025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6096035)(20161123561025)(20161123559025)(20161123556025)(20161123563025)(20161123565025);
 SRVR:MWHPR03MB2477; BCL:0; PCL:0; RULEID:(400006); SRVR:MWHPR03MB2477; 
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2477;
 4:4HUjdyIa/dcRwKdkDDNnxXf5ukd5NUrIlPRPYDC3xmxJZo6AnXGJS2WmUhy2gomZ0nKDSiNLH/SIZluz9y3FuFjcExkc65PE0ligfAE4vuhrtd6bTq4hT9mApolL1HmI9YFgYNh0ZapUTXdCgE9Fq+YivzGjDreVotPWyr8Hh4xRkyqjRXPCKWR5IPt8TxwvjtYhMH5E4eN5apnauPlQp0yhfOFcGlvNNUBSFnu38ZPpvD30M3YUxDTAYZgq0ggtOYNOrTg35+9UztJ7N44WrlsAEB4FwAABDdsLQWQnNYu7CnJ6HhxKGjFkrdiT45x1Arw+47APBcr0b6DTmImrWl3pUSfouP4745UUsLsX78IPazfjYgnEw/YnCM8DMi0p0k/njCAXUMkTuG9HLCT8LMr5dadwJiv6plXdJhRzadN1Sdl/T41BimWrg1gGoMVud0lGjLoqCvLGmn5UVuxWjubtVAELHjp5wALcQSJWP+xvwUWOrR6f3LoFHOxkeadlyM1IT9XzhHZAm1flXME3nYt54IJl8Pv+0qzYeshXjCytDCPYXG60tmzqrwHnvfU10w0LCcdKJ9nDJsr5VcwK20P18/bDDJ3tK2zHqguMEev9GUndUCbQyllMcXrLMpmCLF9jsDGR0tOrINsiutV0zt3gEqF29dBSf7drd0zP7bk7ekDzZ+fruqv+4oZH7CusitW5GkJlSnBj1zhlGu4HiePj0r+t4SDkSZ3XU1sRNu17JKvziSqVhsaaVEwcIdiQIP8DPSPmrQmdFmv+gf4kIzMJsYCyYrCVHqeLz6NrnAmpMrezH0wf/o+slxkP+tV7
X-Forefront-PRVS: 01901B3451
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR03MB2477;
 23:F7Fr2JDxqPEoAMn88CnaUnGHjFARw3VwtipFm0EYZ?=
 =?us-ascii?Q?9G1X0aNaPEnIPqfRJb6LdBhsSB+8rawyYWs+vQ2Fj8ICcSW7HObLH9iwnD+V?=
 =?us-ascii?Q?zpHH5YdjS5t7D7URsT9Q0znIYZNFYkF/wcOcyD1UNy7M7C9oG6uyivVKB/TJ?=
 =?us-ascii?Q?e+/Whr+ffHw/qdauEaF5hgrBHPtzYFmjZoPXanb+6XRMC5ftX7Tw1gWeYJ66?=
 =?us-ascii?Q?tRm0O+gbxHLipLjy8P2UqSXLEwd8JTjzTCM6mzvuCRuf0R/294vKFsnjxuKD?=
 =?us-ascii?Q?lZXm+PEE01o1ZYQggysR2WWayUGk/Zw/wfXXXWVUiIRMDy9Yj3k9SAa00NVa?=
 =?us-ascii?Q?Aw+dJUhpTt+ICjiF1flDGxE3SETqvWCcGsia91bbXZj+BsJStIHQDfz+tjeY?=
 =?us-ascii?Q?YHbtf/ZO+rQ7X3kMFOlfXjB2r4Qju3ltFOlM+c75YK2RgWVsfPiRpSiekVQM?=
 =?us-ascii?Q?tyPH5if/qKVIRseKaqpT+n0ULnGJkiNuzfw0c0zBupLzviHpcx3jF0aqw3r/?=
 =?us-ascii?Q?dfdd4iO9PwPTxmCsN5Pd51QeBRCW5kiAUTFc/28dugO9QdyVz+v7xhYyMw+c?=
 =?us-ascii?Q?R9a6hOGX49lP/51G2iDSCE9TEzcC2isAd0IZdaHPMOnEwLXHengf1CYAD5am?=
 =?us-ascii?Q?VXRQOZI8zB5Yla0koHg0zLi8B/XOI9IfhX/oE1CQeV0539Bmz+QUpOH4H0ww?=
 =?us-ascii?Q?n/4EmDGKLG0k6LX2sLGAomJaHUSVd4/uq6P8Z+rZtVcfG2flDgTtOuSm+ZpP?=
 =?us-ascii?Q?RQMNLPWkMe9n8gbHKmdB5tIrp+yCJYBJ41TuGbBpLER4McSRe6VLXX/aNS+7?=
 =?us-ascii?Q?IqU0YiAwMos3zBnMjyoCsfwOGT5OyJdzhK5E+ZF7lbhkVx7dKrFuUtRpr3FM?=
 =?us-ascii?Q?4xgASuz+eWemhGtDmxMWvrAyEe7rsq55GZ+C6y785aJ+PEgYDqMaU4RMQnul?=
 =?us-ascii?Q?t53ZcKfSPwMpYRi/H/mIcD7bUAHj6FQfKpAVWWH+YvYQGJDOJ1+BlK9QukRe?=
 =?us-ascii?Q?kDkPn4JnF6WUuBQFDQPhWuzEpqGr8jp/H03X+Tx3ESAKphqdhRv5J6cqXPO/?=
 =?us-ascii?Q?xfGHA3+oOj94zY3iNAjVp8W022BJ86IjnwmLCWTXpmNOFzHM2hCQy2qA1MQw?=
 =?us-ascii?Q?8DS0r9uyvGbBDUyvIPGupNJpkCbLk3MDJPO/M4+bNln8E3N4H6wWeapQoKQI?=
 =?us-ascii?Q?GXCuYMw1HPtKGsadfGP1b+Wooo2H2aoH/QjhP/pmxceFVHHzkY8lHghrGFrz?=
 =?us-ascii?Q?jAjLxlA/4VjGGoEiXSiIMe/x6EvikY3RzRhksAUBdejKB8/U+J2dYm3n+AhN?=
 =?us-ascii?B?dz09?=
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2477;
 6:fK8XTtIZ5j0PB/DGudtrCkfLjAncs/B5G6PQxE+TmbU9L/R+lEb4qcZ7sPBDx5ugBozBtC4Gpb9VS6rQNhvZWt4u5lQCwbK3IAoq5uYOoyX/5JSxi8f399daTQXB5OTSQHpTpNoanjUXyO98fCDALLquLfeBr4qP9Ih2VzlrjM8Yal0h+Radm8P0Tmgm9HMzcYuyryoKOf+LSr/JIggCl6kuRo3KAlol6k5OLSK2QM4yvbxn9l5ZzlNhWJxStqP+uQQa6vW7T7kMS3bB/TRHJfpRSoHP/fAuGj1XIb8a2sG6Cz66lcllNFtz17RyAJ5QlWqDYAWt/hK6tnS5y/LhjNCHaDeeqwq5ojR9TGFFPv72MWRRO0P8vXyeRf1mZUh5wJORsEdPTgBcFKNqlIbPXvbgawMTdmhbST3YRLZJ37vT5pjeGXUrQq1uu/umE0pQ;
 5:rp52/46SD53sDkA87gx3oa48dnwhZD0ZCUcKILil+9QrrXhbBiuosRPbLPAP9AeZMlj1WZcezRRxZbkWV2BRVnJPC3Q+Ma2XT66leWo42xh07E5Ofc7AlnWeZTWhOXrlL2a4e76MkDoLecVafttOS4pmWKS2eybJYFVLGVU5veKEe9EA9IFHdEoWsUxDld0b;
 24:vIUIzdk6QhXrD3+8lY1OyuRB9I/JlAnRRFQ7RjE6JSL081GMmaX93Pc8JDV9v1JzCq0Gl7u+Pg3CI3Ty4q8g7x0r/ivCngJngZV64G0TwME=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-Microsoft-Exchange-Diagnostics: 1; MWHPR03MB2477;
 7:nwvL5CeQ+ztsH+ErV2oo8WnQmL1njQ77qBONffL0ON1luM1p5d8Xoj1Wi1OIGB1wyWwV7HZx9z0cUyYGSdemc8P4HDfhsrgWGm8oXRxZRlVc3f+sUN/d/tPx/3e4/chKhaov+ZrOhFxdpWapK6aoEAJfuSwaYO8ZaZi03Hp7Y+s+8k/W/37vpWRJnrooxFjaMc9EDx8eaJCjZbww+GdflpelL/gekOp492f5xN1UsilfNHnfiAYHF2Ls5oG4VNVh+V87PQoWYVMp31jOkbtLo4YhxdfDirhobJjgGOujKTXxPy95jJByzAW+S2EC9iLAq/F6GQLuc6Cqf7/m6uc5T3yWDlOEzBX8TxrVJA6SzgO/8U+e4UOWaaagnwlgUIM+zb1Kk73ee3iy5mgUHMTyTOW39Jtc5fbMRiOmsyJepf7FldPHqohl0J+o4Xsffy9lo0YX/4tO3ekQ0UiKzlRWVA==
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2017 13:19:51.5863 (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: MWHPR03MB2477
Subject: [dpdk-dev] [PATCHv4 11/33] 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: Tue, 17 Jan 2017 13:19:54 -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>
---
 doc/guides/nics/features/dpaa2.ini             |   1 +
 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_pmd_fslmcbus_version.map |   2 +
 6 files changed, 539 insertions(+)
 create mode 100644 drivers/bus/fslmc/fslmc_vfio.c
 create mode 100644 drivers/bus/fslmc/fslmc_vfio.h

diff --git a/doc/guides/nics/features/dpaa2.ini b/doc/guides/nics/features/dpaa2.ini
index b2ad6ec..b176208 100644
--- a/doc/guides/nics/features/dpaa2.ini
+++ b/doc/guides/nics/features/dpaa2.ini
@@ -4,5 +4,6 @@
 ; Refer to default.ini for the full list of available PMD features.
 ;
 [Features]
+Linux VFIO           = Y
 ARMv8                = Y
 Usage doc            = Y
diff --git a/drivers/bus/fslmc/Makefile b/drivers/bus/fslmc/Makefile
index e422861..a5a05de 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_pmd_fslmcbus_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 7efda07..f967d17 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..d51e33a
--- /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 *(*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 */
+	mcp_ptr_list = malloc(sizeof(void *) * 1);
+	if (!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);
+
+	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_pmd_fslmcbus_version.map b/drivers/bus/fslmc/rte_pmd_fslmcbus_version.map
index c4b3408..411200c 100644
--- a/drivers/bus/fslmc/rte_pmd_fslmcbus_version.map
+++ b/drivers/bus/fslmc/rte_pmd_fslmcbus_version.map
@@ -45,8 +45,10 @@ DPDK_17.02 {
         dpseci_open;
         dpseci_reset;
         dpseci_set_rx_queue;
+        mcp_ptr_list;
         rte_fslmc_driver_register;
         rte_fslmc_driver_unregister;
+        vfio_dmamap_mem_region;
 
 	local: *;
 };
-- 
1.9.1