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);
