perf cs-etm: Refactor initialisation of decoder params.
[linux-2.6-microblaze.git] / tools / perf / util / cs-etm-decoder / cs-etm-decoder.c
index 3e1a05b..187c038 100644 (file)
@@ -35,6 +35,7 @@
 struct cs_etm_decoder {
        void *data;
        void (*packet_printer)(const char *msg);
+       bool suppress_printing;
        dcd_tree_handle_t dcd_tree;
        cs_etm_mem_cb_type mem_access;
        ocsd_datapath_resp_t prev_return;
@@ -74,9 +75,10 @@ int cs_etm_decoder__reset(struct cs_etm_decoder *decoder)
        ocsd_datapath_resp_t dp_ret;
 
        decoder->prev_return = OCSD_RESP_CONT;
-
+       decoder->suppress_printing = true;
        dp_ret = ocsd_dt_process_data(decoder->dcd_tree, OCSD_OP_RESET,
                                      0, 0, NULL, NULL);
+       decoder->suppress_printing = false;
        if (OCSD_DATA_RESP_IS_FATAL(dp_ret))
                return -1;
 
@@ -146,8 +148,10 @@ static void cs_etm_decoder__print_str_cb(const void *p_context,
                                         const char *msg,
                                         const int str_len)
 {
-       if (p_context && str_len)
-               ((struct cs_etm_decoder *)p_context)->packet_printer(msg);
+       const struct cs_etm_decoder *decoder = p_context;
+
+       if (p_context && str_len && !decoder->suppress_printing)
+               decoder->packet_printer(msg);
 }
 
 static int
@@ -223,55 +227,6 @@ cs_etm_decoder__init_raw_frame_logging(
 }
 #endif
 
-static int cs_etm_decoder__create_packet_printer(struct cs_etm_decoder *decoder,
-                                                const char *decoder_name,
-                                                void *trace_config)
-{
-       u8 csid;
-
-       if (ocsd_dt_create_decoder(decoder->dcd_tree, decoder_name,
-                                  OCSD_CREATE_FLG_PACKET_PROC,
-                                  trace_config, &csid))
-               return -1;
-
-       if (ocsd_dt_set_pkt_protocol_printer(decoder->dcd_tree, csid, 0))
-               return -1;
-
-       return 0;
-}
-
-static int
-cs_etm_decoder__create_etm_packet_printer(struct cs_etm_trace_params *t_params,
-                                         struct cs_etm_decoder *decoder)
-{
-       const char *decoder_name;
-       ocsd_etmv3_cfg config_etmv3;
-       ocsd_etmv4_cfg trace_config_etmv4;
-       void *trace_config;
-
-       switch (t_params->protocol) {
-       case CS_ETM_PROTO_ETMV3:
-       case CS_ETM_PROTO_PTM:
-               cs_etm_decoder__gen_etmv3_config(t_params, &config_etmv3);
-               decoder_name = (t_params->protocol == CS_ETM_PROTO_ETMV3) ?
-                                                       OCSD_BUILTIN_DCD_ETMV3 :
-                                                       OCSD_BUILTIN_DCD_PTM;
-               trace_config = &config_etmv3;
-               break;
-       case CS_ETM_PROTO_ETMV4i:
-               cs_etm_decoder__gen_etmv4_config(t_params, &trace_config_etmv4);
-               decoder_name = OCSD_BUILTIN_DCD_ETMV4I;
-               trace_config = &trace_config_etmv4;
-               break;
-       default:
-               return -1;
-       }
-
-       return cs_etm_decoder__create_packet_printer(decoder,
-                                                    decoder_name,
-                                                    trace_config);
-}
-
 static ocsd_datapath_resp_t
 cs_etm_decoder__do_soft_timestamp(struct cs_etm_queue *etmq,
                                  struct cs_etm_packet_queue *packet_queue,
@@ -324,8 +279,11 @@ cs_etm_decoder__do_hard_timestamp(struct cs_etm_queue *etmq,
                 * underflow.
                 */
                packet_queue->cs_timestamp = 0;
-               WARN_ONCE(true, "Zero Coresight timestamp found at Idx:%" OCSD_TRC_IDX_STR
-                               ". Decoding may be improved with --itrace=Z...\n", indx);
+               if (!cs_etm__etmq_is_timeless(etmq))
+                       pr_warning_once("Zero Coresight timestamp found at Idx:%" OCSD_TRC_IDX_STR
+                                       ". Decoding may be improved by prepending 'Z' to your current --itrace arguments.\n",
+                                       indx);
+
        } else if (packet_queue->instr_count > elem->timestamp) {
                /*
                 * Sanity check that the elem->timestamp - packet_queue->instr_count would not
@@ -625,9 +583,10 @@ static ocsd_datapath_resp_t cs_etm_decoder__gen_trace_elem_printer(
        return resp;
 }
 
-static int cs_etm_decoder__create_etm_packet_decoder(
-                                       struct cs_etm_trace_params *t_params,
-                                       struct cs_etm_decoder *decoder)
+static int
+cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
+                                  struct cs_etm_trace_params *t_params,
+                                  struct cs_etm_decoder *decoder)
 {
        const char *decoder_name;
        ocsd_etmv3_cfg config_etmv3;
@@ -653,37 +612,36 @@ static int cs_etm_decoder__create_etm_packet_decoder(
                return -1;
        }
 
-       if (ocsd_dt_create_decoder(decoder->dcd_tree,
-                                    decoder_name,
-                                    OCSD_CREATE_FLG_FULL_DECODER,
-                                    trace_config, &csid))
-               return -1;
+       if (d_params->operation == CS_ETM_OPERATION_DECODE) {
+               if (ocsd_dt_create_decoder(decoder->dcd_tree,
+                                          decoder_name,
+                                          OCSD_CREATE_FLG_FULL_DECODER,
+                                          trace_config, &csid))
+                       return -1;
 
-       if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
-                                      cs_etm_decoder__gen_trace_elem_printer,
-                                      decoder))
-               return -1;
+               if (ocsd_dt_set_gen_elem_outfn(decoder->dcd_tree,
+                                              cs_etm_decoder__gen_trace_elem_printer,
+                                              decoder))
+                       return -1;
 
-       return 0;
-}
+               return 0;
+       } else if (d_params->operation == CS_ETM_OPERATION_PRINT) {
+               if (ocsd_dt_create_decoder(decoder->dcd_tree, decoder_name,
+                                          OCSD_CREATE_FLG_PACKET_PROC,
+                                          trace_config, &csid))
+                       return -1;
 
-static int
-cs_etm_decoder__create_etm_decoder(struct cs_etm_decoder_params *d_params,
-                                  struct cs_etm_trace_params *t_params,
-                                  struct cs_etm_decoder *decoder)
-{
-       if (d_params->operation == CS_ETM_OPERATION_PRINT)
-               return cs_etm_decoder__create_etm_packet_printer(t_params,
-                                                                decoder);
-       else if (d_params->operation == CS_ETM_OPERATION_DECODE)
-               return cs_etm_decoder__create_etm_packet_decoder(t_params,
-                                                                decoder);
+               if (ocsd_dt_set_pkt_protocol_printer(decoder->dcd_tree, csid, 0))
+                       return -1;
+
+               return 0;
+       }
 
        return -1;
 }
 
 struct cs_etm_decoder *
-cs_etm_decoder__new(int num_cpu, struct cs_etm_decoder_params *d_params,
+cs_etm_decoder__new(int decoders, struct cs_etm_decoder_params *d_params,
                    struct cs_etm_trace_params t_params[])
 {
        struct cs_etm_decoder *decoder;
@@ -728,7 +686,7 @@ cs_etm_decoder__new(int num_cpu, struct cs_etm_decoder_params *d_params,
        /* init raw frame logging if required */
        cs_etm_decoder__init_raw_frame_logging(d_params, decoder);
 
-       for (i = 0; i < num_cpu; i++) {
+       for (i = 0; i < decoders; i++) {
                ret = cs_etm_decoder__create_etm_decoder(d_params,
                                                         &t_params[i],
                                                         decoder);