Merge branch 'pm-cpufreq'
[cascardo/linux.git] / drivers / cpufreq / cpufreq_governor.h
index cc4bd2f..8ac3353 100644 (file)
  */
 #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 */