• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
2 /*
3  *
4  * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved.
5  *
6  * This program is free software and is provided to you under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation, and any use by you of this program is subject to the terms
9  * of such GNU license.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you can access it online at
18  * http://www.gnu.org/licenses/gpl-2.0.html.
19  *
20  */
21 
22 #include <mali_kbase.h>
23 #include "backend/gpu/mali_kbase_clk_rate_trace_mgr.h"
24 #include "mali_kbase_csf_ipa_control.h"
25 
26 /*
27  * Status flags from the STATUS register of the IPA Control interface.
28  */
29 #define STATUS_COMMAND_ACTIVE ((u32)1 << 0)
30 #define STATUS_TIMER_ACTIVE ((u32)1 << 1)
31 #define STATUS_AUTO_ACTIVE ((u32)1 << 2)
32 #define STATUS_PROTECTED_MODE ((u32)1 << 8)
33 #define STATUS_RESET ((u32)1 << 9)
34 #define STATUS_TIMER_ENABLED ((u32)1 << 31)
35 
36 /*
37  * Commands for the COMMAND register of the IPA Control interface.
38  */
39 #define COMMAND_NOP ((u32)0)
40 #define COMMAND_APPLY ((u32)1)
41 #define COMMAND_CLEAR ((u32)2)
42 #define COMMAND_SAMPLE ((u32)3)
43 #define COMMAND_PROTECTED_ACK ((u32)4)
44 #define COMMAND_RESET_ACK ((u32)5)
45 
46 /*
47  * Default value for the TIMER register of the IPA Control interface,
48  * expressed in milliseconds.
49  *
50  * The chosen value is a trade off between two requirements: the IPA Control
51  * interface should sample counters with a resolution in the order of
52  * milliseconds, while keeping GPU overhead as limited as possible.
53  */
54 #define TIMER_DEFAULT_VALUE_MS ((u32)10) /* 10 milliseconds */
55 
56 /*
57  * Number of timer events per second.
58  */
59 #define TIMER_EVENTS_PER_SECOND ((u32)1000 / TIMER_DEFAULT_VALUE_MS)
60 
61 /*
62  * Maximum number of loops polling the GPU before we assume the GPU has hung.
63  */
64 #define IPA_INACTIVE_MAX_LOOPS ((unsigned int)8000000)
65 
66 /*
67  * Number of bits used to configure a performance counter in SELECT registers.
68  */
69 #define IPA_CONTROL_SELECT_BITS_PER_CNT ((u64)8)
70 
71 /*
72  * Maximum value of a performance counter.
73  */
74 #define MAX_PRFCNT_VALUE (((u64)1 << 48) - 1)
75 
76 /**
77  * struct kbase_ipa_control_listener_data - Data for the GPU clock frequency
78  *                                          listener
79  *
80  * @listener: GPU clock frequency listener.
81  * @kbdev:    Pointer to kbase device.
82  */
83 struct kbase_ipa_control_listener_data {
84 	struct kbase_clk_rate_listener listener;
85 	struct kbase_device *kbdev;
86 };
87 
timer_value(u32 gpu_rate)88 static u32 timer_value(u32 gpu_rate)
89 {
90 	return gpu_rate / TIMER_EVENTS_PER_SECOND;
91 }
92 
wait_status(struct kbase_device * kbdev,u32 flags)93 static int wait_status(struct kbase_device *kbdev, u32 flags)
94 {
95 	unsigned int max_loops = IPA_INACTIVE_MAX_LOOPS;
96 	u32 status = kbase_reg_read(kbdev, IPA_CONTROL_REG(STATUS));
97 
98 	/*
99 	 * Wait for the STATUS register to indicate that flags have been
100 	 * cleared, in case a transition is pending.
101 	 */
102 	while (--max_loops && (status & flags))
103 		status = kbase_reg_read(kbdev, IPA_CONTROL_REG(STATUS));
104 	if (max_loops == 0) {
105 		dev_err(kbdev->dev, "IPA_CONTROL STATUS register stuck");
106 		return -EBUSY;
107 	}
108 
109 	return 0;
110 }
111 
apply_select_config(struct kbase_device * kbdev,u64 * select)112 static int apply_select_config(struct kbase_device *kbdev, u64 *select)
113 {
114 	int ret;
115 
116 	u32 select_cshw_lo = (u32)(select[KBASE_IPA_CORE_TYPE_CSHW] & U32_MAX);
117 	u32 select_cshw_hi =
118 		(u32)((select[KBASE_IPA_CORE_TYPE_CSHW] >> 32) & U32_MAX);
119 	u32 select_memsys_lo =
120 		(u32)(select[KBASE_IPA_CORE_TYPE_MEMSYS] & U32_MAX);
121 	u32 select_memsys_hi =
122 		(u32)((select[KBASE_IPA_CORE_TYPE_MEMSYS] >> 32) & U32_MAX);
123 	u32 select_tiler_lo =
124 		(u32)(select[KBASE_IPA_CORE_TYPE_TILER] & U32_MAX);
125 	u32 select_tiler_hi =
126 		(u32)((select[KBASE_IPA_CORE_TYPE_TILER] >> 32) & U32_MAX);
127 	u32 select_shader_lo =
128 		(u32)(select[KBASE_IPA_CORE_TYPE_SHADER] & U32_MAX);
129 	u32 select_shader_hi =
130 		(u32)((select[KBASE_IPA_CORE_TYPE_SHADER] >> 32) & U32_MAX);
131 
132 	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_CSHW_LO), select_cshw_lo);
133 	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_CSHW_HI), select_cshw_hi);
134 	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_MEMSYS_LO),
135 			select_memsys_lo);
136 	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_MEMSYS_HI),
137 			select_memsys_hi);
138 	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_TILER_LO),
139 			select_tiler_lo);
140 	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_TILER_HI),
141 			select_tiler_hi);
142 	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_SHADER_LO),
143 			select_shader_lo);
144 	kbase_reg_write(kbdev, IPA_CONTROL_REG(SELECT_SHADER_HI),
145 			select_shader_hi);
146 
147 	ret = wait_status(kbdev, STATUS_COMMAND_ACTIVE);
148 
149 	if (!ret) {
150 		kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND), COMMAND_APPLY);
151 		ret = wait_status(kbdev, STATUS_COMMAND_ACTIVE);
152 	} else {
153 		dev_err(kbdev->dev, "Wait for the pending command failed");
154 	}
155 
156 	return ret;
157 }
158 
read_value_cnt(struct kbase_device * kbdev,u8 type,int select_idx)159 static u64 read_value_cnt(struct kbase_device *kbdev, u8 type, int select_idx)
160 {
161 	u32 value_lo, value_hi;
162 
163 	switch (type) {
164 	case KBASE_IPA_CORE_TYPE_CSHW:
165 		value_lo = kbase_reg_read(
166 			kbdev, IPA_CONTROL_REG(VALUE_CSHW_REG_LO(select_idx)));
167 		value_hi = kbase_reg_read(
168 			kbdev, IPA_CONTROL_REG(VALUE_CSHW_REG_HI(select_idx)));
169 		break;
170 	case KBASE_IPA_CORE_TYPE_MEMSYS:
171 		value_lo = kbase_reg_read(
172 			kbdev,
173 			IPA_CONTROL_REG(VALUE_MEMSYS_REG_LO(select_idx)));
174 		value_hi = kbase_reg_read(
175 			kbdev,
176 			IPA_CONTROL_REG(VALUE_MEMSYS_REG_HI(select_idx)));
177 		break;
178 	case KBASE_IPA_CORE_TYPE_TILER:
179 		value_lo = kbase_reg_read(
180 			kbdev, IPA_CONTROL_REG(VALUE_TILER_REG_LO(select_idx)));
181 		value_hi = kbase_reg_read(
182 			kbdev, IPA_CONTROL_REG(VALUE_TILER_REG_HI(select_idx)));
183 		break;
184 	case KBASE_IPA_CORE_TYPE_SHADER:
185 		value_lo = kbase_reg_read(
186 			kbdev,
187 			IPA_CONTROL_REG(VALUE_SHADER_REG_LO(select_idx)));
188 		value_hi = kbase_reg_read(
189 			kbdev,
190 			IPA_CONTROL_REG(VALUE_SHADER_REG_HI(select_idx)));
191 		break;
192 	default:
193 		WARN(1, "Unknown core type: %u\n", type);
194 		value_lo = value_hi = 0;
195 		break;
196 	}
197 
198 	return (((u64)value_hi << 32) | value_lo);
199 }
200 
build_select_config(struct kbase_ipa_control * ipa_ctrl,u64 * select_config)201 static void build_select_config(struct kbase_ipa_control *ipa_ctrl,
202 				u64 *select_config)
203 {
204 	size_t i;
205 
206 	for (i = 0; i < KBASE_IPA_CORE_TYPE_NUM; i++) {
207 		size_t j;
208 
209 		select_config[i] = 0ULL;
210 
211 		for (j = 0; j < KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS; j++) {
212 			struct kbase_ipa_control_prfcnt_config *prfcnt_config =
213 				&ipa_ctrl->blocks[i].select[j];
214 
215 			select_config[i] |=
216 				((u64)prfcnt_config->idx
217 				 << (IPA_CONTROL_SELECT_BITS_PER_CNT * j));
218 		}
219 	}
220 }
221 
update_select_registers(struct kbase_device * kbdev)222 static int update_select_registers(struct kbase_device *kbdev)
223 {
224 	u64 select_config[KBASE_IPA_CORE_TYPE_NUM];
225 
226 	lockdep_assert_held(&kbdev->csf.ipa_control.lock);
227 
228 	build_select_config(&kbdev->csf.ipa_control, select_config);
229 
230 	return apply_select_config(kbdev, select_config);
231 }
232 
calc_prfcnt_delta(struct kbase_device * kbdev,struct kbase_ipa_control_prfcnt * prfcnt,bool gpu_ready)233 static inline void calc_prfcnt_delta(struct kbase_device *kbdev,
234 				     struct kbase_ipa_control_prfcnt *prfcnt,
235 				     bool gpu_ready)
236 {
237 	u64 delta_value, raw_value;
238 
239 	if (gpu_ready)
240 		raw_value = read_value_cnt(kbdev, (u8)prfcnt->type,
241 					   prfcnt->select_idx);
242 	else
243 		raw_value = prfcnt->latest_raw_value;
244 
245 	if (raw_value < prfcnt->latest_raw_value) {
246 		delta_value = (MAX_PRFCNT_VALUE - prfcnt->latest_raw_value) +
247 			      raw_value;
248 	} else {
249 		delta_value = raw_value - prfcnt->latest_raw_value;
250 	}
251 
252 	delta_value *= prfcnt->scaling_factor;
253 
254 	if (kbdev->csf.ipa_control.cur_gpu_rate == 0) {
255 		static bool warned;
256 
257 		if (!warned) {
258 			dev_warn(kbdev->dev, "%s: GPU freq is unexpectedly 0", __func__);
259 			warned = true;
260 		}
261 	} else if (prfcnt->gpu_norm)
262 		delta_value = div_u64(delta_value, kbdev->csf.ipa_control.cur_gpu_rate);
263 
264 	prfcnt->latest_raw_value = raw_value;
265 
266 	/* Accumulate the difference */
267 	prfcnt->accumulated_diff += delta_value;
268 }
269 
270 /**
271  * kbase_ipa_control_rate_change_notify - GPU frequency change callback
272  *
273  * @listener:     Clock frequency change listener.
274  * @clk_index:    Index of the clock for which the change has occurred.
275  * @clk_rate_hz:  Clock frequency(Hz).
276  *
277  * This callback notifies kbase_ipa_control about GPU frequency changes.
278  * Only top-level clock changes are meaningful. GPU frequency updates
279  * affect all performance counters which require GPU normalization
280  * in every session.
281  */
282 static void
kbase_ipa_control_rate_change_notify(struct kbase_clk_rate_listener * listener,u32 clk_index,u32 clk_rate_hz)283 kbase_ipa_control_rate_change_notify(struct kbase_clk_rate_listener *listener,
284 				     u32 clk_index, u32 clk_rate_hz)
285 {
286 	if ((clk_index == KBASE_CLOCK_DOMAIN_TOP) && (clk_rate_hz != 0)) {
287 		size_t i;
288 		unsigned long flags;
289 		struct kbase_ipa_control_listener_data *listener_data =
290 			container_of(listener,
291 				     struct kbase_ipa_control_listener_data,
292 				     listener);
293 		struct kbase_device *kbdev = listener_data->kbdev;
294 		struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
295 
296 		spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
297 
298 		if (!kbdev->pm.backend.gpu_ready) {
299 			dev_err(kbdev->dev,
300 				"%s: GPU frequency cannot change while GPU is off",
301 				__func__);
302 			spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
303 			return;
304 		}
305 
306 		/* Interrupts are already disabled and interrupt state is also saved */
307 		spin_lock(&ipa_ctrl->lock);
308 
309 		for (i = 0; i < KBASE_IPA_CONTROL_MAX_SESSIONS; i++) {
310 			struct kbase_ipa_control_session *session = &ipa_ctrl->sessions[i];
311 
312 			if (session->active) {
313 				size_t j;
314 
315 				for (j = 0; j < session->num_prfcnts; j++) {
316 					struct kbase_ipa_control_prfcnt *prfcnt =
317 						&session->prfcnts[j];
318 
319 					if (prfcnt->gpu_norm)
320 						calc_prfcnt_delta(kbdev, prfcnt, true);
321 				}
322 			}
323 		}
324 
325 		ipa_ctrl->cur_gpu_rate = clk_rate_hz;
326 
327 		/* Update the timer for automatic sampling if active sessions
328 		 * are present. Counters have already been manually sampled.
329 		 */
330 		if (ipa_ctrl->num_active_sessions > 0) {
331 			kbase_reg_write(kbdev, IPA_CONTROL_REG(TIMER),
332 					timer_value(ipa_ctrl->cur_gpu_rate));
333 		}
334 
335 		spin_unlock(&ipa_ctrl->lock);
336 
337 		spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
338 	}
339 }
340 
kbase_ipa_control_init(struct kbase_device * kbdev)341 void kbase_ipa_control_init(struct kbase_device *kbdev)
342 {
343 	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
344 	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
345 	struct kbase_ipa_control_listener_data *listener_data;
346 	size_t i, j;
347 
348 	for (i = 0; i < KBASE_IPA_CORE_TYPE_NUM; i++) {
349 		for (j = 0; j < KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS; j++) {
350 			ipa_ctrl->blocks[i].select[j].idx = 0;
351 			ipa_ctrl->blocks[i].select[j].refcount = 0;
352 		}
353 		ipa_ctrl->blocks[i].num_available_counters =
354 			KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS;
355 	}
356 
357 	spin_lock_init(&ipa_ctrl->lock);
358 	ipa_ctrl->num_active_sessions = 0;
359 	for (i = 0; i < KBASE_IPA_CONTROL_MAX_SESSIONS; i++) {
360 		ipa_ctrl->sessions[i].active = false;
361 	}
362 
363 	listener_data = kmalloc(sizeof(struct kbase_ipa_control_listener_data),
364 				GFP_KERNEL);
365 	if (listener_data) {
366 		listener_data->listener.notify =
367 			kbase_ipa_control_rate_change_notify;
368 		listener_data->kbdev = kbdev;
369 		ipa_ctrl->rtm_listener_data = listener_data;
370 	}
371 
372 	spin_lock(&clk_rtm->lock);
373 	if (clk_rtm->clks[KBASE_CLOCK_DOMAIN_TOP])
374 		ipa_ctrl->cur_gpu_rate =
375 			clk_rtm->clks[KBASE_CLOCK_DOMAIN_TOP]->clock_val;
376 	if (listener_data)
377 		kbase_clk_rate_trace_manager_subscribe_no_lock(
378 			clk_rtm, &listener_data->listener);
379 	spin_unlock(&clk_rtm->lock);
380 }
381 KBASE_EXPORT_TEST_API(kbase_ipa_control_init);
382 
kbase_ipa_control_term(struct kbase_device * kbdev)383 void kbase_ipa_control_term(struct kbase_device *kbdev)
384 {
385 	unsigned long flags;
386 	struct kbase_clk_rate_trace_manager *clk_rtm = &kbdev->pm.clk_rtm;
387 	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
388 	struct kbase_ipa_control_listener_data *listener_data =
389 		ipa_ctrl->rtm_listener_data;
390 
391 	WARN_ON(ipa_ctrl->num_active_sessions);
392 
393 	if (listener_data)
394 		kbase_clk_rate_trace_manager_unsubscribe(clk_rtm, &listener_data->listener);
395 	kfree(ipa_ctrl->rtm_listener_data);
396 
397 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
398 	if (kbdev->pm.backend.gpu_powered)
399 		kbase_reg_write(kbdev, IPA_CONTROL_REG(TIMER), 0);
400 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
401 }
402 KBASE_EXPORT_TEST_API(kbase_ipa_control_term);
403 
404 /** session_read_raw_values - Read latest raw values for a sessions
405  * @kbdev:   Pointer to kbase device.
406  * @session: Pointer to the session whose performance counters shall be read.
407  *
408  * Read and update the latest raw values of all the performance counters
409  * belonging to a given session.
410  */
session_read_raw_values(struct kbase_device * kbdev,struct kbase_ipa_control_session * session)411 static void session_read_raw_values(struct kbase_device *kbdev,
412 				    struct kbase_ipa_control_session *session)
413 {
414 	size_t i;
415 
416 	lockdep_assert_held(&kbdev->csf.ipa_control.lock);
417 
418 	for (i = 0; i < session->num_prfcnts; i++) {
419 		struct kbase_ipa_control_prfcnt *prfcnt = &session->prfcnts[i];
420 		u64 raw_value = read_value_cnt(kbdev, (u8)prfcnt->type,
421 					       prfcnt->select_idx);
422 
423 		prfcnt->latest_raw_value = raw_value;
424 	}
425 }
426 
427 /** session_gpu_start - Start one or all sessions
428  * @kbdev:     Pointer to kbase device.
429  * @ipa_ctrl:  Pointer to IPA_CONTROL descriptor.
430  * @session:   Pointer to the session to initialize, or NULL to initialize
431  *             all sessions.
432  *
433  * This function starts one or all sessions by capturing a manual sample,
434  * reading the latest raw value of performance counters and possibly enabling
435  * the timer for automatic sampling if necessary.
436  *
437  * If a single session is given, it is assumed to be active, regardless of
438  * the number of active sessions. The number of performance counters belonging
439  * to the session shall be set in advance.
440  *
441  * If no session is given, the function shall start all sessions.
442  * The function does nothing if there are no active sessions.
443  *
444  * Return: 0 on success, or error code on failure.
445  */
session_gpu_start(struct kbase_device * kbdev,struct kbase_ipa_control * ipa_ctrl,struct kbase_ipa_control_session * session)446 static int session_gpu_start(struct kbase_device *kbdev,
447 			     struct kbase_ipa_control *ipa_ctrl,
448 			     struct kbase_ipa_control_session *session)
449 {
450 	bool first_start =
451 		(session != NULL) && (ipa_ctrl->num_active_sessions == 0);
452 	int ret = 0;
453 
454 	lockdep_assert_held(&kbdev->csf.ipa_control.lock);
455 
456 	/*
457 	 * Exit immediately if the caller intends to start all sessions
458 	 * but there are no active sessions. It's important that no operation
459 	 * is done on the IPA_CONTROL interface in that case.
460 	 */
461 	if (!session && ipa_ctrl->num_active_sessions == 0)
462 		return ret;
463 
464 	/*
465 	 * Take a manual sample unconditionally if the caller intends
466 	 * to start all sessions. Otherwise, only take a manual sample
467 	 * if this is the first session to be initialized, for accumulator
468 	 * registers are empty and no timer has been configured for automatic
469 	 * sampling.
470 	 */
471 	if (!session || first_start) {
472 		kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND),
473 				COMMAND_SAMPLE);
474 		ret = wait_status(kbdev, STATUS_COMMAND_ACTIVE);
475 		if (ret)
476 			dev_err(kbdev->dev, "%s: failed to sample new counters",
477 				__func__);
478 		kbase_reg_write(kbdev, IPA_CONTROL_REG(TIMER),
479 				timer_value(ipa_ctrl->cur_gpu_rate));
480 	}
481 
482 	/*
483 	 * Read current raw value to start the session.
484 	 * This is necessary to put the first query in condition
485 	 * to generate a correct value by calculating the difference
486 	 * from the beginning of the session. This consideration
487 	 * is true regardless of the number of sessions the caller
488 	 * intends to start.
489 	 */
490 	if (!ret) {
491 		if (session) {
492 			/* On starting a session, value read is required for
493 			 * IPA power model's calculation initialization.
494 			 */
495 			session_read_raw_values(kbdev, session);
496 		} else {
497 			size_t session_idx;
498 
499 			for (session_idx = 0;
500 			     session_idx < KBASE_IPA_CONTROL_MAX_SESSIONS;
501 			     session_idx++) {
502 				struct kbase_ipa_control_session *session_to_check = &ipa_ctrl->sessions[session_idx];
503 
504 				if (session_to_check->active)
505 					session_read_raw_values(kbdev, session_to_check);
506 			}
507 		}
508 	}
509 
510 	return ret;
511 }
512 
kbase_ipa_control_register(struct kbase_device * kbdev,const struct kbase_ipa_control_perf_counter * perf_counters,size_t num_counters,void ** client)513 int kbase_ipa_control_register(
514 	struct kbase_device *kbdev,
515 	const struct kbase_ipa_control_perf_counter *perf_counters,
516 	size_t num_counters, void **client)
517 {
518 	int ret = 0;
519 	size_t i, session_idx, req_counters[KBASE_IPA_CORE_TYPE_NUM];
520 	bool already_configured[KBASE_IPA_CONTROL_MAX_COUNTERS];
521 	bool new_config = false;
522 	struct kbase_ipa_control *ipa_ctrl;
523 	struct kbase_ipa_control_session *session = NULL;
524 	unsigned long flags;
525 
526 	if (WARN_ON(kbdev == NULL) || WARN_ON(perf_counters == NULL) ||
527 	    WARN_ON(client == NULL) ||
528 	    WARN_ON(num_counters > KBASE_IPA_CONTROL_MAX_COUNTERS)) {
529 		dev_err(kbdev->dev, "%s: wrong input arguments", __func__);
530 		return -EINVAL;
531 	}
532 
533 	kbase_pm_context_active(kbdev);
534 
535 	ipa_ctrl = &kbdev->csf.ipa_control;
536 	spin_lock_irqsave(&ipa_ctrl->lock, flags);
537 
538 	if (ipa_ctrl->num_active_sessions == KBASE_IPA_CONTROL_MAX_SESSIONS) {
539 		dev_err(kbdev->dev, "%s: too many sessions", __func__);
540 		ret = -EBUSY;
541 		goto exit;
542 	}
543 
544 	for (i = 0; i < KBASE_IPA_CORE_TYPE_NUM; i++)
545 		req_counters[i] = 0;
546 
547 	/*
548 	 * Count how many counters would need to be configured in order to
549 	 * satisfy the request. Requested counters which happen to be already
550 	 * configured can be skipped.
551 	 */
552 	for (i = 0; i < num_counters; i++) {
553 		size_t j;
554 		enum kbase_ipa_core_type type = perf_counters[i].type;
555 		u8 idx = perf_counters[i].idx;
556 
557 		if ((type >= KBASE_IPA_CORE_TYPE_NUM) ||
558 		    (idx >= KBASE_IPA_CONTROL_CNT_MAX_IDX)) {
559 			dev_err(kbdev->dev,
560 				"%s: invalid requested type %u and/or index %u",
561 				__func__, type, idx);
562 			ret = -EINVAL;
563 			goto exit;
564 		}
565 
566 		for (j = 0; j < KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS; j++) {
567 			struct kbase_ipa_control_prfcnt_config *prfcnt_config =
568 				&ipa_ctrl->blocks[type].select[j];
569 
570 			if (prfcnt_config->refcount > 0) {
571 				if (prfcnt_config->idx == idx) {
572 					already_configured[i] = true;
573 					break;
574 				}
575 			}
576 		}
577 
578 		if (j == KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS) {
579 			already_configured[i] = false;
580 			req_counters[type]++;
581 			new_config = true;
582 		}
583 	}
584 
585 	for (i = 0; i < KBASE_IPA_CORE_TYPE_NUM; i++)
586 		if (req_counters[i] >
587 		    ipa_ctrl->blocks[i].num_available_counters) {
588 			dev_err(kbdev->dev,
589 				"%s: more counters (%zu) than available (%zu) have been requested for type %zu",
590 				__func__, req_counters[i],
591 				ipa_ctrl->blocks[i].num_available_counters, i);
592 			ret = -EINVAL;
593 			goto exit;
594 		}
595 
596 	/*
597 	 * The request has been validated.
598 	 * Firstly, find an available session and then set up the initial state
599 	 * of the session and update the configuration of performance counters
600 	 * in the internal state of kbase_ipa_control.
601 	 */
602 	for (session_idx = 0; session_idx < KBASE_IPA_CONTROL_MAX_SESSIONS;
603 	     session_idx++) {
604 		session = &ipa_ctrl->sessions[session_idx];
605 		if (!session->active)
606 			break;
607 	}
608 
609 	if (!session) {
610 		dev_err(kbdev->dev, "%s: wrong or corrupt session state",
611 			__func__);
612 		ret = -EBUSY;
613 		goto exit;
614 	}
615 
616 	for (i = 0; i < num_counters; i++) {
617 		struct kbase_ipa_control_prfcnt_config *prfcnt_config;
618 		size_t j;
619 		u8 type = perf_counters[i].type;
620 		u8 idx = perf_counters[i].idx;
621 
622 		for (j = 0; j < KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS; j++) {
623 			prfcnt_config = &ipa_ctrl->blocks[type].select[j];
624 
625 			if (already_configured[i]) {
626 				if ((prfcnt_config->refcount > 0) &&
627 				    (prfcnt_config->idx == idx)) {
628 					break;
629 				}
630 			} else {
631 				if (prfcnt_config->refcount == 0)
632 					break;
633 			}
634 		}
635 
636 		if (WARN_ON((prfcnt_config->refcount > 0 &&
637 			     prfcnt_config->idx != idx) ||
638 			    (j == KBASE_IPA_CONTROL_NUM_BLOCK_COUNTERS))) {
639 			dev_err(kbdev->dev,
640 				"%s: invalid internal state: counter already configured or no counter available to configure",
641 				__func__);
642 			ret = -EBUSY;
643 			goto exit;
644 		}
645 
646 		if (prfcnt_config->refcount == 0) {
647 			prfcnt_config->idx = idx;
648 			ipa_ctrl->blocks[type].num_available_counters--;
649 		}
650 
651 		session->prfcnts[i].accumulated_diff = 0;
652 		session->prfcnts[i].type = type;
653 		session->prfcnts[i].select_idx = j;
654 		session->prfcnts[i].scaling_factor =
655 			perf_counters[i].scaling_factor;
656 		session->prfcnts[i].gpu_norm = perf_counters[i].gpu_norm;
657 
658 		/* Reports to this client for GPU time spent in protected mode
659 		 * should begin from the point of registration.
660 		 */
661 		session->last_query_time = ktime_get_ns();
662 
663 		/* Initially, no time has been spent in protected mode */
664 		session->protm_time = 0;
665 
666 		prfcnt_config->refcount++;
667 	}
668 
669 	/*
670 	 * Apply new configuration, if necessary.
671 	 * As a temporary solution, make sure that the GPU is on
672 	 * before applying the new configuration.
673 	 */
674 	if (new_config) {
675 		ret = update_select_registers(kbdev);
676 		if (ret)
677 			dev_err(kbdev->dev,
678 				"%s: failed to apply new SELECT configuration",
679 				__func__);
680 	}
681 
682 	if (!ret) {
683 		session->num_prfcnts = num_counters;
684 		ret = session_gpu_start(kbdev, ipa_ctrl, session);
685 	}
686 
687 	if (!ret) {
688 		session->active = true;
689 		ipa_ctrl->num_active_sessions++;
690 		*client = session;
691 	}
692 
693 exit:
694 	spin_unlock_irqrestore(&ipa_ctrl->lock, flags);
695 	kbase_pm_context_idle(kbdev);
696 	return ret;
697 }
698 KBASE_EXPORT_TEST_API(kbase_ipa_control_register);
699 
kbase_ipa_control_unregister(struct kbase_device * kbdev,const void * client)700 int kbase_ipa_control_unregister(struct kbase_device *kbdev, const void *client)
701 {
702 	struct kbase_ipa_control *ipa_ctrl;
703 	struct kbase_ipa_control_session *session;
704 	int ret = 0;
705 	size_t i;
706 	unsigned long flags;
707 	bool new_config = false, valid_session = false;
708 
709 	if (WARN_ON(kbdev == NULL) || WARN_ON(client == NULL)) {
710 		dev_err(kbdev->dev, "%s: wrong input arguments", __func__);
711 		return -EINVAL;
712 	}
713 
714 	kbase_pm_context_active(kbdev);
715 
716 	ipa_ctrl = &kbdev->csf.ipa_control;
717 	session = (struct kbase_ipa_control_session *)client;
718 
719 	spin_lock_irqsave(&ipa_ctrl->lock, flags);
720 
721 	for (i = 0; i < KBASE_IPA_CONTROL_MAX_SESSIONS; i++) {
722 		if (session == &ipa_ctrl->sessions[i]) {
723 			valid_session = true;
724 			break;
725 		}
726 	}
727 
728 	if (!valid_session) {
729 		dev_err(kbdev->dev, "%s: invalid session handle", __func__);
730 		ret = -EINVAL;
731 		goto exit;
732 	}
733 
734 	if (ipa_ctrl->num_active_sessions == 0) {
735 		dev_err(kbdev->dev, "%s: no active sessions found", __func__);
736 		ret = -EINVAL;
737 		goto exit;
738 	}
739 
740 	if (!session->active) {
741 		dev_err(kbdev->dev, "%s: session is already inactive",
742 			__func__);
743 		ret = -EINVAL;
744 		goto exit;
745 	}
746 
747 	for (i = 0; i < session->num_prfcnts; i++) {
748 		struct kbase_ipa_control_prfcnt_config *prfcnt_config;
749 		u8 type = session->prfcnts[i].type;
750 		u8 idx = session->prfcnts[i].select_idx;
751 
752 		prfcnt_config = &ipa_ctrl->blocks[type].select[idx];
753 
754 		if (!WARN_ON(prfcnt_config->refcount == 0)) {
755 			prfcnt_config->refcount--;
756 			if (prfcnt_config->refcount == 0) {
757 				new_config = true;
758 				ipa_ctrl->blocks[type].num_available_counters++;
759 			}
760 		}
761 	}
762 
763 	if (new_config) {
764 		ret = update_select_registers(kbdev);
765 		if (ret)
766 			dev_err(kbdev->dev,
767 				"%s: failed to apply SELECT configuration",
768 				__func__);
769 	}
770 
771 	session->num_prfcnts = 0;
772 	session->active = false;
773 	ipa_ctrl->num_active_sessions--;
774 
775 exit:
776 	spin_unlock_irqrestore(&ipa_ctrl->lock, flags);
777 	kbase_pm_context_idle(kbdev);
778 	return ret;
779 }
780 KBASE_EXPORT_TEST_API(kbase_ipa_control_unregister);
781 
kbase_ipa_control_query(struct kbase_device * kbdev,const void * client,u64 * values,size_t num_values,u64 * protected_time)782 int kbase_ipa_control_query(struct kbase_device *kbdev, const void *client,
783 			    u64 *values, size_t num_values, u64 *protected_time)
784 {
785 	struct kbase_ipa_control *ipa_ctrl;
786 	struct kbase_ipa_control_session *session;
787 	size_t i;
788 	unsigned long flags;
789 	bool gpu_ready;
790 
791 	if (WARN_ON(kbdev == NULL) || WARN_ON(client == NULL) ||
792 	    WARN_ON(values == NULL)) {
793 		dev_err(kbdev->dev, "%s: wrong input arguments", __func__);
794 		return -EINVAL;
795 	}
796 
797 	ipa_ctrl = &kbdev->csf.ipa_control;
798 	session = (struct kbase_ipa_control_session *)client;
799 
800 	if (!session->active) {
801 		dev_err(kbdev->dev,
802 			"%s: attempt to query inactive session", __func__);
803 		return -EINVAL;
804 	}
805 
806 	if (WARN_ON(num_values < session->num_prfcnts)) {
807 		dev_err(kbdev->dev,
808 			"%s: not enough space (%zu) to return all counter values (%zu)",
809 			__func__, num_values, session->num_prfcnts);
810 		return -EINVAL;
811 	}
812 
813 	spin_lock_irqsave(&kbdev->hwaccess_lock, flags);
814 	gpu_ready = kbdev->pm.backend.gpu_ready;
815 
816 	for (i = 0; i < session->num_prfcnts; i++) {
817 		struct kbase_ipa_control_prfcnt *prfcnt = &session->prfcnts[i];
818 
819 		calc_prfcnt_delta(kbdev, prfcnt, gpu_ready);
820 		/* Return all the accumulated difference */
821 		values[i] = prfcnt->accumulated_diff;
822 		prfcnt->accumulated_diff = 0;
823 	}
824 
825 	if (protected_time) {
826 		u64 time_now = ktime_get_ns();
827 
828 		/* This is the amount of protected-mode time spent prior to
829 		 * the current protm period.
830 		 */
831 		*protected_time = session->protm_time;
832 
833 		if (kbdev->protected_mode) {
834 			*protected_time +=
835 				time_now - MAX(session->last_query_time,
836 					       ipa_ctrl->protm_start);
837 		}
838 		session->last_query_time = time_now;
839 		session->protm_time = 0;
840 	}
841 
842 	spin_unlock_irqrestore(&kbdev->hwaccess_lock, flags);
843 
844 	for (i = session->num_prfcnts; i < num_values; i++)
845 		values[i] = 0;
846 
847 	return 0;
848 }
849 KBASE_EXPORT_TEST_API(kbase_ipa_control_query);
850 
kbase_ipa_control_handle_gpu_power_off(struct kbase_device * kbdev)851 void kbase_ipa_control_handle_gpu_power_off(struct kbase_device *kbdev)
852 {
853 	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
854 	size_t session_idx;
855 	int ret;
856 
857 	lockdep_assert_held(&kbdev->hwaccess_lock);
858 
859 	/* GPU should still be ready for use when this function gets called */
860 	WARN_ON(!kbdev->pm.backend.gpu_ready);
861 
862 	/* Interrupts are already disabled and interrupt state is also saved */
863 	spin_lock(&ipa_ctrl->lock);
864 
865 	/* First disable the automatic sampling through TIMER  */
866 	kbase_reg_write(kbdev, IPA_CONTROL_REG(TIMER), 0);
867 	ret = wait_status(kbdev, STATUS_TIMER_ENABLED);
868 	if (ret) {
869 		dev_err(kbdev->dev,
870 			"Wait for disabling of IPA control timer failed: %d",
871 			ret);
872 	}
873 
874 	/* Now issue the manual SAMPLE command */
875 	kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND), COMMAND_SAMPLE);
876 	ret = wait_status(kbdev, STATUS_COMMAND_ACTIVE);
877 	if (ret) {
878 		dev_err(kbdev->dev,
879 			"Wait for the completion of manual sample failed: %d",
880 			ret);
881 	}
882 
883 	for (session_idx = 0; session_idx < KBASE_IPA_CONTROL_MAX_SESSIONS;
884 	     session_idx++) {
885 
886 		struct kbase_ipa_control_session *session =
887 			&ipa_ctrl->sessions[session_idx];
888 
889 		if (session->active) {
890 			size_t i;
891 
892 			for (i = 0; i < session->num_prfcnts; i++) {
893 				struct kbase_ipa_control_prfcnt *prfcnt =
894 					&session->prfcnts[i];
895 
896 				calc_prfcnt_delta(kbdev, prfcnt, true);
897 			}
898 		}
899 	}
900 	spin_unlock(&ipa_ctrl->lock);
901 }
902 
kbase_ipa_control_handle_gpu_power_on(struct kbase_device * kbdev)903 void kbase_ipa_control_handle_gpu_power_on(struct kbase_device *kbdev)
904 {
905 	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
906 	int ret;
907 
908 	lockdep_assert_held(&kbdev->hwaccess_lock);
909 
910 	/* GPU should have become ready for use when this function gets called */
911 	WARN_ON(!kbdev->pm.backend.gpu_ready);
912 
913 	/* Interrupts are already disabled and interrupt state is also saved */
914 	spin_lock(&ipa_ctrl->lock);
915 
916 	ret = update_select_registers(kbdev);
917 	if (ret) {
918 		dev_err(kbdev->dev,
919 			"Failed to reconfigure the select registers: %d", ret);
920 	}
921 
922 	/* Accumulator registers would not contain any sample after GPU power
923 	 * cycle if the timer has not been enabled first. Initialize all sessions.
924 	 */
925 	ret = session_gpu_start(kbdev, ipa_ctrl, NULL);
926 
927 	spin_unlock(&ipa_ctrl->lock);
928 }
929 
kbase_ipa_control_handle_gpu_reset_pre(struct kbase_device * kbdev)930 void kbase_ipa_control_handle_gpu_reset_pre(struct kbase_device *kbdev)
931 {
932 	/* A soft reset is treated as a power down */
933 	kbase_ipa_control_handle_gpu_power_off(kbdev);
934 }
935 KBASE_EXPORT_TEST_API(kbase_ipa_control_handle_gpu_reset_pre);
936 
kbase_ipa_control_handle_gpu_reset_post(struct kbase_device * kbdev)937 void kbase_ipa_control_handle_gpu_reset_post(struct kbase_device *kbdev)
938 {
939 	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
940 	int ret;
941 	u32 status;
942 
943 	lockdep_assert_held(&kbdev->hwaccess_lock);
944 
945 	/* GPU should have become ready for use when this function gets called */
946 	WARN_ON(!kbdev->pm.backend.gpu_ready);
947 
948 	/* Interrupts are already disabled and interrupt state is also saved */
949 	spin_lock(&ipa_ctrl->lock);
950 
951 	/* Check the status reset bit is set before acknowledging it */
952 	status = kbase_reg_read(kbdev, IPA_CONTROL_REG(STATUS));
953 	if (status & STATUS_RESET) {
954 		/* Acknowledge the reset command */
955 		kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND), COMMAND_RESET_ACK);
956 		ret = wait_status(kbdev, STATUS_RESET);
957 		if (ret) {
958 			dev_err(kbdev->dev,
959 				"Wait for the reset ack command failed: %d",
960 				ret);
961 		}
962 	}
963 
964 	spin_unlock(&ipa_ctrl->lock);
965 
966 	kbase_ipa_control_handle_gpu_power_on(kbdev);
967 }
968 KBASE_EXPORT_TEST_API(kbase_ipa_control_handle_gpu_reset_post);
969 
970 #if MALI_UNIT_TEST
kbase_ipa_control_rate_change_notify_test(struct kbase_device * kbdev,u32 clk_index,u32 clk_rate_hz)971 void kbase_ipa_control_rate_change_notify_test(struct kbase_device *kbdev,
972 					       u32 clk_index, u32 clk_rate_hz)
973 {
974 	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
975 	struct kbase_ipa_control_listener_data *listener_data =
976 		ipa_ctrl->rtm_listener_data;
977 
978 	kbase_ipa_control_rate_change_notify(&listener_data->listener,
979 					     clk_index, clk_rate_hz);
980 }
981 KBASE_EXPORT_TEST_API(kbase_ipa_control_rate_change_notify_test);
982 #endif
983 
kbase_ipa_control_protm_entered(struct kbase_device * kbdev)984 void kbase_ipa_control_protm_entered(struct kbase_device *kbdev)
985 {
986 	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
987 
988 	lockdep_assert_held(&kbdev->hwaccess_lock);
989 	ipa_ctrl->protm_start = ktime_get_ns();
990 }
991 
kbase_ipa_control_protm_exited(struct kbase_device * kbdev)992 void kbase_ipa_control_protm_exited(struct kbase_device *kbdev)
993 {
994 	struct kbase_ipa_control *ipa_ctrl = &kbdev->csf.ipa_control;
995 	size_t i;
996 	u64 time_now = ktime_get_ns();
997 	u32 status;
998 
999 	lockdep_assert_held(&kbdev->hwaccess_lock);
1000 
1001 	for (i = 0; i < KBASE_IPA_CONTROL_MAX_SESSIONS; i++) {
1002 
1003 		struct kbase_ipa_control_session *session =
1004 			&ipa_ctrl->sessions[i];
1005 
1006 		if (session->active) {
1007 			u64 protm_time = time_now - MAX(session->last_query_time,
1008 							ipa_ctrl->protm_start);
1009 
1010 			session->protm_time += protm_time;
1011 		}
1012 	}
1013 
1014 	/* Acknowledge the protected_mode bit in the IPA_CONTROL STATUS
1015 	 * register
1016 	 */
1017 	status = kbase_reg_read(kbdev, IPA_CONTROL_REG(STATUS));
1018 	if (status & STATUS_PROTECTED_MODE) {
1019 		int ret;
1020 
1021 		/* Acknowledge the protm command */
1022 		kbase_reg_write(kbdev, IPA_CONTROL_REG(COMMAND),
1023 				COMMAND_PROTECTED_ACK);
1024 		ret = wait_status(kbdev, STATUS_PROTECTED_MODE);
1025 		if (ret) {
1026 			dev_err(kbdev->dev,
1027 				"Wait for the protm ack command failed: %d",
1028 				ret);
1029 		}
1030 	}
1031 }
1032 
1033