hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/gpu/arm/bifrost/ipa/mali_kbase_ipa.c
....@@ -1,7 +1,7 @@
11 // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
22 /*
33 *
4
- * (C) COPYRIGHT 2016-2021 ARM Limited. All rights reserved.
4
+ * (C) COPYRIGHT 2016-2022 ARM Limited. All rights reserved.
55 *
66 * This program is free software and is provided to you under the terms of the
77 * GNU General Public License version 2 as published by the Free Software
....@@ -71,7 +71,7 @@
7171
7272 const char *kbase_ipa_model_name_from_id(u32 gpu_id)
7373 {
74
- const char* model_name =
74
+ const char *model_name =
7575 kbase_ipa_counter_model_name_from_id(gpu_id);
7676
7777 if (!model_name)
....@@ -84,11 +84,11 @@
8484 static struct device_node *get_model_dt_node(struct kbase_ipa_model *model,
8585 bool dt_required)
8686 {
87
- struct device_node *model_dt_node;
87
+ struct device_node *model_dt_node = NULL;
8888 char compat_string[64];
8989
90
- snprintf(compat_string, sizeof(compat_string), "arm,%s",
91
- model->ops->name);
90
+ if (unlikely(!scnprintf(compat_string, sizeof(compat_string), "arm,%s", model->ops->name)))
91
+ return NULL;
9292
9393 /* of_find_compatible_node() will call of_node_put() on the root node,
9494 * so take a reference on it first.
....@@ -111,12 +111,12 @@
111111 const char *name, s32 *addr,
112112 size_t num_elems, bool dt_required)
113113 {
114
- int err, i;
114
+ int err = -EINVAL, i;
115115 struct device_node *model_dt_node = get_model_dt_node(model,
116116 dt_required);
117117 char *origin;
118118
119
- err = of_property_read_u32_array(model_dt_node, name, addr, num_elems);
119
+ err = of_property_read_u32_array(model_dt_node, name, (u32 *)addr, num_elems);
120120 /* We're done with model_dt_node now, so drop the reference taken in
121121 * get_model_dt_node()/of_find_compatible_node().
122122 */
....@@ -138,11 +138,17 @@
138138 for (i = 0; i < num_elems; ++i) {
139139 char elem_name[32];
140140
141
- if (num_elems == 1)
142
- snprintf(elem_name, sizeof(elem_name), "%s", name);
143
- else
144
- snprintf(elem_name, sizeof(elem_name), "%s.%d",
145
- name, i);
141
+ if (num_elems == 1) {
142
+ if (unlikely(!scnprintf(elem_name, sizeof(elem_name), "%s", name))) {
143
+ err = -ENOMEM;
144
+ goto exit;
145
+ }
146
+ } else {
147
+ if (unlikely(!scnprintf(elem_name, sizeof(elem_name), "%s.%d", name, i))) {
148
+ err = -ENOMEM;
149
+ goto exit;
150
+ }
151
+ }
146152
147153 dev_dbg(model->kbdev->dev, "%s.%s = %d (%s)\n",
148154 model->ops->name, elem_name, addr[i], origin);
....@@ -164,7 +170,7 @@
164170 int err;
165171 struct device_node *model_dt_node = get_model_dt_node(model,
166172 dt_required);
167
- const char *string_prop_value;
173
+ const char *string_prop_value = "";
168174 char *origin;
169175
170176 err = of_property_read_string(model_dt_node, name,
....@@ -324,7 +330,7 @@
324330 kbdev->ipa.configured_model = default_model;
325331 }
326332
327
- kbdev->ipa.last_sample_time = ktime_get();
333
+ kbdev->ipa.last_sample_time = ktime_get_raw();
328334
329335 end:
330336 if (err)
....@@ -396,7 +402,7 @@
396402 *
397403 * Return: Power consumption, in mW. Range: 0 < p < 2^13 (0W to ~8W)
398404 */
399
-u32 kbase_scale_static_power(const u32 c, const u32 voltage)
405
+static u32 kbase_scale_static_power(const u32 c, const u32 voltage)
400406 {
401407 /* Range: 2^8 < v2 < 2^16 m(V^2) */
402408 const u32 v2 = (voltage * voltage) / 1000;
....@@ -537,11 +543,26 @@
537543 unsigned long *freqs,
538544 unsigned long *volts)
539545 {
540
- u64 core_mask;
546
+#if IS_ENABLED(CONFIG_MALI_BIFROST_NO_MALI)
547
+ /* An arbitrary voltage and frequency value can be chosen for testing
548
+ * in no mali configuration which may not match with any OPP level.
549
+ */
550
+ freqs[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL] = nominal_freq;
551
+ volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL] = nominal_voltage;
541552
542
- kbase_devfreq_opp_translate(kbdev, nominal_freq, nominal_voltage,
543
- &core_mask, freqs, volts);
553
+ freqs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] = nominal_freq;
554
+ volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] = nominal_voltage;
555
+#else
556
+ u64 core_mask;
557
+ unsigned int i;
558
+
559
+ kbase_devfreq_opp_translate(kbdev, nominal_freq, &core_mask,
560
+ freqs, volts);
544561 CSTD_UNUSED(core_mask);
562
+
563
+ /* Convert micro volts to milli volts */
564
+ for (i = 0; i < kbdev->nr_clocks; i++)
565
+ volts[i] /= 1000;
545566
546567 if (kbdev->nr_clocks == 1) {
547568 freqs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] =
....@@ -549,6 +570,7 @@
549570 volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] =
550571 volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL];
551572 }
573
+#endif
552574 }
553575
554576 #if KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE
....@@ -594,7 +616,7 @@
594616
595617 /* Here unlike kbase_get_real_power(), shader core frequency is
596618 * used for the scaling as simple power model is used to obtain
597
- * the value of dynamic coefficient (which is is a fixed value
619
+ * the value of dynamic coefficient (which is a fixed value
598620 * retrieved from the device tree).
599621 */
600622 power += kbase_scale_dynamic_power(
....@@ -734,7 +756,7 @@
734756
735757 mutex_lock(&kbdev->ipa.lock);
736758
737
- now = ktime_get();
759
+ now = ktime_get_raw();
738760 diff = ktime_sub(now, kbdev->ipa.last_sample_time);
739761 elapsed_time = ktime_to_ms(diff);
740762
....@@ -749,7 +771,7 @@
749771 if (model != kbdev->ipa.fallback_model)
750772 model->ops->reset_counter_data(model);
751773
752
- kbdev->ipa.last_sample_time = ktime_get();
774
+ kbdev->ipa.last_sample_time = ktime_get_raw();
753775 }
754776
755777 mutex_unlock(&kbdev->ipa.lock);