Skip to content

Commit 84e5353

Browse files
authored
Merge pull request #478 from akloniex/trace-improvement
debugability: trace_event with 4 parameters, assertion on invalid number of params
2 parents cc3fb1e + f7079f5 commit 84e5353

3 files changed

Lines changed: 180 additions & 18 deletions

File tree

src/include/sof/sof.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ struct sa;
4848
#define PP_NARG(...) (sizeof((unsigned int[]){0, ##__VA_ARGS__}) \
4949
/ sizeof(unsigned int) - 1)
5050

51+
/* compile-time assertion */
52+
#define STATIC_ASSERT(COND, MESSAGE) \
53+
__attribute__((unused)) \
54+
typedef char assertion_failed_##MESSAGE[(COND) ? 1 : -1]
55+
56+
5157
/* general firmware context */
5258
struct sof {
5359
/* init data */

src/include/sof/trace.h

Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,15 @@ void _trace_event_atomic3(uint32_t log_entry, uint32_t param1, uint32_t param2,
111111
void _trace_event_mbox_atomic3(uint32_t log_entry, uint32_t param1,
112112
uint32_t param2, uint32_t param3);
113113

114+
void _trace_event4(uint32_t log_entry, uint32_t param1, uint32_t param2,
115+
uint32_t param3, uint32_t param4);
116+
void _trace_event_mbox4(uint32_t log_entry, uint32_t param1, uint32_t param2,
117+
uint32_t param3, uint32_t param4);
118+
void _trace_event_atomic4(uint32_t log_entry, uint32_t param1, uint32_t param2,
119+
uint32_t param3, uint32_t param4);
120+
void _trace_event_mbox_atomic4(uint32_t log_entry, uint32_t param1,
121+
uint32_t param2, uint32_t param3, uint32_t param4);
122+
114123
void trace_flush(void);
115124
void trace_off(void);
116125
void trace_init(struct sof *sof);
@@ -124,8 +133,9 @@ void trace_init(struct sof *sof);
124133
* It comes in 2 main flavours, atomic and non-atomic. Depending of definitions
125134
* above, it might also propagate log messages to mbox if desired.
126135
*
127-
* First argument is always class of event being logged, as defined above.
128-
* Second argument is string literal in printf format, followed by up to 3
136+
* First argument is always class of event being logged, as defined in
137+
* uapi/logging.h.
138+
* Second argument is string literal in printf format, followed by up to 4
129139
* parameters (uint32_t), that are used to expand into string fromat when
130140
* parsing log data.
131141
*
@@ -217,22 +227,28 @@ typedef void(*log_func)();
217227
format \
218228
}
219229

220-
#define BASE_LOG(function_name, entry, ...) \
221-
{ \
222-
log_func log_function = NULL; \
223-
if (PP_NARG(__VA_ARGS__) == 0) { \
224-
log_function = (log_func)&function_name##0; \
225-
log_function(entry, ##__VA_ARGS__); \
226-
} else if (PP_NARG(__VA_ARGS__) == 1) { \
227-
log_function = (log_func)&function_name##1; \
228-
log_function(entry, ##__VA_ARGS__); \
229-
} else if (PP_NARG(__VA_ARGS__) == 2) { \
230-
log_function = (log_func)&function_name##2; \
231-
log_function(entry, ##__VA_ARGS__); \
232-
} else if (PP_NARG(__VA_ARGS__) == 3) { \
233-
log_function = (log_func)&function_name##3; \
234-
log_function(entry, ##__VA_ARGS__); \
235-
} \
230+
#define BASE_LOG(function_name, entry, ...) \
231+
{ \
232+
log_func log_function = NULL; \
233+
if (PP_NARG(__VA_ARGS__) == 0) { \
234+
log_function = (log_func)&function_name##0; \
235+
log_function(entry, ##__VA_ARGS__); \
236+
} else if (PP_NARG(__VA_ARGS__) == 1) { \
237+
log_function = (log_func)&function_name##1; \
238+
log_function(entry, ##__VA_ARGS__); \
239+
} else if (PP_NARG(__VA_ARGS__) == 2) { \
240+
log_function = (log_func)&function_name##2; \
241+
log_function(entry, ##__VA_ARGS__); \
242+
} else if (PP_NARG(__VA_ARGS__) == 3) { \
243+
log_function = (log_func)&function_name##3; \
244+
log_function(entry, ##__VA_ARGS__); \
245+
} else if (PP_NARG(__VA_ARGS__) == 4) { \
246+
log_function = (log_func)&function_name##4; \
247+
log_function(entry, ##__VA_ARGS__); \
248+
} else { \
249+
STATIC_ASSERT(PP_NARG(__VA_ARGS__) <= 4, \
250+
unsupported_amount_of_params_in_trace_event); \
251+
} \
236252
}
237253

238254
#define __log_message(func_name, lvl, comp_id, format, ...) \

src/lib/trace.c

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,146 @@ void _trace_event_mbox_atomic3(uint32_t log_entry, uint32_t param1,
558558
sizeof(uint32_t) * message_size_dwords);
559559
}
560560

561+
/* send trace events only to the local trace buffer */
562+
void _trace_event4(uint32_t log_entry, uint32_t param1, uint32_t param2,
563+
uint32_t param3, uint32_t param4)
564+
{
565+
uint32_t message_size_dwords = MESSAGE_SIZE(4);
566+
uint32_t payload_offset = sizeof(struct log_entry_header)
567+
/ sizeof(uint32_t);
568+
uint32_t dt[MESSAGE_SIZE(4)];
569+
570+
if (!trace->enable)
571+
return;
572+
573+
put_header(dt, platform_timer_get(platform_timer));
574+
575+
dt[payload_offset] = log_entry;
576+
dt[payload_offset + 1] = param1;
577+
dt[payload_offset + 2] = param2;
578+
dt[payload_offset + 3] = param3;
579+
dt[payload_offset + 4] = param4;
580+
dtrace_event((const char *)dt, sizeof(uint32_t) * message_size_dwords);
581+
}
582+
583+
void _trace_event_atomic4(uint32_t log_entry, uint32_t param1, uint32_t param2,
584+
uint32_t param3, uint32_t param4)
585+
{
586+
uint32_t message_size_dwords = MESSAGE_SIZE(4);
587+
uint32_t payload_offset = sizeof(struct log_entry_header)
588+
/ sizeof(uint32_t);
589+
uint32_t dt[MESSAGE_SIZE(4)];
590+
591+
if (!trace->enable)
592+
return;
593+
594+
put_header(dt, platform_timer_get(platform_timer));
595+
596+
dt[payload_offset] = log_entry;
597+
dt[payload_offset + 1] = param1;
598+
dt[payload_offset + 2] = param2;
599+
dt[payload_offset + 3] = param3;
600+
dt[payload_offset + 4] = param4;
601+
dtrace_event_atomic((const char *)dt,
602+
sizeof(uint32_t) * message_size_dwords);
603+
}
604+
605+
/* send trace events to the local trace buffer and the mailbox */
606+
void _trace_event_mbox4(uint32_t log_entry, uint32_t param1, uint32_t param2,
607+
uint32_t param3, uint32_t param4)
608+
{
609+
unsigned long flags;
610+
uint32_t message_size_dwords = MESSAGE_SIZE(4);
611+
uint32_t payload_offset = sizeof(struct log_entry_header)
612+
/ sizeof(uint32_t);
613+
uint32_t dt[MESSAGE_SIZE(4)];
614+
uint64_t time;
615+
616+
volatile uint32_t *t;
617+
618+
if (!trace->enable)
619+
return;
620+
621+
time = platform_timer_get(platform_timer);
622+
623+
put_header(dt, time);
624+
625+
dt[payload_offset] = log_entry;
626+
dt[payload_offset + 1] = param1;
627+
dt[payload_offset + 2] = param2;
628+
dt[payload_offset + 3] = param3;
629+
dt[payload_offset + 4] = param4;
630+
dtrace_event((const char *)dt, sizeof(uint32_t) * message_size_dwords);
631+
632+
/* send event by mail box too. */
633+
spin_lock_irq(&trace->lock, flags);
634+
635+
/* write timestamp and event to trace buffer */
636+
t = (volatile uint32_t *)(MAILBOX_TRACE_BASE + trace->pos);
637+
trace->pos += sizeof(uint32_t) * message_size_dwords;
638+
639+
if (trace->pos > MAILBOX_TRACE_SIZE
640+
- sizeof(uint32_t) * message_size_dwords)
641+
trace->pos = 0;
642+
643+
spin_unlock_irq(&trace->lock, flags);
644+
645+
put_header(t, time);
646+
t[payload_offset] = log_entry;
647+
t[payload_offset + 1] = param1;
648+
t[payload_offset + 2] = param2;
649+
t[payload_offset + 3] = param3;
650+
t[payload_offset + 4] = param4;
651+
652+
/* writeback trace data */
653+
dcache_writeback_region((void *)t,
654+
sizeof(uint32_t) * message_size_dwords);
655+
}
656+
657+
void _trace_event_mbox_atomic4(uint32_t log_entry, uint32_t param1,
658+
uint32_t param2, uint32_t param3, uint32_t param4)
659+
{
660+
volatile uint32_t *t;
661+
uint32_t message_size_dwords = MESSAGE_SIZE(4);
662+
uint32_t payload_offset = sizeof(struct log_entry_header)
663+
/ sizeof(uint32_t);
664+
uint32_t dt[MESSAGE_SIZE(4)];
665+
uint64_t time;
666+
667+
if (!trace->enable)
668+
return;
669+
670+
time = platform_timer_get(platform_timer);
671+
672+
put_header(dt, time);
673+
dt[payload_offset] = log_entry;
674+
dt[payload_offset + 1] = param1;
675+
dt[payload_offset + 2] = param2;
676+
dt[payload_offset + 3] = param3;
677+
dt[payload_offset + 4] = param4;
678+
dtrace_event_atomic((const char *)dt,
679+
sizeof(uint32_t) * message_size_dwords);
680+
681+
/* write timestamp and event to trace buffer */
682+
t = (volatile uint32_t *)(MAILBOX_TRACE_BASE + trace->pos);
683+
trace->pos += sizeof(uint32_t) * message_size_dwords;
684+
685+
if (trace->pos > MAILBOX_TRACE_SIZE
686+
- sizeof(uint32_t) * message_size_dwords)
687+
trace->pos = 0;
688+
689+
put_header(t, time);
690+
t[payload_offset] = log_entry;
691+
t[payload_offset + 1] = param1;
692+
t[payload_offset + 2] = param2;
693+
t[payload_offset + 3] = param3;
694+
t[payload_offset + 4] = param4;
695+
696+
/* writeback trace data */
697+
dcache_writeback_region((void *)t,
698+
sizeof(uint32_t) * message_size_dwords);
699+
}
700+
561701
void trace_flush(void)
562702
{
563703
volatile uint64_t *t;

0 commit comments

Comments
 (0)