perf tools arm64: Add support for get_cpuid_str function.
The get_cpuid_str function returns the MIDR string of the first online cpu from the range of cpus associated with the PMU CORE device. Signed-off-by: Ganapatrao Kulkarni <ganapatrao.kulkarni@cavium.com> Acked-by: Will Deacon <will.deacon@arm.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Ganapatrao Kulkarni <gklkml16@gmail.com> Cc: Jayachandran C <jnair@caviumnetworks.com> Cc: Jonathan Cameron <jonathan.cameron@huawei.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Robert Richter <robert.richter@cavium.com> Cc: Shaokun Zhang <zhangshaokun@hisilicon.com> Cc: linux-arm-kernel@lists.infradead.org Link: http://lkml.kernel.org/r/20171016183222.25750-3-ganapatrao.kulkarni@cavium.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
54e32dc0f8
commit
b57df28893
|
@ -1,3 +1,4 @@
|
|||
libperf-y += header.o
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <api/fs/fs.h>
|
||||
#include "header.h"
|
||||
|
||||
#define MIDR "/regs/identification/midr_el1"
|
||||
#define MIDR_SIZE 19
|
||||
#define MIDR_REVISION_MASK 0xf
|
||||
#define MIDR_VARIANT_SHIFT 20
|
||||
#define MIDR_VARIANT_MASK (0xf << MIDR_VARIANT_SHIFT)
|
||||
|
||||
char *get_cpuid_str(struct perf_pmu *pmu)
|
||||
{
|
||||
char *buf = NULL;
|
||||
char path[PATH_MAX];
|
||||
const char *sysfs = sysfs__mountpoint();
|
||||
int cpu;
|
||||
u64 midr = 0;
|
||||
struct cpu_map *cpus;
|
||||
FILE *file;
|
||||
|
||||
if (!sysfs || !pmu || !pmu->cpus)
|
||||
return NULL;
|
||||
|
||||
buf = malloc(MIDR_SIZE);
|
||||
if (!buf)
|
||||
return NULL;
|
||||
|
||||
/* read midr from list of cpus mapped to this pmu */
|
||||
cpus = cpu_map__get(pmu->cpus);
|
||||
for (cpu = 0; cpu < cpus->nr; cpu++) {
|
||||
scnprintf(path, PATH_MAX, "%s/devices/system/cpu/cpu%d"MIDR,
|
||||
sysfs, cpus->map[cpu]);
|
||||
|
||||
file = fopen(path, "r");
|
||||
if (!file) {
|
||||
pr_debug("fopen failed for file %s\n", path);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!fgets(buf, MIDR_SIZE, file)) {
|
||||
fclose(file);
|
||||
continue;
|
||||
}
|
||||
fclose(file);
|
||||
|
||||
/* Ignore/clear Variant[23:20] and
|
||||
* Revision[3:0] of MIDR
|
||||
*/
|
||||
midr = strtoul(buf, NULL, 16);
|
||||
midr &= (~(MIDR_VARIANT_MASK | MIDR_REVISION_MASK));
|
||||
scnprintf(buf, MIDR_SIZE, "0x%016lx", midr);
|
||||
/* got midr break loop */
|
||||
break;
|
||||
}
|
||||
|
||||
if (!midr) {
|
||||
pr_err("failed to get cpuid string for PMU %s\n", pmu->name);
|
||||
free(buf);
|
||||
buf = NULL;
|
||||
}
|
||||
|
||||
cpu_map__put(cpus);
|
||||
return buf;
|
||||
}
|
Loading…
Reference in New Issue