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