xref: /freebsd-src/contrib/opencsd/decoder/source/trc_frame_deformatter_impl.h (revision 46e6e290975f19ea62d03f90ac3e523af4dae557)
1c120c564SAndrew Turner /*
2c120c564SAndrew Turner  * \file       trc_frame_decoder_impl.h
3c120c564SAndrew Turner  * \brief      OpenCSD : Trace Deformatter implementation.
4c120c564SAndrew Turner  *
5c120c564SAndrew Turner  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6c120c564SAndrew Turner  */
7c120c564SAndrew Turner 
8c120c564SAndrew Turner /*
9c120c564SAndrew Turner  * Redistribution and use in source and binary forms, with or without modification,
10c120c564SAndrew Turner  * are permitted provided that the following conditions are met:
11c120c564SAndrew Turner  *
12c120c564SAndrew Turner  * 1. Redistributions of source code must retain the above copyright notice,
13c120c564SAndrew Turner  * this list of conditions and the following disclaimer.
14c120c564SAndrew Turner  *
15c120c564SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright notice,
16c120c564SAndrew Turner  * this list of conditions and the following disclaimer in the documentation
17c120c564SAndrew Turner  * and/or other materials provided with the distribution.
18c120c564SAndrew Turner  *
19c120c564SAndrew Turner  * 3. Neither the name of the copyright holder nor the names of its contributors
20c120c564SAndrew Turner  * may be used to endorse or promote products derived from this software without
21c120c564SAndrew Turner  * specific prior written permission.
22c120c564SAndrew Turner  *
23c120c564SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24c120c564SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25c120c564SAndrew Turner  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26c120c564SAndrew Turner  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27c120c564SAndrew Turner  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28c120c564SAndrew Turner  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29c120c564SAndrew Turner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30c120c564SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31c120c564SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32c120c564SAndrew Turner  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33c120c564SAndrew Turner  */
34c120c564SAndrew Turner 
35c120c564SAndrew Turner #ifndef ARM_TRC_FRAME_DECODER_IMPL_H_INCLUDED
36c120c564SAndrew Turner #define ARM_TRC_FRAME_DECODER_IMPL_H_INCLUDED
37c120c564SAndrew Turner 
38c120c564SAndrew Turner #include "opencsd/ocsd_if_types.h"
39c120c564SAndrew Turner #include "common/comp_attach_pt_t.h"
40c120c564SAndrew Turner #include "interfaces/trc_data_raw_in_i.h"
41c120c564SAndrew Turner #include "interfaces/trc_data_rawframe_in_i.h"
42c120c564SAndrew Turner #include "interfaces/trc_indexer_src_i.h"
43c120c564SAndrew Turner #include "common/trc_component.h"
44c120c564SAndrew Turner 
45c120c564SAndrew Turner //! output data fragment from the current frame - collates bytes associated with an ID.
46c120c564SAndrew Turner typedef struct _out_chan_data {
47c120c564SAndrew Turner     ocsd_trc_index_t index;      //!< trace source index for start of these bytes
48c120c564SAndrew Turner     uint8_t id;             //!< Id for these bytes
49c120c564SAndrew Turner     uint8_t data[15];       //!< frame data bytes for this ID
50c120c564SAndrew Turner     uint32_t valid;         //!< Valid data bytes.
51c120c564SAndrew Turner     uint32_t used;          //!< Data bytes output (used by attached processor).
52c120c564SAndrew Turner } out_chan_data;
53c120c564SAndrew Turner 
54c120c564SAndrew Turner class TraceFmtDcdImpl : public TraceComponent, ITrcDataIn
55c120c564SAndrew Turner {
56c120c564SAndrew Turner private:
57c120c564SAndrew Turner     TraceFmtDcdImpl();
58c120c564SAndrew Turner     TraceFmtDcdImpl(int instNum);
59c120c564SAndrew Turner     virtual ~TraceFmtDcdImpl();
60c120c564SAndrew Turner 
61c120c564SAndrew Turner     /* the data input interface from the reader */
62c120c564SAndrew Turner     virtual ocsd_datapath_resp_t TraceDataIn(  const ocsd_datapath_op_t op,
63c120c564SAndrew Turner                                                 const ocsd_trc_index_t index,
64c120c564SAndrew Turner                                                 const uint32_t dataBlockSize,
65c120c564SAndrew Turner                                                 const uint8_t *pDataBlock,
66c120c564SAndrew Turner                                                 uint32_t *numBytesProcessed);
67c120c564SAndrew Turner 
68c120c564SAndrew Turner     /* enable / disable ID streams - default as all enabled */
69c120c564SAndrew Turner     ocsd_err_t OutputFilterIDs(std::vector<uint8_t> &id_list, bool bEnable);
70c120c564SAndrew Turner     ocsd_err_t OutputFilterAllIDs(bool bEnable);
71c120c564SAndrew Turner 
72c120c564SAndrew Turner     /* decode control */
73c120c564SAndrew Turner     ocsd_datapath_resp_t Reset();    /* reset the decode to the start state, drop partial data - propogate to attached components */
74c120c564SAndrew Turner     ocsd_datapath_resp_t Flush();
75c120c564SAndrew Turner     ocsd_err_t DecodeConfigure(uint32_t flags);
76c120c564SAndrew Turner     ocsd_err_t SetForcedSyncIndex(ocsd_trc_index_t index, bool bSet);
77c120c564SAndrew Turner 
SetDemuxStatsBlock(ocsd_demux_stats_t * pStatsBlock)78*46e6e290SRuslan Bukin     void SetDemuxStatsBlock(ocsd_demux_stats_t *pStatsBlock) { m_pStatsBlock = pStatsBlock; };
79*46e6e290SRuslan Bukin 
80c120c564SAndrew Turner private:
81c120c564SAndrew Turner     ocsd_datapath_resp_t executeNoneDataOpAllIDs(ocsd_datapath_op_t op, const ocsd_trc_index_t index = 0);
82c120c564SAndrew Turner     ocsd_datapath_resp_t processTraceData(const ocsd_trc_index_t index,
83c120c564SAndrew Turner                                                 const uint32_t dataBlockSize,
84c120c564SAndrew Turner                                                 const uint8_t *pDataBlock,
85c120c564SAndrew Turner                                                 uint32_t *numBytesProcessed);
86c120c564SAndrew Turner     // process phases
87c120c564SAndrew Turner     bool checkForSync(); // find the sync point in the incoming block
88c120c564SAndrew Turner     bool extractFrame(); // extract the frame data from incoming stream
89c120c564SAndrew Turner     bool unpackFrame(); // process a complete frame.
90c120c564SAndrew Turner     bool outputFrame(); // output data to channels.
91c120c564SAndrew Turner 
92c120c564SAndrew Turner 
93c120c564SAndrew Turner     // managing data path responses.
InitCollateDataPathResp()94c120c564SAndrew Turner     void InitCollateDataPathResp() { m_highestResp = OCSD_RESP_CONT; };
95c120c564SAndrew Turner     void CollateDataPathResp(const ocsd_datapath_resp_t resp);
highestDataPathResp()96c120c564SAndrew Turner     const ocsd_datapath_resp_t highestDataPathResp() const { return m_highestResp; };
dataPathCont()97c120c564SAndrew Turner     const bool dataPathCont() const { return (bool)(m_highestResp < OCSD_RESP_WAIT); };
98c120c564SAndrew Turner 
99c120c564SAndrew Turner     // deformat state
100c120c564SAndrew Turner     void resetStateParams();
101c120c564SAndrew Turner 
102c120c564SAndrew Turner     // synchronisation
103c120c564SAndrew Turner     uint32_t findfirstFSync();
104c120c564SAndrew Turner     void outputUnsyncedBytes(uint32_t num_bytes);  // output bytes as unsynced from current buffer position.
105c120c564SAndrew Turner 
106c120c564SAndrew Turner     // output bytes to raw frame monitor
107c120c564SAndrew Turner     void outputRawMonBytes(const ocsd_datapath_op_t op,
108c120c564SAndrew Turner                            const ocsd_trc_index_t index,
109c120c564SAndrew Turner                            const ocsd_rawframe_elem_t frame_element,
110c120c564SAndrew Turner                            const int dataBlockSize,
111c120c564SAndrew Turner                            const uint8_t *pDataBlock,
112c120c564SAndrew Turner                            const uint8_t traceID);
113c120c564SAndrew Turner 
114c120c564SAndrew Turner 
115c120c564SAndrew Turner     void setRawChanFilterAll(bool bEnable);
116c120c564SAndrew Turner     const bool rawChanEnabled(const uint8_t id) const;
117c120c564SAndrew Turner 
118*46e6e290SRuslan Bukin 	ocsd_err_t checkForResetFSyncPatterns(uint32_t &f_sync_bytes);
119c120c564SAndrew Turner 
120c120c564SAndrew Turner     friend class TraceFormatterFrameDecoder;
121c120c564SAndrew Turner 
122*46e6e290SRuslan Bukin     // stats updates
123*46e6e290SRuslan Bukin     void addToIDStats(uint64_t val);
124*46e6e290SRuslan Bukin     void addToNoIDStats(uint64_t val);
125*46e6e290SRuslan Bukin     void addToFrameStats(uint64_t val);
126*46e6e290SRuslan Bukin     void addToUnknownIDStats(uint64_t val);
127*46e6e290SRuslan Bukin     void addToReservedIDStats(uint64_t val);
128c120c564SAndrew Turner 
isReservedID(uint8_t ID)129*46e6e290SRuslan Bukin     bool isReservedID(uint8_t ID) { return ((ID == 0) || (ID >= 0x70)); };
130*46e6e290SRuslan Bukin 
131*46e6e290SRuslan Bukin     // attachment points
132c120c564SAndrew Turner     componentAttachPt<ITrcDataIn> m_IDStreams[128];
133c120c564SAndrew Turner     componentAttachPt<ITrcRawFrameIn> m_RawTraceFrame;
134c120c564SAndrew Turner 
135c120c564SAndrew Turner     componentAttachPt<ITrcSrcIndexCreator> m_SrcIndexer;
136c120c564SAndrew Turner 
137c120c564SAndrew Turner 
138c120c564SAndrew Turner     ocsd_datapath_resp_t m_highestResp;
139c120c564SAndrew Turner 
140c120c564SAndrew Turner     /* static configuration */
141c120c564SAndrew Turner     uint32_t m_cfgFlags;        /* configuration flags */
142c120c564SAndrew Turner     ocsd_trc_index_t m_force_sync_idx;
143c120c564SAndrew Turner     bool m_use_force_sync;
144c120c564SAndrew Turner     uint32_t m_alignment;
145c120c564SAndrew Turner 
146c120c564SAndrew Turner     /* dynamic state */
147c120c564SAndrew Turner     ocsd_trc_index_t m_trc_curr_idx;    /* index of current trace data */
148c120c564SAndrew Turner     bool m_frame_synced;
149c120c564SAndrew Turner     bool m_first_data;
150c120c564SAndrew Turner     uint8_t m_curr_src_ID;
151c120c564SAndrew Turner 
152c120c564SAndrew Turner     // incoming frame buffer
153c120c564SAndrew Turner     uint8_t m_ex_frm_data[OCSD_DFRMTR_FRAME_SIZE]; // buffer the current frame in case we have to stop part way through
154c120c564SAndrew Turner     int m_ex_frm_n_bytes;   // number of valid bytes in the current frame (extraction)
155*46e6e290SRuslan Bukin     bool m_b_fsync_start_eob;  // flag to indicate that the end of the last buffer was a pair of bytes
156*46e6e290SRuslan Bukin                                // (0xffff) that could only validly be the start and FSYNC.
157c120c564SAndrew Turner     ocsd_trc_index_t m_trc_curr_idx_sof; // trace source index at start of frame.
158c120c564SAndrew Turner 
159*46e6e290SRuslan Bukin     /* channel output data - can never be more than a frame of data for a single ID.
160*46e6e290SRuslan Bukin      * 8 possible ID changes per frame. Although the final one can have no associated data, a pathological
161*46e6e290SRuslan Bukin      * case exists with 7 ID changes, all data associated with a previous frame, except for last
162*46e6e290SRuslan Bukin      * ID / data byte which is data. Not possible with normal hardware but guard against corrupt input.
163*46e6e290SRuslan Bukin      */
164*46e6e290SRuslan Bukin     out_chan_data m_out_data[8]; // output data for a given ID
165c120c564SAndrew Turner     int m_out_data_idx;          // number of out_chan_data frames used.
166c120c564SAndrew Turner     int m_out_processed;         // number of complete out_chan_data frames output.
167c120c564SAndrew Turner 
168c120c564SAndrew Turner     /* local copy of input buffer pointers*/
169c120c564SAndrew Turner     const uint8_t *m_in_block_base;
170c120c564SAndrew Turner     uint32_t m_in_block_size;
171c120c564SAndrew Turner     uint32_t m_in_block_processed;
172c120c564SAndrew Turner 
173c120c564SAndrew Turner     /* raw output options */
174c120c564SAndrew Turner     bool m_b_output_packed_raw;
175c120c564SAndrew Turner     bool m_b_output_unpacked_raw;
176c120c564SAndrew Turner 
177c120c564SAndrew Turner     bool m_raw_chan_enable[128];
178*46e6e290SRuslan Bukin 
179*46e6e290SRuslan Bukin     ocsd_demux_stats_t *m_pStatsBlock;
180c120c564SAndrew Turner };
181c120c564SAndrew Turner 
182c120c564SAndrew Turner 
183c120c564SAndrew Turner #endif // ARM_TRC_FRAME_DECODER_IMPL_H_INCLUDED
184c120c564SAndrew Turner 
185c120c564SAndrew Turner /* End of File trc_frame_decoder_impl.h */
186