drivers/perf: hisi: Add PMU version for uncore PMU drivers.
authorShaokun Zhang <zhangshaokun@hisilicon.com>
Mon, 8 Mar 2021 06:50:31 +0000 (14:50 +0800)
committerWill Deacon <will@kernel.org>
Thu, 25 Mar 2021 13:03:45 +0000 (13:03 +0000)
For HiSilicon uncore PMU, more versions are supported and some variables
shall be added suffix to distinguish the version which are prepared for
the new drivers.

Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: John Garry <john.garry@huawei.com>
Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: John Garry <john.garry@huawei.com>
Co-developed-by: Qi Liu <liuqi115@huawei.com>
Signed-off-by: Qi Liu <liuqi115@huawei.com>
Signed-off-by: Shaokun Zhang <zhangshaokun@hisilicon.com>
Link: https://lore.kernel.org/r/1615186237-22263-4-git-send-email-zhangshaokun@hisilicon.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c

index 7f7827c..38a0622 100644 (file)
@@ -36,7 +36,8 @@
 
 /* DDRC has 8-counters */
 #define DDRC_NR_COUNTERS       0x8
-#define DDRC_PERF_CTRL_EN      0x2
+#define DDRC_V1_PERF_CTRL_EN   0x2
+#define DDRC_V1_NR_EVENTS      0x7
 
 /*
  * For DDRC PMU, there are eight-events and every event has been mapped
@@ -53,26 +54,26 @@ static const u32 ddrc_reg_off[] = {
 
 /*
  * Select the counter register offset using the counter index.
- * In DDRC there are no programmable counter, the count
- * is readed form the statistics counter register itself.
+ * In PMU v1, there are no programmable counter, the count
+ * is read form the statistics counter register itself.
  */
-static u32 hisi_ddrc_pmu_get_counter_offset(int cntr_idx)
+static u32 hisi_ddrc_pmu_v1_get_counter_offset(int cntr_idx)
 {
        return ddrc_reg_off[cntr_idx];
 }
 
-static u64 hisi_ddrc_pmu_read_counter(struct hisi_pmu *ddrc_pmu,
+static u64 hisi_ddrc_pmu_v1_read_counter(struct hisi_pmu *ddrc_pmu,
                                      struct hw_perf_event *hwc)
 {
        return readl(ddrc_pmu->base +
-                    hisi_ddrc_pmu_get_counter_offset(hwc->idx));
+                    hisi_ddrc_pmu_v1_get_counter_offset(hwc->idx));
 }
 
-static void hisi_ddrc_pmu_write_counter(struct hisi_pmu *ddrc_pmu,
+static void hisi_ddrc_pmu_v1_write_counter(struct hisi_pmu *ddrc_pmu,
                                        struct hw_perf_event *hwc, u64 val)
 {
        writel((u32)val,
-              ddrc_pmu->base + hisi_ddrc_pmu_get_counter_offset(hwc->idx));
+              ddrc_pmu->base + hisi_ddrc_pmu_v1_get_counter_offset(hwc->idx));
 }
 
 /*
@@ -84,28 +85,28 @@ static void hisi_ddrc_pmu_write_evtype(struct hisi_pmu *hha_pmu, int idx,
 {
 }
 
-static void hisi_ddrc_pmu_start_counters(struct hisi_pmu *ddrc_pmu)
+static void hisi_ddrc_pmu_v1_start_counters(struct hisi_pmu *ddrc_pmu)
 {
        u32 val;
 
        /* Set perf_enable in DDRC_PERF_CTRL to start event counting */
        val = readl(ddrc_pmu->base + DDRC_PERF_CTRL);
-       val |= DDRC_PERF_CTRL_EN;
+       val |= DDRC_V1_PERF_CTRL_EN;
        writel(val, ddrc_pmu->base + DDRC_PERF_CTRL);
 }
 
-static void hisi_ddrc_pmu_stop_counters(struct hisi_pmu *ddrc_pmu)
+static void hisi_ddrc_pmu_v1_stop_counters(struct hisi_pmu *ddrc_pmu)
 {
        u32 val;
 
        /* Clear perf_enable in DDRC_PERF_CTRL to stop event counting */
        val = readl(ddrc_pmu->base + DDRC_PERF_CTRL);
-       val &= ~DDRC_PERF_CTRL_EN;
+       val &= ~DDRC_V1_PERF_CTRL_EN;
        writel(val, ddrc_pmu->base + DDRC_PERF_CTRL);
 }
 
-static void hisi_ddrc_pmu_enable_counter(struct hisi_pmu *ddrc_pmu,
-                                        struct hw_perf_event *hwc)
+static void hisi_ddrc_pmu_v1_enable_counter(struct hisi_pmu *ddrc_pmu,
+                                           struct hw_perf_event *hwc)
 {
        u32 val;
 
@@ -115,8 +116,8 @@ static void hisi_ddrc_pmu_enable_counter(struct hisi_pmu *ddrc_pmu,
        writel(val, ddrc_pmu->base + DDRC_EVENT_CTRL);
 }
 
-static void hisi_ddrc_pmu_disable_counter(struct hisi_pmu *ddrc_pmu,
-                                         struct hw_perf_event *hwc)
+static void hisi_ddrc_pmu_v1_disable_counter(struct hisi_pmu *ddrc_pmu,
+                                            struct hw_perf_event *hwc)
 {
        u32 val;
 
@@ -126,7 +127,7 @@ static void hisi_ddrc_pmu_disable_counter(struct hisi_pmu *ddrc_pmu,
        writel(val, ddrc_pmu->base + DDRC_EVENT_CTRL);
 }
 
-static int hisi_ddrc_pmu_get_event_idx(struct perf_event *event)
+static int hisi_ddrc_pmu_v1_get_event_idx(struct perf_event *event)
 {
        struct hisi_pmu *ddrc_pmu = to_hisi_pmu(event->pmu);
        unsigned long *used_mask = ddrc_pmu->pmu_events.used_mask;
@@ -142,8 +143,8 @@ static int hisi_ddrc_pmu_get_event_idx(struct perf_event *event)
        return idx;
 }
 
-static void hisi_ddrc_pmu_enable_counter_int(struct hisi_pmu *ddrc_pmu,
-                                            struct hw_perf_event *hwc)
+static void hisi_ddrc_pmu_v1_enable_counter_int(struct hisi_pmu *ddrc_pmu,
+                                               struct hw_perf_event *hwc)
 {
        u32 val;
 
@@ -153,8 +154,8 @@ static void hisi_ddrc_pmu_enable_counter_int(struct hisi_pmu *ddrc_pmu,
        writel(val, ddrc_pmu->base + DDRC_INT_MASK);
 }
 
-static void hisi_ddrc_pmu_disable_counter_int(struct hisi_pmu *ddrc_pmu,
-                                             struct hw_perf_event *hwc)
+static void hisi_ddrc_pmu_v1_disable_counter_int(struct hisi_pmu *ddrc_pmu,
+                                                struct hw_perf_event *hwc)
 {
        u32 val;
 
@@ -164,12 +165,13 @@ static void hisi_ddrc_pmu_disable_counter_int(struct hisi_pmu *ddrc_pmu,
        writel(val, ddrc_pmu->base + DDRC_INT_MASK);
 }
 
-static u32 hisi_ddrc_pmu_get_int_status(struct hisi_pmu *ddrc_pmu)
+static u32 hisi_ddrc_pmu_v1_get_int_status(struct hisi_pmu *ddrc_pmu)
 {
        return readl(ddrc_pmu->base + DDRC_INT_STATUS);
 }
 
-static void hisi_ddrc_pmu_clear_int_status(struct hisi_pmu *ddrc_pmu, int idx)
+static void hisi_ddrc_pmu_v1_clear_int_status(struct hisi_pmu *ddrc_pmu,
+                                             int idx)
 {
        writel(1 << idx, ddrc_pmu->base + DDRC_INT_CLEAR);
 }
@@ -212,17 +214,17 @@ static int hisi_ddrc_pmu_init_data(struct platform_device *pdev,
        return 0;
 }
 
-static struct attribute *hisi_ddrc_pmu_format_attr[] = {
+static struct attribute *hisi_ddrc_pmu_v1_format_attr[] = {
        HISI_PMU_FORMAT_ATTR(event, "config:0-4"),
        NULL,
 };
 
-static const struct attribute_group hisi_ddrc_pmu_format_group = {
+static const struct attribute_group hisi_ddrc_pmu_v1_format_group = {
        .name = "format",
-       .attrs = hisi_ddrc_pmu_format_attr,
+       .attrs = hisi_ddrc_pmu_v1_format_attr,
 };
 
-static struct attribute *hisi_ddrc_pmu_events_attr[] = {
+static struct attribute *hisi_ddrc_pmu_v1_events_attr[] = {
        HISI_PMU_EVENT_ATTR(flux_wr,            0x00),
        HISI_PMU_EVENT_ATTR(flux_rd,            0x01),
        HISI_PMU_EVENT_ATTR(flux_wcmd,          0x02),
@@ -234,9 +236,9 @@ static struct attribute *hisi_ddrc_pmu_events_attr[] = {
        NULL,
 };
 
-static const struct attribute_group hisi_ddrc_pmu_events_group = {
+static const struct attribute_group hisi_ddrc_pmu_v1_events_group = {
        .name = "events",
-       .attrs = hisi_ddrc_pmu_events_attr,
+       .attrs = hisi_ddrc_pmu_v1_events_attr,
 };
 
 static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
@@ -262,27 +264,27 @@ static const struct attribute_group hisi_ddrc_pmu_identifier_group = {
        .attrs = hisi_ddrc_pmu_identifier_attrs,
 };
 
-static const struct attribute_group *hisi_ddrc_pmu_attr_groups[] = {
-       &hisi_ddrc_pmu_format_group,
-       &hisi_ddrc_pmu_events_group,
+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,
        NULL,
 };
 
-static const struct hisi_uncore_ops hisi_uncore_ddrc_ops = {
+static const struct hisi_uncore_ops hisi_uncore_ddrc_v1_ops = {
        .write_evtype           = hisi_ddrc_pmu_write_evtype,
-       .get_event_idx          = hisi_ddrc_pmu_get_event_idx,
-       .start_counters         = hisi_ddrc_pmu_start_counters,
-       .stop_counters          = hisi_ddrc_pmu_stop_counters,
-       .enable_counter         = hisi_ddrc_pmu_enable_counter,
-       .disable_counter        = hisi_ddrc_pmu_disable_counter,
-       .enable_counter_int     = hisi_ddrc_pmu_enable_counter_int,
-       .disable_counter_int    = hisi_ddrc_pmu_disable_counter_int,
-       .write_counter          = hisi_ddrc_pmu_write_counter,
-       .read_counter           = hisi_ddrc_pmu_read_counter,
-       .get_int_status         = hisi_ddrc_pmu_get_int_status,
-       .clear_int_status       = hisi_ddrc_pmu_clear_int_status,
+       .get_event_idx          = hisi_ddrc_pmu_v1_get_event_idx,
+       .start_counters         = hisi_ddrc_pmu_v1_start_counters,
+       .stop_counters          = hisi_ddrc_pmu_v1_stop_counters,
+       .enable_counter         = hisi_ddrc_pmu_v1_enable_counter,
+       .disable_counter        = hisi_ddrc_pmu_v1_disable_counter,
+       .enable_counter_int     = hisi_ddrc_pmu_v1_enable_counter_int,
+       .disable_counter_int    = hisi_ddrc_pmu_v1_disable_counter_int,
+       .write_counter          = hisi_ddrc_pmu_v1_write_counter,
+       .read_counter           = hisi_ddrc_pmu_v1_read_counter,
+       .get_int_status         = hisi_ddrc_pmu_v1_get_int_status,
+       .clear_int_status       = hisi_ddrc_pmu_v1_clear_int_status,
 };
 
 static int hisi_ddrc_pmu_dev_probe(struct platform_device *pdev,
@@ -300,10 +302,10 @@ static int hisi_ddrc_pmu_dev_probe(struct platform_device *pdev,
 
        ddrc_pmu->num_counters = DDRC_NR_COUNTERS;
        ddrc_pmu->counter_bits = 32;
-       ddrc_pmu->ops = &hisi_uncore_ddrc_ops;
+       ddrc_pmu->ops = &hisi_uncore_ddrc_v1_ops;
        ddrc_pmu->dev = &pdev->dev;
        ddrc_pmu->on_cpu = -1;
-       ddrc_pmu->check_event = 7;
+       ddrc_pmu->check_event = DDRC_V1_NR_EVENTS;
 
        return 0;
 }
@@ -345,7 +347,7 @@ static int hisi_ddrc_pmu_probe(struct platform_device *pdev)
                .start          = hisi_uncore_pmu_start,
                .stop           = hisi_uncore_pmu_stop,
                .read           = hisi_uncore_pmu_read,
-               .attr_groups    = hisi_ddrc_pmu_attr_groups,
+               .attr_groups    = hisi_ddrc_pmu_v1_attr_groups,
                .capabilities   = PERF_PMU_CAP_NO_EXCLUDE,
        };
 
index 667eebd..f779d70 100644 (file)
 #define HHA_CNT0_LOWER         0x1F00
 
 /* HHA has 16-counters */
-#define HHA_NR_COUNTERS                0x10
+#define HHA_V1_NR_COUNTERS     0x10
 
 #define HHA_PERF_CTRL_EN       0x1
 #define HHA_EVTYPE_NONE                0xff
+#define HHA_V1_NR_EVENT                0x65
 
 /*
  * Select the counter register offset using the counter index
@@ -206,17 +207,17 @@ static int hisi_hha_pmu_init_data(struct platform_device *pdev,
        return 0;
 }
 
-static struct attribute *hisi_hha_pmu_format_attr[] = {
+static struct attribute *hisi_hha_pmu_v1_format_attr[] = {
        HISI_PMU_FORMAT_ATTR(event, "config:0-7"),
        NULL,
 };
 
-static const struct attribute_group hisi_hha_pmu_format_group = {
+static const struct attribute_group hisi_hha_pmu_v1_format_group = {
        .name = "format",
-       .attrs = hisi_hha_pmu_format_attr,
+       .attrs = hisi_hha_pmu_v1_format_attr,
 };
 
-static struct attribute *hisi_hha_pmu_events_attr[] = {
+static struct attribute *hisi_hha_pmu_v1_events_attr[] = {
        HISI_PMU_EVENT_ATTR(rx_ops_num,         0x00),
        HISI_PMU_EVENT_ATTR(rx_outer,           0x01),
        HISI_PMU_EVENT_ATTR(rx_sccl,            0x02),
@@ -246,9 +247,9 @@ static struct attribute *hisi_hha_pmu_events_attr[] = {
        NULL,
 };
 
-static const struct attribute_group hisi_hha_pmu_events_group = {
+static const struct attribute_group hisi_hha_pmu_v1_events_group = {
        .name = "events",
-       .attrs = hisi_hha_pmu_events_attr,
+       .attrs = hisi_hha_pmu_v1_events_attr,
 };
 
 static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
@@ -274,9 +275,9 @@ static const struct attribute_group hisi_hha_pmu_identifier_group = {
        .attrs = hisi_hha_pmu_identifier_attrs,
 };
 
-static const struct attribute_group *hisi_hha_pmu_attr_groups[] = {
-       &hisi_hha_pmu_format_group,
-       &hisi_hha_pmu_events_group,
+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,
        NULL,
@@ -310,12 +311,12 @@ static int hisi_hha_pmu_dev_probe(struct platform_device *pdev,
        if (ret)
                return ret;
 
-       hha_pmu->num_counters = HHA_NR_COUNTERS;
+       hha_pmu->num_counters = HHA_V1_NR_COUNTERS;
        hha_pmu->counter_bits = 48;
        hha_pmu->ops = &hisi_uncore_hha_ops;
        hha_pmu->dev = &pdev->dev;
        hha_pmu->on_cpu = -1;
-       hha_pmu->check_event = 0x65;
+       hha_pmu->check_event = HHA_V1_NR_EVENT;
 
        return 0;
 }
@@ -357,7 +358,7 @@ static int hisi_hha_pmu_probe(struct platform_device *pdev)
                .start          = hisi_uncore_pmu_start,
                .stop           = hisi_uncore_pmu_stop,
                .read           = hisi_uncore_pmu_read,
-               .attr_groups    = hisi_hha_pmu_attr_groups,
+               .attr_groups    = hisi_hha_pmu_v1_attr_groups,
                .capabilities   = PERF_PMU_CAP_NO_EXCLUDE,
        };
 
index 831622e..2b26386 100644 (file)
@@ -37,6 +37,7 @@
 
 #define L3C_PERF_CTRL_EN       0x10000
 #define L3C_EVTYPE_NONE                0xff
+#define L3C_V1_NR_EVENTS       0x59
 
 /*
  * Select the counter register offset using the counter index
@@ -209,17 +210,17 @@ static int hisi_l3c_pmu_init_data(struct platform_device *pdev,
        return 0;
 }
 
-static struct attribute *hisi_l3c_pmu_format_attr[] = {
+static struct attribute *hisi_l3c_pmu_v1_format_attr[] = {
        HISI_PMU_FORMAT_ATTR(event, "config:0-7"),
        NULL,
 };
 
-static const struct attribute_group hisi_l3c_pmu_format_group = {
+static const struct attribute_group hisi_l3c_pmu_v1_format_group = {
        .name = "format",
-       .attrs = hisi_l3c_pmu_format_attr,
+       .attrs = hisi_l3c_pmu_v1_format_attr,
 };
 
-static struct attribute *hisi_l3c_pmu_events_attr[] = {
+static struct attribute *hisi_l3c_pmu_v1_events_attr[] = {
        HISI_PMU_EVENT_ATTR(rd_cpipe,           0x00),
        HISI_PMU_EVENT_ATTR(wr_cpipe,           0x01),
        HISI_PMU_EVENT_ATTR(rd_hit_cpipe,       0x02),
@@ -236,9 +237,9 @@ static struct attribute *hisi_l3c_pmu_events_attr[] = {
        NULL,
 };
 
-static const struct attribute_group hisi_l3c_pmu_events_group = {
+static const struct attribute_group hisi_l3c_pmu_v1_events_group = {
        .name = "events",
-       .attrs = hisi_l3c_pmu_events_attr,
+       .attrs = hisi_l3c_pmu_v1_events_attr,
 };
 
 static DEVICE_ATTR(cpumask, 0444, hisi_cpumask_sysfs_show, NULL);
@@ -264,9 +265,9 @@ static const struct attribute_group hisi_l3c_pmu_identifier_group = {
        .attrs = hisi_l3c_pmu_identifier_attrs,
 };
 
-static const struct attribute_group *hisi_l3c_pmu_attr_groups[] = {
-       &hisi_l3c_pmu_format_group,
-       &hisi_l3c_pmu_events_group,
+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,
        NULL,
@@ -305,7 +306,7 @@ static int hisi_l3c_pmu_dev_probe(struct platform_device *pdev,
        l3c_pmu->ops = &hisi_uncore_l3c_ops;
        l3c_pmu->dev = &pdev->dev;
        l3c_pmu->on_cpu = -1;
-       l3c_pmu->check_event = 0x59;
+       l3c_pmu->check_event = L3C_V1_NR_EVENTS;
 
        return 0;
 }
@@ -347,7 +348,7 @@ static int hisi_l3c_pmu_probe(struct platform_device *pdev)
                .start          = hisi_uncore_pmu_start,
                .stop           = hisi_uncore_pmu_stop,
                .read           = hisi_uncore_pmu_read,
-               .attr_groups    = hisi_l3c_pmu_attr_groups,
+               .attr_groups    = hisi_l3c_pmu_v1_attr_groups,
                .capabilities   = PERF_PMU_CAP_NO_EXCLUDE,
        };