diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq_governor.h')
| -rw-r--r-- | drivers/cpufreq/cpufreq_governor.h | 128 | 
1 files changed, 110 insertions, 18 deletions
diff --git a/drivers/cpufreq/cpufreq_governor.h b/drivers/cpufreq/cpufreq_governor.h index cc4bd2f6838..8ac33538d0b 100644 --- a/drivers/cpufreq/cpufreq_governor.h +++ b/drivers/cpufreq/cpufreq_governor.h @@ -34,20 +34,81 @@   */  #define MIN_SAMPLING_RATE_RATIO			(2)  #define LATENCY_MULTIPLIER			(1000) -#define MIN_LATENCY_MULTIPLIER			(100) +#define MIN_LATENCY_MULTIPLIER			(20)  #define TRANSITION_LATENCY_LIMIT		(10 * 1000 * 1000)  /* Ondemand Sampling types */  enum {OD_NORMAL_SAMPLE, OD_SUB_SAMPLE}; -/* Macro creating sysfs show routines */ -#define show_one(_gov, file_name, object)				\ -static ssize_t show_##file_name						\ +/* + * Macro for creating governors sysfs routines + * + * - gov_sys: One governor instance per whole system + * - gov_pol: One governor instance per policy + */ + +/* Create attributes */ +#define gov_sys_attr_ro(_name)						\ +static struct global_attr _name##_gov_sys =				\ +__ATTR(_name, 0444, show_##_name##_gov_sys, NULL) + +#define gov_sys_attr_rw(_name)						\ +static struct global_attr _name##_gov_sys =				\ +__ATTR(_name, 0644, show_##_name##_gov_sys, store_##_name##_gov_sys) + +#define gov_pol_attr_ro(_name)						\ +static struct freq_attr _name##_gov_pol =				\ +__ATTR(_name, 0444, show_##_name##_gov_pol, NULL) + +#define gov_pol_attr_rw(_name)						\ +static struct freq_attr _name##_gov_pol =				\ +__ATTR(_name, 0644, show_##_name##_gov_pol, store_##_name##_gov_pol) + +#define gov_sys_pol_attr_rw(_name)					\ +	gov_sys_attr_rw(_name);						\ +	gov_pol_attr_rw(_name) + +#define gov_sys_pol_attr_ro(_name)					\ +	gov_sys_attr_ro(_name);						\ +	gov_pol_attr_ro(_name) + +/* Create show/store routines */ +#define show_one(_gov, file_name)					\ +static ssize_t show_##file_name##_gov_sys				\  (struct kobject *kobj, struct attribute *attr, char *buf)		\  {									\ -	return sprintf(buf, "%u\n", _gov##_tuners.object);		\ +	struct _gov##_dbs_tuners *tuners = _gov##_dbs_cdata.gdbs_data->tuners; \ +	return sprintf(buf, "%u\n", tuners->file_name);			\ +}									\ +									\ +static ssize_t show_##file_name##_gov_pol					\ +(struct cpufreq_policy *policy, char *buf)				\ +{									\ +	struct dbs_data *dbs_data = policy->governor_data;		\ +	struct _gov##_dbs_tuners *tuners = dbs_data->tuners;		\ +	return sprintf(buf, "%u\n", tuners->file_name);			\ +} + +#define store_one(_gov, file_name)					\ +static ssize_t store_##file_name##_gov_sys				\ +(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count)	\ +{									\ +	struct dbs_data *dbs_data = _gov##_dbs_cdata.gdbs_data;		\ +	return store_##file_name(dbs_data, buf, count);			\ +}									\ +									\ +static ssize_t store_##file_name##_gov_pol				\ +(struct cpufreq_policy *policy, const char *buf, size_t count)		\ +{									\ +	struct dbs_data *dbs_data = policy->governor_data;		\ +	return store_##file_name(dbs_data, buf, count);			\  } +#define show_store_one(_gov, file_name)					\ +show_one(_gov, file_name);						\ +store_one(_gov, file_name) + +/* create helper routines */  #define define_get_cpu_dbs_routines(_dbs_info)				\  static struct cpu_dbs_common_info *get_cpu_cdbs(int cpu)		\  {									\ @@ -87,7 +148,6 @@ struct cpu_dbs_common_info {  struct od_cpu_dbs_info_s {  	struct cpu_dbs_common_info cdbs; -	u64 prev_cpu_iowait;  	struct cpufreq_frequency_table *freq_table;  	unsigned int freq_lo;  	unsigned int freq_lo_jiffies; @@ -103,7 +163,7 @@ struct cs_cpu_dbs_info_s {  	unsigned int enable:1;  }; -/* Governers sysfs tunables */ +/* Per policy Governers sysfs tunables */  struct od_dbs_tuners {  	unsigned int ignore_nice;  	unsigned int sampling_rate; @@ -123,31 +183,42 @@ struct cs_dbs_tuners {  	unsigned int freq_step;  }; -/* Per Governer data */ -struct dbs_data { +/* Common Governer data across policies */ +struct dbs_data; +struct common_dbs_data {  	/* Common across governors */  	#define GOV_ONDEMAND		0  	#define GOV_CONSERVATIVE	1  	int governor; -	unsigned int min_sampling_rate; -	struct attribute_group *attr_group; -	void *tuners; +	struct attribute_group *attr_group_gov_sys; /* one governor - system */ +	struct attribute_group *attr_group_gov_pol; /* one governor - policy */ -	/* dbs_mutex protects dbs_enable in governor start/stop */ -	struct mutex mutex; +	/* Common data for platforms that don't set have_governor_per_policy */ +	struct dbs_data *gdbs_data;  	struct cpu_dbs_common_info *(*get_cpu_cdbs)(int cpu);  	void *(*get_cpu_dbs_info_s)(int cpu);  	void (*gov_dbs_timer)(struct work_struct *work);  	void (*gov_check_cpu)(int cpu, unsigned int load); +	int (*init)(struct dbs_data *dbs_data); +	void (*exit)(struct dbs_data *dbs_data);  	/* Governor specific ops, see below */  	void *gov_ops;  }; +/* Governer Per policy data */ +struct dbs_data { +	struct common_dbs_data *cdata; +	unsigned int min_sampling_rate; +	void *tuners; + +	/* dbs_mutex protects dbs_enable in governor start/stop */ +	struct mutex mutex; +}; +  /* Governor specific ops, will be passed to dbs_data->gov_ops */  struct od_ops { -	int (*io_busy)(void);  	void (*powersave_bias_init_cpu)(int cpu);  	unsigned int (*powersave_bias_target)(struct cpufreq_policy *policy,  			unsigned int freq_next, unsigned int relation); @@ -169,10 +240,31 @@ static inline int delay_for_sampling_rate(unsigned int sampling_rate)  	return delay;  } -u64 get_cpu_idle_time(unsigned int cpu, u64 *wall); +#define declare_show_sampling_rate_min(_gov)				\ +static ssize_t show_sampling_rate_min_gov_sys				\ +(struct kobject *kobj, struct attribute *attr, char *buf)		\ +{									\ +	struct dbs_data *dbs_data = _gov##_dbs_cdata.gdbs_data;		\ +	return sprintf(buf, "%u\n", dbs_data->min_sampling_rate);	\ +}									\ +									\ +static ssize_t show_sampling_rate_min_gov_pol				\ +(struct cpufreq_policy *policy, char *buf)				\ +{									\ +	struct dbs_data *dbs_data = policy->governor_data;		\ +	return sprintf(buf, "%u\n", dbs_data->min_sampling_rate);	\ +} + +u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy);  void dbs_check_cpu(struct dbs_data *dbs_data, int cpu);  bool need_load_eval(struct cpu_dbs_common_info *cdbs,  		unsigned int sampling_rate); -int cpufreq_governor_dbs(struct dbs_data *dbs_data, -		struct cpufreq_policy *policy, unsigned int event); +int cpufreq_governor_dbs(struct cpufreq_policy *policy, +		struct common_dbs_data *cdata, unsigned int event); +void gov_queue_work(struct dbs_data *dbs_data, struct cpufreq_policy *policy, +		unsigned int delay, bool all_cpus); +void od_register_powersave_bias_handler(unsigned int (*f) +		(struct cpufreq_policy *, unsigned int, unsigned int), +		unsigned int powersave_bias); +void od_unregister_powersave_bias_handler(void);  #endif /* _CPUFREQ_GOVERNOR_H */  |