149 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 *
 | 
						|
 * (C) COPYRIGHT 2016-2017 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_
 | 
						|
 | 
						|
#if defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)
 | 
						|
 | 
						|
struct devfreq;
 | 
						|
 | 
						|
struct kbase_ipa_model {
 | 
						|
	struct list_head link;
 | 
						|
	struct kbase_device *kbdev;
 | 
						|
	void *model_data;
 | 
						|
	struct kbase_ipa_model_ops *ops;
 | 
						|
	struct list_head params;
 | 
						|
	bool missing_dt_node_warning;
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * kbase_ipa_model_add_param_s32 - Add an integer model parameter
 | 
						|
 * @model:	pointer to IPA model
 | 
						|
 * @name:	name of corresponding debugfs entry
 | 
						|
 * @addr:	address where the value is stored
 | 
						|
 * @num_elems:	number of elements (1 if not an array)
 | 
						|
 * @dt_required: if false, a corresponding devicetree entry is not required,
 | 
						|
 *		 and the current value will be used. If true, a warning is
 | 
						|
 *		 output and the data is zeroed
 | 
						|
 *
 | 
						|
 * Return: 0 on success, or an error code
 | 
						|
 */
 | 
						|
int kbase_ipa_model_add_param_s32(struct kbase_ipa_model *model,
 | 
						|
				  const char *name, s32 *addr,
 | 
						|
				  size_t num_elems, bool dt_required);
 | 
						|
 | 
						|
/**
 | 
						|
 * kbase_ipa_model_add_param_string - Add a string model parameter
 | 
						|
 * @model:	pointer to IPA model
 | 
						|
 * @name:	name of corresponding debugfs entry
 | 
						|
 * @addr:	address where the value is stored
 | 
						|
 * @size:	size, in bytes, of the value storage (so the maximum string
 | 
						|
 *		length is size - 1)
 | 
						|
 * @dt_required: if false, a corresponding devicetree entry is not required,
 | 
						|
 *		 and the current value will be used. If true, a warning is
 | 
						|
 *		 output and the data is zeroed
 | 
						|
 *
 | 
						|
 * Return: 0 on success, or an error code
 | 
						|
 */
 | 
						|
int kbase_ipa_model_add_param_string(struct kbase_ipa_model *model,
 | 
						|
				     const char *name, char *addr,
 | 
						|
				     size_t size, bool dt_required);
 | 
						|
 | 
						|
struct kbase_ipa_model_ops {
 | 
						|
	char *name;
 | 
						|
	/* The init, recalculate 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);
 | 
						|
	/* Called immediately after init(), or when a parameter is changed, so
 | 
						|
	 * that any coefficients derived from model parameters can be
 | 
						|
	 * recalculated. */
 | 
						|
	int (*recalculate)(struct kbase_ipa_model *model);
 | 
						|
	void (*term)(struct kbase_ipa_model *model);
 | 
						|
	/*
 | 
						|
	 * get_dynamic_coeff() - calculate dynamic power coefficient
 | 
						|
	 * @model:		pointer to model
 | 
						|
	 * @coeffp:		pointer to return value location
 | 
						|
	 * @current_freq:	frequency the GPU has been running at for the
 | 
						|
	 *			previous sampling period.
 | 
						|
	 *
 | 
						|
	 * Calculate a dynamic power coefficient, with units pW/(Hz V^2), which
 | 
						|
	 * is then scaled by the IPA framework according to the current OPP's
 | 
						|
	 * frequency and voltage.
 | 
						|
	 *
 | 
						|
	 * Return: 0 on success, or an error code.
 | 
						|
	 */
 | 
						|
	int (*get_dynamic_coeff)(struct kbase_ipa_model *model, u32 *coeffp,
 | 
						|
				 u32 current_freq);
 | 
						|
	/*
 | 
						|
	 * get_static_coeff() - calculate static power coefficient
 | 
						|
	 * @model:		pointer to model
 | 
						|
	 * @coeffp:		pointer to return value location
 | 
						|
	 *
 | 
						|
	 * Calculate a static power coefficient, with units uW/(V^3), which is
 | 
						|
	 * scaled by the IPA framework according to the current OPP's voltage.
 | 
						|
	 *
 | 
						|
	 * Return: 0 on success, or an error code.
 | 
						|
	 */
 | 
						|
	int (*get_static_coeff)(struct kbase_ipa_model *model, u32 *coeffp);
 | 
						|
	/* If false, the model's get_dynamic_coeff() method accounts for how
 | 
						|
	 * long the GPU was active over the sample period. If true, the
 | 
						|
	 * framework will scale the calculated power according to the
 | 
						|
	 * utilization stats recorded by devfreq in get_real_power(). */
 | 
						|
	bool do_utilization_scaling_in_framework;
 | 
						|
};
 | 
						|
 | 
						|
/* 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);
 | 
						|
struct kbase_ipa_model *kbase_ipa_get_model(struct kbase_device *kbdev,
 | 
						|
					    const char *name);
 | 
						|
 | 
						|
int kbase_ipa_init(struct kbase_device *kbdev);
 | 
						|
void kbase_ipa_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);
 | 
						|
int kbase_ipa_model_recalculate(struct kbase_ipa_model *model);
 | 
						|
struct kbase_ipa_model *kbase_ipa_init_model(struct kbase_device *kbdev,
 | 
						|
					     struct kbase_ipa_model_ops *ops);
 | 
						|
void kbase_ipa_term_model(struct kbase_ipa_model *model);
 | 
						|
 | 
						|
extern struct kbase_ipa_model_ops kbase_simple_ipa_model_ops;
 | 
						|
 | 
						|
 | 
						|
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)
 | 
						|
extern struct devfreq_cooling_ops kbase_ipa_power_model_ops;
 | 
						|
#else
 | 
						|
extern struct devfreq_cooling_power kbase_ipa_power_model_ops;
 | 
						|
#endif
 | 
						|
 | 
						|
#else /* !(defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)) */
 | 
						|
 | 
						|
static inline void kbase_ipa_model_use_fallback_locked(struct kbase_device *kbdev)
 | 
						|
{ }
 | 
						|
 | 
						|
static inline void kbase_ipa_model_use_configured_locked(struct kbase_device *kbdev)
 | 
						|
{ }
 | 
						|
 | 
						|
#endif /* (defined(CONFIG_MALI_DEVFREQ) && defined(CONFIG_DEVFREQ_THERMAL)) */
 | 
						|
 | 
						|
#endif
 |