Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dmaengine: idxd: Enable IDXD performance monitor support

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>

authored by

Tom Zanussi and committed by
Vinod Koul
0bde4444 81dd4d4d

+10 -4
+9
drivers/dma/idxd/init.c
··· 21 21 #include "../dmaengine.h" 22 22 #include "registers.h" 23 23 #include "idxd.h" 24 + #include "perfmon.h" 24 25 25 26 MODULE_VERSION(IDXD_DRIVER_VERSION); 26 27 MODULE_LICENSE("GPL v2"); ··· 542 541 543 542 idxd->major = idxd_cdev_get_major(idxd); 544 543 544 + rc = perfmon_pmu_init(idxd); 545 + if (rc < 0) 546 + dev_warn(dev, "Failed to initialize perfmon. No PMU support: %d\n", rc); 547 + 545 548 dev_dbg(dev, "IDXD device %d probed successfully\n", idxd->id); 546 549 return 0; 547 550 ··· 725 720 if (device_pasid_enabled(idxd)) 726 721 idxd_disable_system_pasid(idxd); 727 722 idxd_unregister_devices(idxd); 723 + perfmon_pmu_remove(idxd); 728 724 iommu_dev_disable_feature(&pdev->dev, IOMMU_DEV_FEAT_SVA); 729 725 } 730 726 ··· 754 748 pr_warn("Platform does not have ENQCMD(S) support.\n"); 755 749 else 756 750 support_enqcmd = true; 751 + 752 + perfmon_init(); 757 753 758 754 err = idxd_register_bus_type(); 759 755 if (err < 0) ··· 790 782 pci_unregister_driver(&idxd_pci_driver); 791 783 idxd_cdev_remove(); 792 784 idxd_unregister_bus_type(); 785 + perfmon_exit(); 793 786 } 794 787 module_exit(idxd_exit_module);
+1 -4
drivers/dma/idxd/irq.c
··· 156 156 } 157 157 158 158 if (cause & IDXD_INTC_PERFMON_OVFL) { 159 - /* 160 - * Driver does not utilize perfmon counter overflow interrupt 161 - * yet. 162 - */ 163 159 val |= IDXD_INTC_PERFMON_OVFL; 160 + perfmon_counter_overflow(idxd); 164 161 } 165 162 166 163 val ^= cause;