[v3,1/7] driver/perf: Add identifier sysfs file for CMN

Message ID 1685438374-33287-2-git-send-email-renyu.zj@linux.alibaba.com
State New
Headers
Series Add JSON metrics for arm CMN and Yitian710 DDR |

Commit Message

Jing Zhang May 30, 2023, 9:19 a.m. UTC
  To allow userspace to identify the specific implementation of the device,
add an "identifier" sysfs file. The "identifier" consists of model name
and revision. One of possible identifier is "arm_cmn700_0".

The perf tool can match the arm CMN metric through the identifier.

Signed-off-by: Jing Zhang <renyu.zj@linux.alibaba.com>
---
 drivers/perf/arm-cmn.c | 79 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 71 insertions(+), 8 deletions(-)
  

Comments

kernel test robot May 31, 2023, 2:58 a.m. UTC | #1
Hi Jing,

kernel test robot noticed the following build warnings:

[auto build test WARNING on tip/perf/core]
[also build test WARNING on acme/perf/core arm-perf/for-next/perf linus/master v6.4-rc4 next-20230530]
[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/Jing-Zhang/driver-perf-Add-identifier-sysfs-file-for-CMN/20230530-172139
base:   tip/perf/core
patch link:    https://lore.kernel.org/r/1685438374-33287-2-git-send-email-renyu.zj%40linux.alibaba.com
patch subject: [PATCH v3 1/7] driver/perf: Add identifier sysfs file for CMN
config: hexagon-buildonly-randconfig-r006-20230530 (https://download.01.org/0day-ci/archive/20230531/202305311005.YR2SisSe-lkp@intel.com/config)
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build):
        mkdir -p ~/bin
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/c7483d062f1b91e98b028fa720b8a98b94ec9bc5
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Jing-Zhang/driver-perf-Add-identifier-sysfs-file-for-CMN/20230530-172139
        git checkout c7483d062f1b91e98b028fa720b8a98b94ec9bc5
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang ~/bin/make.cross W=1 O=build_dir ARCH=hexagon olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang ~/bin/make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/perf/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202305311005.YR2SisSe-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from drivers/perf/arm-cmn.c:9:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/hexagon/include/asm/io.h:334:
   include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __raw_readb(PCI_IOBASE + addr);
                             ~~~~~~~~~~ ^
   include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
                                                           ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu'
   #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
                                                     ^
   In file included from drivers/perf/arm-cmn.c:9:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/hexagon/include/asm/io.h:334:
   include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
                                                           ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu'
   #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
                                                     ^
   In file included from drivers/perf/arm-cmn.c:9:
   In file included from include/linux/interrupt.h:11:
   In file included from include/linux/hardirq.h:11:
   In file included from ./arch/hexagon/include/generated/asm/hardirq.h:1:
   In file included from include/asm-generic/hardirq.h:17:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/hexagon/include/asm/io.h:334:
   include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writeb(value, PCI_IOBASE + addr);
                               ~~~~~~~~~~ ^
   include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
                                                         ~~~~~~~~~~ ^
   include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
           __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
                                                         ~~~~~~~~~~ ^
>> drivers/perf/arm-cmn.c:2379:41: warning: unused variable 'arm_cmn600_data' [-Wunused-const-variable]
   static const struct arm_cmn_device_data arm_cmn600_data = {
                                           ^
>> drivers/perf/arm-cmn.c:2384:41: warning: unused variable 'arm_cmn650_data' [-Wunused-const-variable]
   static const struct arm_cmn_device_data arm_cmn650_data = {
                                           ^
>> drivers/perf/arm-cmn.c:2389:41: warning: unused variable 'arm_cmn700_data' [-Wunused-const-variable]
   static const struct arm_cmn_device_data arm_cmn700_data = {
                                           ^
>> drivers/perf/arm-cmn.c:2394:41: warning: unused variable 'arm_ci700_data' [-Wunused-const-variable]
   static const struct arm_cmn_device_data arm_ci700_data = {
                                           ^
   10 warnings generated.


vim +/arm_cmn600_data +2379 drivers/perf/arm-cmn.c

  2378	
> 2379	static const struct arm_cmn_device_data arm_cmn600_data = {
  2380		.model_name = "arm_cmn600",
  2381		.model = CMN600
  2382	};
  2383	
> 2384	static const struct arm_cmn_device_data arm_cmn650_data = {
  2385		.model_name = "arm_cmn650",
  2386		.model = CMN650
  2387	};
  2388	
> 2389	static const struct arm_cmn_device_data arm_cmn700_data = {
  2390		.model_name = "arm_cmn700",
  2391		.model = CMN700
  2392	};
  2393	
> 2394	static const struct arm_cmn_device_data arm_ci700_data = {
  2395		.model_name = "arm_ci700",
  2396		.model = CI700
  2397	};
  2398
  

Patch

diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c
index c968986..cd6962b 100644
--- a/drivers/perf/arm-cmn.c
+++ b/drivers/perf/arm-cmn.c
@@ -334,6 +334,7 @@  struct arm_cmn {
 
 	struct pmu pmu;
 	struct dentry *debug;
+	const char *identifier;
 };
 
 #define to_cmn(p)	container_of(p, struct arm_cmn, pmu)
@@ -347,6 +348,11 @@  struct arm_cmn_nodeid {
 	u8 dev;
 };
 
+struct arm_cmn_device_data {
+	const char * model_name;
+	enum cmn_model model;
+};
+
 static int arm_cmn_xyidbits(const struct arm_cmn *cmn)
 {
 	return fls((cmn->mesh_x - 1) | (cmn->mesh_y - 1) | 2);
@@ -1168,10 +1174,43 @@  static ssize_t arm_cmn_cpumask_show(struct device *dev,
 	.attrs = arm_cmn_cpumask_attrs,
 };
 
+static ssize_t arm_cmn_identifier_show(struct device *dev,
+				       struct device_attribute *attr, char *buf)
+{
+	struct arm_cmn *cmn = to_cmn(dev_get_drvdata(dev));
+
+	return sysfs_emit(buf, "%s\n", cmn->identifier);
+}
+
+static umode_t arm_cmn_identifier_attr_visible(struct kobject *kobj,
+					       struct attribute *attr, int n)
+{
+	struct device *dev = kobj_to_dev(kobj);
+	struct arm_cmn *cmn = to_cmn(dev_get_drvdata(dev));
+
+	if (cmn->identifier == NULL)
+		return 0;
+	return attr->mode;
+}
+
+static struct device_attribute arm_cmn_identifier_attr =
+	__ATTR(identifier, 0444, arm_cmn_identifier_show, NULL);
+
+static struct attribute *arm_cmn_identifier_attrs[] = {
+	&arm_cmn_identifier_attr.attr,
+	NULL
+};
+
+static struct attribute_group arm_cmn_identifier_attr_group = {
+	.attrs = arm_cmn_identifier_attrs,
+	.is_visible = arm_cmn_identifier_attr_visible
+};
+
 static const struct attribute_group *arm_cmn_attr_groups[] = {
 	&arm_cmn_event_attrs_group,
 	&arm_cmn_format_attrs_group,
 	&arm_cmn_cpumask_attr_group,
+	&arm_cmn_identifier_attr_group,
 	NULL
 };
 
@@ -2247,13 +2286,15 @@  static int arm_cmn_probe(struct platform_device *pdev)
 	const char *name;
 	static atomic_t id;
 	int err, rootnode, this_id;
+	const struct arm_cmn_device_data * dev_data;
 
 	cmn = devm_kzalloc(&pdev->dev, sizeof(*cmn), GFP_KERNEL);
 	if (!cmn)
 		return -ENOMEM;
 
 	cmn->dev = &pdev->dev;
-	cmn->model = (unsigned long)device_get_match_data(cmn->dev);
+	dev_data = (const struct arm_cmn_device_data *)device_get_match_data(cmn->dev);
+	cmn->model = dev_data->model;
 	platform_set_drvdata(pdev, cmn);
 
 	if (cmn->model == CMN600 && has_acpi_companion(cmn->dev)) {
@@ -2281,6 +2322,8 @@  static int arm_cmn_probe(struct platform_device *pdev)
 	if (err)
 		return err;
 
+	cmn->identifier = devm_kasprintf(
+		cmn->dev, GFP_KERNEL, "%s_%d", dev_data->model_name, cmn->rev);
 	cmn->cpu = cpumask_local_spread(0, dev_to_node(cmn->dev));
 	cmn->pmu = (struct pmu) {
 		.module = THIS_MODULE,
@@ -2330,12 +2373,32 @@  static int arm_cmn_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static const struct arm_cmn_device_data arm_cmn600_data = {
+	.model_name = "arm_cmn600",
+	.model = CMN600
+};
+
+static const struct arm_cmn_device_data arm_cmn650_data = {
+	.model_name = "arm_cmn650",
+	.model = CMN650
+};
+
+static const struct arm_cmn_device_data arm_cmn700_data = {
+	.model_name = "arm_cmn700",
+	.model = CMN700
+};
+
+static const struct arm_cmn_device_data arm_ci700_data = {
+	.model_name = "arm_ci700",
+	.model = CI700
+};
+
 #ifdef CONFIG_OF
 static const struct of_device_id arm_cmn_of_match[] = {
-	{ .compatible = "arm,cmn-600", .data = (void *)CMN600 },
-	{ .compatible = "arm,cmn-650", .data = (void *)CMN650 },
-	{ .compatible = "arm,cmn-700", .data = (void *)CMN700 },
-	{ .compatible = "arm,ci-700", .data = (void *)CI700 },
+	{ .compatible = "arm,cmn-600", .data = (void *)&arm_cmn600_data },
+	{ .compatible = "arm,cmn-650", .data = (void *)&arm_cmn650_data },
+	{ .compatible = "arm,cmn-700", .data = (void *)&arm_cmn700_data },
+	{ .compatible = "arm,ci-700", .data = (void *)&arm_ci700_data },
 	{}
 };
 MODULE_DEVICE_TABLE(of, arm_cmn_of_match);
@@ -2343,9 +2406,9 @@  static int arm_cmn_remove(struct platform_device *pdev)
 
 #ifdef CONFIG_ACPI
 static const struct acpi_device_id arm_cmn_acpi_match[] = {
-	{ "ARMHC600", CMN600 },
-	{ "ARMHC650", CMN650 },
-	{ "ARMHC700", CMN700 },
+	{ "ARMHC600", (kernel_ulong_t)&arm_cmn600_data },
+	{ "ARMHC650", (kernel_ulong_t)&arm_cmn650_data },
+	{ "ARMHC700", (kernel_ulong_t)&arm_cmn700_data },
 	{}
 };
 MODULE_DEVICE_TABLE(acpi, arm_cmn_acpi_match);