/*!
 * \file       rctdl_c_api.h
 * \brief      Reference CoreSight Trace Decoder : "C" API
 * 
 * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
 */

/* 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, 
 * this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright notice, 
 * this list of conditions and the following disclaimer in the documentation 
 * and/or other materials provided with the distribution.
 * 
 * 3. Neither the name of the copyright holder nor the names of its contributors 
 * may be used to endorse or promote products derived from this software without 
 * specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef ARM_RCTDL_C_API_H_INCLUDED
#define ARM_RCTDL_C_API_H_INCLUDED

/** @defgroup lib_c_api Reference CoreSight Trace Decoder Library : Library "C" API.
    @brief  "C" API for the Reference CoreSight Trace Decoder Library

    Set of "C" wrapper functions for the RCTDL library.

    Defines API, functions and callback types.
@{*/

/* ensure C bindings */

#if defined(WIN32)  /* windows bindings */
    /** Building the C-API DLL **/
    #ifdef _RCTDL_C_API_DLL_EXPORT
        #ifdef __cplusplus
            #define RCTDL_C_API extern "C" __declspec(dllexport)
        #else
            #define RCTDL_C_API __declspec(dllexport)
        #endif
    #else   
        /** building or using the static C-API library **/
        #if defined(_LIB) || defined(RCTDL_USE_STATIC_C_API)
            #ifdef __cplusplus
                #define RCTDL_C_API extern "C"
            #else
                #define RCTDL_C_API
            #endif
        #else
        /** using the C-API DLL **/
            #ifdef __cplusplus
                #define RCTDL_C_API extern "C" __declspec(dllimport)
            #else
                #define RCTDL_C_API __declspec(dllimport)
            #endif
        #endif
    #endif
#else           /* linux bindings */
    #ifdef __cplusplus
        #define RCTDL_C_API extern "C"
    #else
        #define RCTDL_C_API
    #endif
#endif

#include "rctdl_c_api_types.h"

/** @name Library Version API

@{*/
/** Get Library version. Return a 32 bit version in form MMMMnnnn - MMMM = major verison, nnnn = minor version */ 
RCTDL_C_API uint32_t rctdl_get_version(void);

/** Get library version string */
RCTDL_C_API const char * rctdl_get_version_str(void);
/** @}*/

/** @name Library Decode Tree API
@{*/

/*!
 * Create a decode tree. 
 *
 * @param src_type : Type of tree - formatted input, or single source input
 * @param deformatterCfgFlags : Formatter flags - determine presence of frame syncs etc.
 *
 * @return dcd_tree_handle_t  : Handle to the decode tree. Handle value set to 0 if creation failed.
 */
RCTDL_C_API dcd_tree_handle_t rctdl_create_dcd_tree(const rctdl_dcd_tree_src_t src_type, const uint32_t deformatterCfgFlags);

/*!
 * Destroy a decode tree.
 *
 * Also destroys all the associated processors and decoders for the tree.
 *
 * @param handle : Handle for decode tree to destroy.
 */
RCTDL_C_API void rctdl_destroy_dcd_tree(const dcd_tree_handle_t handle);

/*!
 * Input trace data into the decoder. 
 * 
 * Large trace source buffers can be broken down into smaller fragments.
 *
 * @param handle : Handle to decode tree.
 * @param op : Datapath operation.
 * @param index : Trace buffer byte index for the start of the supplied data block.
 * @param dataBlockSize : Size of data block.
 * @param *pDataBlock : Pointer to data block.
 * @param *numBytesProcessed : Number of bytes actually processed by the decoder.
 *
 * @return rctdl_datapath_resp_t  : Datapath response code
 */
RCTDL_C_API rctdl_datapath_resp_t rctdl_dt_process_data(const dcd_tree_handle_t handle,
                                            const rctdl_datapath_op_t op,
                                            const rctdl_trc_index_t index,
                                            const uint32_t dataBlockSize,
                                            const uint8_t *pDataBlock,
                                            uint32_t *numBytesProcessed);

/*!
 * Set the trace element output callback function. 
 *
 * This function will be called for each decoded generic trace element generated by 
 * any full trace decoder in the decode tree.
 *
 * A single function is used for all trace source IDs in the decode tree.
 *
 * @param handle : Handle to decode tree.
 * @param pFn : Pointer to the callback functions.
 * @param p_context : opaque context pointer value used in callback function.
 *
 * @return  rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_set_gen_elem_outfn(const dcd_tree_handle_t handle, FnTraceElemIn pFn, const void *p_context);

/*!
 * Create an ETMv4 instruction trace packet processor only for the supplied configuration. 
 * Must supply an output callback function which handles the etmv4 packet types, to attach to the packet processor.
 *
 * @param handle : handle a decode tree to create the packet processsor.
 * @param *etmv4_cfg : pointer to valid Etmv4 configuration structure.
 * @param pPktFn : pointer to a packet handling callback function.
 * @param p_context : opaque context pointer value used in callback function..
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_create_etmv4i_pkt_proc(const dcd_tree_handle_t handle, const void *etmv4_cfg, FnEtmv4IPacketDataIn pPktFn, const void *p_context);

/*!
 * Creates a packet processor + packet decoder pair for the supplied configuration structure.
 * Uses the output function set in rctdl_dt_set_gen_elem_outfn() as the output sink.
 *
 * @param handle : Handle to decode tree.
 * @param *etmv4_cfg : pointer to valid Etmv4 configuration structure.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_create_etmv4i_decoder(const dcd_tree_handle_t handle, const void *etmv4_cfg);

/*!
 * Attach a callback function to the packet processor monitor point defined by the CoreSight ID.
 *
 * @param handle : Handle to decode tree.
 * @param trc_chan_id : CoreSight Trace ID for packet processor 
 * @param pPktFn : Function to attach to monitor point.
 * @param p_context : opaque context pointer value used in callback function.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_attach_etmv4i_pkt_mon(const dcd_tree_handle_t handle, const uint8_t trc_chan_id, FnEtmv4IPktMonDataIn pPktFn, const void *p_context); 


/*!
 * Create an ETMv3  trace packet processor only for the supplied configuration. 
 * Must supply an output callback function which handles the etmv3 packet types, to attach to the packet processor.
 *
 * @param handle : handle a decode tree to create the packet processsor.
 * @param *etmv3_cfg : pointer to valid Etmv3 configuration structure.
 * @param pPktFn : pointer to a packet handling callback function.
 * @param p_context : opaque context pointer value used in callback function.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_create_etmv3_pkt_proc(const dcd_tree_handle_t handle, const void *etmv3_cfg, FnEtmv3PacketDataIn pPktFn, const void *p_context);


/*!
 * Attach a callback function to the packet processor monitor point defined by the CoreSight ID.
 * Packet processor must exist for the trace ID and be an ETMv3 processor.
 *
 * @param handle : Handle to decode tree.
 * @param trc_chan_id : CoreSight Trace ID for packet processor 
 * @param pPktFn : Function to attach to monitor point.
 * @param p_context : opaque context pointer value used in callback function.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_attach_etmv3_pkt_mon(const dcd_tree_handle_t handle, const uint8_t trc_chan_id, FnEtmv3PktMonDataIn pPktFn, const void *p_context); 


/*!
 * Create an STM  trace packet processor only for the supplied configuration. 
 * Must supply an output callback function which handles the stm packet types, to attach to the packet processor.
 *
 * @param handle : handle a decode tree to create the packet processsor.
 * @param *stm_cfg : pointer to valid Stm configuration structure.
 * @param pPktFn : pointer to a packet handling callback function.
 * @param p_context : opaque context pointer value used in callback function.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_create_stm_pkt_proc(const dcd_tree_handle_t handle, const void *stm_cfg, FnStmPacketDataIn pPktFn, const void *p_context);


/** TBD : more C API functions to be added here */    
    
/** @}*/

/** @name Library Memory Accessor configuration on decode tree.
    @brief Configure the memory regions available for decode.
    
    Full decode requires memory regions set up to allow access to the traced
    opcodes. Add memory buffers or binary file regions to a map of regions.

@{*/

/*!
 * Add a binary file based memory range accessor to the decode tree.
 *
 * Adds the entire binary file as a memory space to be accessed
 *
 * @param handle : Handle to decode tree.
 * @param address : Start address of memory area.
 * @param mem_space : Associated memory space.
 * @param *filepath : Path to binary data file.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_add_binfile_mem_acc(const dcd_tree_handle_t handle, const rctdl_vaddr_t address, const rctdl_mem_space_acc_t mem_space, const char *filepath); 

/*!
 * Add a binary file based memory range accessor to the decode tree.
 * 
 * Add a binary file that contains multiple regions of memory with differing 
 * offsets wihtin the file.
 * 
 * A linked list of file_mem_region_t structures is supplied. Each structure contains an
 * offset into the binary file, the start address for this offset and the size of the region.
 * 
 * @param handle : Handle to decode tree.
 * @param region_list : Array of memory regions in the file.
 * @param num_regions : Size of region array
 * @param mem_space : Associated memory space.
 * @param *filepath : Path to binary data file.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_add_binfile_region_mem_acc(const dcd_tree_handle_t handle, const file_mem_region_t *region_array, const int num_regions, const rctdl_mem_space_acc_t mem_space, const char *filepath); 

/*!
 * Add a memory buffer based memory range accessor to the decode tree.
 *
 * @param handle : Handle to decode tree.
 * @param address : Start address of memory area.
 * @param mem_space : Associated memory space.
 * @param *p_mem_buffer : pointer to memory buffer.
 * @param mem_length : Size of memory buffer.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_add_buffer_mem_acc(const dcd_tree_handle_t handle, const rctdl_vaddr_t address, const rctdl_mem_space_acc_t mem_space, const uint8_t *p_mem_buffer, const uint32_t mem_length); 


/*!
 * Add a memory access callback function. The decoder will call the function for opcode addresses in the 
 * address range supplied for the memory spaces covered.
 *
 * @param handle : Handle to decode tree.
 * @param st_address :  Start address of memory area covered by the callback.
 * @param en_address :  End address of the memory area covered by the callback. (inclusive)
 * @param mem_space : Memory space(s) covered by the callback.
 * @param p_cb_func : Callback function
 * @param p_context : opaque context pointer value used in callback function.
 *
 * @return RCTDL_C_API rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_add_callback_mem_acc(const dcd_tree_handle_t handle, const rctdl_vaddr_t st_address, const rctdl_vaddr_t en_address, const rctdl_mem_space_acc_t mem_space, Fn_MemAcc_CB p_cb_func, const void *p_context); 

/*!
 * Remove a memory accessor by address and memory space.
 *
 * @param handle : Handle to decode tree.
 * @param st_address : Start address of memory accessor. 
 * @param mem_space : Memory space(s) covered by the accessor.
 *
 * @return RCTDL_C_API rctdl_err_t  : Library error code -  RCDTL_OK if successful.
 */
RCTDL_C_API rctdl_err_t rctdl_dt_remove_mem_acc(const dcd_tree_handle_t handle, const rctdl_vaddr_t st_address, const rctdl_mem_space_acc_t mem_space);

/*
 *  Print the mapped memory accessor ranges to the configured logger.
 *
 * @param handle : Handle to decode tree.
 */
RCTDL_C_API void rctdl_tl_log_mapped_mem_ranges(const dcd_tree_handle_t handle);

/** @}*/  

/** @name Library Default Error Log Object API
    @brief Configure the default error logging object in the library.

    Objects created by the decode trees will use this error logger. Configure for 
    desired error severity, and to enable print or logfile output.

@{*/

/*!
 * Initialise the library error logger. 
 *
 * Choose severity of errors logger, and if the errors will be logged to screen and / or logfile.
 *
 * @param verbosity : Severity of errors that will be logged.
 * @param create_output_logger : Set to none-zero to create an output printer.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful. 
 */
RCTDL_C_API rctdl_err_t rctdl_def_errlog_init(const rctdl_err_severity_t verbosity, const int create_output_logger);

/*!
 * Configure the output logger. Choose STDOUT, STDERR and/or log to file.
 * Optionally provide a log file name.
 *
 * @param output_flags : OR combination of required  C_API_MSGLOGOUT_FLG_* flags.
 * @param *log_file_name : optional filename if logging to file. Set to NULL if not needed.
 *
 * @return RCTDL_C_API rctdl_err_t  : Library error code -  RCDTL_OK if successful. 
 */
RCTDL_C_API rctdl_err_t rctdl_def_errlog_config_output(const int output_flags, const char *log_file_name);

/*!
 * Print a message via the library output printer - if enabled.
 *
 * @param *msg : Message to output.
 *
 */
RCTDL_C_API void rctdl_def_errlog_msgout(const char *msg);


/** @}*/

/** @name Packet to string interface

@{*/

/*!
 * Take a packet structure and render a string representation of the packet data.
 * 
 * Returns a '0' terminated string of (buffer_size - 1) length or less.
 *
 * @param pkt_protocol : Packet protocol type - used to interpret the packet pointer
 * @param *p_pkt : pointer to a valid packet structure of protocol type. cast to void *.
 * @param *buffer : character buffer for string.
 * @param buffer_size : size of character buffer.
 *
 * @return  rctdl_err_t  : Library error code -  RCDTL_OK if successful. 
 */
RCTDL_C_API rctdl_err_t rctdl_pkt_str(const rctdl_trace_protocol_t pkt_protocol, const void *p_pkt, char *buffer, const int buffer_size);

/*!
 * Get a string representation of the generic trace element.
 *
 * @param *p_pkt : pointer to valid generic element structure.
 * @param *buffer : character buffer for string.
 * @param buffer_size : size of character buffer.
 *
 * @return rctdl_err_t  : Library error code -  RCDTL_OK if successful. 
 */
RCTDL_C_API rctdl_err_t rctdl_gen_elem_str(const rctdl_generic_trace_elem *p_pkt, char *buffer, const int buffer_size);

/** @}*/

/** @}*/

#endif // ARM_RCTDL_C_API_H_INCLUDED


/* End of File rctdl_c_api.h */
