Merge back earlier cpufreq material for v4.8.
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 4 Jul 2016 11:21:43 +0000 (13:21 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 4 Jul 2016 11:21:43 +0000 (13:21 +0200)
1  2 
drivers/cpufreq/cpufreq.c
drivers/cpufreq/intel_pstate.c

@@@ -74,19 -74,12 +74,12 @@@ static inline bool has_target(void
  }
  
  /* internal prototypes */
- static int cpufreq_governor(struct cpufreq_policy *policy, unsigned int event);
  static unsigned int __cpufreq_get(struct cpufreq_policy *policy);
+ static int cpufreq_init_governor(struct cpufreq_policy *policy);
+ static void cpufreq_exit_governor(struct cpufreq_policy *policy);
  static int cpufreq_start_governor(struct cpufreq_policy *policy);
- static inline void cpufreq_exit_governor(struct cpufreq_policy *policy)
- {
-       (void)cpufreq_governor(policy, CPUFREQ_GOV_POLICY_EXIT);
- }
- static inline void cpufreq_stop_governor(struct cpufreq_policy *policy)
- {
-       (void)cpufreq_governor(policy, CPUFREQ_GOV_STOP);
- }
+ static void cpufreq_stop_governor(struct cpufreq_policy *policy);
+ static void cpufreq_governor_limits(struct cpufreq_policy *policy);
  
  /**
   * Two notifier lists: the "policy" list is involved in the
@@@ -133,15 -126,6 +126,6 @@@ struct kobject *get_governor_parent_kob
  }
  EXPORT_SYMBOL_GPL(get_governor_parent_kobj);
  
- struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu)
- {
-       struct cpufreq_policy *policy = per_cpu(cpufreq_cpu_data, cpu);
-       return policy && !policy_is_inactive(policy) ?
-               policy->freq_table : NULL;
- }
- EXPORT_SYMBOL_GPL(cpufreq_frequency_get_table);
  static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
  {
        u64 idle_time;
@@@ -354,6 -338,7 +338,7 @@@ static void __cpufreq_notify_transition
                pr_debug("FREQ: %lu - CPU: %lu\n",
                         (unsigned long)freqs->new, (unsigned long)freqs->cpu);
                trace_cpu_frequency(freqs->new, freqs->cpu);
+               cpufreq_stats_record_transition(policy, freqs->new);
                srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
                                CPUFREQ_POSTCHANGE, freqs);
                if (likely(policy) && likely(policy->cpu == freqs->cpu))
@@@ -1115,6 -1100,7 +1100,7 @@@ static void cpufreq_policy_put_kobj(str
                                             CPUFREQ_REMOVE_POLICY, policy);
  
        down_write(&policy->rwsem);
+       cpufreq_stats_free_table(policy);
        cpufreq_remove_dev_symlink(policy);
        kobj = &policy->kobj;
        cmp = &policy->kobj_unregister;
@@@ -1265,13 -1251,12 +1251,12 @@@ static int cpufreq_online(unsigned int 
                }
        }
  
-       blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
-                                    CPUFREQ_START, policy);
        if (new_policy) {
                ret = cpufreq_add_dev_interface(policy);
                if (ret)
                        goto out_exit_policy;
+               cpufreq_stats_create_table(policy);
                blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
                                CPUFREQ_CREATE_POLICY, policy);
  
                write_unlock_irqrestore(&cpufreq_driver_lock, flags);
        }
  
+       blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
+                                    CPUFREQ_START, policy);
        ret = cpufreq_init_policy(policy);
        if (ret) {
                pr_err("%s: Failed to initialize policy for cpu: %d (%d)\n",
@@@ -1864,14 -1852,17 +1852,17 @@@ static int __target_intermediate(struc
        return ret;
  }
  
- static int __target_index(struct cpufreq_policy *policy,
-                         struct cpufreq_frequency_table *freq_table, int index)
+ static int __target_index(struct cpufreq_policy *policy, int index)
  {
        struct cpufreq_freqs freqs = {.old = policy->cur, .flags = 0};
        unsigned int intermediate_freq = 0;
+       unsigned int newfreq = policy->freq_table[index].frequency;
        int retval = -EINVAL;
        bool notify;
  
+       if (newfreq == policy->cur)
+               return 0;
        notify = !(cpufreq_driver->flags & CPUFREQ_ASYNC_NOTIFICATION);
        if (notify) {
                /* Handle switching to intermediate frequency */
                                freqs.old = freqs.new;
                }
  
-               freqs.new = freq_table[index].frequency;
+               freqs.new = newfreq;
                pr_debug("%s: cpu: %d, oldfreq: %u, new freq: %u\n",
                         __func__, policy->cpu, freqs.old, freqs.new);
  
@@@ -1923,17 -1914,13 +1914,13 @@@ int __cpufreq_driver_target(struct cpuf
                            unsigned int relation)
  {
        unsigned int old_target_freq = target_freq;
-       struct cpufreq_frequency_table *freq_table;
-       int index, retval;
+       int index;
  
        if (cpufreq_disabled())
                return -ENODEV;
  
        /* Make sure that target_freq is within supported range */
-       if (target_freq > policy->max)
-               target_freq = policy->max;
-       if (target_freq < policy->min)
-               target_freq = policy->min;
+       target_freq = clamp_val(target_freq, policy->min, policy->max);
  
        pr_debug("target for CPU %u: %u kHz, relation %u, requested %u kHz\n",
                 policy->cpu, target_freq, relation, old_target_freq);
        if (!cpufreq_driver->target_index)
                return -EINVAL;
  
-       freq_table = cpufreq_frequency_get_table(policy->cpu);
-       if (unlikely(!freq_table)) {
-               pr_err("%s: Unable to find freq_table\n", __func__);
-               return -EINVAL;
-       }
-       retval = cpufreq_frequency_table_target(policy, freq_table, target_freq,
-                                               relation, &index);
-       if (unlikely(retval)) {
-               pr_err("%s: Unable to find matching freq\n", __func__);
-               return retval;
-       }
-       if (freq_table[index].frequency == policy->cur)
-               return 0;
+       index = cpufreq_frequency_table_target(policy, target_freq, relation);
  
-       return __target_index(policy, freq_table, index);
+       return __target_index(policy, index);
  }
  EXPORT_SYMBOL_GPL(__cpufreq_driver_target);
  
@@@ -1997,7 -1970,7 +1970,7 @@@ __weak struct cpufreq_governor *cpufreq
        return NULL;
  }
  
- static int cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
+ static int cpufreq_init_governor(struct cpufreq_policy *policy)
  {
        int ret;
  
                }
        }
  
-       if (event == CPUFREQ_GOV_POLICY_INIT)
-               if (!try_module_get(policy->governor->owner))
-                       return -EINVAL;
-       pr_debug("%s: for CPU %u, event %u\n", __func__, policy->cpu, event);
+       if (!try_module_get(policy->governor->owner))
+               return -EINVAL;
  
-       ret = policy->governor->governor(policy, event);
+       pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
  
-       if (event == CPUFREQ_GOV_POLICY_INIT) {
-               if (ret)
+       if (policy->governor->init) {
+               ret = policy->governor->init(policy);
+               if (ret) {
                        module_put(policy->governor->owner);
-               else
-                       policy->governor->initialized++;
-       } else if (event == CPUFREQ_GOV_POLICY_EXIT) {
-               policy->governor->initialized--;
-               module_put(policy->governor->owner);
+                       return ret;
+               }
        }
  
-       return ret;
+       return 0;
+ }
+ static void cpufreq_exit_governor(struct cpufreq_policy *policy)
+ {
+       if (cpufreq_suspended || !policy->governor)
+               return;
+       pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
+       if (policy->governor->exit)
+               policy->governor->exit(policy);
+       module_put(policy->governor->owner);
  }
  
  static int cpufreq_start_governor(struct cpufreq_policy *policy)
  {
        int ret;
  
+       if (cpufreq_suspended)
+               return 0;
+       if (!policy->governor)
+               return -EINVAL;
+       pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
        if (cpufreq_driver->get && !cpufreq_driver->setpolicy)
                cpufreq_update_current_freq(policy);
  
-       ret = cpufreq_governor(policy, CPUFREQ_GOV_START);
-       return ret ? ret : cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+       if (policy->governor->start) {
+               ret = policy->governor->start(policy);
+               if (ret)
+                       return ret;
+       }
+       if (policy->governor->limits)
+               policy->governor->limits(policy);
+       return 0;
+ }
+ static void cpufreq_stop_governor(struct cpufreq_policy *policy)
+ {
+       if (cpufreq_suspended || !policy->governor)
+               return;
+       pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
+       if (policy->governor->stop)
+               policy->governor->stop(policy);
+ }
+ static void cpufreq_governor_limits(struct cpufreq_policy *policy)
+ {
+       if (cpufreq_suspended || !policy->governor)
+               return;
+       pr_debug("%s: for CPU %u\n", __func__, policy->cpu);
+       if (policy->governor->limits)
+               policy->governor->limits(policy);
  }
  
  int cpufreq_register_governor(struct cpufreq_governor *governor)
  
        mutex_lock(&cpufreq_governor_mutex);
  
-       governor->initialized = 0;
        err = -EBUSY;
        if (!find_governor(governor->name)) {
                err = 0;
@@@ -2195,7 -2213,8 +2213,8 @@@ static int cpufreq_set_policy(struct cp
  
        if (new_policy->governor == policy->governor) {
                pr_debug("cpufreq: governor limits update\n");
-               return cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
+               cpufreq_governor_limits(policy);
+               return 0;
        }
  
        pr_debug("governor switch\n");
  
        /* start new governor */
        policy->governor = new_policy->governor;
-       ret = cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT);
+       ret = cpufreq_init_governor(policy);
        if (!ret) {
                ret = cpufreq_start_governor(policy);
                if (!ret) {
        pr_debug("starting governor %s failed\n", policy->governor->name);
        if (old_gov) {
                policy->governor = old_gov;
-               if (cpufreq_governor(policy, CPUFREQ_GOV_POLICY_INIT))
+               if (cpufreq_init_governor(policy))
                        policy->governor = NULL;
                else
                        cpufreq_start_governor(policy);
@@@ -2261,10 -2280,6 +2280,10 @@@ int cpufreq_update_policy(unsigned int 
         * -> ask driver for current freq and notify governors about a change
         */
        if (cpufreq_driver->get && !cpufreq_driver->setpolicy) {
 +              if (cpufreq_suspended) {
 +                      ret = -EAGAIN;
 +                      goto unlock;
 +              }
                new_policy.cur = cpufreq_update_current_freq(policy);
                if (WARN_ON(!new_policy.cur)) {
                        ret = -EIO;
@@@ -2309,26 -2324,25 +2328,25 @@@ static struct notifier_block __refdata 
   *********************************************************************/
  static int cpufreq_boost_set_sw(int state)
  {
-       struct cpufreq_frequency_table *freq_table;
        struct cpufreq_policy *policy;
        int ret = -EINVAL;
  
        for_each_active_policy(policy) {
-               freq_table = cpufreq_frequency_get_table(policy->cpu);
-               if (freq_table) {
-                       ret = cpufreq_frequency_table_cpuinfo(policy,
-                                                       freq_table);
-                       if (ret) {
-                               pr_err("%s: Policy frequency update failed\n",
-                                      __func__);
-                               break;
-                       }
-                       down_write(&policy->rwsem);
-                       policy->user_policy.max = policy->max;
-                       cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
-                       up_write(&policy->rwsem);
+               if (!policy->freq_table)
+                       continue;
+               ret = cpufreq_frequency_table_cpuinfo(policy,
+                                                     policy->freq_table);
+               if (ret) {
+                       pr_err("%s: Policy frequency update failed\n",
+                              __func__);
+                       break;
                }
+               down_write(&policy->rwsem);
+               policy->user_policy.max = policy->max;
+               cpufreq_governor_limits(policy);
+               up_write(&policy->rwsem);
        }
  
        return ret;
@@@ -35,6 -35,7 +35,7 @@@
  #include <asm/msr.h>
  #include <asm/cpu_device_id.h>
  #include <asm/cpufeature.h>
+ #include <asm/intel-family.h>
  
  #define ATOM_RATIOS           0x66a
  #define ATOM_VIDS             0x66b
@@@ -281,9 -282,9 +282,9 @@@ struct cpu_defaults 
  static inline int32_t get_target_pstate_use_performance(struct cpudata *cpu);
  static inline int32_t get_target_pstate_use_cpu_load(struct cpudata *cpu);
  
- static struct pstate_adjust_policy pid_params;
- static struct pstate_funcs pstate_funcs;
- static int hwp_active;
+ static struct pstate_adjust_policy pid_params __read_mostly;
+ static struct pstate_funcs pstate_funcs __read_mostly;
+ static int hwp_active __read_mostly;
  
  #ifdef CONFIG_ACPI
  static bool acpi_ppc;
@@@ -1091,6 -1092,26 +1092,26 @@@ static struct cpu_defaults knl_params 
        },
  };
  
+ static struct cpu_defaults bxt_params = {
+       .pid_policy = {
+               .sample_rate_ms = 10,
+               .deadband = 0,
+               .setpoint = 60,
+               .p_gain_pct = 14,
+               .d_gain_pct = 0,
+               .i_gain_pct = 4,
+       },
+       .funcs = {
+               .get_max = core_get_max_pstate,
+               .get_max_physical = core_get_max_pstate_physical,
+               .get_min = core_get_min_pstate,
+               .get_turbo = core_get_turbo_pstate,
+               .get_scaling = core_get_scaling,
+               .get_val = core_get_val,
+               .get_target_pstate = get_target_pstate_use_cpu_load,
+       },
+ };
  static void intel_pstate_get_min_max(struct cpudata *cpu, int *min, int *max)
  {
        int max_perf = cpu->pstate.turbo_pstate;
@@@ -1334,29 -1355,30 +1355,30 @@@ static void intel_pstate_update_util(st
                        (unsigned long)&policy }
  
  static const struct x86_cpu_id intel_pstate_cpu_ids[] = {
-       ICPU(0x2a, core_params),
-       ICPU(0x2d, core_params),
-       ICPU(0x37, silvermont_params),
-       ICPU(0x3a, core_params),
-       ICPU(0x3c, core_params),
-       ICPU(0x3d, core_params),
-       ICPU(0x3e, core_params),
-       ICPU(0x3f, core_params),
-       ICPU(0x45, core_params),
-       ICPU(0x46, core_params),
-       ICPU(0x47, core_params),
-       ICPU(0x4c, airmont_params),
-       ICPU(0x4e, core_params),
-       ICPU(0x4f, core_params),
-       ICPU(0x5e, core_params),
-       ICPU(0x56, core_params),
-       ICPU(0x57, knl_params),
+       ICPU(INTEL_FAM6_SANDYBRIDGE,            core_params),
+       ICPU(INTEL_FAM6_SANDYBRIDGE_X,          core_params),
+       ICPU(INTEL_FAM6_ATOM_SILVERMONT1,       silvermont_params),
+       ICPU(INTEL_FAM6_IVYBRIDGE,              core_params),
+       ICPU(INTEL_FAM6_HASWELL_CORE,           core_params),
+       ICPU(INTEL_FAM6_BROADWELL_CORE,         core_params),
+       ICPU(INTEL_FAM6_IVYBRIDGE_X,            core_params),
+       ICPU(INTEL_FAM6_HASWELL_X,              core_params),
+       ICPU(INTEL_FAM6_HASWELL_ULT,            core_params),
+       ICPU(INTEL_FAM6_HASWELL_GT3E,           core_params),
+       ICPU(INTEL_FAM6_BROADWELL_GT3E,         core_params),
+       ICPU(INTEL_FAM6_ATOM_AIRMONT,           airmont_params),
+       ICPU(INTEL_FAM6_SKYLAKE_MOBILE,         core_params),
+       ICPU(INTEL_FAM6_BROADWELL_X,            core_params),
+       ICPU(INTEL_FAM6_SKYLAKE_DESKTOP,        core_params),
+       ICPU(INTEL_FAM6_BROADWELL_XEON_D,       core_params),
+       ICPU(INTEL_FAM6_XEON_PHI_KNL,           knl_params),
+       ICPU(INTEL_FAM6_ATOM_GOLDMONT,          bxt_params),
        {}
  };
  MODULE_DEVICE_TABLE(x86cpu, intel_pstate_cpu_ids);
  
- static const struct x86_cpu_id intel_pstate_cpu_oob_ids[] = {
-       ICPU(0x56, core_params),
+ static const struct x86_cpu_id intel_pstate_cpu_oob_ids[] __initconst = {
+       ICPU(INTEL_FAM6_BROADWELL_XEON_D, core_params),
        {}
  };
  
@@@ -1400,9 -1422,6 +1422,9 @@@ static void intel_pstate_set_update_uti
  {
        struct cpudata *cpu = all_cpu_data[cpu_num];
  
 +      if (cpu->update_util_set)
 +              return;
 +
        /* Prevent intel_pstate_update_util() from using stale data. */
        cpu->sample.time = 0;
        cpufreq_add_update_util_hook(cpu_num, &cpu->update_util,
@@@ -1443,6 -1462,8 +1465,6 @@@ static int intel_pstate_set_policy(stru
        if (!policy->cpuinfo.max_freq)
                return -ENODEV;
  
 -      intel_pstate_clear_update_util_hook(policy->cpu);
 -
        pr_debug("set_policy cpuinfo.max %u policy->max %u\n",
                 policy->cpuinfo.max_freq, policy->max);
  
@@@ -1575,12 -1596,12 +1597,12 @@@ static struct cpufreq_driver intel_psta
        .name           = "intel_pstate",
  };
  
- static int __initdata no_load;
- static int __initdata no_hwp;
- static int __initdata hwp_only;
- static unsigned int force_load;
+ static int no_load __initdata;
+ static int no_hwp __initdata;
+ static int hwp_only __initdata;
+ static unsigned int force_load __initdata;
  
- static int intel_pstate_msrs_not_valid(void)
+ static int __init intel_pstate_msrs_not_valid(void)
  {
        if (!pstate_funcs.get_max() ||
            !pstate_funcs.get_min() ||
        return 0;
  }
  
- static void copy_pid_params(struct pstate_adjust_policy *policy)
+ static void __init copy_pid_params(struct pstate_adjust_policy *policy)
  {
        pid_params.sample_rate_ms = policy->sample_rate_ms;
        pid_params.sample_rate_ns = pid_params.sample_rate_ms * NSEC_PER_MSEC;
        pid_params.setpoint = policy->setpoint;
  }
  
- static void copy_cpu_funcs(struct pstate_funcs *funcs)
+ static void __init copy_cpu_funcs(struct pstate_funcs *funcs)
  {
        pstate_funcs.get_max   = funcs->get_max;
        pstate_funcs.get_max_physical = funcs->get_max_physical;
  
  #ifdef CONFIG_ACPI
  
- static bool intel_pstate_no_acpi_pss(void)
+ static bool __init intel_pstate_no_acpi_pss(void)
  {
        int i;
  
        return true;
  }
  
- static bool intel_pstate_has_acpi_ppc(void)
+ static bool __init intel_pstate_has_acpi_ppc(void)
  {
        int i;
  
@@@ -1673,7 -1694,7 +1695,7 @@@ struct hw_vendor_info 
  };
  
  /* Hardware vendor-specific info that has its own power management modes */
- static struct hw_vendor_info vendor_info[] = {
+ static struct hw_vendor_info vendor_info[] __initdata = {
        {1, "HP    ", "ProLiant", PSS},
        {1, "ORACLE", "X4-2    ", PPC},
        {1, "ORACLE", "X4-2L   ", PPC},
        {0, "", ""},
  };
  
- static bool intel_pstate_platform_pwr_mgmt_exists(void)
+ static bool __init intel_pstate_platform_pwr_mgmt_exists(void)
  {
        struct acpi_table_header hdr;
        struct hw_vendor_info *v_info;