All of lore.kernel.org
 help / color / mirror / Atom feed
* cpufreq driver for nForce2
@ 2004-06-03 13:32 Sebastian Witt
  2004-06-06 16:20 ` Dominik Brodowski
  0 siblings, 1 reply; 6+ messages in thread
From: Sebastian Witt @ 2004-06-03 13:32 UTC (permalink / raw)
  To: cpufreq

Hello,

I'm writing a cpufreq driver for nForce2 mainboards which changes the 
FSB instead of using any power-save functions of the CPU.

The good thing is: It works with all CPUs on nForce2 plattforms, the bad 
thing: currently the minimum FSB is on the most boards at boot FSB - 60.
But I think with a high multiplier the CPU frequency range is high enough.

A test version is available at: 
http://www.hasw.net/linux/cpufreq-nforce2-0.1.tar.bz2

Tested with kernel 2.6.6.

It would be nice to hear suggestions, bug reports, etc.

Regards,
Sebastian

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

* Re: cpufreq driver for nForce2
  2004-06-03 13:32 cpufreq driver for nForce2 Sebastian Witt
@ 2004-06-06 16:20 ` Dominik Brodowski
  2004-06-06 19:34   ` Sebastian Witt
  2004-06-09 19:50   ` Sebastian Witt
  0 siblings, 2 replies; 6+ messages in thread
From: Dominik Brodowski @ 2004-06-06 16:20 UTC (permalink / raw)
  To: Sebastian Witt; +Cc: cpufreq

Hi Sebastian,

A few remarks on your driver:

- nforce2_verify should assert that there's at least one valid state in
  between policy->min and policy->max. If policy->min were 55300 kHz and
  policy->max 55400 kHz, nforce2_verify wouldn't adapt. Something like
	fsb_pol_max = policy->max / (fid * 1000);
	if (policy->min < (fsb_pol_max * fid * 1000))
		policy->max = (fsb_pol_max + 1) * fid * 1000;
  Or does the code in nforce2_calc_pll mean that there might be only one
  "state" available in a 4 MHz FSB interval? If so, the code above needs to
  be modified.

- Why is the new PLL value written _forty_ times?

- nforce2_target should be ordered a bit differently: calculate
	target_fsb = target_freq / (fid * 1000);
  first, then set
	freqs.new = target_fsb * fid * 1000;

- implement a ->get() function, please. It's (probably) only
static unsigned int nforce2_get(unsigned int cpu)
{
	if (cpu)
		return 0;
	return nforce2_fsb_read() * fid * 1000;
}

- if there's an user-specified max_fsb which is larger than it was booted
  at, there should be a big warning -- if anyone is overclocking the CPU,
  there might be random crashes etc. These should not need to be debugged by
  kernel developers.

- Speaking of stability: changing the FSB on the fly proved to be difficult
  on other platforms. While I think the method used in nforce2 is less
  error-prone, it might be good to add some big warning to the kernel logs

- Next issue wrt stability: where did you get the information from? While I
  don't really care, if it's from "official" documentation, it's less prone
  to stability errors.

- cpufreq_frequency_table_put_attr(policy->cpu) in nforce2_cpu_exit is
  invalid, as you're not using cpufreq table helpers. Also, the
  corresponding get_attr call is missing, so... Also, this means you don't
  need to have a nforce2_attr or a .attr in struct nforce2_driver.

- please convert MODULE_PARM to module_param

- s/NFORCE2_SAVE_DISTANCE/NFORCE2_SAFE_DISTANCE

- check for !cpu_khz in ->init(). While unlikely, it is possible that
  cpu_khz isn't initialized correctly due to broken TSC etc.

- Implementing .5 FIDs shouldn't be too difficult.
	x change the semantics of FID to represent _ten_ times the FID
	x 
	if (!fid)
		fid = cpu_khz / (fsb * 100);
	if (fid % 5) {
		unsigned int mfid = fid % 5;
		if (mfid > 2)
			fid += 5 - mfid;
		else
			fid -= mfid;
	}


Thanks,
	Dominik

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

* Re: cpufreq driver for nForce2
  2004-06-06 16:20 ` Dominik Brodowski
@ 2004-06-06 19:34   ` Sebastian Witt
  2004-06-07 13:19     ` Bruno Ducrot
  2004-06-09 19:50   ` Sebastian Witt
  1 sibling, 1 reply; 6+ messages in thread
From: Sebastian Witt @ 2004-06-06 19:34 UTC (permalink / raw)
  To: Dominik Brodowski; +Cc: cpufreq

Hi Dominik,

Dominik Brodowski wrote:

> - nforce2_verify should assert that there's at least one valid state in
>   between policy->min and policy->max. If policy->min were 55300 kHz and
>   policy->max 55400 kHz, nforce2_verify wouldn't adapt. Something like
> 	fsb_pol_max = policy->max / (fid * 1000);
> 	if (policy->min < (fsb_pol_max * fid * 1000))
> 		policy->max = (fsb_pol_max + 1) * fid * 1000;
>   Or does the code in nforce2_calc_pll mean that there might be only one
>   "state" available in a 4 MHz FSB interval? If so, the code above needs to
>   be modified.

I will change this.

> - Why is the new PLL value written _forty_ times?

It's written 64 times. The chipset applies the new FSB when the 
'counter' (PLLADR) reaches 0x40.

> - nforce2_target should be ordered a bit differently: calculate
> 	target_fsb = target_freq / (fid * 1000);
>   first, then set
> 	freqs.new = target_fsb * fid * 1000;

Ok, changed.

> - implement a ->get() function, please. It's (probably) only
> static unsigned int nforce2_get(unsigned int cpu)
> {
> 	if (cpu)
> 		return 0;
> 	return nforce2_fsb_read() * fid * 1000;
> }

This also.

> - if there's an user-specified max_fsb which is larger than it was booted
>   at, there should be a big warning -- if anyone is overclocking the CPU,
>   there might be random crashes etc. These should not need to be debugged by
>   kernel developers.

I've added a warning when max_fsb is greater than the current FSB.

> - Speaking of stability: changing the FSB on the fly proved to be difficult
>   on other platforms. While I think the method used in nforce2 is less
>   error-prone, it might be good to add some big warning to the kernel logs

Yes, this is only possible because the PCI/AGP clock is independent from 
the FSB. I added a warning.

> 
> - Next issue wrt stability: where did you get the information from? While I
>   don't really care, if it's from "official" documentation, it's less prone
>   to stability errors.

I don't know if there is any official documentation, it's based on 
8rdavcore (www.hasw.net/8rdavcore) and the FSB changing code is tested 
for several months. If the FSB is changed between a limited range 
(max_fsb = bootfsb and min_fsb = bootfsb - 60 works on most boards), 
there are no problems.

On many boards is a greater range possible, but this depends too much on 
the chipset parameters set by the Bios. But FSB changing was never 
planned and is out of specifications so this is all experimental.

> - cpufreq_frequency_table_put_attr(policy->cpu) in nforce2_cpu_exit is
>   invalid, as you're not using cpufreq table helpers. Also, the
>   corresponding get_attr call is missing, so... Also, this means you don't
>   need to have a nforce2_attr or a .attr in struct nforce2_driver.

You're right, removed it.

> - please convert MODULE_PARM to module_param
> 
> - s/NFORCE2_SAVE_DISTANCE/NFORCE2_SAFE_DISTANCE

> - check for !cpu_khz in ->init(). While unlikely, it is possible that
>   cpu_khz isn't initialized correctly due to broken TSC etc.

Done.

Thanks for your help,
Sebastian

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

* Re: cpufreq driver for nForce2
  2004-06-06 19:34   ` Sebastian Witt
@ 2004-06-07 13:19     ` Bruno Ducrot
  0 siblings, 0 replies; 6+ messages in thread
From: Bruno Ducrot @ 2004-06-07 13:19 UTC (permalink / raw)
  To: Sebastian Witt; +Cc: Dominik Brodowski, cpufreq

On Sun, Jun 06, 2004 at 09:34:00PM +0200, Sebastian Witt wrote:
> 
> >- Speaking of stability: changing the FSB on the fly proved to be difficult
> >  on other platforms. While I think the method used in nforce2 is less
> >  error-prone, it might be good to add some big warning to the kernel logs
> 
> Yes, this is only possible because the PCI/AGP clock is independent from 
> the FSB. I added a warning.

Are you sure?  It's very likely PCI and AGP clocks are multiples
of SYSCLK (but I must admit I know nothing about nForce2)?

Cheers,

-- 
Bruno Ducrot

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

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

* Re: cpufreq driver for nForce2
  2004-06-06 16:20 ` Dominik Brodowski
  2004-06-06 19:34   ` Sebastian Witt
@ 2004-06-09 19:50   ` Sebastian Witt
  2004-06-10  9:17     ` Dominik Brodowski
  1 sibling, 1 reply; 6+ messages in thread
From: Sebastian Witt @ 2004-06-09 19:50 UTC (permalink / raw)
  To: Dominik Brodowski; +Cc: cpufreq

Dominik Brodowski wrote:
> Hi Sebastian,
> 
> A few remarks on your driver:
> ...

I've now applied the changes you suggested and some other fixes:

http://www.hasw.net/linux/cpufreq-nforce2-0.2.tar.bz2

Thanks,
Sebastian

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

* Re: cpufreq driver for nForce2
  2004-06-09 19:50   ` Sebastian Witt
@ 2004-06-10  9:17     ` Dominik Brodowski
  0 siblings, 0 replies; 6+ messages in thread
From: Dominik Brodowski @ 2004-06-10  9:17 UTC (permalink / raw)
  To: Sebastian Witt; +Cc: cpufreq

Hi Sebastian,


On Wed, Jun 09, 2004 at 09:50:59PM +0200, Sebastian Witt wrote:
> http://www.hasw.net/linux/cpufreq-nforce2-0.2.tar.bz2

Looks quite good now, just two minor issues:

nforce2_get() is missing in struct cpufreq_driver nforce2_driver

//#include <linux/slab.h>
can be removed, AFAICS.

	Dominik

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

end of thread, other threads:[~2004-06-10  9:17 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-03 13:32 cpufreq driver for nForce2 Sebastian Witt
2004-06-06 16:20 ` Dominik Brodowski
2004-06-06 19:34   ` Sebastian Witt
2004-06-07 13:19     ` Bruno Ducrot
2004-06-09 19:50   ` Sebastian Witt
2004-06-10  9:17     ` Dominik Brodowski

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.