Commit 15a5cd19 authored by Mathieu Poirier's avatar Mathieu Poirier Committed by Arnaldo Carvalho de Melo

perf cs-etm: Add support for PTMv1.1 decoding

This patch is re-using the mechanic set forth by ETMv3 to add support
for PTM decoding.  Configuration for both encoding protocol is similar
but the generated stream itself is very different, hence requiring
special handling.
Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: coresight@lists.linaro.org
Cc: linux-arm-kernel@lists.infradead.org
Link: http://lkml.kernel.org/r/1543955944-10042-4-git-send-email-mathieu.poirier@linaro.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 7d0f4fef
...@@ -256,8 +256,11 @@ cs_etm_decoder__create_etm_packet_printer(struct cs_etm_trace_params *t_params, ...@@ -256,8 +256,11 @@ cs_etm_decoder__create_etm_packet_printer(struct cs_etm_trace_params *t_params,
switch (t_params->protocol) { switch (t_params->protocol) {
case CS_ETM_PROTO_ETMV3: case CS_ETM_PROTO_ETMV3:
case CS_ETM_PROTO_PTM:
cs_etm_decoder__gen_etmv3_config(t_params, &config_etmv3); cs_etm_decoder__gen_etmv3_config(t_params, &config_etmv3);
decoder_name = OCSD_BUILTIN_DCD_ETMV3; decoder_name = (t_params->protocol == CS_ETM_PROTO_ETMV3) ?
OCSD_BUILTIN_DCD_ETMV3 :
OCSD_BUILTIN_DCD_PTM;
trace_config = &config_etmv3; trace_config = &config_etmv3;
break; break;
case CS_ETM_PROTO_ETMV4i: case CS_ETM_PROTO_ETMV4i:
...@@ -453,8 +456,11 @@ static int cs_etm_decoder__create_etm_packet_decoder( ...@@ -453,8 +456,11 @@ static int cs_etm_decoder__create_etm_packet_decoder(
switch (t_params->protocol) { switch (t_params->protocol) {
case CS_ETM_PROTO_ETMV3: case CS_ETM_PROTO_ETMV3:
case CS_ETM_PROTO_PTM:
cs_etm_decoder__gen_etmv3_config(t_params, &config_etmv3); cs_etm_decoder__gen_etmv3_config(t_params, &config_etmv3);
decoder_name = OCSD_BUILTIN_DCD_ETMV3; decoder_name = (t_params->protocol == CS_ETM_PROTO_ETMV3) ?
OCSD_BUILTIN_DCD_ETMV3 :
OCSD_BUILTIN_DCD_PTM;
trace_config = &config_etmv3; trace_config = &config_etmv3;
break; break;
case CS_ETM_PROTO_ETMV4i: case CS_ETM_PROTO_ETMV4i:
......
...@@ -96,6 +96,7 @@ enum { ...@@ -96,6 +96,7 @@ enum {
CS_ETM_PROTO_ETMV3 = 1, CS_ETM_PROTO_ETMV3 = 1,
CS_ETM_PROTO_ETMV4i, CS_ETM_PROTO_ETMV4i,
CS_ETM_PROTO_ETMV4d, CS_ETM_PROTO_ETMV4d,
CS_ETM_PROTO_PTM,
}; };
enum { enum {
......
...@@ -83,6 +83,19 @@ static int cs_etm__update_queues(struct cs_etm_auxtrace *etm); ...@@ -83,6 +83,19 @@ static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
pid_t tid, u64 time_); pid_t tid, u64 time_);
/* PTMs ETMIDR [11:8] set to b0011 */
#define ETMIDR_PTM_VERSION 0x00000300
static u32 cs_etm__get_v7_protocol_version(u32 etmidr)
{
etmidr &= ETMIDR_PTM_VERSION;
if (etmidr == ETMIDR_PTM_VERSION)
return CS_ETM_PROTO_PTM;
return CS_ETM_PROTO_ETMV3;
}
static void cs_etm__packet_dump(const char *pkt_string) static void cs_etm__packet_dump(const char *pkt_string)
{ {
const char *color = PERF_COLOR_BLUE; const char *color = PERF_COLOR_BLUE;
...@@ -115,7 +128,10 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm, ...@@ -115,7 +128,10 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
t_params = zalloc(sizeof(*t_params) * etm->num_cpu); t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
for (i = 0; i < etm->num_cpu; i++) { for (i = 0; i < etm->num_cpu; i++) {
if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) { if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
t_params[i].protocol = CS_ETM_PROTO_ETMV3; u32 etmidr = etm->metadata[i][CS_ETM_ETMIDR];
t_params[i].protocol =
cs_etm__get_v7_protocol_version(etmidr);
t_params[i].etmv3.reg_ctrl = t_params[i].etmv3.reg_ctrl =
etm->metadata[i][CS_ETM_ETMCR]; etm->metadata[i][CS_ETM_ETMCR];
t_params[i].etmv3.reg_trc_id = t_params[i].etmv3.reg_trc_id =
...@@ -366,7 +382,10 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm, ...@@ -366,7 +382,10 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
for (i = 0; i < etm->num_cpu; i++) { for (i = 0; i < etm->num_cpu; i++) {
if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) { if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
t_params[i].protocol = CS_ETM_PROTO_ETMV3; u32 etmidr = etm->metadata[i][CS_ETM_ETMIDR];
t_params[i].protocol =
cs_etm__get_v7_protocol_version(etmidr);
t_params[i].etmv3.reg_ctrl = t_params[i].etmv3.reg_ctrl =
etm->metadata[i][CS_ETM_ETMCR]; etm->metadata[i][CS_ETM_ETMCR];
t_params[i].etmv3.reg_trc_id = t_params[i].etmv3.reg_trc_id =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment