]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
acpi-cpufreq: Add compatibility for legacy AMD cpb sysfs knob
authorAndre Przywara <andre.przywara@amd.com>
Tue, 4 Sep 2012 08:28:08 +0000 (08:28 +0000)
committerRafael J. Wysocki <rjw@sisk.pl>
Sun, 9 Sep 2012 20:05:20 +0000 (22:05 +0200)
The powernow-k8 driver supported a sysfs knob called "cpb", which was
instantiated per CPU, but actually acted globally for the whole
system. To keep some compatibility with this feature, we re-introduce
this behavior here, but:
a) only enable it on AMD CPUs and
b) protect it with a Kconfig switch

I'd like to consider this feature obsolete. Lets keep it around for
some kernel versions and then phase it out.

Signed-off-by: Andre Przywara <andre.przywara@amd.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
drivers/cpufreq/Kconfig.x86
drivers/cpufreq/acpi-cpufreq.c

index b36ca1f68bff006a2e76875c33286680b4c34889..934854ae5eb4a436205d644c76c8011a5c41de3e 100644 (file)
@@ -33,6 +33,18 @@ config X86_ACPI_CPUFREQ
 
          If in doubt, say N.
 
+config X86_ACPI_CPUFREQ_CPB
+       default y
+       bool "Legacy cpb sysfs knob support for AMD CPUs"
+       depends on X86_ACPI_CPUFREQ && CPU_SUP_AMD
+       help
+         The powernow-k8 driver used to provide a sysfs knob called "cpb"
+         to disable the Core Performance Boosting feature of AMD CPUs. This
+         file has now been superseeded by the more generic "boost" entry.
+
+         By enabling this option the acpi_cpufreq driver provides the old
+         entry in addition to the new boost ones, for compatibility reasons.
+
 config ELAN_CPUFREQ
        tristate "AMD Elan SC400 and SC410"
        select CPU_FREQ_TABLE
index dffa7af1db71638f0a16a7c3c5392e0c39b07f7b..0d048f6a2b23a3bf9476a658cac846ccd321bd3c 100644 (file)
@@ -133,8 +133,7 @@ static void boost_set_msrs(bool enable, const struct cpumask *cpumask)
        wrmsr_on_cpus(cpumask, msr_addr, msrs);
 }
 
-static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
-                                 const char *buf, size_t count)
+static ssize_t _store_boost(const char *buf, size_t count)
 {
        int ret;
        unsigned long val = 0;
@@ -161,6 +160,12 @@ static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
        return count;
 }
 
+static ssize_t store_global_boost(struct kobject *kobj, struct attribute *attr,
+                                 const char *buf, size_t count)
+{
+       return _store_boost(buf, count);
+}
+
 static ssize_t show_global_boost(struct kobject *kobj,
                                 struct attribute *attr, char *buf)
 {
@@ -171,6 +176,21 @@ static struct global_attr global_boost = __ATTR(boost, 0644,
                                                show_global_boost,
                                                store_global_boost);
 
+#ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
+                        size_t count)
+{
+       return _store_boost(buf, count);
+}
+
+static ssize_t show_cpb(struct cpufreq_policy *policy, char *buf)
+{
+       return sprintf(buf, "%u\n", boost_enabled);
+}
+
+static struct freq_attr cpb = __ATTR(cpb, 0644, show_cpb, store_cpb);
+#endif
+
 static int check_est_cpu(unsigned int cpuid)
 {
        struct cpuinfo_x86 *cpu = &cpu_data(cpuid);
@@ -889,6 +909,7 @@ static int acpi_cpufreq_resume(struct cpufreq_policy *policy)
 
 static struct freq_attr *acpi_cpufreq_attr[] = {
        &cpufreq_freq_attr_scaling_available_freqs,
+       NULL,   /* this is a placeholder for cpb, do not remove */
        NULL,
 };
 
@@ -960,6 +981,27 @@ static int __init acpi_cpufreq_init(void)
        if (ret)
                return ret;
 
+#ifdef CONFIG_X86_ACPI_CPUFREQ_CPB
+       /* this is a sysfs file with a strange name and an even stranger
+        * semantic - per CPU instantiation, but system global effect.
+        * Lets enable it only on AMD CPUs for compatibility reasons and
+        * only if configured. This is considered legacy code, which
+        * will probably be removed at some point in the future.
+        */
+       if (check_amd_hwpstate_cpu(0)) {
+               struct freq_attr **iter;
+
+               pr_debug("adding sysfs entry for cpb\n");
+
+               for (iter = acpi_cpufreq_attr; *iter != NULL; iter++)
+                       ;
+
+               /* make sure there is a terminator behind it */
+               if (iter[1] == NULL)
+                       *iter = &cpb;
+       }
+#endif
+
        ret = cpufreq_register_driver(&acpi_cpufreq_driver);
        if (ret)
                free_acpi_perf_data();