117f65170SRuslan Bukin /* 217f65170SRuslan Bukin * \file trc_frame_deformatter.cpp 317f65170SRuslan Bukin * \brief OpenCSD : 417f65170SRuslan Bukin * 517f65170SRuslan Bukin * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved. 617f65170SRuslan Bukin */ 717f65170SRuslan Bukin 817f65170SRuslan Bukin /* 917f65170SRuslan Bukin * Redistribution and use in source and binary forms, with or without modification, 1017f65170SRuslan Bukin * are permitted provided that the following conditions are met: 1117f65170SRuslan Bukin * 1217f65170SRuslan Bukin * 1. Redistributions of source code must retain the above copyright notice, 1317f65170SRuslan Bukin * this list of conditions and the following disclaimer. 1417f65170SRuslan Bukin * 1517f65170SRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright notice, 1617f65170SRuslan Bukin * this list of conditions and the following disclaimer in the documentation 1717f65170SRuslan Bukin * and/or other materials provided with the distribution. 1817f65170SRuslan Bukin * 1917f65170SRuslan Bukin * 3. Neither the name of the copyright holder nor the names of its contributors 2017f65170SRuslan Bukin * may be used to endorse or promote products derived from this software without 2117f65170SRuslan Bukin * specific prior written permission. 2217f65170SRuslan Bukin * 2317f65170SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND 2417f65170SRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2517f65170SRuslan Bukin * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2617f65170SRuslan Bukin * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 2717f65170SRuslan Bukin * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 2817f65170SRuslan Bukin * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 2917f65170SRuslan Bukin * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 3017f65170SRuslan Bukin * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3117f65170SRuslan Bukin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3217f65170SRuslan Bukin * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3317f65170SRuslan Bukin */ 3417f65170SRuslan Bukin #include <cstring> 3517f65170SRuslan Bukin 3617f65170SRuslan Bukin #include "common/trc_frame_deformatter.h" 3717f65170SRuslan Bukin #include "trc_frame_deformatter_impl.h" 3817f65170SRuslan Bukin 3917f65170SRuslan Bukin /***************************************************************/ 4017f65170SRuslan Bukin /* Implementation */ 4117f65170SRuslan Bukin /***************************************************************/ 4217f65170SRuslan Bukin 4317f65170SRuslan Bukin #ifdef __GNUC__ 4417f65170SRuslan Bukin // G++ doesn't like the ## pasting 4517f65170SRuslan Bukin #define DEFORMATTER_NAME "DFMT_CSFRAMES" 4617f65170SRuslan Bukin #else 4717f65170SRuslan Bukin // VC is fine 4817f65170SRuslan Bukin #define DEFORMATTER_NAME OCSD_CMPNAME_PREFIX_FRAMEDEFORMATTER##"_CSFRAMES" 4917f65170SRuslan Bukin #endif 5017f65170SRuslan Bukin 5117f65170SRuslan Bukin TraceFmtDcdImpl::TraceFmtDcdImpl() : TraceComponent(DEFORMATTER_NAME), 5217f65170SRuslan Bukin m_cfgFlags(0), 5317f65170SRuslan Bukin m_force_sync_idx(0), 5417f65170SRuslan Bukin m_use_force_sync(false), 5517f65170SRuslan Bukin m_alignment(16), // assume frame aligned data as default. 5617f65170SRuslan Bukin m_b_output_packed_raw(false), 5717f65170SRuslan Bukin m_b_output_unpacked_raw(false) 5817f65170SRuslan Bukin 5917f65170SRuslan Bukin { 6017f65170SRuslan Bukin resetStateParams(); 6117f65170SRuslan Bukin setRawChanFilterAll(true); 6217f65170SRuslan Bukin } 6317f65170SRuslan Bukin 6417f65170SRuslan Bukin TraceFmtDcdImpl::TraceFmtDcdImpl(int instNum) : TraceComponent(DEFORMATTER_NAME, instNum), 6517f65170SRuslan Bukin m_cfgFlags(0), 6617f65170SRuslan Bukin m_force_sync_idx(0), 6717f65170SRuslan Bukin m_use_force_sync(false), 6817f65170SRuslan Bukin m_alignment(16) 6917f65170SRuslan Bukin { 7017f65170SRuslan Bukin resetStateParams(); 7117f65170SRuslan Bukin setRawChanFilterAll(true); 7217f65170SRuslan Bukin } 7317f65170SRuslan Bukin 7417f65170SRuslan Bukin TraceFmtDcdImpl::~TraceFmtDcdImpl() 7517f65170SRuslan Bukin { 7617f65170SRuslan Bukin } 7717f65170SRuslan Bukin 7817f65170SRuslan Bukin ocsd_datapath_resp_t TraceFmtDcdImpl::TraceDataIn( 7917f65170SRuslan Bukin const ocsd_datapath_op_t op, 8017f65170SRuslan Bukin const ocsd_trc_index_t index, 8117f65170SRuslan Bukin const uint32_t dataBlockSize, 8217f65170SRuslan Bukin const uint8_t *pDataBlock, 8317f65170SRuslan Bukin uint32_t *numBytesProcessed) 8417f65170SRuslan Bukin { 8517f65170SRuslan Bukin ocsd_datapath_resp_t resp = OCSD_RESP_FATAL_INVALID_OP; 8617f65170SRuslan Bukin InitCollateDataPathResp(); 8717f65170SRuslan Bukin 8817f65170SRuslan Bukin m_b_output_packed_raw = m_RawTraceFrame.num_attached() && ((m_cfgFlags & OCSD_DFRMTR_PACKED_RAW_OUT) != 0); 8917f65170SRuslan Bukin m_b_output_unpacked_raw = m_RawTraceFrame.num_attached() && ((m_cfgFlags & OCSD_DFRMTR_UNPACKED_RAW_OUT) != 0); 9017f65170SRuslan Bukin 9117f65170SRuslan Bukin switch(op) 9217f65170SRuslan Bukin { 9317f65170SRuslan Bukin case OCSD_OP_RESET: 9417f65170SRuslan Bukin resp = Reset(); 9517f65170SRuslan Bukin break; 9617f65170SRuslan Bukin 9717f65170SRuslan Bukin case OCSD_OP_FLUSH: 9817f65170SRuslan Bukin resp = Flush(); 9917f65170SRuslan Bukin break; 10017f65170SRuslan Bukin 10117f65170SRuslan Bukin case OCSD_OP_EOT: 10217f65170SRuslan Bukin // local 'flush' here? 10317f65170SRuslan Bukin // pass on EOT to connected ID streams 10417f65170SRuslan Bukin resp = executeNoneDataOpAllIDs(OCSD_OP_EOT); 10517f65170SRuslan Bukin break; 10617f65170SRuslan Bukin 10717f65170SRuslan Bukin case OCSD_OP_DATA: 10817f65170SRuslan Bukin if((dataBlockSize <= 0) || ( pDataBlock == 0) || (numBytesProcessed == 0)) 10917f65170SRuslan Bukin resp = OCSD_RESP_FATAL_INVALID_PARAM; 11017f65170SRuslan Bukin else 11117f65170SRuslan Bukin resp = processTraceData(index,dataBlockSize, pDataBlock, numBytesProcessed); 11217f65170SRuslan Bukin break; 11317f65170SRuslan Bukin 11417f65170SRuslan Bukin default: 11517f65170SRuslan Bukin break; 11617f65170SRuslan Bukin } 11717f65170SRuslan Bukin 11817f65170SRuslan Bukin return resp; 11917f65170SRuslan Bukin } 12017f65170SRuslan Bukin 12117f65170SRuslan Bukin /* enable / disable ID streams - default as all enabled */ 12217f65170SRuslan Bukin ocsd_err_t TraceFmtDcdImpl::OutputFilterIDs(std::vector<uint8_t> &id_list, bool bEnable) 12317f65170SRuslan Bukin { 12417f65170SRuslan Bukin ocsd_err_t err = OCSD_OK; 12517f65170SRuslan Bukin std::vector<uint8_t>::iterator iter = id_list.begin(); 12617f65170SRuslan Bukin uint8_t id = 0; 12717f65170SRuslan Bukin 12817f65170SRuslan Bukin while((iter < id_list.end()) && (err == OCSD_OK)) 12917f65170SRuslan Bukin { 13017f65170SRuslan Bukin id = *iter; 13117f65170SRuslan Bukin if(id > 128) 13217f65170SRuslan Bukin err = OCSD_ERR_INVALID_ID; 13317f65170SRuslan Bukin else 13417f65170SRuslan Bukin { 13517f65170SRuslan Bukin m_IDStreams[id].set_enabled(bEnable); 13617f65170SRuslan Bukin m_raw_chan_enable[id] = bEnable; 13717f65170SRuslan Bukin } 13817f65170SRuslan Bukin iter++; 13917f65170SRuslan Bukin } 14017f65170SRuslan Bukin return err; 14117f65170SRuslan Bukin } 14217f65170SRuslan Bukin 14317f65170SRuslan Bukin ocsd_err_t TraceFmtDcdImpl::OutputFilterAllIDs(bool bEnable) 14417f65170SRuslan Bukin { 14517f65170SRuslan Bukin for(uint8_t id = 0; id < 128; id++) 14617f65170SRuslan Bukin { 14717f65170SRuslan Bukin m_IDStreams[id].set_enabled(bEnable); 14817f65170SRuslan Bukin } 14917f65170SRuslan Bukin setRawChanFilterAll(bEnable); 15017f65170SRuslan Bukin return OCSD_OK; 15117f65170SRuslan Bukin } 15217f65170SRuslan Bukin 15317f65170SRuslan Bukin void TraceFmtDcdImpl::setRawChanFilterAll(bool bEnable) 15417f65170SRuslan Bukin { 15517f65170SRuslan Bukin for(int i=0; i<128; i++) 15617f65170SRuslan Bukin { 15717f65170SRuslan Bukin m_raw_chan_enable[i] = bEnable; 15817f65170SRuslan Bukin } 15917f65170SRuslan Bukin } 16017f65170SRuslan Bukin 16117f65170SRuslan Bukin const bool TraceFmtDcdImpl::rawChanEnabled(const uint8_t id) const 16217f65170SRuslan Bukin { 16317f65170SRuslan Bukin if(id < 128) 16417f65170SRuslan Bukin return m_raw_chan_enable[id]; 16517f65170SRuslan Bukin return false; 16617f65170SRuslan Bukin } 16717f65170SRuslan Bukin 16817f65170SRuslan Bukin /* decode control */ 16917f65170SRuslan Bukin ocsd_datapath_resp_t TraceFmtDcdImpl::Reset() 17017f65170SRuslan Bukin { 17117f65170SRuslan Bukin resetStateParams(); 17217f65170SRuslan Bukin InitCollateDataPathResp(); 17317f65170SRuslan Bukin return executeNoneDataOpAllIDs(OCSD_OP_RESET); 17417f65170SRuslan Bukin } 17517f65170SRuslan Bukin 17617f65170SRuslan Bukin ocsd_datapath_resp_t TraceFmtDcdImpl::Flush() 17717f65170SRuslan Bukin { 17817f65170SRuslan Bukin executeNoneDataOpAllIDs(OCSD_OP_FLUSH); // flush any upstream data. 17917f65170SRuslan Bukin if(dataPathCont()) 18017f65170SRuslan Bukin outputFrame(); // try to flush any partial frame data remaining 18117f65170SRuslan Bukin return highestDataPathResp(); 18217f65170SRuslan Bukin } 18317f65170SRuslan Bukin 18417f65170SRuslan Bukin ocsd_datapath_resp_t TraceFmtDcdImpl::executeNoneDataOpAllIDs(ocsd_datapath_op_t op, 18517f65170SRuslan Bukin const ocsd_trc_index_t index /* = 0*/) 18617f65170SRuslan Bukin { 18717f65170SRuslan Bukin ITrcDataIn *pTrcComp = 0; 18817f65170SRuslan Bukin for(uint8_t id = 0; id < 128; id++) 18917f65170SRuslan Bukin { 19017f65170SRuslan Bukin if(m_IDStreams[id].num_attached()) 19117f65170SRuslan Bukin { 19217f65170SRuslan Bukin pTrcComp = m_IDStreams[id].first(); 19317f65170SRuslan Bukin while(pTrcComp) 19417f65170SRuslan Bukin { 19517f65170SRuslan Bukin CollateDataPathResp(pTrcComp->TraceDataIn(op,index,0,0,0)); 19617f65170SRuslan Bukin pTrcComp = m_IDStreams[id].next(); 19717f65170SRuslan Bukin } 19817f65170SRuslan Bukin } 19917f65170SRuslan Bukin } 20017f65170SRuslan Bukin 20117f65170SRuslan Bukin if( m_RawTraceFrame.num_attached()) 20217f65170SRuslan Bukin { 20317f65170SRuslan Bukin if(m_RawTraceFrame.first()) 20417f65170SRuslan Bukin m_RawTraceFrame.first()->TraceRawFrameIn(op,0,OCSD_FRM_NONE,0,0,0); 20517f65170SRuslan Bukin } 20617f65170SRuslan Bukin return highestDataPathResp(); 20717f65170SRuslan Bukin } 20817f65170SRuslan Bukin 20917f65170SRuslan Bukin void TraceFmtDcdImpl::outputRawMonBytes(const ocsd_datapath_op_t op, 21017f65170SRuslan Bukin const ocsd_trc_index_t index, 21117f65170SRuslan Bukin const ocsd_rawframe_elem_t frame_element, 21217f65170SRuslan Bukin const int dataBlockSize, 21317f65170SRuslan Bukin const uint8_t *pDataBlock, 21417f65170SRuslan Bukin const uint8_t traceID) 21517f65170SRuslan Bukin { 21617f65170SRuslan Bukin if( m_RawTraceFrame.num_attached()) 21717f65170SRuslan Bukin { 21817f65170SRuslan Bukin if(m_RawTraceFrame.first()) 21917f65170SRuslan Bukin m_RawTraceFrame.first()->TraceRawFrameIn(op,index,frame_element,dataBlockSize, pDataBlock,traceID); 22017f65170SRuslan Bukin } 22117f65170SRuslan Bukin } 22217f65170SRuslan Bukin 22317f65170SRuslan Bukin void TraceFmtDcdImpl::CollateDataPathResp(const ocsd_datapath_resp_t resp) 22417f65170SRuslan Bukin { 22517f65170SRuslan Bukin // simple most severe error across multiple IDs. 22617f65170SRuslan Bukin if(resp > m_highestResp) m_highestResp = resp; 22717f65170SRuslan Bukin } 22817f65170SRuslan Bukin 22917f65170SRuslan Bukin ocsd_datapath_resp_t TraceFmtDcdImpl::processTraceData( 23017f65170SRuslan Bukin const ocsd_trc_index_t index, 23117f65170SRuslan Bukin const uint32_t dataBlockSize, 23217f65170SRuslan Bukin const uint8_t *pDataBlock, 23317f65170SRuslan Bukin uint32_t *numBytesProcessed 23417f65170SRuslan Bukin ) 23517f65170SRuslan Bukin { 23617f65170SRuslan Bukin try { 23717f65170SRuslan Bukin 23817f65170SRuslan Bukin if(!m_first_data) // is this the initial data block? 23917f65170SRuslan Bukin { 24017f65170SRuslan Bukin m_trc_curr_idx = index; 24117f65170SRuslan Bukin } 24217f65170SRuslan Bukin else 24317f65170SRuslan Bukin { 24417f65170SRuslan Bukin if(m_trc_curr_idx != index) // none continuous trace data - throw an error. 24517f65170SRuslan Bukin throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_DFMTR_NOTCONTTRACE,index); 24617f65170SRuslan Bukin } 24717f65170SRuslan Bukin 24817f65170SRuslan Bukin if(dataBlockSize % m_alignment) // must be correctly aligned data 24917f65170SRuslan Bukin { 25017f65170SRuslan Bukin ocsdError err(OCSD_ERR_SEV_ERROR, OCSD_ERR_INVALID_PARAM_VAL); 25117f65170SRuslan Bukin char msg_buffer[64]; 25217f65170SRuslan Bukin sprintf(msg_buffer,"Input block incorrect size, must be %d byte multiple", m_alignment); 25317f65170SRuslan Bukin err.setMessage(msg_buffer); 25417f65170SRuslan Bukin throw ocsdError(&err); 25517f65170SRuslan Bukin } 25617f65170SRuslan Bukin 25717f65170SRuslan Bukin // record the incoming block for extraction routines to use. 25817f65170SRuslan Bukin m_in_block_base = pDataBlock; 25917f65170SRuslan Bukin m_in_block_size = dataBlockSize; 26017f65170SRuslan Bukin m_in_block_processed = 0; 26117f65170SRuslan Bukin 26217f65170SRuslan Bukin // processing loop... 26317f65170SRuslan Bukin if(checkForSync()) 26417f65170SRuslan Bukin { 26517f65170SRuslan Bukin bool bProcessing = true; 26617f65170SRuslan Bukin while(bProcessing) 26717f65170SRuslan Bukin { 26817f65170SRuslan Bukin bProcessing = extractFrame(); // will stop on end of input data. 26917f65170SRuslan Bukin if(bProcessing) 27017f65170SRuslan Bukin bProcessing = unpackFrame(); 27117f65170SRuslan Bukin if(bProcessing) 27217f65170SRuslan Bukin bProcessing = outputFrame(); // will stop on data path halt. 27317f65170SRuslan Bukin } 27417f65170SRuslan Bukin } 27517f65170SRuslan Bukin } 27617f65170SRuslan Bukin catch(const ocsdError &err) { 27717f65170SRuslan Bukin LogError(err); 27817f65170SRuslan Bukin CollateDataPathResp(OCSD_RESP_FATAL_INVALID_DATA); 27917f65170SRuslan Bukin } 28017f65170SRuslan Bukin catch(...) { 28117f65170SRuslan Bukin LogError(ocsdError(OCSD_ERR_SEV_ERROR, OCSD_ERR_FAIL)); 28217f65170SRuslan Bukin CollateDataPathResp(OCSD_RESP_FATAL_SYS_ERR); 28317f65170SRuslan Bukin } 28417f65170SRuslan Bukin 28517f65170SRuslan Bukin if(!m_first_data) 28617f65170SRuslan Bukin m_first_data = true; 28717f65170SRuslan Bukin 28817f65170SRuslan Bukin // update the outputs. 28917f65170SRuslan Bukin *numBytesProcessed = m_in_block_processed; 29017f65170SRuslan Bukin 29117f65170SRuslan Bukin return highestDataPathResp(); 29217f65170SRuslan Bukin } 29317f65170SRuslan Bukin 29417f65170SRuslan Bukin ocsd_err_t TraceFmtDcdImpl::DecodeConfigure(uint32_t flags) 29517f65170SRuslan Bukin { 29617f65170SRuslan Bukin const char *pszErrMsg = ""; 29717f65170SRuslan Bukin ocsd_err_t err = OCSD_OK; 29817f65170SRuslan Bukin 29917f65170SRuslan Bukin if((flags & ~OCSD_DFRMTR_VALID_MASK) != 0) 30017f65170SRuslan Bukin { 30117f65170SRuslan Bukin err = OCSD_ERR_INVALID_PARAM_VAL; 30217f65170SRuslan Bukin pszErrMsg = "Unknown Config Flags"; 30317f65170SRuslan Bukin } 30417f65170SRuslan Bukin 30517f65170SRuslan Bukin if((flags & OCSD_DFRMTR_VALID_MASK) == 0) 30617f65170SRuslan Bukin { 30717f65170SRuslan Bukin err = OCSD_ERR_INVALID_PARAM_VAL; 30817f65170SRuslan Bukin pszErrMsg = "No Config Flags Set"; 30917f65170SRuslan Bukin } 31017f65170SRuslan Bukin 31117f65170SRuslan Bukin if((flags & (OCSD_DFRMTR_HAS_FSYNCS | OCSD_DFRMTR_HAS_HSYNCS)) && 31217f65170SRuslan Bukin (flags & OCSD_DFRMTR_FRAME_MEM_ALIGN) 31317f65170SRuslan Bukin ) 31417f65170SRuslan Bukin { 31517f65170SRuslan Bukin err = OCSD_ERR_INVALID_PARAM_VAL; 31617f65170SRuslan Bukin pszErrMsg = "Invalid Config Flag Combination Set"; 31717f65170SRuslan Bukin } 31817f65170SRuslan Bukin 31917f65170SRuslan Bukin if(err != OCSD_OK) 32017f65170SRuslan Bukin { 32117f65170SRuslan Bukin ocsdError errObj(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PARAM_VAL); 32217f65170SRuslan Bukin errObj.setMessage(pszErrMsg); 32317f65170SRuslan Bukin LogError(errObj); 32417f65170SRuslan Bukin } 32517f65170SRuslan Bukin else 32617f65170SRuslan Bukin { 32717f65170SRuslan Bukin m_cfgFlags = flags; 32817f65170SRuslan Bukin m_alignment = 16; 32917f65170SRuslan Bukin if(flags & OCSD_DFRMTR_HAS_FSYNCS) 33017f65170SRuslan Bukin m_alignment = 4; 33117f65170SRuslan Bukin else if(flags & OCSD_DFRMTR_HAS_HSYNCS) 33217f65170SRuslan Bukin m_alignment = 2; 33317f65170SRuslan Bukin } 33417f65170SRuslan Bukin return err; 33517f65170SRuslan Bukin } 33617f65170SRuslan Bukin 33717f65170SRuslan Bukin void TraceFmtDcdImpl::resetStateParams() 33817f65170SRuslan Bukin { 33917f65170SRuslan Bukin // overall dynamic state - intra frame 34017f65170SRuslan Bukin m_trc_curr_idx = OCSD_BAD_TRC_INDEX; /* source index of current trace data */ 34117f65170SRuslan Bukin m_frame_synced = false; 34217f65170SRuslan Bukin m_first_data = false; 34317f65170SRuslan Bukin m_curr_src_ID = OCSD_BAD_CS_SRC_ID; 34417f65170SRuslan Bukin 34517f65170SRuslan Bukin // current frame processing 34617f65170SRuslan Bukin m_ex_frm_n_bytes = 0; 34717f65170SRuslan Bukin m_trc_curr_idx_sof = OCSD_BAD_TRC_INDEX; 34817f65170SRuslan Bukin } 34917f65170SRuslan Bukin 35017f65170SRuslan Bukin bool TraceFmtDcdImpl::checkForSync() 35117f65170SRuslan Bukin { 35217f65170SRuslan Bukin // we can sync on:- 35317f65170SRuslan Bukin // 16 byte alignment - standard input buffers such as ETB 35417f65170SRuslan Bukin // FSYNC packets in the stream 35517f65170SRuslan Bukin // forced index programmed into the object. 35617f65170SRuslan Bukin uint32_t unsynced_bytes = 0; 35717f65170SRuslan Bukin 35817f65170SRuslan Bukin if(!m_frame_synced) 35917f65170SRuslan Bukin { 36017f65170SRuslan Bukin if(m_use_force_sync) 36117f65170SRuslan Bukin { 36217f65170SRuslan Bukin // is the force sync point in this block? 36317f65170SRuslan Bukin if((m_force_sync_idx >= m_trc_curr_idx) && (m_force_sync_idx < (m_trc_curr_idx + m_in_block_size))) 36417f65170SRuslan Bukin { 36517f65170SRuslan Bukin unsynced_bytes = m_force_sync_idx - m_trc_curr_idx; 36617f65170SRuslan Bukin m_frame_synced = true; 36717f65170SRuslan Bukin } 36817f65170SRuslan Bukin else 36917f65170SRuslan Bukin { 37017f65170SRuslan Bukin unsynced_bytes = m_in_block_size; 37117f65170SRuslan Bukin } 37217f65170SRuslan Bukin } 37317f65170SRuslan Bukin else if( m_cfgFlags & OCSD_DFRMTR_HAS_FSYNCS) // memory aligned data 37417f65170SRuslan Bukin { 37517f65170SRuslan Bukin unsynced_bytes = findfirstFSync(); 37617f65170SRuslan Bukin 37717f65170SRuslan Bukin } 37817f65170SRuslan Bukin else 37917f65170SRuslan Bukin { 38017f65170SRuslan Bukin // OCSD_DFRMTR_FRAME_MEM_ALIGN - this has guaranteed 16 byte frame size and alignment. 38117f65170SRuslan Bukin m_frame_synced = true; 38217f65170SRuslan Bukin } 38317f65170SRuslan Bukin 38417f65170SRuslan Bukin if(unsynced_bytes) 38517f65170SRuslan Bukin { 38617f65170SRuslan Bukin outputUnsyncedBytes(unsynced_bytes); 38717f65170SRuslan Bukin m_in_block_processed = unsynced_bytes; 38817f65170SRuslan Bukin m_trc_curr_idx += unsynced_bytes; 38917f65170SRuslan Bukin } 39017f65170SRuslan Bukin } 39117f65170SRuslan Bukin return m_frame_synced; 39217f65170SRuslan Bukin } 39317f65170SRuslan Bukin 39417f65170SRuslan Bukin uint32_t TraceFmtDcdImpl::findfirstFSync() 39517f65170SRuslan Bukin { 39617f65170SRuslan Bukin uint32_t unsynced = m_in_block_size; // consider entire block as unsynced at present. 39717f65170SRuslan Bukin //**TBD - handle fsync patterns in TPIU captured code 39817f65170SRuslan Bukin return unsynced; 39917f65170SRuslan Bukin } 40017f65170SRuslan Bukin 40117f65170SRuslan Bukin void TraceFmtDcdImpl::outputUnsyncedBytes(uint32_t /*num_bytes*/) 40217f65170SRuslan Bukin { 40317f65170SRuslan Bukin //**TBD: 40417f65170SRuslan Bukin } 40517f65170SRuslan Bukin 40617f65170SRuslan Bukin int TraceFmtDcdImpl::checkForResetFSyncPatterns() 40717f65170SRuslan Bukin { 40817f65170SRuslan Bukin const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC 40917f65170SRuslan Bukin bool check_for_fsync = true; 41017f65170SRuslan Bukin int num_fsyncs = 0; 41117f65170SRuslan Bukin const uint8_t *dataPtr = m_in_block_base + m_in_block_processed; 41217f65170SRuslan Bukin 41317f65170SRuslan Bukin while (check_for_fsync && (m_in_block_processed < m_in_block_size)) 41417f65170SRuslan Bukin { 41517f65170SRuslan Bukin // look for consecutive fsyncs as padding or for reset downstream - both cases will reset downstream.... 41617f65170SRuslan Bukin if (*((uint32_t *)(dataPtr)) == FSYNC_PATTERN) 41717f65170SRuslan Bukin { 41817f65170SRuslan Bukin dataPtr += sizeof(uint32_t); 41917f65170SRuslan Bukin num_fsyncs++; 42017f65170SRuslan Bukin } 42117f65170SRuslan Bukin else 42217f65170SRuslan Bukin check_for_fsync = false; 42317f65170SRuslan Bukin } 42417f65170SRuslan Bukin 42517f65170SRuslan Bukin if (num_fsyncs) 42617f65170SRuslan Bukin { 42717f65170SRuslan Bukin printf("Frame deformatter: Found %d FSYNCS\n",num_fsyncs); 42817f65170SRuslan Bukin if ((num_fsyncs % 4) == 0) 42917f65170SRuslan Bukin { 43017f65170SRuslan Bukin // reset the upstream decoders 43117f65170SRuslan Bukin executeNoneDataOpAllIDs(OCSD_OP_RESET,m_trc_curr_idx); 43217f65170SRuslan Bukin 43317f65170SRuslan Bukin // reset the intra frame parameters 43417f65170SRuslan Bukin m_curr_src_ID = OCSD_BAD_CS_SRC_ID; 43517f65170SRuslan Bukin m_ex_frm_n_bytes = 0; 43617f65170SRuslan Bukin m_trc_curr_idx_sof = OCSD_BAD_TRC_INDEX; 43717f65170SRuslan Bukin } 43817f65170SRuslan Bukin else 43917f65170SRuslan Bukin { 44017f65170SRuslan Bukin // TBD: throw processing error, none frame size block of fsyncs 44117f65170SRuslan Bukin } 44217f65170SRuslan Bukin } 44317f65170SRuslan Bukin return num_fsyncs * 4; 44417f65170SRuslan Bukin } 44517f65170SRuslan Bukin 44617f65170SRuslan Bukin 44717f65170SRuslan Bukin bool TraceFmtDcdImpl::extractFrame() 44817f65170SRuslan Bukin { 44917f65170SRuslan Bukin const uint32_t FSYNC_PATTERN = 0x7FFFFFFF; // LE host pattern for FSYNC 45017f65170SRuslan Bukin const uint16_t HSYNC_PATTERN = 0x7FFF; // LE host pattern for HSYNC 45117f65170SRuslan Bukin 45217f65170SRuslan Bukin 45317f65170SRuslan Bukin bool cont_process = true; // continue processing after extraction. 45417f65170SRuslan Bukin uint32_t f_sync_bytes = 0; // skipped f sync bytes 45517f65170SRuslan Bukin uint32_t h_sync_bytes = 0; // skipped h sync bytes 45617f65170SRuslan Bukin uint32_t ex_bytes = 0; // extracted bytes 45717f65170SRuslan Bukin 45817f65170SRuslan Bukin // memory aligned sources are always multiples of frames, aligned to start. 45917f65170SRuslan Bukin if( m_cfgFlags & OCSD_DFRMTR_FRAME_MEM_ALIGN) 46017f65170SRuslan Bukin { 46117f65170SRuslan Bukin // some linux drivers (e.g. for perf) will insert FSYNCS to pad or differentiate 46217f65170SRuslan Bukin // between blocks of aligned data, always in frame aligned complete 16 byte frames. 46317f65170SRuslan Bukin if (m_cfgFlags & OCSD_DFRMTR_RESET_ON_4X_FSYNC) 46417f65170SRuslan Bukin { 46517f65170SRuslan Bukin f_sync_bytes = checkForResetFSyncPatterns(); 46617f65170SRuslan Bukin 46717f65170SRuslan Bukin /* in this case the FSYNC pattern is output on both packed and unpacked cases */ 46817f65170SRuslan Bukin if (f_sync_bytes && (m_b_output_packed_raw || m_b_output_unpacked_raw)) 46917f65170SRuslan Bukin { 47017f65170SRuslan Bukin outputRawMonBytes(OCSD_OP_DATA, 47117f65170SRuslan Bukin m_trc_curr_idx, 47217f65170SRuslan Bukin OCSD_FRM_FSYNC, 47317f65170SRuslan Bukin f_sync_bytes, 47417f65170SRuslan Bukin m_in_block_base + m_in_block_processed, 47517f65170SRuslan Bukin 0); 47617f65170SRuslan Bukin } 47717f65170SRuslan Bukin } 47817f65170SRuslan Bukin 47917f65170SRuslan Bukin if((m_in_block_processed+f_sync_bytes) == m_in_block_size) 48017f65170SRuslan Bukin { 48117f65170SRuslan Bukin m_ex_frm_n_bytes = 0; 48217f65170SRuslan Bukin cont_process = false; // end of input data. 48317f65170SRuslan Bukin } 48417f65170SRuslan Bukin else 48517f65170SRuslan Bukin { 48617f65170SRuslan Bukin // always a complete frame. 48717f65170SRuslan Bukin m_ex_frm_n_bytes = OCSD_DFRMTR_FRAME_SIZE; 48817f65170SRuslan Bukin memcpy(m_ex_frm_data, m_in_block_base + m_in_block_processed + f_sync_bytes, m_ex_frm_n_bytes); 48917f65170SRuslan Bukin m_trc_curr_idx_sof = m_trc_curr_idx + f_sync_bytes; 49017f65170SRuslan Bukin ex_bytes = OCSD_DFRMTR_FRAME_SIZE; 49117f65170SRuslan Bukin } 49217f65170SRuslan Bukin } 49317f65170SRuslan Bukin else 49417f65170SRuslan Bukin { 49517f65170SRuslan Bukin // extract data accounting for frame syncs and hsyncs if present. 49617f65170SRuslan Bukin // we know we are aligned at this point - could be FSYNC or HSYNCs here. 49717f65170SRuslan Bukin 49817f65170SRuslan Bukin // check what we a looking for 49917f65170SRuslan Bukin bool hasFSyncs = ((m_cfgFlags & OCSD_DFRMTR_HAS_FSYNCS) == OCSD_DFRMTR_HAS_FSYNCS); 50017f65170SRuslan Bukin bool hasHSyncs = ((m_cfgFlags & OCSD_DFRMTR_HAS_HSYNCS) == OCSD_DFRMTR_HAS_HSYNCS); 50117f65170SRuslan Bukin 50217f65170SRuslan Bukin const uint8_t *dataPtr = m_in_block_base+m_in_block_processed; 50317f65170SRuslan Bukin const uint8_t *eodPtr = m_in_block_base+m_in_block_size; 50417f65170SRuslan Bukin 50517f65170SRuslan Bukin cont_process = (bool)(dataPtr < eodPtr); 50617f65170SRuslan Bukin 50717f65170SRuslan Bukin // can have FSYNCS at start of frame (in middle is an error). 50817f65170SRuslan Bukin if(hasFSyncs && cont_process && (m_ex_frm_n_bytes == 0)) 50917f65170SRuslan Bukin { 51017f65170SRuslan Bukin while((*((uint32_t *)(dataPtr)) == FSYNC_PATTERN) && cont_process) 51117f65170SRuslan Bukin { 51217f65170SRuslan Bukin f_sync_bytes += 4; 51317f65170SRuslan Bukin dataPtr += 4; 51417f65170SRuslan Bukin cont_process = (bool)(dataPtr < eodPtr); 51517f65170SRuslan Bukin 51617f65170SRuslan Bukin // TBD: output raw FSYNC data on raw frame channel. 51717f65170SRuslan Bukin } 51817f65170SRuslan Bukin } 51917f65170SRuslan Bukin 52017f65170SRuslan Bukin // not an FSYNC 52117f65170SRuslan Bukin while((m_ex_frm_n_bytes < OCSD_DFRMTR_FRAME_SIZE) && cont_process) 52217f65170SRuslan Bukin { 52317f65170SRuslan Bukin // check for illegal out of sequence FSYNC 52417f65170SRuslan Bukin if((m_ex_frm_n_bytes % 4) == 0) 52517f65170SRuslan Bukin { 52617f65170SRuslan Bukin if(*((uint32_t *)(dataPtr)) == FSYNC_PATTERN) 52717f65170SRuslan Bukin { 52817f65170SRuslan Bukin // throw an illegal FSYNC error 52917f65170SRuslan Bukin } 53017f65170SRuslan Bukin } 53117f65170SRuslan Bukin 53217f65170SRuslan Bukin // mark start of frame after FSyncs 53317f65170SRuslan Bukin if(m_ex_frm_n_bytes == 0) 53417f65170SRuslan Bukin m_trc_curr_idx_sof = m_trc_curr_idx + f_sync_bytes; 53517f65170SRuslan Bukin 53617f65170SRuslan Bukin m_ex_frm_data[m_ex_frm_n_bytes] = dataPtr[0]; 53717f65170SRuslan Bukin m_ex_frm_data[m_ex_frm_n_bytes+1] = dataPtr[1]; 53817f65170SRuslan Bukin m_ex_frm_n_bytes+=2; 53917f65170SRuslan Bukin ex_bytes +=2; 54017f65170SRuslan Bukin 54117f65170SRuslan Bukin // check pair is not HSYNC 54217f65170SRuslan Bukin if(*((uint16_t *)(dataPtr)) == HSYNC_PATTERN) 54317f65170SRuslan Bukin { 54417f65170SRuslan Bukin if(hasHSyncs) 54517f65170SRuslan Bukin { 54617f65170SRuslan Bukin m_ex_frm_n_bytes-=2; 54717f65170SRuslan Bukin ex_bytes -= 2; 54817f65170SRuslan Bukin h_sync_bytes+=2; 54917f65170SRuslan Bukin 55017f65170SRuslan Bukin // TBD: output raw HSYNC data on raw frame channel. 55117f65170SRuslan Bukin } 55217f65170SRuslan Bukin else 55317f65170SRuslan Bukin { 55417f65170SRuslan Bukin // throw illegal HSYNC error. 55517f65170SRuslan Bukin } 55617f65170SRuslan Bukin } 55717f65170SRuslan Bukin 55817f65170SRuslan Bukin dataPtr += 2; 55917f65170SRuslan Bukin cont_process = (bool)(dataPtr < eodPtr); 56017f65170SRuslan Bukin } 56117f65170SRuslan Bukin 56217f65170SRuslan Bukin // if we hit the end of data but still have a complete frame waiting, 56317f65170SRuslan Bukin // need to continue processing to allow it to be used. 56417f65170SRuslan Bukin if(!cont_process && (m_ex_frm_n_bytes == OCSD_DFRMTR_FRAME_SIZE)) 56517f65170SRuslan Bukin cont_process = true; 56617f65170SRuslan Bukin } 56717f65170SRuslan Bukin 56817f65170SRuslan Bukin // output raw data on raw frame channel - packed raw. 56917f65170SRuslan Bukin if ((m_ex_frm_n_bytes == OCSD_DFRMTR_FRAME_SIZE) && m_b_output_packed_raw) 57017f65170SRuslan Bukin { 57117f65170SRuslan Bukin outputRawMonBytes( OCSD_OP_DATA, 57217f65170SRuslan Bukin m_trc_curr_idx, 57317f65170SRuslan Bukin OCSD_FRM_PACKED, 57417f65170SRuslan Bukin ex_bytes + f_sync_bytes + h_sync_bytes, 57517f65170SRuslan Bukin m_in_block_base+m_in_block_processed, 57617f65170SRuslan Bukin 0); 57717f65170SRuslan Bukin } 57817f65170SRuslan Bukin 57917f65170SRuslan Bukin // update the processed count for the buffer 58017f65170SRuslan Bukin m_in_block_processed += m_ex_frm_n_bytes + f_sync_bytes + h_sync_bytes; 58117f65170SRuslan Bukin 58217f65170SRuslan Bukin // update index past the processed data 58317f65170SRuslan Bukin m_trc_curr_idx += m_ex_frm_n_bytes + f_sync_bytes + h_sync_bytes; 58417f65170SRuslan Bukin 58517f65170SRuslan Bukin return cont_process; 58617f65170SRuslan Bukin } 58717f65170SRuslan Bukin 58817f65170SRuslan Bukin bool TraceFmtDcdImpl::unpackFrame() 58917f65170SRuslan Bukin { 59017f65170SRuslan Bukin // unpack cannot fail as never called on incomplete frame. 59117f65170SRuslan Bukin uint8_t frameFlagBit = 0x1; 59217f65170SRuslan Bukin uint8_t newSrcID = OCSD_BAD_CS_SRC_ID; 59317f65170SRuslan Bukin bool PrevIDandIDChange = false; 59417f65170SRuslan Bukin 59517f65170SRuslan Bukin // init output processing 59617f65170SRuslan Bukin m_out_data_idx = 0; 59717f65170SRuslan Bukin m_out_processed = 0; 59817f65170SRuslan Bukin 59917f65170SRuslan Bukin // set up first out data packet... 60017f65170SRuslan Bukin m_out_data[m_out_data_idx].id = m_curr_src_ID; 60117f65170SRuslan Bukin m_out_data[m_out_data_idx].valid = 0; 60217f65170SRuslan Bukin m_out_data[m_out_data_idx].index = m_trc_curr_idx_sof; 60317f65170SRuslan Bukin m_out_data[m_out_data_idx].used = 0; 60417f65170SRuslan Bukin 60517f65170SRuslan Bukin // work on byte pairs - bytes 0 - 13. 60617f65170SRuslan Bukin for(int i = 0; i < 14; i+=2) 60717f65170SRuslan Bukin { 60817f65170SRuslan Bukin PrevIDandIDChange = false; 60917f65170SRuslan Bukin 61017f65170SRuslan Bukin // it's an ID + data 61117f65170SRuslan Bukin if(m_ex_frm_data[i] & 0x1) 61217f65170SRuslan Bukin { 61317f65170SRuslan Bukin newSrcID = (m_ex_frm_data[i] >> 1) & 0x7f; 61417f65170SRuslan Bukin if(newSrcID != m_curr_src_ID) // ID change 61517f65170SRuslan Bukin { 61617f65170SRuslan Bukin PrevIDandIDChange = ((frameFlagBit & m_ex_frm_data[15]) != 0); 61717f65170SRuslan Bukin 61817f65170SRuslan Bukin // following byte for old id? 61917f65170SRuslan Bukin if(PrevIDandIDChange) 62017f65170SRuslan Bukin // 2nd byte always data 62117f65170SRuslan Bukin m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[i+1]; 62217f65170SRuslan Bukin 62317f65170SRuslan Bukin // change ID 62417f65170SRuslan Bukin m_curr_src_ID = newSrcID; 62517f65170SRuslan Bukin 62617f65170SRuslan Bukin // if we already have data in this buffer 62717f65170SRuslan Bukin if(m_out_data[m_out_data_idx].valid > 0) 62817f65170SRuslan Bukin { 62917f65170SRuslan Bukin m_out_data_idx++; // move to next buffer 63017f65170SRuslan Bukin m_out_data[m_out_data_idx].valid = 0; 63117f65170SRuslan Bukin m_out_data[m_out_data_idx].used = 0; 63217f65170SRuslan Bukin m_out_data[m_out_data_idx].index = m_trc_curr_idx_sof + i; 63317f65170SRuslan Bukin } 63417f65170SRuslan Bukin 63517f65170SRuslan Bukin // set new ID on buffer 63617f65170SRuslan Bukin m_out_data[m_out_data_idx].id = m_curr_src_ID; 63717f65170SRuslan Bukin 63817f65170SRuslan Bukin /// TBD - ID indexing in here. 63917f65170SRuslan Bukin } 64017f65170SRuslan Bukin } 64117f65170SRuslan Bukin else 64217f65170SRuslan Bukin // it's just data 64317f65170SRuslan Bukin { 64417f65170SRuslan Bukin m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[i] | ((frameFlagBit & m_ex_frm_data[15]) ? 0x1 : 0x0); 64517f65170SRuslan Bukin } 64617f65170SRuslan Bukin 64717f65170SRuslan Bukin // 2nd byte always data 64817f65170SRuslan Bukin if(!PrevIDandIDChange) // output only if we didn't for an ID change + prev ID. 64917f65170SRuslan Bukin m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[i+1]; 65017f65170SRuslan Bukin 65117f65170SRuslan Bukin frameFlagBit <<= 1; 65217f65170SRuslan Bukin } 65317f65170SRuslan Bukin 65417f65170SRuslan Bukin // unpack byte 14; 65517f65170SRuslan Bukin 65617f65170SRuslan Bukin // it's an ID 65717f65170SRuslan Bukin if(m_ex_frm_data[14] & 0x1) 65817f65170SRuslan Bukin { 65917f65170SRuslan Bukin // no matter if change or not, no associated data in byte 15 anyway so just set. 66017f65170SRuslan Bukin m_curr_src_ID = (m_ex_frm_data[14] >> 1) & 0x7f; 66117f65170SRuslan Bukin } 66217f65170SRuslan Bukin // it's data 66317f65170SRuslan Bukin else 66417f65170SRuslan Bukin { 66517f65170SRuslan Bukin m_out_data[m_out_data_idx].data[m_out_data[m_out_data_idx].valid++] = m_ex_frm_data[14] | ((frameFlagBit & m_ex_frm_data[15]) ? 0x1 : 0x0); 66617f65170SRuslan Bukin } 66717f65170SRuslan Bukin m_ex_frm_n_bytes = 0; // mark frame as empty; 66817f65170SRuslan Bukin return true; 66917f65170SRuslan Bukin } 67017f65170SRuslan Bukin 67117f65170SRuslan Bukin // output data to channels. 67217f65170SRuslan Bukin bool TraceFmtDcdImpl::outputFrame() 67317f65170SRuslan Bukin { 67417f65170SRuslan Bukin bool cont_processing = true; 67517f65170SRuslan Bukin ITrcDataIn *pDataIn = 0; 67617f65170SRuslan Bukin uint32_t bytes_used; 67717f65170SRuslan Bukin 67817f65170SRuslan Bukin // output each valid ID within the frame - stopping if we get a wait or error 67917f65170SRuslan Bukin while((m_out_processed < (m_out_data_idx + 1)) && cont_processing) 68017f65170SRuslan Bukin { 68117f65170SRuslan Bukin 68217f65170SRuslan Bukin // may have data prior to a valid ID appearing 68317f65170SRuslan Bukin if(m_out_data[m_out_processed].id != OCSD_BAD_CS_SRC_ID) 68417f65170SRuslan Bukin { 68517f65170SRuslan Bukin if((pDataIn = m_IDStreams[m_out_data[m_out_processed].id].first()) != 0) 68617f65170SRuslan Bukin { 68717f65170SRuslan Bukin // log the stuff we are about to put out early so as to make it visible before interpretation 68817f65170SRuslan Bukin // however, don't re-output if only part used first time round. 68917f65170SRuslan Bukin if(m_b_output_unpacked_raw && (m_out_data[m_out_processed].used == 0) && rawChanEnabled( m_out_data[m_out_processed].id)) 69017f65170SRuslan Bukin { 69117f65170SRuslan Bukin outputRawMonBytes( OCSD_OP_DATA, 69217f65170SRuslan Bukin m_out_data[m_out_processed].index, 69317f65170SRuslan Bukin OCSD_FRM_ID_DATA, 69417f65170SRuslan Bukin m_out_data[m_out_processed].valid, 69517f65170SRuslan Bukin m_out_data[m_out_processed].data, 69617f65170SRuslan Bukin m_out_data[m_out_processed].id); 69717f65170SRuslan Bukin } 69817f65170SRuslan Bukin 69917f65170SRuslan Bukin // output to the connected packet process 70017f65170SRuslan Bukin CollateDataPathResp(pDataIn->TraceDataIn(OCSD_OP_DATA, 70117f65170SRuslan Bukin m_out_data[m_out_processed].index + m_out_data[m_out_processed].used, 70217f65170SRuslan Bukin m_out_data[m_out_processed].valid - m_out_data[m_out_processed].used, 70317f65170SRuslan Bukin m_out_data[m_out_processed].data + m_out_data[m_out_processed].used, 70417f65170SRuslan Bukin &bytes_used)); 70517f65170SRuslan Bukin 70617f65170SRuslan Bukin if(!dataPathCont()) 70717f65170SRuslan Bukin { 70817f65170SRuslan Bukin cont_processing = false; 70917f65170SRuslan Bukin m_out_data[m_out_processed].used += bytes_used; 71017f65170SRuslan Bukin if(m_out_data[m_out_processed].used == m_out_data[m_out_processed].valid) 71117f65170SRuslan Bukin m_out_processed++; // we have used up all this data. 71217f65170SRuslan Bukin } 71317f65170SRuslan Bukin else 71417f65170SRuslan Bukin { 71517f65170SRuslan Bukin m_out_processed++; // we have sent this data; 71617f65170SRuslan Bukin } 71717f65170SRuslan Bukin } 71817f65170SRuslan Bukin else 71917f65170SRuslan Bukin { 72017f65170SRuslan Bukin // optional raw output for debugging / monitor tools 72117f65170SRuslan Bukin if(m_b_output_unpacked_raw && rawChanEnabled( m_out_data[m_out_processed].id)) 72217f65170SRuslan Bukin { 72317f65170SRuslan Bukin outputRawMonBytes( OCSD_OP_DATA, 72417f65170SRuslan Bukin m_out_data[m_out_processed].index, 72517f65170SRuslan Bukin OCSD_FRM_ID_DATA, 72617f65170SRuslan Bukin m_out_data[m_out_processed].valid, 72717f65170SRuslan Bukin m_out_data[m_out_processed].data, 72817f65170SRuslan Bukin m_out_data[m_out_processed].id); 72917f65170SRuslan Bukin } 73017f65170SRuslan Bukin m_out_processed++; // skip past this data. 73117f65170SRuslan Bukin } 73217f65170SRuslan Bukin } 73317f65170SRuslan Bukin else 73417f65170SRuslan Bukin { 73517f65170SRuslan Bukin // optional raw output for debugging / monitor tools of unknown src ID data 73617f65170SRuslan Bukin if(m_b_output_unpacked_raw) 73717f65170SRuslan Bukin { 73817f65170SRuslan Bukin outputRawMonBytes( OCSD_OP_DATA, 73917f65170SRuslan Bukin m_out_data[m_out_processed].index, 74017f65170SRuslan Bukin OCSD_FRM_ID_DATA, 74117f65170SRuslan Bukin m_out_data[m_out_processed].valid, 74217f65170SRuslan Bukin m_out_data[m_out_processed].data, 74317f65170SRuslan Bukin m_out_data[m_out_processed].id); 74417f65170SRuslan Bukin } 74517f65170SRuslan Bukin m_out_processed++; // skip past this data. 74617f65170SRuslan Bukin } 74717f65170SRuslan Bukin } 74817f65170SRuslan Bukin return cont_processing; 74917f65170SRuslan Bukin } 75017f65170SRuslan Bukin 75117f65170SRuslan Bukin /***************************************************************/ 75217f65170SRuslan Bukin /* interface */ 75317f65170SRuslan Bukin /***************************************************************/ 75417f65170SRuslan Bukin TraceFormatterFrameDecoder::TraceFormatterFrameDecoder() : m_pDecoder(0) 75517f65170SRuslan Bukin { 75617f65170SRuslan Bukin m_instNum = -1; 75717f65170SRuslan Bukin } 75817f65170SRuslan Bukin 75917f65170SRuslan Bukin TraceFormatterFrameDecoder::TraceFormatterFrameDecoder(int instNum) : m_pDecoder(0) 76017f65170SRuslan Bukin { 76117f65170SRuslan Bukin m_instNum = instNum; 76217f65170SRuslan Bukin } 76317f65170SRuslan Bukin 76417f65170SRuslan Bukin TraceFormatterFrameDecoder::~TraceFormatterFrameDecoder() 76517f65170SRuslan Bukin { 76617f65170SRuslan Bukin if(m_pDecoder) 76717f65170SRuslan Bukin { 76817f65170SRuslan Bukin delete m_pDecoder; 76917f65170SRuslan Bukin m_pDecoder = 0; 77017f65170SRuslan Bukin } 77117f65170SRuslan Bukin } 77217f65170SRuslan Bukin 77317f65170SRuslan Bukin /* the data input interface from the reader / source */ 77417f65170SRuslan Bukin ocsd_datapath_resp_t TraceFormatterFrameDecoder::TraceDataIn( const ocsd_datapath_op_t op, 77517f65170SRuslan Bukin const ocsd_trc_index_t index, 77617f65170SRuslan Bukin const uint32_t dataBlockSize, 77717f65170SRuslan Bukin const uint8_t *pDataBlock, 77817f65170SRuslan Bukin uint32_t *numBytesProcessed) 77917f65170SRuslan Bukin { 78017f65170SRuslan Bukin return (m_pDecoder == 0) ? OCSD_RESP_FATAL_NOT_INIT : m_pDecoder->TraceDataIn(op,index,dataBlockSize,pDataBlock,numBytesProcessed); 78117f65170SRuslan Bukin } 78217f65170SRuslan Bukin 78317f65170SRuslan Bukin /* attach a data processor to a stream ID output */ 78417f65170SRuslan Bukin componentAttachPt<ITrcDataIn> *TraceFormatterFrameDecoder::getIDStreamAttachPt(uint8_t ID) 78517f65170SRuslan Bukin { 78617f65170SRuslan Bukin componentAttachPt<ITrcDataIn> *pAttachPt = 0; 78717f65170SRuslan Bukin if((ID < 128) && (m_pDecoder != 0)) 78817f65170SRuslan Bukin pAttachPt = &(m_pDecoder->m_IDStreams[ID]); 78917f65170SRuslan Bukin return pAttachPt; 79017f65170SRuslan Bukin } 79117f65170SRuslan Bukin 79217f65170SRuslan Bukin /* attach a data processor to the raw frame output */ 79317f65170SRuslan Bukin componentAttachPt<ITrcRawFrameIn> *TraceFormatterFrameDecoder::getTrcRawFrameAttachPt() 79417f65170SRuslan Bukin { 79517f65170SRuslan Bukin return (m_pDecoder != 0) ? &m_pDecoder->m_RawTraceFrame : 0; 79617f65170SRuslan Bukin } 79717f65170SRuslan Bukin 79817f65170SRuslan Bukin 79917f65170SRuslan Bukin componentAttachPt<ITrcSrcIndexCreator> *TraceFormatterFrameDecoder::getTrcSrcIndexAttachPt() 80017f65170SRuslan Bukin { 80117f65170SRuslan Bukin return (m_pDecoder != 0) ? &m_pDecoder->m_SrcIndexer : 0; 80217f65170SRuslan Bukin } 80317f65170SRuslan Bukin 80417f65170SRuslan Bukin componentAttachPt<ITraceErrorLog> *TraceFormatterFrameDecoder::getErrLogAttachPt() 80517f65170SRuslan Bukin { 80617f65170SRuslan Bukin return (m_pDecoder != 0) ? m_pDecoder->getErrorLogAttachPt() : 0; 80717f65170SRuslan Bukin } 80817f65170SRuslan Bukin 80917f65170SRuslan Bukin /* configuration - set operational mode for incoming stream (has FSYNCS etc) */ 81017f65170SRuslan Bukin ocsd_err_t TraceFormatterFrameDecoder::Configure(uint32_t cfg_flags) 81117f65170SRuslan Bukin { 81217f65170SRuslan Bukin if(!m_pDecoder) 81317f65170SRuslan Bukin { 81417f65170SRuslan Bukin if(m_instNum >= 0) 81517f65170SRuslan Bukin m_pDecoder = new (std::nothrow) TraceFmtDcdImpl(m_instNum); 81617f65170SRuslan Bukin else 81717f65170SRuslan Bukin m_pDecoder = new (std::nothrow) TraceFmtDcdImpl(); 81817f65170SRuslan Bukin if(!m_pDecoder) return OCSD_ERR_MEM; 81917f65170SRuslan Bukin } 82017f65170SRuslan Bukin m_pDecoder->m_cfgFlags = cfg_flags; 82117f65170SRuslan Bukin return OCSD_OK; 82217f65170SRuslan Bukin } 82317f65170SRuslan Bukin 82417f65170SRuslan Bukin const uint32_t TraceFormatterFrameDecoder::getConfigFlags() const 82517f65170SRuslan Bukin { 82617f65170SRuslan Bukin uint32_t flags = 0; 82717f65170SRuslan Bukin if(m_pDecoder) 82817f65170SRuslan Bukin flags = m_pDecoder->m_cfgFlags; 82917f65170SRuslan Bukin return flags; 83017f65170SRuslan Bukin } 83117f65170SRuslan Bukin 83217f65170SRuslan Bukin 83317f65170SRuslan Bukin /* enable / disable ID streams - default as all enabled */ 83417f65170SRuslan Bukin ocsd_err_t TraceFormatterFrameDecoder::OutputFilterIDs(std::vector<uint8_t> &id_list, bool bEnable) 83517f65170SRuslan Bukin { 83617f65170SRuslan Bukin return (m_pDecoder == 0) ? OCSD_ERR_NOT_INIT : m_pDecoder->OutputFilterIDs(id_list,bEnable); 83717f65170SRuslan Bukin } 83817f65170SRuslan Bukin 83917f65170SRuslan Bukin ocsd_err_t TraceFormatterFrameDecoder::OutputFilterAllIDs(bool bEnable) 84017f65170SRuslan Bukin { 84117f65170SRuslan Bukin return (m_pDecoder == 0) ? OCSD_ERR_NOT_INIT : m_pDecoder->OutputFilterAllIDs(bEnable); 84217f65170SRuslan Bukin } 84317f65170SRuslan Bukin 84417f65170SRuslan Bukin /* decode control */ 84517f65170SRuslan Bukin ocsd_datapath_resp_t TraceFormatterFrameDecoder::Reset() 84617f65170SRuslan Bukin { 84717f65170SRuslan Bukin return (m_pDecoder == 0) ? OCSD_RESP_FATAL_NOT_INIT : m_pDecoder->Reset(); 84817f65170SRuslan Bukin } 84917f65170SRuslan Bukin 85017f65170SRuslan Bukin ocsd_datapath_resp_t TraceFormatterFrameDecoder::Flush() 85117f65170SRuslan Bukin { 85217f65170SRuslan Bukin return (m_pDecoder == 0) ? OCSD_RESP_FATAL_NOT_INIT : m_pDecoder->Flush(); 85317f65170SRuslan Bukin } 85417f65170SRuslan Bukin 85517f65170SRuslan Bukin 85617f65170SRuslan Bukin /* End of File trc_frame_deformatter.cpp */ 857