From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <Santosh.Shukla@cavium.com>
Received: from NAM01-SN1-obe.outbound.protection.outlook.com
 (mail-sn1nam01on0056.outbound.protection.outlook.com [104.47.32.56])
 by dpdk.org (Postfix) with ESMTP id 34FF9910D
 for <dev@dpdk.org>; Mon, 14 Aug 2017 18:12:47 +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=Bj+u5ShroNl8tN0MOYoTrKeZ5SO9mf4O1AAKi17VIDg=;
 b=fRCxPCzNaM72mnd2TjAb8AHWdkXSCkFNEMOCNhlE7wG1kHRRVqG5pb+q9XAPMCvownvAP1g6M9jWhr0FuApH5gXGDqzmU4WMVggmTgzetWhH/dwLCJJ44D69/SjHFs9OMMgpnWO4FeuiLpjobbT9IuvJqjDz44ibyzZ1K04QnvQ=
Authentication-Results: spf=none (sender IP is )
 smtp.mailfrom=Santosh.Shukla@cavium.com; 
Received: from localhost.localdomain (14.140.2.178) by
 CY4PR07MB3093.namprd07.prod.outlook.com (10.172.115.7) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id
 15.1.1341.21; Mon, 14 Aug 2017 16:12:39 +0000
From: Santosh Shukla <santosh.shukla@caviumnetworks.com>
To: dev@dpdk.org
Cc: olivier.matz@6wind.com, thomas@monjalon.net,
 jerin.jacob@caviumnetworks.com, hemant.agrawal@nxp.com,
 maxime.coquelin@redhat.com, sergio.gonzalez.monroy@intel.com,
 bruce.richardson@intel.com, shreyansh.jain@nxp.com, gaetan.rivet@6wind.com,
 anatoly.burakov@intel.com, stephen@networkplumber.org,
 Santosh Shukla <santosh.shukla@caviumnetworks.com>
Date: Mon, 14 Aug 2017 21:40:53 +0530
Message-Id: <20170814161059.6684-7-santosh.shukla@caviumnetworks.com>
X-Mailer: git-send-email 2.11.0
In-Reply-To: <20170814161059.6684-1-santosh.shukla@caviumnetworks.com>
References: <20170724084004.25542-1-santosh.shukla@caviumnetworks.com>
 <20170814161059.6684-1-santosh.shukla@caviumnetworks.com>
MIME-Version: 1.0
Content-Type: text/plain
X-Originating-IP: [14.140.2.178]
X-ClientProxiedBy: PN1PR01CA0087.INDPRD01.PROD.OUTLOOK.COM (10.174.144.155) To
 CY4PR07MB3093.namprd07.prod.outlook.com (10.172.115.7)
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-Correlation-Id: aaa2fb50-b3a7-4ec7-1230-08d4e32f4cec
X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0;
 RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095);
 SRVR:CY4PR07MB3093; 
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3093;
 3:CRrDI77EAIZfvq84t23AKiX2Jv3k60FGQ5sYDQpXLiYs/BhfcCwVG+iG9puycT3Bicz2SBOcV3U70SEnojc69nr9G/HxucIesZPQB2G3IjDeKA46W5+ebaBEyjbK3xg6+vW3IVPXC+TladPOv5yix+VCkI7fXM00yj0dklbeBV9yzOsGWwtRLWYNAjlP6ILrPwzDnhCd7ZWQDf5Yk2abAcTHnwKcE/aE/Mhx7mNj0XfU1TGPqFuqaG7SsF2Awm+m;
 25:OWeoV+JrNzpgCfDp8Q99eMoWxwJTflKwuejocTA7291jxODgp8jbJ4QGMBkb+xaQkRrzrqFDWffmnrSskEt5jH2bOSbsfnvAKI8XkxzloayDAizXvZQsJlfDKri695E796gIt2aEHZeEft12+kk+znmmm/UezvbCx96Qp4QQfWLbHw9QFgm0EGcxJyprXrWLqSvRUJ7oLULLCbMV8X3XusAvhHaYu8dsCvVsCg0pazkpWcH/7xUmIYdYJNKb5+erUA9ESHMaHPtAQjYYE6R/ySFTs4eO9MkPzUa/FlVqmsknwtlzruP7CH13/5Qg0taExeJvqOVDo0vlKorpCKq/Bg==;
 31:gOSAobOy9NwGx8nB6G+Ltkwztug84EYEGCn4aF0XFBNBZ/0XUeK9LRsYwUgI1Rrs3ujvinx44E0ZHaNvgoEMwADaFlWw3Jl/RGQfef6mT0xHIwc77G57f4ZITS9LVoTtdu+4Muog/E58ytdku2IFUQbm0XEMuiHc3T+9F/7wjq7UGrcjiYvJdhDf6Ec4Sb5GXHbWInPeULpW2vtJW1NMwkXtciDeL5JgHBHRvHeji4E=
X-MS-TrafficTypeDiagnostic: CY4PR07MB3093:
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3093;
 20:Er8i7lRubtfrQShgnxmdZ0f6jr2WCYosP3zS+PWsgWkgukGyzDy8h22Yiq+79Z2jpdbGUpXen3Qz6pVA+ZGnk8L6SlOuU2x0RXzfI9Fe5mGq5N8Rr5h61X04b4Yk9ni/nolvmrzFVg1cvySx6Regh5nOIGC8AhrtUIBpnCqPnCV8bmabNep1cM/ubxA4CUP3xXNEf13W1Fe0Ok91PSRcf99QTQGdz1ITKVszRY3xBTo+Wlhv3X8fBnaC46ksNMXpvA1mHxZq5UQJgiV44+t7MF6/8QxRZuj6gA75N1KkZD2jHk/9rloGVxaS10HKToKZLcXy6zlCsUfJyGsE/D0H3BHWAMKNJI87CgDLqs1+q7YWcQmi2KD4XH5rQwYIj6Wxsc2SGwpms0/Y59DdRASG4gAHd3rLJFMCvK500uQYR4GtZuC7BbVM1OxeMymGZkzQ4G77KPWb6h+o8u9XCAdw+EApums4nJK9vcfjzb+OMVioehneLcpNPjtzdN8Wnv4dqkBTHVD4M5DBIT9qQVDx16y+ajiyCn4gl9lY+IzynenYV+Neau034p/XhKWwq1P6hfqXCuTrsr06IrororPhjH4g/sUtuqPSHUjHAeFmX1c=;
 4:bCP812I2+8rkhPAmB1F5BSNL0ugwPqu9KZayk8rT6wfEt9u8M7YvkXOnFb5RJie0iCuLrGYPHJcGx4SmcK6Tf7QKhx2YZXiuTlILjWizIxIilGCcRYdlEkPgV19n0ARU/XRgRbpImlMle3BLti2FxKLdlF5Fzv+rpXnOSGurt8oUNvGcPtqeEGQpXY6F6tAi9ju6AyJXChHz0uYXNyczq/oNDMU0P6R0oW/dtWaSITjsXwx6bgdop8RoK4ul59b0hDvf0i3QlpmXt4bvccexoTe1NmN29gBKi7LnR9RR5ZE=
X-Exchange-Antispam-Report-Test: UriScan:(185117386973197);
X-Microsoft-Antispam-PRVS: <CY4PR07MB309320F3797DD449EBFE1158EA8C0@CY4PR07MB3093.namprd07.prod.outlook.com>
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(100000703101)(100105400095)(3002001)(10201501046)(6041248)(20161123562025)(20161123560025)(20161123558100)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);
 SRVR:CY4PR07MB3093; BCL:0; PCL:0;
 RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);
 SRVR:CY4PR07MB3093; 
X-Forefront-PRVS: 039975700A
X-Forefront-Antispam-Report: SFV:NSPM;
 SFS:(10009020)(7370300001)(4630300001)(6069001)(6009001)(189002)(199003)(76176999)(101416001)(1076002)(50986999)(8656003)(6116002)(66066001)(72206003)(7350300001)(5009440100003)(3846002)(107886003)(47776003)(110136004)(2361001)(8676002)(42186005)(6486002)(50466002)(48376002)(105586002)(106356001)(189998001)(4326008)(6506006)(5660300001)(2351001)(25786009)(6512007)(81156014)(478600001)(36756003)(33646002)(7416002)(5003940100001)(7736002)(305945005)(68736007)(97736004)(5890100001)(6666003)(50226002)(6916009)(42882006)(575784001)(2906002)(2950100002)(81166006)(53936002)(110426004);
 DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR07MB3093; 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; CY4PR07MB3093;
 23:tK2tuXNOoZhBZx65l3YYQI8gWQO5K0I0xlLJHsec6?=
 =?us-ascii?Q?i6rPgZyOSnoR3pX8TPyHQKvhwsm+MuGZlCOMnmr06Pq+BXUvvEWpT92IROTh?=
 =?us-ascii?Q?ST9OBe8nIG/WhJGs+SjyObAtsADVTnjtjFkfuqhO8vWhupXCPGGdgwX3cK8k?=
 =?us-ascii?Q?U/i+QBs9SMkDD4t2wBQjXQ2jtXKNhGUdHTuvso6mupHVIrRk3F4EiOjarckQ?=
 =?us-ascii?Q?ujrs2E0cf7Fk/kEUcfkRIP+Yf2XqxHvbtGvKyE/nFVF6XJooUWDvM/9xxRwF?=
 =?us-ascii?Q?Z0MZFPL8OP6AoC5BGuGQracFiL12Uva4wMcsXtt20V2nvwDI2doTGH+oOOjO?=
 =?us-ascii?Q?xB+Iv/XECFqfptgixm1HAeKM5By5UZ0aFXJHG2GqopFoRFtbrG/tk+S7EzNd?=
 =?us-ascii?Q?fvOWzYQnsPHYKVuLeKLwHKmUcGZT+jGuLZpsY8wgYJpyv7Z1sVcYLKAqkfHI?=
 =?us-ascii?Q?B6ITuL78nx9JIqpZzkc6G/q/H6QG/B7izNqC/IY+PiiN3PodCiMnQN0g6fIY?=
 =?us-ascii?Q?gbKaZSvevYD8K5iTBdbdC9VW7mRScZe1FhTFtiMFgeXgoWguPpZzFGZ37+4S?=
 =?us-ascii?Q?ZhJRxceLGd4x8bJvJn9vyl6pI7DcF2kAPWF4Pxrk5AskfEFBsZ5i5Br7IJTh?=
 =?us-ascii?Q?a3YPq3R5szdRVHfMa48EdEydc1lMgi6L6Klt+8u0DxeCA38gJbGNwSlz/4G9?=
 =?us-ascii?Q?R5lf8TzjzRnnRQUOcKksQQQK3xYTh5V9+nGlKmR1FoHwPTJ0anHO+0uHTJx7?=
 =?us-ascii?Q?B44WAZh93d5GaVffaA03xFTpfh+i2/0owy4M6dA+SaaW2Ez8ZtFSsAkqZlJj?=
 =?us-ascii?Q?BIUr0sxMkZTm17BYKjXEnBGxNvdNwhVX28tpneXYYRFhk5+emohT1/6gb1Bm?=
 =?us-ascii?Q?FjkiXXX2qPKyLHUIiIZpyqeIJLbuQAfaMYL6UTDFp2yxYJEtD3AeG3dCm2ay?=
 =?us-ascii?Q?kBIk1YnMojzM/zqheDKhTonjIYYRfKCwhdGITz96oDYwcPFk95yi9nqFdgUz?=
 =?us-ascii?Q?IUC4uC2SdEJoAkc97TypXivTaZ+nsUqFrkQvrH6zq6jGpTpApR9U0avnk4Qn?=
 =?us-ascii?Q?NjfGxc1546mJ0as4rlpMT3sSG/koe9kl2ecRMI3RkGNs0jDYOqtXeNT+6ksN?=
 =?us-ascii?Q?QWf392/Y03S7vWvS9rXqh7Tz1ezVY9aO0SxSdNc6ZK9z0CPB4zXQpTk9ao0x?=
 =?us-ascii?Q?qaZY2T+gMB6vnGoQH2JeCoEpkfIcTq6yJSou1qjHVyl5wj7cNXVz5tgXDfkR?=
 =?us-ascii?Q?QGGm/oH2ERdLf4xNJILHMUYawlor2W2MhtA9f4DIVLvZS/qxtFlhiIQ7Bk4T?=
 =?us-ascii?Q?i4rwI/fLRoS73dAXalfQGyinxO3AdiDzK5wSJURKbvk?=
X-Microsoft-Exchange-Diagnostics: 1; CY4PR07MB3093;
 6:WY3ai5qQ6zKuMoaH1bwgIsCb4nR6B9Q7pGCmWSuatQeIlZQ2VDhtf+WaCTA0TXDs6MA+mUCuOdSbCkd+LlRTRvMbCxZiEwMq9yzcDpicss0njNmMzSKQB9YV1vNUp/HHMXvM2MQLaOc5cxfe8B8f0TFig3rdkGDei9K06jAlLo/YO3Jyp0KJ7l+NZUgqYrm3oemASid2y4XAJNRKuME0+BETRprTKzKzfPOSgtCkZtFplkDjsJ1baZFrKjWsBfBG7D6PYhjSFP3pL4T+iPTB3IjWlrIelDhPsFylnVGdIfs/I7YyhENZh8FV1K1IiKaQ2YdREO/NnLm33wnhMnv70Q==;
 5:MefJRzA4fwNRMndFA78VeAqRXxflHDFZIt7GApGbhIUDT7KmkOoEjiZubJAYmm6o1mz4AKsSp69EyVobu19aExA+oicV4OixCOBW5SSzllfYgi+/Q854FTZKAPe4KpGm5sesKA4vyz7m39qd2BjuRg==;
 24:oZZsXN2rm2OaCxwAp76bOFlWGEw7kkzRBSoV07fc4DlSROVn6NhjnniOlDGKpLggU1P1mIK7womAXqh2wMZ+CwKUr3Kvn3peSoNgyZY/fwg=;
 7:jp1+yd7RUydD1s6CXy20J+lBsxxR+nV9tB41pc5YW6ql+zXCmb/lIxzWHW9PeZk3IZ73bzXUwNVLYUaC5PhlHi8Kh4cNanYeLjJa9abYF4qwMNKZTWt8n4AChZRtJfOZTG+cl3KYEPO+QgFaIXI4fcWotUfggkxHqzXlieBdXXi2qHtAWl+zBbhuyOdEtYHz2IXOE/PkNNeEfkCgJx+023Eqnc0y0UxjL+wzFz72Nsc=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-OriginatorOrg: caviumnetworks.com
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Aug 2017 16:12:39.7089 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR07MB3093
Subject: [dpdk-dev] [PATCH v6 06/12] bus: 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: Mon, 14 Aug 2017 16:12:47 -0000

API(rte_bus_get_iommu_class) helps to automatically detect and select
appropriate iova mapping scheme for iommu capable device on that bus.

Algorithm for iova scheme selection for bus:
0. Iterate through bus_list.
1. Collect each bus iova mode value and update into 'mode' var.
2. Mode selection scheme is:
if mode == 0 then iova mode is _pa,
if mode == 1 then iova mode is _pa,
if mode == 2 then iova mode is _va,
if mode == 3 then iova mode ia _pa.

So mode !=2  will be default iova mode (_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>
---
 lib/librte_eal/bsdapp/eal/rte_eal_version.map   |  1 +
 lib/librte_eal/common/eal_common_bus.c          | 23 +++++++++++++++++++++++
 lib/librte_eal/common/eal_common_pci.c          |  1 +
 lib/librte_eal/common/include/rte_bus.h         | 25 +++++++++++++++++++++++++
 lib/librte_eal/linuxapp/eal/rte_eal_version.map |  1 +
 5 files changed, 51 insertions(+)

diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
index 1fdcfb460..9942f47aa 100644
--- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map
@@ -243,5 +243,6 @@ DPDK_17.11 {
 
 	rte_pci_match;
 	rte_pci_get_iommu_class;
+	rte_bus_get_iommu_class;
 
 } DPDK_17.08;
diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c
index 08bec2d93..a30a8982e 100644
--- a/lib/librte_eal/common/eal_common_bus.c
+++ b/lib/librte_eal/common/eal_common_bus.c
@@ -222,3 +222,26 @@ rte_bus_find_by_device_name(const char *str)
 		c[0] = '\0';
 	return rte_bus_find(NULL, bus_can_parse, name);
 }
+
+
+/*
+ * Get iommu class of devices on the bus.
+ */
+enum rte_iova_mode
+rte_bus_get_iommu_class(void)
+{
+	int mode = RTE_IOVA_DC;
+	struct rte_bus *bus;
+
+	TAILQ_FOREACH(bus, &rte_bus_list, next) {
+
+		if (bus->get_iommu_class)
+			mode |= bus->get_iommu_class();
+	}
+
+	if (mode != RTE_IOVA_VA) {
+		/* Use default IOVA mode */
+		mode = RTE_IOVA_PA;
+	}
+	return mode;
+}
diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c
index 3b7d0a0ee..0f0e4b93b 100644
--- a/lib/librte_eal/common/eal_common_pci.c
+++ b/lib/librte_eal/common/eal_common_pci.c
@@ -564,6 +564,7 @@ struct rte_pci_bus rte_pci_bus = {
 		.plug = pci_plug,
 		.unplug = pci_unplug,
 		.parse = pci_parse,
+		.get_iommu_class = rte_pci_get_iommu_class,
 	},
 	.device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list),
 	.driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list),
diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h
index 9e40687e5..70a291a4d 100644
--- a/lib/librte_eal/common/include/rte_bus.h
+++ b/lib/librte_eal/common/include/rte_bus.h
@@ -178,6 +178,20 @@ struct rte_bus_conf {
 	enum rte_bus_scan_mode scan_mode; /**< Scan policy. */
 };
 
+
+/**
+ * Get common iommu class of the all the devices on the bus. The bus may
+ * check that those devices are attached to iommu driver.
+ * If no devices are attached to the bus. The bus may return with don't care
+ * (_DC) value.
+ * Otherwise, The bus will return appropriate _pa or _va iova mode.
+ *
+ * @return
+ *      enum rte_iova_mode value.
+ */
+typedef enum rte_iova_mode (*rte_bus_get_iommu_class_t)(void);
+
+
 /**
  * A structure describing a generic bus.
  */
@@ -191,6 +205,7 @@ struct rte_bus {
 	rte_bus_unplug_t unplug;     /**< Remove single device from driver */
 	rte_bus_parse_t parse;       /**< Parse a device name */
 	struct rte_bus_conf conf;    /**< Bus configuration */
+	rte_bus_get_iommu_class_t get_iommu_class; /**< Get iommu class */
 };
 
 /**
@@ -290,6 +305,16 @@ struct rte_bus *rte_bus_find_by_device(const struct rte_device *dev);
  */
 struct rte_bus *rte_bus_find_by_name(const char *busname);
 
+
+/**
+ * Get the common iommu class of devices bound on to buses available in the
+ * system. The default mode is PA.
+ *
+ * @return
+ *     enum rte_iova_mode value.
+ */
+enum rte_iova_mode rte_bus_get_iommu_class(void);
+
 /**
  * Helper for Bus registration.
  * The constructor has higher priority than PMD constructors.
diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
index 40420ded3..f35031746 100644
--- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map
+++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map
@@ -248,5 +248,6 @@ DPDK_17.11 {
 
 	rte_pci_match;
 	rte_pci_get_iommu_class;
+	rte_bus_get_iommu_class;
 
 } DPDK_17.08;
-- 
2.11.0