]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drivers/perf: hisi: Provide a generic implementation of cpumask/identifier
authorYicong Yang <yangyicong@hisilicon.com>
Tue, 10 Dec 2024 14:15:22 +0000 (22:15 +0800)
committerWill Deacon <will@kernel.org>
Tue, 10 Dec 2024 15:57:24 +0000 (15:57 +0000)
Each type of HiSilicon Uncore PMU has the following sysfs attributes:

- format: bitmask in perf_event_attr::config[012] of corresponding
  attribute
- event: events name and corresponding event code
- cpumask: range of CPUs the events can be opened on
- identifier: the version of this PMU

Different types of PMU have different implementations of the "format"
and "event" but all share the same implementation of the "cpumask"
and "identifier". Thus we can move cpumask and identifier to the
hisi_uncore_pmu framework and drivers can use the generic
implementation.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
Link: https://lore.kernel.org/r/20241210141525.37788-8-yangyicong@huawei.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/perf/hisilicon/hisi_uncore_cpa_pmu.c
drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
drivers/perf/hisilicon/hisi_uncore_pa_pmu.c
drivers/perf/hisilicon/hisi_uncore_pmu.c
drivers/perf/hisilicon/hisi_uncore_pmu.h
drivers/perf/hisilicon/hisi_uncore_sllc_pmu.c
drivers/perf/hisilicon/hisi_uncore_uc_pmu.c

index e3a619ea68313e9dfde805c119749c3feba36ff9..b879b81adfddd4776797c4f8649c95abf51a1a59 100644 (file)
@@ -225,34 +225,11 @@ static const struct attribute_group hisi_cpa_pmu_events_group = {
        .attrs = hisi_cpa_pmu_events_attr,
 };
 
-static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
-
-static struct attribute *hisi_cpa_pmu_cpumask_attrs[] = {
-       &dev_attr_cpumask.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_cpa_pmu_cpumask_attr_group = {
-       .attrs = hisi_cpa_pmu_cpumask_attrs,
-};
-
-static struct device_attribute hisi_cpa_pmu_identifier_attr =
-       __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL);
-
-static struct attribute *hisi_cpa_pmu_identifier_attrs[] = {
-       &hisi_cpa_pmu_identifier_attr.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_cpa_pmu_identifier_group = {
-       .attrs = hisi_cpa_pmu_identifier_attrs,
-};
-
 static const struct attribute_group *hisi_cpa_pmu_attr_groups[] = {
        &hisi_cpa_pmu_format_group,
        &hisi_cpa_pmu_events_group,
-       &hisi_cpa_pmu_cpumask_attr_group,
-       &hisi_cpa_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };
 
index 1d12384fef8f44ff3b4d776e829bfb434ec61fe3..75f251a7b30cab7681aee691f09163a98fc95232 100644 (file)
@@ -380,42 +380,19 @@ static const struct attribute_group hisi_ddrc_pmu_v2_events_group = {
        .attrs = hisi_ddrc_pmu_v2_events_attr,
 };
 
-static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
-
-static struct attribute *hisi_ddrc_pmu_cpumask_attrs[] = {
-       &dev_attr_cpumask.attr,
-       NULL,
-};
-
-static const struct attribute_group hisi_ddrc_pmu_cpumask_attr_group = {
-       .attrs = hisi_ddrc_pmu_cpumask_attrs,
-};
-
-static struct device_attribute hisi_ddrc_pmu_identifier_attr =
-       __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL);
-
-static struct attribute *hisi_ddrc_pmu_identifier_attrs[] = {
-       &hisi_ddrc_pmu_identifier_attr.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_ddrc_pmu_identifier_group = {
-       .attrs = hisi_ddrc_pmu_identifier_attrs,
-};
-
 static const struct attribute_group *hisi_ddrc_pmu_v1_attr_groups[] = {
        &hisi_ddrc_pmu_v1_format_group,
        &hisi_ddrc_pmu_v1_events_group,
-       &hisi_ddrc_pmu_cpumask_attr_group,
-       &hisi_ddrc_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL,
 };
 
 static const struct attribute_group *hisi_ddrc_pmu_v2_attr_groups[] = {
        &hisi_ddrc_pmu_v2_format_group,
        &hisi_ddrc_pmu_v2_events_group,
-       &hisi_ddrc_pmu_cpumask_attr_group,
-       &hisi_ddrc_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };
 
index a2b9629a60816c483aecb76bd6ba7765d4d41b0d..ca609db860460497aebc4b92a4ce0537775fe9cf 100644 (file)
@@ -405,42 +405,19 @@ static const struct attribute_group hisi_hha_pmu_v2_events_group = {
        .attrs = hisi_hha_pmu_v2_events_attr,
 };
 
-static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
-
-static struct attribute *hisi_hha_pmu_cpumask_attrs[] = {
-       &dev_attr_cpumask.attr,
-       NULL,
-};
-
-static const struct attribute_group hisi_hha_pmu_cpumask_attr_group = {
-       .attrs = hisi_hha_pmu_cpumask_attrs,
-};
-
-static struct device_attribute hisi_hha_pmu_identifier_attr =
-       __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL);
-
-static struct attribute *hisi_hha_pmu_identifier_attrs[] = {
-       &hisi_hha_pmu_identifier_attr.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_hha_pmu_identifier_group = {
-       .attrs = hisi_hha_pmu_identifier_attrs,
-};
-
 static const struct attribute_group *hisi_hha_pmu_v1_attr_groups[] = {
        &hisi_hha_pmu_v1_format_group,
        &hisi_hha_pmu_v1_events_group,
-       &hisi_hha_pmu_cpumask_attr_group,
-       &hisi_hha_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL,
 };
 
 static const struct attribute_group *hisi_hha_pmu_v2_attr_groups[] = {
        &hisi_hha_pmu_v2_format_group,
        &hisi_hha_pmu_v2_events_group,
-       &hisi_hha_pmu_cpumask_attr_group,
-       &hisi_hha_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };
 
index 5ba49e902535b4207dcd1957be1fcbd989ebf165..412fc3a979639c35754b1339e593ce6dcdd8ab14 100644 (file)
@@ -441,42 +441,19 @@ static const struct attribute_group hisi_l3c_pmu_v2_events_group = {
        .attrs = hisi_l3c_pmu_v2_events_attr,
 };
 
-static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
-
-static struct attribute *hisi_l3c_pmu_cpumask_attrs[] = {
-       &dev_attr_cpumask.attr,
-       NULL,
-};
-
-static const struct attribute_group hisi_l3c_pmu_cpumask_attr_group = {
-       .attrs = hisi_l3c_pmu_cpumask_attrs,
-};
-
-static struct device_attribute hisi_l3c_pmu_identifier_attr =
-       __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL);
-
-static struct attribute *hisi_l3c_pmu_identifier_attrs[] = {
-       &hisi_l3c_pmu_identifier_attr.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_l3c_pmu_identifier_group = {
-       .attrs = hisi_l3c_pmu_identifier_attrs,
-};
-
 static const struct attribute_group *hisi_l3c_pmu_v1_attr_groups[] = {
        &hisi_l3c_pmu_v1_format_group,
        &hisi_l3c_pmu_v1_events_group,
-       &hisi_l3c_pmu_cpumask_attr_group,
-       &hisi_l3c_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL,
 };
 
 static const struct attribute_group *hisi_l3c_pmu_v2_attr_groups[] = {
        &hisi_l3c_pmu_v2_format_group,
        &hisi_l3c_pmu_v2_events_group,
-       &hisi_l3c_pmu_cpumask_attr_group,
-       &hisi_l3c_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };
 
index 48c5357666d06ee12401c858abde64d022812311..a0142684e37918a2f4c35785018298ed3ae51cbd 100644 (file)
@@ -353,29 +353,6 @@ static const struct attribute_group hisi_h60pa_pmu_events_group = {
        .attrs = hisi_h60pa_pmu_events_attr,
 };
 
-static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
-
-static struct attribute *hisi_pa_pmu_cpumask_attrs[] = {
-       &dev_attr_cpumask.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_pa_pmu_cpumask_attr_group = {
-       .attrs = hisi_pa_pmu_cpumask_attrs,
-};
-
-static struct device_attribute hisi_pa_pmu_identifier_attr =
-       __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL);
-
-static struct attribute *hisi_pa_pmu_identifier_attrs[] = {
-       &hisi_pa_pmu_identifier_attr.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_pa_pmu_identifier_group = {
-       .attrs = hisi_pa_pmu_identifier_attrs,
-};
-
 static struct hisi_pa_pmu_int_regs hisi_pa_pmu_regs = {
        .mask_offset = PA_INT_MASK,
        .clear_offset = PA_INT_CLEAR,
@@ -385,8 +362,8 @@ static struct hisi_pa_pmu_int_regs hisi_pa_pmu_regs = {
 static const struct attribute_group *hisi_pa_pmu_v2_attr_groups[] = {
        &hisi_pa_pmu_v2_format_group,
        &hisi_pa_pmu_v2_events_group,
-       &hisi_pa_pmu_cpumask_attr_group,
-       &hisi_pa_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };
 
@@ -399,8 +376,8 @@ static const struct hisi_pmu_dev_info hisi_h32pa_v2 = {
 static const struct attribute_group *hisi_pa_pmu_v3_attr_groups[] = {
        &hisi_pa_pmu_v2_format_group,
        &hisi_pa_pmu_v3_events_group,
-       &hisi_pa_pmu_cpumask_attr_group,
-       &hisi_pa_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };
 
@@ -419,8 +396,8 @@ static struct hisi_pa_pmu_int_regs hisi_h60pa_pmu_regs = {
 static const struct attribute_group *hisi_h60pa_pmu_attr_groups[] = {
        &hisi_pa_pmu_v2_format_group,
        &hisi_h60pa_pmu_events_group,
-       &hisi_pa_pmu_cpumask_attr_group,
-       &hisi_pa_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };
 
index 5f581327a71f646cbcd18f692167e28c3642351c..075aaa8eaeaa4ea6e9f768e3cb20fa195d04af31 100644 (file)
@@ -49,6 +49,41 @@ ssize_t hisi_cpumask_sysfs_show(struct device *dev,
 }
 EXPORT_SYMBOL_NS_GPL(hisi_cpumask_sysfs_show, "HISI_PMU");
 
+static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
+
+static struct attribute *hisi_pmu_cpumask_attrs[] = {
+       &dev_attr_cpumask.attr,
+       NULL
+};
+
+const struct attribute_group hisi_pmu_cpumask_attr_group = {
+       .attrs = hisi_pmu_cpumask_attrs,
+};
+EXPORT_SYMBOL_NS_GPL(hisi_pmu_cpumask_attr_group, "HISI_PMU");
+
+ssize_t hisi_uncore_pmu_identifier_attr_show(struct device *dev,
+                                            struct device_attribute *attr,
+                                            char *page)
+{
+       struct hisi_pmu *hisi_pmu = to_hisi_pmu(dev_get_drvdata(dev));
+
+       return sysfs_emit(page, "0x%08x\n", hisi_pmu->identifier);
+}
+EXPORT_SYMBOL_NS_GPL(hisi_uncore_pmu_identifier_attr_show, "HISI_PMU");
+
+static struct device_attribute hisi_pmu_identifier_attr =
+       __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL);
+
+static struct attribute *hisi_pmu_identifier_attrs[] = {
+       &hisi_pmu_identifier_attr.attr,
+       NULL
+};
+
+const struct attribute_group hisi_pmu_identifier_group = {
+       .attrs = hisi_pmu_identifier_attrs,
+};
+EXPORT_SYMBOL_NS_GPL(hisi_pmu_identifier_group, "HISI_PMU");
+
 static bool hisi_validate_event_group(struct perf_event *event)
 {
        struct perf_event *sibling, *leader = event->group_leader;
@@ -99,16 +134,6 @@ int hisi_uncore_pmu_get_event_idx(struct perf_event *event)
 }
 EXPORT_SYMBOL_NS_GPL(hisi_uncore_pmu_get_event_idx, "HISI_PMU");
 
-ssize_t hisi_uncore_pmu_identifier_attr_show(struct device *dev,
-                                            struct device_attribute *attr,
-                                            char *page)
-{
-       struct hisi_pmu *hisi_pmu = to_hisi_pmu(dev_get_drvdata(dev));
-
-       return sysfs_emit(page, "0x%08x\n", hisi_pmu->identifier);
-}
-EXPORT_SYMBOL_NS_GPL(hisi_uncore_pmu_identifier_attr_show, "HISI_PMU");
-
 static void hisi_uncore_pmu_clear_event_idx(struct hisi_pmu *hisi_pmu, int idx)
 {
        clear_bit(idx, hisi_pmu->pmu_events.used_mask);
index 53b1331b8565e25a03fe5316e49d3ed479798d95..f4fed25448778d349e1e41db6060dd59ab215986 100644 (file)
@@ -137,6 +137,10 @@ struct hisi_pmu {
        u32 identifier;
 };
 
+/* Generic implementation of cpumask/identifier group */
+extern const struct attribute_group hisi_pmu_cpumask_attr_group;
+extern const struct attribute_group hisi_pmu_identifier_group;
+
 int hisi_uncore_pmu_get_event_idx(struct perf_event *event);
 void hisi_uncore_pmu_read(struct perf_event *event);
 int hisi_uncore_pmu_add(struct perf_event *event, int flags);
index ba6af0d3cb2252ea6205bd7e85cd07bfe8b3978f..dbd079016fc4fe6a0b0016b17ac5374d9c9606db 100644 (file)
@@ -344,34 +344,11 @@ static const struct attribute_group hisi_sllc_pmu_v2_events_group = {
        .attrs = hisi_sllc_pmu_v2_events_attr,
 };
 
-static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
-
-static struct attribute *hisi_sllc_pmu_cpumask_attrs[] = {
-       &dev_attr_cpumask.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_sllc_pmu_cpumask_attr_group = {
-       .attrs = hisi_sllc_pmu_cpumask_attrs,
-};
-
-static struct device_attribute hisi_sllc_pmu_identifier_attr =
-       __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL);
-
-static struct attribute *hisi_sllc_pmu_identifier_attrs[] = {
-       &hisi_sllc_pmu_identifier_attr.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_sllc_pmu_identifier_group = {
-       .attrs = hisi_sllc_pmu_identifier_attrs,
-};
-
 static const struct attribute_group *hisi_sllc_pmu_v2_attr_groups[] = {
        &hisi_sllc_pmu_v2_format_group,
        &hisi_sllc_pmu_v2_events_group,
-       &hisi_sllc_pmu_cpumask_attr_group,
-       &hisi_sllc_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };
 
index ba35c9476340d5717b79e52790fb5ce207560346..03cb9b564b9915a3d9e9a53e7a5a6701db95af94 100644 (file)
@@ -437,34 +437,11 @@ static const struct attribute_group hisi_uc_pmu_events_group = {
        .attrs = hisi_uc_pmu_events_attr,
 };
 
-static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
-
-static struct attribute *hisi_uc_pmu_cpumask_attrs[] = {
-       &dev_attr_cpumask.attr,
-       NULL,
-};
-
-static const struct attribute_group hisi_uc_pmu_cpumask_attr_group = {
-       .attrs = hisi_uc_pmu_cpumask_attrs,
-};
-
-static struct device_attribute hisi_uc_pmu_identifier_attr =
-       __ATTR(identifier, 0444, hisi_uncore_pmu_identifier_attr_show, NULL);
-
-static struct attribute *hisi_uc_pmu_identifier_attrs[] = {
-       &hisi_uc_pmu_identifier_attr.attr,
-       NULL
-};
-
-static const struct attribute_group hisi_uc_pmu_identifier_group = {
-       .attrs = hisi_uc_pmu_identifier_attrs,
-};
-
 static const struct attribute_group *hisi_uc_pmu_attr_groups[] = {
        &hisi_uc_pmu_format_group,
        &hisi_uc_pmu_events_group,
-       &hisi_uc_pmu_cpumask_attr_group,
-       &hisi_uc_pmu_identifier_group,
+       &hisi_pmu_cpumask_attr_group,
+       &hisi_pmu_identifier_group,
        NULL
 };