Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3becf452 authored by Mathieu Poirier's avatar Mathieu Poirier Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Acked-by: default avatarJiri 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 5d8bb1ec
Loading
Loading
Loading
Loading
+58 −0
Original line number Original line Diff line number Diff line
@@ -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;
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -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
+2 −0
Original line number Original line Diff line number Diff line
@@ -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;