dmaengine: idxd: Enable IDXD performance monitor support
authorTom Zanussi <tom.zanussi@linux.intel.com>
Sat, 24 Apr 2021 15:04:16 +0000 (10:04 -0500)
committerVinod Koul <vkoul@kernel.org>
Sun, 25 Apr 2021 16:16:12 +0000 (21:46 +0530)
Add the code needed in the main IDXD driver to interface with the IDXD
perfmon implementation.

[ Based on work originally by Jing Lin. ]

Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
Link: https://lore.kernel.org/r/a5564a5583911565d31c2af9234218c5166c4b2c.1619276133.git.zanussi@kernel.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/idxd/init.c
drivers/dma/idxd/irq.c

index 8003f8a..2a926be 100644 (file)
@@ -21,6 +21,7 @@
 #include "../dmaengine.h"
 #include "registers.h"
 #include "idxd.h"
+#include "perfmon.h"
 
 MODULE_VERSION(IDXD_DRIVER_VERSION);
 MODULE_LICENSE("GPL v2");
@@ -541,6 +542,10 @@ static int idxd_probe(struct idxd_device *idxd)
 
        idxd->major = idxd_cdev_get_major(idxd);
 
+       rc = perfmon_pmu_init(idxd);
+       if (rc < 0)
+               dev_warn(dev, "Failed to initialize perfmon. No PMU support: %d\n", rc);
+
        dev_dbg(dev, "IDXD device %d probed successfully\n", idxd->id);
        return 0;
 
@@ -720,6 +725,7 @@ static void idxd_remove(struct pci_dev *pdev)
        if (device_pasid_enabled(idxd))
                idxd_disable_system_pasid(idxd);
        idxd_unregister_devices(idxd);
+       perfmon_pmu_remove(idxd);
        iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA);
 }
 
@@ -749,6 +755,8 @@ static int __init idxd_init_module(void)
        else
                support_enqcmd = true;
 
+       perfmon_init();
+
        err = idxd_register_bus_type();
        if (err < 0)
                return err;
@@ -782,5 +790,6 @@ static void __exit idxd_exit_module(void)
        pci_unregister_driver(&idxd_pci_driver);
        idxd_cdev_remove();
        idxd_unregister_bus_type();
+       perfmon_exit();
 }
 module_exit(idxd_exit_module);
index afee571..ae68e1e 100644 (file)
@@ -156,11 +156,8 @@ static int process_misc_interrupts(struct idxd_device *idxd, u32 cause)
        }
 
        if (cause & IDXD_INTC_PERFMON_OVFL) {
-               /*
-                * Driver does not utilize perfmon counter overflow interrupt
-                * yet.
-                */
                val |= IDXD_INTC_PERFMON_OVFL;
+               perfmon_counter_overflow(idxd);
        }
 
        val ^= cause;