Load DesignWare PCIe PMU driver automatically if the system has a PCI
bridge by Ampere.
Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
---
drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c
index 3581d916d851..d752168733cf 100644
--- a/drivers/perf/dwc_pcie_pmu.c
+++ b/drivers/perf/dwc_pcie_pmu.c
@@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void)
module_init(dwc_pcie_pmu_init);
module_exit(dwc_pcie_pmu_exit);
+static const struct pci_device_id dwc_pcie_pmu_table[] = {
+ {
+ PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID),
+ .class = PCI_CLASS_BRIDGE_PCI_NORMAL,
+ .class_mask = ~0,
+ },
+ { }
+};
+MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table);
+
MODULE_DESCRIPTION("PMU driver for DesignWare Cores PCI Express Controller");
MODULE_AUTHOR("Shuai Xue <xueshuai@linux.alibaba.com>");
MODULE_LICENSE("GPL v2");
--
2.46.2
On Tue, Oct 08, 2024 at 11:18:23PM +0000, Ilkka Koskinen wrote: > Load DesignWare PCIe PMU driver automatically if the system has a PCI > bridge by Ampere. > > Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> > --- > drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c > index 3581d916d851..d752168733cf 100644 > --- a/drivers/perf/dwc_pcie_pmu.c > +++ b/drivers/perf/dwc_pcie_pmu.c > @@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void) > module_init(dwc_pcie_pmu_init); > module_exit(dwc_pcie_pmu_exit); > > +static const struct pci_device_id dwc_pcie_pmu_table[] = { > + { > + PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), > + .class = PCI_CLASS_BRIDGE_PCI_NORMAL, > + .class_mask = ~0, > + }, > + { } > +}; > +MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table); Hmm, won't this only work if the driver is modular? Should we be calling pci_register_driver() for the builtin case? Will
Hi Will, On Thu, 24 Oct 2024, Will Deacon wrote: > On Tue, Oct 08, 2024 at 11:18:23PM +0000, Ilkka Koskinen wrote: >> Load DesignWare PCIe PMU driver automatically if the system has a PCI >> bridge by Ampere. >> >> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> >> --- >> drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++ >> 1 file changed, 10 insertions(+) >> >> diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c >> index 3581d916d851..d752168733cf 100644 >> --- a/drivers/perf/dwc_pcie_pmu.c >> +++ b/drivers/perf/dwc_pcie_pmu.c >> @@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void) >> module_init(dwc_pcie_pmu_init); >> module_exit(dwc_pcie_pmu_exit); >> >> +static const struct pci_device_id dwc_pcie_pmu_table[] = { >> + { >> + PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), >> + .class = PCI_CLASS_BRIDGE_PCI_NORMAL, >> + .class_mask = ~0, >> + }, >> + { } >> +}; >> +MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table); > > Hmm, won't this only work if the driver is modular? Should we be calling > pci_register_driver() for the builtin case? That would be the normal case indeed. However, this driver is quite different: dwc_pcie_pmu_init() goes through all the pci devices looking for root ports with the pmu capabilities. Moreover, the probe function isn't bound to any specific vendor/class/device IDs. This patch simply makes sure the driver is loaded and the init function gets called, if the driver was built as module and ran on Ampere system. Cheers, Ilkka > > Will >
On Thu, Oct 24, 2024 at 03:19:17PM -0700, Ilkka Koskinen wrote: > > Hi Will, > > On Thu, 24 Oct 2024, Will Deacon wrote: > > On Tue, Oct 08, 2024 at 11:18:23PM +0000, Ilkka Koskinen wrote: > > > Load DesignWare PCIe PMU driver automatically if the system has a PCI > > > bridge by Ampere. > > > > > > Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> > > > --- > > > drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++ > > > 1 file changed, 10 insertions(+) > > > > > > diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c > > > index 3581d916d851..d752168733cf 100644 > > > --- a/drivers/perf/dwc_pcie_pmu.c > > > +++ b/drivers/perf/dwc_pcie_pmu.c > > > @@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void) > > > module_init(dwc_pcie_pmu_init); > > > module_exit(dwc_pcie_pmu_exit); > > > > > > +static const struct pci_device_id dwc_pcie_pmu_table[] = { > > > + { > > > + PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), > > > + .class = PCI_CLASS_BRIDGE_PCI_NORMAL, > > > + .class_mask = ~0, > > > + }, > > > + { } > > > +}; > > > +MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table); > > > > Hmm, won't this only work if the driver is modular? Should we be calling > > pci_register_driver() for the builtin case? > > That would be the normal case indeed. However, this driver is quite > different: dwc_pcie_pmu_init() goes through all the pci devices looking for > root ports with the pmu capabilities. Moreover, the probe function isn't > bound to any specific vendor/class/device IDs. This patch simply makes sure > the driver is loaded and the init function gets called, if the driver was > built as module and ran on Ampere system. Ok, but that seems like the wrong approach, no? We end up with a weird list of vendors who want the thing to probe on their SoCs and, by omission, everybody not on the list doesn't want that behaviour. Will
On Mon, 28 Oct 2024, Will Deacon wrote: > On Thu, Oct 24, 2024 at 03:19:17PM -0700, Ilkka Koskinen wrote: >> >> Hi Will, >> >> On Thu, 24 Oct 2024, Will Deacon wrote: >>> On Tue, Oct 08, 2024 at 11:18:23PM +0000, Ilkka Koskinen wrote: >>>> Load DesignWare PCIe PMU driver automatically if the system has a PCI >>>> bridge by Ampere. >>>> >>>> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> >>>> --- >>>> drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++ >>>> 1 file changed, 10 insertions(+) >>>> >>>> diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c >>>> index 3581d916d851..d752168733cf 100644 >>>> --- a/drivers/perf/dwc_pcie_pmu.c >>>> +++ b/drivers/perf/dwc_pcie_pmu.c >>>> @@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void) >>>> module_init(dwc_pcie_pmu_init); >>>> module_exit(dwc_pcie_pmu_exit); >>>> >>>> +static const struct pci_device_id dwc_pcie_pmu_table[] = { >>>> + { >>>> + PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), >>>> + .class = PCI_CLASS_BRIDGE_PCI_NORMAL, >>>> + .class_mask = ~0, >>>> + }, >>>> + { } >>>> +}; >>>> +MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table); >>> >>> Hmm, won't this only work if the driver is modular? Should we be calling >>> pci_register_driver() for the builtin case? >> >> That would be the normal case indeed. However, this driver is quite >> different: dwc_pcie_pmu_init() goes through all the pci devices looking for >> root ports with the pmu capabilities. Moreover, the probe function isn't >> bound to any specific vendor/class/device IDs. This patch simply makes sure >> the driver is loaded and the init function gets called, if the driver was >> built as module and ran on Ampere system. > > Ok, but that seems like the wrong approach, no? We end up with a weird > list of vendors who want the thing to probe on their SoCs and, by > omission, everybody not on the list doesn't want that behaviour. Ideally, dwc pmu driver would claim the supported root ports but I think the PCIe driver is doing that. How about if we simply drop the auto loading patch and let users to manually load the driver as they have been doing so far? Cheers, Ilkka > > Will >
On Mon, Oct 28, 2024 at 08:27:27PM -0700, Ilkka Koskinen wrote: > > On Mon, 28 Oct 2024, Will Deacon wrote: > > On Thu, Oct 24, 2024 at 03:19:17PM -0700, Ilkka Koskinen wrote: > > > > > > Hi Will, > > > > > > On Thu, 24 Oct 2024, Will Deacon wrote: > > > > On Tue, Oct 08, 2024 at 11:18:23PM +0000, Ilkka Koskinen wrote: > > > > > Load DesignWare PCIe PMU driver automatically if the system has a PCI > > > > > bridge by Ampere. > > > > > > > > > > Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> > > > > > --- > > > > > drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++ > > > > > 1 file changed, 10 insertions(+) > > > > > > > > > > diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c > > > > > index 3581d916d851..d752168733cf 100644 > > > > > --- a/drivers/perf/dwc_pcie_pmu.c > > > > > +++ b/drivers/perf/dwc_pcie_pmu.c > > > > > @@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void) > > > > > module_init(dwc_pcie_pmu_init); > > > > > module_exit(dwc_pcie_pmu_exit); > > > > > > > > > > +static const struct pci_device_id dwc_pcie_pmu_table[] = { > > > > > + { > > > > > + PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), > > > > > + .class = PCI_CLASS_BRIDGE_PCI_NORMAL, > > > > > + .class_mask = ~0, > > > > > + }, > > > > > + { } > > > > > +}; > > > > > +MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table); > > > > > > > > Hmm, won't this only work if the driver is modular? Should we be calling > > > > pci_register_driver() for the builtin case? > > > > > > That would be the normal case indeed. However, this driver is quite > > > different: dwc_pcie_pmu_init() goes through all the pci devices looking for > > > root ports with the pmu capabilities. Moreover, the probe function isn't > > > bound to any specific vendor/class/device IDs. This patch simply makes sure > > > the driver is loaded and the init function gets called, if the driver was > > > built as module and ran on Ampere system. > > > > Ok, but that seems like the wrong approach, no? We end up with a weird > > list of vendors who want the thing to probe on their SoCs and, by > > omission, everybody not on the list doesn't want that behaviour. > > Ideally, dwc pmu driver would claim the supported root ports but I think the > PCIe driver is doing that. How about if we simply drop the auto loading > patch and let users to manually load the driver as they have been doing so > far? Sure, I'll pick the other two up. Thanks! Will
On Tue, 29 Oct 2024 13:00:15 +0000 Will Deacon <will@kernel.org> wrote: > On Mon, Oct 28, 2024 at 08:27:27PM -0700, Ilkka Koskinen wrote: > > > > On Mon, 28 Oct 2024, Will Deacon wrote: > > > On Thu, Oct 24, 2024 at 03:19:17PM -0700, Ilkka Koskinen wrote: > > > > > > > > Hi Will, > > > > > > > > On Thu, 24 Oct 2024, Will Deacon wrote: > > > > > On Tue, Oct 08, 2024 at 11:18:23PM +0000, Ilkka Koskinen wrote: > > > > > > Load DesignWare PCIe PMU driver automatically if the system has a PCI > > > > > > bridge by Ampere. > > > > > > > > > > > > Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> > > > > > > --- > > > > > > drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++ > > > > > > 1 file changed, 10 insertions(+) > > > > > > > > > > > > diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c > > > > > > index 3581d916d851..d752168733cf 100644 > > > > > > --- a/drivers/perf/dwc_pcie_pmu.c > > > > > > +++ b/drivers/perf/dwc_pcie_pmu.c > > > > > > @@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void) > > > > > > module_init(dwc_pcie_pmu_init); > > > > > > module_exit(dwc_pcie_pmu_exit); > > > > > > > > > > > > +static const struct pci_device_id dwc_pcie_pmu_table[] = { > > > > > > + { > > > > > > + PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), > > > > > > + .class = PCI_CLASS_BRIDGE_PCI_NORMAL, > > > > > > + .class_mask = ~0, > > > > > > + }, > > > > > > + { } > > > > > > +}; > > > > > > +MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table); > > > > > > > > > > Hmm, won't this only work if the driver is modular? Should we be calling > > > > > pci_register_driver() for the builtin case? > > > > > > > > That would be the normal case indeed. However, this driver is quite > > > > different: dwc_pcie_pmu_init() goes through all the pci devices looking for > > > > root ports with the pmu capabilities. Moreover, the probe function isn't > > > > bound to any specific vendor/class/device IDs. This patch simply makes sure > > > > the driver is loaded and the init function gets called, if the driver was > > > > built as module and ran on Ampere system. > > > > > > Ok, but that seems like the wrong approach, no? We end up with a weird > > > list of vendors who want the thing to probe on their SoCs and, by > > > omission, everybody not on the list doesn't want that behaviour. > > > > Ideally, dwc pmu driver would claim the supported root ports but I think the > > PCIe driver is doing that. How about if we simply drop the auto loading > > patch and let users to manually load the driver as they have been doing so > > far? Yup. The PCIe portdrv binds to the port. Lots of work needed to clean that up and make it extensible. Maybe we can then kick this PMU driver off from there once it's done. Jonathan > > Sure, I'll pick the other two up. Thanks! > > Will >
Hi Ilkka, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on v6.12-rc2 next-20241009] [cannot apply to arm-perf/for-next/perf] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Ilkka-Koskinen/perf-dwc_pcie-Add-support-for-Ampere-SoCs/20241009-072027 base: linus/master patch link: https://lore.kernel.org/r/20241008231824.5102-3-ilkka%40os.amperecomputing.com patch subject: [PATCH 2/3] perf/dwc_pcie: Load DesignWare PCIe PMU driver automatically on Ampere SoCs config: arm-randconfig-002-20241010 (https://download.01.org/0day-ci/archive/20241010/202410100514.xcrIAa1r-lkp@intel.com/config) compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 70e0a7e7e6a8541bcc46908c592eed561850e416) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241010/202410100514.xcrIAa1r-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202410100514.xcrIAa1r-lkp@intel.com/ All warnings (new ones prefixed by >>): In file included from drivers/perf/dwc_pcie_pmu.c:16: In file included from include/linux/perf_event.h:18: In file included from include/uapi/linux/bpf_perf_event.h:11: In file included from ./arch/arm/include/generated/uapi/asm/bpf_perf_event.h:1: In file included from include/uapi/asm-generic/bpf_perf_event.h:4: In file included from include/linux/ptrace.h:10: In file included from include/linux/pid_namespace.h:7: In file included from include/linux/mm.h:2213: include/linux/vmstat.h:518:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion] 518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" | ~~~~~~~~~~~ ^ ~~~ >> drivers/perf/dwc_pcie_pmu.c:785:35: warning: unused variable 'dwc_pcie_pmu_table' [-Wunused-const-variable] 785 | static const struct pci_device_id dwc_pcie_pmu_table[] = { | ^~~~~~~~~~~~~~~~~~ 2 warnings generated. vim +/dwc_pcie_pmu_table +785 drivers/perf/dwc_pcie_pmu.c 784 > 785 static const struct pci_device_id dwc_pcie_pmu_table[] = { 786 { 787 PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), 788 .class = PCI_CLASS_BRIDGE_PCI_NORMAL, 789 .class_mask = ~0, 790 }, 791 { } 792 }; 793 MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table); 794 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Hi Ilkka, kernel test robot noticed the following build warnings: [auto build test WARNING on linus/master] [also build test WARNING on v6.12-rc2 next-20241009] [cannot apply to arm-perf/for-next/perf] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Ilkka-Koskinen/perf-dwc_pcie-Add-support-for-Ampere-SoCs/20241009-072027 base: linus/master patch link: https://lore.kernel.org/r/20241008231824.5102-3-ilkka%40os.amperecomputing.com patch subject: [PATCH 2/3] perf/dwc_pcie: Load DesignWare PCIe PMU driver automatically on Ampere SoCs config: arc-randconfig-001-20241010 (https://download.01.org/0day-ci/archive/20241010/202410100508.l5fTQewL-lkp@intel.com/config) compiler: arceb-elf-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241010/202410100508.l5fTQewL-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202410100508.l5fTQewL-lkp@intel.com/ All warnings (new ones prefixed by >>): >> drivers/perf/dwc_pcie_pmu.c:785:35: warning: 'dwc_pcie_pmu_table' defined but not used [-Wunused-const-variable=] 785 | static const struct pci_device_id dwc_pcie_pmu_table[] = { | ^~~~~~~~~~~~~~~~~~ vim +/dwc_pcie_pmu_table +785 drivers/perf/dwc_pcie_pmu.c 784 > 785 static const struct pci_device_id dwc_pcie_pmu_table[] = { 786 { 787 PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), 788 .class = PCI_CLASS_BRIDGE_PCI_NORMAL, 789 .class_mask = ~0, 790 }, 791 { } 792 }; 793 MODULE_DEVICE_TABLE(pci, dwc_pcie_pmu_table); 794 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
在 2024/10/9 07:18, Ilkka Koskinen 写道: > Load DesignWare PCIe PMU driver automatically if the system has a PCI > bridge by Ampere. > > Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> > --- > drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c > index 3581d916d851..d752168733cf 100644 > --- a/drivers/perf/dwc_pcie_pmu.c > +++ b/drivers/perf/dwc_pcie_pmu.c > @@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void) > module_init(dwc_pcie_pmu_init); > module_exit(dwc_pcie_pmu_exit); > > +static const struct pci_device_id dwc_pcie_pmu_table[] = { > + { > + PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), Hi, Ilkka, Does all Ampere PCI bridge use this IP? Best Regards, Shuai
Hi Shuai, On Wed, 9 Oct 2024, Shuai Xue wrote: > 在 2024/10/9 07:18, Ilkka Koskinen 写道: >> Load DesignWare PCIe PMU driver automatically if the system has a PCI >> bridge by Ampere. >> >> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> >> --- >> drivers/perf/dwc_pcie_pmu.c | 10 ++++++++++ >> 1 file changed, 10 insertions(+) >> >> diff --git a/drivers/perf/dwc_pcie_pmu.c b/drivers/perf/dwc_pcie_pmu.c >> index 3581d916d851..d752168733cf 100644 >> --- a/drivers/perf/dwc_pcie_pmu.c >> +++ b/drivers/perf/dwc_pcie_pmu.c >> @@ -782,6 +782,16 @@ static void __exit dwc_pcie_pmu_exit(void) >> module_init(dwc_pcie_pmu_init); >> module_exit(dwc_pcie_pmu_exit); >> +static const struct pci_device_id dwc_pcie_pmu_table[] = { >> + { >> + PCI_DEVICE(PCI_VENDOR_ID_AMPERE, PCI_ANY_ID), > > Hi, Ilkka, > > Does all Ampere PCI bridge use this IP? I have checked Altra, AltraMax and AmpereOne SoCs and they all do. Unfortunately, I don't have access to eMAG at this point. If the IP will be changed and the feature won't be supported in the future SoCs, I can certainly change the logic to accept only certain SoCs. Cheers, Ilkka > > Best Regards, > Shuai > > >
© 2016 - 2024 Red Hat, Inc.