Patchwork [U-Boot,RFC] OMAP: Timer: Replace bss variable by gd

login
register
mail settings
Submitter Dirk Behme
Date Dec. 9, 2010, 4:31 p.m.
Message ID <1291912288-27536-1-git-send-email-dirk.behme@gmail.com>
Download mbox | patch
Permalink /patch/74932/
State Accepted
Commit b03c8403cd770332778eec9142f136a9c870aaeb
Delegated to: Sandeep Paulraj
Headers show

Comments

Dirk Behme - Dec. 9, 2010, 4:31 p.m.
Reuse the gd->tbl value for timestamp and add gd->lastinc for lastinc bss
values in the OMAP timer driver.

The usage of bss values in drivers before initialisation of bss is forbidden.
In that special case some data in .rel.dyn gets corrupted.

Signed-off-by: Dirk Behme <dirk.behme@gmail.com>

---

Note: This is compile tested only (therefore the RFC). Please *test*
      on real OMAP HW, e.g. Beagle.

This is change is inspired by

http://git.denx.de/u-boot.git/?p=u-boot.git;a=commitdiff;h=a429db7e3ce6136f80f22584588247926ba60b05

 arch/arm/cpu/armv7/omap-common/timer.c |   22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)
John Rigby - Dec. 9, 2010, 11:12 p.m.
On Thu, Dec 9, 2010 at 9:31 AM, Dirk Behme <dirk.behme@googlemail.com> wrote:
> Reuse the gd->tbl value for timestamp and add gd->lastinc for lastinc bss
> values in the OMAP timer driver.
>
> The usage of bss values in drivers before initialisation of bss is forbidden.
> In that special case some data in .rel.dyn gets corrupted.
>
> Signed-off-by: Dirk Behme <dirk.behme@gmail.com>
>
Works for me on Beagle xM Rev A

Tested-by: John Rigby <john.rigby@linaro.org>
Nishanth Menon - Dec. 10, 2010, 12:06 a.m.
On Thu, Dec 9, 2010 at 10:31 AM, Dirk Behme <dirk.behme@googlemail.com> wrote:
> Reuse the gd->tbl value for timestamp and add gd->lastinc for lastinc bss
> values in the OMAP timer driver.
>
> The usage of bss values in drivers before initialisation of bss is forbidden.
> In that special case some data in .rel.dyn gets corrupted.
>
> Signed-off-by: Dirk Behme <dirk.behme@gmail.com>
>
> ---
>
> Note: This is compile tested only (therefore the RFC). Please *test*
>      on real OMAP HW, e.g. Beagle.
>
> This is change is inspired by
>
> http://git.denx.de/u-boot.git/?p=u-boot.git;a=commitdiff;h=a429db7e3ce6136f80f22584588247926ba60b05
>
>  arch/arm/cpu/armv7/omap-common/timer.c |   22 +++++++++++-----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
>
> Index: u-boot.git/arch/arm/cpu/armv7/omap-common/timer.c
> ===================================================================
> --- u-boot.git.orig/arch/arm/cpu/armv7/omap-common/timer.c
> +++ u-boot.git/arch/arm/cpu/armv7/omap-common/timer.c
> @@ -35,8 +35,8 @@
>  #include <common.h>
>  #include <asm/io.h>
>
> -static ulong timestamp;
> -static ulong lastinc;
> +DECLARE_GLOBAL_DATA_PTR;
> +
>  static struct gptimer *timer_base = (struct gptimer *)CONFIG_SYS_TIMERBASE;
>

[...]

Tested-by: Nishanth Menon <nm@ti.com>
Acked-by: Nishanth Menon <nm@ti.com

Tested on OMAP4 pandaboard with codesourcery 2010.09 gcc 4.5.1 and is
seen to fix the issue I reported on
http://groups.google.com/group/pandaboard/browse_thread/thread/d59461353a5e693f

Tests:
on u-boot prompt:
sleep 5 (test if time delays are still functional) -> Pass
mmc boot to MeeGo filesystem -> Pass

Thanks a bunch Dirk - just had started to debug this and steve pointed this out.


Regards,
Nishanth Menon
Dirk Behme - Dec. 10, 2010, 5:22 a.m.
On 09.12.2010 17:31, Dirk Behme wrote:
> Reuse the gd->tbl value for timestamp and add gd->lastinc for lastinc bss
> values in the OMAP timer driver.
>
> The usage of bss values in drivers before initialisation of bss is forbidden.
> In that special case some data in .rel.dyn gets corrupted.
>
> Signed-off-by: Dirk Behme<dirk.behme@gmail.com>

Tested-by: John Rigby <john.rigby@linaro.org>
Tested-by: Nishanth Menon <nm@ti.com>
Acked-by: Nishanth Menon <nm@ti.com

> Note: This is compile tested only (therefore the RFC). Please *test*
>        on real OMAP HW, e.g. Beagle.

To the custodian who has to apply this: Regarding the RFC in the 
subject: Now that this patch is confirmed to work, will you apply this 
patch as is? Or do I have to resend it without 'RFC'?

Many tanks for testing!

Dirk

> This is change is inspired by
>
> http://git.denx.de/u-boot.git/?p=u-boot.git;a=commitdiff;h=a429db7e3ce6136f80f22584588247926ba60b05
>
>   arch/arm/cpu/armv7/omap-common/timer.c |   22 +++++++++++-----------
>   1 file changed, 11 insertions(+), 11 deletions(-)
>
> Index: u-boot.git/arch/arm/cpu/armv7/omap-common/timer.c
> ===================================================================
> --- u-boot.git.orig/arch/arm/cpu/armv7/omap-common/timer.c
> +++ u-boot.git/arch/arm/cpu/armv7/omap-common/timer.c
> @@ -35,8 +35,8 @@
>   #include<common.h>
>   #include<asm/io.h>
>
> -static ulong timestamp;
> -static ulong lastinc;
> +DECLARE_GLOBAL_DATA_PTR;
> +
>   static struct gptimer *timer_base = (struct gptimer *)CONFIG_SYS_TIMERBASE;
>
>   /*
> @@ -74,7 +74,7 @@ ulong get_timer(ulong base)
>
>   void set_timer(ulong t)
>   {
> -	timestamp = t;
> +	gd->tbl = t;
>   }
>
>   /* delay x useconds */
> @@ -96,8 +96,8 @@ void __udelay(unsigned long usec)
>   void reset_timer_masked(void)
>   {
>   	/* reset time, capture current incrementer value time */
> -	lastinc = readl(&timer_base->tcrr) / (TIMER_CLOCK / CONFIG_SYS_HZ);
> -	timestamp = 0;		/* start "advancing" time stamp from 0 */
> +	gd->lastinc = readl(&timer_base->tcrr) / (TIMER_CLOCK / CONFIG_SYS_HZ);
> +	gd->tbl = 0;		/* start "advancing" time stamp from 0 */
>   }
>
>   ulong get_timer_masked(void)
> @@ -105,14 +105,14 @@ ulong get_timer_masked(void)
>   	/* current tick value */
>   	ulong now = readl(&timer_base->tcrr) / (TIMER_CLOCK / CONFIG_SYS_HZ);
>
> -	if (now>= lastinc)	/* normal mode (non roll) */
> +	if (now>= gd->lastinc)	/* normal mode (non roll) */
>   		/* move stamp fordward with absoulte diff ticks */
> -		timestamp += (now - lastinc);
> +		gd->tbl += (now - gd->lastinc);
>   	else	/* we have rollover of incrementer */
> -		timestamp += ((TIMER_LOAD_VAL / (TIMER_CLOCK / CONFIG_SYS_HZ))
> -				- lastinc) + now;
> -	lastinc = now;
> -	return timestamp;
> +		gd->tbl += ((TIMER_LOAD_VAL / (TIMER_CLOCK / CONFIG_SYS_HZ))
> +			     - gd->lastinc) + now;
> +	gd->lastinc = now;
> +	return gd->tbl;
>   }
>
>   /*
>
Heiko Schocher - Dec. 10, 2010, 7:31 a.m.
Hello Dirk,

Dirk Behme wrote:
> Reuse the gd->tbl value for timestamp and add gd->lastinc for lastinc bss
> values in the OMAP timer driver.
> 
> The usage of bss values in drivers before initialisation of bss is forbidden.
> In that special case some data in .rel.dyn gets corrupted.
> 
> Signed-off-by: Dirk Behme <dirk.behme@gmail.com>
> 
> ---
> 
> Note: This is compile tested only (therefore the RFC). Please *test*
>       on real OMAP HW, e.g. Beagle.

Works for me on:

U-Boot 2010.12-rc2-00245-g13e984c (Dec 10 2010 - 08:28:22)
OMAP3530-GP ES3.0, CPU-OPP2, L3-165MHz, Max CPU Clock 600 mHz
OMAP3 Beagle board + LPDDR/NAND

Thanks!

Tested-by: Heiko Schocher<hs@denx.de>

But mmc does not longer work on my beagle board... searching for it

bye,
Heiko
Heiko Schocher - Dec. 10, 2010, 7:45 a.m.
Hello Dirk,

Heiko Schocher wrote:
> Dirk Behme wrote:
>> Reuse the gd->tbl value for timestamp and add gd->lastinc for lastinc bss
>> values in the OMAP timer driver.
>>
>> The usage of bss values in drivers before initialisation of bss is forbidden.
>> In that special case some data in .rel.dyn gets corrupted.
>>
>> Signed-off-by: Dirk Behme <dirk.behme@gmail.com>
>>
>> ---
>>
>> Note: This is compile tested only (therefore the RFC). Please *test*
>>       on real OMAP HW, e.g. Beagle.
> 
> Works for me on:
> 
> U-Boot 2010.12-rc2-00245-g13e984c (Dec 10 2010 - 08:28:22)
> OMAP3530-GP ES3.0, CPU-OPP2, L3-165MHz, Max CPU Clock 600 mHz
> OMAP3 Beagle board + LPDDR/NAND
> 
> Thanks!
> 
> Tested-by: Heiko Schocher<hs@denx.de>
> 
> But mmc does not longer work on my beagle board... searching for it

User error, mmc works fine, sorry for the noise.

bye,
Heiko
Wolfgang Denk - Dec. 10, 2010, 7:47 a.m.
Dear Dirk Behme,

In message <4D01B92E.8050506@googlemail.com> you wrote:
>
> > Note: This is compile tested only (therefore the RFC). Please *test*
> >        on real OMAP HW, e.g. Beagle.
> 
> To the custodian who has to apply this: Regarding the RFC in the 
> subject: Now that this patch is confirmed to work, will you apply this 
> patch as is? Or do I have to resend it without 'RFC'?

If Sandeep agrees, I wil pull this directly, as this fixes a real
problem for many of us.

Thanks!

Best regards,

Wolfgang Denk
Steve Sakoman - Dec. 10, 2010, 11:48 p.m.
On Thu, Dec 9, 2010 at 11:47 PM, Wolfgang Denk <wd@denx.de> wrote:
> Dear Dirk Behme,
>
> In message <4D01B92E.8050506@googlemail.com> you wrote:
>>
>> > Note: This is compile tested only (therefore the RFC). Please *test*
>> >        on real OMAP HW, e.g. Beagle.
>>
>> To the custodian who has to apply this: Regarding the RFC in the
>> subject: Now that this patch is confirmed to work, will you apply this
>> patch as is? Or do I have to resend it without 'RFC'?
>
> If Sandeep agrees, I wil pull this directly, as this fixes a real
> problem for many of us.

Sorry for the delay in testing, jury duty this week :-(

I build tested for Beagle, Overo, Panda, and SDP4430 - no issues.

Run tested on Beagle, Overo, and Panda - no issues.

Tested-by: Steve Sakoman <steve.sakoman@linaro.org>

Patch

Index: u-boot.git/arch/arm/cpu/armv7/omap-common/timer.c
===================================================================
--- u-boot.git.orig/arch/arm/cpu/armv7/omap-common/timer.c
+++ u-boot.git/arch/arm/cpu/armv7/omap-common/timer.c
@@ -35,8 +35,8 @@ 
 #include <common.h>
 #include <asm/io.h>
 
-static ulong timestamp;
-static ulong lastinc;
+DECLARE_GLOBAL_DATA_PTR;
+
 static struct gptimer *timer_base = (struct gptimer *)CONFIG_SYS_TIMERBASE;
 
 /*
@@ -74,7 +74,7 @@  ulong get_timer(ulong base)
 
 void set_timer(ulong t)
 {
-	timestamp = t;
+	gd->tbl = t;
 }
 
 /* delay x useconds */
@@ -96,8 +96,8 @@  void __udelay(unsigned long usec)
 void reset_timer_masked(void)
 {
 	/* reset time, capture current incrementer value time */
-	lastinc = readl(&timer_base->tcrr) / (TIMER_CLOCK / CONFIG_SYS_HZ);
-	timestamp = 0;		/* start "advancing" time stamp from 0 */
+	gd->lastinc = readl(&timer_base->tcrr) / (TIMER_CLOCK / CONFIG_SYS_HZ);
+	gd->tbl = 0;		/* start "advancing" time stamp from 0 */
 }
 
 ulong get_timer_masked(void)
@@ -105,14 +105,14 @@  ulong get_timer_masked(void)
 	/* current tick value */
 	ulong now = readl(&timer_base->tcrr) / (TIMER_CLOCK / CONFIG_SYS_HZ);
 
-	if (now >= lastinc)	/* normal mode (non roll) */
+	if (now >= gd->lastinc)	/* normal mode (non roll) */
 		/* move stamp fordward with absoulte diff ticks */
-		timestamp += (now - lastinc);
+		gd->tbl += (now - gd->lastinc);
 	else	/* we have rollover of incrementer */
-		timestamp += ((TIMER_LOAD_VAL / (TIMER_CLOCK / CONFIG_SYS_HZ))
-				- lastinc) + now;
-	lastinc = now;
-	return timestamp;
+		gd->tbl += ((TIMER_LOAD_VAL / (TIMER_CLOCK / CONFIG_SYS_HZ))
+			     - gd->lastinc) + now;
+	gd->lastinc = now;
+	return gd->tbl;
 }
 
 /*