1/* 2Copyright (c) 2018, MIPI Alliance, Inc. 3All rights reserved. 4 5Redistribution and use in source and binary forms, with or without 6modification, are permitted provided that the following conditions 7are met: 8 9* Redistributions of source code must retain the above copyright 10 notice, this list of conditions and the following disclaimer. 11 12* Redistributions in binary form must reproduce the above copyright 13 notice, this list of conditions and the following disclaimer in 14 the documentation and/or other materials provided with the 15 distribution. 16 17* Neither the name of the copyright holder nor the names of its 18 contributors may be used to endorse or promote products derived 19 from this software without specific prior written permission. 20 21THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32*/ 33 34/* 35 * Contributors: 36 * Norbert Schulz (Intel Corporation) - Initial API and implementation 37 */ 38 39#ifndef MIPI_SYST_H_INCLUDED 40#define MIPI_SYST_H_INCLUDED 41 42/* SyS-T API version information 43 */ 44#define MIPI_SYST_VERSION_MAJOR @SYST_CFG_VERSION_MAJOR@ /**< Major version, incremented if API changes */ 45#define MIPI_SYST_VERSION_MINOR @SYST_CFG_VERSION_MINOR@ /**< Minor version, incremented on compatible extensions */ 46#define MIPI_SYST_VERSION_PATCH @SYST_CFG_VERSION_PATCH@ /**< Patch for existing major, minor, usually 0 */ 47 48/** Define SyS-T API conformance level 49 * 50 * 10 = minimal (only short events) 51 * 20 = low overhead (exluding varag functions and CRC32) 52 * 30 = full implementation 53 */ 54#define MIPI_SYST_CONFORMANCE_LEVEL @SYST_CFG_CONFORMANCE_LEVEL@ 55 56/** Compute SYS-T version value 57 * 58 * Used to compare SYS-T Major.Minor.patch versions numerically at runtime. 59 * 60 * @param ma major version number 61 * @param mi minor version number 62 * @param p patch version number 63 * 64 * Example: 65 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} 66 * 67 * #if MIPI_SYST_VERSION_CODE >= MIPI_SYST_MAKE_VERSION_CODE(1,5,0) 68 * // do what only >= 1.5.x supports 69 * #endif 70 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 */ 72#define MIPI_SYST_MAKE_VERSION_CODE(ma, mi, p) (((ma) << 16) | ((mi)<<8) | (p)) 73 74/** Numeric SYS-T version code */ 75#define MIPI_SYST_VERSION_CODE MIPI_SYST_MAKE_VERSION_CODE(\ 76 MIPI_SYST_VERSION_MAJOR,\ 77 MIPI_SYST_VERSION_MINOR,\ 78 MIPI_SYST_VERSION_PATCH) 79 80/* Macros to trick numeric values like __LINE__ into a string 81 */ 82#define _MIPI_SYST_STRINGIFY(x) #x 83#define _MIPI_SYST_CPP_TOSTR(x) _MIPI_SYST_STRINGIFY(x) 84 85#define _MIPI_SYST_VERSION_STRING(a, b, c)\ 86 _MIPI_SYST_CPP_TOSTR(a)"."_MIPI_SYST_CPP_TOSTR(b)"."_MIPI_SYST_CPP_TOSTR(c) 87 88/** Textual version string */ 89#define MIPI_SYST_VERSION_STRING \ 90 _MIPI_SYST_VERSION_STRING(\ 91 MIPI_SYST_VERSION_MAJOR,\ 92 MIPI_SYST_VERSION_MINOR,\ 93 MIPI_SYST_VERSION_PATCH) 94 95#ifndef MIPI_SYST_COMPILER_INCLUDED 96#include "mipi_syst/compiler.h" 97#endif 98 99/* String hash macros for compile time computation of catalog ID's. 100 * Notes: 101 * These macros will only be used with optimized builds, otherwise 102 * a lot of runtime code will be generated. 103 * 104 * Only the last 64 bytes of the string are considered for hashing 105 */ 106#define _MIPI_SYST_HASH1(s,i,x,l) (x*65599u+(mipi_syst_u8)s[(i)<(l)?((l)-1-(i)):(l)]) 107#define _MIPI_SYST_HASH4(s,i,x,l) _MIPI_SYST_HASH1(s,i,_MIPI_SYST_HASH1(s,i+1,_MIPI_SYST_HASH1(s,i+2,_MIPI_SYST_HASH1(s,i+3,x,l),l),l),l) 108#define _MIPI_SYST_HASH16(s,i,x,l) _MIPI_SYST_HASH4(s,i,_MIPI_SYST_HASH4(s,i+4,_MIPI_SYST_HASH4(s,i+8,_MIPI_SYST_HASH4(s,i+12,x,l),l),l),l) 109#define _MIPI_SYST_HASH64(s,i,x,l) _MIPI_SYST_HASH16(s,i,_MIPI_SYST_HASH16(s,i+16,_MIPI_SYST_HASH16(s,i+32,_MIPI_SYST_HASH16(s,i+48,x,l),l),l),l) 110 111#define _MIPI_SYST_HASH_x65599(s,l) ((mipi_syst_u32)_MIPI_SYST_HASH64(s,0,0,l)) 112 113#define _MIPI_SYST_HASH_AT_CPP_TIME(str, offset) (_MIPI_SYST_HASH_x65599(str, sizeof(str)-1) + (offset)) 114#define _MIPI_SYST_HASH_AT_RUN_TIME(str, offset) (mipi_syst_hash_x65599(str, sizeof(str)-1) + (offset)) 115 116#if defined(_MIPI_SYST_OPTIMIZER_ON) 117#define MIPI_SYST_HASH(a, b) _MIPI_SYST_HASH_AT_CPP_TIME((a), (b)) 118#else 119#define MIPI_SYST_HASH(a, b) _MIPI_SYST_HASH_AT_RUN_TIME((a),(b)) 120#endif 121 122#if defined(__cplusplus) 123extern "C" { 124#endif 125 126/** Major Message Types 127 */ 128enum mipi_syst_msgtype { 129 MIPI_SYST_TYPE_BUILD = 0, /**< client build id message */ 130 MIPI_SYST_TYPE_SHORT32 = 1, /**< value only message */ 131 MIPI_SYST_TYPE_STRING = 2, /**< text message output */ 132 MIPI_SYST_TYPE_CATALOG = 3, /**< catalog message output */ 133 MIPI_SYST_TYPE_RAW = 6, /**< raw binary data */ 134 MIPI_SYST_TYPE_SHORT64 = 7, /**< value only message */ 135 MIPI_SYST_TYPE_CLOCK = 8, /**< clock sync message */ 136 137 MIPI_SYST_TYPE_MAX 138}; 139 140/** MIPI_SYST_TYPE_DEBUG_STRING Sub-Types 141 */ 142enum mipi_syst_subtype_string { 143 MIPI_SYST_STRING_GENERIC = 1, /**< string generic debug */ 144 MIPI_SYST_STRING_FUNCTIONENTER = 2, /**< string is function name */ 145 MIPI_SYST_STRING_FUNCTIONEXIT = 3, /**< string is function name */ 146 MIPI_SYST_STRING_INVALIDPARAM = 5, /**< invalid SyS-T APIcall */ 147 MIPI_SYST_STRING_ASSERT = 7, /**< Software Assert: failure */ 148 MIPI_SYST_STRING_PRINTF_32 = 11, /**< printf with 32-bit packing */ 149 MIPI_SYST_STRING_PRINTF_64 = 12, /**< printf with 64-bit packing */ 150 151 MIPI_SYST_STRING_MAX 152}; 153 154/** MIPI_SYST_TYPE_CATALOG Sub-Types 155 */ 156enum mipi_syst_subtype_catalog { 157 MIPI_SYST_CATALOG_ID32_P32 = 1, /**< 32-bit catalog ID, 32-bit packing */ 158 MIPI_SYST_CATALOG_ID64_P32 = 2, /**< 64-bit catalog ID, 32-bit packing */ 159 MIPI_SYST_CATALOG_ID32_P64 = 5, /**< 32-bit catalog ID, 64-bit packing */ 160 MIPI_SYST_CATALOG_ID64_P64 = 6, /**< 64-bit catalog ID, 64-bit packing */ 161 162 MIPI_SYST_CATALOG_MAX 163}; 164 165/** MIPI_SYST_TYPE_CLOCK Sub-Types 166 */ 167enum mipi_syst_subtype_clock{ 168 MIPI_SYST_CLOCK_TRANSPORT_SYNC = 1, /**< SyS-T clock & frequency sync */ 169 MIPI_SYST_CLOCK_MAX 170}; 171 172enum mipi_syst_subtype_build { 173 MIPI_SYST_BUILD_ID_COMPACT32 = 0, /**< compact32 build id */ 174 MIPI_SYST_BUILD_ID_COMPACT64 = 1, /**< compact64 build id */ 175 MIPI_SYST_BUILD_ID_LONG = 2, /**< normal build message */ 176 MIPI_SYST_BUILD_MAX 177}; 178 179struct mipi_syst_header; 180struct mipi_syst_handle; 181struct mipi_syst_scatter_prog; 182 183/** 128-bit GUID style message origin ID */ 184struct mipi_syst_guid { 185 union { 186 mipi_syst_u8 b[16]; 187 mipi_syst_u64 ll[2]; 188 } u; 189}; 190 191/** GUID initializer code 192 * 193 * This macro simplifies converting a GUID from its string representation 194 * into the mipi_syst_guid data structure. The following example shows 195 * how the values from a GUID string are used with the macro. Each numeric 196 * component from the GUID string gets converted into a hex value parameter 197 * when invoking the macro. 198 * 199 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} 200 * 201 * // Guid: f614b99d-99a1-4c04-8c30-90999ab5fe05 202 * 203 * struct mipi_syst_guid guid = 204 * MIPI_SYST_GEN_GUID(0xf614b99d, 0x99a1, 0x4c04, 0x8c30, 0x90999ab5fe05); 205 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 206 */ 207#define MIPI_SYST_GEN_GUID(l1, w1, w2, w3, l2) \ 208 {{\ 209 (mipi_syst_u8)((mipi_syst_u32)(l1) >> 24), \ 210 (mipi_syst_u8)((mipi_syst_u32)(l1) >> 16), \ 211 (mipi_syst_u8)((mipi_syst_u32)(l1) >> 8), \ 212 (mipi_syst_u8)((mipi_syst_u32)(l1) >> 0), \ 213 (mipi_syst_u8)((mipi_syst_u16)(w1) >> 8), \ 214 (mipi_syst_u8)((mipi_syst_u16)(w1) >> 0), \ 215 (mipi_syst_u8)((mipi_syst_u16)(w2) >> 8), \ 216 (mipi_syst_u8)((mipi_syst_u16)(w2) >> 0), \ 217 (mipi_syst_u8)((mipi_syst_u16)(w3) >> 8), \ 218 (mipi_syst_u8)((mipi_syst_u16)(w3) >> 0), \ 219 (mipi_syst_u8)((mipi_syst_u64)(l2) >> 40), \ 220 (mipi_syst_u8)((mipi_syst_u64)(l2) >> 32), \ 221 (mipi_syst_u8)((mipi_syst_u64)(l2) >> 24), \ 222 (mipi_syst_u8)((mipi_syst_u64)(l2) >> 16), \ 223 (mipi_syst_u8)((mipi_syst_u64)(l2) >> 8), \ 224 (mipi_syst_u8)((mipi_syst_u64)(l2) >> 0) \ 225 }} 226 227 /** SyS-T client origin data 228 * 229 * This structure holds the GUID or header origin and unit data 230 * used by SyS-T handles. The structure gets passed into the handle 231 * creation functions to initialize the values that identify clients. 232 * @see MIPI_SYST_SET_HANDLE_GUID_UNIT 233 * @see MIPI_SYST_SET_HANDLE_MODULE_UNIT 234 * @see MIPI_SYST_SET_HANDLE_ORIGIN 235 */ 236struct mipi_syst_origin { 237 struct mipi_syst_guid guid; /**< origin GUID or module value */ 238 mipi_syst_u16 unit; /**< unit value */ 239}; 240 241/** Origin structure initializer code using GUID 242* 243* This macro simplifies initializing a mipi_syst_origin structure. The 244* first 5 parameters are GUID values as used by the MIPI_SYST_GEN_GUID 245* macro. The last parameter is the unit value (11-Bits). 246* @see MIPI_SYST_GEN_GUID 247* 248* 249* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} 250* 251* // Guid: {494E5443-B659-45AF-B786-9DB0786248AE} 252 253* 254* struct mipi_syst_origin = origin 255* MIPI_SYST_GEN_ORIGIN_GUID( 256* 0x494E5443, 0xB659, 0x45AF, 0xB786, 0x9DB0786248AE, 257* 0x1); 258* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 259*/ 260#define MIPI_SYST_GEN_ORIGIN_GUID(l1, w1, w2, w3, l2 , u) \ 261 {\ 262 MIPI_SYST_GEN_GUID(l1, w1, w2, w3, l2) ,\ 263 u\ 264 } 265 266/** Origin structure initializer code using header module value 267* 268* This macro simplifies initializing a mipi_syst_origin structure. The 269* first parameter is the header origin value (7-Bits). The second parameter 270* is the unit value (4-bits) 271* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} 272* 273* // Guid: {494E5443-B659-45AF-B786-9DB0786248AE} 274 275* #define MODULE_X 0x10 276* struct mipi_syst_origin = 277* MIPI_SYST_GEN_ORIGIN_MODULE(MODULE_X, 0x1); 278* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 279*/ 280#define MIPI_SYST_GEN_ORIGIN_MODULE(m , u) \ 281 {\ 282 MIPI_SYST_GEN_GUID(0,0,0, ((mipi_syst_u16)(m & 0x7F)) << 8, 0 ),\ 283 u\ 284 } 285/** 286 * Global state initialization hook definition 287 * 288 * This function gets called in the context of the mipi_syst_init() API 289 * function after the generic state members of the global state 290 * structure syst_hdr have been setup. It's purpose is to initialize the 291 * platform dependent portion of the state and other necessary 292 * platform specific initialization steps. 293 * 294 * @param systh Pointer to global state structure 295 * @param p user defined value or pointer to data 296 * @see mipi_syst_header 297 */ 298typedef void (MIPI_SYST_CALLCONV *mipi_syst_inithook_t)(struct mipi_syst_header *systh, 299 const void *p); 300 301/** 302 * Global state destroy hook definition 303 * 304 * This function gets called in the context of the mipi_syst_destroy() API 305 * function before the generic state members of the global state 306 * structure syst_hdr have been destroyed. Its purpose is to free resources 307 * used by the platform dependent portion of the global state. 308 * 309 * @param systh Pointer to global state structure 310 */ 311typedef void (MIPI_SYST_CALLCONV *mipi_syst_destroyhook_t)(struct mipi_syst_header *systh); 312 313/** 314 * SyS-T handle state initialization hook definition 315 * 316 * This function gets called in the context of IO handle generation. 317 * Its purpose is to initialize the platform dependent portion of 318* the handle and other necessary platform specific initialization steps. 319 * 320 * @param systh Pointer to new SyS-T handle 321 * @see syst_handle_t 322 */ 323typedef void (*mipi_syst_inithandle_hook_t)(struct mipi_syst_handle *systh); 324 325/** 326 * SyS-T handle state release hook definition 327 * 328 * This function gets called when a handle is about to be destroyed.. 329 * Its purpose is to free any resources allocated during the handle 330 * generation. 331 * 332 * @param systh Pointer to handle that is destroyed 333 * @see syst_handle_t 334 */ 335typedef void (*mipi_syst_releasehandle_hook_t)(struct mipi_syst_handle *systh); 336 337/** 338 * Low level message write routine definition 339 * 340 * This function is called at the end of an instrumentation API to output 341 * the raw message data. 342 * 343 * @param systh pointer to a SyS-T handle structure used in the API call, 344 * @param scatterprog pointer to a list of scatter write instructions that 345 * encodes how to convert the descriptor pointer by 346 * pdesc into raw binary data. This list doesn't include 347 * the mandatory first 32 tag byte value pointed by pdesc. 348 * @param pdesc pointer to a message descriptor, which containing at least 349 * the 32-bit message tag data 350 */ 351typedef void (*mipi_syst_msg_write_t)( 352 struct mipi_syst_handle *systh, 353 struct mipi_syst_scatter_prog *scatterprog, 354 const void *pdesc); 355 356#ifdef __cplusplus 357} /* extern C */ 358#endif 359#ifndef MIPI_SYST_PLATFORM_INCLUDED 360 361/** 362 * @defgroup PCFG_Config Platform Feature Configuration Defines 363 * 364 * Defines to customize the SyS-T feature set to match the platform needs. 365 * 366 * Each optional library feature can be disabled by not defining the related 367 * MIPI_SYST_PCFG_ENABLE define. Removing unused features in this way reduces 368 * both memory footprint and runtime overhead of SyS-T. 369 */ 370 371/** 372 * @defgroup PCFG_Global Platform Wide Configuration 373 * @ingroup PCFG_Config 374 * 375 * These defines enable global features in the SyS-T library. 376 * @{ 377 */ 378 379 380 /** 381 * Extend Platform global SyS-T data state 382 * 383 * This define extends the global SyS-T state data structure 384 * mipi_syst_header with platform private content. A platform typically 385 * stores data for SyS-T handle creation processing in this structure. 386 * 387 * Note: This data is not touched by the library code itself, but typically 388 * is used by platform hook functions for handle creation and destruction. 389 * **These hook function calls are not lock protected and may happen 390 * concurrently!** The hook functions need to implement locking if they 391 * modify the platform state data. 392 * 393 * The platform example uses #mipi_syst_platform_state as data state extension. 394 */ 395#define MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA 396 397/** 398 * Extend SyS-T handle data state 399 * 400 * This define extends the SyS-T handle state data structure 401 * mipi_syst_handle with platform private content. A platform typically 402 * stores data for fast trace hardware access in the handle data, for 403 * example a volatile pointer to an MMIO space. 404 * 405 * The platform example uses #mipi_syst_platform_handle as handle state 406 * extension. 407 */ 408#define MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA 409 410/** 411 * Enable HEAP usage for handle generation 412 * 413 * This macro tells the SyS-T library to enable the heap allocation handle 414 * creation API #MIPI_SYST_ALLOC_HANDLE. 415 * The platform must provide the macros #MIPI_SYST_HEAP_MALLOC and 416 * #MIPI_SYST_HEAP_FREE to point SyS-T to the platform malloc and free 417 * functions. 418 * 419 * Note: In OS kernel space environments, you must use unpaged memory 420 * allocation functions. 421 */ 422#define MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY 423 424/* MSVC and GNU compiler 64-bit mode */ 425 426/** 427 * Enable 64-bit instruction addresses 428 * 429 * Set this define if running in 64-bit code address space. 430 */ 431#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__) 432#define MIPI_SYST_PCFG_ENABLE_64BIT_ADDR 433#endif 434/** 435 * Enable atomic 64-bit write operations 436 * 437 * Set this define if your platform supports an atomic 64-bit data write 438 * operation. This results in fewer MMIO accesses.The SyS-T library 439 * defaults to 2 consecutive 32-Bit writes otherwise. 440 */ 441#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__) 442#define MIPI_SYST_PCFG_ENABLE_64BIT_IO 443#endif 444 445/** 446 * Enable helper function code inlining 447 * 448 * Set this define if speed is more important than code size on your platform. 449 * It causes several helper function to get inlined, producing faster, but 450 * also larger, code. 451 */ 452#define MIPI_SYST_PCFG_ENABLE_INLINE 453 454/** @} */ 455 456/** 457 * @defgroup PCFG_ApiSet Supported API sets 458 * @ingroup PCFG_Config 459 * 460 * These defines enable API sets in the SyS-T library. They are set by default 461 * depending on the SyS-T API conformance level. The level is specified using 462 * the define #MIPI_SYST_CONFORMANCE_LEVEL. 463 * @{ 464 */ 465 466#if MIPI_SYST_CONFORMANCE_LEVEL > 10 467 /** 468 * Use SyS-T scatter write output function 469 * 470 * The library comes with an output routine that is intended to write data out 471 * to an MMIO space. It simplifies a SyS-T platform integration as 472 * only low-level access macros must be provided for outputting data. These 473 * macros follow MIPI System Trace Protocol (STP) naming convention, also 474 * non STP generators can use this interface. 475 * 476 * These low level output macros are: 477 * 478 * #MIPI_SYST_OUTPUT_D32MTS, #MIPI_SYST_OUTPUT_D64MTS, 479 * #MIPI_SYST_OUTPUT_D32TS, #MIPI_SYST_OUTPUT_D64, 480 * #MIPI_SYST_OUTPUT_D32, #MIPI_SYST_OUTPUT_D16, #MIPI_SYST_OUTPUT_D8 and 481 * #MIPI_SYST_OUTPUT_FLAG 482 * 483 * Note: This version of the write function always starts messages 484 * using a 32-bit timestamped record also other sized timestamped 485 * packets are allowed by the SyS-T specification. 486 */ 487#define MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE 488 489/** 490 * Enable the Catalog API for 32-Bit Catalog IDs. 491 */ 492#define MIPI_SYST_PCFG_ENABLE_CATID32_API 493 494/** 495 * Enable the Catalog API for 64-Bit Catalog IDs. 496 */ 497#define MIPI_SYST_PCFG_ENABLE_CATID64_API 498 499/** 500 * Enable plain UTF-8 string output APIs. 501 */ 502#define MIPI_SYST_PCFG_ENABLE_STRING_API 503 504/** 505 * Enable raw data output APIs 506 */ 507#define MIPI_SYST_PCFG_ENABLE_WRITE_API 508 509/** 510 * Enable Build API 511 */ 512#define MIPI_SYST_PCFG_ENABLE_BUILD_API 513#endif /* MIPI_SYST_CONFORMANCE_LEVEL > 10 */ 514 515#if MIPI_SYST_CONFORMANCE_LEVEL > 20 516 /** 517 * Enable printf API support 518 * 519 * Note: 520 * Enabling printf requires compiler var_arg support as defined by the 521 * header files stdarg.h stddef.h. 522 */ 523 524#define MIPI_SYST_PCFG_ENABLE_PRINTF_API 525 526#endif /* #if MIPI_SYST_CONFORMANCE_LEVEL > 20 */ 527 528/* @} */ 529 530/** 531 * @defgroup PCFG_Message Optional Message Attributes 532 * @ingroup PCFG_Config 533 * 534 * These defines enable optional message components. They are set by default 535 * depending on the SyS-T API conformance level. The level is specified using 536 * the define #MIPI_SYST_CONFORMANCE_LEVEL. 537 * @{ 538 */ 539 540#if MIPI_SYST_CONFORMANCE_LEVEL > 10 541/** 542 * Enable 128-bit origin GUID support. 543 */ 544#define MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID 545 546/** 547 * Enable the API variants that send file:line ID pair location records. 548 */ 549#define MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD 550 551/** 552 * Enable the API variants that send the address of the instrumentation location. 553 * 554 * This API requires #MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD to be set as well. 555 * It uses its own define as it additionally requires the function 556 * @ref mipi_syst_return_addr() to be implemented for your platform. 557 */ 558#define MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS 559 560/** 561 * Enable protocol timestamp. 562 * 563 * This option adds a timestamp into the SyS-T protocol. This 564 * option is used if the SyS-T protocol is not embedded into a hardware 565 * timestamped trace protocol like MIPI STP or if the HW timestamp cannot 566 * be used for other reasons. Setting this option creates the need to define 567 * the macros #MIPI_SYST_PLATFORM_CLOCK and #MIPI_SYST_PLATFORM_FREQ to 568 * return a 64-bit clock tick value and its frequency. 569 */ 570#define MIPI_SYST_PCFG_ENABLE_TIMESTAMP 571 572 /** 573 * Enable generation of length field 574 * 575 * Set this define if the message data shall include the optional length 576 * field that indicates how many payload bytes follow. 577 */ 578#define MIPI_SYST_PCFG_LENGTH_FIELD 579 580#endif 581 582#if MIPI_SYST_CONFORMANCE_LEVEL > 20 583/** 584 * Enable message data CRC32 generation. 585 */ 586#define MIPI_SYST_PCFG_ENABLE_CHECKSUM 587 588#endif /* #if MIPI_SYST_CONFORMANCE_LEVEL */ 589 590/** @} */ 591 592#include "mipi_syst/platform.h" 593 594/** 595 * Maximum size of printf payload in bytes. 596 * Adjust this value if larger strings shall be supported by the library. 597 * The buffer space is located in stack memory when calling one of the printf 598 * style APIs. 599 */ 600#if !defined(MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE) 601#define MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE 1024 602#endif 603 604#endif 605#ifdef __cplusplus 606extern "C" { 607#endif 608 609#if defined(MIPI_SYST_PCFG_ENABLE_INLINE) 610#define MIPI_SYST_INLINE static MIPI_SYST_CC_INLINE 611#else 612#define MIPI_SYST_INLINE MIPI_SYST_EXPORT 613#endif 614 615/** SyS-T global state structure. 616 * This structure is holding the global SyS-T library state 617 */ 618struct mipi_syst_header { 619 mipi_syst_u32 systh_version; /**< SyS-T version ID */ 620 621#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) 622 mipi_syst_inithandle_hook_t systh_inith; /**< handle init hook function*/ 623 mipi_syst_releasehandle_hook_t systh_releaseh; /**< handle release hook */ 624#endif 625 626#if MIPI_SYST_CONFORMANCE_LEVEL > 10 627 mipi_syst_msg_write_t systh_writer; /**< message output routine */ 628#endif 629#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) 630 struct mipi_syst_platform_state systh_platform; 631 /**< platform specific state */ 632#endif 633}; 634 635/** 636 * Message data header tag definition 637 * 638 * Each SyS-T message starts with a 32-bit message tag. The tag defines the 639 * message originator and decoding information for the data following 640 * the tag. 641 */ 642 643struct mipi_syst_msg_tag { 644#if defined(MIPI_SYST_BIG_ENDIAN) 645 mipi_syst_u32 et_res31 : 1; /**< reserved for future use */ 646 mipi_syst_u32 et_res30 : 1; /**< reserved for future use */ 647 mipi_syst_u32 et_subtype : 6; /**< type dependent sub category */ 648 mipi_syst_u32 et_guid : 1; /**< 128-bit GUID present */ 649 mipi_syst_u32 et_modunit : 11; /**< unit for GUID or module:unit */ 650 mipi_syst_u32 et_timestamp : 1;/**< indicate 64-bit timestamp */ 651 mipi_syst_u32 et_chksum : 1; /**< indicate 32-bit CRC */ 652 mipi_syst_u32 et_length : 1; /**< indicate length field */ 653 mipi_syst_u32 et_location : 1; /**< indicate location information */ 654 mipi_syst_u32 et_res7 : 1; /**< reserved for future use */ 655 mipi_syst_u32 et_severity : 3; /**< severity level of message */ 656 mipi_syst_u32 et_type : 4; /**< SyS-T message type ID */ 657#else 658 mipi_syst_u32 et_type : 4; /**< SyS-T message type ID */ 659 mipi_syst_u32 et_severity : 3; /**< severity level of message */ 660 mipi_syst_u32 et_res7 : 1; /**< reserved for future use */ 661 mipi_syst_u32 et_location : 1; /**< indicate location information */ 662 mipi_syst_u32 et_length : 1; /**< indicate length field */ 663 mipi_syst_u32 et_chksum : 1; /**< indicate 32-bit CRC */ 664 mipi_syst_u32 et_timestamp : 1;/**< indicate 64-bit timestamp */ 665 mipi_syst_u32 et_modunit : 11; /**< unit for GUID or module:unit */ 666 mipi_syst_u32 et_guid : 1; /**< 128-bit GUID present */ 667 mipi_syst_u32 et_subtype : 6; /**< type dependent sub category */ 668 mipi_syst_u32 et_res30 : 1; /**< reserved for future use */ 669 mipi_syst_u32 et_res31 : 1; /**< reserved for future use */ 670#endif 671}; 672#define _MIPI_SYST_MK_MODUNIT_ORIGIN(m,u) (((u) & 0xF)|(m<<4)) 673 674/** 675 * Message severity level enumeration 676 */ 677enum mipi_syst_severity { 678 MIPI_SYST_SEVERITY_MAX = 0, /**< no assigned severity */ 679 MIPI_SYST_SEVERITY_FATAL = 1, /**< critical error level */ 680 MIPI_SYST_SEVERITY_ERROR = 2, /**< error message level */ 681 MIPI_SYST_SEVERITY_WARNING = 3,/**< warning message level */ 682 MIPI_SYST_SEVERITY_INFO = 4, /**< information message level */ 683 MIPI_SYST_SEVERITY_USER1 = 5, /**< user defined level 5 */ 684 MIPI_SYST_SEVERITY_USER2 = 6, /**< user defined level 6 */ 685 MIPI_SYST_SEVERITY_DEBUG = 7 /**< debug information level */ 686}; 687 688/** 689 * Location information inside a message (64-bit format) 690 * Location is either the source position of the instrumentation call, or 691 * the call instruction pointer value. 692 */ 693union mipi_syst_msglocation32 { 694 struct { 695#if defined(MIPI_SYST_BIG_ENDIAN) 696 mipi_syst_u16 etls_lineNo; /**< line number in file */ 697 mipi_syst_u16 etls_fileID; /**< ID of instrumented file */ 698#else 699 mipi_syst_u16 etls_fileID; /**< ID of instrumented file */ 700 mipi_syst_u16 etls_lineNo; /**< line number in file */ 701#endif 702 } etls_source_location; 703 704 mipi_syst_u32 etls_code_location:32; /**< instruction pointer value */ 705}; 706 707/** 708 * Location information inside a message (32-bit format) 709 * Location is either the source position of the instrumentation call, or 710 * the call instruction pointer value. 711 */ 712union mipi_syst_msglocation64 { 713 struct { 714#if defined(MIPI_SYST_BIG_ENDIAN) 715 mipi_syst_u32 etls_lineNo; /**< line number in file */ 716 mipi_syst_u32 etls_fileID; /**< ID of instrumented file */ 717#else 718 mipi_syst_u32 etls_fileID; /**< ID of instrumented file */ 719 mipi_syst_u32 etls_lineNo; /**< line number in file */ 720#endif 721 } etls_source_location; 722 mipi_syst_u64 etls_code_location; /**< instruction pointer value */ 723}; 724 725/** 726 * Location information record descriptor 727 */ 728struct mipi_syst_msglocation { 729 /** Message format 730 * 0 = 16-Bit file and 16-Bit line (total: 32-bit) 731 * 1 = 32-Bit file and 32-Bit line (total: 64-bit) 732 * 2 = 32-bit code address 733 * 3 = 64-bit code address 734 */ 735 mipi_syst_u8 el_format; 736 union { 737 union mipi_syst_msglocation32 loc32; /**< data for 32-bit variant */ 738 union mipi_syst_msglocation64 loc64; /**< data for 64-bit variant */ 739 } el_u; 740}; 741 742/** internal handle state flags 743 */ 744struct mipi_syst_handle_flags { 745 mipi_syst_u32 shf_alloc:1; /**< set to 1 if heap allocated handle */ 746}; 747 748/** SyS-T connection handle state structure 749 * 750 * This structure connects the instrumentation API with the underlying SyS-T 751 * infrastructure. It plays a similar role to a FILE * in traditional 752 * C file IO. 753 */ 754 struct mipi_syst_handle { 755 struct mipi_syst_header* systh_header; /**< global state */ 756 struct mipi_syst_handle_flags systh_flags; /**< handle state */ 757 struct mipi_syst_msg_tag systh_tag; /**< tag flags */ 758 759#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) 760 struct mipi_syst_guid systh_guid; /**< module GUID */ 761#endif 762 763#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) 764 struct mipi_syst_msglocation systh_location; /**< location record */ 765#endif 766 767 mipi_syst_u32 systh_param_count; /**< number of parameters */ 768 mipi_syst_u32 systh_param[6]; /**< catalog msg parameters */ 769 770#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) 771 struct mipi_syst_platform_handle systh_platform; 772 /**< platform specific state */ 773#endif 774}; 775 776 777#ifdef __cplusplus 778} /* extern C */ 779#endif 780#ifndef MIPI_SYST_API_INCLUDED 781#include "mipi_syst/api.h" 782#endif 783 784#endif 785