On Thu, Jun 2, 2011 at 09:51, Santosh Shilimkar
<[email protected]> wrote:
> Current OMAP2PLUS CPUfreq tagret() functions returns when all
> the CPU's are not online. This will break DVFS when secondary
> CPUs are offlined.
>
> The intention of that check was just avoid CPU frequency change
> during the window when CPU becomes online but it's cpufreq_init is
> not done yet.
is it this requirement a boot requirement or a necessity for
cpufreq_driver.init being called for online cpus? Since we maintain
just a single freq_table... why do we care about multiple cpu_inits?
Anyways, tried testing this and .config with CONFIG_SMP_ON_UP and
USERSPACE. it works with one cpu and does not scale 2 cpus :(
After applying this patch on kevin's cpufreq branch, I added some
prints for logging:
diff --git a/arch/arm/mach-omap2/omap2plus-cpufreq.c
b/arch/arm/mach-omap2/omap2plus-cpufreq.c
index 909bfcb..89856d5 100644
--- a/arch/arm/mach-omap2/omap2plus-cpufreq.c
+++ b/arch/arm/mach-omap2/omap2plus-cpufreq.c
@@ -83,8 +83,13 @@ static int omap_target(struct cpufreq_policy *policy,
struct cpufreq_freqs freqs;
/* Changes not allowed until all CPUs are online */
- if (is_smp() && (cpus_initialized < num_online_cpus()))
+ if (is_smp() && (cpus_initialized < num_online_cpus())) {
+ pr_err("%s: cpu %d not ready to go to %d (inits=%d vs
online=%d)\n", __func__,
+ policy->cpu, target_freq,
cpus_initialized, num_online_cpus());
return ret;
+ }
+ pr_err("%s: cpu %d ready to go to %d (inits=%d vs online=%d)\n",
__func__,
+ policy->cpu, target_freq, cpus_initialized, num_online_cpus());
/* Ensure desired rate is within allowed range. Some govenors
* (ondemand) will just pass target_freq=0 to get the minimum. */
@@ -197,6 +202,9 @@ static int __cpuinit omap_cpu_init(struct
cpufreq_policy *policy)
cpumask_copy(policy->cpus, cpumask);
cpus_initialized++;
smp_wmb();
+ pr_err("%s: cpu %d cpus_initialized = %d online=%d\n", __func__,
+ policy->cpu, cpus_initialized, num_online_cpus());
+
}
/* FIXME: what's the actual transition time? */
@@ -212,6 +220,8 @@ static int omap_cpu_exit(struct cpufreq_policy *policy)
if (is_smp()) {
cpus_initialized--;
smp_wmb();
+ pr_err("%s: cpu %d cpus_initialized = %d online=%d\n", __func__,
+ policy->cpu, cpus_initialized, num_online_cpus());
}
return 0;
}
on boot, this is what I see:
[ 0.421020] omap_cpu_init: cpu 0 cpus_initialized = 1 online=2
[ 0.421264] omap_target: cpu 0 not ready to go to 1008000 (inits=1
vs online=2)
[ 0.421630] omap_cpu_init: cpu 1 cpus_initialized = 2 online=2
[ 0.421691] omap_cpu_exit: cpu 1 cpus_initialized = 1 online=2
...
snip
...
[ 2.044128] omap_target: cpu 0 not ready to go to 1008000 (inits=1
vs online=2)
[ 2.051849] omap_target: cpu 0 not ready to go to 1008000 (inits=1
vs online=2)
... snip..
...boots up to busybox shell..
/ # head /sys/devices/system/cpu/cpu1/online /sys/devices/system/cpu/cpu0/online
==> /sys/devices/system/cpu/cpu1/online <==
1
==> /sys/devices/system/cpu/cpu0/online <==
1
/ # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
300000 600000 800000 1008000
/ # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
1008000
/ # echo -n "300000">/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
[ 130.257385] omap_target: cpu 0 not ready to go to 300000 (inits=1
vs online=2)
/ # echo -n "0" > /sys/devices/system/cpu/cpu1/online
[ 144.749877] CPU1: shutdown
/ # head /sys/devices/system/cpu/cpu1/online /sys/devices/system/cpu/cpu0/online
==> /sys/devices/system/cpu/cpu1/online <==
0
==> /sys/devices/system/cpu/cpu0/online <==
1
/ # echo -n "350000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
[ 165.881927] omap_target: cpu 0 ready to go to 350000 (inits=1 vs online=1)
[ 165.889526] cpufreq-omap: transition: 1008000 --> 0
/ #
/ # echo -n "1" > /sys/devices/system/cpu/cpu1/online
[ 176.469360] CPU1: Booted secondary processor
[ 176.469421] CPU1: Unknown IPI message 0x1
[ 176.475280] Switched to NOHz mode on CPU #1
[ 176.600891] omap_cpu_init: cpu 1 cpus_initialized = 2 online=2
[ 176.620178] omap_cpu_exit: cpu 1 cpus_initialized = 1 online=2
[ 176.626373] omap_target: cpu 0 not ready to go to 350000 (inits=1
vs online=2)
Regards,
Nishanth Menon
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html