diff options
Diffstat (limited to 'driver/product/kernel/drivers/gpu/arm/midgard/ipa/mali_kbase_ipa.h')
-rwxr-xr-x | driver/product/kernel/drivers/gpu/arm/midgard/ipa/mali_kbase_ipa.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/ipa/mali_kbase_ipa.h b/driver/product/kernel/drivers/gpu/arm/midgard/ipa/mali_kbase_ipa.h new file mode 100755 index 0000000..67e0270 --- /dev/null +++ b/driver/product/kernel/drivers/gpu/arm/midgard/ipa/mali_kbase_ipa.h @@ -0,0 +1,80 @@ +/* + * + * (C) COPYRIGHT 2016 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 licence. + * + * A copy of the licence is included with the program, and can also be obtained + * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + + + +#ifndef _KBASE_IPA_H_ +#define _KBASE_IPA_H_ + +struct kbase_ipa_model { + struct list_head link; + struct kbase_device *kbdev; + void *model_data; + struct kbase_ipa_model_ops *ops; +}; + +struct kbase_ipa_model_ops { + char *name; + /* The init and term ops on the default model are always called. + * However, all the other models are only invoked if the model + * is selected in the device tree. Otherwise they are never + * initialized. Additional resources can be acquired by models + * in init(), however they must be terminated in the term(). + */ + int (*init)(struct kbase_ipa_model *model); + void (*term)(struct kbase_ipa_model *model); + /* get_dynamic_power() - return a coefficient with units pW/(Hz V^2), + * which is scaled by the IPA framework according to the current OPP's + * frequency and voltage. */ + unsigned long (*get_dynamic_power)(struct kbase_ipa_model *model); + /* get_static_power() - return an estimate of the current static power + * consumption, in mW, based on the current OPP's voltage, in mV. */ + unsigned long (*get_static_power)(struct kbase_ipa_model *model, + unsigned long voltage); + unsigned long (*power_to_state)(struct kbase_ipa_model *model, + unsigned long power); +}; + +/* Models can be registered only in the platform's platform_init_func call */ +int kbase_ipa_model_ops_register(struct kbase_device *kbdev, + struct kbase_ipa_model_ops *new_model_ops); + +int kbase_ipa_model_init(struct kbase_device *kbdev); +void kbase_ipa_model_term(struct kbase_device *kbdev); +void kbase_ipa_model_use_fallback_locked(struct kbase_device *kbdev); +void kbase_ipa_model_use_configured_locked(struct kbase_device *kbdev); + +extern struct kbase_ipa_model_ops kbase_generic_ipa_model_ops; + +/** + * kbase_ipa_dynamic_power - calculate power + * @kbdev: kbase device + * @freq: frequency in Hz + * @voltage: voltage in mV + * + * Return: returns power consumption + */ +unsigned long kbase_ipa_dynamic_power(struct kbase_device *kbdev, + unsigned long freq, + unsigned long voltage); + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0) +extern struct devfreq_cooling_ops power_model_ops; +#else +extern struct devfreq_cooling_power power_model_ops; +#endif + +#endif |