cpufreq Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHES] ACPI Processor update [idle,throttling,thermal,cpufreq]
@ 2003-09-04 22:24 Dominik Brodowski
  2003-09-05  5:23 ` [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq] Dmitry Torokhov
  2003-09-08 13:29 ` Pavel Machek
  0 siblings, 2 replies; 8+ messages in thread
From: Dominik Brodowski @ 2003-09-04 22:24 UTC (permalink / raw)
  To: acpi-devel, andrew.grover; +Cc: cpufreq

Over the last few hours, I've rewritten large portions of ACPI processor
handling. Due to lack of appropriate hardware, I can hardly test these
changes, so expect a few rough edges.

These patches 
- a) replace the broken ACPI CPUfreq driver with a better, flexible variant,
- b) modularize the processor.c code: instead of one large file there are
     many small files.
- c) improve passive cooling support
- d) allow for easy adding of proper locking and ref-counting in processor.c

http://www.brodo.de/cpufreq_tmp/cpufreq-2.6.0-test4-ALL-series1
	Large CPUfreq update -- needed for other changes
	[in CPUfreq BK tree, merge with Linus expected soon]

http://www.brodo.de/cpufreq_tmp/cpufreq-2.6.0-test4-update_policy
http://www.brodo.de/cpufreq_tmp/cpufreq-2.6.0-test4-Kconfig-speedstep
	Additional CPUfreq updates -- needed for other changes
	[Already sent to CPUfreq list]

http://www.brodo.de/cpufreq_tmp/drivermodel-2.6.0-test4-exports
	Missing EXPORTs in sysdevice -- needed for other changes
	[Already sent to Patrick]


http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-remove_previous_pstates_implementation
	The previous arch/i386/kernel/cpu/cpufreq/acpi.c CPUfreq
	driver was broken, of bad design, and needs to replaced 
	by something better. But, as a first step, remove all 
	parts related to P-States from ACPI code.

http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_submodules
	Add a "submodule interface" to drivers/acpi/processor.c

	It allows to create other "modules" which access the acpi_handle 
	for the processor, and which get notified if the event value 
	maches the value passed in acpi_processor_register_notify.

http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_perflib
	This patch adds a new "P-States library" to drivers/acpi/

	CPUfreq drivers can now easly access the contents of the 
	_PCT and the _PSS. For example, the speedstep-centrino 
	driver could be appended so that it passes the appropriate 
	value to the P-States library which then evaluates _PDC, 
	and then returns the updated _PCT and _PSS.

	Also, the platform limit is now handled as a cpufreq notifier and
	as a call to cpufreq_policy_update.

http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-new_acpi_io_driver
	This re-adds the acpi P-States I/O driver. It is much smaller,
	leaner and cleaner.

http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_idle_submodule
	This moves the idle handler out of drivers/acpi/processor and into
	an own module.

	Even if only C1 is available, it is now used. If the user prefers the 
	default pm_idle, he can unload processor_idle, and still have the other
	functionality available.

http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_submodule
	This adds a new mechanism to manage passive cooling. Instead of
	hardcoded -and partly wrong- access to CPUfreq and ACPI 
	throttling-, add a generic mechanism which other modules can 
	register with.

http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_cpufreq
	Use _any_ CPUfreq driver for passive cooling. Implemented by an
	cpufreq policy notifier and cpufreq_update_policy.
 
http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_throttling
	Move throttling into its own submodule, and register it with the new
	passive cooling module. Also, the now-useless "limit" interface is
	removed.


Please review, test (carefully), and -if appropriate- merge,

	Dominik

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

* Re: [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq]
  2003-09-04 22:24 [PATCHES] ACPI Processor update [idle,throttling,thermal,cpufreq] Dominik Brodowski
@ 2003-09-05  5:23 ` Dmitry Torokhov
  2003-09-05  6:52   ` Dominik Brodowski
  2003-09-08 13:29 ` Pavel Machek
  1 sibling, 1 reply; 8+ messages in thread
From: Dmitry Torokhov @ 2003-09-05  5:23 UTC (permalink / raw)
  To: Dominik Brodowski; +Cc: acpi-devel, andrew.grover, cpufreq

Dominik,

I have couple of concerns regarding P-states IO library, esp. 
acpi_processor_get_frequency. It seems that ACPI does not allow
to read current state without setting it first, at least with
the following code on my notebook I was always getting garbage 
in the status register:

+static int
+acpi_processor_get_current_state(
+       struct acpi_processor_performance       *perf)
+{
+       int     result = 0;
+       int     i;
+       u8      value;
+
+       ACPI_FUNCTION_TRACE("acpi_processor_get_current_state");
+
+       if (!perf->pr->flags.performance)
+               goto out;
+
+       value = inb(perf->status_register);
+
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+               "Got 0x%02x from port 0x%04x\n", value, perf->status_register));
+
+       for (i = 0; i < perf->state_count; i++) {
+               if (value == (u8) perf->states[i].status) {
+                       perf->state = i;
+                       goto out;
+               }
+       }
+
+       /* couldn't match our state table - garbage in status register */
+       ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
+               "Bad data 0x%02x in performance status register 0x%04x\n",
+               value, perf->status_register));
+       result = -EFAULT;
+out:
+       return_VALUE(result);
+}

I am wondering is it just me, my code or general deficiency.

Also, do you really need to do notify_transition twice 
(acpi_processor_set_performance)?

Dmitry

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

* Re: [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq]
  2003-09-05  5:23 ` [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq] Dmitry Torokhov
@ 2003-09-05  6:52   ` Dominik Brodowski
  0 siblings, 0 replies; 8+ messages in thread
From: Dominik Brodowski @ 2003-09-05  6:52 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: acpi-devel, andrew.grover, cpufreq

Dmitry,

Thanks for your input.

On Fri, Sep 05, 2003 at 12:23:06AM -0500, Dmitry Torokhov wrote:
> I have couple of concerns regarding P-states IO library, esp. 
> acpi_processor_get_frequency. It seems that ACPI does not allow
> to read current state without setting it first.

Indeed. The specification allows this behaviour. That's really annoying, but
well...

> Also, do you really need to do notify_transition twice 
> (acpi_processor_set_performance)?

No, it's a bug.

The attached patch should fix both issues.

diff -ruN linux-original/arch/i386/kernel/cpu/cpufreq/acpi-io-cpufreq.c linux/arch/i386/kernel/cpu/cpufreq/acpi-io-cpufreq.c
--- linux-original/arch/i386/kernel/cpu/cpufreq/acpi-io-cpufreq.c	2003-09-04 21:36:58.000000000 +0200
+++ linux/arch/i386/kernel/cpu/cpufreq/acpi-io-cpufreq.c	2003-09-05 08:47:54.302664624 +0200
@@ -33,6 +33,7 @@
 #include <asm/io.h>
 #include <asm/delay.h>
 #include <asm/uaccess.h>
+#include <asm/timex.h>
 
 #include <linux/acpi.h>
 #include <acpi/processor.h>
@@ -54,32 +55,16 @@
 	u16 				control_register;
 	u16 				status_register;
 
+	unsigned long			previous_freq;
 	struct cpufreq_frequency_table	*table;
 };
 
 static struct cpufreq_acpi_io_data acpi_io_data[NR_CPUS];
 
-static unsigned long acpi_processor_get_frequency (
-	struct cpufreq_acpi_io_data 	*data)
-{
-	unsigned int		i;
-	u16			port;
-	u8			value;
-
-	port = data->status_register;
-	value = inb(port);
-
-	for (i=0; i<data->data->state_count; i++) {
-		if (value == (u8) data->data->states[i].status)
-			return (1000 * data->data->states[i].core_frequency);
-	}
-
-	return 0;
-}
-
 static int acpi_processor_set_performance (
 	struct cpufreq_acpi_io_data 	*data,
-	int				state)
+	int				state,
+	unsigned int			notify)
 {
 	u16			port;
 	u8			value;
@@ -88,14 +73,12 @@
 
 	/* cpufreq frequency struct */
 	cpufreq_freqs.cpu = data->cpu;
-	cpufreq_freqs.old = acpi_processor_get_frequency(data);
+	cpufreq_freqs.old = data->previous_freq;
 	cpufreq_freqs.new = data->data->states[state].core_frequency;
 
 	/* notify cpufreq */
-	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
-
-	/* notify cpufreq */
-	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
+	if (notify)
+		cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
 
 	/*
 	 * First we write the target state's 'control' value to the
@@ -129,18 +112,21 @@
 	}
 
 	/* notify cpufreq */
+	if (notify)
 	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
 
 	if (value != data->data->states[state].status) {
 		unsigned int tmp = cpufreq_freqs.new;
 		cpufreq_freqs.new = cpufreq_freqs.old;
 		cpufreq_freqs.old = tmp;
-		cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
-		cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
+		if (notify) {
+			cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
+			cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
+		}
 		printk(KERN_ERR "Transition failed\n");
 		return -EINVAL;
 	}
-
+	data->previous_freq = data->data->states[state].core_frequency * 1000;
 	dprintk(KERN_INFO "Transition successful after %d microseconds\n", i * 10);
 	return 0;
 }
@@ -162,7 +148,7 @@
 	if (result)
 		return (result);
 
-	return acpi_processor_set_performance (data, next_state);
+	return acpi_processor_set_performance (data, next_state, 1);
 }
 
 static int acpi_cpufreq_verify (struct cpufreq_policy   *policy)
@@ -183,6 +169,7 @@
 	struct acpi_perflib_data *data;
 	struct cpufreq_frequency_table *table;
 	unsigned int i;
+	unsigned long tmp_speed;
 
 	data = acpi_processor_perflib_register (&acpi_cpufreq_perflib_driver,
 						 policy->cpu);
@@ -221,7 +208,29 @@
 	acpi_io_data[policy->cpu].status_register = (u16) data->pct_status.address;
 	acpi_io_data[policy->cpu].control_register = (u16) data->pct_control.address;
 
-	return 0;
+	/* 
+	 * The ACPI specificiation is broken in the regard that
+	 * it is impossible to detect the _current_ P-State.
+	 * The control_register is only valid _after_ a frequency
+	 * transition.
+	 * So, we try to get the current setting from cpu_khz,
+	 * but to make sure, this state we think the CPU is in
+	 * is also set.
+	 */
+	if (cpu_khz) {
+		tmp_speed = cpu_khz / 100;
+		tmp_speed *= 105;
+	} else {
+		tmp_speed = policy->cpuinfo.max_freq;
+	}
+	result = cpufreq_frequency_table_target(policy, data->table,
+						tmp_speed,
+						CPUFREQ_RELATION_L,
+						&i);
+	if (result)
+		return (result);
+
+	return acpi_processor_set_performance (data, i, 0);
 }

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

* Re: [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq]
  2003-09-04 22:24 [PATCHES] ACPI Processor update [idle,throttling,thermal,cpufreq] Dominik Brodowski
  2003-09-05  5:23 ` [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq] Dmitry Torokhov
@ 2003-09-08 13:29 ` Pavel Machek
  2003-09-09 17:21   ` linux
  1 sibling, 1 reply; 8+ messages in thread
From: Pavel Machek @ 2003-09-08 13:29 UTC (permalink / raw)
  To: Dominik Brodowski; +Cc: acpi-devel, andrew.grover, cpufreq

Hi!

>http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_cpufreq
> 	Use _any_ CPUfreq driver for passive cooling. Implemented by an
> 	cpufreq policy notifier and cpufreq_update_policy.
>  

Good - it is going to help a lot on k8 notebooks.

http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_throttling
> 	Move throttling into its own submodule, and register it with the new
> 	passive cooling module. Also, the now-useless "limit" interface is
> 	removed.
> 

Actually I liked to be able to echo 0:7 > limit and conserve battery/
make sure machine does not overheat  with it...


-- 
				Pavel
Written on sharp zaurus, because my Velo1 broke. If you have Velo you don't need...

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

* Re: [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq]
  2003-09-08 13:29 ` Pavel Machek
@ 2003-09-09 17:21   ` linux
  2003-09-09 23:13     ` Pavel Machek
  0 siblings, 1 reply; 8+ messages in thread
From: linux @ 2003-09-09 17:21 UTC (permalink / raw)
  To: Pavel Machek; +Cc: acpi-devel, andrew.grover, cpufreq

Hi Pavel,

Glad you liked [at least parts] of my patches.

On Mon, Sep 08, 2003 at 03:29:40PM +0200, Pavel Machek wrote:
> http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_throttling
> > 	Move throttling into its own submodule, and register it with the new
> > 	passive cooling module. Also, the now-useless "limit" interface is
> > 	removed.
> > 
> 
> Actually I liked to be able to echo 0:7 > limit and conserve battery/
> make sure machine does not overheat  with it...

echo 7 > throttling should do the same thing. However, don't expect any
battey conservation if ACPI C2 throttling works, and to set custom levels
against "overheating" there's a write access to
/proc/acpi/thermal/*/trip_points too...

	Dominik

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

* Re: [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq]
  2003-09-09 17:21   ` linux
@ 2003-09-09 23:13     ` Pavel Machek
  2003-09-09 23:29       ` linux
  0 siblings, 1 reply; 8+ messages in thread
From: Pavel Machek @ 2003-09-09 23:13 UTC (permalink / raw)
  To: linux; +Cc: acpi-devel, andrew.grover, cpufreq

Hi!

> Glad you liked [at least parts] of my patches.

:-). [BTW what is status of powernow-k8? is it pending or does it need
to be fixed some more?]

> On Mon, Sep 08, 2003 at 03:29:40PM +0200, Pavel Machek wrote:
> > http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_throttling
> > > 	Move throttling into its own submodule, and register it with the new
> > > 	passive cooling module. Also, the now-useless "limit" interface is
> > > 	removed.
> > > 
> > 
> > Actually I liked to be able to echo 0:7 > limit and conserve battery/
> > make sure machine does not overheat  with it...
> 
> echo 7 > throttling should do the same thing. 

Will not first change in thermal system unthrottle it for me, behind
my back?

> However, don't expect any
> battey conservation if ACPI C2 throttling works, and to set custom levels
> against "overheating" there's a write access to
> /proc/acpi/thermal/*/trip_points too...

I'd should not expect battery conservation *when cpu is idle*. If I'm
moving windows in X, 0:7 limit will actually help. And it should allow
battery to be drained further by limiting maximum amps eaten by
CPU. [Ok, that's little evil, but being able to run for 30 minutes+ on
0% battery is nice ;-)].
								Pavel
-- 
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

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

* Re: [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq]
  2003-09-09 23:13     ` Pavel Machek
@ 2003-09-09 23:29       ` linux
  2003-09-10  0:00         ` Pavel Machek
  0 siblings, 1 reply; 8+ messages in thread
From: linux @ 2003-09-09 23:29 UTC (permalink / raw)
  To: Pavel Machek; +Cc: acpi-devel, andrew.grover, cpufreq

Hi,

[powernow-k8 see separate e-mail]

On Wed, Sep 10, 2003 at 01:13:03AM +0200, Pavel Machek wrote:
> > On Mon, Sep 08, 2003 at 03:29:40PM +0200, Pavel Machek wrote:
> > > http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_throttling
> > > > 	Move throttling into its own submodule, and register it with the new
> > > > 	passive cooling module. Also, the now-useless "limit" interface is
> > > > 	removed.
> > > > 
> > > 
> > > Actually I liked to be able to echo 0:7 > limit and conserve battery/
> > > make sure machine does not overheat  with it...
> > 
> > echo 7 > throttling should do the same thing. 
> 
> Will not first change in thermal system unthrottle it for me, behind
> my back?

Well yes, it might, if the temperature had been higher than the passive
cooling trip point. If you want me to, I'll change the behaviour so that the
/proc/acpi/.../throttling input is consistent (minimum limit) until the user 
choses a different throttling level.

> > However, don't expect any
> > battey conservation if ACPI C2 throttling works, and to set custom levels
> > against "overheating" there's a write access to
> > /proc/acpi/thermal/*/trip_points too...
> 
> I'd should not expect battery conservation *when cpu is idle*. If I'm
> moving windows in X, 0:7 limit will actually help.

depends if you see it relative to the time or relative to the energy...

> And it should allow
> battery to be drained further by limiting maximum amps eaten by
> CPU. [Ok, that's little evil, but being able to run for 30 minutes+ on
> 0% battery is nice ;-)].

Well yes, for this case, setting throttling to 0:7 might indeed make
sense...

	Dominik

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

* Re: [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq]
  2003-09-09 23:29       ` linux
@ 2003-09-10  0:00         ` Pavel Machek
  0 siblings, 0 replies; 8+ messages in thread
From: Pavel Machek @ 2003-09-10  0:00 UTC (permalink / raw)
  To: linux; +Cc: acpi-devel, andrew.grover, cpufreq

Hi!

> > > > http://www.brodo.de/cpufreq_tmp/acpi-2.6.0-test4-processor_thermal_throttling
> > > > > 	Move throttling into its own submodule, and register it with the new
> > > > > 	passive cooling module. Also, the now-useless "limit" interface is
> > > > > 	removed.
> > > > > 
> > > > 
> > > > Actually I liked to be able to echo 0:7 > limit and conserve battery/
> > > > make sure machine does not overheat  with it...
> > > 
> > > echo 7 > throttling should do the same thing. 
> > 
> > Will not first change in thermal system unthrottle it for me, behind
> > my back?
> 
> Well yes, it might, if the temperature had been higher than the passive
> cooling trip point. If you want me to, I'll change the behaviour so that the
> /proc/acpi/.../throttling input is consistent (minimum limit) until the user 
> choses a different throttling level.

Yes I guess that would make sense.

								Pavel
-- 
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

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

end of thread, other threads:[~2003-09-10  0:00 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-04 22:24 [PATCHES] ACPI Processor update [idle,throttling,thermal,cpufreq] Dominik Brodowski
2003-09-05  5:23 ` [ACPI] [PATCHES] ACPI Processor update [idle, throttling, thermal, cpufreq] Dmitry Torokhov
2003-09-05  6:52   ` Dominik Brodowski
2003-09-08 13:29 ` Pavel Machek
2003-09-09 17:21   ` linux
2003-09-09 23:13     ` Pavel Machek
2003-09-09 23:29       ` linux
2003-09-10  0:00         ` Pavel Machek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox