You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'pm-cpufreq'
* pm-cpufreq: (57 commits) cpufreq: MAINTAINERS: Add co-maintainer cpufreq: pxa2xx: initialize variables ARM: S5pv210: compiling issue, ARM_S5PV210_CPUFREQ needs CONFIG_CPU_FREQ_TABLE=y cpufreq: cpu0: Put cpu parent node after using it cpufreq: ARM big LITTLE: Adapt to latest cpufreq updates cpufreq: ARM big LITTLE: put DT nodes after using them cpufreq: Don't call __cpufreq_governor() for drivers without target() cpufreq: exynos5440: Protect OPP search calls with RCU lock cpufreq: dbx500: Round to closest available freq cpufreq: Call __cpufreq_governor() with correct policy->cpus mask cpufreq / intel_pstate: Optimize intel_pstate_set_policy cpufreq: OMAP: instantiate omap-cpufreq as a platform_driver arm: exynos: Enable OPP library support for exynos5440 cpufreq: exynos: Remove error return even if no soc is found cpufreq: exynos: Add cpufreq driver for exynos5440 cpufreq: AMD "frequency sensitivity feedback" powersave bias for ondemand governor cpufreq: ondemand: allow custom powersave_bias_target handler to be registered cpufreq: convert cpufreq_driver to using RCU cpufreq: powerpc/platforms/cell: move cpufreq driver to drivers/cpufreq cpufreq: sparc: move cpufreq driver to drivers/cpufreq ... Conflicts: MAINTAINERS (with commita8e39c3from pm-cpuidle) drivers/cpufreq/cpufreq_governor.h (with commitbeb0ff3)
This commit is contained in:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user