perf tools: Add sink configuration for cs_etm PMU
Using the PMU::set_drv_config() callback to enable the CoreSight sink that will be used for the trace session. Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: linux-arm-kernel@lists.infradead.org Link: http://lkml.kernel.org/r/1474041004-13956-8-git-send-email-mathieu.poirier@linaro.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
5d8bb1ec74
Коммит
3becf4525d
|
@ -27,12 +27,16 @@
|
||||||
#include "../../util/auxtrace.h"
|
#include "../../util/auxtrace.h"
|
||||||
#include "../../util/cpumap.h"
|
#include "../../util/cpumap.h"
|
||||||
#include "../../util/evlist.h"
|
#include "../../util/evlist.h"
|
||||||
|
#include "../../util/evsel.h"
|
||||||
#include "../../util/pmu.h"
|
#include "../../util/pmu.h"
|
||||||
#include "../../util/thread_map.h"
|
#include "../../util/thread_map.h"
|
||||||
#include "../../util/cs-etm.h"
|
#include "../../util/cs-etm.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define ENABLE_SINK_MAX 128
|
||||||
|
#define CS_BUS_DEVICE_PATH "/bus/coresight/devices/"
|
||||||
|
|
||||||
struct cs_etm_recording {
|
struct cs_etm_recording {
|
||||||
struct auxtrace_record itr;
|
struct auxtrace_record itr;
|
||||||
struct perf_pmu *cs_etm_pmu;
|
struct perf_pmu *cs_etm_pmu;
|
||||||
|
@ -557,3 +561,57 @@ struct auxtrace_record *cs_etm_record_init(int *err)
|
||||||
out:
|
out:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FILE *cs_device__open_file(const char *name)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
char path[PATH_MAX];
|
||||||
|
const char *sysfs;
|
||||||
|
|
||||||
|
sysfs = sysfs__mountpoint();
|
||||||
|
if (!sysfs)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
snprintf(path, PATH_MAX,
|
||||||
|
"%s" CS_BUS_DEVICE_PATH "%s", sysfs, name);
|
||||||
|
|
||||||
|
printf("path: %s\n", path);
|
||||||
|
|
||||||
|
if (stat(path, &st) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return fopen(path, "w");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static __attribute__((format(printf, 2, 3)))
|
||||||
|
int cs_device__print_file(const char *name, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
FILE *file;
|
||||||
|
int ret = -EINVAL;
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
file = cs_device__open_file(name);
|
||||||
|
if (file) {
|
||||||
|
ret = vfprintf(file, fmt, args);
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
|
va_end(args);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cs_etm_set_drv_config(struct perf_evsel_config_term *term)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
char enable_sink[ENABLE_SINK_MAX];
|
||||||
|
|
||||||
|
snprintf(enable_sink, ENABLE_SINK_MAX, "%s/%s",
|
||||||
|
term->val.drv_cfg, "enable_sink");
|
||||||
|
|
||||||
|
ret = cs_device__print_file(enable_sink, "%d", 1);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,9 @@
|
||||||
#ifndef INCLUDE__PERF_CS_ETM_H__
|
#ifndef INCLUDE__PERF_CS_ETM_H__
|
||||||
#define INCLUDE__PERF_CS_ETM_H__
|
#define INCLUDE__PERF_CS_ETM_H__
|
||||||
|
|
||||||
|
#include "../../util/evsel.h"
|
||||||
|
|
||||||
struct auxtrace_record *cs_etm_record_init(int *err);
|
struct auxtrace_record *cs_etm_record_init(int *err);
|
||||||
|
int cs_etm_set_drv_config(struct perf_evsel_config_term *term);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/coresight-pmu.h>
|
#include <linux/coresight-pmu.h>
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
|
|
||||||
|
#include "cs-etm.h"
|
||||||
#include "../../util/pmu.h"
|
#include "../../util/pmu.h"
|
||||||
|
|
||||||
struct perf_event_attr
|
struct perf_event_attr
|
||||||
|
@ -28,6 +29,7 @@ struct perf_event_attr
|
||||||
if (!strcmp(pmu->name, CORESIGHT_ETM_PMU_NAME)) {
|
if (!strcmp(pmu->name, CORESIGHT_ETM_PMU_NAME)) {
|
||||||
/* add ETM default config here */
|
/* add ETM default config here */
|
||||||
pmu->selectable = true;
|
pmu->selectable = true;
|
||||||
|
pmu->set_drv_config = cs_etm_set_drv_config;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче