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-sn1nam01on0063.outbound.protection.outlook.com [104.47.32.63])
 by dpdk.org (Postfix) with ESMTP id 860F758CD
 for <dev@dpdk.org>; Mon, 23 Jan 2017 13:00:50 +0100 (CET)
Received: from BN6PR03CA0033.namprd03.prod.outlook.com (10.175.124.19) by
 BN6PR03MB2465.namprd03.prod.outlook.com (10.168.223.19) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id
 15.1.860.13; Mon, 23 Jan 2017 12:00:47 +0000
Received: from BY2FFO11FD044.protection.gbl (2a01:111:f400:7c0c::169) by
 BN6PR03CA0033.outlook.office365.com (2603:10b6:404:10c::19) with Microsoft
 SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.860.13 via
 Frontend Transport; Mon, 23 Jan 2017 12:00:47 +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
 BY2FFO11FD044.mail.protection.outlook.com (10.1.14.229) with Microsoft SMTP
 Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.803.8
 via Frontend Transport; Mon, 23 Jan 2017 12:00:46 +0000
Received: from bf-netperf1.idc ([10.232.134.28])
 by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v0NC07eY019311;
 Mon, 23 Jan 2017 05:00:43 -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: Mon, 23 Jan 2017 17:29:40 +0530
Message-ID: <1485172803-17288-11-git-send-email-hemant.agrawal@nxp.com>
X-Mailer: git-send-email 1.9.1
In-Reply-To: <1485172803-17288-1-git-send-email-hemant.agrawal@nxp.com>
References: <1484832240-2048-1-git-send-email-hemant.agrawal@nxp.com>
 <1485172803-17288-1-git-send-email-hemant.agrawal@nxp.com>
X-EOPAttributedMessage: 0
X-Matching-Connectors: 131296464464566765;
 (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)(39400400002)(39860400002)(39850400002)(39410400002)(39380400002)(39450400003)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(77096006)(36756003)(54906002)(81156014)(81166006)(5660300001)(4326007)(38730400001)(189998001)(50466002)(8676002)(50226002)(47776003)(626004)(8936002)(575784001)(86362001)(110136003)(85426001)(2906002)(48376002)(356003)(97736004)(8656002)(305945005)(68736007)(92566002)(33646002)(2351001)(5003940100001)(104016004)(106466001)(50986999)(2950100002)(6916009)(105606002)(76176999)(53936002);
 DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR03MB2465; H:tx30smr01.am.freescale.net;
 FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; 
X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD044;
 1:dsUpTGrXkgrvql4y1aOFQkJcNCO1S2qIpfVJBuXBh8QxUaTF1/TVr1EJgCFbQbpK2PsFybdtWT+6Ki7pXMOZf6lUgyOgI5Rrhd/9PXTHU2mbA7ptw7a29BD6lz+qhRa6q58GeLakomhZhDFIMg/XTZ6y2LgPaZh1EnH/VNgPesy6HxU+iBX3WOIROmh3rVJePFFWj82XmE/bp+FtrasOncIeLh3+B3xyZaW7iG1AGbsu7EZYkIgA6nI08DD/ig3ur9Qxwxrbv7kyAumCg4MzZGGbX+YaLYkxvxUnIzMHa/kAg29Kjf+WWXIf2qAUPZaSIVIAO4KA6/tfD9jOrkTlTIHFAaxF38hQ9OyDvQBQ929lvveJw826/dPNwwlmoTUMG6dEShCSt+wXF8P2+ZekzbQazrtXwGTP13k1DoAQeWws0HPgNbJeo9viXqFpBEMauIauLLNW6rVsCKnv89Tvq+kn5Q3w7tEDQ4I2LLN5PMykLQUvfm/99w/cjldZd6za1+etRa+H8PYXLHzmUU4kQSMVQPtzyhD2TO3Awx9HDe2L46eo6J5yMWMwgZ7n0RKuHogpcgF63OJvzvhjL31lulQxuTTg5bT78jxauYngjHsWE5BQzMq7VDUUlbO7JlZ5C2O/VEd6SRUReNHFXVILQeqlbhQpAIK8NENYc3cz5bO4FifnqZrfBHzzeHw2oYfAXs6sTApkBGX9SFmnd1LQTb+spNK8GXIMjrZQCLFEQmIP12oHnEI3dbcy7XDYSAGE
MIME-Version: 1.0
Content-Type: text/plain
X-MS-Office365-Filtering-Correlation-Id: 108243fa-a226-4a4c-d9ed-08d443877723
X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:BN6PR03MB2465;
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465;
 3:ZVNRJdTz+u5rDDQ5FuFeHO1+JpsrpxkR6XsqMULuoGSwckWQQjHQEPau4q4q5/yoGJiSUGrQnckxtaEODbDfyFB4is8ZhZLuABK1gqKxcRtyUB2I7gvh5oyEupAt7RKZnHIS067KeL491/KXpYlTdK8BFLkuk3PWqBEuXWon1QMpyal2SODRLrXaVX2Ct2oYFjmqUDCtXQkOfuWbJA9C3sH1SfXWkgjFdqGL4q644V2IxeUYHJNAfSOA935En1xYsBrqS+XDh2Xqw5/uGmX9A/89AmxHJJRtd0IolOvnCbKX+pO7rX/TB/1QYHFTAWrPbbRbSEa3e2iy4papwxwk0KayFXBfJuIqqAu/duoJjjVQ4r3KtrJbHiPBoeYqT+uK;
 25:xLTbW48GP8CHDum1pIeq5Xz9/W7QfMPUDGzEWdsR08lg+T9yNaAYlJ61uzkTpZjH2Gox7/iSUi8LjVCUbmlBFq/SZ+w9kj3jL50oF+U8fr2S8ciJtMhR/8mFf/haFoDpNwX5m4SzoS4llHkSTNzXmVpQslNTi9jPs4x5lml5kwibnVKuiSDpfGfH9XrGclxFV7bA/rZJ+wsZ0PQP+WpsvKyYJv15W6dmsf9v/94BZrKmM9GIVSojNBS9k9UlBPr6R7lgqR6owZuRy+GJFoBYMgtEsljvEHAu+TzJpYBXtnYSlgzXBiT+8rrToURW4Q1+o5Sej6Qfnr1wFlErkkF0aibBWNdpj9+74nmOC+ctlVnGlAbCzdCw1z+cqSRWOL1vNL4NJUBcrUiyvZYe8lTcJtra2JMWSmbjTGSw0dLPfAPTEGi0/6FXHVzJ+Sj2rMqpwnS0ew9gh8MSndFCzFuqEA==
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465;
 31:p8u9clYCY8n8yvjyG7U4t/QR4CNFujYiz/af4gZJY1W1kDk3zlkLTevUdZQTYJDt91GHRC+tKImf6DqJEIb2MuHO/GnmlKw/GgLzCLSh2Mwj2TtWyTXRQ550yB03/IBFs5kPxIcfEv40isnksYUUh6Xe+hlhUpQfGSHy88/IEjPjWrXNT1JzRGFykZdtLnXeIGzcEYLe9GtHV6+o91Y0AB3DQfbw6CXp5B6qvY/Et0FPIajhn+mpznXEnMUt8PwQg5/NIQRp3t9+4h37hF4Fyg==
X-Microsoft-Antispam-PRVS: <BN6PR03MB24656D3F59B09DB1E0156E7F89720@BN6PR03MB2465.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:BN6PR03MB2465; BCL:0; PCL:0; RULEID:(400006); SRVR:BN6PR03MB2465; 
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465;
 4:QnWizyEIM5SR+gkdon95aY3q7XfpRUXdIhuK4Ik7DwosvIdhJhyeyQwDi0vjuPhFUsnuXFJmJBRe9+OpTMd2tUFjHXc4qZNzp3uddCXldniD1YkA025a1V3GVf9i5usW0UHZT5/C+bVQ6UOmYPlZrkAE2FrTpsH/2L1J5pBECaZKrKVFhH6S47yi7Wc9mJ2fYe+aVoE4Pq+E6W9SuATJ1IUnVnu3KsfsY/jrjMlz8NS/D/z+musYA8cnaAkL9ThbH30HVzremhZGOcScEo5Otx3bDYLOikKpJhzpPQgGlEXPbAF3ZZYNMMztxfh5hnKcbMCBPxlPfp9Q9eZMOO17s65oJu93aRI7YABarBu9U2FoEbw/84+iUwmulC6QTGYNc//GtQtP72ylJJOfCBcMOyUlYP6nac3O48/OO5BdvkpnczUICSDtGLpCKKmALX6gU2Jxp/PkyVVgJ/lZR2NzC/Rd/muW0aTOlduhwANb2e4DLs3C4r60J0OnPzwQjcDNxKNQiJqGbqwYDEZexJK0toonPCIJSaGM8guErBWHNBSSNiD2Cpy5xQ44g9O2JrJ2kE2ZfApvWgaseIkpzggSISNAY/Ct0NtlyBSAYRNe0nTdRY+iStrverVf3Kmkpr+Kq4u6C95GTpwzvplxWCrAZHd8QBSs4MFiQ/3k1ktzbMQyPkD6QprzaZsIq1AhIX8/772igtzSOqQU8IevSoXu1qRS/mUTJrVmYoYwwmz008rhYr/X1H2uAdRjlfZmc33M2pLaaweV0O4P58+XcqgXirEvbAclqW38M9KLPhy5DPI7SFXVa0K78JAb7jYP9GWS
X-Forefront-PRVS: 0196A226D1
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR03MB2465;
 23:8zQ/BoS+UIcnB2Z43i+R1Y55DxVHsVTNn/Kra+j5q?=
 =?us-ascii?Q?OrT+qgksridHreBS1JwCfgAocNrky2lbmDK9c4EvlZOXYIJYAT/ZLvVQUESx?=
 =?us-ascii?Q?RxoXirdHh86njJ2Xt9BEX8sHEkgKf6i8YGDvy0CabqN0RjXX2nBApqgP3Mec?=
 =?us-ascii?Q?gFcNmPhDoUaD/wXvmVOJe9WLK8MY9gHKo9VDTIaZcIptktOsAU/dKmcolh9d?=
 =?us-ascii?Q?t2VW42deI7b3/E2IRnkMszGbaz9ANs2oORUhcDPD192eWqQRpckHtT/VtRtX?=
 =?us-ascii?Q?jP5f4CXA1himkKdlgx+Afa7H+d4T4/99R3uaLSDYH7qaZKZOhj0V/4a1TKuB?=
 =?us-ascii?Q?di2r3Zhyj1w8boSt8oI+qfP0bmk0M8pU4hyQA/IsdF4kw08QLzx4Ac8XdIMh?=
 =?us-ascii?Q?1PiMiD78kzs0leuu6fZcanXz/EiPDepn0+cEGfqBR/B6FQnk6ku6BrImDKer?=
 =?us-ascii?Q?EpZ1xQEABiRy5enJSytsZnsVfkD7wQiW80iHqjmS7dvtkh4znV+Q2UY/2Xtv?=
 =?us-ascii?Q?OCjcGrzG/G0rQPiOgqlOHvsMsmLgqcloAesQrBoXPW+/ZgNt20y1pN81DMk9?=
 =?us-ascii?Q?oz8GewGTZ0xNFE7XcODuO8bl79TB9pTqJq+WZNSKhsv5YthSp1tctR2K3+Y4?=
 =?us-ascii?Q?+J24Hn2PdFvSdz6y37oSFZ25+A9w++3NZnAlOuM8mLsUPrz8wnqC3JqQOpv5?=
 =?us-ascii?Q?NJPESmW8+j1744igYOtvcayalbZ2ddBJvxIj+IMD7jGYXYS2q9l4Nbxt2Jvy?=
 =?us-ascii?Q?BN55N7aBxGvCVVXWrZzL3Dwv0XOqu4mEPJtf5BNgQMGB6FzRxq63puAy44Ic?=
 =?us-ascii?Q?Qzy3IJr/mr+Z70grHTO9k8pIksKhkTxEEd4guUchgFVEqFVAoT2wX1yeQL5g?=
 =?us-ascii?Q?mBgWeZgspKgkZHBvwGpnL8fNMDvogY6IP0r+ZyMgsokC/Ma09cs19Fn9A3Tm?=
 =?us-ascii?Q?PtWhyD6QL4TZOEbTMxBOThIebwlJbLMTQhjpSQLolK6vO5qT46n4gYynoHqv?=
 =?us-ascii?Q?oSTVW/ZewYcgmq1o2GJL21B0ojITxdRiXVoPZCAX5xhvGmBi14OWk5E0j14f?=
 =?us-ascii?Q?oqQpod3ibmAlpJIg+kdhIe1QNCeQc/tX4uQXj/vUxby5jIp3WwNcdlhEUGlR?=
 =?us-ascii?Q?v9drTrNodNlYEXP9LLzo51VqClrtrTiVi5T/ivx++ULlWyy/sUhXDE/sQoNS?=
 =?us-ascii?Q?SrujE6w7Mi29+ZhGtcXm1RDrs1pD9f2zrenfKb3143BQdsUzK4anvnzf3Db0?=
 =?us-ascii?Q?8hvUEhOscZOPyHGbm3I4sx+oVVSu538EnRonJFUC4d1gpI0VpsQxJaf8YM5c?=
 =?us-ascii?Q?XKKO17e7DWugyifmMsW/Bg=3D?=
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465;
 6:2s9w+2WJjauB5W4uLipFYuZzLx1gLGgP/uQlERADwz9N3Xhz7pIUk+qVez/NB8b15HDWIWoqrwoDKcRcn79v7p4ZU7WSS9IheqxHPmObuQzrOsNo2P6bv41wQuyQwyd7R8s1XVwstpKvZjOLVSVgMRpiirv86UCWJeHbttySFPdfWcraeyOGvac+tcF1L9uZhfuaBndXyROcZWT1iBKwE1Hp4bZRGP2Kjz/kGRwNCGGLxZ+lkeYnoax3qXR366/gNUQ2MSc9q0kb7lfW6H6M1xePFIif2P+IDSfibuGhabgNisNmVOo3Qq/S9W/w2WI8aIfVBjOdoi9TuodcIr0jRRRIbbIl0kFrXymlbCZI3CnfPLOgqoeCtTzF3jWBTpYNhASc/YIXGxm7Y2deXG0NwOmW6UE/lgigvFyhhWkudaZdbzx7ZQexHTUtLTgDKj68;
 5:jKierMcRwQccmaP55uhPYVkm5uOWYOuXyHiJtq5FEnHLLb6cKqIEown5Lsp2GOVzN6id1I99p1Mwa2aa3uovPvHyp8RNNGrw5PNCZo7h1LmGWDHmMJ6SKUczbQ5rho2l7iyiqwjHPw3vjeueNx0+XNVF6tL+YxfQ4fsVZLBYnSf+dGNR6CEerlBCHZu8uNoU;
 24:AmfQFdJHxF3LDYfvXuHl/dyzYw/ps1oAuYpO5hqDRWI9avsl/gLht2VXcVjDW0x1ukY7GPJXwrB3PFDJQdYk8YrXRXB42KvRyPb6GYDA/Ug=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465;
 7:h08dW3ywSgpM57nDAigM7oI5iED430G51AoEVAXTN+BG6daNVkfboYd6HsHOfoOes1RNIwrOqXTYrLs2CqDvl2kZkmT6xv3nv1UDFUsoDjA56qlvjzDGDhgEbf5EELR1JbPcV8p0tNRQpRZoA40w9+nuymI2m2sXnvdp2sscY4TjJrJuCFTdmSLRYvtyW/ofq49no3UEwMO11+0YQ9WfFHuxAXVGfzIzmQiEXusJeJ4vqsvrZIn1R/8Y5GNUQND0QUoJf9F9CjJ8LO2p8xkxYPUgUaWK1w8x1K1PjsS1Ec2yJGlSLWgzoFyoUySTmoAPr2Lxn354oEfXsVQQeJfPLO91gQCSaHbLcvSuFDAVTPRESah/VqZYyFLBxxz7zG1d+VTJE9JOSOsaIRDBP4lEq+LFs5N3+92LSWD19rju5JpYP2n20GYktgcR0JCRN3jWLItIXtUvHdV5a+T1s/Dj+Q==
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jan 2017 12:00:46.2538 (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: BN6PR03MB2465
Subject: [dpdk-dev] [PATCHv6 10/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: Mon, 23 Jan 2017 12:00:51 -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