Hi Robert,
The Linaro project has a script that started as your setup_sdcard.sh
called linaro_media_create. As part of our release process we need to
have licenses for our files and since our script is based on yours,
your choice of license affects what choices we have. So long story
short, your file has no license included so care to add one or just
tell us what the license is so we can give our script a compatible if
not identical one?
Thanks
John
Hey folks
I'd like to mirror and test the latest build of
http://snapshots.linaro.org/10.11-daily/linaro-headless/
but I have two issues with this:
* having some kind of direct link to the latest image so that I don't
need to parse the HTML to get the latest build; something like
/latest/ or /current/ would help here
* having a constant name for the data as to be rsync friendly; that is,
if the image is named linaro-m-headless-tar-20100923-0.tar.gz and
linaro-m-headless-tar-20100924-0.tar.gz the next day, it's hard to
convince rsync that the data file from the 24th can be mostly
inferred from the contents of the 23th; if it was named
linaro-m-headless-tar.tar.gz, I would have no problem
Where should I be filing bugs to track these requests, and who should I
harass to get these resolved? :-)
Thanks!
--
Loïc Minier
Currently cpufreq transition latency value does not really reflect the actual
OMAP OPP transition delay. This patch has the actual latency value.
I did profile the DVFS latency on OMAP3430, OMAP3630 and OMAP4 for worstcase(MPU and Core together) and found that in none of these platforms, transiton value
goes beyong 10ms. Added a buffer of 20ms to avoid too frequent ondemand timer
expiry.
With this change, performance of ondemand governor is improved when tested
using cpufreqbench tool. Without this patch, cpufreq-bench reported ondemand
performance as 40% of performance governor, and with this patch it's around 70%
(using below procedure).
cpufreq-bench:
http://lwn.net/Articles/339862/http://ftp.riken.go.jp/archives/Linux/suse/people/ckornacker/cpufreq-bench/
Command used for performance testing:
cpufreq-bench -l 50000 -s 100000 -x 50000 -y 100000 -g ondemand -r 5 -n 5 -v
Signed-off-by: Vishwanath BS <vishwanath.bs(a)ti.com>
---
arch/arm/plat-omap/cpu-omap.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
mode change 100644 => 100755 arch/arm/plat-omap/cpu-omap.c
diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c
old mode 100644
new mode 100755
index c47faf8..d3fc423
--- a/arch/arm/plat-omap/cpu-omap.c
+++ b/arch/arm/plat-omap/cpu-omap.c
@@ -158,8 +158,8 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy)
policy->max = policy->cpuinfo.max_freq;
policy->cur = omap_getspeed(0);
- /* FIXME: what's the actual transition time? */
- policy->cpuinfo.transition_latency = 300 * 1000;
+ /* Program the actual transition time for worstcase */
+ policy->cpuinfo.transition_latency = 30 * 1000;
return 0;
}
--
1.7.0.4
Hi Stephen,
please consider to start merging our ux500-core branch into
linux-next:
git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson.git
Branch: ux500-core
(NB: there is a "next" branch, which include patches to multiple
subsystems, don't merge that, this is just the ux500 core.)
I rebase this regularly to Torvalds' -rc tags, hope that's OK.
All code is being reviewed on the linux-arm-kernel list, and the
patches here are intended for pull request to Russell King who
in turn take them upstream. I hope this procedure is
acceptable.
We currently have some of these patches in Russells patch tracker
as well, but they will be taken out in favor of the pull approach
once this branch lands in -next.
Yours,
Linus Walleij
Greetings,
Enclosed you'll find a link to the agenda, minutes and actions from the
Linaro kernel working group weekly meeting of November 29, 2010.
https://wiki.linaro.org/WorkingGroups/KernelConsolidation/Meetings/2010-11-…
== Summary ==
* Focusing on completing of the blueprints Definitions (Specifications).
* Started the implementation phase of the blueprints.
* Working on pushing patches upstream:
* u-boot patches
* PIO driver
* 5500 flash related code
* One Android patch submitted by John was accepted into -tip
* Thumb2 SMP/Uniprocessor runtime switch on Versatile Express, also on
multiple ARM platforms with single kernel.
* Fixed and opened bugs
* Fixed two Linaro bugs on iMX51 uboot
* opened a bug against toolchain code sourcery.
* Packaged a kernel, 2.6.37-rc3 made all the Ubuntu sauce apply cleanly!!!
packaged kernel will be done every few weeks in general. Loic does
non-packaged nightly kernel builds for more frequent testing.
* Working on definition document on what the Linaro tree really is: what is
accepted, what it can be used for, what it really is. People seem to be
getting more comfortable with the Linaro tree.
Regards,
Mounir
The goal of this patch is to remove as much duplicated code as
possible in each platform hotplug file. I have also tried to keep in
mind that current platform upstreamed code make nearly no power
management in their current implementation. I have added a new
interface and a new file in order to
-Keep the current interface as it is. So each platform could move to
common code when they want
-Have a dedicated file for arm hotplug function in which we can add
all code that must be executed on an arm core whatever the platform
(flushing cache, SCU disabling and handling spurious wake up as a
staring point). I agree that the current code is quite small for now
and we can wonder if a dedicated file is useful, code might be put in
kernel/smp.c file.
The next step is also to add some hotplug tracepoints and I would
prefer to add the tracepoints only in a platform independent code.
With the common code, a new arm platform can have the hotplug feature
with less than 20 lines (power management not included) and can be
sure that minimal actions will be handled by the common Arm code.
We can also keep the platform_cpu_die has the platform entry point and
move the common part into kernel/smp.c file. We still have few
duplicated code (spurious wake-up) but this seems to be acceptable.
I have taken your example into account and have updated the patch accordingly
Vincent
On 29 November 2010 11:41, Russell King - ARM Linux
<linux(a)arm.linux.org.uk> wrote:
> On Mon, Nov 29, 2010 at 10:54:35AM +0100, Vincent Guittot wrote:
>> This patch extracts the common code of the cpu hotplug feature across
>> arm platforms. The goal is to only keep the specific stuff of the
>> platform in the sub-architecture. I have created a hotplug.c file in
>> the arm/common directory after studying the cpu hotplug code of
>> omap2, realview, s5pv310, ux500 and tegra. I have extracted 3 main
>> platform dependent functions:
>> -platform_enter_lowpower which prepares the platform for low power.
>> -platform_do_lowpower on which the cpu will loop until it becomes
>> really plugged (spurious wake up). This function must returned the cpu
>> Id in order to leave the unplug state.
>> -platform_leave_lowpower which restore the platform context.
>
> I still do not like this patch. The only thing that is worth doing is
> this. This leaves less than 256 bytes of object code in the Realview
> hotplug.c, most of which is the stuff to handle the low power mode
> which you haven't dealt with in your patch either.
>
> I see no point in adding another API on top of the already existing
> and simple API.
>
Signed-off-by: Vincent Guittot <vincent.guittot(a)linaro.org>
---
arch/arm/kernel/smp.c | 35 ++++++++++++++++++++----
arch/arm/mach-omap2/omap-hotplug.c | 28 -------------------
arch/arm/mach-realview/hotplug.c | 29 --------------------
arch/arm/mach-s5pv310/hotplug.c | 29 --------------------
arch/arm/mach-tegra/hotplug.c | 30 ---------------------
arch/arm/mach-ux500/hotplug.c | 51 +++++-------------------------------
6 files changed, 36 insertions(+), 166 deletions(-)
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 8c19595..03042db 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -24,6 +24,7 @@
#include <linux/irq.h>
#include <linux/percpu.h>
#include <linux/clockchips.h>
+#include <linux/completion.h>
#include <asm/atomic.h>
#include <asm/cacheflush.h>
@@ -213,11 +214,13 @@ int __cpu_disable(void)
{
unsigned int cpu = smp_processor_id();
struct task_struct *p;
- int ret;
- ret = platform_cpu_disable(cpu);
- if (ret)
- return ret;
+ /*
+ * we don't allow CPU 0 to be shutdown (it is still too special
+ * e.g. clock tick interrupts)
+ */
+ if (cpu == 0)
+ return -EPERM;
/*
* Take this CPU offline. Once we clear this, we can't return,
@@ -252,14 +255,16 @@ int __cpu_disable(void)
return 0;
}
+static DECLARE_COMPLETION(cpu_killed);
+
/*
* called on the thread which is asking for a CPU to be shutdown -
* waits until shutdown has completed, or it is timed out.
*/
void __cpu_die(unsigned int cpu)
{
- if (!platform_cpu_kill(cpu))
- printk("CPU%u: unable to kill\n", cpu);
+ if (!wait_for_completion_timeout(&cpu_killed, 5000))
+ printk(KERN_NOTICE "CPU%u: cpu didn't die\n", cpu);
}
/*
@@ -273,14 +278,32 @@ void __cpu_die(unsigned int cpu)
void __ref cpu_die(void)
{
unsigned int cpu = smp_processor_id();
+#ifdef DEBUG
+ unsigned int this_cpu = hard_smp_processor_id();
+#endif
local_irq_disable();
idle_task_exit();
+ printk(KERN_NOTICE "CPU%u: shutdown\n", cpu);
+ complete(&cpu_killed);
+
+#ifdef DEBUG
+ if (cpu != this_cpu) {
+ printk(KERN_CRIT "Eek! platform_cpu_die is going to run on %u,
should be %u\n",
+ this_cpu, cpu);
+ BUG();
+ }
+#endif
+
+ flush_cache_all();
+ wmb();
+
/*
* actual CPU shutdown procedure is at least platform (if not
* CPU) specific
*/
+
platform_cpu_die(cpu);
/*
diff --git a/arch/arm/mach-omap2/omap-hotplug.c
b/arch/arm/mach-omap2/omap-hotplug.c
index 6cee456..00f4190 100644
--- a/arch/arm/mach-omap2/omap-hotplug.c
+++ b/arch/arm/mach-omap2/omap-hotplug.c
@@ -17,35 +17,15 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
-#include <linux/completion.h>
-#include <asm/cacheflush.h>
#include <mach/omap4-common.h>
-static DECLARE_COMPLETION(cpu_killed);
-
-int platform_cpu_kill(unsigned int cpu)
-{
- return wait_for_completion_timeout(&cpu_killed, 5000);
-}
-
/*
* platform-specific code to shutdown a CPU
* Called with IRQs disabled
*/
void platform_cpu_die(unsigned int cpu)
{
- unsigned int this_cpu = hard_smp_processor_id();
-
- if (cpu != this_cpu) {
- pr_crit("platform_cpu_die running on %u, should be %u\n",
- this_cpu, cpu);
- BUG();
- }
- pr_notice("CPU%u: shutdown\n", cpu);
- complete(&cpu_killed);
- flush_cache_all();
- dsb();
/*
* we're ready for shutdown now, so do it
@@ -69,11 +49,3 @@ void platform_cpu_die(unsigned int cpu)
}
}
-int platform_cpu_disable(unsigned int cpu)
-{
- /*
- * we don't allow CPU 0 to be shutdown (it is still too special
- * e.g. clock tick interrupts)
- */
- return cpu == 0 ? -EPERM : 0;
-}
diff --git a/arch/arm/mach-realview/hotplug.c b/arch/arm/mach-realview/hotplug.c
index f95521a..580cf7c 100644
--- a/arch/arm/mach-realview/hotplug.c
+++ b/arch/arm/mach-realview/hotplug.c
@@ -11,19 +11,16 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
-#include <linux/completion.h>
#include <asm/cacheflush.h>
extern volatile int pen_release;
-static DECLARE_COMPLETION(cpu_killed);
static inline void cpu_enter_lowpower(void)
{
unsigned int v;
- flush_cache_all();
asm volatile(
" mcr p15, 0, %1, c7, c5, 0\n"
" mcr p15, 0, %1, c7, c10, 4\n"
@@ -93,11 +90,6 @@ static inline void platform_do_lowpower(unsigned int cpu)
}
}
-int platform_cpu_kill(unsigned int cpu)
-{
- return wait_for_completion_timeout(&cpu_killed, 5000);
-}
-
/*
* platform-specific code to shutdown a CPU
*
@@ -105,18 +97,6 @@ int platform_cpu_kill(unsigned int cpu)
*/
void platform_cpu_die(unsigned int cpu)
{
-#ifdef DEBUG
- unsigned int this_cpu = hard_smp_processor_id();
-
- if (cpu != this_cpu) {
- printk(KERN_CRIT "Eek! platform_cpu_die running on %u, should be %u\n",
- this_cpu, cpu);
- BUG();
- }
-#endif
-
- printk(KERN_NOTICE "CPU%u: shutdown\n", cpu);
- complete(&cpu_killed);
/*
* we're ready for shutdown now, so do it
@@ -130,12 +110,3 @@ void platform_cpu_die(unsigned int cpu)
*/
cpu_leave_lowpower();
}
-
-int platform_cpu_disable(unsigned int cpu)
-{
- /*
- * we don't allow CPU 0 to be shutdown (it is still too special
- * e.g. clock tick interrupts)
- */
- return cpu == 0 ? -EPERM : 0;
-}
diff --git a/arch/arm/mach-s5pv310/hotplug.c b/arch/arm/mach-s5pv310/hotplug.c
index 03652c3..59eafad 100644
--- a/arch/arm/mach-s5pv310/hotplug.c
+++ b/arch/arm/mach-s5pv310/hotplug.c
@@ -13,19 +13,16 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
-#include <linux/completion.h>
#include <asm/cacheflush.h>
extern volatile int pen_release;
-static DECLARE_COMPLETION(cpu_killed);
static inline void cpu_enter_lowpower(void)
{
unsigned int v;
- flush_cache_all();
asm volatile(
" mcr p15, 0, %1, c7, c5, 0\n"
" mcr p15, 0, %1, c7, c10, 4\n"
@@ -96,11 +93,6 @@ static inline void platform_do_lowpower(unsigned int cpu)
}
}
-int platform_cpu_kill(unsigned int cpu)
-{
- return wait_for_completion_timeout(&cpu_killed, 5000);
-}
-
/*
* platform-specific code to shutdown a CPU
*
@@ -108,19 +100,6 @@ int platform_cpu_kill(unsigned int cpu)
*/
void platform_cpu_die(unsigned int cpu)
{
-#ifdef DEBUG
- unsigned int this_cpu = hard_smp_processor_id();
-
- if (cpu != this_cpu) {
- printk(KERN_CRIT "Eek! platform_cpu_die running on %u, should be %u\n",
- this_cpu, cpu);
- BUG();
- }
-#endif
-
- printk(KERN_NOTICE "CPU%u: shutdown\n", cpu);
- complete(&cpu_killed);
-
/*
* we're ready for shutdown now, so do it
*/
@@ -134,11 +113,3 @@ void platform_cpu_die(unsigned int cpu)
cpu_leave_lowpower();
}
-int platform_cpu_disable(unsigned int cpu)
-{
- /*
- * we don't allow CPU 0 to be shutdown (it is still too special
- * e.g. clock tick interrupts)
- */
- return cpu == 0 ? -EPERM : 0;
-}
diff --git a/arch/arm/mach-tegra/hotplug.c b/arch/arm/mach-tegra/hotplug.c
index 8e7f115..7e5eb3d 100644
--- a/arch/arm/mach-tegra/hotplug.c
+++ b/arch/arm/mach-tegra/hotplug.c
@@ -11,17 +11,14 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
-#include <linux/completion.h>
#include <asm/cacheflush.h>
-static DECLARE_COMPLETION(cpu_killed);
static inline void cpu_enter_lowpower(void)
{
unsigned int v;
- flush_cache_all();
asm volatile(
" mcr p15, 0, %1, c7, c5, 0\n"
" mcr p15, 0, %1, c7, c10, 4\n"
@@ -92,11 +89,6 @@ static inline void platform_do_lowpower(unsigned int cpu)
}
}
-int platform_cpu_kill(unsigned int cpu)
-{
- return wait_for_completion_timeout(&cpu_killed, 5000);
-}
-
/*
* platform-specific code to shutdown a CPU
*
@@ -104,19 +96,6 @@ int platform_cpu_kill(unsigned int cpu)
*/
void platform_cpu_die(unsigned int cpu)
{
-#ifdef DEBUG
- unsigned int this_cpu = hard_smp_processor_id();
-
- if (cpu != this_cpu) {
- printk(KERN_CRIT "Eek! platform_cpu_die running on %u, should be %u\n",
- this_cpu, cpu);
- BUG();
- }
-#endif
-
- printk(KERN_NOTICE "CPU%u: shutdown\n", cpu);
- complete(&cpu_killed);
-
/*
* we're ready for shutdown now, so do it
*/
@@ -129,12 +108,3 @@ void platform_cpu_die(unsigned int cpu)
*/
cpu_leave_lowpower();
}
-
-int platform_cpu_disable(unsigned int cpu)
-{
- /*
- * we don't allow CPU 0 to be shutdown (it is still too special
- * e.g. clock tick interrupts)
- */
- return cpu == 0 ? -EPERM : 0;
-}
diff --git a/arch/arm/mach-ux500/hotplug.c b/arch/arm/mach-ux500/hotplug.c
index b782a03..37b443b 100644
--- a/arch/arm/mach-ux500/hotplug.c
+++ b/arch/arm/mach-ux500/hotplug.c
@@ -6,23 +6,22 @@
* Based on ARM realview platform
*
* Author: Sundar Iyer <sundar.iyer(a)stericsson.com>
+ * Author: vincent.guittot <vincent.guittot(a)stericsson.com>
*
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
-#include <linux/completion.h>
-
-#include <asm/cacheflush.h>
extern volatile int pen_release;
-static DECLARE_COMPLETION(cpu_killed);
-
-static inline void platform_do_lowpower(unsigned int cpu)
+/*
+ * platform-specific code to shutdown a CPU
+ *
+ * Called with IRQs disabled
+ */
+void platform_cpu_die(unsigned int cpu)
{
- flush_cache_all();
-
/* we put the platform to just WFI */
for (;;) {
__asm__ __volatile__("dsb\n\t" "wfi\n\t"
@@ -36,40 +35,4 @@ static inline void platform_do_lowpower(unsigned int cpu)
}
}
-int platform_cpu_kill(unsigned int cpu)
-{
- return wait_for_completion_timeout(&cpu_killed, 5000);
-}
-
-/*
- * platform-specific code to shutdown a CPU
- *
- * Called with IRQs disabled
- */
-void platform_cpu_die(unsigned int cpu)
-{
-#ifdef DEBUG
- unsigned int this_cpu = hard_smp_processor_id();
-
- if (cpu != this_cpu) {
- printk(KERN_CRIT "Eek! platform_cpu_die running on %u, should be %u\n",
- this_cpu, cpu);
- BUG();
- }
-#endif
-
- printk(KERN_NOTICE "CPU%u: shutdown\n", cpu);
- complete(&cpu_killed);
-
- /* directly enter low power state, skipping secure registers */
- platform_do_lowpower(cpu);
-}
-int platform_cpu_disable(unsigned int cpu)
-{
- /*
- * we don't allow CPU 0 to be shutdown (it is still too special
- * e.g. clock tick interrupts)
- */
- return cpu == 0 ? -EPERM : 0;
-}
--
1.7.0.4
I sat down and measured the power consumption of the NEON unit on an
OMAP3. Method and results are here:
https://wiki.linaro.org/MichaelHope/Sandbox/NEONPower
The board takes 2.37 W and the NEON unit adds an extra 120 mW.
Assuming the core takes 1 W, then the code needs to run 12 % faster
with NEON on to be a net power win.
Note that the results are inaccurate but valid enough.
-- Michael