1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright(C) 2015-2018 Linaro Limited. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Author: Tor Jeremiassen <tor@ti.com> 7*4882a593Smuzhiyun * Author: Mathieu Poirier <mathieu.poirier@linaro.org> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef INCLUDE__CS_ETM_DECODER_H__ 11*4882a593Smuzhiyun #define INCLUDE__CS_ETM_DECODER_H__ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/types.h> 14*4882a593Smuzhiyun #include <stdio.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct cs_etm_decoder; 17*4882a593Smuzhiyun struct cs_etm_packet; 18*4882a593Smuzhiyun struct cs_etm_packet_queue; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct cs_etm_queue; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun typedef u32 (*cs_etm_mem_cb_type)(struct cs_etm_queue *, u8, u64, size_t, u8 *); 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun struct cs_etmv3_trace_params { 25*4882a593Smuzhiyun u32 reg_ctrl; 26*4882a593Smuzhiyun u32 reg_trc_id; 27*4882a593Smuzhiyun u32 reg_ccer; 28*4882a593Smuzhiyun u32 reg_idr; 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun struct cs_etmv4_trace_params { 32*4882a593Smuzhiyun u32 reg_idr0; 33*4882a593Smuzhiyun u32 reg_idr1; 34*4882a593Smuzhiyun u32 reg_idr2; 35*4882a593Smuzhiyun u32 reg_idr8; 36*4882a593Smuzhiyun u32 reg_configr; 37*4882a593Smuzhiyun u32 reg_traceidr; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct cs_etm_trace_params { 41*4882a593Smuzhiyun int protocol; 42*4882a593Smuzhiyun union { 43*4882a593Smuzhiyun struct cs_etmv3_trace_params etmv3; 44*4882a593Smuzhiyun struct cs_etmv4_trace_params etmv4; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct cs_etm_decoder_params { 49*4882a593Smuzhiyun int operation; 50*4882a593Smuzhiyun void (*packet_printer)(const char *msg); 51*4882a593Smuzhiyun cs_etm_mem_cb_type mem_acc_cb; 52*4882a593Smuzhiyun u8 formatted; 53*4882a593Smuzhiyun u8 fsyncs; 54*4882a593Smuzhiyun u8 hsyncs; 55*4882a593Smuzhiyun u8 frame_aligned; 56*4882a593Smuzhiyun void *data; 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* 60*4882a593Smuzhiyun * The following enums are indexed starting with 1 to align with the 61*4882a593Smuzhiyun * open source coresight trace decoder library. 62*4882a593Smuzhiyun */ 63*4882a593Smuzhiyun enum { 64*4882a593Smuzhiyun CS_ETM_PROTO_ETMV3 = 1, 65*4882a593Smuzhiyun CS_ETM_PROTO_ETMV4i, 66*4882a593Smuzhiyun CS_ETM_PROTO_ETMV4d, 67*4882a593Smuzhiyun CS_ETM_PROTO_PTM, 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun enum cs_etm_decoder_operation { 71*4882a593Smuzhiyun CS_ETM_OPERATION_PRINT = 1, 72*4882a593Smuzhiyun CS_ETM_OPERATION_DECODE, 73*4882a593Smuzhiyun CS_ETM_OPERATION_MAX, 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun int cs_etm_decoder__process_data_block(struct cs_etm_decoder *decoder, 77*4882a593Smuzhiyun u64 indx, const u8 *buf, 78*4882a593Smuzhiyun size_t len, size_t *consumed); 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun struct cs_etm_decoder * 81*4882a593Smuzhiyun cs_etm_decoder__new(int num_cpu, 82*4882a593Smuzhiyun struct cs_etm_decoder_params *d_params, 83*4882a593Smuzhiyun struct cs_etm_trace_params t_params[]); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun void cs_etm_decoder__free(struct cs_etm_decoder *decoder); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun int cs_etm_decoder__add_mem_access_cb(struct cs_etm_decoder *decoder, 88*4882a593Smuzhiyun u64 start, u64 end, 89*4882a593Smuzhiyun cs_etm_mem_cb_type cb_func); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun int cs_etm_decoder__get_packet(struct cs_etm_packet_queue *packet_queue, 92*4882a593Smuzhiyun struct cs_etm_packet *packet); 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun int cs_etm_decoder__reset(struct cs_etm_decoder *decoder); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #endif /* INCLUDE__CS_ETM_DECODER_H__ */ 97