/* SPDX-License-Identifier: GPL-2.0-only */

#undef TRACE_SYSTEM
#define TRACE_SYSTEM timer_migration

#if !defined(_TRACE_TIMER_MIGRATION_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_TIMER_MIGRATION_H

#include <linux/tracepoint.h>

/* Group events */
TRACE_EVENT(tmigr_group_set,

	TP_PROTO(struct tmigr_group *group),

	TP_ARGS(group),

	TP_STRUCT__entry(
		__field( void *,	group		)
		__field( unsigned int,	lvl		)
		__field( unsigned int,	numa_node	)
	),

	TP_fast_assign(
		__entry->group		= group;
		__entry->lvl		= group->level;
		__entry->numa_node	= group->numa_node;
	),

	TP_printk("group=%p lvl=%d numa=%d",
		  __entry->group, __entry->lvl, __entry->numa_node)
);

TRACE_EVENT(tmigr_connect_child_parent,

	TP_PROTO(struct tmigr_group *child),

	TP_ARGS(child),

	TP_STRUCT__entry(
		__field( void *,	child		)
		__field( void *,	parent		)
		__field( unsigned int,	lvl		)
		__field( unsigned int,	numa_node	)
		__field( unsigned int,	num_children	)
		__field( u32,		groupmask	)
	),

	TP_fast_assign(
		__entry->child		= child;
		__entry->parent		= child->parent;
		__entry->lvl		= child->parent->level;
		__entry->numa_node	= child->parent->numa_node;
		__entry->num_children	= child->parent->num_children;
		__entry->groupmask	= child->groupmask;
	),

	TP_printk("group=%p groupmask=%0x parent=%p lvl=%d numa=%d num_children=%d",
		  __entry->child,  __entry->groupmask, __entry->parent,
		  __entry->lvl, __entry->numa_node, __entry->num_children)
);

TRACE_EVENT(tmigr_connect_cpu_parent,

	TP_PROTO(struct tmigr_cpu *tmc),

	TP_ARGS(tmc),

	TP_STRUCT__entry(
		__field( void *,	parent		)
		__field( unsigned int,	cpu		)
		__field( unsigned int,	lvl		)
		__field( unsigned int,	numa_node	)
		__field( unsigned int,	num_children	)
		__field( u32,		groupmask	)
	),

	TP_fast_assign(
		__entry->parent		= tmc->tmgroup;
		__entry->cpu		= tmc->cpuevt.cpu;
		__entry->lvl		= tmc->tmgroup->level;
		__entry->numa_node	= tmc->tmgroup->numa_node;
		__entry->num_children	= tmc->tmgroup->num_children;
		__entry->groupmask	= tmc->groupmask;
	),

	TP_printk("cpu=%d groupmask=%0x parent=%p lvl=%d numa=%d num_children=%d",
		  __entry->cpu,	 __entry->groupmask, __entry->parent,
		  __entry->lvl, __entry->numa_node, __entry->num_children)
);

DECLARE_EVENT_CLASS(tmigr_group_and_cpu,

	TP_PROTO(struct tmigr_group *group, union tmigr_state state, u32 childmask),

	TP_ARGS(group, state, childmask),

	TP_STRUCT__entry(
		__field( void *,	group		)
		__field( void *,	parent		)
		__field( unsigned int,	lvl		)
		__field( unsigned int,	numa_node	)
		__field( u32,		childmask	)
		__field( u8,		active		)
		__field( u8,		migrator	)
	),

	TP_fast_assign(
		__entry->group		= group;
		__entry->parent		= group->parent;
		__entry->lvl		= group->level;
		__entry->numa_node	= group->numa_node;
		__entry->childmask	= childmask;
		__entry->active		= state.active;
		__entry->migrator	= state.migrator;
	),

	TP_printk("group=%p lvl=%d numa=%d active=%0x migrator=%0x "
		  "parent=%p childmask=%0x",
		  __entry->group, __entry->lvl, __entry->numa_node,
		  __entry->active, __entry->migrator,
		  __entry->parent, __entry->childmask)
);

DEFINE_EVENT(tmigr_group_and_cpu, tmigr_group_set_cpu_inactive,

	TP_PROTO(struct tmigr_group *group, union tmigr_state state, u32 childmask),

	TP_ARGS(group, state, childmask)
);

DEFINE_EVENT(tmigr_group_and_cpu, tmigr_group_set_cpu_active,

	TP_PROTO(struct tmigr_group *group, union tmigr_state state, u32 childmask),

	TP_ARGS(group, state, childmask)
);

/* CPU events*/
DECLARE_EVENT_CLASS(tmigr_cpugroup,

	TP_PROTO(struct tmigr_cpu *tmc),

	TP_ARGS(tmc),

	TP_STRUCT__entry(
		__field( u64,		wakeup	)
		__field( void *,	parent	)
		__field( unsigned int,	cpu	)

	),

	TP_fast_assign(
		__entry->wakeup		= tmc->wakeup;
		__entry->parent		= tmc->tmgroup;
		__entry->cpu		= tmc->cpuevt.cpu;
	),

	TP_printk("cpu=%d parent=%p wakeup=%llu", __entry->cpu, __entry->parent, __entry->wakeup)
);

DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_new_timer,

	TP_PROTO(struct tmigr_cpu *tmc),

	TP_ARGS(tmc)
);

DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_active,

	TP_PROTO(struct tmigr_cpu *tmc),

	TP_ARGS(tmc)
);

DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_available,

	TP_PROTO(struct tmigr_cpu *tmc),

	TP_ARGS(tmc)
);

DEFINE_EVENT(tmigr_cpugroup, tmigr_cpu_unavailable,

	TP_PROTO(struct tmigr_cpu *tmc),

	TP_ARGS(tmc)
);

DEFINE_EVENT(tmigr_cpugroup, tmigr_handle_remote_cpu,

	TP_PROTO(struct tmigr_cpu *tmc),

	TP_ARGS(tmc)
);

DECLARE_EVENT_CLASS(tmigr_idle,

	TP_PROTO(struct tmigr_cpu *tmc, u64 nextevt),

	TP_ARGS(tmc, nextevt),

	TP_STRUCT__entry(
		__field( u64,		nextevt)
		__field( u64,		wakeup)
		__field( void *,	parent)
		__field( unsigned int,	cpu)
	),

	TP_fast_assign(
		__entry->nextevt	= nextevt;
		__entry->wakeup		= tmc->wakeup;
		__entry->parent		= tmc->tmgroup;
		__entry->cpu		= tmc->cpuevt.cpu;
	),

	TP_printk("cpu=%d parent=%p nextevt=%llu wakeup=%llu",
		  __entry->cpu, __entry->parent, __entry->nextevt, __entry->wakeup)
);

DEFINE_EVENT(tmigr_idle, tmigr_cpu_idle,

	TP_PROTO(struct tmigr_cpu *tmc, u64 nextevt),

	TP_ARGS(tmc, nextevt)
);

DEFINE_EVENT(tmigr_idle, tmigr_cpu_new_timer_idle,

	TP_PROTO(struct tmigr_cpu *tmc, u64 nextevt),

	TP_ARGS(tmc, nextevt)
);

TRACE_EVENT(tmigr_update_events,

	TP_PROTO(struct tmigr_group *child, struct tmigr_group *group,
		 union tmigr_state childstate,	union tmigr_state groupstate,
		 u64 nextevt),

	TP_ARGS(child, group, childstate, groupstate, nextevt),

	TP_STRUCT__entry(
		__field( void *,	child			)
		__field( void *,	group			)
		__field( u64,		nextevt			)
		__field( u64,		group_next_expiry	)
		__field( u64,		child_evt_expiry	)
		__field( unsigned int,	group_lvl		)
		__field( unsigned int,	child_evtcpu		)
		__field( u8,		child_active		)
		__field( u8,		group_active		)
	),

	TP_fast_assign(
		__entry->child			= child;
		__entry->group			= group;
		__entry->nextevt		= nextevt;
		__entry->group_next_expiry	= group->next_expiry;
		__entry->child_evt_expiry	= child ? child->groupevt.nextevt.expires : 0;
		__entry->group_lvl		= group->level;
		__entry->child_evtcpu		= child ? child->groupevt.cpu : 0;
		__entry->child_active		= childstate.active;
		__entry->group_active		= groupstate.active;
	),

	TP_printk("child=%p group=%p group_lvl=%d child_active=%0x group_active=%0x "
		  "nextevt=%llu next_expiry=%llu child_evt_expiry=%llu child_evtcpu=%d",
		  __entry->child, __entry->group, __entry->group_lvl, __entry->child_active,
		  __entry->group_active,
		  __entry->nextevt, __entry->group_next_expiry, __entry->child_evt_expiry,
		  __entry->child_evtcpu)
);

TRACE_EVENT(tmigr_handle_remote,

	TP_PROTO(struct tmigr_group *group),

	TP_ARGS(group),

	TP_STRUCT__entry(
		__field( void * ,	group	)
		__field( unsigned int ,	lvl	)
	),

	TP_fast_assign(
		__entry->group		= group;
		__entry->lvl		= group->level;
	),

	TP_printk("group=%p lvl=%d",
		   __entry->group, __entry->lvl)
);

#endif /*  _TRACE_TIMER_MIGRATION_H */

/* This part must be outside protection */
#include <trace/define_trace.h>
