dmaengine: idxd: add module parameter to force disable of SVA
authorDave Jiang <dave.jiang@intel.com>
Fri, 22 Jan 2021 18:46:00 +0000 (11:46 -0700)
committerVinod Koul <vkoul@kernel.org>
Tue, 26 Jan 2021 17:28:55 +0000 (22:58 +0530)
Add a module parameter that overrides the SVA feature enabling. This keeps
the driver in legacy mode even when intel_iommu=sm_on is set. In this mode,
the descriptor fields must be programmed with dma_addr_t from the Linux DMA
API for source, destination, and completion descriptors.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/161134110457.4005461.13171197785259115852.stgit@djiang5-desk3.ch.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Documentation/admin-guide/kernel-parameters.txt
drivers/dma/idxd/init.c

index c722ec19cd00485ceb9ba4dfce2cf9c5d2deb1d0..c25786b954193bae74fc161eb93bfd6b5926a81a 100644 (file)
                        In such case C2/C3 won't be used again.
                        idle=nomwait: Disable mwait for CPU C-states
 
+       idxd.sva=       [HW]
+                       Format: <bool>
+                       Allow force disabling of Shared Virtual Memory (SVA)
+                       support for the idxd driver. By default it is set to
+                       true (1).
+
        ieee754=        [MIPS] Select IEEE Std 754 conformance mode
                        Format: { strict | legacy | 2008 | relaxed }
                        Default: strict
index 25cc947c61796483d9b45590256bd09a039ed114..9687a24ff98266d310defb70a9072653ba87f304 100644 (file)
@@ -26,6 +26,10 @@ MODULE_VERSION(IDXD_DRIVER_VERSION);
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Intel Corporation");
 
+static bool sva = true;
+module_param(sva, bool, 0644);
+MODULE_PARM_DESC(sva, "Toggle SVA support on/off");
+
 #define DRV_NAME "idxd"
 
 bool support_enqcmd;
@@ -338,12 +342,14 @@ static int idxd_probe(struct idxd_device *idxd)
        idxd_device_init_reset(idxd);
        dev_dbg(dev, "IDXD reset complete\n");
 
-       if (IS_ENABLED(CONFIG_INTEL_IDXD_SVM)) {
+       if (IS_ENABLED(CONFIG_INTEL_IDXD_SVM) && sva) {
                rc = idxd_enable_system_pasid(idxd);
                if (rc < 0)
                        dev_warn(dev, "Failed to enable PASID. No SVA support: %d\n", rc);
                else
                        set_bit(IDXD_FLAG_PASID_ENABLED, &idxd->flags);
+       } else if (!sva) {
+               dev_warn(dev, "User forced SVA off via module param.\n");
        }
 
        idxd_read_caps(idxd);