perf pmu: Save detected hybrid pmus to a global pmu list
[linux-2.6-microblaze.git] / tools / perf / util / pmu.c
index 4422583..6e49c7b 100644 (file)
@@ -25,6 +25,7 @@
 #include "string2.h"
 #include "strbuf.h"
 #include "fncache.h"
+#include "pmu-hybrid.h"
 
 struct perf_pmu perf_pmu__fake;
 
@@ -613,7 +614,6 @@ static struct perf_cpu_map *__pmu_cpumask(const char *path)
  */
 #define SYS_TEMPLATE_ID        "./bus/event_source/devices/%s/identifier"
 #define CPUS_TEMPLATE_UNCORE   "%s/bus/event_source/devices/%s/cpumask"
-#define CPUS_TEMPLATE_CPU      "%s/bus/event_source/devices/%s/cpus"
 
 static struct perf_cpu_map *pmu_cpumask(const char *name)
 {
@@ -645,6 +645,9 @@ static bool pmu_is_uncore(const char *name)
        char path[PATH_MAX];
        const char *sysfs;
 
+       if (perf_pmu__hybrid_mounted(name))
+               return false;
+
        sysfs = sysfs__mountpoint();
        snprintf(path, PATH_MAX, CPUS_TEMPLATE_UNCORE, sysfs, name);
        return file_available(path);
@@ -951,6 +954,7 @@ static struct perf_pmu *pmu_lookup(const char *name)
        pmu->is_uncore = pmu_is_uncore(name);
        if (pmu->is_uncore)
                pmu->id = pmu_id(name);
+       pmu->is_hybrid = perf_pmu__hybrid_mounted(name);
        pmu->max_precise = pmu_max_precise(name);
        pmu_add_cpu_aliases(&aliases, pmu);
        pmu_add_sys_aliases(&aliases, pmu);
@@ -962,6 +966,9 @@ static struct perf_pmu *pmu_lookup(const char *name)
        list_splice(&aliases, &pmu->aliases);
        list_add_tail(&pmu->list, &pmus);
 
+       if (pmu->is_hybrid)
+               list_add_tail(&pmu->hybrid_list, &perf_pmu__hybrid_pmus);
+
        pmu->default_config = perf_pmu__get_default_config(pmu);
 
        return pmu;