The Baytrail series uses additional information while
setting a target CPU performance value. To keep the PID governor
generic, move this out into the platform specific backend driver.

Signed-off-by: Ashwin Chaugule <[email protected]>
---
 drivers/cpufreq/intel_pid_ctrl.c | 57 ++++++++++++++++++++++++----------------
 drivers/cpufreq/pid_ctrl.c       |  4 ---
 drivers/cpufreq/pid_ctrl.h       |  9 -------
 3 files changed, 35 insertions(+), 35 deletions(-)

diff --git a/drivers/cpufreq/intel_pid_ctrl.c b/drivers/cpufreq/intel_pid_ctrl.c
index 9ad7d5e..a858981 100644
--- a/drivers/cpufreq/intel_pid_ctrl.c
+++ b/drivers/cpufreq/intel_pid_ctrl.c
@@ -29,6 +29,15 @@
 #define BYT_TURBO_RATIOS       0x66c
 #define BYT_TURBO_VIDS         0x66d
 
+struct vid_data {
+       int min;
+       int max;
+       int turbo;
+       int32_t ratio;
+};
+
+static struct vid_data vid_data;
+
 struct perf_limits limits = {
        .no_turbo = 0,
        .max_perf_pct = 100,
@@ -39,6 +48,21 @@ struct perf_limits limits = {
        .max_sysfs_pct = 100,
 };
 
+static void byt_get_vid(int max, int min)
+{
+       u64 value;
+
+       rdmsrl(BYT_VIDS, value);
+       vid_data.min = int_tofp((value >> 8) & 0x7f);
+       vid_data.max = int_tofp((value >> 16) & 0x7f);
+       vid_data.ratio = div_fp(
+                       vid_data.max - vid_data.min,
+                       int_tofp(max - min));
+
+       rdmsrl(BYT_TURBO_VIDS, value);
+       vid_data.turbo = value & 0x7f;
+}
+
 static int byt_get_min_pstate(void)
 {
        u64 value;
@@ -50,9 +74,15 @@ static int byt_get_min_pstate(void)
 static int byt_get_max_pstate(void)
 {
        u64 value;
+       int max, min;
 
        rdmsrl(BYT_RATIOS, value);
-       return (value >> 16) & 0x7F;
+       max = (value >> 16) & 0x7F;
+       min = byt_get_min_pstate();
+
+       byt_get_vid(max, min);
+
+       return max;
 }
 
 static int byt_get_turbo_pstate(void)
@@ -78,37 +108,21 @@ static void byt_set_pstate(struct cpudata *cpudata, int 
pstate)
        if (limits.no_turbo && !limits.turbo_disabled)
                val |= (u64)1 << 32;
 
-       vid_fp = cpudata->vid.min + mul_fp(
+       vid_fp = vid_data.min + mul_fp(
                int_tofp(pstate - cpudata->pstate.min_pstate),
-               cpudata->vid.ratio);
+               vid_data.ratio);
 
-       vid_fp = clamp_t(int32_t, vid_fp, cpudata->vid.min, cpudata->vid.max);
+       vid_fp = clamp_t(int32_t, vid_fp, vid_data.min, vid_data.max);
        vid = fp_toint(vid_fp);
 
        if (pstate > cpudata->pstate.max_pstate)
-               vid = cpudata->vid.turbo;
+               vid = vid_data.turbo;
 
        val |= vid;
 
        wrmsrl(MSR_IA32_PERF_CTL, val);
 }
 
-static void byt_get_vid(struct cpudata *cpudata)
-{
-       u64 value;
-
-       rdmsrl(BYT_VIDS, value);
-       cpudata->vid.min = int_tofp((value >> 8) & 0x7f);
-       cpudata->vid.max = int_tofp((value >> 16) & 0x7f);
-       cpudata->vid.ratio = div_fp(
-               cpudata->vid.max - cpudata->vid.min,
-               int_tofp(cpudata->pstate.max_pstate -
-                       cpudata->pstate.min_pstate));
-
-       rdmsrl(BYT_TURBO_VIDS, value);
-       cpudata->vid.turbo = value & 0x7f;
-}
-
 static int core_get_min_pstate(void)
 {
        u64 value;
@@ -188,7 +202,6 @@ static struct cpu_defaults byt_params = {
                .get_min = byt_get_min_pstate,
                .get_turbo = byt_get_turbo_pstate,
                .set = byt_set_pstate,
-               .get_vid = byt_get_vid,
        },
 };
 
diff --git a/drivers/cpufreq/pid_ctrl.c b/drivers/cpufreq/pid_ctrl.c
index 516b95f..8eb9739 100644
--- a/drivers/cpufreq/pid_ctrl.c
+++ b/drivers/cpufreq/pid_ctrl.c
@@ -319,9 +319,6 @@ static void pid_ctrl_get_cpu_pstates(struct cpudata *cpu)
        else
                cpu->pstate.turbo_pstate = cpu->pstate.max_pstate;
 
-       if (pstate_funcs.get_vid)
-               pstate_funcs.get_vid(cpu);
-
        pid_ctrl_set_pstate(cpu, cpu->pstate.min_pstate);
 }
 
@@ -592,7 +589,6 @@ void register_cpu_funcs(struct pstate_funcs *funcs)
        pstate_funcs.get_min   = funcs->get_min;
        pstate_funcs.get_turbo = funcs->get_turbo;
        pstate_funcs.set       = funcs->set;
-       pstate_funcs.get_vid   = funcs->get_vid;
 }
 EXPORT_SYMBOL_GPL(register_cpu_funcs);
 
diff --git a/drivers/cpufreq/pid_ctrl.h b/drivers/cpufreq/pid_ctrl.h
index ab56415..40b352a 100644
--- a/drivers/cpufreq/pid_ctrl.h
+++ b/drivers/cpufreq/pid_ctrl.h
@@ -30,13 +30,6 @@ struct sample {
        ktime_t time;
 };
 
-struct vid_data {
-       int min;
-       int max;
-       int turbo;
-       int32_t ratio;
-};
-
 struct _pid {
        int setpoint;
        int32_t integral;
@@ -69,7 +62,6 @@ struct cpudata {
        struct timer_list timer;
 
        struct pstate_data pstate;
-       struct vid_data vid;
        struct _pid pid;
 
        ktime_t last_sample_time;
@@ -83,7 +75,6 @@ struct pstate_funcs {
        int (*get_min)(void);
        int (*get_turbo)(void);
        void (*set)(struct cpudata*, int pstate);
-       void (*get_vid)(struct cpudata *);
 };
 
 struct cpu_defaults {
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to