Messages in this thread | | | From | Joakim Zhang <> | Subject | RE: [PATCH] drivers/perf: hisi: Add identifier sysfs file | Date | Thu, 18 Jun 2020 01:39:53 +0000 |
| |
Hi John,
Happy to know that there is a version register in hisilicon SoC.
John, Will, Mark, is there any conclusion for other SoCs which don't have such version register, but still want to expose identifier to userspace? Thanks a lot.
Best Regards, Joakim Zhang
> -----Original Message----- > From: John Garry <john.garry@huawei.com> > Sent: 2020年6月17日 21:05 > To: zhangshaokun@hisilicon.com; will@kernel.org; mark.rutland@arm.com > Cc: linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; Joakim > Zhang <qiangqing.zhang@nxp.com>; jolsa@redhat.com; > linuxarm@huawei.com; John Garry <john.garry@huawei.com> > Subject: [PATCH] drivers/perf: hisi: Add identifier sysfs file > > To allow userspace to identify the specific implementation of the device, add an > "identifier" sysfs file. > > Encoding is as follows: > hi1620: 0x0 (aka hip08) > hi1630: 0x30 > > Signed-off-by: John Garry <john.garry@huawei.com> > > diff --git a/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c > b/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c > index 15713faaa07e..a83d99f2662e 100644 > --- a/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c > +++ b/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c > @@ -33,6 +33,7 @@ > #define DDRC_INT_MASK 0x6c8 > #define DDRC_INT_STATUS 0x6cc > #define DDRC_INT_CLEAR 0x6d0 > +#define DDRC_VERSION 0x710 > > /* DDRC has 8-counters */ > #define DDRC_NR_COUNTERS 0x8 > @@ -267,6 +268,8 @@ static int hisi_ddrc_pmu_init_data(struct > platform_device *pdev, > return PTR_ERR(ddrc_pmu->base); > } > > + ddrc_pmu->identifier = readl(ddrc_pmu->base + DDRC_VERSION); > + > return 0; > } > > @@ -308,10 +311,23 @@ 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 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, > &hisi_ddrc_pmu_cpumask_attr_group, > + &hisi_ddrc_pmu_identifier_group, > NULL, > }; > > diff --git a/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c > b/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c > index dcc5600788a9..4fdaf1d995be 100644 > --- a/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c > +++ b/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c > @@ -23,6 +23,7 @@ > #define HHA_INT_MASK 0x0804 > #define HHA_INT_STATUS 0x0808 > #define HHA_INT_CLEAR 0x080C > +#define HHA_VERSION 0x1cf0 > #define HHA_PERF_CTRL 0x1E00 > #define HHA_EVENT_CTRL 0x1E04 > #define HHA_EVENT_TYPE0 0x1E80 > @@ -261,6 +262,8 @@ static int hisi_hha_pmu_init_data(struct > platform_device *pdev, > return PTR_ERR(hha_pmu->base); > } > > + hha_pmu->identifier = readl(hha_pmu->base + HHA_VERSION); > + > return 0; > } > > @@ -320,10 +323,23 @@ 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 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, > &hisi_hha_pmu_cpumask_attr_group, > + &hisi_hha_pmu_identifier_group, > NULL, > }; > > diff --git a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c > b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c > index 7719ae4e2c56..0e7477220be1 100644 > --- a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c > +++ b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c > @@ -25,6 +25,7 @@ > #define L3C_INT_STATUS 0x0808 > #define L3C_INT_CLEAR 0x080c > #define L3C_EVENT_CTRL 0x1c00 > +#define L3C_VERSION 0x1cf0 > #define L3C_EVENT_TYPE0 0x1d00 > /* > * Each counter is 48-bits and [48:63] are reserved @@ -264,6 +265,8 @@ > static int hisi_l3c_pmu_init_data(struct platform_device *pdev, > return PTR_ERR(l3c_pmu->base); > } > > + l3c_pmu->identifier = readl(l3c_pmu->base + L3C_VERSION); > + > return 0; > } > > @@ -310,10 +313,23 @@ 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 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, > &hisi_l3c_pmu_cpumask_attr_group, > + &hisi_l3c_pmu_identifier_group, > NULL, > }; > > diff --git a/drivers/perf/hisilicon/hisi_uncore_pmu.c > b/drivers/perf/hisilicon/hisi_uncore_pmu.c > index 97aff877a4e7..023e247634db 100644 > --- a/drivers/perf/hisilicon/hisi_uncore_pmu.c > +++ b/drivers/perf/hisilicon/hisi_uncore_pmu.c > @@ -119,6 +119,16 @@ int hisi_uncore_pmu_get_event_idx(struct > perf_event *event) } > EXPORT_SYMBOL_GPL(hisi_uncore_pmu_get_event_idx); > > +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 sprintf(page, "0x%x\n", hisi_pmu->identifier); } > +EXPORT_SYMBOL_GPL(hisi_uncore_pmu_identifier_attr_show); > + > static void hisi_uncore_pmu_clear_event_idx(struct hisi_pmu *hisi_pmu, int > idx) { > if (!hisi_uncore_pmu_counter_valid(hisi_pmu, idx)) { diff --git > a/drivers/perf/hisilicon/hisi_uncore_pmu.h > b/drivers/perf/hisilicon/hisi_uncore_pmu.h > index 25b0c97b3eb0..14ecaf763153 100644 > --- a/drivers/perf/hisilicon/hisi_uncore_pmu.h > +++ b/drivers/perf/hisilicon/hisi_uncore_pmu.h > @@ -74,6 +74,7 @@ struct hisi_pmu { > int counter_bits; > /* check event code range */ > int check_event; > + u32 identifier; > }; > > int hisi_uncore_pmu_counter_valid(struct hisi_pmu *hisi_pmu, int idx); @@ > -96,4 +97,10 @@ ssize_t hisi_cpumask_sysfs_show(struct device *dev, > struct device_attribute *attr, char *buf); int > hisi_uncore_pmu_online_cpu(unsigned int cpu, struct hlist_node *node); int > hisi_uncore_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node); > + > +ssize_t hisi_uncore_pmu_identifier_attr_show(struct device *dev, > + struct device_attribute *attr, > + char *page); > + > + > #endif /* __HISI_UNCORE_PMU_H__ */ > -- > 2.26.2
| |