From: Kevin Hilman <khilman@ti.com>
To: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
Russell King <rmk+kernel@arm.linux.org.uk>
Subject: Re: [pm-wip/cpufreq] [PATCH] OMAP2+: CPUfreq: update lpj with reference value to avoid progressive error.
Date: Mon, 11 Jul 2011 11:51:00 -0700 [thread overview]
Message-ID: <87d3hgzm5n.fsf@ti.com> (raw)
In-Reply-To: <1310406004-5060-1-git-send-email-santosh.shilimkar@ti.com> (Santosh Shilimkar's message of "Mon, 11 Jul 2011 23:10:04 +0530")
Santosh Shilimkar <santosh.shilimkar@ti.com> writes:
> From: Russell King <rmk+kernel@arm.linux.org.uk>
>
> Adjust _both_ the per-cpu loops_per_jiffy and global lpj. Calibrate them
> with with reference to the initial values to avoid a progressively
> bigger and bigger error in the value over time.
>
> While at this, re-use the notifiers for UP/SMP since on
> UP machine or UP_ON_SMP policy->cpus mask would contain only
> the boot CPU.
>
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> [santosh.shilimkar@ti.com: re-based against omap cpufreq
> upstream branch and fixed notifiers]
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> Cc: Kevin Hilman <khilman@ti.com>
Thanks, applied to pm-wip/cpufreq branch.
Kevin
> ---
> Patch is outcome of below discussion.
> http://www.mail-archive.com/linux-omap@vger.kernel.org/msg51559.html
>
> arch/arm/mach-omap2/omap2plus-cpufreq.c | 50 ++++++++++++++++--------------
> 1 files changed, 27 insertions(+), 23 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap2plus-cpufreq.c b/arch/arm/mach-omap2/omap2plus-cpufreq.c
> index 1f3b2e1..de82e87 100644
> --- a/arch/arm/mach-omap2/omap2plus-cpufreq.c
> +++ b/arch/arm/mach-omap2/omap2plus-cpufreq.c
> @@ -38,6 +38,16 @@
>
> #include <mach/hardware.h>
>
> +#ifdef CONFIG_SMP
> +struct lpj_info {
> + unsigned long ref;
> + unsigned int freq;
> +};
> +
> +static DEFINE_PER_CPU(struct lpj_info, lpj_ref);
> +static struct lpj_info global_lpj_ref;
> +#endif
> +
> static struct cpufreq_frequency_table *freq_table;
> static atomic_t freq_table_users = ATOMIC_INIT(0);
> static struct clk *mpu_clk;
> @@ -96,37 +106,18 @@ static int omap_target(struct cpufreq_policy *policy,
> if (freqs.old == freqs.new && policy->cur == freqs.new)
> return ret;
>
> - if (!is_smp()) {
> - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
> - goto set_freq;
> - }
> -
> /* notifiers */
> for_each_cpu(i, policy->cpus) {
> freqs.cpu = i;
> cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
> }
>
> -set_freq:
> #ifdef CONFIG_CPU_FREQ_DEBUG
> pr_info("cpufreq-omap: transition: %u --> %u\n", freqs.old, freqs.new);
> #endif
>
> ret = clk_set_rate(mpu_clk, freqs.new * 1000);
> -
> - /*
> - * Generic CPUFREQ driver jiffy update is under !SMP. So jiffies
> - * won't get updated when UP machine cpufreq build with
> - * CONFIG_SMP enabled. Below code is added only to manage that
> - * scenario
> - */
> freqs.new = omap_getspeed(policy->cpu);
> - if (!is_smp()) {
> - loops_per_jiffy =
> - cpufreq_scale(loops_per_jiffy, freqs.old, freqs.new);
> - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
> - goto skip_lpj;
> - }
>
> #ifdef CONFIG_SMP
> /*
> @@ -134,10 +125,24 @@ set_freq:
> * cpufreq driver. So, update the per-CPU loops_per_jiffy value
> * on frequency transition. We need to update all dependent CPUs.
> */
> - for_each_cpu(i, policy->cpus)
> + for_each_cpu(i, policy->cpus) {
> + struct lpj_info *lpj = &per_cpu(lpj_ref, i);
> + if (!lpj->freq) {
> + lpj->ref = per_cpu(cpu_data, i).loops_per_jiffy;
> + lpj->freq = freqs.old;
> + }
> +
> per_cpu(cpu_data, i).loops_per_jiffy =
> - cpufreq_scale(per_cpu(cpu_data, i).loops_per_jiffy,
> - freqs.old, freqs.new);
> + cpufreq_scale(lpj->ref, lpj->freq, freqs.new);
> + }
> +
> + /* And don't forget to adjust the global one */
> + if (!global_lpj_ref.freq) {
> + global_lpj_ref.ref = loops_per_jiffy;
> + global_lpj_ref.freq = freqs.old;
> + }
> + loops_per_jiffy = cpufreq_scale(global_lpj_ref.ref, global_lpj_ref.freq,
> + freqs.new);
> #endif
>
> /* notifiers */
> @@ -146,7 +151,6 @@ set_freq:
> cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
> }
>
> -skip_lpj:
> return ret;
> }
WARNING: multiple messages have this Message-ID (diff)
From: khilman@ti.com (Kevin Hilman)
To: linux-arm-kernel@lists.infradead.org
Subject: [pm-wip/cpufreq] [PATCH] OMAP2+: CPUfreq: update lpj with reference value to avoid progressive error.
Date: Mon, 11 Jul 2011 11:51:00 -0700 [thread overview]
Message-ID: <87d3hgzm5n.fsf@ti.com> (raw)
In-Reply-To: <1310406004-5060-1-git-send-email-santosh.shilimkar@ti.com> (Santosh Shilimkar's message of "Mon, 11 Jul 2011 23:10:04 +0530")
Santosh Shilimkar <santosh.shilimkar@ti.com> writes:
> From: Russell King <rmk+kernel@arm.linux.org.uk>
>
> Adjust _both_ the per-cpu loops_per_jiffy and global lpj. Calibrate them
> with with reference to the initial values to avoid a progressively
> bigger and bigger error in the value over time.
>
> While at this, re-use the notifiers for UP/SMP since on
> UP machine or UP_ON_SMP policy->cpus mask would contain only
> the boot CPU.
>
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> [santosh.shilimkar at ti.com: re-based against omap cpufreq
> upstream branch and fixed notifiers]
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
> Cc: Kevin Hilman <khilman@ti.com>
Thanks, applied to pm-wip/cpufreq branch.
Kevin
> ---
> Patch is outcome of below discussion.
> http://www.mail-archive.com/linux-omap at vger.kernel.org/msg51559.html
>
> arch/arm/mach-omap2/omap2plus-cpufreq.c | 50 ++++++++++++++++--------------
> 1 files changed, 27 insertions(+), 23 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap2plus-cpufreq.c b/arch/arm/mach-omap2/omap2plus-cpufreq.c
> index 1f3b2e1..de82e87 100644
> --- a/arch/arm/mach-omap2/omap2plus-cpufreq.c
> +++ b/arch/arm/mach-omap2/omap2plus-cpufreq.c
> @@ -38,6 +38,16 @@
>
> #include <mach/hardware.h>
>
> +#ifdef CONFIG_SMP
> +struct lpj_info {
> + unsigned long ref;
> + unsigned int freq;
> +};
> +
> +static DEFINE_PER_CPU(struct lpj_info, lpj_ref);
> +static struct lpj_info global_lpj_ref;
> +#endif
> +
> static struct cpufreq_frequency_table *freq_table;
> static atomic_t freq_table_users = ATOMIC_INIT(0);
> static struct clk *mpu_clk;
> @@ -96,37 +106,18 @@ static int omap_target(struct cpufreq_policy *policy,
> if (freqs.old == freqs.new && policy->cur == freqs.new)
> return ret;
>
> - if (!is_smp()) {
> - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
> - goto set_freq;
> - }
> -
> /* notifiers */
> for_each_cpu(i, policy->cpus) {
> freqs.cpu = i;
> cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
> }
>
> -set_freq:
> #ifdef CONFIG_CPU_FREQ_DEBUG
> pr_info("cpufreq-omap: transition: %u --> %u\n", freqs.old, freqs.new);
> #endif
>
> ret = clk_set_rate(mpu_clk, freqs.new * 1000);
> -
> - /*
> - * Generic CPUFREQ driver jiffy update is under !SMP. So jiffies
> - * won't get updated when UP machine cpufreq build with
> - * CONFIG_SMP enabled. Below code is added only to manage that
> - * scenario
> - */
> freqs.new = omap_getspeed(policy->cpu);
> - if (!is_smp()) {
> - loops_per_jiffy =
> - cpufreq_scale(loops_per_jiffy, freqs.old, freqs.new);
> - cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
> - goto skip_lpj;
> - }
>
> #ifdef CONFIG_SMP
> /*
> @@ -134,10 +125,24 @@ set_freq:
> * cpufreq driver. So, update the per-CPU loops_per_jiffy value
> * on frequency transition. We need to update all dependent CPUs.
> */
> - for_each_cpu(i, policy->cpus)
> + for_each_cpu(i, policy->cpus) {
> + struct lpj_info *lpj = &per_cpu(lpj_ref, i);
> + if (!lpj->freq) {
> + lpj->ref = per_cpu(cpu_data, i).loops_per_jiffy;
> + lpj->freq = freqs.old;
> + }
> +
> per_cpu(cpu_data, i).loops_per_jiffy =
> - cpufreq_scale(per_cpu(cpu_data, i).loops_per_jiffy,
> - freqs.old, freqs.new);
> + cpufreq_scale(lpj->ref, lpj->freq, freqs.new);
> + }
> +
> + /* And don't forget to adjust the global one */
> + if (!global_lpj_ref.freq) {
> + global_lpj_ref.ref = loops_per_jiffy;
> + global_lpj_ref.freq = freqs.old;
> + }
> + loops_per_jiffy = cpufreq_scale(global_lpj_ref.ref, global_lpj_ref.freq,
> + freqs.new);
> #endif
>
> /* notifiers */
> @@ -146,7 +151,6 @@ set_freq:
> cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
> }
>
> -skip_lpj:
> return ret;
> }
next prev parent reply other threads:[~2011-07-11 18:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-11 17:40 [pm-wip/cpufreq] [PATCH] OMAP2+: CPUfreq: update lpj with reference value to avoid progressive error Santosh Shilimkar
2011-07-11 17:40 ` Santosh Shilimkar
2011-07-11 18:51 ` Kevin Hilman [this message]
2011-07-11 18:51 ` Kevin Hilman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87d3hgzm5n.fsf@ti.com \
--to=khilman@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=rmk+kernel@arm.linux.org.uk \
--cc=santosh.shilimkar@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.