xref: /OK3568_Linux_fs/kernel/drivers/gpu/arm/midgard/ipa/mali_kbase_ipa.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  *
3  * (C) COPYRIGHT 2016-2017 ARM Limited. All rights reserved.
4  *
5  * This program is free software and is provided to you under the terms of the
6  * GNU General Public License version 2 as published by the Free Software
7  * Foundation, and any use by you of this program is subject to the terms
8  * of such GNU licence.
9  *
10  * A copy of the licence is included with the program, and can also be obtained
11  * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12  * Boston, MA  02110-1301, USA.
13  *
14  */
15 
16 
17 #include <linux/thermal.h>
18 #include <linux/devfreq_cooling.h>
19 #include <linux/of.h>
20 #include "mali_kbase.h"
21 #include "mali_kbase_ipa.h"
22 #include "mali_kbase_ipa_debugfs.h"
23 
24 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0))
25 #include <linux/pm_opp.h>
26 #else
27 #include <linux/opp.h>
28 #define dev_pm_opp_find_freq_exact opp_find_freq_exact
29 #define dev_pm_opp_get_voltage opp_get_voltage
30 #define dev_pm_opp opp
31 #endif
32 #include <linux/math64.h>
33 
34 #define KBASE_IPA_FALLBACK_MODEL_NAME "mali-simple-power-model"
35 
36 static struct kbase_ipa_model_ops *kbase_ipa_all_model_ops[] = {
37 	&kbase_simple_ipa_model_ops,
38 };
39 
kbase_ipa_model_recalculate(struct kbase_ipa_model * model)40 int kbase_ipa_model_recalculate(struct kbase_ipa_model *model)
41 {
42 	int err = 0;
43 
44 	lockdep_assert_held(&model->kbdev->ipa.lock);
45 
46 	if (model->ops->recalculate) {
47 		err = model->ops->recalculate(model);
48 		if (err) {
49 			dev_err(model->kbdev->dev,
50 				"recalculation of power model %s returned error %d\n",
51 				model->ops->name, err);
52 		}
53 	}
54 
55 	return err;
56 }
57 
kbase_ipa_model_ops_find(struct kbase_device * kbdev,const char * name)58 static struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device *kbdev,
59 							    const char *name)
60 {
61 	int i;
62 
63 	for (i = 0; i < ARRAY_SIZE(kbase_ipa_all_model_ops); ++i) {
64 		struct kbase_ipa_model_ops *ops = kbase_ipa_all_model_ops[i];
65 
66 		if (!strcmp(ops->name, name))
67 			return ops;
68 	}
69 
70 	dev_err(kbdev->dev, "power model \'%s\' not found\n", name);
71 
72 	return NULL;
73 }
74 
kbase_ipa_model_use_fallback_locked(struct kbase_device * kbdev)75 void kbase_ipa_model_use_fallback_locked(struct kbase_device *kbdev)
76 {
77 	atomic_set(&kbdev->ipa_use_configured_model, false);
78 }
79 
kbase_ipa_model_use_configured_locked(struct kbase_device * kbdev)80 void kbase_ipa_model_use_configured_locked(struct kbase_device *kbdev)
81 {
82 	atomic_set(&kbdev->ipa_use_configured_model, true);
83 }
84 
kbase_ipa_model_name_from_id(u32 gpu_id)85 const char *kbase_ipa_model_name_from_id(u32 gpu_id)
86 {
87 	const u32 prod_id = (gpu_id & GPU_ID_VERSION_PRODUCT_ID) >>
88 			GPU_ID_VERSION_PRODUCT_ID_SHIFT;
89 
90 	if (GPU_ID_IS_NEW_FORMAT(prod_id)) {
91 		switch (GPU_ID2_MODEL_MATCH_VALUE(prod_id)) {
92 		case GPU_ID2_PRODUCT_TMIX:
93 			return KBASE_IPA_FALLBACK_MODEL_NAME;
94 		default:
95 			return KBASE_IPA_FALLBACK_MODEL_NAME;
96 		}
97 	}
98 
99 	return KBASE_IPA_FALLBACK_MODEL_NAME;
100 }
101 
get_model_dt_node(struct kbase_ipa_model * model)102 static struct device_node *get_model_dt_node(struct kbase_ipa_model *model)
103 {
104 	struct device_node *model_dt_node;
105 	char compat_string[64];
106 
107 	snprintf(compat_string, sizeof(compat_string), "arm,%s",
108 		 model->ops->name);
109 
110 	model_dt_node = of_find_compatible_node(model->kbdev->dev->of_node,
111 						NULL, compat_string);
112 	if (!model_dt_node && !model->missing_dt_node_warning) {
113 		dev_warn(model->kbdev->dev,
114 			 "Couldn't find power_model DT node matching \'%s\'\n",
115 			 compat_string);
116 		model->missing_dt_node_warning = true;
117 	}
118 
119 	return model_dt_node;
120 }
121 
kbase_ipa_model_add_param_s32(struct kbase_ipa_model * model,const char * name,s32 * addr,size_t num_elems,bool dt_required)122 int kbase_ipa_model_add_param_s32(struct kbase_ipa_model *model,
123 				  const char *name, s32 *addr,
124 				  size_t num_elems, bool dt_required)
125 {
126 	int err, i;
127 	struct device_node *model_dt_node = get_model_dt_node(model);
128 	char *origin;
129 
130 	err = of_property_read_u32_array(model_dt_node, name, addr, num_elems);
131 
132 	if (err && dt_required) {
133 		memset(addr, 0, sizeof(s32) * num_elems);
134 		dev_warn(model->kbdev->dev,
135 			 "Error %d, no DT entry: %s.%s = %zu*[0]\n",
136 			 err, model->ops->name, name, num_elems);
137 		origin = "zero";
138 	} else if (err && !dt_required) {
139 		origin = "default";
140 	} else /* !err */ {
141 		origin = "DT";
142 	}
143 
144 	/* Create a unique debugfs entry for each element */
145 	for (i = 0; i < num_elems; ++i) {
146 		char elem_name[32];
147 
148 		if (num_elems == 1)
149 			snprintf(elem_name, sizeof(elem_name), "%s", name);
150 		else
151 			snprintf(elem_name, sizeof(elem_name), "%s.%d",
152 				name, i);
153 
154 		dev_dbg(model->kbdev->dev, "%s.%s = %d (%s)\n",
155 			model->ops->name, elem_name, addr[i], origin);
156 
157 		err = kbase_ipa_model_param_add(model, elem_name,
158 						&addr[i], sizeof(s32),
159 						PARAM_TYPE_S32);
160 		if (err)
161 			goto exit;
162 	}
163 exit:
164 	return err;
165 }
166 
kbase_ipa_model_add_param_string(struct kbase_ipa_model * model,const char * name,char * addr,size_t size,bool dt_required)167 int kbase_ipa_model_add_param_string(struct kbase_ipa_model *model,
168 				     const char *name, char *addr,
169 				     size_t size, bool dt_required)
170 {
171 	int err;
172 	struct device_node *model_dt_node = get_model_dt_node(model);
173 	const char *string_prop_value;
174 	char *origin;
175 
176 	err = of_property_read_string(model_dt_node, name,
177 				      &string_prop_value);
178 	if (err && dt_required) {
179 		strncpy(addr, "", size - 1);
180 		dev_warn(model->kbdev->dev,
181 			 "Error %d, no DT entry: %s.%s = \'%s\'\n",
182 			 err, model->ops->name, name, addr);
183 		err = 0;
184 		origin = "zero";
185 	} else if (err && !dt_required) {
186 		origin = "default";
187 	} else /* !err */ {
188 		strncpy(addr, string_prop_value, size - 1);
189 		origin = "DT";
190 	}
191 
192 	addr[size - 1] = '\0';
193 
194 	dev_dbg(model->kbdev->dev, "%s.%s = \'%s\' (%s)\n",
195 		model->ops->name, name, string_prop_value, origin);
196 
197 	err = kbase_ipa_model_param_add(model, name, addr, size,
198 					PARAM_TYPE_STRING);
199 
200 	return err;
201 }
202 
kbase_ipa_term_model(struct kbase_ipa_model * model)203 void kbase_ipa_term_model(struct kbase_ipa_model *model)
204 {
205 	if (!model)
206 		return;
207 
208 	lockdep_assert_held(&model->kbdev->ipa.lock);
209 
210 	if (model->ops->term)
211 		model->ops->term(model);
212 
213 	kbase_ipa_model_param_free_all(model);
214 
215 	kfree(model);
216 }
217 KBASE_EXPORT_TEST_API(kbase_ipa_term_model);
218 
kbase_ipa_init_model(struct kbase_device * kbdev,struct kbase_ipa_model_ops * ops)219 struct kbase_ipa_model *kbase_ipa_init_model(struct kbase_device *kbdev,
220 					     struct kbase_ipa_model_ops *ops)
221 {
222 	struct kbase_ipa_model *model;
223 	int err;
224 
225 	lockdep_assert_held(&kbdev->ipa.lock);
226 
227 	if (!ops || !ops->name)
228 		return NULL;
229 
230 	model = kzalloc(sizeof(struct kbase_ipa_model), GFP_KERNEL);
231 	if (!model)
232 		return NULL;
233 
234 	model->kbdev = kbdev;
235 	model->ops = ops;
236 	INIT_LIST_HEAD(&model->params);
237 
238 	err = model->ops->init(model);
239 	if (err) {
240 		dev_err(kbdev->dev,
241 			"init of power model \'%s\' returned error %d\n",
242 			ops->name, err);
243 		goto term_model;
244 	}
245 
246 	err = kbase_ipa_model_recalculate(model);
247 	if (err)
248 		goto term_model;
249 
250 	return model;
251 
252 term_model:
253 	kbase_ipa_term_model(model);
254 	return NULL;
255 }
256 KBASE_EXPORT_TEST_API(kbase_ipa_init_model);
257 
kbase_ipa_term_locked(struct kbase_device * kbdev)258 static void kbase_ipa_term_locked(struct kbase_device *kbdev)
259 {
260 	lockdep_assert_held(&kbdev->ipa.lock);
261 
262 	/* Clean up the models */
263 	if (kbdev->ipa.configured_model != kbdev->ipa.fallback_model)
264 		kbase_ipa_term_model(kbdev->ipa.configured_model);
265 	kbase_ipa_term_model(kbdev->ipa.fallback_model);
266 
267 	kbdev->ipa.configured_model = NULL;
268 	kbdev->ipa.fallback_model = NULL;
269 }
270 
kbase_ipa_init(struct kbase_device * kbdev)271 int kbase_ipa_init(struct kbase_device *kbdev)
272 {
273 
274 	const char *model_name;
275 	struct kbase_ipa_model_ops *ops;
276 	struct kbase_ipa_model *default_model = NULL;
277 	int err;
278 
279 	mutex_init(&kbdev->ipa.lock);
280 	/*
281 	 * Lock during init to avoid warnings from lockdep_assert_held (there
282 	 * shouldn't be any concurrent access yet).
283 	 */
284 	mutex_lock(&kbdev->ipa.lock);
285 
286 	/* The simple IPA model must *always* be present.*/
287 	ops = kbase_ipa_model_ops_find(kbdev, KBASE_IPA_FALLBACK_MODEL_NAME);
288 
289 	if (!ops->do_utilization_scaling_in_framework) {
290 		dev_err(kbdev->dev,
291 			"Fallback IPA model %s should not account for utilization\n",
292 			ops->name);
293 		err = -EINVAL;
294 		goto end;
295 	}
296 
297 	default_model = kbase_ipa_init_model(kbdev, ops);
298 	if (!default_model) {
299 		err = -EINVAL;
300 		goto end;
301 	}
302 
303 	kbdev->ipa.fallback_model = default_model;
304 	err = of_property_read_string(kbdev->dev->of_node,
305 				      "ipa-model",
306 				      &model_name);
307 	if (err) {
308 		/* Attempt to load a match from GPU-ID */
309 		u32 gpu_id;
310 
311 		gpu_id = kbdev->gpu_props.props.raw_props.gpu_id;
312 		model_name = kbase_ipa_model_name_from_id(gpu_id);
313 		dev_dbg(kbdev->dev,
314 			"Inferring model from GPU ID 0x%x: \'%s\'\n",
315 			gpu_id, model_name);
316 	} else {
317 		dev_dbg(kbdev->dev,
318 			"Using ipa-model parameter from DT: \'%s\'\n",
319 			model_name);
320 	}
321 
322 	if (strcmp(KBASE_IPA_FALLBACK_MODEL_NAME, model_name) != 0) {
323 		ops = kbase_ipa_model_ops_find(kbdev, model_name);
324 		kbdev->ipa.configured_model = kbase_ipa_init_model(kbdev, ops);
325 		if (!kbdev->ipa.configured_model) {
326 			err = -EINVAL;
327 			goto end;
328 		}
329 	} else {
330 		kbdev->ipa.configured_model = default_model;
331 		err = 0;
332 	}
333 
334 	kbase_ipa_model_use_configured_locked(kbdev);
335 
336 end:
337 	if (err)
338 		kbase_ipa_term_locked(kbdev);
339 	else
340 		dev_info(kbdev->dev,
341 			 "Using configured power model %s, and fallback %s\n",
342 			 kbdev->ipa.configured_model->ops->name,
343 			 kbdev->ipa.fallback_model->ops->name);
344 
345 	mutex_unlock(&kbdev->ipa.lock);
346 	return err;
347 }
348 KBASE_EXPORT_TEST_API(kbase_ipa_init);
349 
kbase_ipa_term(struct kbase_device * kbdev)350 void kbase_ipa_term(struct kbase_device *kbdev)
351 {
352 	mutex_lock(&kbdev->ipa.lock);
353 	kbase_ipa_term_locked(kbdev);
354 	mutex_unlock(&kbdev->ipa.lock);
355 }
356 KBASE_EXPORT_TEST_API(kbase_ipa_term);
357 
358 /**
359  * kbase_scale_dynamic_power() - Scale a dynamic power coefficient to an OPP
360  * @c:		Dynamic model coefficient, in pW/(Hz V^2). Should be in range
361  *		0 < c < 2^26 to prevent overflow.
362  * @freq:	Frequency, in Hz. Range: 2^23 < freq < 2^30 (~8MHz to ~1GHz)
363  * @voltage:	Voltage, in mV. Range: 2^9 < voltage < 2^13 (~0.5V to ~8V)
364  *
365  * Keep a record of the approximate range of each value at every stage of the
366  * calculation, to ensure we don't overflow. This makes heavy use of the
367  * approximations 1000 = 2^10 and 1000000 = 2^20, but does the actual
368  * calculations in decimal for increased accuracy.
369  *
370  * Return: Power consumption, in mW. Range: 0 < p < 2^13 (0W to ~8W)
371  */
kbase_scale_dynamic_power(const u32 c,const u32 freq,const u32 voltage)372 static u32 kbase_scale_dynamic_power(const u32 c, const u32 freq,
373 				     const u32 voltage)
374 {
375 	/* Range: 2^8 < v2 < 2^16 m(V^2) */
376 	const u32 v2 = (voltage * voltage) / 1000;
377 
378 	/* Range: 2^3 < f_MHz < 2^10 MHz */
379 	const u32 f_MHz = freq / 1000000;
380 
381 	/* Range: 2^11 < v2f_big < 2^26 kHz V^2 */
382 	const u32 v2f_big = v2 * f_MHz;
383 
384 	/* Range: 2^1 < v2f < 2^16 MHz V^2 */
385 	const u32 v2f = v2f_big / 1000;
386 
387 	/* Range (working backwards from next line): 0 < v2fc < 2^23 uW.
388 	 * Must be < 2^42 to avoid overflowing the return value. */
389 	const u64 v2fc = (u64) c * (u64) v2f;
390 	u32 remainder;
391 
392 	/* Range: 0 < v2fc / 1000 < 2^13 mW */
393 	// static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder)
394 	return div_u64_rem(v2fc, 1000, &remainder);
395 }
396 
397 /**
398  * kbase_scale_static_power() - Scale a static power coefficient to an OPP
399  * @c:		Static model coefficient, in uW/V^3. Should be in range
400  *		0 < c < 2^32 to prevent overflow.
401  * @voltage:	Voltage, in mV. Range: 2^9 < voltage < 2^13 (~0.5V to ~8V)
402  *
403  * Return: Power consumption, in mW. Range: 0 < p < 2^13 (0W to ~8W)
404  */
kbase_scale_static_power(const u32 c,const u32 voltage)405 u32 kbase_scale_static_power(const u32 c, const u32 voltage)
406 {
407 	/* Range: 2^8 < v2 < 2^16 m(V^2) */
408 	const u32 v2 = (voltage * voltage) / 1000;
409 
410 	/* Range: 2^17 < v3_big < 2^29 m(V^2) mV */
411 	const u32 v3_big = v2 * voltage;
412 
413 	/* Range: 2^7 < v3 < 2^19 m(V^3) */
414 	const u32 v3 = v3_big / 1000;
415 
416 	/*
417 	 * Range (working backwards from next line): 0 < v3c_big < 2^33 nW.
418 	 * The result should be < 2^52 to avoid overflowing the return value.
419 	 */
420 	const u64 v3c_big = (u64) c * (u64) v3;
421 	u32 remainder;
422 
423 	/* Range: 0 < v3c_big / 1000000 < 2^13 mW */
424 	// return v3c_big / 1000000;
425 	return div_u64_rem(v3c_big, 1000000, &remainder);
426 }
427 
get_current_model(struct kbase_device * kbdev)428 static struct kbase_ipa_model *get_current_model(struct kbase_device *kbdev)
429 {
430 	lockdep_assert_held(&kbdev->ipa.lock);
431 
432 	if (atomic_read(&kbdev->ipa_use_configured_model))
433 		return kbdev->ipa.configured_model;
434 	else
435 		return kbdev->ipa.fallback_model;
436 }
437 
get_static_power_locked(struct kbase_device * kbdev,struct kbase_ipa_model * model,unsigned long voltage)438 static u32 get_static_power_locked(struct kbase_device *kbdev,
439 				   struct kbase_ipa_model *model,
440 				   unsigned long voltage)
441 {
442 	u32 power = 0;
443 	int err;
444 	u32 power_coeff;
445 
446 	lockdep_assert_held(&model->kbdev->ipa.lock);
447 
448 	if (!model->ops->get_static_coeff)
449 		model = kbdev->ipa.fallback_model;
450 
451 	if (model->ops->get_static_coeff) {
452 		err = model->ops->get_static_coeff(model, &power_coeff);
453 		if (!err)
454 			power = kbase_scale_static_power(power_coeff,
455 							 (u32) voltage);
456 	}
457 
458 	return power;
459 }
460 
461 #ifdef CONFIG_MALI_PWRSOFT_765
kbase_get_static_power(struct devfreq * df,unsigned long voltage)462 static unsigned long kbase_get_static_power(struct devfreq *df,
463 					    unsigned long voltage)
464 #else
465 static unsigned long kbase_get_static_power(unsigned long voltage)
466 #endif
467 {
468 	struct kbase_ipa_model *model;
469 	u32 power = 0;
470 #ifdef CONFIG_MALI_PWRSOFT_765
471 	struct kbase_device *kbdev = dev_get_drvdata(&df->dev);
472 #else
473 	struct kbase_device *kbdev = kbase_find_device(-1);
474 #endif
475 
476 	mutex_lock(&kbdev->ipa.lock);
477 
478 	model = get_current_model(kbdev);
479 	power = get_static_power_locked(kbdev, model, voltage);
480 
481 	mutex_unlock(&kbdev->ipa.lock);
482 
483 #ifndef CONFIG_MALI_PWRSOFT_765
484 	kbase_release_device(kbdev);
485 #endif
486 
487 	return power;
488 }
489 
490 #ifdef CONFIG_MALI_PWRSOFT_765
kbase_get_dynamic_power(struct devfreq * df,unsigned long freq,unsigned long voltage)491 static unsigned long kbase_get_dynamic_power(struct devfreq *df,
492 					     unsigned long freq,
493 					     unsigned long voltage)
494 #else
495 static unsigned long kbase_get_dynamic_power(unsigned long freq,
496 					     unsigned long voltage)
497 #endif
498 {
499 	struct kbase_ipa_model *model;
500 	u32 power_coeff = 0, power = 0;
501 	int err = 0;
502 #ifdef CONFIG_MALI_PWRSOFT_765
503 	struct kbase_device *kbdev = dev_get_drvdata(&df->dev);
504 #else
505 	struct kbase_device *kbdev = kbase_find_device(-1);
506 #endif
507 
508 	mutex_lock(&kbdev->ipa.lock);
509 
510 	model = kbdev->ipa.fallback_model;
511 
512 	err = model->ops->get_dynamic_coeff(model, &power_coeff, freq);
513 
514 	if (!err)
515 		power = kbase_scale_dynamic_power(power_coeff, freq, voltage);
516 	else
517 		dev_err_ratelimited(kbdev->dev,
518 				    "Model %s returned error code %d\n",
519 				    model->ops->name, err);
520 
521 	mutex_unlock(&kbdev->ipa.lock);
522 
523 #ifndef CONFIG_MALI_PWRSOFT_765
524 	kbase_release_device(kbdev);
525 #endif
526 
527 	return power;
528 }
529 
kbase_get_real_power(struct devfreq * df,u32 * power,unsigned long freq,unsigned long voltage)530 int kbase_get_real_power(struct devfreq *df, u32 *power,
531 				unsigned long freq,
532 				unsigned long voltage)
533 {
534 	struct kbase_ipa_model *model;
535 	u32 power_coeff = 0;
536 	int err = 0;
537 	struct kbase_device *kbdev = dev_get_drvdata(&df->dev);
538 
539 	mutex_lock(&kbdev->ipa.lock);
540 
541 	model = get_current_model(kbdev);
542 
543 	err = model->ops->get_dynamic_coeff(model, &power_coeff, freq);
544 
545 	/* If we switch to protected model between get_current_model() and
546 	 * get_dynamic_coeff(), counter reading could fail. If that happens
547 	 * (unlikely, but possible), revert to the fallback model. */
548 	if (err && model != kbdev->ipa.fallback_model) {
549 		model = kbdev->ipa.fallback_model;
550 		err = model->ops->get_dynamic_coeff(model, &power_coeff, freq);
551 	}
552 
553 	if (err)
554 		goto exit_unlock;
555 
556 	*power = kbase_scale_dynamic_power(power_coeff, freq, voltage);
557 
558 	if (model->ops->do_utilization_scaling_in_framework) {
559 		struct devfreq_dev_status *status = &df->last_status;
560 		unsigned long total_time = max(status->total_time, 1ul);
561 		u64 busy_time = min(status->busy_time, total_time);
562 		u32 remainder;
563 
564 		// *power = ((u64) *power * (u64) busy_time) / total_time;
565 		*power = div_u64_rem(((u64) *power * (u64) busy_time), total_time, &remainder);
566 	}
567 
568 	*power += get_static_power_locked(kbdev, model, voltage);
569 
570 exit_unlock:
571 	mutex_unlock(&kbdev->ipa.lock);
572 
573 	return err;
574 }
575 KBASE_EXPORT_TEST_API(kbase_get_real_power);
576 
577 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)
578 struct devfreq_cooling_ops kbase_ipa_power_model_ops = {
579 #else
580 struct devfreq_cooling_power kbase_ipa_power_model_ops = {
581 #endif
582 	.get_static_power = &kbase_get_static_power,
583 	.get_dynamic_power = &kbase_get_dynamic_power,
584 };
585 KBASE_EXPORT_TEST_API(kbase_ipa_power_model_ops);
586