.. | .. |
---|
1 | 1 | // SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note |
---|
2 | 2 | /* |
---|
3 | 3 | * |
---|
4 | | - * (C) COPYRIGHT 2016-2021 ARM Limited. All rights reserved. |
---|
| 4 | + * (C) COPYRIGHT 2016-2022 ARM Limited. All rights reserved. |
---|
5 | 5 | * |
---|
6 | 6 | * This program is free software and is provided to you under the terms of the |
---|
7 | 7 | * GNU General Public License version 2 as published by the Free Software |
---|
.. | .. |
---|
71 | 71 | |
---|
72 | 72 | const char *kbase_ipa_model_name_from_id(u32 gpu_id) |
---|
73 | 73 | { |
---|
74 | | - const char* model_name = |
---|
| 74 | + const char *model_name = |
---|
75 | 75 | kbase_ipa_counter_model_name_from_id(gpu_id); |
---|
76 | 76 | |
---|
77 | 77 | if (!model_name) |
---|
.. | .. |
---|
84 | 84 | static struct device_node *get_model_dt_node(struct kbase_ipa_model *model, |
---|
85 | 85 | bool dt_required) |
---|
86 | 86 | { |
---|
87 | | - struct device_node *model_dt_node; |
---|
| 87 | + struct device_node *model_dt_node = NULL; |
---|
88 | 88 | char compat_string[64]; |
---|
89 | 89 | |
---|
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; |
---|
92 | 92 | |
---|
93 | 93 | /* of_find_compatible_node() will call of_node_put() on the root node, |
---|
94 | 94 | * so take a reference on it first. |
---|
.. | .. |
---|
111 | 111 | const char *name, s32 *addr, |
---|
112 | 112 | size_t num_elems, bool dt_required) |
---|
113 | 113 | { |
---|
114 | | - int err, i; |
---|
| 114 | + int err = -EINVAL, i; |
---|
115 | 115 | struct device_node *model_dt_node = get_model_dt_node(model, |
---|
116 | 116 | dt_required); |
---|
117 | 117 | char *origin; |
---|
118 | 118 | |
---|
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); |
---|
120 | 120 | /* We're done with model_dt_node now, so drop the reference taken in |
---|
121 | 121 | * get_model_dt_node()/of_find_compatible_node(). |
---|
122 | 122 | */ |
---|
.. | .. |
---|
138 | 138 | for (i = 0; i < num_elems; ++i) { |
---|
139 | 139 | char elem_name[32]; |
---|
140 | 140 | |
---|
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 | + } |
---|
146 | 152 | |
---|
147 | 153 | dev_dbg(model->kbdev->dev, "%s.%s = %d (%s)\n", |
---|
148 | 154 | model->ops->name, elem_name, addr[i], origin); |
---|
.. | .. |
---|
164 | 170 | int err; |
---|
165 | 171 | struct device_node *model_dt_node = get_model_dt_node(model, |
---|
166 | 172 | dt_required); |
---|
167 | | - const char *string_prop_value; |
---|
| 173 | + const char *string_prop_value = ""; |
---|
168 | 174 | char *origin; |
---|
169 | 175 | |
---|
170 | 176 | err = of_property_read_string(model_dt_node, name, |
---|
.. | .. |
---|
324 | 330 | kbdev->ipa.configured_model = default_model; |
---|
325 | 331 | } |
---|
326 | 332 | |
---|
327 | | - kbdev->ipa.last_sample_time = ktime_get(); |
---|
| 333 | + kbdev->ipa.last_sample_time = ktime_get_raw(); |
---|
328 | 334 | |
---|
329 | 335 | end: |
---|
330 | 336 | if (err) |
---|
.. | .. |
---|
396 | 402 | * |
---|
397 | 403 | * Return: Power consumption, in mW. Range: 0 < p < 2^13 (0W to ~8W) |
---|
398 | 404 | */ |
---|
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) |
---|
400 | 406 | { |
---|
401 | 407 | /* Range: 2^8 < v2 < 2^16 m(V^2) */ |
---|
402 | 408 | const u32 v2 = (voltage * voltage) / 1000; |
---|
.. | .. |
---|
537 | 543 | unsigned long *freqs, |
---|
538 | 544 | unsigned long *volts) |
---|
539 | 545 | { |
---|
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; |
---|
541 | 552 | |
---|
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); |
---|
544 | 561 | 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; |
---|
545 | 566 | |
---|
546 | 567 | if (kbdev->nr_clocks == 1) { |
---|
547 | 568 | freqs[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] = |
---|
.. | .. |
---|
549 | 570 | volts[KBASE_IPA_BLOCK_TYPE_SHADER_CORES] = |
---|
550 | 571 | volts[KBASE_IPA_BLOCK_TYPE_TOP_LEVEL]; |
---|
551 | 572 | } |
---|
| 573 | +#endif |
---|
552 | 574 | } |
---|
553 | 575 | |
---|
554 | 576 | #if KERNEL_VERSION(5, 10, 0) > LINUX_VERSION_CODE |
---|
.. | .. |
---|
594 | 616 | |
---|
595 | 617 | /* Here unlike kbase_get_real_power(), shader core frequency is |
---|
596 | 618 | * 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 |
---|
598 | 620 | * retrieved from the device tree). |
---|
599 | 621 | */ |
---|
600 | 622 | power += kbase_scale_dynamic_power( |
---|
.. | .. |
---|
734 | 756 | |
---|
735 | 757 | mutex_lock(&kbdev->ipa.lock); |
---|
736 | 758 | |
---|
737 | | - now = ktime_get(); |
---|
| 759 | + now = ktime_get_raw(); |
---|
738 | 760 | diff = ktime_sub(now, kbdev->ipa.last_sample_time); |
---|
739 | 761 | elapsed_time = ktime_to_ms(diff); |
---|
740 | 762 | |
---|
.. | .. |
---|
749 | 771 | if (model != kbdev->ipa.fallback_model) |
---|
750 | 772 | model->ops->reset_counter_data(model); |
---|
751 | 773 | |
---|
752 | | - kbdev->ipa.last_sample_time = ktime_get(); |
---|
| 774 | + kbdev->ipa.last_sample_time = ktime_get_raw(); |
---|
753 | 775 | } |
---|
754 | 776 | |
---|
755 | 777 | mutex_unlock(&kbdev->ipa.lock); |
---|