#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
                return PTR_ERR(ddrc_pmu->base);
        }
 
+       ddrc_pmu->identifier = readl(ddrc_pmu->base + DDRC_VERSION);
+
        return 0;
 }
 
        .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,
 };
 
 
 #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
                return PTR_ERR(hha_pmu->base);
        }
 
+       hha_pmu->identifier = readl(hha_pmu->base + HHA_VERSION);
+
        return 0;
 }
 
        .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,
 };
 
 
 #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
                return PTR_ERR(l3c_pmu->base);
        }
 
+       l3c_pmu->identifier = readl(l3c_pmu->base + L3C_VERSION);
+
        return 0;
 }
 
        .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,
 };
 
 
 }
 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)
 {
        if (!hisi_uncore_pmu_counter_valid(hisi_pmu, idx)) {
 
        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);
                                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__ */