bus: get IOMMU class
authorSantosh Shukla <santosh.shukla@caviumnetworks.com>
Fri, 6 Oct 2017 11:03:41 +0000 (16:33 +0530)
committerThomas Monjalon <thomas@monjalon.net>
Fri, 6 Oct 2017 18:39:07 +0000 (20:39 +0200)
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>
Reviewed-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Tested-by: Hemant Agrawal <hemant.agrawal@nxp.com>
lib/librte_eal/bsdapp/eal/rte_eal_version.map
lib/librte_eal/common/eal_common_bus.c
lib/librte_eal/common/eal_common_pci.c
lib/librte_eal/common/include/rte_bus.h
lib/librte_eal/linuxapp/eal/rte_eal_version.map

index f8724bd..e887e06 100644 (file)
@@ -242,6 +242,7 @@ EXPERIMENTAL {
 DPDK_17.11 {
        global:
 
+       rte_bus_get_iommu_class;
        rte_pci_get_iommu_class;
        rte_pci_match;
 
index 08bec2d..a30a898 100644 (file)
@@ -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;
+}
index 3b7d0a0..0f0e4b9 100644 (file)
@@ -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),
index 2501fa2..6fb0834 100644 (file)
@@ -183,6 +183,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.
  */
@@ -196,6 +210,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 */
 };
 
 /**
@@ -295,6 +310,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.
index 95756e2..0f04b0a 100644 (file)
@@ -247,6 +247,7 @@ EXPERIMENTAL {
 DPDK_17.11 {
        global:
 
+       rte_bus_get_iommu_class;
        rte_pci_get_iommu_class;
        rte_pci_match;