168ffe390SMathieu Poirier /* 268ffe390SMathieu Poirier * SPDX-License-Identifier: GPL-2.0 368ffe390SMathieu Poirier * 468ffe390SMathieu Poirier * Copyright(C) 2015-2018 Linaro Limited. 568ffe390SMathieu Poirier * 668ffe390SMathieu Poirier * Author: Tor Jeremiassen <tor@ti.com> 768ffe390SMathieu Poirier * Author: Mathieu Poirier <mathieu.poirier@linaro.org> 868ffe390SMathieu Poirier */ 968ffe390SMathieu Poirier 1068ffe390SMathieu Poirier #ifndef INCLUDE__CS_ETM_DECODER_H__ 1168ffe390SMathieu Poirier #define INCLUDE__CS_ETM_DECODER_H__ 1268ffe390SMathieu Poirier 1368ffe390SMathieu Poirier #include <linux/types.h> 1468ffe390SMathieu Poirier #include <opencsd/ocsd_if_types.h> 1568ffe390SMathieu Poirier #include <stdio.h> 1668ffe390SMathieu Poirier 175f7cb035SMathieu Poirier struct cs_etm_decoder; 185f7cb035SMathieu Poirier struct cs_etm_packet; 1968ffe390SMathieu Poirier struct cs_etm_packet_queue; 2068ffe390SMathieu Poirier 2168ffe390SMathieu Poirier struct cs_etm_queue; 22af21577cSMathieu Poirier 2368ffe390SMathieu Poirier typedef u32 (*cs_etm_mem_cb_type)(struct cs_etm_queue *, u8, u64, size_t, u8 *, 2478688342SMathieu Poirier const ocsd_mem_space_acc_t); 2578688342SMathieu Poirier 2678688342SMathieu Poirier struct cs_etmv3_trace_params { 2778688342SMathieu Poirier u32 reg_ctrl; 2878688342SMathieu Poirier u32 reg_trc_id; 2978688342SMathieu Poirier u32 reg_ccer; 3078688342SMathieu Poirier u32 reg_idr; 3168ffe390SMathieu Poirier }; 3268ffe390SMathieu Poirier 3368ffe390SMathieu Poirier struct cs_etmv4_trace_params { 3468ffe390SMathieu Poirier u32 reg_idr0; 3568ffe390SMathieu Poirier u32 reg_idr1; 3668ffe390SMathieu Poirier u32 reg_idr2; 3768ffe390SMathieu Poirier u32 reg_idr8; 3868ffe390SMathieu Poirier u32 reg_configr; 3968ffe390SMathieu Poirier u32 reg_traceidr; 40779f414aSJames Clark }; 41779f414aSJames Clark 42779f414aSJames Clark struct cs_ete_trace_params { 43779f414aSJames Clark u32 reg_idr0; 44779f414aSJames Clark u32 reg_idr1; 45779f414aSJames Clark u32 reg_idr2; 46779f414aSJames Clark u32 reg_idr8; 47779f414aSJames Clark u32 reg_configr; 48779f414aSJames Clark u32 reg_traceidr; 49779f414aSJames Clark u32 reg_devarch; 5068ffe390SMathieu Poirier }; 5168ffe390SMathieu Poirier 5268ffe390SMathieu Poirier struct cs_etm_trace_params { 5378688342SMathieu Poirier int protocol; 5468ffe390SMathieu Poirier union { 55779f414aSJames Clark struct cs_etmv3_trace_params etmv3; 5668ffe390SMathieu Poirier struct cs_etmv4_trace_params etmv4; 5768ffe390SMathieu Poirier struct cs_ete_trace_params ete; 5868ffe390SMathieu Poirier }; 5968ffe390SMathieu Poirier }; 6068ffe390SMathieu Poirier 6168ffe390SMathieu Poirier struct cs_etm_decoder_params { 6268ffe390SMathieu Poirier int operation; 63*1764ce06SJames Clark void (*packet_printer)(const char *msg); 64*1764ce06SJames Clark cs_etm_mem_cb_type mem_acc_cb; 65*1764ce06SJames Clark bool formatted; 66*1764ce06SJames Clark bool fsyncs; 6768ffe390SMathieu Poirier bool hsyncs; 6868ffe390SMathieu Poirier bool frame_aligned; 6968ffe390SMathieu Poirier void *data; 7068ffe390SMathieu Poirier }; 7168ffe390SMathieu Poirier 7268ffe390SMathieu Poirier /* 7368ffe390SMathieu Poirier * The following enums are indexed starting with 1 to align with the 7468ffe390SMathieu Poirier * open source coresight trace decoder library. 7568ffe390SMathieu Poirier */ 7668ffe390SMathieu Poirier enum { 7768ffe390SMathieu Poirier CS_ETM_PROTO_ETMV3 = 1, 7815a5cd19SMathieu Poirier CS_ETM_PROTO_ETMV4i, 79779f414aSJames Clark CS_ETM_PROTO_ETMV4d, 8068ffe390SMathieu Poirier CS_ETM_PROTO_PTM, 8168ffe390SMathieu Poirier CS_ETM_PROTO_ETE 8265963e5bSMathieu Poirier }; 8368ffe390SMathieu Poirier 8468ffe390SMathieu Poirier enum cs_etm_decoder_operation { 8565963e5bSMathieu Poirier CS_ETM_OPERATION_PRINT = 1, 8668ffe390SMathieu Poirier CS_ETM_OPERATION_DECODE, 8768ffe390SMathieu Poirier CS_ETM_OPERATION_MAX, 8868ffe390SMathieu Poirier }; 8968ffe390SMathieu Poirier 9068ffe390SMathieu Poirier int cs_etm_decoder__process_data_block(struct cs_etm_decoder *decoder, 9168ffe390SMathieu Poirier u64 indx, const u8 *buf, 9268ffe390SMathieu Poirier size_t len, size_t *consumed); 9368ffe390SMathieu Poirier 9468ffe390SMathieu Poirier struct cs_etm_decoder * 9568ffe390SMathieu Poirier cs_etm_decoder__new(int num_cpu, 9668ffe390SMathieu Poirier struct cs_etm_decoder_params *d_params, 9768ffe390SMathieu Poirier struct cs_etm_trace_params t_params[]); 9868ffe390SMathieu Poirier 99290598beSMathieu Poirier void cs_etm_decoder__free(struct cs_etm_decoder *decoder); 100290598beSMathieu Poirier 101290598beSMathieu Poirier int cs_etm_decoder__add_mem_access_cb(struct cs_etm_decoder *decoder, 102290598beSMathieu Poirier u64 start, u64 end, 1035f7cb035SMathieu Poirier cs_etm_mem_cb_type cb_func); 104290598beSMathieu Poirier 105290598beSMathieu Poirier int cs_etm_decoder__get_packet(struct cs_etm_packet_queue *packet_queue, 106290598beSMathieu Poirier struct cs_etm_packet *packet); 10756c62f52SJames Clark 108290598beSMathieu Poirier int cs_etm_decoder__reset(struct cs_etm_decoder *decoder); 10968ffe390SMathieu Poirier const char *cs_etm_decoder__get_name(struct cs_etm_decoder *decoder); 110 111 #endif /* INCLUDE__CS_ETM_DECODER_H__ */ 112