mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-24 18:21:35 +03:00
GPU clock may change within the period of time defined by smooth. Thus the result of averaging load percentages within smooth window has less meanning. New method keeps track of active GPU cycle count per time unit, and average load is average active cycle count divided by current GPU clock (total cycle count per time unit). Bug 1963732 Change-Id: I88cfb998f9bcfa0d6d0397f653f8e3096d4b3eed Signed-off-by: Peng Liu <pengliu@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/2033266 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
259 lines
6.1 KiB
C
259 lines
6.1 KiB
C
/*
|
|
* 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 <linux/ktime.h>
|
|
#include <linux/tracepoint.h>
|
|
#include <linux/device.h>
|
|
|
|
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 <trace/define_trace.h>
|