| .. | .. |
|---|
| 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); |
|---|