[U-Boot] [PATCH 1/3] Revert "ARM: set GD_FLG_RELOC for boards skipping relocation to RAM"

in order to do it for all arm board we need this due to the arm implementation which supposed that U-Boot is in RAM when we jump to start_armboot
This reverts commit f96b44cef897bd372beb86dde1b33637c119d84d. --- lib_arm/board.c | 17 ----------------- 1 files changed, 0 insertions(+), 17 deletions(-)
diff --git a/lib_arm/board.c b/lib_arm/board.c index 5ade882..47e834c 100644 --- a/lib_arm/board.c +++ b/lib_arm/board.c @@ -220,18 +220,6 @@ static int init_func_i2c (void) } #endif
-#ifdef CONFIG_SKIP_RELOCATE_UBOOT -/* - * This routine sets the relocation done flag, because even if - * relocation is skipped, the flag is used by other generic code. - */ -static int reloc_init(void) -{ - gd->flags |= GD_FLG_RELOC; - return 0; -} -#endif - /* * Breathe some life into the board... * @@ -261,11 +249,6 @@ int print_cpuinfo (void); /* test-only */
init_fnc_t *init_sequence[] = { cpu_init, /* basic cpu dependent setup */ -#if defined(CONFIG_SKIP_RELOCATE_UBOOT) - reloc_init, /* Set the relocation done flag, must - do this AFTER cpu_init(), but as soon - as possible */ -#endif board_init, /* basic board dependent setup */ interrupt_init, /* set up exceptions */ env_init, /* initialize environment */

due to the arm implementation which supposed that U-Boot is in RAM when we jump to start_armboot
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD plagnioj@jcrosoft.com --- lib_arm/board.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/lib_arm/board.c b/lib_arm/board.c index 47e834c..f02fdc8 100644 --- a/lib_arm/board.c +++ b/lib_arm/board.c @@ -290,6 +290,8 @@ void start_armboot (void) gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); memset (gd->bd, 0, sizeof (bd_t));
+ gd->flags |= GD_FLG_RELOC; + monitor_flash_len = _bss_start - _armboot_start;
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

From: Guennadi Liakhovetski lg@denx.de
Switch to the standard CFG_HZ=1000 value, while at it, minor white-space cleanup, remove CFG_CLKS_IN_HZ from config-headers. Tested on mx31ads, provides 2% or 0.4% precision depending on the CONFIG_MX31_TIMER_HIGH_PRECISION flag. Measured with stop-watch on 100s boot-delay.
Signed-off-by: Guennadi Liakhovetski lg@denx.de --- cpu/arm1136/mx31/interrupts.c | 81 ++++++++++++++++++++++++-------------- include/configs/imx31_litekit.h | 4 +- include/configs/imx31_phycore.h | 2 +- include/configs/mx31ads.h | 4 +- 4 files changed, 54 insertions(+), 37 deletions(-)
diff --git a/cpu/arm1136/mx31/interrupts.c b/cpu/arm1136/mx31/interrupts.c index 6e08c71..4515147 100644 --- a/cpu/arm1136/mx31/interrupts.c +++ b/cpu/arm1136/mx31/interrupts.c @@ -27,30 +27,49 @@ #define TIMER_BASE 0x53f90000 /* General purpose timer 1 */
/* General purpose timers registers */ -#define GPTCR __REG(TIMER_BASE) /* Control register */ -#define GPTPR __REG(TIMER_BASE + 0x4) /* Prescaler register */ -#define GPTSR __REG(TIMER_BASE + 0x8) /* Status register */ -#define GPTCNT __REG(TIMER_BASE + 0x24) /* Counter register */ +#define GPTCR __REG(TIMER_BASE) /* Control register */ +#define GPTPR __REG(TIMER_BASE + 0x4) /* Prescaler register */ +#define GPTSR __REG(TIMER_BASE + 0x8) /* Status register */ +#define GPTCNT __REG(TIMER_BASE + 0x24) /* Counter register */
/* General purpose timers bitfields */ -#define GPTCR_SWR (1<<15) /* Software reset */ -#define GPTCR_FRR (1<<9) /* Freerun / restart */ -#define GPTCR_CLKSOURCE_32 (4<<6) /* Clock source */ -#define GPTCR_TEN (1) /* Timer enable */ +#define GPTCR_SWR (1 << 15) /* Software reset */ +#define GPTCR_FRR (1 << 9) /* Freerun / restart */ +#define GPTCR_CLKSOURCE_32 (4 << 6) /* Clock source */ +#define GPTCR_TEN (1) /* Timer enable */ + +/* "time" is measured in 1 / CFG_HZ seconds, "tick" is internal timer period */ +#ifdef CONFIG_MX31_TIMER_HIGH_PRECISION +/* ~0.4% error - measured with stop-watch on 100s boot-delay */ +#define TICK_TO_TIME(t) ((t) * CFG_HZ / CONFIG_MX31_CLK32) +#define TIME_TO_TICK(t) ((unsigned long long)(t) * CONFIG_MX31_CLK32 / CFG_HZ) +#define US_TO_TICK(t) (((unsigned long long)(t) * CONFIG_MX31_CLK32 + \ + 999999) / 1000000) +#else +/* ~2% error */ +#define TICK_PER_TIME ((CONFIG_MX31_CLK32 + CFG_HZ / 2) / CFG_HZ) +#define US_PER_TICK (1000000 / CONFIG_MX31_CLK32) +#define TICK_TO_TIME(t) ((t) / TICK_PER_TIME) +#define TIME_TO_TICK(t) ((unsigned long long)(t) * TICK_PER_TIME) +#define US_TO_TICK(t) (((t) + US_PER_TICK - 1) / US_PER_TICK) +#endif
static ulong timestamp; static ulong lastinc;
/* nothing really to do with interrupts, just starts up a counter. */ +/* The 32768Hz 32-bit timer overruns in 131072 seconds */ int interrupt_init (void) { int i;
/* setup GP Timer 1 */ GPTCR = GPTCR_SWR; - for ( i=0; i<100; i++) GPTCR = 0; /* We have no udelay by now */ + for (i = 0; i < 100; i++) + GPTCR = 0; /* We have no udelay by now */ GPTPR = 0; /* 32Khz */ - GPTCR |= GPTCR_CLKSOURCE_32 | GPTCR_TEN; /* Freerun Mode, PERCLK1 input */ + /* Freerun Mode, PERCLK1 input */ + GPTCR |= GPTCR_CLKSOURCE_32 | GPTCR_TEN;
return 0; } @@ -67,9 +86,9 @@ void reset_timer(void) reset_timer_masked(); }
-ulong get_timer_masked (void) +unsigned long long get_ticks (void) { - ulong now = GPTCNT; /* current tick value */ + ulong now = GPTCNT;
if (now >= lastinc) /* normal mode (non roll) */ /* move stamp forward with absolut diff ticks */ @@ -80,6 +99,17 @@ ulong get_timer_masked (void) return timestamp; }
+ulong get_timer_masked (void) +{ + /* + * get_ticks() returns a long long (64 bit), it wraps in + * 2^64 / CONFIG_MX31_CLK32 = 2^64 / 2^15 = 2^49 ~ 5 * 10^14 (s) ~ + * 5 * 10^9 days... and get_ticks() * CFG_HZ wraps in + * 5 * 10^6 days - long enough. + */ + return TICK_TO_TIME(get_ticks()); +} + ulong get_timer (ulong base) { return get_timer_masked () - base; @@ -87,29 +117,20 @@ ulong get_timer (ulong base)
void set_timer (ulong t) { + timestamp = TIME_TO_TICK(t); }
/* delay x useconds AND perserve advance timstamp value */ void udelay (unsigned long usec) { - ulong tmo, tmp; - - if (usec >= 1000) { /* if "big" number, spread normalization to seconds */ - tmo = usec / 1000; /* start to normalize for usec to ticks per sec */ - tmo *= CFG_HZ; /* find number of "ticks" to wait to achieve target */ - tmo /= 1000; /* finish normalize. */ - } else { /* else small number, don't kill it prior to HZ multiply */ - tmo = usec * CFG_HZ; - tmo /= (1000*1000); - } - - tmp = get_timer (0); /* get current timestamp */ - if ( (tmo + tmp + 1) < tmp )/* if setting this forward will roll time stamp */ - reset_timer_masked (); /* reset "advancing" timestamp to 0, set lastinc value */ - else - tmo += tmp; /* else, set advancing stamp wake up time */ - while (get_timer_masked () < tmo)/* loop till event */ - /*NOP*/; + unsigned long long tmp; + ulong tmo; + + tmo = US_TO_TICK(usec); + tmp = get_ticks() + tmo; /* get current timestamp */ + + while (get_ticks() < tmp) /* loop till event */ + /*NOP*/; }
void reset_cpu (ulong addr) diff --git a/include/configs/imx31_litekit.h b/include/configs/imx31_litekit.h index 60916b9..9a655aa 100644 --- a/include/configs/imx31_litekit.h +++ b/include/configs/imx31_litekit.h @@ -122,11 +122,9 @@ #define CFG_MEMTEST_START 0 /* memtest works on */ #define CFG_MEMTEST_END 0x10000
-#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */ - #define CFG_LOAD_ADDR 0 /* default load address */
-#define CFG_HZ 32000 +#define CFG_HZ 1000
#define CONFIG_CMDLINE_EDITING 1
diff --git a/include/configs/imx31_phycore.h b/include/configs/imx31_phycore.h index bf2a8dd..1540203 100644 --- a/include/configs/imx31_phycore.h +++ b/include/configs/imx31_phycore.h @@ -126,7 +126,7 @@
#define CFG_LOAD_ADDR 0 /* default load address */
-#define CFG_HZ 32000 +#define CFG_HZ 1000
#define CONFIG_CMDLINE_EDITING 1
diff --git a/include/configs/mx31ads.h b/include/configs/mx31ads.h index b904d81..04790fd 100644 --- a/include/configs/mx31ads.h +++ b/include/configs/mx31ads.h @@ -139,11 +139,9 @@ #define CFG_MEMTEST_START 0 /* memtest works on */ #define CFG_MEMTEST_END 0x10000
-#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */ - #define CFG_LOAD_ADDR CONFIG_LOADADDR
-#define CFG_HZ CONFIG_MX31_CLK32 /* use 32kHz clock as source */ +#define CFG_HZ 1000
#define CONFIG_CMDLINE_EDITING 1

Hi Jean-Christophe,
On Tue, 16 Sep 2008, Jean-Christophe PLAGNIOL-VILLARD wrote:
From: Guennadi Liakhovetski lg@denx.de
Switch to the standard CFG_HZ=1000 value, while at it, minor white-space cleanup, remove CFG_CLKS_IN_HZ from config-headers. Tested on mx31ads, provides 2% or 0.4% precision depending on the CONFIG_MX31_TIMER_HIGH_PRECISION flag. Measured with stop-watch on 100s boot-delay.
Signed-off-by: Guennadi Liakhovetski lg@denx.de
sorry, I haven't had time to reply to this email earlier. But it looks like many of Wolfgang's comments to your previous re-sending of this patch to the list still apply:
I still don't understand the purpose of this post. The patch has been posted by the author to the list, you are the subsystem custodian. I think, you have mainly three possibilities now:
1. you are happy with the patch, you add your Sob, pull it into your tree and ask Wolfgang to pull from it.
2. you have minor corrections to the patch. You may correct them yourself, add your Sob, re-post to the list and to the original author _specifying_ in the comments section, what you have changed and asking the original author if he agrees with the changes, if they are non-trivial.
3. comment back on the patch and ask the author to fix the issues and re-submit.
What you have done is you modified the patch, sent it back to the list and the author without your Sob and without explaining what and why you modified.
/* General purpose timers bitfields */ -#define GPTCR_SWR (1<<15) /* Software reset */ -#define GPTCR_FRR (1<<9) /* Freerun / restart */ -#define GPTCR_CLKSOURCE_32 (4<<6) /* Clock source */ -#define GPTCR_TEN (1) /* Timer enable */ +#define GPTCR_SWR (1 << 15) /* Software reset */ +#define GPTCR_FRR (1 << 9) /* Freerun / restart */ +#define GPTCR_CLKSOURCE_32 (4 << 6) /* Clock source */ +#define GPTCR_TEN (1) /* Timer enable */
The original patch had
+#define GPTCR_TEN 1 /* Timer enable */
without the parenthesis. Your change is neither necessary - this is not a compound value like "4 << 6", thus it doesn't require parenthesis, nor I believe parenthesis make the define any better, which is a matter of personal preference, I think, and I don't think it is good to impose your personal likes and dislikes on other patch authors, as long as the original patch doesn't violate any coding style rules.
Thanks Guennadi --- Guennadi Liakhovetski, Ph.D.
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de

Dear Jean-Christophe,
in message Pine.LNX.4.64.0809201313550.5424@axis700.grange Guennadi Liakhovetski wrote:
I still don't understand the purpose of this post. The patch has been posted by the author to the list, you are the subsystem custodian. I think, you have mainly three possibilities now:
- you are happy with the patch, you add your Sob, pull it into your tree
and ask Wolfgang to pull from it.
Actually I think that no Sob is required if a patch gets applied without any changes.
- you have minor corrections to the patch. You may correct them yourself,
add your Sob, re-post to the list and to the original author _specifying_ in the comments section, what you have changed and asking the original author if he agrees with the changes, if they are non-trivial.
- comment back on the patch and ask the author to fix the issues and
re-submit.
Agreed.
What you have done is you modified the patch, sent it back to the list and the author without your Sob and without explaining what and why you modified.
This is indeed not the way it should be done.
Jean-Christophe, please fix.
Best regards,
Wolfgang Denk
participants (3)
-
Guennadi Liakhovetski
-
Jean-Christophe PLAGNIOL-VILLARD
-
Wolfgang Denk