| /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
| /* |
| * |
| * (C) COPYRIGHT 2020-2021 ARM Limited. All rights reserved. |
| * |
| * This program is free software and is provided to you under the terms of the |
| * GNU General Public License version 2 as published by the Free Software |
| * Foundation, and any use by you of this program is subject to the terms |
| * of such GNU license. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, you can access it online at |
| * http://www.gnu.org/licenses/gpl-2.0.html. |
| * |
| */ |
| |
| #ifndef _KBASE_IPA_COUNTER_COMMON_CSF_H_ |
| #define _KBASE_IPA_COUNTER_COMMON_CSF_H_ |
| |
| #include "mali_kbase.h" |
| #include "csf/ipa_control/mali_kbase_csf_ipa_control.h" |
| |
| /* Maximum number of HW counters used by the IPA counter model. */ |
| #define KBASE_IPA_MAX_COUNTER_DEF_NUM 24 |
| |
| struct kbase_ipa_counter_model_data; |
| |
| /** |
| * struct kbase_ipa_counter_model_data - IPA counter model context per device |
| * @kbdev: Pointer to kbase device |
| * @ipa_control_client: Handle returned on registering IPA counter model as a |
| * client of kbase_ipa_control. |
| * @top_level_cntrs_def: Array of description of HW counters used by the IPA |
| * counter model for top-level. |
| * @num_top_level_cntrs: Number of elements in @top_level_cntrs_def array. |
| * @shader_cores_cntrs_def: Array of description of HW counters used by the IPA |
| * counter model for shader cores. |
| * @num_shader_cores_cntrs: Number of elements in @shader_cores_cntrs_def array. |
| * @counter_coeffs: Buffer to store coefficient value used for HW counters |
| * @counter_values: Buffer to store the accumulated value of HW counters |
| * retreived from kbase_ipa_control. |
| * @num_counters: Number of counters queried from kbase_ipa_control. |
| * @reference_voltage: voltage, in mV, of the operating point used when |
| * deriving the power model coefficients. Range approx |
| * 0.1V - 5V (~= 8V): 2^7 <= reference_voltage <= 2^13 |
| * @scaling_factor: User-specified power scaling factor. This is an |
| * integer, which is multiplied by the power coefficient |
| * just before OPP scaling. |
| * Range approx 0-32: 0 < scaling_factor < 2^5 |
| * @min_sample_cycles: If the value of the GPU_ACTIVE counter (the number of |
| * cycles the GPU was working) is less than |
| * min_sample_cycles, the counter model will return an |
| * error, causing the IPA framework to approximate using |
| * the cached simple model results instead. This may be |
| * more accurate than extrapolating using a very small |
| * counter dump. |
| */ |
| struct kbase_ipa_counter_model_data { |
| struct kbase_device *kbdev; |
| void *ipa_control_client; |
| const struct kbase_ipa_counter *top_level_cntrs_def; |
| size_t num_top_level_cntrs; |
| const struct kbase_ipa_counter *shader_cores_cntrs_def; |
| size_t num_shader_cores_cntrs; |
| s32 counter_coeffs[KBASE_IPA_MAX_COUNTER_DEF_NUM]; |
| u64 counter_values[KBASE_IPA_MAX_COUNTER_DEF_NUM]; |
| u64 num_counters; |
| s32 reference_voltage; |
| s32 scaling_factor; |
| s32 min_sample_cycles; |
| }; |
| |
| /** |
| * struct kbase_ipa_counter - represents a single HW counter used by IPA model |
| * @name: Name of the HW counter used by IPA counter model |
| * for energy estimation. |
| * @coeff_default_value: Default value of coefficient for the counter. |
| * Coefficients are interpreted as fractions where the |
| * denominator is 1000000. |
| * @counter_block_offset: Index to the counter within the counter block of |
| * type @counter_block_type. |
| * @counter_block_type: Type of the counter block. |
| */ |
| struct kbase_ipa_counter { |
| const char *name; |
| s32 coeff_default_value; |
| u32 counter_block_offset; |
| enum kbase_ipa_core_type counter_block_type; |
| }; |
| |
| /** |
| * kbase_ipa_counter_dynamic_coeff() - calculate dynamic power based on HW counters |
| * @model: pointer to instantiated model |
| * @coeffp: pointer to location where calculated power, in |
| * pW/(Hz V^2), is stored for top level and shader cores. |
| * |
| * This is a GPU-agnostic implementation of the get_dynamic_coeff() |
| * function of an IPA model. It relies on the model being populated |
| * with GPU-specific attributes at initialization time. |
| * |
| * Return: 0 on success, or an error code. |
| */ |
| int kbase_ipa_counter_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp); |
| |
| /** |
| * kbase_ipa_counter_reset_data() - Reset the counters data used for dynamic |
| * power estimation |
| * @model: pointer to instantiated model |
| * |
| * Retrieve the accumulated value of HW counters from the kbase_ipa_control |
| * component, without doing any processing, which is effectively a reset as the |
| * next call to kbase_ipa_counter_dynamic_coeff() will see the increment in |
| * counter values from this point onwards. |
| */ |
| void kbase_ipa_counter_reset_data(struct kbase_ipa_model *model); |
| |
| /** |
| * kbase_ipa_counter_common_model_init() - initialize ipa power model |
| * @model: Pointer to the ipa power model to initialize |
| * @top_level_cntrs_def: Array corresponding to the HW counters used in the |
| * top level counter model, contains the counter index, |
| * default value of the coefficient. |
| * @num_top_level_cntrs: Number of elements in the array @top_level_cntrs_def |
| * @shader_cores_cntrs_def: Array corresponding to the HW counters used in the |
| * shader cores counter model, contains the counter index, |
| * default value of the coefficient. |
| * @num_shader_cores_cntrs: Number of elements in the array |
| * @shader_cores_cntrs_def. |
| * @reference_voltage: voltage, in mV, of the operating point used when |
| * deriving the power model coefficients. |
| * |
| * This function performs initialization steps common for ipa counter based |
| * model of all CSF GPUs. The set of counters and their respective weights |
| * could be different for each GPU. The tuple of counter index and weight |
| * is passed via @top_level_cntrs_def and @shader_cores_cntrs_def array. |
| * |
| * Return: 0 on success, error code otherwise |
| */ |
| int kbase_ipa_counter_common_model_init(struct kbase_ipa_model *model, |
| const struct kbase_ipa_counter *top_level_cntrs_def, |
| size_t num_top_level_cntrs, |
| const struct kbase_ipa_counter *shader_cores_cntrs_def, |
| size_t num_shader_cores_cntrs, |
| s32 reference_voltage); |
| /** |
| * kbase_ipa_counter_common_model_term() - terminate ipa power model |
| * @model: ipa power model to terminate |
| * |
| * This function performs all necessary steps to terminate ipa power model |
| * including clean up of resources allocated to hold model data. |
| */ |
| void kbase_ipa_counter_common_model_term(struct kbase_ipa_model *model); |
| |
| #endif /* _KBASE_IPA_COUNTER_COMMON_CSF_H_ */ |