* [PATCH 1/5] Unify ACPI bits on speedstep-centrino and acpi-cpufreq
@ 2006-09-01 21:07 Venkatesh Pallipadi
2006-09-27 2:40 ` [1/5] reorganizes & code cleaning in acpi-cpufreq Dave Jones
0 siblings, 1 reply; 7+ messages in thread
From: Venkatesh Pallipadi @ 2006-09-01 21:07 UTC (permalink / raw)
To: Dave Jones; +Cc: alexey.y.starikovskiy, cpufreq, Dominik Brodowski
Some clean up and redsign of the driver. Mainly making it easier to add
support for multiple sub-mechanisms of changing frequency. Currently this
driver supports only ACPI SYSTEM_IO address space. With the changes
below it is easier to add support for other address spaces like Intel
Enhanced Speedstep which uses MSR (ACPI FIXED_FEATURE_HARDWARE) to do the
transitions.
Signed-off-by: Denis Sadykov <denis.m.sadykov@intel.com>
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>
Index: linux-2.6.18-rc4/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
===================================================================
--- linux-2.6.18-rc4.orig/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ linux-2.6.18-rc4/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -1,9 +1,10 @@
/*
- * acpi-cpufreq.c - ACPI Processor P-States Driver ($Revision: 1.3 $)
+ * acpi-cpufreq.c - ACPI Processor P-States Driver ($Revision: 1.4 $)
*
* Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
* Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
* Copyright (C) 2002 - 2004 Dominik Brodowski <linux@brodo.de>
+ * Copyright (C) 2006 Denis Sadykov <denis.m.sadykov@intel.com>
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
@@ -24,22 +25,26 @@
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
+#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/sched.h>
#include <linux/cpufreq.h>
-#include <linux/proc_fs.h>
-#include <linux/seq_file.h>
#include <linux/compiler.h>
#include <linux/sched.h> /* current */
#include <linux/dmi.h>
-#include <asm/io.h>
-#include <asm/delay.h>
-#include <asm/uaccess.h>
#include <linux/acpi.h>
#include <acpi/processor.h>
+#include <asm/io.h>
+#include <asm/processor.h>
+#include <asm/cpufeature.h>
+#include <asm/delay.h>
+#include <asm/uaccess.h>
+
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "acpi-cpufreq", msg)
MODULE_AUTHOR("Paul Diefenbaugh, Dominik Brodowski");
@@ -47,24 +52,35 @@ MODULE_DESCRIPTION("ACPI Processor P-Sta
MODULE_LICENSE("GPL");
-struct cpufreq_acpi_io {
+struct acpi_cpufreq_data {
struct acpi_processor_performance *acpi_data;
struct cpufreq_frequency_table *freq_table;
unsigned int resume;
};
-static struct cpufreq_acpi_io *acpi_io_data[NR_CPUS];
+static struct acpi_cpufreq_data *drv_data[NR_CPUS];
static struct acpi_processor_performance *acpi_perf_data[NR_CPUS];
static struct cpufreq_driver acpi_cpufreq_driver;
static unsigned int acpi_pstate_strict;
-static int
-acpi_processor_write_port(
- u16 port,
- u8 bit_width,
- u32 value)
+static unsigned extract_freq(u32 value, struct acpi_cpufreq_data *data)
+{
+ struct acpi_processor_performance *perf;
+ int i;
+
+ perf = data->acpi_data;
+
+ for (i = 0; i < perf->state_count; i++) {
+ if (value == perf->states[i].status)
+ return data->freq_table[i].frequency;
+ }
+ return 0;
+}
+
+
+static void wrport(u16 port, u8 bit_width, u32 value)
{
if (bit_width <= 8) {
outb(value, port);
@@ -72,17 +88,10 @@ acpi_processor_write_port(
outw(value, port);
} else if (bit_width <= 32) {
outl(value, port);
- } else {
- return -ENODEV;
}
- return 0;
}
-static int
-acpi_processor_read_port(
- u16 port,
- u8 bit_width,
- u32 *ret)
+static void rdport(u16 port, u8 bit_width, u32 *ret)
{
*ret = 0;
if (bit_width <= 8) {
@@ -91,139 +100,141 @@ acpi_processor_read_port(
*ret = inw(port);
} else if (bit_width <= 32) {
*ret = inl(port);
- } else {
- return -ENODEV;
}
- return 0;
}
-static int
-acpi_processor_set_performance (
- struct cpufreq_acpi_io *data,
- unsigned int cpu,
- int state)
-{
- u16 port = 0;
- u8 bit_width = 0;
- int i = 0;
- int ret = 0;
- u32 value = 0;
- int retval;
- struct acpi_processor_performance *perf;
+struct io_addr {
+ u16 port;
+ u8 bit_width;
+};
- dprintk("acpi_processor_set_performance\n");
+struct drv_cmd {
+ cpumask_t mask;
+ struct io_addr addr;
+ u32 val;
+};
- retval = 0;
- perf = data->acpi_data;
- if (state == perf->state) {
- if (unlikely(data->resume)) {
- dprintk("Called after resume, resetting to P%d\n", state);
- data->resume = 0;
- } else {
- dprintk("Already at target state (P%d)\n", state);
- return (retval);
- }
- }
+static void do_drv_read(struct drv_cmd *cmd)
+{
+ rdport(cmd->addr.port, cmd->addr.bit_width, &cmd->val);
+ return;
+}
- dprintk("Transitioning from P%d to P%d\n", perf->state, state);
+static void do_drv_write(struct drv_cmd *cmd)
+{
+ wrport(cmd->addr.port, cmd->addr.bit_width, cmd->val);
+ return;
+}
- /*
- * First we write the target state's 'control' value to the
- * control_register.
- */
+static inline void drv_read(struct drv_cmd *cmd)
+{
+ cpumask_t saved_mask = current->cpus_allowed;
+ cmd->val = 0;
- port = perf->control_register.address;
- bit_width = perf->control_register.bit_width;
- value = (u32) perf->states[state].control;
-
- dprintk("Writing 0x%08x to port 0x%04x\n", value, port);
-
- ret = acpi_processor_write_port(port, bit_width, value);
- if (ret) {
- dprintk("Invalid port width 0x%04x\n", bit_width);
- return (ret);
- }
+ set_cpus_allowed(current, cmd->mask);
+ do_drv_read(cmd);
+ set_cpus_allowed(current, saved_mask);
- /*
- * Assume the write went through when acpi_pstate_strict is not used.
- * As read status_register is an expensive operation and there
- * are no specific error cases where an IO port write will fail.
- */
- if (acpi_pstate_strict) {
- /* Then we read the 'status_register' and compare the value
- * with the target state's 'status' to make sure the
- * transition was successful.
- * Note that we'll poll for up to 1ms (100 cycles of 10us)
- * before giving up.
- */
-
- port = perf->status_register.address;
- bit_width = perf->status_register.bit_width;
-
- dprintk("Looking for 0x%08x from port 0x%04x\n",
- (u32) perf->states[state].status, port);
-
- for (i = 0; i < 100; i++) {
- ret = acpi_processor_read_port(port, bit_width, &value);
- if (ret) {
- dprintk("Invalid port width 0x%04x\n", bit_width);
- return (ret);
- }
- if (value == (u32) perf->states[state].status)
- break;
- udelay(10);
- }
- } else {
- value = (u32) perf->states[state].status;
+}
+
+static void drv_write(struct drv_cmd *cmd)
+{
+ cpumask_t saved_mask = current->cpus_allowed;
+ unsigned int i;
+
+ for_each_cpu_mask(i, cmd->mask) {
+ set_cpus_allowed(current, cpumask_of_cpu(i));
+ do_drv_write(cmd);
}
- if (unlikely(value != (u32) perf->states[state].status)) {
- printk(KERN_WARNING "acpi-cpufreq: Transition failed\n");
- retval = -ENODEV;
- return (retval);
+ set_cpus_allowed(current, saved_mask);
+ return;
+}
+
+static u32 get_cur_val(cpumask_t mask)
+{
+ struct acpi_processor_performance *perf;
+ struct drv_cmd cmd;
+
+ if (unlikely(cpus_empty(mask)))
+ return 0;
+
+ perf = drv_data[first_cpu(mask)]->acpi_data;
+ cmd.addr.port = perf->control_register.address;
+ cmd.addr.bit_width = perf->control_register.bit_width;
+ cmd.mask = mask;
+
+ drv_read(&cmd);
+
+ dprintk("get_cur_val = %u\n", cmd.val);
+
+ return cmd.val;
+}
+
+static unsigned int get_cur_freq_on_cpu(unsigned int cpu)
+{
+ struct acpi_cpufreq_data *data = drv_data[cpu];
+ unsigned int freq;
+
+ dprintk("get_cur_freq_on_cpu (%d)\n", cpu);
+
+ if (unlikely(data == NULL ||
+ data->acpi_data == NULL ||
+ data->freq_table == NULL)) {
+ return 0;
}
- dprintk("Transition successful after %d microseconds\n", i * 10);
+ freq = extract_freq(get_cur_val(cpumask_of_cpu(cpu)), data);
+ dprintk("cur freq = %u\n", freq);
- perf->state = state;
- return (retval);
+ return freq;
}
+static unsigned int check_freqs(cpumask_t mask, unsigned int freq,
+ struct acpi_cpufreq_data *data)
+{
+ unsigned int cur_freq;
+ unsigned int i;
-static int
-acpi_cpufreq_target (
- struct cpufreq_policy *policy,
- unsigned int target_freq,
- unsigned int relation)
-{
- struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
- struct cpufreq_acpi_io *cpudata;
- struct acpi_processor_performance *perf;
- struct cpufreq_freqs freqs;
- cpumask_t online_policy_cpus;
- cpumask_t saved_mask;
- cpumask_t set_mask;
- cpumask_t covered_cpus;
- unsigned int cur_state = 0;
- unsigned int next_state = 0;
- unsigned int result = 0;
- unsigned int j;
- unsigned int tmp;
+ for (i = 0; i < 100; i++) {
+ cur_freq = extract_freq(get_cur_val(mask), data);
+ if (cur_freq == freq)
+ return 1;
+ udelay(10);
+ }
+ return 0;
+}
- dprintk("acpi_cpufreq_setpolicy\n");
+static int acpi_cpufreq_target(struct cpufreq_policy *policy,
+ unsigned int target_freq,
+ unsigned int relation)
+{
+ struct acpi_cpufreq_data *data = drv_data[policy->cpu];
+ struct acpi_processor_performance *perf;
+ struct cpufreq_freqs freqs;
+ cpumask_t online_policy_cpus;
+ struct drv_cmd cmd;
+ unsigned int next_state = 0;
+ unsigned int next_perf_state = 0;
+ unsigned int i;
+ int result = 0;
+
+ dprintk("acpi_cpufreq_target %d (%d)\n", target_freq, policy->cpu);
+
+ if (unlikely(data == NULL ||
+ data->acpi_data == NULL ||
+ data->freq_table == NULL)) {
+ return -ENODEV;
+ }
+ perf = data->acpi_data;
result = cpufreq_frequency_table_target(policy,
- data->freq_table,
- target_freq,
- relation,
- &next_state);
+ data->freq_table,
+ target_freq,
+ relation,
+ &next_state);
if (unlikely(result))
- return (result);
-
- perf = data->acpi_data;
- cur_state = perf->state;
- freqs.old = data->freq_table[cur_state].frequency;
- freqs.new = data->freq_table[next_state].frequency;
+ return -ENODEV;
#ifdef CONFIG_HOTPLUG_CPU
/* cpufreq holds the hotplug lock, so we are safe from here on */
@@ -232,85 +243,53 @@ acpi_cpufreq_target (
online_policy_cpus = policy->cpus;
#endif
- for_each_cpu_mask(j, online_policy_cpus) {
- freqs.cpu = j;
- cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
- }
-
- /*
- * We need to call driver->target() on all or any CPU in
- * policy->cpus, depending on policy->shared_type.
- */
- saved_mask = current->cpus_allowed;
- cpus_clear(covered_cpus);
- for_each_cpu_mask(j, online_policy_cpus) {
- /*
- * Support for SMP systems.
- * Make sure we are running on CPU that wants to change freq
- */
- cpus_clear(set_mask);
- if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
- cpus_or(set_mask, set_mask, online_policy_cpus);
- else
- cpu_set(j, set_mask);
-
- set_cpus_allowed(current, set_mask);
- if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) {
- dprintk("couldn't limit to CPUs in this domain\n");
- result = -EAGAIN;
- break;
+ cmd.val = get_cur_val(online_policy_cpus);
+ freqs.old = extract_freq(cmd.val, data);
+ freqs.new = data->freq_table[next_state].frequency;
+ next_perf_state = data->freq_table[next_state].index;
+ if (freqs.new == freqs.old) {
+ if (unlikely(data->resume)) {
+ dprintk("Called after resume, resetting to P%d\n", next_perf_state);
+ data->resume = 0;
+ } else {
+ dprintk("Already at target state (P%d)\n", next_perf_state);
+ return 0;
}
+ }
- cpudata = acpi_io_data[j];
- result = acpi_processor_set_performance(cpudata, j, next_state);
- if (result) {
- result = -EAGAIN;
- break;
- }
+ cmd.addr.port = perf->control_register.address;
+ cmd.addr.bit_width = perf->control_register.bit_width;
+ cmd.val = (u32) perf->states[next_perf_state].control;
+
+ cpus_clear(cmd.mask);
+
+ if (policy->shared_type != CPUFREQ_SHARED_TYPE_ANY)
+ cmd.mask = online_policy_cpus;
+ else
+ cpu_set(policy->cpu, cmd.mask);
- if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
- break;
-
- cpu_set(j, covered_cpus);
+ for_each_cpu_mask(i, cmd.mask) {
+ freqs.cpu = i;
+ cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
}
- for_each_cpu_mask(j, online_policy_cpus) {
- freqs.cpu = j;
- cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
- }
+ drv_write(&cmd);
- if (unlikely(result)) {
- /*
- * We have failed halfway through the frequency change.
- * We have sent callbacks to online_policy_cpus and
- * acpi_processor_set_performance() has been called on
- * coverd_cpus. Best effort undo..
- */
-
- if (!cpus_empty(covered_cpus)) {
- for_each_cpu_mask(j, covered_cpus) {
- cpus_clear(set_mask);
- cpu_set(j, set_mask);
- set_cpus_allowed(current, set_mask);
- cpudata = acpi_io_data[j];
- acpi_processor_set_performance(cpudata,
- j,
- cur_state);
- }
+ if (acpi_pstate_strict) {
+ if (!check_freqs(cmd.mask, freqs.new, data)) {
+ dprintk("acpi_cpufreq_target failed (%d)\n",
+ policy->cpu);
+ return -EAGAIN;
}
+ }
- tmp = freqs.new;
- freqs.new = freqs.old;
- freqs.old = tmp;
- for_each_cpu_mask(j, online_policy_cpus) {
- freqs.cpu = j;
- cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
- cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
- }
+ for_each_cpu_mask(i, cmd.mask) {
+ freqs.cpu = i;
+ cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
}
+ perf->state = next_perf_state;
- set_cpus_allowed(current, saved_mask);
- return (result);
+ return result;
}
@@ -318,21 +297,17 @@ static int
acpi_cpufreq_verify (
struct cpufreq_policy *policy)
{
- unsigned int result = 0;
- struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
+ struct acpi_cpufreq_data *data = drv_data[policy->cpu];
dprintk("acpi_cpufreq_verify\n");
- result = cpufreq_frequency_table_verify(policy,
- data->freq_table);
-
- return (result);
+ return cpufreq_frequency_table_verify(policy, data->freq_table);
}
static unsigned long
acpi_cpufreq_guess_freq (
- struct cpufreq_acpi_io *data,
+ struct acpi_cpufreq_data *data,
unsigned int cpu)
{
struct acpi_processor_performance *perf = data->acpi_data;
@@ -369,9 +344,10 @@ acpi_cpufreq_guess_freq (
* do _PDC and _PSD and find out the processor dependency for the
* actual init that will happen later...
*/
-static int acpi_cpufreq_early_init_acpi(void)
+static int acpi_cpufreq_early_init(void)
{
struct acpi_processor_performance *data;
+ cpumask_t covered;
unsigned int i, j;
dprintk("acpi_cpufreq_early_init\n");
@@ -380,17 +356,19 @@ static int acpi_cpufreq_early_init_acpi(
data = kzalloc(sizeof(struct acpi_processor_performance),
GFP_KERNEL);
if (!data) {
- for_each_possible_cpu(j) {
+ for_each_cpu_mask(j, covered) {
kfree(acpi_perf_data[j]);
acpi_perf_data[j] = NULL;
}
return (-ENOMEM);
}
acpi_perf_data[i] = data;
+ cpu_set(i, covered);
}
/* Do initialization in ACPI core */
- return acpi_processor_preregister_performance(acpi_perf_data);
+ acpi_processor_preregister_performance(acpi_perf_data);
+ return 0;
}
/*
@@ -424,11 +402,12 @@ static int
acpi_cpufreq_cpu_init (
struct cpufreq_policy *policy)
{
- unsigned int i;
- unsigned int cpu = policy->cpu;
- struct cpufreq_acpi_io *data;
- unsigned int result = 0;
- struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
+ unsigned int i;
+ unsigned int valid_states = 0;
+ unsigned int cpu = policy->cpu;
+ struct acpi_cpufreq_data *data;
+ unsigned int result = 0;
+ struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
struct acpi_processor_performance *perf;
dprintk("acpi_cpufreq_cpu_init\n");
@@ -436,15 +415,18 @@ acpi_cpufreq_cpu_init (
if (!acpi_perf_data[cpu])
return (-ENODEV);
- data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
+ data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL);
if (!data)
return (-ENOMEM);
data->acpi_data = acpi_perf_data[cpu];
- acpi_io_data[cpu] = data;
+ drv_data[cpu] = data;
- result = acpi_processor_register_performance(data->acpi_data, cpu);
+ if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) {
+ acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS;
+ }
+ result = acpi_processor_register_performance(data->acpi_data, cpu);
if (result)
goto err_free;
@@ -467,10 +449,6 @@ acpi_cpufreq_cpu_init (
}
#endif
- if (cpu_has(c, X86_FEATURE_CONSTANT_TSC)) {
- acpi_cpufreq_driver.flags |= CPUFREQ_CONST_LOOPS;
- }
-
/* capability check */
if (perf->state_count <= 1) {
dprintk("No P-States\n");
@@ -478,16 +456,22 @@ acpi_cpufreq_cpu_init (
goto err_unreg;
}
- if ((perf->control_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO) ||
- (perf->status_register.space_id != ACPI_ADR_SPACE_SYSTEM_IO)) {
- dprintk("Unsupported address space [%d, %d]\n",
- (u32) (perf->control_register.space_id),
- (u32) (perf->status_register.space_id));
+ if (perf->control_register.space_id != perf->status_register.space_id) {
+ result = -ENODEV;
+ goto err_unreg;
+ }
+
+ switch (perf->control_register.space_id) {
+ case ACPI_ADR_SPACE_SYSTEM_IO:
+ dprintk("SYSTEM IO addr space\n");
+ break;
+ default:
+ dprintk("Unknown addr space %d\n",
+ (u32) (perf->control_register.space_id));
result = -ENODEV;
goto err_unreg;
}
- /* alloc freq_table */
data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * (perf->state_count + 1), GFP_KERNEL);
if (!data->freq_table) {
result = -ENOMEM;
@@ -506,14 +490,18 @@ acpi_cpufreq_cpu_init (
policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
/* table init */
- for (i=0; i<=perf->state_count; i++)
+ for (i=0; i<perf->state_count; i++)
{
- data->freq_table[i].index = i;
- if (i<perf->state_count)
- data->freq_table[i].frequency = perf->states[i].core_frequency * 1000;
- else
- data->freq_table[i].frequency = CPUFREQ_TABLE_END;
+ if ( i > 0 && perf->states[i].core_frequency ==
+ perf->states[i - 1].core_frequency)
+ continue;
+
+ data->freq_table[valid_states].index = i;
+ data->freq_table[valid_states].frequency =
+ perf->states[i].core_frequency * 1000;
+ valid_states++;
}
+ data->freq_table[perf->state_count].frequency = CPUFREQ_TABLE_END;
result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table);
if (result) {
@@ -523,8 +511,7 @@ acpi_cpufreq_cpu_init (
/* notify BIOS that we exist */
acpi_processor_notify_smm(THIS_MODULE);
- printk(KERN_INFO "acpi-cpufreq: CPU%u - ACPI performance management activated.\n",
- cpu);
+ dprintk("CPU%u - ACPI performance management activated.\n", cpu);
for (i = 0; i < perf->state_count; i++)
dprintk(" %cP%d: %d MHz, %d mW, %d uS\n",
(i == perf->state?'*':' '), i,
@@ -540,7 +527,7 @@ acpi_cpufreq_cpu_init (
*/
data->resume = 1;
- return (result);
+ return result;
err_freqfree:
kfree(data->freq_table);
@@ -548,7 +535,7 @@ acpi_cpufreq_cpu_init (
acpi_processor_unregister_performance(perf, cpu);
err_free:
kfree(data);
- acpi_io_data[cpu] = NULL;
+ drv_data[cpu] = NULL;
return (result);
}
@@ -558,14 +545,14 @@ static int
acpi_cpufreq_cpu_exit (
struct cpufreq_policy *policy)
{
- struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
+ struct acpi_cpufreq_data *data = drv_data[policy->cpu];
dprintk("acpi_cpufreq_cpu_exit\n");
if (data) {
cpufreq_frequency_table_put_attr(policy->cpu);
- acpi_io_data[policy->cpu] = NULL;
+ drv_data[policy->cpu] = NULL;
acpi_processor_unregister_performance(data->acpi_data, policy->cpu);
kfree(data);
}
@@ -577,7 +564,7 @@ static int
acpi_cpufreq_resume (
struct cpufreq_policy *policy)
{
- struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
+ struct acpi_cpufreq_data *data = drv_data[policy->cpu];
dprintk("acpi_cpufreq_resume\n");
@@ -596,6 +583,7 @@ static struct freq_attr* acpi_cpufreq_at
static struct cpufreq_driver acpi_cpufreq_driver = {
.verify = acpi_cpufreq_verify,
.target = acpi_cpufreq_target,
+ .get = get_cur_freq_on_cpu,
.init = acpi_cpufreq_cpu_init,
.exit = acpi_cpufreq_cpu_exit,
.resume = acpi_cpufreq_resume,
@@ -611,7 +599,7 @@ acpi_cpufreq_init (void)
{
dprintk("acpi_cpufreq_init\n");
- acpi_cpufreq_early_init_acpi();
+ acpi_cpufreq_early_init();
return cpufreq_register_driver(&acpi_cpufreq_driver);
}
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [1/5] reorganizes & code cleaning in acpi-cpufreq
2006-09-01 21:07 [PATCH 1/5] Unify ACPI bits on speedstep-centrino and acpi-cpufreq Venkatesh Pallipadi
@ 2006-09-27 2:40 ` Dave Jones
2006-09-27 2:41 ` Dave Jones
0 siblings, 1 reply; 7+ messages in thread
From: Dave Jones @ 2006-09-27 2:40 UTC (permalink / raw)
To: Venkatesh Pallipadi; +Cc: alexey.y.starikovskiy, cpufreq, Dominik Brodowski
On Fri, Sep 01, 2006 at 02:07:53PM -0700, Venkatesh Pallipadi wrote:
> Some clean up and redsign of the driver. Mainly making it easier to add
> support for multiple sub-mechanisms of changing frequency. Currently this
> driver supports only ACPI SYSTEM_IO address space. With the changes
> below it is easier to add support for other address spaces like Intel
> Enhanced Speedstep which uses MSR (ACPI FIXED_FEATURE_HARDWARE) to do the
> transitions.
This patch-series fell at the first hurdle.
error: patch failed: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c:91
error: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c: patch does not apply
When you repost rediffed patchset, please make the subject of each patch
in the series a unique description, as this gets used in the shortlog.
As this series failed, your subsequent patches
acpi-cpufreq: Make cpuinfo_cur_freq work again
and
Use IA32_APERF and IA32_MPERF and get freq feedback from hardware
also failed. If you want to fold those into the other changes, or
just send a complete rediffed 7-series patchset, I'll apply those.
Dave
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [1/5] reorganizes & code cleaning in acpi-cpufreq
2006-09-27 2:40 ` [1/5] reorganizes & code cleaning in acpi-cpufreq Dave Jones
@ 2006-09-27 2:41 ` Dave Jones
2006-10-01 13:41 ` Venkatesh Pallipadi
0 siblings, 1 reply; 7+ messages in thread
From: Dave Jones @ 2006-09-27 2:41 UTC (permalink / raw)
To: Venkatesh Pallipadi; +Cc: alexey.y.starikovskiy, cpufreq, Dominik Brodowski
On Fri, Sep 01, 2006 at 02:07:53PM -0700, Venkatesh Pallipadi wrote:
> Some clean up and redsign of the driver. Mainly making it easier to add
> support for multiple sub-mechanisms of changing frequency. Currently this
> driver supports only ACPI SYSTEM_IO address space. With the changes
> below it is easier to add support for other address spaces like Intel
> Enhanced Speedstep which uses MSR (ACPI FIXED_FEATURE_HARDWARE) to do the
> transitions.
This patch-series fell at the first hurdle.
error: patch failed: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c:91
error: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c: patch does not apply
When you repost rediffed patchset, please make the subject of each patch
in the series a unique description, as this gets used in the shortlog.
As this series failed, your subsequent patches
acpi-cpufreq: Make cpuinfo_cur_freq work again
and
Use IA32_APERF and IA32_MPERF and get freq feedback from hardware
also failed. If you want to fold those into the other changes, or
just send a complete rediffed 7-series patchset, I'll apply those.
Dave
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [1/5] reorganizes & code cleaning in acpi-cpufreq
2006-09-27 2:41 ` Dave Jones
@ 2006-10-01 13:41 ` Venkatesh Pallipadi
2006-10-01 14:05 ` [PATCH 1/8]cpufreq: acpi-cpufreq: software coordination and handle all CPUs in the group Venkatesh Pallipadi
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Venkatesh Pallipadi @ 2006-10-01 13:41 UTC (permalink / raw)
To: Dave Jones; +Cc: alexey.y.starikovskiy, cpufreq, Dominik Brodowski
On Tue, Sep 26, 2006 at 10:41:48PM -0400, Dave Jones wrote:
> On Fri, Sep 01, 2006 at 02:07:53PM -0700, Venkatesh Pallipadi wrote:
>
> > Some clean up and redsign of the driver. Mainly making it easier to add
> > support for multiple sub-mechanisms of changing frequency. Currently this
> > driver supports only ACPI SYSTEM_IO address space. With the changes
> > below it is easier to add support for other address spaces like Intel
> > Enhanced Speedstep which uses MSR (ACPI FIXED_FEATURE_HARDWARE) to do the
> > transitions.
>
> This patch-series fell at the first hurdle.
>
> error: patch failed: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c:91
> error: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c: patch does not apply
>
This reject was coming from one earlier patch that hasn't gone it yet. The earlier bug fix patch had subject "acpi-cpufreq and software coordination".
> When you repost rediffed patchset, please make the subject of each patch
> in the series a unique description, as this gets used in the shortlog.
>
> As this series failed, your subsequent patches
> acpi-cpufreq: Make cpuinfo_cur_freq work again
> and
> Use IA32_APERF and IA32_MPERF and get freq feedback from hardware
>
> also failed. If you want to fold those into the other changes, or
> just send a complete rediffed 7-series patchset, I'll apply those.
>
OK. Did refresh of all these patches with 2.6.18-git. Will send a 8 patch
patchset now.
Thanks,
Venki
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/8]cpufreq: acpi-cpufreq: software coordination and handle all CPUs in the group
2006-10-01 13:41 ` Venkatesh Pallipadi
@ 2006-10-01 14:05 ` Venkatesh Pallipadi
2006-10-01 14:13 ` [PATCH 5/8]cpufreq: acpi-cpufreq: lindent acpi-cpufreq.c Venkatesh Pallipadi
2006-10-01 19:21 ` [1/5] reorganizes & code cleaning in acpi-cpufreq Dave Jones
2 siblings, 0 replies; 7+ messages in thread
From: Venkatesh Pallipadi @ 2006-10-01 14:05 UTC (permalink / raw)
To: Dave Jones; +Cc: Starikovskiy, Alexey Y, cpufreq, Dominik Brodowski
This patchset has refresh/rebase of a bunch of patches/bugfixes related to
acpi-cpufreq that were sent earlier on this list.
patch 1/8
Patch that fixes a bug in swcoordination code in acpi-cpufreq
patch 2/8 through patch 7/8
Grand unification of ACPI based speedstep-centrino and acpi-cpufreq drivers.
ACPI allows P-state transitions in multiple ways. Like using IO ports or using
processor native method (MSR). Without this patch, IO port based P-state
transitions are handled in acpi-cpufreq driver and MSR based transitions on
Intel CPUs are handled in speedstep-centrino driver. Even though most of the
code in these two drivers should be similar, except for final changing/checking
of frequency (one driver does it using IO port and other does it through
MSR), we have duplicated code in these two drivers. There are also issues
around BIOSes supporting both MSR and IO port and which driver should be
loaded first in standard installations.
The patchset combines functionality of these two driver into acpi-cpufreq
driver. ACPI based functionality in speedstep-centrino is marked deprecated
and will be removed in future. speedstep-centrino will continue to work
on systems that depend on older non-ACPI table based P-state chanes.
* 2/8 - Patch that reorganizes the code in acpi-cpufreq, cleaning it up
a little and making it easier to add MSR support later.
* 3/8 - Pull in the MSR based transition support into acpi-cpufreq.
* 4/8 - Mark speedstep-centrino deprecated. Change the order in Makefile to
load acpi-cpufreq first and speedstep-centrino later, in cases where both
are configured in.
* 5/8 - lindent acpi-cpufreq.c
* 6/8 - Minor change to eliminate the check of current frequency on
notifications. We can use last set frequency instead.
* 7/8 - Make cpufreq->get of acpi_cpufreq work correctly again.
There will be a patch in future that removes ACPI based support in
speedstep-centrino in coming months.
patch 8/8
Add support for IA32_APERF and IA32_MPERF MSR and get the actual frequency
from these MSRs and use it to determine the next frequency target in ondemand
governor
This patch:
There is a bug in software coordination patch in acpi-cpufreq, due to which
frequency will only be set on first CPU of any coordinated group.
Bug identified by Denis, was not recognised earlier as there are no platforms
yet that use software coordination with acpi-cpufreq driver.
Signed-off-by: Denis Sadykov <denis.m.sadykov@intel.com>
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Index: linux-2.6.18/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
===================================================================
--- linux-2.6.18.orig/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ linux-2.6.18/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -197,6 +197,7 @@ acpi_cpufreq_target (
unsigned int relation)
{
struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu];
+ struct cpufreq_acpi_io *cpudata;
struct acpi_processor_performance *perf;
struct cpufreq_freqs freqs;
cpumask_t online_policy_cpus;
@@ -260,7 +261,8 @@ acpi_cpufreq_target (
break;
}
- result = acpi_processor_set_performance (data, j, next_state);
+ cpudata = acpi_io_data[j];
+ result = acpi_processor_set_performance(cpudata, j, next_state);
if (result) {
result = -EAGAIN;
break;
@@ -287,8 +289,11 @@ acpi_cpufreq_target (
if (!cpus_empty(covered_cpus)) {
for_each_cpu_mask(j, covered_cpus) {
- policy->cpu = j;
- acpi_processor_set_performance (data,
+ cpus_clear(set_mask);
+ cpu_set(j, set_mask);
+ set_cpus_allowed(current, set_mask);
+ cpudata = acpi_io_data[j];
+ acpi_processor_set_performance(cpudata,
j,
cur_state);
}
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 5/8]cpufreq: acpi-cpufreq: lindent acpi-cpufreq.c
2006-10-01 13:41 ` Venkatesh Pallipadi
2006-10-01 14:05 ` [PATCH 1/8]cpufreq: acpi-cpufreq: software coordination and handle all CPUs in the group Venkatesh Pallipadi
@ 2006-10-01 14:13 ` Venkatesh Pallipadi
2006-10-01 19:21 ` [1/5] reorganizes & code cleaning in acpi-cpufreq Dave Jones
2 siblings, 0 replies; 7+ messages in thread
From: Venkatesh Pallipadi @ 2006-10-01 14:13 UTC (permalink / raw)
To: Dave Jones; +Cc: Starikovskiy, Alexey Y, cpufreq, Dominik Brodowski
Lindent acpi-cpufreq. Additional changes replacing "return (..)" by "return ..".
No functionality changes in this patch.
Signed-off-by: Denis Sadykov <denis.m.sadykov@intel.com>
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>
Index: linux-2.6.18/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
===================================================================
--- linux-2.6.18.orig/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ linux-2.6.18/arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -52,7 +52,6 @@ MODULE_AUTHOR("Paul Diefenbaugh, Dominik
MODULE_DESCRIPTION("ACPI Processor P-States Driver");
MODULE_LICENSE("GPL");
-
enum {
UNDEFINED_CAPABLE = 0,
SYSTEM_INTEL_MSR_CAPABLE,
@@ -62,36 +61,34 @@ enum {
#define INTEL_MSR_RANGE (0xffff)
struct acpi_cpufreq_data {
- struct acpi_processor_performance *acpi_data;
- struct cpufreq_frequency_table *freq_table;
- unsigned int resume;
- unsigned int cpu_feature;
+ struct acpi_processor_performance *acpi_data;
+ struct cpufreq_frequency_table *freq_table;
+ unsigned int resume;
+ unsigned int cpu_feature;
};
-static struct acpi_cpufreq_data *drv_data[NR_CPUS];
-static struct acpi_processor_performance *acpi_perf_data[NR_CPUS];
+static struct acpi_cpufreq_data *drv_data[NR_CPUS];
+static struct acpi_processor_performance *acpi_perf_data[NR_CPUS];
static struct cpufreq_driver acpi_cpufreq_driver;
static unsigned int acpi_pstate_strict;
-
static int check_est_cpu(unsigned int cpuid)
{
struct cpuinfo_x86 *cpu = &cpu_data[cpuid];
if (cpu->x86_vendor != X86_VENDOR_INTEL ||
- !cpu_has(cpu, X86_FEATURE_EST))
+ !cpu_has(cpu, X86_FEATURE_EST))
return 0;
return 1;
}
-
static unsigned extract_io(u32 value, struct acpi_cpufreq_data *data)
{
- struct acpi_processor_performance *perf;
- int i;
+ struct acpi_processor_performance *perf;
+ int i;
perf = data->acpi_data;
@@ -102,7 +99,6 @@ static unsigned extract_io(u32 value, st
return 0;
}
-
static unsigned extract_msr(u32 msr, struct acpi_cpufreq_data *data)
{
int i;
@@ -115,15 +111,14 @@ static unsigned extract_msr(u32 msr, str
return data->freq_table[0].frequency;
}
-
static unsigned extract_freq(u32 val, struct acpi_cpufreq_data *data)
{
switch (data->cpu_feature) {
- case SYSTEM_INTEL_MSR_CAPABLE:
+ case SYSTEM_INTEL_MSR_CAPABLE:
return extract_msr(val, data);
- case SYSTEM_IO_CAPABLE:
+ case SYSTEM_IO_CAPABLE:
return extract_io(val, data);
- default:
+ default:
return 0;
}
}
@@ -139,7 +134,7 @@ static void wrport(u16 port, u8 bit_widt
}
}
-static void rdport(u16 port, u8 bit_width, u32 *ret)
+static void rdport(u16 port, u8 bit_width, u32 * ret)
{
*ret = 0;
if (bit_width <= 8) {
@@ -177,13 +172,13 @@ static void do_drv_read(struct drv_cmd *
u32 h;
switch (cmd->type) {
- case SYSTEM_INTEL_MSR_CAPABLE:
+ case SYSTEM_INTEL_MSR_CAPABLE:
rdmsr(cmd->addr.msr.reg, cmd->val, h);
break;
- case SYSTEM_IO_CAPABLE:
+ case SYSTEM_IO_CAPABLE:
rdport(cmd->addr.io.port, cmd->addr.io.bit_width, &cmd->val);
break;
- default:
+ default:
break;
}
}
@@ -193,20 +188,20 @@ static void do_drv_write(struct drv_cmd
u32 h = 0;
switch (cmd->type) {
- case SYSTEM_INTEL_MSR_CAPABLE:
+ case SYSTEM_INTEL_MSR_CAPABLE:
wrmsr(cmd->addr.msr.reg, cmd->val, h);
break;
- case SYSTEM_IO_CAPABLE:
+ case SYSTEM_IO_CAPABLE:
wrport(cmd->addr.io.port, cmd->addr.io.bit_width, cmd->val);
break;
- default:
+ default:
break;
}
}
static inline void drv_read(struct drv_cmd *cmd)
{
- cpumask_t saved_mask = current->cpus_allowed;
+ cpumask_t saved_mask = current->cpus_allowed;
cmd->val = 0;
set_cpus_allowed(current, cmd->mask);
@@ -217,8 +212,8 @@ static inline void drv_read(struct drv_c
static void drv_write(struct drv_cmd *cmd)
{
- cpumask_t saved_mask = current->cpus_allowed;
- unsigned int i;
+ cpumask_t saved_mask = current->cpus_allowed;
+ unsigned int i;
for_each_cpu_mask(i, cmd->mask) {
set_cpus_allowed(current, cpumask_of_cpu(i));
@@ -231,8 +226,8 @@ static void drv_write(struct drv_cmd *cm
static u32 get_cur_val(cpumask_t mask)
{
- struct acpi_processor_performance *perf;
- struct drv_cmd cmd;
+ struct acpi_processor_performance *perf;
+ struct drv_cmd cmd;
if (unlikely(cpus_empty(mask)))
return 0;
@@ -263,14 +258,13 @@ static u32 get_cur_val(cpumask_t mask)
static unsigned int get_cur_freq_on_cpu(unsigned int cpu)
{
- struct acpi_cpufreq_data *data = drv_data[cpu];
- unsigned int freq;
+ struct acpi_cpufreq_data *data = drv_data[cpu];
+ unsigned int freq;
dprintk("get_cur_freq_on_cpu (%d)\n", cpu);
if (unlikely(data == NULL ||
- data->acpi_data == NULL ||
- data->freq_table == NULL)) {
+ data->acpi_data == NULL || data->freq_table == NULL)) {
return 0;
}
@@ -281,10 +275,10 @@ static unsigned int get_cur_freq_on_cpu(
}
static unsigned int check_freqs(cpumask_t mask, unsigned int freq,
- struct acpi_cpufreq_data *data)
+ struct acpi_cpufreq_data *data)
{
- unsigned int cur_freq;
- unsigned int i;
+ unsigned int cur_freq;
+ unsigned int i;
for (i = 0; i < 100; i++) {
cur_freq = extract_freq(get_cur_val(mask), data);
@@ -296,34 +290,31 @@ static unsigned int check_freqs(cpumask_
}
static int acpi_cpufreq_target(struct cpufreq_policy *policy,
- unsigned int target_freq,
- unsigned int relation)
+ unsigned int target_freq, unsigned int relation)
{
- struct acpi_cpufreq_data *data = drv_data[policy->cpu];
- struct acpi_processor_performance *perf;
- struct cpufreq_freqs freqs;
- cpumask_t online_policy_cpus;
- struct drv_cmd cmd;
- unsigned int msr;
- unsigned int next_state = 0;
- unsigned int next_perf_state = 0;
- unsigned int i;
- int result = 0;
+ struct acpi_cpufreq_data *data = drv_data[policy->cpu];
+ struct acpi_processor_performance *perf;
+ struct cpufreq_freqs freqs;
+ cpumask_t online_policy_cpus;
+ struct drv_cmd cmd;
+ unsigned int msr;
+ unsigned int next_state = 0;
+ unsigned int next_perf_state = 0;
+ unsigned int i;
+ int result = 0;
dprintk("acpi_cpufreq_target %d (%d)\n", target_freq, policy->cpu);
if (unlikely(data == NULL ||
- data->acpi_data == NULL ||
- data->freq_table == NULL)) {
+ data->acpi_data == NULL || data->freq_table == NULL)) {
return -ENODEV;
}
perf = data->acpi_data;
result = cpufreq_frequency_table_target(policy,
- data->freq_table,
- target_freq,
- relation,
- &next_state);
+ data->freq_table,
+ target_freq,
+ relation, &next_state);
if (unlikely(result))
return -ENODEV;
@@ -340,30 +331,34 @@ static int acpi_cpufreq_target(struct cp
next_perf_state = data->freq_table[next_state].index;
if (freqs.new == freqs.old) {
if (unlikely(data->resume)) {
- dprintk("Called after resume, resetting to P%d\n", next_perf_state);
+ dprintk("Called after resume, resetting to P%d\n",
+ next_perf_state);
data->resume = 0;
} else {
- dprintk("Already at target state (P%d)\n", next_perf_state);
+ dprintk("Already at target state (P%d)\n",
+ next_perf_state);
return 0;
}
}
- switch (data->cpu_feature) {
- case SYSTEM_INTEL_MSR_CAPABLE:
- cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
- cmd.addr.msr.reg = MSR_IA32_PERF_CTL;
- msr = (u32) perf->states[next_perf_state].control & INTEL_MSR_RANGE;
- cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr;
- break;
- case SYSTEM_IO_CAPABLE:
- cmd.type = SYSTEM_IO_CAPABLE;
- cmd.addr.io.port = perf->control_register.address;
- cmd.addr.io.bit_width = perf->control_register.bit_width;
- cmd.val = (u32) perf->states[next_perf_state].control;
- break;
- default:
- return -ENODEV;
- }
+ switch (data->cpu_feature) {
+ case SYSTEM_INTEL_MSR_CAPABLE:
+ cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
+ cmd.addr.msr.reg = MSR_IA32_PERF_CTL;
+ msr =
+ (u32) perf->states[next_perf_state].
+ control & INTEL_MSR_RANGE;
+ cmd.val = (cmd.val & ~INTEL_MSR_RANGE) | msr;
+ break;
+ case SYSTEM_IO_CAPABLE:
+ cmd.type = SYSTEM_IO_CAPABLE;
+ cmd.addr.io.port = perf->control_register.address;
+ cmd.addr.io.bit_width = perf->control_register.bit_width;
+ cmd.val = (u32) perf->states[next_perf_state].control;
+ break;
+ default:
+ return -ENODEV;
+ }
cpus_clear(cmd.mask);
@@ -382,7 +377,7 @@ static int acpi_cpufreq_target(struct cp
if (acpi_pstate_strict) {
if (!check_freqs(cmd.mask, freqs.new, data)) {
dprintk("acpi_cpufreq_target failed (%d)\n",
- policy->cpu);
+ policy->cpu);
return -EAGAIN;
}
}
@@ -396,10 +391,7 @@ static int acpi_cpufreq_target(struct cp
return result;
}
-
-static int
-acpi_cpufreq_verify (
- struct cpufreq_policy *policy)
+static int acpi_cpufreq_verify(struct cpufreq_policy *policy)
{
struct acpi_cpufreq_data *data = drv_data[policy->cpu];
@@ -408,13 +400,10 @@ acpi_cpufreq_verify (
return cpufreq_frequency_table_verify(policy, data->freq_table);
}
-
static unsigned long
-acpi_cpufreq_guess_freq (
- struct acpi_cpufreq_data *data,
- unsigned int cpu)
+acpi_cpufreq_guess_freq(struct acpi_cpufreq_data *data, unsigned int cpu)
{
- struct acpi_processor_performance *perf = data->acpi_data;
+ struct acpi_processor_performance *perf = data->acpi_data;
if (cpu_khz) {
/* search the closest match to cpu_khz */
@@ -424,14 +413,14 @@ acpi_cpufreq_guess_freq (
for (i = 0; i < (perf->state_count - 1); i++) {
freq = freqn;
- freqn = perf->states[i+1].core_frequency * 1000;
+ freqn = perf->states[i + 1].core_frequency * 1000;
if ((2 * cpu_khz) > (freqn + freq)) {
perf->state = i;
- return (freq);
+ return freq;
}
}
perf->state = perf->state_count - 1;
- return (freqn);
+ return freqn;
} else {
/* assume CPU is at P0... */
perf->state = 0;
@@ -439,7 +428,6 @@ acpi_cpufreq_guess_freq (
}
}
-
/*
* acpi_cpufreq_early_init - initialize ACPI P-States library
*
@@ -450,21 +438,21 @@ acpi_cpufreq_guess_freq (
*/
static int acpi_cpufreq_early_init(void)
{
- struct acpi_processor_performance *data;
- cpumask_t covered;
- unsigned int i, j;
+ struct acpi_processor_performance *data;
+ cpumask_t covered;
+ unsigned int i, j;
dprintk("acpi_cpufreq_early_init\n");
for_each_possible_cpu(i) {
- data = kzalloc(sizeof(struct acpi_processor_performance),
- GFP_KERNEL);
+ data = kzalloc(sizeof(struct acpi_processor_performance),
+ GFP_KERNEL);
if (!data) {
for_each_cpu_mask(j, covered) {
kfree(acpi_perf_data[j]);
acpi_perf_data[j] = NULL;
}
- return (-ENOMEM);
+ return -ENOMEM;
}
acpi_perf_data[i] = data;
cpu_set(i, covered);
@@ -502,27 +490,25 @@ static struct dmi_system_id __initdata s
{ }
};
-static int
-acpi_cpufreq_cpu_init (
- struct cpufreq_policy *policy)
-{
- unsigned int i;
- unsigned int valid_states = 0;
- unsigned int cpu = policy->cpu;
- struct acpi_cpufreq_data *data;
- unsigned int l, h;
- unsigned int result = 0;
- struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
- struct acpi_processor_performance *perf;
+static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
+{
+ unsigned int i;
+ unsigned int valid_states = 0;
+ unsigned int cpu = policy->cpu;
+ struct acpi_cpufreq_data *data;
+ unsigned int l, h;
+ unsigned int result = 0;
+ struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
+ struct acpi_processor_performance *perf;
dprintk("acpi_cpufreq_cpu_init\n");
if (!acpi_perf_data[cpu])
- return (-ENODEV);
+ return -ENODEV;
data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL);
if (!data)
- return (-ENOMEM);
+ return -ENOMEM;
data->acpi_data = acpi_perf_data[cpu];
drv_data[cpu] = data;
@@ -567,11 +553,11 @@ acpi_cpufreq_cpu_init (
}
switch (perf->control_register.space_id) {
- case ACPI_ADR_SPACE_SYSTEM_IO:
+ case ACPI_ADR_SPACE_SYSTEM_IO:
dprintk("SYSTEM IO addr space\n");
data->cpu_feature = SYSTEM_IO_CAPABLE;
break;
- case ACPI_ADR_SPACE_FIXED_HARDWARE:
+ case ACPI_ADR_SPACE_FIXED_HARDWARE:
dprintk("HARDWARE addr space\n");
if (!check_est_cpu(cpu)) {
result = -ENODEV;
@@ -579,14 +565,16 @@ acpi_cpufreq_cpu_init (
}
data->cpu_feature = SYSTEM_INTEL_MSR_CAPABLE;
break;
- default:
+ default:
dprintk("Unknown addr space %d\n",
- (u32) (perf->control_register.space_id));
+ (u32) (perf->control_register.space_id));
result = -ENODEV;
goto err_unreg;
}
- data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * (perf->state_count + 1), GFP_KERNEL);
+ data->freq_table =
+ kmalloc(sizeof(struct cpufreq_frequency_table) *
+ (perf->state_count + 1), GFP_KERNEL);
if (!data->freq_table) {
result = -ENOMEM;
goto err_unreg;
@@ -594,22 +582,23 @@ acpi_cpufreq_cpu_init (
/* detect transition latency */
policy->cpuinfo.transition_latency = 0;
- for (i=0; i<perf->state_count; i++) {
- if ((perf->states[i].transition_latency * 1000) > policy->cpuinfo.transition_latency)
- policy->cpuinfo.transition_latency = perf->states[i].transition_latency * 1000;
+ for (i = 0; i < perf->state_count; i++) {
+ if ((perf->states[i].transition_latency * 1000) >
+ policy->cpuinfo.transition_latency)
+ policy->cpuinfo.transition_latency =
+ perf->states[i].transition_latency * 1000;
}
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
/* table init */
- for (i=0; i<perf->state_count; i++)
- {
- if ( i > 0 && perf->states[i].core_frequency ==
- perf->states[i - 1].core_frequency)
+ for (i = 0; i < perf->state_count; i++) {
+ if (i > 0 && perf->states[i].core_frequency ==
+ perf->states[i - 1].core_frequency)
continue;
data->freq_table[valid_states].index = i;
data->freq_table[valid_states].frequency =
- perf->states[i].core_frequency * 1000;
+ perf->states[i].core_frequency * 1000;
valid_states++;
}
data->freq_table[perf->state_count].frequency = CPUFREQ_TABLE_END;
@@ -620,14 +609,14 @@ acpi_cpufreq_cpu_init (
}
switch (data->cpu_feature) {
- case ACPI_ADR_SPACE_SYSTEM_IO:
+ case ACPI_ADR_SPACE_SYSTEM_IO:
/* Current speed is unknown and not detectable by IO port */
policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
break;
- case ACPI_ADR_SPACE_FIXED_HARDWARE:
+ case ACPI_ADR_SPACE_FIXED_HARDWARE:
get_cur_freq_on_cpu(cpu);
break;
- default:
+ default:
break;
}
@@ -637,101 +626,90 @@ acpi_cpufreq_cpu_init (
dprintk("CPU%u - ACPI performance management activated.\n", cpu);
for (i = 0; i < perf->state_count; i++)
dprintk(" %cP%d: %d MHz, %d mW, %d uS\n",
- (i == perf->state?'*':' '), i,
+ (i == perf->state ? '*' : ' '), i,
(u32) perf->states[i].core_frequency,
(u32) perf->states[i].power,
(u32) perf->states[i].transition_latency);
cpufreq_frequency_table_get_attr(data->freq_table, policy->cpu);
-
+
/*
* the first call to ->target() should result in us actually
* writing something to the appropriate registers.
*/
data->resume = 1;
-
+
return result;
- err_freqfree:
+ err_freqfree:
kfree(data->freq_table);
- err_unreg:
+ err_unreg:
acpi_processor_unregister_performance(perf, cpu);
- err_free:
+ err_free:
kfree(data);
drv_data[cpu] = NULL;
- return (result);
+ return result;
}
-
-static int
-acpi_cpufreq_cpu_exit (
- struct cpufreq_policy *policy)
+static int acpi_cpufreq_cpu_exit(struct cpufreq_policy *policy)
{
struct acpi_cpufreq_data *data = drv_data[policy->cpu];
-
dprintk("acpi_cpufreq_cpu_exit\n");
if (data) {
cpufreq_frequency_table_put_attr(policy->cpu);
drv_data[policy->cpu] = NULL;
- acpi_processor_unregister_performance(data->acpi_data, policy->cpu);
+ acpi_processor_unregister_performance(data->acpi_data,
+ policy->cpu);
kfree(data);
}
- return (0);
+ return 0;
}
-static int
-acpi_cpufreq_resume (
- struct cpufreq_policy *policy)
+static int acpi_cpufreq_resume(struct cpufreq_policy *policy)
{
struct acpi_cpufreq_data *data = drv_data[policy->cpu];
-
dprintk("acpi_cpufreq_resume\n");
data->resume = 1;
- return (0);
+ return 0;
}
-
-static struct freq_attr* acpi_cpufreq_attr[] = {
+static struct freq_attr *acpi_cpufreq_attr[] = {
&cpufreq_freq_attr_scaling_available_freqs,
NULL,
};
static struct cpufreq_driver acpi_cpufreq_driver = {
- .verify = acpi_cpufreq_verify,
- .target = acpi_cpufreq_target,
- .get = get_cur_freq_on_cpu,
- .init = acpi_cpufreq_cpu_init,
- .exit = acpi_cpufreq_cpu_exit,
- .resume = acpi_cpufreq_resume,
- .name = "acpi-cpufreq",
- .owner = THIS_MODULE,
- .attr = acpi_cpufreq_attr,
- .flags = CPUFREQ_STICKY,
+ .verify = acpi_cpufreq_verify,
+ .target = acpi_cpufreq_target,
+ .get = get_cur_freq_on_cpu,
+ .init = acpi_cpufreq_cpu_init,
+ .exit = acpi_cpufreq_cpu_exit,
+ .resume = acpi_cpufreq_resume,
+ .name = "acpi-cpufreq",
+ .owner = THIS_MODULE,
+ .attr = acpi_cpufreq_attr,
+ .flags = CPUFREQ_STICKY,
};
-
-static int __init
-acpi_cpufreq_init (void)
+static int __init acpi_cpufreq_init(void)
{
dprintk("acpi_cpufreq_init\n");
acpi_cpufreq_early_init();
- return cpufreq_register_driver(&acpi_cpufreq_driver);
+ return cpufreq_register_driver(&acpi_cpufreq_driver);
}
-
-static void __exit
-acpi_cpufreq_exit (void)
+static void __exit acpi_cpufreq_exit(void)
{
- unsigned int i;
+ unsigned int i;
dprintk("acpi_cpufreq_exit\n");
cpufreq_unregister_driver(&acpi_cpufreq_driver);
@@ -744,7 +722,8 @@ acpi_cpufreq_exit (void)
}
module_param(acpi_pstate_strict, uint, 0644);
-MODULE_PARM_DESC(acpi_pstate_strict, "value 0 or non-zero. non-zero -> strict ACPI checks are performed during frequency changes.");
+MODULE_PARM_DESC(acpi_pstate_strict,
+ "value 0 or non-zero. non-zero -> strict ACPI checks are performed during frequency changes.");
late_initcall(acpi_cpufreq_init);
module_exit(acpi_cpufreq_exit);
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [1/5] reorganizes & code cleaning in acpi-cpufreq
2006-10-01 13:41 ` Venkatesh Pallipadi
2006-10-01 14:05 ` [PATCH 1/8]cpufreq: acpi-cpufreq: software coordination and handle all CPUs in the group Venkatesh Pallipadi
2006-10-01 14:13 ` [PATCH 5/8]cpufreq: acpi-cpufreq: lindent acpi-cpufreq.c Venkatesh Pallipadi
@ 2006-10-01 19:21 ` Dave Jones
2 siblings, 0 replies; 7+ messages in thread
From: Dave Jones @ 2006-10-01 19:21 UTC (permalink / raw)
To: Venkatesh Pallipadi; +Cc: alexey.y.starikovskiy, cpufreq, Dominik Brodowski
On Sun, Oct 01, 2006 at 06:41:26AM -0700, Venkatesh Pallipadi wrote:
> On Tue, Sep 26, 2006 at 10:41:48PM -0400, Dave Jones wrote:
> > On Fri, Sep 01, 2006 at 02:07:53PM -0700, Venkatesh Pallipadi wrote:
> >
> > > Some clean up and redsign of the driver. Mainly making it easier to add
> > > support for multiple sub-mechanisms of changing frequency. Currently this
> > > driver supports only ACPI SYSTEM_IO address space. With the changes
> > > below it is easier to add support for other address spaces like Intel
> > > Enhanced Speedstep which uses MSR (ACPI FIXED_FEATURE_HARDWARE) to do the
> > > transitions.
> >
> > This patch-series fell at the first hurdle.
> >
> > error: patch failed: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c:91
> > error: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c: patch does not apply
> >
>
> This reject was coming from one earlier patch that hasn't gone it yet. The earlier bug fix patch had subject "acpi-cpufreq and software coordination".
patch 1 applied, then 2 fell over..
(15:16:02:davej@hera:cpufreq)$ git-applymbox -k ~/Mail/mbox
8 patch(es) to process.
Applying '[CPUFREQ][1/8] acpi-cpufreq: software coordination and handle all CPUs in the group'
Wrote tree 9f1c808872662c1d54734a653ca49be772f82252
Committed: 402dcff780ede1c889c69ddff200d2f5bbb89853
Applying '[CPUFREQ][2/8] acpi-cpufreq: reorganize code to make MSR support addition easier'
error: patch failed: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c:611
error: arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c: patch does not apply
git-applymbox is a little more anal than patch, so it will refuse to apply
patches with fuzz, and this one..
$ cat aaa | patch -p1 --dry-run
patching file arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
Hunk #21 succeeded at 598 with fuzz 2 (offset -1 lines).
has fuzz.
Patch 2 also adds back a #include <linux/config.h> which isn't necessary.
Want to chop that out when you send the rediffed patch?
Dave
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2006-10-01 19:21 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-09-01 21:07 [PATCH 1/5] Unify ACPI bits on speedstep-centrino and acpi-cpufreq Venkatesh Pallipadi
2006-09-27 2:40 ` [1/5] reorganizes & code cleaning in acpi-cpufreq Dave Jones
2006-09-27 2:41 ` Dave Jones
2006-10-01 13:41 ` Venkatesh Pallipadi
2006-10-01 14:05 ` [PATCH 1/8]cpufreq: acpi-cpufreq: software coordination and handle all CPUs in the group Venkatesh Pallipadi
2006-10-01 14:13 ` [PATCH 5/8]cpufreq: acpi-cpufreq: lindent acpi-cpufreq.c Venkatesh Pallipadi
2006-10-01 19:21 ` [1/5] reorganizes & code cleaning in acpi-cpufreq Dave Jones
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.