[CPUFREQ] powernow-k8: Always compile powernow-k8 driver with ACPI support
powernow-k8 driver should always try to get cpufreq info from ACPI. Otherwise it will not be able to detect the transition latency correctly which results in ondemand governor taking a wrong sampling rate which will then result in sever performance loss. Let the user not shoot himself in the foot and always compile in ACPI support for powernow-k8. This also fixes a wrong message if ACPI_PROCESSOR is compiled as a module and #ifndef CONFIG_ACPI_PROCESSOR path is chosen. Signed-off-by: Thomas Renninger <trenn@suse.de> Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
ed12978453
commit
57f4fa6991
|
@ -87,30 +87,15 @@ config X86_POWERNOW_K7_ACPI
|
||||||
config X86_POWERNOW_K8
|
config X86_POWERNOW_K8
|
||||||
tristate "AMD Opteron/Athlon64 PowerNow!"
|
tristate "AMD Opteron/Athlon64 PowerNow!"
|
||||||
select CPU_FREQ_TABLE
|
select CPU_FREQ_TABLE
|
||||||
|
depends on ACPI && ACPI_PROCESSOR
|
||||||
help
|
help
|
||||||
This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors.
|
This adds the CPUFreq driver for K8/K10 Opteron/Athlon64 processors.
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called powernow-k8.
|
module will be called powernow-k8.
|
||||||
|
|
||||||
For details, take a look at <file:Documentation/cpu-freq/>.
|
For details, take a look at <file:Documentation/cpu-freq/>.
|
||||||
|
|
||||||
If in doubt, say N.
|
|
||||||
|
|
||||||
config X86_POWERNOW_K8_ACPI
|
|
||||||
bool
|
|
||||||
prompt "ACPI Support" if X86_32
|
|
||||||
depends on ACPI && X86_POWERNOW_K8 && ACPI_PROCESSOR
|
|
||||||
depends on !(X86_POWERNOW_K8 = y && ACPI_PROCESSOR = m)
|
|
||||||
default y
|
|
||||||
help
|
|
||||||
This provides access to the K8s Processor Performance States via ACPI.
|
|
||||||
This driver is probably required for CPUFreq to work with multi-socket and
|
|
||||||
SMP systems. It is not required on at least some single-socket yet
|
|
||||||
multi-core systems, even if SMP is enabled.
|
|
||||||
|
|
||||||
It is safe to say Y here.
|
|
||||||
|
|
||||||
config X86_GX_SUSPMOD
|
config X86_GX_SUSPMOD
|
||||||
tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
|
tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
|
||||||
depends on X86_32 && PCI
|
depends on X86_32 && PCI
|
||||||
|
|
|
@ -38,11 +38,9 @@
|
||||||
|
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
|
|
||||||
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
|
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <acpi/processor.h>
|
#include <acpi/processor.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PFX "powernow-k8: "
|
#define PFX "powernow-k8: "
|
||||||
#define VERSION "version 2.20.00"
|
#define VERSION "version 2.20.00"
|
||||||
|
@ -800,7 +798,6 @@ static int find_psb_table(struct powernow_k8_data *data)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
|
|
||||||
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data,
|
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data,
|
||||||
unsigned int index)
|
unsigned int index)
|
||||||
{
|
{
|
||||||
|
@ -1030,23 +1027,6 @@ static int get_transition_latency(struct powernow_k8_data *data)
|
||||||
return 1000 * max_latency;
|
return 1000 * max_latency;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
|
||||||
{
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data,
|
|
||||||
unsigned int index)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
static int get_transition_latency(struct powernow_k8_data *data) { return 0; }
|
|
||||||
#endif /* CONFIG_X86_POWERNOW_K8_ACPI */
|
|
||||||
|
|
||||||
/* Take a frequency, and issue the fid/vid transition command */
|
/* Take a frequency, and issue the fid/vid transition command */
|
||||||
static int transition_frequency_fidvid(struct powernow_k8_data *data,
|
static int transition_frequency_fidvid(struct powernow_k8_data *data,
|
||||||
unsigned int index)
|
unsigned int index)
|
||||||
|
@ -1260,19 +1240,11 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||||
* an UP version, and is deprecated by AMD.
|
* an UP version, and is deprecated by AMD.
|
||||||
*/
|
*/
|
||||||
if (num_online_cpus() != 1) {
|
if (num_online_cpus() != 1) {
|
||||||
#ifndef CONFIG_ACPI_PROCESSOR
|
|
||||||
printk(KERN_ERR PFX
|
|
||||||
"ACPI Processor support is required for "
|
|
||||||
"SMP systems but is absent. Please load the "
|
|
||||||
"ACPI Processor module before starting this "
|
|
||||||
"driver.\n");
|
|
||||||
#else
|
|
||||||
printk(KERN_ERR FW_BUG PFX "Your BIOS does not provide"
|
printk(KERN_ERR FW_BUG PFX "Your BIOS does not provide"
|
||||||
" ACPI _PSS objects in a way that Linux "
|
" ACPI _PSS objects in a way that Linux "
|
||||||
"understands. Please report this to the Linux "
|
"understands. Please report this to the Linux "
|
||||||
"ACPI maintainers and complain to your BIOS "
|
"ACPI maintainers and complain to your BIOS "
|
||||||
"vendor.\n");
|
"vendor.\n");
|
||||||
#endif
|
|
||||||
kfree(data);
|
kfree(data);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,11 +45,10 @@ struct powernow_k8_data {
|
||||||
* frequency is in kHz */
|
* frequency is in kHz */
|
||||||
struct cpufreq_frequency_table *powernow_table;
|
struct cpufreq_frequency_table *powernow_table;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
|
|
||||||
/* the acpi table needs to be kept. it's only available if ACPI was
|
/* the acpi table needs to be kept. it's only available if ACPI was
|
||||||
* used to determine valid frequency/vid/fid states */
|
* used to determine valid frequency/vid/fid states */
|
||||||
struct acpi_processor_performance acpi_data;
|
struct acpi_processor_performance acpi_data;
|
||||||
#endif
|
|
||||||
/* we need to keep track of associated cores, but let cpufreq
|
/* we need to keep track of associated cores, but let cpufreq
|
||||||
* handle hotplug events - so just point at cpufreq pol->cpus
|
* handle hotplug events - so just point at cpufreq pol->cpus
|
||||||
* structure */
|
* structure */
|
||||||
|
@ -222,10 +221,8 @@ static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid);
|
||||||
|
|
||||||
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index);
|
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
|
|
||||||
static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
|
static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
|
||||||
static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
|
static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpufreq_frequency_table *powernow_table);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
|
static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
|
||||||
|
|
Loading…
Reference in New Issue