All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver
@ 2006-07-31 18:46 Alexey Starikovskiy
  2006-08-02 16:39 ` Jeremy Fitzhardinge
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Alexey Starikovskiy @ 2006-07-31 18:46 UTC (permalink / raw)
  To: Brown, Len, Dave Jones; +Cc: cpufreq

 speedstep-centrino.c |  270 +++++++--------------------------------------------
 1 file changed, 40 insertions(+), 230 deletions(-)

remove ACPI from speedstep-centrino driver

Signed-off: Denis Sadykov <denis.m.sadykov@intel.com>
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi at intel.com>
Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy at intel.com>

Index: linux-2.6.17/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
===================================================================
--- linux-2.6.17.orig/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2006-07-11 20:13:44.000000000 +0000
+++ linux-2.6.17/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2006-07-13 18:54:07.000000000 +0000
@@ -2,36 +2,36 @@
  * cpufreq driver for Enhanced SpeedStep, as found in Intel's Pentium
  * M (part of the Centrino chipset).
  *
- * Since the original Pentium M, most new Intel CPUs support Enhanced
- * SpeedStep.
- *
  * Despite the "SpeedStep" in the name, this is almost entirely unlike
  * traditional SpeedStep.
  *
  * Modelled on speedstep.c
  *
  * Copyright (C) 2003 Jeremy Fitzhardinge <jeremy@goop.org>
+ *
+ * WARNING WARNING WARNING
+ *
+ * This driver manipulates the PERF_CTL MSR, which is only somewhat
+ * documented.  While it seems to work on my laptop, it has not been
+ * tested anywhere else, and it may not work for you, do strange
+ * things or simply crash.
  */
 
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/cpufreq.h>
+#include <linux/config.h>
 #include <linux/sched.h>	/* current */
 #include <linux/delay.h>
 #include <linux/compiler.h>
 
-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-#include <linux/acpi.h>
-#include <acpi/processor.h>
-#endif
-
 #include <asm/msr.h>
 #include <asm/processor.h>
 #include <asm/cpufeature.h>
 
 #define PFX		"speedstep-centrino: "
-#define MAINTAINER	"cpufreq@lists.linux.org.uk"
+#define MAINTAINER	"Jeremy Fitzhardinge <jeremy@goop.org>"
 
 #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "speedstep-centrino", msg)
 
@@ -237,15 +237,17 @@
 	struct cpuinfo_x86 *cpu = &cpu_data[policy->cpu];
 	struct cpu_model *model;
 
-	for(model = models; model->cpu_id != NULL; model++)
+	for (model = models; model->cpu_id != NULL; model++) {
 		if (centrino_verify_cpu_id(cpu, model->cpu_id) &&
 		    (model->model_name == NULL ||
-		     strcmp(cpu->x86_model_id, model->model_name) == 0))
+		     strcmp(cpu->x86_model_id, model->model_name) == 0)) {
 			break;
+		}
+	}
 
 	if (model->cpu_id == NULL) {
 		/* No match at all */
-		dprintk("no support for CPU model \"%s\": "
+		printk(KERN_INFO PFX "no support for CPU model \"%s\": "
 		       "send /proc/cpuinfo to " MAINTAINER "\n",
 		       cpu->x86_model_id);
 		return -ENOENT;
@@ -253,11 +255,8 @@
 
 	if (model->op_points == NULL) {
 		/* Matched a non-match */
-		dprintk("no table support for CPU model \"%s\"\n",
+		printk(KERN_INFO PFX "no table support for CPU model \"%s\"\n",
 		       cpu->x86_model_id);
-#ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-		dprintk("try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n");
-#endif
 		return -ENOENT;
 	}
 
@@ -329,6 +328,7 @@
 	clock_freq = extract_clock(l, cpu, 0);
 
 	if (unlikely(clock_freq == 0)) {
+
 		/*
 		 * On some CPUs, we can see transient MSR values (which are
 		 * not present in _PSS), while CPU is doing some automatic
@@ -344,169 +344,7 @@
 }
 
 
-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-
-static struct acpi_processor_performance *acpi_perf_data[NR_CPUS];
-
-/*
- * centrino_cpu_early_init_acpi - Do the preregistering with ACPI P-States
- * library
- *
- * Before doing the actual init, we need to do _PSD related setup whenever
- * supported by the BIOS. These are handled by this early_init routine.
- */
-static int centrino_cpu_early_init_acpi(void)
-{
-	unsigned int	i, j;
-	struct acpi_processor_performance	*data;
-
-	for_each_possible_cpu(i) {
-		data = kzalloc(sizeof(struct acpi_processor_performance), 
-				GFP_KERNEL);
-		if (!data) {
-			for_each_possible_cpu(j) {
-				kfree(acpi_perf_data[j]);
-				acpi_perf_data[j] = NULL;
-			}
-			return (-ENOMEM);
-		}
-		acpi_perf_data[i] = data;
-	}
-
-	acpi_processor_preregister_performance(acpi_perf_data);
-	return 0;
-}
-
-/*
- * centrino_cpu_init_acpi - register with ACPI P-States library
- *
- * Register with the ACPI P-States library (part of drivers/acpi/processor.c)
- * in order to determine correct frequency and voltage pairings by reading
- * the _PSS of the ACPI DSDT or SSDT tables.
- */
-static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
-{
-	unsigned long			cur_freq;
-	int				result = 0, i;
-	unsigned int			cpu = policy->cpu;
-	struct acpi_processor_performance	*p;
-
-	p = acpi_perf_data[cpu];
-
-	/* register with ACPI core */
-	if (acpi_processor_register_performance(p, cpu)) {
-		dprintk(PFX "obtaining ACPI data failed\n");
-		return -EIO;
-	}
-	policy->shared_type = p->shared_type;
-	/*
-	 * Will let policy->cpus know about dependency only when software 
-	 * coordination is required.
-	 */
-	if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL ||
-	    policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
-		policy->cpus = p->shared_cpu_map;
-
-	/* verify the acpi_data */
-	if (p->state_count <= 1) {
-		dprintk("No P-States\n");
-		result = -ENODEV;
-		goto err_unreg;
-	}
-
-	if ((p->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
-	    (p->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
-		dprintk("Invalid control/status registers (%x - %x)\n",
-			p->control_register.space_id, p->status_register.space_id);
-		result = -EIO;
-		goto err_unreg;
-	}
-
-	for (i=0; i<p->state_count; i++) {
-		if (p->states[i].control != p->states[i].status) {
-			dprintk("Different control (%llu) and status values (%llu)\n",
-				p->states[i].control, p->states[i].status);
-			result = -EINVAL;
-			goto err_unreg;
-		}
-
-		if (!p->states[i].core_frequency) {
-			dprintk("Zero core frequency for state %u\n", i);
-			result = -EINVAL;
-			goto err_unreg;
-		}
-
-		if (p->states[i].core_frequency > p->states[0].core_frequency) {
-			dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i,
-				p->states[i].core_frequency, p->states[0].core_frequency);
-			p->states[i].core_frequency = 0;
-			continue;
-		}
-	}
-
-	centrino_model[cpu] = kzalloc(sizeof(struct cpu_model), GFP_KERNEL);
-	if (!centrino_model[cpu]) {
-		result = -ENOMEM;
-		goto err_unreg;
-	}
-
-	centrino_model[cpu]->model_name=NULL;
-	centrino_model[cpu]->max_freq = p->states[0].core_frequency * 1000;
-	centrino_model[cpu]->op_points =  kmalloc(sizeof(struct cpufreq_frequency_table) *
-					     (p->state_count + 1), GFP_KERNEL);
-        if (!centrino_model[cpu]->op_points) {
-                result = -ENOMEM;
-                goto err_kfree;
-        }
-
-        for (i=0; i<p->state_count; i++) {
-		centrino_model[cpu]->op_points[i].index = p->states[i].control;
-		centrino_model[cpu]->op_points[i].frequency = p->states[i].core_frequency * 1000;
-		dprintk("adding state %i with frequency %u and control value %04x\n", 
-			i, centrino_model[cpu]->op_points[i].frequency, centrino_model[cpu]->op_points[i].index);
-	}
-	centrino_model[cpu]->op_points[p->state_count].frequency = CPUFREQ_TABLE_END;
-
-	cur_freq = get_cur_freq(cpu);
-
-	for (i=0; i<p->state_count; i++) {
-		if (!p->states[i].core_frequency) {
-			dprintk("skipping state %u\n", i);
-			centrino_model[cpu]->op_points[i].frequency = CPUFREQ_ENTRY_INVALID;
-			continue;
-		}
-		
-		if (extract_clock(centrino_model[cpu]->op_points[i].index, cpu, 0) !=
-		    (centrino_model[cpu]->op_points[i].frequency)) {
-			dprintk("Invalid encoded frequency (%u vs. %u)\n",
-				extract_clock(centrino_model[cpu]->op_points[i].index, cpu, 0),
-				centrino_model[cpu]->op_points[i].frequency);
-			result = -EINVAL;
-			goto err_kfree_all;
-		}
-
-		if (cur_freq == centrino_model[cpu]->op_points[i].frequency)
-			p->state = i;
-	}
-
-	/* notify BIOS that we exist */
-	acpi_processor_notify_smm(THIS_MODULE);
-
-	return 0;
 
- err_kfree_all:
-	kfree(centrino_model[cpu]->op_points);
- err_kfree:
-	kfree(centrino_model[cpu]);
- err_unreg:
-	acpi_processor_unregister_performance(p, cpu);
-	dprintk(PFX "invalid ACPI data\n");
-	return (result);
-}
-#else
-static inline int centrino_cpu_init_acpi(struct cpufreq_policy *policy) { return -ENODEV; }
-static inline int centrino_cpu_early_init_acpi(void) { return 0; }
-#endif
 
 static int centrino_cpu_init(struct cpufreq_policy *policy)
 {
@@ -523,27 +361,25 @@
 	if (cpu_has(cpu, X86_FEATURE_CONSTANT_TSC))
 		centrino_driver.flags |= CPUFREQ_CONST_LOOPS;
 
-	if (centrino_cpu_init_acpi(policy)) {
-		if (policy->cpu != 0)
-			return -ENODEV;
+	if (policy->cpu != 0)
+		return -ENODEV;
 
-		for (i = 0; i < N_IDS; i++)
-			if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
-				break;
-
-		if (i != N_IDS)
-			centrino_cpu[policy->cpu] = &cpu_ids[i];
-
-		if (!centrino_cpu[policy->cpu]) {
-			dprintk("found unsupported CPU with "
-			"Enhanced SpeedStep: send /proc/cpuinfo to "
-			MAINTAINER "\n");
-			return -ENODEV;
-		}
+	for (i = 0; i < N_IDS; i++)
+		if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
+			break;
 
-		if (centrino_cpu_init_table(policy)) {
-			return -ENODEV;
-		}
+	if (i != N_IDS)
+		centrino_cpu[policy->cpu] = &cpu_ids[i];
+
+	if (!centrino_cpu[policy->cpu]) {
+		dprintk(KERN_INFO PFX "found unsupported CPU with "
+		"Enhanced SpeedStep: send /proc/cpuinfo to "
+		MAINTAINER "\n");
+		return -ENODEV;
+	}
+
+	if (centrino_cpu_init_table(policy)) {
+		return -ENODEV;
 	}
 
 	/* Check to see if Enhanced SpeedStep is enabled, and try to
@@ -568,6 +404,11 @@
 	policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
 	policy->cpuinfo.transition_latency = 10000; /* 10uS transition latency */
 	policy->cur = freq;
+#ifdef CONFIG_SMP
+	policy->cpus = cpu_core_map[policy->cpu];
+#else
+	policy->cpus = cpumask_of_cpu(policy->cpu);
+#endif /* CONFIG_SMP */
 
 	dprintk("centrino_cpu_init: cur=%dkHz\n", policy->cur);
 
@@ -589,20 +430,6 @@
 
 	cpufreq_frequency_table_put_attr(cpu);
 
-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-	if (!centrino_model[cpu]->model_name) {
-		static struct acpi_processor_performance *p;
-
-		if (acpi_perf_data[cpu]) {
-			p = acpi_perf_data[cpu];
-			dprintk("unregistering and freeing ACPI data\n");
-			acpi_processor_unregister_performance(p, cpu);
-			kfree(centrino_model[cpu]->op_points);
-			kfree(centrino_model[cpu]);
-		}
-	}
-#endif
-
 	centrino_model[cpu] = NULL;
 
 	return 0;
@@ -653,7 +480,7 @@
 		return -EINVAL;
 	}
 
-#ifdef CONFIG_HOTPLUG_CPU
+#ifdef CONFIG_SMP
 	/* cpufreq holds the hotplug lock, so we are safe from here on */
 	cpus_and(online_policy_cpus, cpu_online_map, policy->cpus);
 #else
@@ -669,10 +496,7 @@
 		 * 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);
+		cpu_set(j, set_mask);
 
 		set_cpus_allowed(current, set_mask);
 		if (unlikely(!cpu_isset(smp_processor_id(), set_mask))) {
@@ -716,8 +540,6 @@
 		}
 
 		wrmsr(MSR_IA32_PERF_CTL, oldmsr, h);
-		if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
-			break;
 
 		cpu_set(j, covered_cpus);
 	}
@@ -796,25 +618,13 @@
 	if (!cpu_has(cpu, X86_FEATURE_EST))
 		return -ENODEV;
 
-	centrino_cpu_early_init_acpi();
-
 	return cpufreq_register_driver(&centrino_driver);
 }
 
 static void __exit centrino_exit(void)
 {
-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-	unsigned int j;
-#endif
 	
 	cpufreq_unregister_driver(&centrino_driver);
-
-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-	for_each_possible_cpu(j) {
-		kfree(acpi_perf_data[j]);
-		acpi_perf_data[j] = NULL;
-	}
-#endif
 }
 
 MODULE_AUTHOR ("Jeremy Fitzhardinge <jeremy@goop.org>");

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver
  2006-07-31 18:46 [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver Alexey Starikovskiy
@ 2006-08-02 16:39 ` Jeremy Fitzhardinge
  2006-08-02 18:33   ` Alexey Starikovskiy
  2006-08-02 16:43 ` Jeremy Fitzhardinge
  2006-08-03  9:02 ` [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver -- updated to not revert Jeremy's patch Alexey Starikovskiy
  2 siblings, 1 reply; 8+ messages in thread
From: Jeremy Fitzhardinge @ 2006-08-02 16:39 UTC (permalink / raw)
  To: Alexey Starikovskiy; +Cc: cpufreq, Dave Jones

Alexey Starikovskiy wrote:
> speedstep-centrino.c |  270 
> +++++++--------------------------------------------
> 1 file changed, 40 insertions(+), 230 deletions(-)
>
> remove ACPI from speedstep-centrino driver
>
> Signed-off: Denis Sadykov <denis.m.sadykov@intel.com>
> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi at intel.com>
> Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy at intel.com>
>
> Index: linux-2.6.17/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
> ===================================================================
> --- 
> linux-2.6.17.orig/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c    
> 2006-07-11 20:13:44.000000000 +0000
> +++ linux-2.6.17/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c    
> 2006-07-13 18:54:07.000000000 +0000
> @@ -2,36 +2,36 @@
>  * cpufreq driver for Enhanced SpeedStep, as found in Intel's Pentium
>  * M (part of the Centrino chipset).
>  *
> - * Since the original Pentium M, most new Intel CPUs support Enhanced
> - * SpeedStep.
> - *
>  * Despite the "SpeedStep" in the name, this is almost entirely unlike
>  * traditional SpeedStep.
>  *
>  * Modelled on speedstep.c
>  *
>  * Copyright (C) 2003 Jeremy Fitzhardinge <jeremy@goop.org>
> + *
> + * WARNING WARNING WARNING
> + *
> + * This driver manipulates the PERF_CTL MSR, which is only somewhat
> + * documented.  While it seems to work on my laptop, it has not been
> + * tested anywhere else, and it may not work for you, do strange
> + * things or simply crash.
>  */
> [...]
> #define PFX        "speedstep-centrino: "
> -#define MAINTAINER    "cpufreq@lists.linux.org.uk"
> +#define MAINTAINER    "Jeremy Fitzhardinge <jeremy@goop.org>"

You're reverting a change I made recently.  Did you mean to?

    J

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver
  2006-07-31 18:46 [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver Alexey Starikovskiy
  2006-08-02 16:39 ` Jeremy Fitzhardinge
@ 2006-08-02 16:43 ` Jeremy Fitzhardinge
  2006-08-02 18:39   ` Alexey Starikovskiy
  2006-08-03  9:02 ` [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver -- updated to not revert Jeremy's patch Alexey Starikovskiy
  2 siblings, 1 reply; 8+ messages in thread
From: Jeremy Fitzhardinge @ 2006-08-02 16:43 UTC (permalink / raw)
  To: Alexey Starikovskiy; +Cc: cpufreq, Dave Jones

Alexey Starikovskiy wrote:
> speedstep-centrino.c |  270 
> +++++++--------------------------------------------
> 1 file changed, 40 insertions(+), 230 deletions(-)
>
> remove ACPI from speedstep-centrino driver
Oh, and why, BTW?  Have you replaced it with something else?  A bit more 
of a comment would be nice.

    J

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver
  2006-08-02 16:39 ` Jeremy Fitzhardinge
@ 2006-08-02 18:33   ` Alexey Starikovskiy
  0 siblings, 0 replies; 8+ messages in thread
From: Alexey Starikovskiy @ 2006-08-02 18:33 UTC (permalink / raw)
  To: Jeremy Fitzhardinge; +Cc: cpufreq, Dave Jones

Jeremy Fitzhardinge wrote:
> Alexey Starikovskiy wrote:
>> speedstep-centrino.c |  270
>> +++++++--------------------------------------------
>> 1 file changed, 40 insertions(+), 230 deletions(-)
>>
>> remove ACPI from speedstep-centrino driver
>>
>> Signed-off: Denis Sadykov <denis.m.sadykov@intel.com>
>> Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi at intel.com>
>> Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy at intel.com>
>>
>> Index: linux-2.6.17/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
>> ===================================================================
>> ---
>> linux-2.6.17.orig/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c   
>> 2006-07-11 20:13:44.000000000 +0000
>> +++ linux-2.6.17/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c   
>> 2006-07-13 18:54:07.000000000 +0000
>> @@ -2,36 +2,36 @@
>>  * cpufreq driver for Enhanced SpeedStep, as found in Intel's Pentium
>>  * M (part of the Centrino chipset).
>>  *
>> - * Since the original Pentium M, most new Intel CPUs support Enhanced
>> - * SpeedStep.
>> - *
>>  * Despite the "SpeedStep" in the name, this is almost entirely unlike
>>  * traditional SpeedStep.
>>  *
>>  * Modelled on speedstep.c
>>  *
>>  * Copyright (C) 2003 Jeremy Fitzhardinge <jeremy@goop.org>
>> + *
>> + * WARNING WARNING WARNING
>> + *
>> + * This driver manipulates the PERF_CTL MSR, which is only somewhat
>> + * documented.  While it seems to work on my laptop, it has not been
>> + * tested anywhere else, and it may not work for you, do strange
>> + * things or simply crash.
>>  */
>> [...]
>> #define PFX        "speedstep-centrino: "
>> -#define MAINTAINER    "cpufreq@lists.linux.org.uk"
>> +#define MAINTAINER    "Jeremy Fitzhardinge <jeremy@goop.org>"
> 
> You're reverting a change I made recently.  Did you mean to?
> 
>    J
No. Intention was to remove ACPI only. Will post proper patch shortly.
Alex.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver
  2006-08-02 16:43 ` Jeremy Fitzhardinge
@ 2006-08-02 18:39   ` Alexey Starikovskiy
  0 siblings, 0 replies; 8+ messages in thread
From: Alexey Starikovskiy @ 2006-08-02 18:39 UTC (permalink / raw)
  To: Jeremy Fitzhardinge; +Cc: cpufreq, Dave Jones

Jeremy Fitzhardinge wrote:
> Alexey Starikovskiy wrote:
>> speedstep-centrino.c |  270
>> +++++++--------------------------------------------
>> 1 file changed, 40 insertions(+), 230 deletions(-)
>>
>> remove ACPI from speedstep-centrino driver
> Oh, and why, BTW?  Have you replaced it with something else?  A bit more
> of a comment would be nice.
> 
>    J
If you look at the series as a whole you will see, that this functionality is
merged into acpi-cpufreq.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver -- updated to not revert Jeremy's patch
  2006-07-31 18:46 [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver Alexey Starikovskiy
  2006-08-02 16:39 ` Jeremy Fitzhardinge
  2006-08-02 16:43 ` Jeremy Fitzhardinge
@ 2006-08-03  9:02 ` Alexey Starikovskiy
  2006-08-08  1:42   ` Dominik Brodowski
  2 siblings, 1 reply; 8+ messages in thread
From: Alexey Starikovskiy @ 2006-08-03  9:02 UTC (permalink / raw)
  To: Brown, Len, Dave Jones; +Cc: cpufreq

 speedstep-centrino.c |  234 +++------------------------------------------------
 1 file changed, 17 insertions(+), 217 deletions(-)

remove ACPI from speedstep-centrino driver

Signed-off-by: Denis Sadykov <denis.m.sadykov@intel.com>
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi at intel.com>
Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy at intel.com>

Index: linux-2.6.15.1/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
===================================================================
--- linux-2.6.15.1.orig/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c
2006-08-03 12:37:51.000000000 +0400
+++ linux-2.6.15.1/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2006-08-03
12:58:01.000000000 +0400
@@ -21,11 +21,6 @@
 #include <linux/delay.h>
 #include <linux/compiler.h>

-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-#include <linux/acpi.h>
-#include <acpi/processor.h>
-#endif
-
 #include <asm/msr.h>
 #include <asm/processor.h>
 #include <asm/cpufeature.h>
@@ -255,9 +250,6 @@
 		/* Matched a non-match */
 		dprintk("no table support for CPU model \"%s\"\n",
 		       cpu->x86_model_id);
-#ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-		dprintk("try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n");
-#endif
 		return -ENOENT;
 	}

@@ -344,169 +336,6 @@
 }


-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-
-static struct acpi_processor_performance *acpi_perf_data[NR_CPUS];
-
-/*
- * centrino_cpu_early_init_acpi - Do the preregistering with ACPI P-States
- * library
- *
- * Before doing the actual init, we need to do _PSD related setup whenever
- * supported by the BIOS. These are handled by this early_init routine.
- */
-static int centrino_cpu_early_init_acpi(void)
-{
-	unsigned int	i, j;
-	struct acpi_processor_performance	*data;
-
-	for_each_possible_cpu(i) {
-		data = kzalloc(sizeof(struct acpi_processor_performance),
-				GFP_KERNEL);
-		if (!data) {
-			for_each_possible_cpu(j) {
-				kfree(acpi_perf_data[j]);
-				acpi_perf_data[j] = NULL;
-			}
-			return (-ENOMEM);
-		}
-		acpi_perf_data[i] = data;
-	}
-
-	acpi_processor_preregister_performance(acpi_perf_data);
-	return 0;
-}
-
-/*
- * centrino_cpu_init_acpi - register with ACPI P-States library
- *
- * Register with the ACPI P-States library (part of drivers/acpi/processor.c)
- * in order to determine correct frequency and voltage pairings by reading
- * the _PSS of the ACPI DSDT or SSDT tables.
- */
-static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
-{
-	unsigned long			cur_freq;
-	int				result = 0, i;
-	unsigned int			cpu = policy->cpu;
-	struct acpi_processor_performance	*p;
-
-	p = acpi_perf_data[cpu];
-
-	/* register with ACPI core */
-	if (acpi_processor_register_performance(p, cpu)) {
-		dprintk(PFX "obtaining ACPI data failed\n");
-		return -EIO;
-	}
-	policy->shared_type = p->shared_type;
-	/*
-	 * Will let policy->cpus know about dependency only when software
-	 * coordination is required.
-	 */
-	if (policy->shared_type == CPUFREQ_SHARED_TYPE_ALL ||
-	    policy->shared_type == CPUFREQ_SHARED_TYPE_ANY)
-		policy->cpus = p->shared_cpu_map;
-
-	/* verify the acpi_data */
-	if (p->state_count <= 1) {
-		dprintk("No P-States\n");
-		result = -ENODEV;
-		goto err_unreg;
-	}
-
-	if ((p->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
-	    (p->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
-		dprintk("Invalid control/status registers (%x - %x)\n",
-			p->control_register.space_id, p->status_register.space_id);
-		result = -EIO;
-		goto err_unreg;
-	}
-
-	for (i=0; i<p->state_count; i++) {
-		if (p->states[i].control != p->states[i].status) {
-			dprintk("Different control (%llu) and status values (%llu)\n",
-				p->states[i].control, p->states[i].status);
-			result = -EINVAL;
-			goto err_unreg;
-		}
-
-		if (!p->states[i].core_frequency) {
-			dprintk("Zero core frequency for state %u\n", i);
-			result = -EINVAL;
-			goto err_unreg;
-		}
-
-		if (p->states[i].core_frequency > p->states[0].core_frequency) {
-			dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i,
-				p->states[i].core_frequency, p->states[0].core_frequency);
-			p->states[i].core_frequency = 0;
-			continue;
-		}
-	}
-
-	centrino_model[cpu] = kzalloc(sizeof(struct cpu_model), GFP_KERNEL);
-	if (!centrino_model[cpu]) {
-		result = -ENOMEM;
-		goto err_unreg;
-	}
-
-	centrino_model[cpu]->model_name=NULL;
-	centrino_model[cpu]->max_freq = p->states[0].core_frequency * 1000;
-	centrino_model[cpu]->op_points =  kmalloc(sizeof(struct cpufreq_frequency_table) *
-					     (p->state_count + 1), GFP_KERNEL);
-        if (!centrino_model[cpu]->op_points) {
-                result = -ENOMEM;
-                goto err_kfree;
-        }
-
-        for (i=0; i<p->state_count; i++) {
-		centrino_model[cpu]->op_points[i].index = p->states[i].control;
-		centrino_model[cpu]->op_points[i].frequency = p->states[i].core_frequency * 1000;
-		dprintk("adding state %i with frequency %u and control value %04x\n",
-			i, centrino_model[cpu]->op_points[i].frequency,
centrino_model[cpu]->op_points[i].index);
-	}
-	centrino_model[cpu]->op_points[p->state_count].frequency = CPUFREQ_TABLE_END;
-
-	cur_freq = get_cur_freq(cpu);
-
-	for (i=0; i<p->state_count; i++) {
-		if (!p->states[i].core_frequency) {
-			dprintk("skipping state %u\n", i);
-			centrino_model[cpu]->op_points[i].frequency = CPUFREQ_ENTRY_INVALID;
-			continue;
-		}
-		
-		if (extract_clock(centrino_model[cpu]->op_points[i].index, cpu, 0) !=
-		    (centrino_model[cpu]->op_points[i].frequency)) {
-			dprintk("Invalid encoded frequency (%u vs. %u)\n",
-				extract_clock(centrino_model[cpu]->op_points[i].index, cpu, 0),
-				centrino_model[cpu]->op_points[i].frequency);
-			result = -EINVAL;
-			goto err_kfree_all;
-		}
-
-		if (cur_freq == centrino_model[cpu]->op_points[i].frequency)
-			p->state = i;
-	}
-
-	/* notify BIOS that we exist */
-	acpi_processor_notify_smm(THIS_MODULE);
-
-	return 0;
-
- err_kfree_all:
-	kfree(centrino_model[cpu]->op_points);
- err_kfree:
-	kfree(centrino_model[cpu]);
- err_unreg:
-	acpi_processor_unregister_performance(p, cpu);
-	dprintk(PFX "invalid ACPI data\n");
-	return (result);
-}
-#else
-static inline int centrino_cpu_init_acpi(struct cpufreq_policy *policy) {
return -ENODEV; }
-static inline int centrino_cpu_early_init_acpi(void) { return 0; }
-#endif

 static int centrino_cpu_init(struct cpufreq_policy *policy)
 {
@@ -523,27 +352,25 @@
 	if (cpu_has(cpu, X86_FEATURE_CONSTANT_TSC))
 		centrino_driver.flags |= CPUFREQ_CONST_LOOPS;

-	if (centrino_cpu_init_acpi(policy)) {
-		if (policy->cpu != 0)
-			return -ENODEV;
+	if (policy->cpu != 0)
+		return -ENODEV;

-		for (i = 0; i < N_IDS; i++)
-			if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
-				break;
-
-		if (i != N_IDS)
-			centrino_cpu[policy->cpu] = &cpu_ids[i];
-
-		if (!centrino_cpu[policy->cpu]) {
-			dprintk("found unsupported CPU with "
-			"Enhanced SpeedStep: send /proc/cpuinfo to "
-			MAINTAINER "\n");
-			return -ENODEV;
-		}
+	for (i = 0; i < N_IDS; i++)
+		if (centrino_verify_cpu_id(cpu, &cpu_ids[i]))
+			break;

-		if (centrino_cpu_init_table(policy)) {
-			return -ENODEV;
-		}
+	if (i != N_IDS)
+		centrino_cpu[policy->cpu] = &cpu_ids[i];
+
+	if (!centrino_cpu[policy->cpu]) {
+		dprintk("found unsupported CPU with "
+		"Enhanced SpeedStep: send /proc/cpuinfo to "
+		MAINTAINER "\n");
+		return -ENODEV;
+	}
+
+	if (centrino_cpu_init_table(policy)) {
+		return -ENODEV;
 	}

 	/* Check to see if Enhanced SpeedStep is enabled, and try to
@@ -589,20 +416,6 @@

 	cpufreq_frequency_table_put_attr(cpu);

-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-	if (!centrino_model[cpu]->model_name) {
-		static struct acpi_processor_performance *p;
-
-		if (acpi_perf_data[cpu]) {
-			p = acpi_perf_data[cpu];
-			dprintk("unregistering and freeing ACPI data\n");
-			acpi_processor_unregister_performance(p, cpu);
-			kfree(centrino_model[cpu]->op_points);
-			kfree(centrino_model[cpu]);
-		}
-	}
-#endif
-
 	centrino_model[cpu] = NULL;

 	return 0;
@@ -796,25 +609,12 @@
 	if (!cpu_has(cpu, X86_FEATURE_EST))
 		return -ENODEV;

-	centrino_cpu_early_init_acpi();
-
 	return cpufreq_register_driver(&centrino_driver);
 }

 static void __exit centrino_exit(void)
 {
-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-	unsigned int j;
-#endif
-	
 	cpufreq_unregister_driver(&centrino_driver);
-
-#ifdef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI
-	for_each_possible_cpu(j) {
-		kfree(acpi_perf_data[j]);
-		acpi_perf_data[j] = NULL;
-	}
-#endif
 }

 MODULE_AUTHOR ("Jeremy Fitzhardinge <jeremy@goop.org>");

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver -- updated to not revert Jeremy's patch
  2006-08-03  9:02 ` [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver -- updated to not revert Jeremy's patch Alexey Starikovskiy
@ 2006-08-08  1:42   ` Dominik Brodowski
  2006-08-08 12:46     ` Bruno Ducrot
  0 siblings, 1 reply; 8+ messages in thread
From: Dominik Brodowski @ 2006-08-08  1:42 UTC (permalink / raw)
  To: Alexey Starikovskiy; +Cc: cpufreq, Dave Jones

Hi,

On Thu, Aug 03, 2006 at 01:02:47PM +0400, Alexey Starikovskiy wrote:
>  speedstep-centrino.c |  234 +++------------------------------------------------
>  1 file changed, 17 insertions(+), 217 deletions(-)
> 
> remove ACPI from speedstep-centrino driver

At least two issues with this patch:

a) you leave arch/i386/kernel/cpu/cpufreq/Kconfig alone, even though all
relevant usages of X86_SPEEDSTEP_CENTRINO_ACPI seem to be removed by this
patch.

b) you suggest to remove a "feature" here. (A feature being a functionality
working with a specific .config setting). We shouldn't do that without a
fair warning and a sufficient transition period, unless we have compelling
reasons to do otherwise. Therefore, I'd suggest to first
- Add a warning
	printk(KERN_WARNING "Please use CONFIG_... instead!")
- tweak KCONFIG so that if X86_SPEEDSTEP_CENTRINO_ACPI was set,
  CONFIG_X86_ACPI_CPUFREQ is selected, e.g.

 config X86_SPEEDSTEP_CENTRINO_ACPI
 	bool "Use ACPI tables to decode valid frequency/voltage pairs"
  	depends on X86_SPEEDSTEP_CENTRINO && ACPI_PROCESSOR
 	depends on !(X86_SPEEDSTEP_CENTRINO = y && ACPI_PROCESSOR = m)
 	default y
+	select X86_ACPI_CPUFREQ
 	help
 	  Use primarily the information provided in the BIOS ACPI tables
 	  to determine valid CPU frequency and voltage pairings. It is
 	  required for the driver to work on non-Banias CPUs.

     - add a notice to Documentation/feature-removal-schedule.txt.


and the actual code is only removed in a couple of months (>6) from now.


Also, I wonder how we'll look on this this merge-all-into-one-driver-approach
in a few years. Remember Dave's talk at OLS 2003 about
merge-then-split-up-then-remerging-then-splitting-up-cycles in the
kernel...[*]

	Dominik

[*] http://archive.linuxsymposium.org/ols2003/Proceedings/All-Reprints/Reprint-Jones-OLS2003.pdf

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver -- updated to not revert Jeremy's patch
  2006-08-08  1:42   ` Dominik Brodowski
@ 2006-08-08 12:46     ` Bruno Ducrot
  0 siblings, 0 replies; 8+ messages in thread
From: Bruno Ducrot @ 2006-08-08 12:46 UTC (permalink / raw)
  To: Alexey Starikovskiy, Brown, Len, Dave Jones, cpufreq

Hi,

On Mon, Aug 07, 2006 at 09:42:21PM -0400, Dominik Brodowski wrote:
> Also, I wonder how we'll look on this this merge-all-into-one-driver-approach
> in a few years. Remember Dave's talk at OLS 2003 about
> merge-then-split-up-then-remerging-then-splitting-up-cycles in the
> kernel...[*]

I think the real problem is we don't want to add VIA C7 support to
speedstep-centrino, because the name of the driver might
confuse users.  But it might be possible we have to
support hardcoded tables for VIA C7, due to bad written
AMLs for example.  I really don't know how to resolve in a clean
manner this perticular issue.  Maybe:

1- adding support for the msr stuff to acpi-cpufreq
or
2- rename speedstep-centrino.

With 1 we wont be able to add hardcoded tables for VIA C7 though.

-- 
Bruno Ducrot

--  Which is worse:  ignorance or apathy?
--  Don't know.  Don't care.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2006-08-08 12:46 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-31 18:46 [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver Alexey Starikovskiy
2006-08-02 16:39 ` Jeremy Fitzhardinge
2006-08-02 18:33   ` Alexey Starikovskiy
2006-08-02 16:43 ` Jeremy Fitzhardinge
2006-08-02 18:39   ` Alexey Starikovskiy
2006-08-03  9:02 ` [PATCH 4/8] acpi-cpufreq: remove ACPI from speedstep-centrino driver -- updated to not revert Jeremy's patch Alexey Starikovskiy
2006-08-08  1:42   ` Dominik Brodowski
2006-08-08 12:46     ` Bruno Ducrot

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.