/* * Nvhost event logging to ftrace. * * Copyright (c) 2013-2019, NVIDIA Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. */ #undef TRACE_SYSTEM #define TRACE_SYSTEM nvhost_podgov #if !defined(_TRACE_NVHOST_PODGOV_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_NVHOST_PODGOV_H #include #include #include DECLARE_EVENT_CLASS(podgov_update_freq, TP_PROTO(struct device *dev, unsigned long old_freq, unsigned long new_freq), TP_ARGS(dev, old_freq, new_freq), TP_STRUCT__entry( __field(struct device *, dev) __field(unsigned long, old_freq) __field(unsigned long, new_freq) ), TP_fast_assign( __entry->dev = dev; __entry->old_freq = old_freq; __entry->new_freq = new_freq; ), TP_printk("name=%s, old_freq=%lu, new_freq=%lu", dev_name(__entry->dev), __entry->old_freq, __entry->new_freq) ); DEFINE_EVENT(podgov_update_freq, podgov_do_scale, TP_PROTO(struct device *dev, unsigned long old_freq, unsigned long new_freq), TP_ARGS(dev, old_freq, new_freq) ); DEFINE_EVENT(podgov_update_freq, podgov_scaling_state_check, TP_PROTO(struct device *dev, unsigned long old_freq, unsigned long new_freq), TP_ARGS(dev, old_freq, new_freq) ); DEFINE_EVENT(podgov_update_freq, podgov_estimate_freq, TP_PROTO(struct device *dev, unsigned long old_freq, unsigned long new_freq), TP_ARGS(dev, old_freq, new_freq) ); DEFINE_EVENT(podgov_update_freq, podgov_clocks_handler, TP_PROTO(struct device *dev, unsigned long old_freq, unsigned long new_freq), TP_ARGS(dev, old_freq, new_freq) ); TRACE_EVENT(podgov_enabled, TP_PROTO(struct device *dev, int enable), TP_ARGS(dev, enable), TP_STRUCT__entry( __field(struct device *, dev) __field(int, enable) ), TP_fast_assign( __entry->dev = dev; __entry->enable = enable; ), TP_printk("name=%s, scaling_enabled=%d", dev_name(__entry->dev), __entry->enable) ); TRACE_EVENT(podgov_set_user_ctl, TP_PROTO(struct device *dev, int user_ctl), TP_ARGS(dev, user_ctl), TP_STRUCT__entry( __field(struct device *, dev) __field(int, user_ctl) ), TP_fast_assign( __entry->dev = dev; __entry->user_ctl = user_ctl; ), TP_printk("name=%s, userspace control=%d", dev_name(__entry->dev), __entry->user_ctl) ); TRACE_EVENT(podgov_set_freq_request, TP_PROTO(struct device *dev, int freq_request), TP_ARGS(dev, freq_request), TP_STRUCT__entry( __field(struct device *, dev) __field(int, freq_request) ), TP_fast_assign( __entry->dev = dev; __entry->freq_request = freq_request; ), TP_printk("name=%s, freq_request=%d", dev_name(__entry->dev), __entry->freq_request) ); TRACE_EVENT(podgov_busy, TP_PROTO(struct device *dev, unsigned long busyness), TP_ARGS(dev, busyness), TP_STRUCT__entry( __field(struct device *, dev) __field(unsigned long, busyness) ), TP_fast_assign( __entry->dev = dev; __entry->busyness = busyness; ), TP_printk("name=%s, busyness=%lu", dev_name(__entry->dev), __entry->busyness) ); TRACE_EVENT(podgov_hint, TP_PROTO(struct device *dev, long idle_estimate, int hint), TP_ARGS(dev, idle_estimate, hint), TP_STRUCT__entry( __field(struct device *, dev) __field(long, idle_estimate) __field(int, hint) ), TP_fast_assign( __entry->dev = dev; __entry->idle_estimate = idle_estimate; __entry->hint = hint; ), TP_printk("podgov (%s): idle %ld, hint %d", dev_name(__entry->dev), __entry->idle_estimate, __entry->hint) ); TRACE_EVENT(podgov_idle, TP_PROTO(struct device *dev, unsigned long idleness), TP_ARGS(dev, idleness), TP_STRUCT__entry( __field(struct device *, dev) __field(unsigned long, idleness) ), TP_fast_assign( __entry->dev = dev; __entry->idleness = idleness; ), TP_printk("name=%s, idleness=%lu", dev_name(__entry->dev), __entry->idleness) ); TRACE_EVENT(podgov_load, TP_PROTO(struct device *dev, unsigned long load), TP_ARGS(dev, load), TP_STRUCT__entry( __field(struct device *, dev) __field(unsigned long, load) ), TP_fast_assign( __entry->dev = dev; __entry->load = load; ), TP_printk("name=%s, load=%lu", dev_name(__entry->dev), __entry->load) ); TRACE_EVENT(podgov_print_target, TP_PROTO(struct device *dev, long busy, int avg_busy, long curr, long target, int hint, int avg_hint), TP_ARGS(dev, busy, avg_busy, curr, target, hint, avg_hint), TP_STRUCT__entry( __field(struct device *, dev) __field(long, busy) __field(int, avg_busy) __field(long, curr) __field(long, target) __field(int, hint) __field(int, avg_hint) ), TP_fast_assign( __entry->dev = dev; __entry->busy = busy; __entry->avg_busy = avg_busy; __entry->curr = curr; __entry->target = target; __entry->hint = hint; __entry->avg_hint = avg_hint; ), TP_printk("podgov (%s): busy %ld <%d>, curr %ld, t %ld, hint %d <%d>\n", dev_name(__entry->dev), __entry->busy, __entry->avg_busy, __entry->curr, __entry->target, __entry->hint, __entry->avg_hint) ); TRACE_EVENT(podgov_stats, TP_PROTO(struct device *dev, int fast_up_count, int slow_down_count, unsigned int idle_min, unsigned int idle_max), TP_ARGS(dev, fast_up_count, slow_down_count, idle_min, idle_max), TP_STRUCT__entry( __field(struct device *, dev) __field(int, fast_up_count) __field(int, slow_down_count) __field(unsigned int, idle_min) __field(unsigned int, idle_max) ), TP_fast_assign( __entry->dev = dev; __entry->fast_up_count = fast_up_count; __entry->slow_down_count = slow_down_count; __entry->idle_min = idle_min; __entry->idle_max = idle_max; ), TP_printk("podgov stats (%s): + %d - %d min %u max %u\n", dev_name(__entry->dev), __entry->fast_up_count, __entry->slow_down_count, __entry->idle_min, __entry->idle_max) ); #endif /* _TRACE_NVHOST_PODGOV_H */ /* This part must be outside protection */ #include