summaryrefslogtreecommitdiff
path: root/mali_kbase/backend/gpu/mali_kbase_clk_rate_trace_mgr.h
blob: a6ee9592701a2bb59a4db78c61bc75c68a82b1f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
 *
 * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
 *
 * This program is free software and is provided to you under the terms of the
 * GNU General Public License version 2 as published by the Free Software
 * Foundation, and any use by you of this program is subject to the terms
 * of such GNU license.
 *
 * This program is distributed in the hope that 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can access it online at
 * http://www.gnu.org/licenses/gpl-2.0.html.
 *
 */

#ifndef _KBASE_CLK_RATE_TRACE_MGR_
#define _KBASE_CLK_RATE_TRACE_MGR_

/* The index of top clock domain in kbase_clk_rate_trace_manager:clks. */
#define KBASE_CLOCK_DOMAIN_TOP (0)

/* The index of shader-cores clock domain in
 * kbase_clk_rate_trace_manager:clks.
 */
#define KBASE_CLOCK_DOMAIN_SHADER_CORES (1)

/**
 * struct kbase_clk_data - Data stored per enumerated GPU clock.
 *
 * @clk_rtm:            Pointer to clock rate trace manager object.
 * @gpu_clk_handle:     Handle unique to the enumerated GPU clock.
 * @plat_private:       Private data for the platform to store into
 * @clk_rate_change_nb: notifier block containing the pointer to callback
 *                      function that is invoked whenever the rate of
 *                      enumerated GPU clock changes.
 * @clock_val:          Current rate of the enumerated GPU clock.
 * @index:              Index at which the GPU clock was enumerated.
 */
struct kbase_clk_data {
	struct kbase_clk_rate_trace_manager *clk_rtm;
	void *gpu_clk_handle;
	void *plat_private;
	struct notifier_block clk_rate_change_nb;
	unsigned long clock_val;
	u8 index;
};

/**
 * kbase_clk_rate_trace_manager_init - Initialize GPU clock rate trace manager.
 *
 * @kbdev:      Device pointer
 *
 * Return: 0 if success, or an error code on failure.
 */
int kbase_clk_rate_trace_manager_init(struct kbase_device *kbdev);

/**
 * kbase_init_lowest_gpu_freq() - Find the lowest frequency that the GPU can
 *                                run as using the device tree, and save this
 *                                within kbdev.
 * @kbdev: Pointer to kbase device.
 *
 * This function could be called from kbase_clk_rate_trace_manager_init,
 * but is left separate as it can be called as soon as
 * dev_pm_opp_of_add_table() has been called to initialize the OPP table.
 *
 * Return: 0 in any case.
 */
int kbase_lowest_gpu_freq_init(struct kbase_device *kbdev);

/**
 * kbase_clk_rate_trace_manager_term - Terminate GPU clock rate trace manager.
 *
 *  @kbdev:      Device pointer
 */
void kbase_clk_rate_trace_manager_term(struct kbase_device *kbdev);

/**
 * kbase_clk_rate_trace_manager_gpu_active - Inform GPU clock rate trace
 *                                           manager of GPU becoming active.
 *
 * @kbdev:      Device pointer
 */
void kbase_clk_rate_trace_manager_gpu_active(struct kbase_device *kbdev);

/**
 * kbase_clk_rate_trace_manager_gpu_idle - Inform GPU clock rate trace
 *                                         manager of GPU becoming idle.
 * @kbdev:      Device pointer
 */
void kbase_clk_rate_trace_manager_gpu_idle(struct kbase_device *kbdev);

/**
 * kbase_clk_rate_trace_manager_subscribe_no_lock() - Add freq change listener.
 *
 * @clk_rtm:    Clock rate manager instance.
 * @listener:   Listener handle
 *
 * kbase_clk_rate_trace_manager:lock must be held by the caller.
 */
static inline void kbase_clk_rate_trace_manager_subscribe_no_lock(
	struct kbase_clk_rate_trace_manager *clk_rtm,
	struct kbase_clk_rate_listener *listener)
{
	lockdep_assert_held(&clk_rtm->lock);
	list_add(&listener->node, &clk_rtm->listeners);
}

/**
 * kbase_clk_rate_trace_manager_subscribe() - Add freq change listener.
 *
 * @clk_rtm:    Clock rate manager instance.
 * @listener:   Listener handle
 */
static inline void kbase_clk_rate_trace_manager_subscribe(
	struct kbase_clk_rate_trace_manager *clk_rtm,
	struct kbase_clk_rate_listener *listener)
{
	unsigned long flags;

	spin_lock_irqsave(&clk_rtm->lock, flags);
	kbase_clk_rate_trace_manager_subscribe_no_lock(
		clk_rtm, listener);
	spin_unlock_irqrestore(&clk_rtm->lock, flags);
}

/**
 * kbase_clk_rate_trace_manager_unsubscribe() - Remove freq change listener.
 *
 * @clk_rtm:    Clock rate manager instance.
 * @listener:   Listener handle
 */
static inline void kbase_clk_rate_trace_manager_unsubscribe(
	struct kbase_clk_rate_trace_manager *clk_rtm,
	struct kbase_clk_rate_listener *listener)
{
	unsigned long flags;

	spin_lock_irqsave(&clk_rtm->lock, flags);
	list_del(&listener->node);
	spin_unlock_irqrestore(&clk_rtm->lock, flags);
}

/**
 * kbase_clk_rate_trace_manager_notify_all() - Notify all clock \
 *                                             rate listeners.
 *
 * @clk_rtm:     Clock rate manager instance.
 * @clock_index:   Clock index.
 * @new_rate:    New clock frequency(Hz)
 *
 * kbase_clk_rate_trace_manager:lock must be locked.
 * This function is exported to be used by clock rate trace test
 * portal.
 */
void kbase_clk_rate_trace_manager_notify_all(
	struct kbase_clk_rate_trace_manager *clk_rtm,
	u32 clock_index,
	unsigned long new_rate);

#endif /* _KBASE_CLK_RATE_TRACE_MGR_ */