Hi,
On Wed, 2009-05-27 at 11:46 +0200, Arnaud Patard wrote:
> > Loongson2F add a new capability to dynamic scaling cpu frequency. However
> > the
> > cpu count timer depends on cpu frequency. So an alternative clock must be
> > used
> > if this driver is enabled. Besides, the CPU enter wait state when the
> > frequency
> > is setting zero. All these features help power save.
> >
> > In fuloong(2f) and yeeloong(2f), if you want to use this feature, you
> > should enable the cs5536 mfgpt timer.
[...]
> > diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> > index 74efb43..aa8cd64 100644
> > --- a/arch/mips/Kconfig
> > +++ b/arch/mips/Kconfig
> > @@ -2136,6 +2136,23 @@ source "kernel/power/Kconfig"
> >
> > endmenu
> >
> > +menu "CPU Frequency scaling"
> > +
> > +source "drivers/cpufreq/Kconfig"
> > +
> > +config LOONGSON2F_CPU_FREQ
> > + bool "Loongson-2F CPU Frequency driver"
> > + depends on CPU_LOONGSON2F && CPU_FREQ && CS5536_MFGPT
>
> If I have a clock from (for instance) a i8253 compatible source, one will
> have to add something here. I'm not sure it's a good idea. Did you try
> with something like "select LOONGSON2F_CPU_FREQ" in the machine Kconfig
> entry ?
>
something like "select LOONGSON2F_CPU_FREQ" not work, because users may
do not need LOONGSON2F_CPU_FREQ.
what about this solution?
+config LOONGSON2F_CPU_FREQ + bool "Loongson-2F CPU Frequency driver"
+ depends on CPU_LOONGSON2F && CPU_FREQ && (CS5536_MFGPT || I8253)
> > diff --git a/arch/mips/kernel/loongson2f_freq.c
> > b/arch/mips/kernel/loongson2f_freq.c
> > new file mode 100644
> > index 0000000..183f36b
[...]
> > +static int __init loongson2f_cpufreq_module_init(void)
> > +{
> > + struct cpuinfo_mips *c = &cpu_data[0];
> > + int result;
> > +
> > + if (c->processor_id != PRID_IMP_LOONGSON2F)
> > + return -ENODEV;
>
> How can this happen ? the Kconfig entry depends on CPU_LOONGSON2F so I
> would expect this is useless.
>
i just removed it, thanks!
> > diff --git a/arch/mips/loongson/common/clock.c
> > b/arch/mips/loongson/common/clock.c
> > new file mode 100644
> > index 0000000..a8c648d
> > --- /dev/null
> > +++ b/arch/mips/loongson/common/clock.c
[...]
> > +/*
> > + * This is the simple version of Loongson-2F wait
> > + * Maybe we need do this in interrupt disabled content
> > + */
> > +DEFINE_SPINLOCK(loongson2f_wait_lock);
> > +void loongson2f_cpu_wait(void)
> > +{
> > + u32 cpu_freq;
> > + unsigned long flags;
> > +
> > + spin_lock_irqsave(&loongson2f_wait_lock, flags);
> > + cpu_freq = LOONGSON_CHIPCFG0;
> > + LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */
>
> by doing this, if you want to "wake up" the 2f, you need an external
> interrupt source otherwise your only solution is to power down your
> machine. Are you sure that it's really safe to enable it by default ?
>
sorry, I am not clear why Yanhua use a loongson-specific cpu_wait
here(seems used in loongson2f_freq.c)? perhaps he can explain it. and I
also have a question about it: why not use the "wait" instruction
directly here like r4k_wait() does? or just use the r4k_wait() function
via adding some code in arch/mips/kernel/cpu-probe.c:
void __init check_wait(void)
{
...
switch (c->cputype) {
...
case CPU_PR4450:
case CPU_BCM3302:
case CPU_CAVIUM_OCTEON:
+ case CPU_LOONGSON2:
cpu_wait = r4k_wait;
break;
...
}
and even if we not use cpufreq, is better to enable a loongson-specific
cpu_wait()? cpu_wait() is called in cpu_idle() (defined in
arch/mips/kernel/process.c), does we need cpu_wait() to save power when
cpu is idle?
|