162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#undef TRACE_SYSTEM
362306a36Sopenharmony_ci#define TRACE_SYSTEM devfreq
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#if !defined(_TRACE_DEVFREQ_H) || defined(TRACE_HEADER_MULTI_READ)
662306a36Sopenharmony_ci#define _TRACE_DEVFREQ_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/devfreq.h>
962306a36Sopenharmony_ci#include <linux/tracepoint.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciTRACE_EVENT(devfreq_frequency,
1262306a36Sopenharmony_ci	TP_PROTO(struct devfreq *devfreq, unsigned long freq,
1362306a36Sopenharmony_ci		 unsigned long prev_freq),
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	TP_ARGS(devfreq, freq, prev_freq),
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	TP_STRUCT__entry(
1862306a36Sopenharmony_ci		__string(dev_name, dev_name(&devfreq->dev))
1962306a36Sopenharmony_ci		__field(unsigned long, freq)
2062306a36Sopenharmony_ci		__field(unsigned long, prev_freq)
2162306a36Sopenharmony_ci		__field(unsigned long, busy_time)
2262306a36Sopenharmony_ci		__field(unsigned long, total_time)
2362306a36Sopenharmony_ci	),
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	TP_fast_assign(
2662306a36Sopenharmony_ci		__assign_str(dev_name, dev_name(&devfreq->dev));
2762306a36Sopenharmony_ci		__entry->freq = freq;
2862306a36Sopenharmony_ci		__entry->prev_freq = prev_freq;
2962306a36Sopenharmony_ci		__entry->busy_time = devfreq->last_status.busy_time;
3062306a36Sopenharmony_ci		__entry->total_time = devfreq->last_status.total_time;
3162306a36Sopenharmony_ci	),
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	TP_printk("dev_name=%-30s freq=%-12lu prev_freq=%-12lu load=%-2lu",
3462306a36Sopenharmony_ci		__get_str(dev_name), __entry->freq, __entry->prev_freq,
3562306a36Sopenharmony_ci		__entry->total_time == 0 ? 0 :
3662306a36Sopenharmony_ci			(100 * __entry->busy_time) / __entry->total_time)
3762306a36Sopenharmony_ci);
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ciTRACE_EVENT(devfreq_monitor,
4062306a36Sopenharmony_ci	TP_PROTO(struct devfreq *devfreq),
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	TP_ARGS(devfreq),
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	TP_STRUCT__entry(
4562306a36Sopenharmony_ci		__field(unsigned long, freq)
4662306a36Sopenharmony_ci		__field(unsigned long, busy_time)
4762306a36Sopenharmony_ci		__field(unsigned long, total_time)
4862306a36Sopenharmony_ci		__field(unsigned int, polling_ms)
4962306a36Sopenharmony_ci		__string(dev_name, dev_name(&devfreq->dev))
5062306a36Sopenharmony_ci	),
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	TP_fast_assign(
5362306a36Sopenharmony_ci		__entry->freq = devfreq->previous_freq;
5462306a36Sopenharmony_ci		__entry->busy_time = devfreq->last_status.busy_time;
5562306a36Sopenharmony_ci		__entry->total_time = devfreq->last_status.total_time;
5662306a36Sopenharmony_ci		__entry->polling_ms = devfreq->profile->polling_ms;
5762306a36Sopenharmony_ci		__assign_str(dev_name, dev_name(&devfreq->dev));
5862306a36Sopenharmony_ci	),
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	TP_printk("dev_name=%-30s freq=%-12lu polling_ms=%-3u load=%-2lu",
6162306a36Sopenharmony_ci		__get_str(dev_name), __entry->freq, __entry->polling_ms,
6262306a36Sopenharmony_ci		__entry->total_time == 0 ? 0 :
6362306a36Sopenharmony_ci			(100 * __entry->busy_time) / __entry->total_time)
6462306a36Sopenharmony_ci);
6562306a36Sopenharmony_ci#endif /* _TRACE_DEVFREQ_H */
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/* This part must be outside protection */
6862306a36Sopenharmony_ci#include <trace/define_trace.h>
69