From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <Santosh.Shukla@cavium.com>
Received: from NAM03-DM3-obe.outbound.protection.outlook.com
 (mail-dm3nam03on0081.outbound.protection.outlook.com [104.47.41.81])
 by dpdk.org (Postfix) with ESMTP id B6A301B2C0
 for <dev@dpdk.org>; Fri,  6 Oct 2017 13:04:32 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version;
 bh=jWydMGVsu5UkGLhh+Jf8nBL1uqc0b6qZ4qfnLt4Ej+Q=;
 b=iapwffKuFcxo48Xy4zbBh6cMUtk1Bl3uTtytjHLgG49LnJf0m1WooJ4fzcs5DDBuPkDKXEF7hgpS9QRPM/NQ7iiHcZ/ez/SY+hkAKd6dRyhk2GFv4iJYMmYTwCh4RVGl1lvAHJX1aUee0BD1Xy9UZuSzwgvCIMN+vF3dKIG6Kv0=
Authentication-Results: spf=none (sender IP is )
 smtp.mailfrom=Santosh.Shukla@cavium.com; 
Received: from localhost.localdomain (111.93.218.67) by
 CY4PR07MB3094.namprd07.prod.outlook.com (10.172.115.8) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id
 15.20.77.7; Fri, 6 Oct 2017 11:04:25 +0000
From: Santosh Shukla <santosh.shukla@caviumnetworks.com>
To: olivier.matz@6wind.com,
	dev@dpdk.org
Cc: thomas@monjalon.net, jerin.jacob@caviumnetworks.com,
 hemant.agrawal@nxp.com, aconole@redhat.com, stephen@networkplumber.org,
 anatoly.burakov@intel.com, gaetan.rivet@6wind.com, shreyansh.jain@nxp.com,
 bruce.richardson@intel.com, sergio.gonzalez.monroy@intel.com,
 maxime.coquelin@redhat.com,
 Santosh Shukla <santosh.shukla@caviumnetworks.com>
Date: Fri,  6 Oct 2017 16:33:40 +0530
Message-Id: <20171006110346.13247-4-santosh.shukla@caviumnetworks.com>
X-Mailer: git-send-email 2.14.1
In-Reply-To: <20171006110346.13247-1-santosh.shukla@caviumnetworks.com>
References: <20170920112356.17629-1-santosh.shukla@caviumnetworks.com>
 <20171006110346.13247-1-santosh.shukla@caviumnetworks.com>
MIME-Version: 1.0
Content-Type: text/plain
X-Originating-IP: [111.93.218.67]
X-ClientProxiedBy: CY4PR1201CA0022.namprd12.prod.outlook.com (10.172.75.32) To
 CY4PR07MB3094.namprd07.prod.outlook.com (10.172.115.8)
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-Correlation-Id: 68b79ad0-bf9b-4085-f364-08d50caa04cb
X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0;
 RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075);
 SRVR:CY4PR07MB3094; 
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3094;
 3:fbjaBfGRC3NPRColDLyyb9pKEZEGHC6+glpNeedY9pQq2XJdpqQRfBiEpL3gbHcTZiXomzT1k34XR5HeM4W0fSMcP/vzMF4tj0eP+JaWb5thDLELAyrSCeuyPKsFv8q5blk1a4n+mA7Yetw3agt/HoLkNAn3uGwqSWtvICq4a1Y/rtfjW5Rt3Bqjn5ALdyPistZZg4Vw0QeAAUUo37UopUV0iPboPWdoKmW/Y3MncVCGjBpjI7epqg9jv5g5ft+N;
 25:ZYxLVwWQRhDQJQKFR15hLaiQs3maMiYOZLNFbdUvm6laX2OJKAYcoKcBgAc6Sy0AGuh5F4EyusJiP1ti2ar4NWKeMafidU5h8lkNsryIYtq618hQ7vUvyKbyFLnvtaQvVOsvm6tve6QoR4aoKBkryTzP/D45GkNzhaRB41yQgEkWr3TMiD/7h1XSh8mhGOgJJYO8QAGl9uPYZ8uLPb8OjhqrDr5/7u7mp1J71ujnRY8dImKkNkoheNaTTO33+o9xne7fEZhtw8m6JxFxjO1cRyfNjNl2FqkrxPCBn8oT7oERbWc4gvL9B6P16eHn9N6pVWhJlPGoF6yWWRT9ZGaY5Q==;
 31:596kLr59BfmSSWbxoP7kXdYgRla5RhqzfDNUqZSwZ07wq81+x9s+B6zBnAbJBeOh3/DTuxvXFxEk/nwFeV0ZBaMJ+Piaare53yH3rL/jtrjpqmj6pfLt82ko3FjWX8v1OlvK91NBYXRPyyyA3L9RMcJt5bF+St9KDK0qyutm+X6+6jtwS4hj4S1MrktB3KPScD+JAacpkkmRmjHfOo4ZWRRHHbE2Ft1fArfDRLEW7Kg=
X-MS-TrafficTypeDiagnostic: CY4PR07MB3094:
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3094;
 20:FuSkmjzPZ1RMyxImG8RSIDgLwxb9SPkmYHwF+gJUcRbGiXPtma329E+7Wpx4GC+X7iHWJBeyHfxUTaeg2a9W4ad7Si2LkJJpYja0P3YXN45ldYK1vgPtLt2LvdduL0MwuERk87GS6ODU2/DMe5WAHaZ3cj8utbm/QBR+35HP6H3ld4ShdYGgTMzY1VzJjJpWt9w0sXc/M5Gu2Cj0NyOEBCNRnLia+u1biJkA5wftsLcPZL8PYTATjEKE60dXgklsEJ303fS/iDw1meRgx2/pF0j26xkHc5iTerz+0BPEPU/fa4wiUUTGG8VY20CWBuJPw8dTRd+ETi1PSakiME3yNob8s3R54gUNlw1tp5PLNd+3UrygeUsWlZqMknr5bppHck4/TFC6kzM0xafHU07CN8VEda8fTyghnDBDDU76KzWPwPg0rHAQnP3YKxyooCqIsqB+9o6O3WvE4GHgsblElCDkKKWT18LUUn3PSozZrUEFLwK7PmpfJixW42ehdn0WW77hHCC3aPsV/V7atCzxT2ceNr8Ojrxp4N5h3MW4LmSCqU9/5SoFXWsbtqfAj/PUs2CqhZ8Fzo4T0QucHxqDxX2++HZtfXc25eMu9NplKMQ=
X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(228905959029699);
X-Microsoft-Antispam-PRVS: <CY4PR07MB3094047BB8ED38BA8DFB7ACBEA710@CY4PR07MB3094.namprd07.prod.outlook.com>
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(10201501046)(3002001)(100000703101)(100105400095)(93006095)(6041248)(20161123555025)(20161123564025)(20161123560025)(20161123558100)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);
 SRVR:CY4PR07MB3094; BCL:0; PCL:0;
 RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);
 SRVR:CY4PR07MB3094; 
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3094;
 4:s0mp3Q7QkvY4JrXQdjBWCSQ/4/bsPr8cFR9uqBp5DESf1U0vyTBy+DyiWkg9zbjncpU/MBePy8fX9rffXbcmzfV+2J9iR9xsvcrBuW2uIg7B0sO/BYu/rQEFhlxEvN1kgK41z9e4HFSo1GnFawaJrMG1V4+ykA53JrFuunL+nFhv+2RDumYCGXHc+n+39wRA1Of21TJ5SuhppIoIUUu2ccBMtu6b73XwPXaKC3gNOHCpLucP6LX/ZbeCLVT7QJyoc8BEYqMBORpGFER8Ocl5s3s4m5MpbKMohTtM8S+HIfwuFAzL+8ip/0Vbve1IVdgJ1MOxqRod7kywgzETtx4p4w==
X-Forefront-PRVS: 0452022BE1
X-Forefront-Antispam-Report: SFV:NSPM;
 SFS:(10009020)(6009001)(6069001)(346002)(376002)(189002)(199003)(97736004)(2950100002)(5660300001)(7416002)(105586002)(6512007)(53936002)(106356001)(478600001)(6666003)(50226002)(189998001)(8936002)(25786009)(81166006)(81156014)(8676002)(107886003)(2906002)(5003940100001)(6486002)(76176999)(305945005)(8656003)(50466002)(36756003)(4326008)(1076002)(68736007)(48376002)(7736002)(72206003)(3846002)(6506006)(316002)(33646002)(16526018)(5009440100003)(101416001)(66066001)(6116002)(47776003)(5890100001)(16586007)(50986999)(42882006);
 DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3094; H:localhost.localdomain; FPR:;
 SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; 
Received-SPF: None (protection.outlook.com: cavium.com does not designate
 permitted sender hosts)
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR07MB3094;
 23:PQay2Q5KkpDN0Kw9SoHkrjTh8UevTrL5TUM4WUG5D?=
 =?us-ascii?Q?VRlBz76ZgMPYKNmeX6D1xradIJ3ADNiycEc+CY+RebXxjvMhFeRtD6PljEho?=
 =?us-ascii?Q?iTF3nSOrT1z99MdJMWOu8bFsaNOcWYjHNVrv4e4YpLfaNLlTwrUHgX5XVvUI?=
 =?us-ascii?Q?yEBCMaVhKOT45fyEvNA98n6sKxFI+UjnT5hr/tDbx57CakxHpL6HZoysCGUX?=
 =?us-ascii?Q?49J8gzNg5etbN/FXTFghn2NCtiYLNpGNdxxUBj/tMrmwZ7Rm1mIQrTjvxyGI?=
 =?us-ascii?Q?NHeyWjaBYwLL4EvEl+k4a1fTwzC7xF7fS4YRTxJdat8+vAwXPt/64qfcBKpW?=
 =?us-ascii?Q?nMfWw7W4/jUFTxBx7Vuueu8uPsDRbSi02wNaVpKDL3MIHcVhbfh5oT+Dilvo?=
 =?us-ascii?Q?jEkJ0JqfCqqrOIntJdCq8VLAF3F7/rkz5s4JF96Yx5eSTrIyrcLxf1YJTyqI?=
 =?us-ascii?Q?eoQYR1pELeWEaQntGVaqE8SR+16hFM0hDROP1iXOnnKXThAFB9d4TfNydS4T?=
 =?us-ascii?Q?1AoxTbmHmvsBsTndQWd5+oHwMcw3d51CXQz+TLrenGshsXZpWA516cCVEIcl?=
 =?us-ascii?Q?DOzJ9Yci5MgcJ8BGsWFe2T5ue5bIVvpYyWb0j34L5AtrGTGsf0LVrWRJYdC9?=
 =?us-ascii?Q?NQfIcv8uVyNqnytzwjL9yfR8nZFDv4xuyhFr6SrqfjM+/Tt6zYjLSbStrCcR?=
 =?us-ascii?Q?FzXfC2cVqCSS4VsgeMR5+qMuFkLDB6/oqJ7XgATf2U2PYfKqI2sBJ57tUwGV?=
 =?us-ascii?Q?4IU2hErtclJAc4lJcWeDR/i6p1K3YNCGUvE9tQWJTUSM+FTrmccyOfp8Fh6a?=
 =?us-ascii?Q?VScjp4rsXD+35n9eCMxvM4ipE2wvWYQ524bzvwlyv7ScL6jV6XETqT7p/BbF?=
 =?us-ascii?Q?Ml7LVKemW7hg4FPm7L7VeYSr6C3ju8pedKfqeLEodtzP0cTDKb9gnFEzWASy?=
 =?us-ascii?Q?qbhaDDoQp8DIx/dbJJMa8DufbnCMjZvL6go/bBu/In2iSFvsv+twyz2PqY7f?=
 =?us-ascii?Q?eH8Vyjm+e75E/Slg6c7eLSGt+kB7dSwQ4tvS4ec1ZZ1kf0UgBo9+f/QCvcLK?=
 =?us-ascii?Q?+/u0C9r8J8Lj7wMoTefdik87Qx9+gm4kZ0P1mYbBQolRbIA2nbWF5AqU51+b?=
 =?us-ascii?Q?qUTWiRTYEgMODvEks/+fVJgc1ITzDG/9AF76J7QTFvNiwJryG87kmZjbvYdz?=
 =?us-ascii?Q?/o0IlToOlBFs2SsPJp7eDz7YM2COLCp3j8Hz4IrlW5gw5r9pC59lLE0vA=3D?=
 =?us-ascii?Q?=3D?=
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3094;
 6:j+Q04XF1TNb1Vs8IF6ObNrN99VYuEhy07ruuxibwaiLE1GQ3+wJiHnTQOGAgxvHU2wiXGoI2LfDkIjSIMSMQaTQqjnUt/104Tk7Ni6h6DaU03rBhyXEjTPDTeW89vqv4q8MbVGFEpyYPimdldshkIHj/h+tsooSZCxcD4CjREIcZMPr9xaNyW0K2B/IWTG5OaLjjM5BUmmqL7Pha0Cry9oVhHwZVYmRVKGN66AZdbO85d38GUZ0YQfVTktULSkSA/siN3PMQummnYE/QXYswXtVLxiW45bRbD7x5B3F2KWo0e1sdCX5mOMqgl+lqj1rK4OLkUoS7yz8Yc3cEL+DuIg==;
 5:J9T3otHXAOs8aQiD3zEm14VZn6GRTOBA05ZvqqWNnkJXwz0K+uaYZp4zgySwQuuGvwRy8POoA6eCvcs0DWyp2niJZdy0ZEusqGm9F6m3LcaqhZOl86tXr8cSNvNyksEVKl2R5X16FwJo1EQl75D5fA==;
 24:3GyAbtGz6cfd6cCB1BeaACyrmA9xdkeLLpmCW1kAgoC6Dt84sBVBM0U3AB/49pxjzk9ja6VY8+2yZyu+c3KTf5l/AswVKazfzECYy/jzwP0=;
 7:1+rdEy6i0Okdh75ewNhl+/FXQTmg2rzFgk15Cyl+0UMGBJWyAUieNUS++vhqFNpvImToQQLN91XT8bY3WTqXhCBlEus+qtBOTu+Gvfnn8+TPt/vRiwAcOlNw/P3FwxhAJZSbfw6DekAt/wP5b2EkkIMnGrX5B4/h1ubFMy3ubVwTezRLdTWzHVG+mOhcZtpw4t0j2lIquLWXvpyISsleUS/PG48oqw0OTznvThZzzxw=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-OriginatorOrg: caviumnetworks.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Oct 2017 11:04:25.4898 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194
X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3094
Subject: [dpdk-dev] [PATCH v10 3/9] linuxapp/eal_pci: get iommu class
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: Fri, 06 Oct 2017 11:04:33 -0000

Get iommu class of PCI device on the bus and returns preferred iova
mapping mode for that bus.

Patch also introduces RTE_PCI_DRV_IOVA_AS_VA drv flag.
Flag used when driver needs to operate in iova=va mode.

Algorithm for iova scheme selection for PCI bus:
0. If no device bound then return with RTE_IOVA_DC mapping mode,
else goto 1).
1. Look for device attached to vfio kdrv and has .drv_flag set
to RTE_PCI_DRV_IOVA_AS_VA.
2. Look for any device attached to UIO class of driver.
3. Check for vfio-noiommu mode enabled.

If 2) & 3) is false and 1) is true then select
mapping scheme as RTE_IOVA_VA. Otherwise use default
mapping scheme (RTE_IOVA_PA).

Signed-off-by: Santosh Shukla <santosh.shukla@caviumnetworks.com>
Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Reviewed-by: Anatoly Burakov <anatoly.burakov@intel.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
 lib/librte_eal/common/include/rte_pci.h |  2 +
 lib/librte_eal/linuxapp/eal/eal_pci.c   | 89 ++++++++++++++++++++++++++++++++-
 lib/librte_eal/linuxapp/eal/eal_vfio.c  | 19 +++++++
 lib/librte_eal/linuxapp/eal/eal_vfio.h  |  4 ++
 4 files changed, 113 insertions(+), 1 deletion(-)

diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index 0e36de093..a67d77f22 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -202,6 +202,8 @@ struct rte_pci_bus {
 #define RTE_PCI_DRV_INTR_RMV 0x0010
 /** Device driver needs to keep mapped resources if unsupported dev detected */
 #define RTE_PCI_DRV_KEEP_MAPPED_RES 0x0020
+/** Device driver supports iova as va */
+#define RTE_PCI_DRV_IOVA_AS_VA 0X0040
 
 /**
  * A structure describing a PCI mapping.
diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c
index 26f2be822..b4dbf953a 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -45,6 +45,7 @@
 #include "eal_filesystem.h"
 #include "eal_private.h"
 #include "eal_pci_init.h"
+#include "eal_vfio.h"
 
 /**
  * @file
@@ -488,11 +489,97 @@ rte_pci_scan(void)
 }
 
 /*
- * Get iommu class of pci devices on the bus.
+ * Is pci device bound to any kdrv
+ */
+static inline int
+pci_one_device_is_bound(void)
+{
+	struct rte_pci_device *dev = NULL;
+	int ret = 0;
+
+	FOREACH_DEVICE_ON_PCIBUS(dev) {
+		if (dev->kdrv == RTE_KDRV_UNKNOWN ||
+		    dev->kdrv == RTE_KDRV_NONE) {
+			continue;
+		} else {
+			ret = 1;
+			break;
+		}
+	}
+	return ret;
+}
+
+/*
+ * Any one of the device bound to uio
+ */
+static inline int
+pci_one_device_bound_uio(void)
+{
+	struct rte_pci_device *dev = NULL;
+
+	FOREACH_DEVICE_ON_PCIBUS(dev) {
+		if (dev->kdrv == RTE_KDRV_IGB_UIO ||
+		   dev->kdrv == RTE_KDRV_UIO_GENERIC) {
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/*
+ * Any one of the device has iova as va
+ */
+static inline int
+pci_one_device_has_iova_va(void)
+{
+	struct rte_pci_device *dev = NULL;
+	struct rte_pci_driver *drv = NULL;
+
+	FOREACH_DRIVER_ON_PCIBUS(drv) {
+		if (drv && drv->drv_flags & RTE_PCI_DRV_IOVA_AS_VA) {
+			FOREACH_DEVICE_ON_PCIBUS(dev) {
+				if (dev->kdrv == RTE_KDRV_VFIO &&
+				    rte_pci_match(drv, dev))
+					return 1;
+			}
+		}
+	}
+	return 0;
+}
+
+/*
+ * Get iommu class of PCI devices on the bus.
  */
 enum rte_iova_mode
 rte_pci_get_iommu_class(void)
 {
+	bool is_bound;
+	bool is_vfio_noiommu_enabled = true;
+	bool has_iova_va;
+	bool is_bound_uio;
+
+	is_bound = pci_one_device_is_bound();
+	if (!is_bound)
+		return RTE_IOVA_DC;
+
+	has_iova_va = pci_one_device_has_iova_va();
+	is_bound_uio = pci_one_device_bound_uio();
+#ifdef VFIO_PRESENT
+	is_vfio_noiommu_enabled = vfio_noiommu_is_enabled() == true ?
+					true : false;
+#endif
+
+	if (has_iova_va && !is_bound_uio && !is_vfio_noiommu_enabled)
+		return RTE_IOVA_VA;
+
+	if (has_iova_va) {
+		RTE_LOG(WARNING, EAL, "Some devices want iova as va but pa will be used because.. ");
+		if (is_vfio_noiommu_enabled)
+			RTE_LOG(WARNING, EAL, "vfio-noiommu mode configured\n");
+		if (is_bound_uio)
+			RTE_LOG(WARNING, EAL, "few device bound to UIO\n");
+	}
+
 	return RTE_IOVA_PA;
 }
 
diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c b/lib/librte_eal/linuxapp/eal/eal_vfio.c
index 946df7e31..c8a97b7e7 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c
@@ -816,4 +816,23 @@ vfio_noiommu_dma_map(int __rte_unused vfio_container_fd)
 	return 0;
 }
 
+int
+vfio_noiommu_is_enabled(void)
+{
+	int fd, ret, cnt __rte_unused;
+	char c;
+
+	ret = -1;
+	fd = open(VFIO_NOIOMMU_MODE, O_RDONLY);
+	if (fd < 0)
+		return -1;
+
+	cnt = read(fd, &c, 1);
+	if (c == 'Y')
+		ret = 1;
+
+	close(fd);
+	return ret;
+}
+
 #endif
diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.h b/lib/librte_eal/linuxapp/eal/eal_vfio.h
index 5ff63e5d7..26ea8e119 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio.h
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio.h
@@ -150,6 +150,8 @@ struct vfio_config {
 #define VFIO_NOIOMMU_GROUP_FMT "/dev/vfio/noiommu-%u"
 #define VFIO_GET_REGION_ADDR(x) ((uint64_t) x << 40ULL)
 #define VFIO_GET_REGION_IDX(x) (x >> 40)
+#define VFIO_NOIOMMU_MODE      \
+	"/sys/module/vfio/parameters/enable_unsafe_noiommu_mode"
 
 /* DMA mapping function prototype.
  * Takes VFIO container fd as a parameter.
@@ -210,6 +212,8 @@ int pci_vfio_is_enabled(void);
 
 int vfio_mp_sync_setup(void);
 
+int vfio_noiommu_is_enabled(void);
+
 #define SOCKET_REQ_CONTAINER 0x100
 #define SOCKET_REQ_GROUP 0x200
 #define SOCKET_CLR_GROUP 0x300
-- 
2.14.1