Commit ac4511c9 authored by John Garry's avatar John Garry Committed by Will Deacon

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 (same for all uncore drivers):
hi1620: 0x0
hi1630: 0x30
Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Link: https://lore.kernel.org/r/1602149181-237415-2-git-send-email-john.garry@huawei.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
parent 6c8cfbf5
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#define DDRC_INT_MASK 0x6c8 #define DDRC_INT_MASK 0x6c8
#define DDRC_INT_STATUS 0x6cc #define DDRC_INT_STATUS 0x6cc
#define DDRC_INT_CLEAR 0x6d0 #define DDRC_INT_CLEAR 0x6d0
#define DDRC_VERSION 0x710
/* DDRC has 8-counters */ /* DDRC has 8-counters */
#define DDRC_NR_COUNTERS 0x8 #define DDRC_NR_COUNTERS 0x8
...@@ -267,6 +268,8 @@ static int hisi_ddrc_pmu_init_data(struct platform_device *pdev, ...@@ -267,6 +268,8 @@ static int hisi_ddrc_pmu_init_data(struct platform_device *pdev,
return PTR_ERR(ddrc_pmu->base); return PTR_ERR(ddrc_pmu->base);
} }
ddrc_pmu->identifier = readl(ddrc_pmu->base + DDRC_VERSION);
return 0; return 0;
} }
...@@ -308,10 +311,23 @@ static const struct attribute_group hisi_ddrc_pmu_cpumask_attr_group = { ...@@ -308,10 +311,23 @@ static const struct attribute_group hisi_ddrc_pmu_cpumask_attr_group = {
.attrs = hisi_ddrc_pmu_cpumask_attrs, .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[] = { static const struct attribute_group *hisi_ddrc_pmu_attr_groups[] = {
&hisi_ddrc_pmu_format_group, &hisi_ddrc_pmu_format_group,
&hisi_ddrc_pmu_events_group, &hisi_ddrc_pmu_events_group,
&hisi_ddrc_pmu_cpumask_attr_group, &hisi_ddrc_pmu_cpumask_attr_group,
&hisi_ddrc_pmu_identifier_group,
NULL, NULL,
}; };
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#define HHA_INT_MASK 0x0804 #define HHA_INT_MASK 0x0804
#define HHA_INT_STATUS 0x0808 #define HHA_INT_STATUS 0x0808
#define HHA_INT_CLEAR 0x080C #define HHA_INT_CLEAR 0x080C
#define HHA_VERSION 0x1cf0
#define HHA_PERF_CTRL 0x1E00 #define HHA_PERF_CTRL 0x1E00
#define HHA_EVENT_CTRL 0x1E04 #define HHA_EVENT_CTRL 0x1E04
#define HHA_EVENT_TYPE0 0x1E80 #define HHA_EVENT_TYPE0 0x1E80
...@@ -261,6 +262,8 @@ static int hisi_hha_pmu_init_data(struct platform_device *pdev, ...@@ -261,6 +262,8 @@ static int hisi_hha_pmu_init_data(struct platform_device *pdev,
return PTR_ERR(hha_pmu->base); return PTR_ERR(hha_pmu->base);
} }
hha_pmu->identifier = readl(hha_pmu->base + HHA_VERSION);
return 0; return 0;
} }
...@@ -320,10 +323,23 @@ static const struct attribute_group hisi_hha_pmu_cpumask_attr_group = { ...@@ -320,10 +323,23 @@ static const struct attribute_group hisi_hha_pmu_cpumask_attr_group = {
.attrs = hisi_hha_pmu_cpumask_attrs, .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[] = { static const struct attribute_group *hisi_hha_pmu_attr_groups[] = {
&hisi_hha_pmu_format_group, &hisi_hha_pmu_format_group,
&hisi_hha_pmu_events_group, &hisi_hha_pmu_events_group,
&hisi_hha_pmu_cpumask_attr_group, &hisi_hha_pmu_cpumask_attr_group,
&hisi_hha_pmu_identifier_group,
NULL, NULL,
}; };
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define L3C_INT_STATUS 0x0808 #define L3C_INT_STATUS 0x0808
#define L3C_INT_CLEAR 0x080c #define L3C_INT_CLEAR 0x080c
#define L3C_EVENT_CTRL 0x1c00 #define L3C_EVENT_CTRL 0x1c00
#define L3C_VERSION 0x1cf0
#define L3C_EVENT_TYPE0 0x1d00 #define L3C_EVENT_TYPE0 0x1d00
/* /*
* Each counter is 48-bits and [48:63] are reserved * 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, ...@@ -264,6 +265,8 @@ static int hisi_l3c_pmu_init_data(struct platform_device *pdev,
return PTR_ERR(l3c_pmu->base); return PTR_ERR(l3c_pmu->base);
} }
l3c_pmu->identifier = readl(l3c_pmu->base + L3C_VERSION);
return 0; return 0;
} }
...@@ -310,10 +313,23 @@ static const struct attribute_group hisi_l3c_pmu_cpumask_attr_group = { ...@@ -310,10 +313,23 @@ static const struct attribute_group hisi_l3c_pmu_cpumask_attr_group = {
.attrs = hisi_l3c_pmu_cpumask_attrs, .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[] = { static const struct attribute_group *hisi_l3c_pmu_attr_groups[] = {
&hisi_l3c_pmu_format_group, &hisi_l3c_pmu_format_group,
&hisi_l3c_pmu_events_group, &hisi_l3c_pmu_events_group,
&hisi_l3c_pmu_cpumask_attr_group, &hisi_l3c_pmu_cpumask_attr_group,
&hisi_l3c_pmu_identifier_group,
NULL, NULL,
}; };
......
...@@ -119,6 +119,16 @@ int hisi_uncore_pmu_get_event_idx(struct perf_event *event) ...@@ -119,6 +119,16 @@ int hisi_uncore_pmu_get_event_idx(struct perf_event *event)
} }
EXPORT_SYMBOL_GPL(hisi_uncore_pmu_get_event_idx); 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 snprintf(page, PAGE_SIZE, "0x%08x\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) static void hisi_uncore_pmu_clear_event_idx(struct hisi_pmu *hisi_pmu, int idx)
{ {
if (!hisi_uncore_pmu_counter_valid(hisi_pmu, idx)) { if (!hisi_uncore_pmu_counter_valid(hisi_pmu, idx)) {
......
...@@ -75,6 +75,7 @@ struct hisi_pmu { ...@@ -75,6 +75,7 @@ struct hisi_pmu {
int counter_bits; int counter_bits;
/* check event code range */ /* check event code range */
int check_event; int check_event;
u32 identifier;
}; };
int hisi_uncore_pmu_counter_valid(struct hisi_pmu *hisi_pmu, int idx); int hisi_uncore_pmu_counter_valid(struct hisi_pmu *hisi_pmu, int idx);
...@@ -97,4 +98,10 @@ ssize_t hisi_cpumask_sysfs_show(struct device *dev, ...@@ -97,4 +98,10 @@ ssize_t hisi_cpumask_sysfs_show(struct device *dev,
struct device_attribute *attr, char *buf); struct device_attribute *attr, char *buf);
int hisi_uncore_pmu_online_cpu(unsigned int cpu, struct hlist_node *node); 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); 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__ */ #endif /* __HISI_UNCORE_PMU_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment