tracing: ctf: add timer support

Add k_timer tracing to CTF and other formats.

Signed-off-by: Anas Nashif <anas.nashif@intel.com>
diff --git a/include/zephyr/tracing/tracing.h b/include/zephyr/tracing/tracing.h
index e564f23..4a0ff98 100644
--- a/include/zephyr/tracing/tracing.h
+++ b/include/zephyr/tracing/tracing.h
@@ -1823,8 +1823,10 @@
 /**
  * @brief Trace Timer start
  * @param timer Timer object
+ * @param duration Timer duration
+ * @param period Timer period
  */
-#define sys_port_trace_k_timer_start(timer)
+#define sys_port_trace_k_timer_start(timer, duration, period)
 
 /**
  * @brief Trace Timer stop
diff --git a/include/zephyr/tracing/tracking.h b/include/zephyr/tracing/tracking.h
index af67e91..db1cefd 100644
--- a/include/zephyr/tracing/tracking.h
+++ b/include/zephyr/tracing/tracking.h
@@ -63,7 +63,7 @@
 #define sys_port_track_k_mutex_init(mutex, ret) \
 	sys_track_k_mutex_init(mutex)
 #define sys_port_track_k_timer_stop(timer)
-#define sys_port_track_k_timer_start(timer)
+#define sys_port_track_k_timer_start(timer, duration, period)
 #define sys_port_track_k_timer_init(timer) \
 	sys_track_k_timer_init(timer)
 #define sys_port_track_k_queue_peek_tail(queue, ret)
@@ -117,7 +117,7 @@
 #define sys_port_track_k_work_init(work)
 #define sys_port_track_k_mutex_init(mutex, ret)
 #define sys_port_track_k_timer_stop(timer)
-#define sys_port_track_k_timer_start(timer)
+#define sys_port_track_k_timer_start(timer, duration, period)
 #define sys_port_track_k_timer_init(timer)
 #define sys_port_track_k_queue_peek_tail(queue, ret)
 #define sys_port_track_k_queue_peek_head(queue, ret)
diff --git a/kernel/timer.c b/kernel/timer.c
index d5f0a05..474ccf6 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -111,7 +111,7 @@
 void z_impl_k_timer_start(struct k_timer *timer, k_timeout_t duration,
 			  k_timeout_t period)
 {
-	SYS_PORT_TRACING_OBJ_FUNC(k_timer, start, timer);
+	SYS_PORT_TRACING_OBJ_FUNC(k_timer, start, timer, duration, period);
 
 	if (K_TIMEOUT_EQ(duration, K_FOREVER)) {
 		return;
diff --git a/subsys/tracing/ctf/ctf_top.c b/subsys/tracing/ctf/ctf_top.c
index e27ae14..100e770 100644
--- a/subsys/tracing/ctf/ctf_top.c
+++ b/subsys/tracing/ctf/ctf_top.c
@@ -274,24 +274,48 @@
 }
 
 /* Timer */
-void sys_trace_k_timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn,
-			    k_timer_expiry_t stop_fn)
+void sys_trace_k_timer_init(struct k_timer *timer)
 {
+	ctf_top_timer_init(
+		(uint32_t)(uintptr_t)timer);
 }
 
 void sys_trace_k_timer_start(struct k_timer *timer, k_timeout_t duration,
 			     k_timeout_t period)
 {
+	ctf_top_timer_start(
+		(uint32_t)(uintptr_t)timer,
+		k_ticks_to_us_floor32((uint32_t)duration.ticks),
+		k_ticks_to_us_floor32((uint32_t)period.ticks)
+		);
 }
 
 void sys_trace_k_timer_stop(struct k_timer *timer)
 {
+	ctf_top_timer_stop(
+		(uint32_t)(uintptr_t)timer
+		);
 }
 
-void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer)
+void sys_trace_k_timer_status_sync_enter(struct k_timer *timer)
 {
+	ctf_top_timer_status_sync_enter(
+		(uint32_t)(uintptr_t)timer
+		);
+}
+
+void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer, k_timeout_t timeout)
+{
+	ctf_top_timer_status_sync_blocking(
+		(uint32_t)(uintptr_t)timer,
+		k_ticks_to_us_floor32((uint32_t)timeout.ticks)
+		);
 }
 
 void sys_trace_k_timer_status_sync_exit(struct k_timer *timer, uint32_t result)
 {
+	ctf_top_timer_status_sync_exit(
+		(uint32_t)(uintptr_t)timer,
+		result
+		);
 }
diff --git a/subsys/tracing/ctf/ctf_top.h b/subsys/tracing/ctf/ctf_top.h
index 61078b2..845711c 100644
--- a/subsys/tracing/ctf/ctf_top.h
+++ b/subsys/tracing/ctf/ctf_top.h
@@ -97,6 +97,13 @@
 	CTF_EVENT_MUTEX_LOCK_EXIT = 0x2B,
 	CTF_EVENT_MUTEX_UNLOCK_ENTER = 0x2C,
 	CTF_EVENT_MUTEX_UNLOCK_EXIT = 0x2D,
+	CTF_EVENT_TIMER_INIT = 0x2E,
+	CTF_EVENT_TIMER_START = 0x2F,
+	CTF_EVENT_TIMER_STOP = 0x30,
+	CTF_EVENT_TIMER_STATUS_SYNC_ENTER = 0x31,
+	CTF_EVENT_TIMER_STATUS_SYNC_BLOCKING = 0x32,
+	CTF_EVENT_TIMER_STATUS_SYNC_EXIT = 0x33
+
 } ctf_event_t;
 
 typedef struct {
@@ -290,4 +297,36 @@
 	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_MUTEX_UNLOCK_EXIT), mutex_id);
 }
 
+/* Timer */
+static inline void ctf_top_timer_init(uint32_t timer)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_INIT), timer);
+}
+
+static inline void ctf_top_timer_start(uint32_t timer, uint32_t duration, uint32_t period)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_START), timer, duration, period);
+}
+
+static inline void ctf_top_timer_stop(uint32_t timer)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_STOP), timer);
+}
+
+static inline void ctf_top_timer_status_sync_enter(uint32_t timer)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_STATUS_SYNC_ENTER), timer);
+}
+
+static inline void ctf_top_timer_status_sync_blocking(uint32_t timer, uint32_t timeout)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_STATUS_SYNC_BLOCKING), timer, timeout);
+}
+
+static inline void ctf_top_timer_status_sync_exit(uint32_t timer, uint32_t result)
+{
+	CTF_EVENT(CTF_LITERAL(uint8_t, CTF_EVENT_TIMER_STATUS_SYNC_EXIT), timer, result);
+}
+
+
 #endif /* SUBSYS_DEBUG_TRACING_CTF_TOP_H */
diff --git a/subsys/tracing/ctf/tracing_ctf.h b/subsys/tracing/ctf/tracing_ctf.h
index a271812..b278c9d 100644
--- a/subsys/tracing/ctf/tracing_ctf.h
+++ b/subsys/tracing/ctf/tracing_ctf.h
@@ -160,6 +160,21 @@
 #define sys_port_trace_k_mutex_unlock_exit(mutex, ret)                         \
 	sys_trace_k_mutex_unlock_exit(mutex, ret)
 
+/* Timer */
+#define sys_port_trace_k_timer_init(timer)					\
+	sys_trace_k_timer_init(timer)
+#define sys_port_trace_k_timer_start(timer, duration, period)			\
+	sys_trace_k_timer_start(timer, duration, period)
+#define sys_port_trace_k_timer_stop(timer)					\
+	sys_trace_k_timer_stop(timer)
+#define sys_port_trace_k_timer_status_sync_enter(timer)				\
+	sys_trace_k_timer_status_sync_enter(timer)
+#define sys_port_trace_k_timer_status_sync_blocking(timer, timeout)		\
+	sys_trace_k_timer_status_sync_blocking(timer, timeout)
+#define sys_port_trace_k_timer_status_sync_exit(timer, result)			\
+	sys_trace_k_timer_status_sync_exit(timer, result)
+
+
 #define sys_port_trace_k_condvar_init(condvar, ret)
 #define sys_port_trace_k_condvar_signal_enter(condvar)
 #define sys_port_trace_k_condvar_signal_blocking(condvar, timeout)
@@ -306,13 +321,6 @@
 #define sys_port_trace_k_mem_slab_free_enter(slab)
 #define sys_port_trace_k_mem_slab_free_exit(slab)
 
-#define sys_port_trace_k_timer_init(timer)
-#define sys_port_trace_k_timer_start(timer)
-#define sys_port_trace_k_timer_stop(timer)
-#define sys_port_trace_k_timer_status_sync_enter(timer)
-#define sys_port_trace_k_timer_status_sync_blocking(timer, timeout)
-#define sys_port_trace_k_timer_status_sync_exit(timer, result)
-
 #define sys_port_trace_k_event_init(event)
 #define sys_port_trace_k_event_post_enter(event, events, events_mask)
 #define sys_port_trace_k_event_post_exit(event, events, events_mask)
@@ -416,12 +424,14 @@
 void sys_trace_k_mutex_unlock_enter(struct k_mutex *mutex);
 void sys_trace_k_mutex_unlock_exit(struct k_mutex *mutex, int ret);
 
-void sys_trace_k_timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn,
-			    k_timer_expiry_t stop_fn);
+/* Timer */
+void sys_trace_k_timer_init(struct k_timer *timer);
+
 void sys_trace_k_timer_start(struct k_timer *timer, k_timeout_t duration,
 			     k_timeout_t period);
 void sys_trace_k_timer_stop(struct k_timer *timer);
-void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer);
+void sys_trace_k_timer_status_sync_blocking(struct k_timer *timer, k_timeout_t timeout);
+void sys_trace_k_timer_status_sync_enter(struct k_timer *timer);
 void sys_trace_k_timer_status_sync_exit(struct k_timer *timer, uint32_t result);
 
 void sys_trace_k_event_init(struct k_event *event);
diff --git a/subsys/tracing/ctf/tsdl/metadata b/subsys/tracing/ctf/tsdl/metadata
index 3d63983..1b44f6a 100644
--- a/subsys/tracing/ctf/tsdl/metadata
+++ b/subsys/tracing/ctf/tsdl/metadata
@@ -260,3 +260,53 @@
 	};
 };
 
+event {
+	name = timer_init;
+	id = 0x2E;
+	fields := struct {
+		uint32_t id;
+	};
+};
+
+event {
+	name = timer_start;
+	id = 0x2F;
+	fields := struct {
+		uint32_t id;
+		uint32_t duration;
+		uint32_t period;
+	};
+};
+
+event {
+	name = timer_stop;
+	id = 0x30;
+	fields := struct {
+		uint32_t id;
+	};
+};
+
+event {
+	name = timer_status_sync_enter;
+	id = 0x31;
+	fields := struct {
+		uint32_t id;
+	};
+};
+
+event {
+	name = timer_status_sync_blocking;
+	id = 0x32;
+	fields := struct {
+		uint32_t id;
+	};
+};
+
+event {
+	name = timer_status_sync_exit;
+	id = 0x33;
+	fields := struct {
+		uint32_t id;
+		uint32_t result;
+	};
+};
diff --git a/subsys/tracing/sysview/tracing_sysview.h b/subsys/tracing/sysview/tracing_sysview.h
index 7dd03eb..a66b859 100644
--- a/subsys/tracing/sysview/tracing_sysview.h
+++ b/subsys/tracing/sysview/tracing_sysview.h
@@ -583,8 +583,9 @@
 #define sys_port_trace_k_timer_init(timer)                                                         \
 	SEGGER_SYSVIEW_RecordU32(TID_TIMER_INIT, (uint32_t)(uintptr_t)timer)
 
-#define sys_port_trace_k_timer_start(timer)                                                        \
-	SEGGER_SYSVIEW_RecordU32(TID_TIMER_START, (uint32_t)(uintptr_t)timer)
+#define sys_port_trace_k_timer_start(timer, duration, period)					   \
+	SEGGER_SYSVIEW_RecordU32x3(TID_TIMER_START, (uint32_t)(uintptr_t)timer,			   \
+			(uint32_t)duration.ticks, (uint32_t)period.ticks)
 
 #define sys_port_trace_k_timer_stop(timer)                                                         \
 	SEGGER_SYSVIEW_RecordU32(TID_TIMER_STOP, (uint32_t)(uintptr_t)timer)
diff --git a/subsys/tracing/test/tracing_string_format_test.c b/subsys/tracing/test/tracing_string_format_test.c
index 348d2e4..e79e5f1 100644
--- a/subsys/tracing/test/tracing_string_format_test.c
+++ b/subsys/tracing/test/tracing_string_format_test.c
@@ -316,7 +316,8 @@
 void sys_trace_k_timer_start(struct k_timer *timer, k_timeout_t duration,
 			     k_timeout_t period)
 {
-	TRACING_STRING("%s: %p, duration: %d, period: %d\n", __func__, timer, duration, period);
+	TRACING_STRING("%s: %p, duration: %d, period: %d\n", __func__, timer,
+		(uint32_t)duration.ticks, (uint32_t)period.ticks);
 }
 
 void sys_trace_k_timer_init(struct k_timer *timer, k_timer_expiry_t expiry_fn,
diff --git a/subsys/tracing/test/tracing_test.h b/subsys/tracing/test/tracing_test.h
index 7e49bd9..e8077ea 100644
--- a/subsys/tracing/test/tracing_test.h
+++ b/subsys/tracing/test/tracing_test.h
@@ -412,7 +412,8 @@
 #define sys_port_trace_k_mem_slab_free_exit(slab) sys_trace_k_mem_slab_free_exit(slab, mem)
 
 #define sys_port_trace_k_timer_init(timer) sys_trace_k_timer_init(timer, expiry_fn, stop_fn)
-#define sys_port_trace_k_timer_start(timer) sys_trace_k_timer_start(timer, duration, period)
+#define sys_port_trace_k_timer_start(timer, duration, period)					   \
+	sys_trace_k_timer_start(timer, duration, period)
 #define sys_port_trace_k_timer_stop(timer) sys_trace_k_timer_stop(timer)
 #define sys_port_trace_k_timer_status_sync_enter(timer)
 #define sys_port_trace_k_timer_status_sync_blocking(timer, timeout)                                \
diff --git a/subsys/tracing/user/tracing_user.h b/subsys/tracing/user/tracing_user.h
index df2b963..3757627 100644
--- a/subsys/tracing/user/tracing_user.h
+++ b/subsys/tracing/user/tracing_user.h
@@ -309,7 +309,7 @@
 #define sys_port_trace_k_mem_slab_free_exit(slab)
 
 #define sys_port_trace_k_timer_init(timer)
-#define sys_port_trace_k_timer_start(timer)
+#define sys_port_trace_k_timer_start(timer, duration, period)
 #define sys_port_trace_k_timer_stop(timer)
 #define sys_port_trace_k_timer_status_sync_enter(timer)
 #define sys_port_trace_k_timer_status_sync_blocking(timer, timeout)