POST: support for km_arm and mem_regions test definition
cover POST: support for km_arm and mem_regions test definition
This series adds support for POST on the km_arm boards. These boards use a jumper to run some self-tests at the board power-up. There are some adaptations for POST to run on the ARM architecture.
This series defines a new mem_regions POST test. This test also takes place before relocation, but it only tests some regions of the RAM so that it is quicker.
Valentin Longchamp (8):
POST/arm: adaptations needed for POST on ARM to work
POST: add post_log_res field for post results in global data
POST: make env test flags fetching optional
POST: drivers/memory.c coding style cleanup
POST: add new memory regions test
POST/km_arm: add POST memory tests infrastructure
km_arm: change CONFIG_SYS_TEXT_BASE to end of RAM
km_arm: enable POST for these boards
arch/arm/include/asm/global_data.h | 5 + arch/arm/lib/board.c | 2 + arch/blackfin/include/asm/global_data.h | 1 + arch/nios2/include/asm/global_data.h | 1 + arch/powerpc/include/asm/global_data.h | 1 + arch/sparc/include/asm/global_data.h | 1 + board/keymile/km_arm/km_arm.c | 11 ++ include/configs/km/km_arm.h | 10 ++- include/post.h | 7 ++ post/board/km_arm/Makefile | 29 +++++ post/board/km_arm/memory.c | 37 +++++++ post/drivers/memory.c | 171 +++++++++++++++++++------------ post/post.c | 29 ++++-- post/tests.c | 14 +++ 14 files changed, 244 insertions(+), 75 deletions(-) create mode 100644 post/board/km_arm/Makefile create mode 100644 post/board/km_arm/memory.c
PATCH 1/8 POST/arm: adaptations needed for POST on ARM to work
For post to run on ARM, 3 things are needed:
- post_log_word to be defined in gd
- a post.h include in arch/arm/lib/board.c
- most ARM boards will set POST_WORD in RAM, so we need gd->ram, and thus DECLARE_GLOBAL_DATA_PTR is needed in post.h
--- arch/arm/include/asm/global_data.h | 4 ++++ arch/arm/lib/board.c | 2 ++ include/post.h | 6 ++++++ 3 files changed, 12 insertions(+), 0 deletions(-)
arch/arm/include/asm/global_data.h +4 -0
@@ -75,6 +75,10 @@ typedef struct global_data {#endif void **jt;/* jump table */ char env_buf[32 ];/* buffer for getenv() before reloc. */ +#if defined(CONFIG_POST ) || defined(CONFIG_LOGBUFFER ) +unsigned long post_log_word;/* Record POST activities */ +unsigned long post_init_f_time;/* When post_init_f started */ +#endif } gd_t;/*
arch/arm/lib/board.c +2 -0
@@ -48,6 +48,8 @@#include <nand.h> #include <onenand_uboot.h> #include <mmc.h> +#include <post.h> +#include <logbuff.h> #ifdef CONFIG_BITBANGMII #include <miiphy.h>
include/post.h +6 -0
@@ -76,6 +76,12 @@#endif #endif /* CONFIG_SYS_POST_WORD_ADDR */ +/* +* some ARM implementations have to use gd->ram_size, since POST_WORD is +* defined in RAM +*/ +DECLARE_GLOBAL_DATA_PTR ; +static inline ulong post_word_load (void ) {return in_le32 ((volatile void *)(_POST_WORD_ADDR));
Signature · 1 line
1.7.1
PATCH 1/8 POST/arm: adaptations needed for POST on ARM to work
include/post.h line 83
Quoted 8 lines · On Wednesday, August 03, 2011 08:37:00 Valentin Longchamp wrote:
include/post.h +5
-0+/* +* some ARM implementations have to use gd->ram_size, since POST_WORD is +* defined in RAM +*/ +DECLARE_GLOBAL_DATA_PTR ;
i'm not sure about this. no other header has been allowed to do this in the past, and i dont think we should start now.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110814/42854d03/attachment.pgp
PATCH 1/8 POST/arm: adaptations needed for POST on ARM to work
Quoted 4 lines · Mike Frysinger
Quoted 3 lines · On Wednesday, August 03, 2011 08:37:00 Valentin Longchamp wrote:
include/post.h +0
-0
Quoted 9 lines
include/post.h line 83
Quoted 5 lines
include/post.h +5
-0+/* +* some ARM implementations have to use gd->ram_size, since POST_WORD is +* defined in RAM +*/ +DECLARE_GLOBAL_DATA_PTR ;i'm not sure about this. no other header has been allowed to do this in the past, and i dont think we should start now.
-mike
OK. Then we should move the post_word_load and post_word_store function to post/post.c. Would this be accepted ?
Signature · 13 lines
Valentin Longchamp Embedded Software Engineer Hardware and Chip Integration ______________________________________ KEYMILE AG Schwarzenburgstr. 73 CH-3097 Liebefeld Phone +41 31 377 1318 Fax +41 31 377 1212 valentin.longchamp at keymile.com www.keymile.com ______________________________________ KEYMILE: A Specialist as a Partner
PATCH 1/8 POST/arm: adaptations needed for POST on ARM to work
Quoted 14 lines · On Monday, August 15, 2011 05:09:42 Valentin Longchamp wrote:
Quoted 4 lines · Mike Frysinger
Quoted 3 lines · On Wednesday, August 03, 2011 08:37:00 Valentin Longchamp wrote:
include/post.h +0
-0Quoted 8 lines
Quoted 5 lines
+/*
+ * some ARM implementations have to usegd->ram_size, sincePOST_WORDis + * defined in RAM
+ */
+DECLARE_GLOBAL_DATA_PTR;i'm not sure about this. no other header has been allowed to do this in the past, and i dont think we should start now.
Quoted 2 lines
OK. Then we should move the
post_word_loadandpost_word_storefunction topost/post.c. Would this be accepted ?
that would add overhead that most people dont need. i guess the only other option would be to add a CONFIG_POST_EXTERNAL_WORD_FUNCS and then post.h would just define the two funcs as externs. it'd be up to the board porters to define them however they want.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110816/73142da2/attachment.pgp
PATCH 1/8 POST/arm: adaptations needed for POST on ARM to work
Quoted 15 lines · Mike Frysinger
Quoted 14 lines · On Monday, August 15, 2011 05:09:42 Valentin Longchamp wrote:
Quoted 12 lines · Mike Frysinger
Quoted 8 lines · On Wednesday, August 03, 2011 08:37:00 Valentin Longchamp wrote:
include/post.h +2
-0+/* +* some ARM implementations have to use gd->ram_size, since POST_WORD is + * defined in RAM
+ */
+DECLARE_GLOBAL_DATA_PTR;i'm not sure about this. no other header has been allowed to do this in the past, and i dont think we should start now.
Quoted 8 lines
Quoted 2 lines
OK. Then we should move the
post_word_loadandpost_word_storefunction topost/post.c. Would this be accepted ?that would add overhead that most people dont need. i guess the only other option would be to add a
CONFIG_POST_EXTERNAL_WORD_FUNCSand thenpost.hwould just define the two funcs as externs. it'd be up to the board porters to define them however they want.
-mike
We don't want externs. Why would moving it into post.c introduce any overhead ?
PATCH 1/8 POST/arm: adaptations needed for POST on ARM to work
Quoted 19 lines · On Thursday, August 18, 2011 06:07:06 Marek Vasut wrote:
Quoted 18 lines · Mike Frysinger
Quoted 16 lines · On Monday, August 15, 2011 05:09:42 Valentin Longchamp wrote:
Quoted 4 lines · Mike Frysinger
Quoted 3 lines · On Wednesday, August 03, 2011 08:37:00 Valentin Longchamp wrote:
include/post.h +0
-0Quoted 8 lines
Quoted 5 lines
+/*
+ * some ARM implementations have to usegd->ram_size, sincePOST_WORDis + * defined in RAM
+ */
+DECLARE_GLOBAL_DATA_PTR;i'm not sure about this. no other header has been allowed to do this in the past, and i dont think we should start now.
OK. Then we should move the
post_word_loadandpost_word_storefunction topost/post.c. Would this be accepted ?
Quoted 7 lines
Quoted 4 lines
that would add overhead that most people dont need. i guess the only other option would be to add a
CONFIG_POST_EXTERNAL_WORD_FUNCSand thenpost.hwould just define the two funcs as externs. it'd be up to the board porters to define them however they want.We don't want externs. Why would moving it into
post.cintroduce any overhead ?
because the current code expands into a single memory read/write for many arches. moving it into post.c already means making it into an extern and now people have to call an external function instead of inlining the memory access.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110818/694883a9/attachment.pgp
PATCH 1/8 POST/arm: adaptations needed for POST on ARM to work
Quoted 25 lines · Mike Frysinger
Quoted 24 lines · On Thursday, August 18, 2011 06:07:06 Marek Vasut wrote:
Quoted 22 lines · Mike Frysinger
Quoted 14 lines · On Monday, August 15, 2011 05:09:42 Valentin Longchamp wrote:
Quoted 4 lines · Mike Frysinger
Quoted 3 lines · On Wednesday, August 03, 2011 08:37:00 Valentin Longchamp wrote:
include/post.h +0
-0Quoted 8 lines
Quoted 5 lines
+/*
+ * some ARM implementations have to usegd->ram_size, sincePOST_WORDis + * defined in RAM
+ */
+DECLARE_GLOBAL_DATA_PTR;i'm not sure about this. no other header has been allowed to do this in the past, and i dont think we should start now.
Quoted 2 lines
OK. Then we should move the
post_word_loadandpost_word_storefunction topost/post.c. Would this be accepted ?that would add overhead that most people dont need. i guess the only other option would be to add a
CONFIG_POST_EXTERNAL_WORD_FUNCSand thenpost.hwould just define the two funcs as externs. it'd be up to the board porters to define them however they want.
Quoted 7 lines
Quoted 2 lines
We don't want externs. Why would moving it into
post.cintroduce any overhead ?because the current code expands into a single memory read/write for many arches. moving it into
post.calready means making it into an extern and now people have to call an external function instead of inlining the memory access.
I don't think I follow you here ... why won't you be able to inline that stuff if it's in post.c ?
Quoted 1 line
-mike
PATCH 1/8 POST/arm: adaptations needed for POST on ARM to work
Quoted 29 lines · On Thursday, August 18, 2011 13:01:56 Marek Vasut wrote:
Quoted 28 lines · Mike Frysinger
Quoted 26 lines · On Thursday, August 18, 2011 06:07:06 Marek Vasut wrote:
Quoted 15 lines · Mike Frysinger
Quoted 14 lines · On Monday, August 15, 2011 05:09:42 Valentin Longchamp wrote:
Quoted 12 lines · Mike Frysinger
Quoted 8 lines · On Wednesday, August 03, 2011 08:37:00 Valentin Longchamp wrote:
include/post.h +2
-0+/* +* some ARM implementations have to use gd->ram_size, since
POST_WORDis + * defined in RAM
+ */
+DECLARE_GLOBAL_DATA_PTR;i'm not sure about this. no other header has been allowed to do this in the past, and i dont think we should start now.
Quoted 7 lines
Quoted 2 lines
OK. Then we should move the
post_word_loadandpost_word_storefunction topost/post.c. Would this be accepted ?that would add overhead that most people dont need. i guess the only other option would be to add a
CONFIG_POST_EXTERNAL_WORD_FUNCSand thenpost.hwould just define the two funcs as externs. it'd be up to the board porters to define them however they want.We don't want externs. Why would moving it into
post.cintroduce any overhead ?
Quoted 7 lines
Quoted 4 lines
because the current code expands into a single memory read/write for many arches. moving it into
post.calready means making it into an extern and now people have to call an external function instead of inlining the memory access.I don't think I follow you here ... why won't you be able to inline that stuff if it's in
post.c?
grep the tree. post.c isnt the only consumer of these funcs.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110818/0f474f10/attachment.pgp
PATCH 2/8 POST: add post_log_res field for post results in global data
In reply to Valentin LongchampThe current post_log_word in global data is currently split into 2x 16 bits: half for the test start, half for the test success. Since we alredy have more than 16 POST tests defined and more could be defined, this may result in an overflow and the post_output_backlog would not work for the tests defined further of these 16 positions.
An additional field is added to global data so that we can now support up to 32 (depending of architecture) tests. The post_log_word is only used to record the start of the test and the new field post_log_res for the test success (or failure). The post_output_backlog is for this change also adapted.
--- arch/arm/include/asm/global_data.h | 1 + arch/blackfin/include/asm/global_data.h | 1 + arch/nios2/include/asm/global_data.h | 1 + arch/powerpc/include/asm/global_data.h | 1 + arch/sparc/include/asm/global_data.h | 1 + post/post.c | 9 +++++---- 6 files changed, 10 insertions(+), 4 deletions(-)
arch/arm/include/asm/global_data.h +1 -0
@@ -77,6 +77,7 @@ typedef struct global_data {char env_buf[32 ];/* buffer for getenv() before reloc. */ #if defined(CONFIG_POST ) || defined(CONFIG_LOGBUFFER )unsigned long post_log_word;/* Record POST activities */ +unsigned long post_log_res;/* success of POST test */ unsigned long post_init_f_time;/* When post_init_f started */ #endif } gd_t;
arch/blackfin/include/asm/global_data.h +1 -0
@@ -50,6 +50,7 @@ typedef struct global_data {unsigned long env_valid;/* Checksum of Environment valid? */ #if defined(CONFIG_POST ) || defined(CONFIG_LOGBUFFER )unsigned long post_log_word;/* Record POST activities */ +unsigned long post_log_res;/* success of POST test */ unsigned long post_init_f_time;/* When post_init_f started */ #endif
arch/nios2/include/asm/global_data.h +1 -0
@@ -34,6 +34,7 @@ typedef struct global_data {unsigned long env_valid;/* Checksum of Environment valid */ #if defined(CONFIG_POST ) || defined(CONFIG_LOGBUFFER )unsigned long post_log_word;/* Record POST activities */ +unsigned long post_log_res;/* success of POST test */ unsigned long post_init_f_time;/* When post_init_f started */ #endif void **jt;/* Standalone app jump table */
arch/powerpc/include/asm/global_data.h +1 -0
@@ -160,6 +160,7 @@ typedef struct global_data {#endif #if defined(CONFIG_POST ) || defined(CONFIG_LOGBUFFER )unsigned long post_log_word;/* Record POST activities */ +unsigned long post_log_res;/* success of POST test */ unsigned long post_init_f_time;/* When post_init_f started */ #endif #ifdef CONFIG_BOARD_TYPES
arch/sparc/include/asm/global_data.h +1 -0
@@ -58,6 +58,7 @@ typedef struct global_data {#endif #if defined(CONFIG_POST ) || defined(CONFIG_LOGBUFFER )unsigned long post_log_word;/* Record POST activities */ +unsigned long post_log_res;/* success of POST test */ unsigned long post_init_f_time;/* When post_init_f started */ #endif #ifdef CONFIG_BOARD_TYPES
post/post.c +5 -4
@@ -121,6 +121,7 @@ void post_bootmode_init (void)/* Reset activity record */ gd->post_log_word =0 ; + gd->post_log_res =0 ; }int post_bootmode_get (unsigned int *last_test)
@@ -144,12 +145,12 @@ int post_bootmode_get (unsigned int *last_test)/* POST tests run before relocation only mark status bits .... */ static void post_log_mark_start (unsigned long testid ) { - gd->post_log_word |= (testid)<<16 ; + gd->post_log_word |= testid; }static void post_log_mark_succ (unsigned long testid ) { - gd->post_log_word |= testid; + gd->post_log_res |= testid; }/* ... and the messages are output once we are relocated */
@@ -158,9 +159,9 @@ void post_output_backlog ( void )int j;for (j =0 ; j < post_list_size; j++) { -if (gd->post_log_word & (post_list[j].testid<<16 )) { +if (gd->post_log_word & (post_list[j].testid)) {post_log ("POST %s " , post_list[j].cmd); -if (gd->post_log_word & post_list[j].testid) +if (gd->post_log_res & post_list[j].testid)post_log ("PASSED\n" );else {post_log ("FAILED\n" );
Signature · 1 line
1.7.1
PATCH 2/8 POST: add post_log_res field for post results in global data
Quoted 13 lines · Valentin Longchamp
The current
post_log_wordin global data is currently split into 2x 16 bits: half for the test start, half for the test success. Since we alredy have more than 16 POST tests defined and more could be defined, this may result in an overflow and thepost_output_backlogwould not work for the tests defined further of these 16 positions.An additional field is added to global data so that we can now support up to 32 (depending of architecture) tests. The
post_log_wordis only used to record the start of the test and the new fieldpost_log_resfor the test success (or failure). Thepost_output_backlogis for this change also adapted.Signed-off-by Valentin Longchamp <[email protected]>
[...]
post/post.c int post_bootmode_get (unsigned int *last_test) · line 148
Quoted 6 lines
post/post.c +1
-1@@ -144,12 +145,12 @@ int post_bootmode_get (unsigned int *last_test)/* POST tests run before relocation only mark status bits .... */ static void post_log_mark_start (unsigned long testid ) { - gd->post_log_word |= (testid)<<16 ; + gd->post_log_word |= testid;
I think you can just assign it if you changed the meaning. Still, what if we will have more than 32 tests?
Quoted 7 lines
post/post.c +1
-1}static void post_log_mark_succ (unsigned long testid ) { - gd->post_log_word |= testid; + gd->post_log_res |= testid; }
PATCH 2/8 POST: add post_log_res field for post results in global data
Quoted 17 lines · Marek Vasut
Quoted 13 lines · Valentin Longchamp
The current
post_log_wordin global data is currently split into 2x 16 bits: half for the test start, half for the test success. Since we alredy have more than 16 POST tests defined and more could be defined, this may result in an overflow and thepost_output_backlogwould not work for the tests defined further of these 16 positions.An additional field is added to global data so that we can now support up to 32 (depending of architecture) tests. The
post_log_wordis only used to record the start of the test and the new fieldpost_log_resfor the test success (or failure). Thepost_output_backlogis for this change also adapted.Signed-off-by Valentin Longchamp <[email protected]>[...]
Quoted 10 lines
post/post.c int post_bootmode_get (unsigned int *last_test) · line 148
Quoted 6 lines
post/post.c +1
-1@@ -144,12 +145,12 @@ int post_bootmode_get (unsigned int *last_test)/* POST tests run before relocation only mark status bits .... */ static void post_log_mark_start (unsigned long testid ) { - gd->post_log_word |= (testid)<<16 ; + gd->post_log_word |= testid;I think you can just assign it if you changed the meaning. Still, what if we will have more than 32 tests?
Yes, this will not work anymore when we have more than 32 tests. But we already have more than 16 tests so there was already a flaw. This at least corrects this flaw.
The problem is that this has to stay in the global_data that has to remain small, so a u32 for bit setting has the great advantage of being small.
Signature · 13 lines
Valentin Longchamp Embedded Software Engineer Hardware and Chip Integration ______________________________________ KEYMILE AG Schwarzenburgstr. 73 CH-3097 Liebefeld Phone +41 31 377 1318 Fax +41 31 377 1212 valentin.longchamp at keymile.com www.keymile.com ______________________________________ KEYMILE: A Specialist as a Partner
PATCH 2/8 POST: add post_log_res field for post results in global data
Quoted 30 lines · Valentin Longchamp
Quoted 23 lines · Marek Vasut
Quoted 13 lines · Valentin Longchamp
The current
post_log_wordin global data is currently split into 2x 16 bits: half for the test start, half for the test success. Since we alredy have more than 16 POST tests defined and more could be defined, this may result in an overflow and thepost_output_backlogwould not work for the tests defined further of these 16 positions.An additional field is added to global data so that we can now support up to 32 (depending of architecture) tests. The
post_log_wordis only used to record the start of the test and the new fieldpost_log_resfor the test success (or failure). Thepost_output_backlogis for this change also adapted.Signed-off-by Valentin Longchamp <[email protected]>[...]
Quoted 6 lines
post/post.c +0
-0@@ -144,12 +145,12 @@ int post_bootmode_get (unsigned int *last_test)/* POST tests run before relocation only mark status bits .... */ static void post_log_mark_start (unsigned long testid ) {Quoted 5 lines
post/post.c int post_bootmode_get (unsigned int *last_test) · line 148
Quoted 2 lines
post/post.c +1
-1- gd->post_log_word |= (testid)<<16 ; + gd->post_log_word |= testid;I think you can just assign it if you changed the meaning. Still, what if we will have more than 32 tests?
Quoted 6 lines
Yes, this will not work anymore when we have more than 32 tests. But we already have more than 16 tests so there was already a flaw. This at least corrects this flaw.
The problem is that this has to stay in the
global_datathat has to remain small, so a u32 for bit setting has the great advantage of being small.
I'd love to see a more competent test framework which would run in later stages of boot. That'll remove the huge load of tests that's on the POST framework.
Detlev, any suggestions ? ;-)
PATCH 3/8 POST: make env test flags fetching optional
In reply to Valentin LongchampSome boards have the environment variables defined in a slow EEPROM. post_run accesses these environment variables to define which tests have to be run (in post_get_flags). This is very slow before the code relocation on some boards with a slow I2C EEPROM for environement variables.
This patch adds a config option to skip the fetching of the test flags in the environment variables. The test flags assigned to the tests then only are the ones statically defined for the test in post/tests.c.
--- post/post.c | 20 +++++++++++++++----- 1 files changed, 15 insertions(+), 5 deletions(-)
post/post.c +15 -5
@@ -191,7 +191,8 @@ static void post_bootmode_test_off (void)post_word_store (word); } -static void post_get_flags (int *test_flags) +#ifndef CONFIG_POST_SKIP_ENV_FLAGS +static void post_get_env_flags (int *test_flags) {int flag[] = {POST_POWERON ,POST_NORMAL ,POST_SLOWTEST ,POST_CRITICAL };
@@ -204,10 +205,6 @@ static void post_get_flags (int *test_flags)int last;int i, j; -for (j =0 ; j < post_list_size; j++) { - test_flags[j] = post_list[j].flags; - } -for (i =0 ; i < varnum; i++) {if (getenv_f (var[i], list,sizeof (list)) <=0 )continue ;
@@ -245,6 +242,19 @@ static void post_get_flags (int *test_flags) name = s + 1; } } +} +#endif + +static void post_get_flags (int *test_flags) +{ +int j; + +for (j =0 ; j < post_list_size; j++) + test_flags[j] = post_list[j].flags; + +#ifndef CONFIG_POST_SKIP_ENV_FLAGS +post_get_env_flags (test_flags); +#endif for (j =0 ; j < post_list_size; j++) {if (test_flags[j] &POST_POWERON ) {
Signature · 1 line
1.7.1
PATCH 4/8 POST: drivers/memory.c coding style cleanup
In reply to Valentin LongchampThis is needed for a further patch adding a new memory test.
--- post/drivers/memory.c | 113 +++++++++++++++++++++++++------------------------ 1 files changed, 57 insertions(+), 56 deletions(-)
post/drivers/memory.c +57 -56
@@ -250,7 +250,7 @@ static int memory_post_dataline(unsigned long long * pmem) hi = (temp64>>32 ) &0xffffffff ; lo = temp64 &0xffffffff ; -post_log ("Memory (date line) error at %08x, " +post_log ("Memory (date line) error at %08x, " "wrote %08x%08x, read %08x%08x !\n" , pmem, pathi, patlo, hi, lo); ret =-1 ;
@@ -281,7 +281,7 @@ static int memory_post_addrline(ulong *testaddr, ulong *base, ulong size) }#endif if (readback == *testaddr) { -post_log ("Memory (address line) error at %08x<->%08x, " +post_log ("Memory (address line) error at %08x<->%08x, " "XOR value %08x !\n" , testaddr, target, xor); ret =-1 ;
@@ -291,7 +291,7 @@ static int memory_post_addrline(ulong *testaddr, ulong *base, ulong size)return ret; } -static int memory_post_test1 (unsigned long start, +static int memory_post_test1 (unsigned long start,unsigned long size,unsigned long val) {
@@ -303,13 +303,13 @@ static int memory_post_test1 (unsigned long start,for (i =0 ; i < size /sizeof (ulong); i++) { mem[i] = val;if (i %1024 ==0 ) -WATCHDOG_RESET (); +WATCHDOG_RESET (); } -for (i =0 ; i < size /sizeof (ulong) && ret ==0 ; i++) { +for (i =0 ; i < size /sizeof (ulong) && !ret; i++) { readback = mem[i];if (readback != val) { -post_log ("Memory error at %08x, " +post_log ("Memory error at %08x, " "wrote %08x, read %08x !\n" , mem + i, val, readback);
@@ -317,13 +317,13 @@ static int memory_post_test1 (unsigned long start,break ; }if (i %1024 ==0 ) -WATCHDOG_RESET (); +WATCHDOG_RESET (); }return ret; } -static int memory_post_test2 (unsigned long start,unsigned long size) +static int memory_post_test2 (unsigned long start,unsigned long size) {unsigned long i;ulong *mem = (ulong *) start;
@@ -333,13 +333,13 @@ static int memory_post_test2 (unsigned long start, unsigned long size)for (i =0 ; i < size /sizeof (ulong); i++) { mem[i] =1 << (i %32 );if (i %1024 ==0 ) -WATCHDOG_RESET (); +WATCHDOG_RESET (); } -for (i =0 ; i < size /sizeof (ulong) && ret ==0 ; i++) { +for (i =0 ; i < size /sizeof (ulong) && !ret; i++) { readback = mem[i];if (readback != (1 << (i %32 ))) { -post_log ("Memory error at %08x, " +post_log ("Memory error at %08x, " "wrote %08x, read %08x !\n" , mem + i,1 << (i %32 ), readback);
@@ -347,13 +347,13 @@ static int memory_post_test2 (unsigned long start, unsigned long size)break ; }if (i %1024 ==0 ) -WATCHDOG_RESET (); +WATCHDOG_RESET (); }return ret; } -static int memory_post_test3 (unsigned long start,unsigned long size) +static int memory_post_test3 (unsigned long start,unsigned long size) {unsigned long i;ulong *mem = (ulong *) start;
@@ -363,13 +363,13 @@ static int memory_post_test3 (unsigned long start, unsigned long size)for (i =0 ; i < size /sizeof (ulong); i++) { mem[i] = i;if (i %1024 ==0 ) -WATCHDOG_RESET (); +WATCHDOG_RESET (); } -for (i =0 ; i < size /sizeof (ulong) && ret ==0 ; i++) { +for (i =0 ; i < size /sizeof (ulong) && !ret; i++) { readback = mem[i];if (readback != i) { -post_log ("Memory error at %08x, " +post_log ("Memory error at %08x, " "wrote %08x, read %08x !\n" , mem + i, i, readback);
@@ -377,13 +377,13 @@ static int memory_post_test3 (unsigned long start, unsigned long size)break ; }if (i %1024 ==0 ) -WATCHDOG_RESET (); +WATCHDOG_RESET (); }return ret; } -static int memory_post_test4 (unsigned long start,unsigned long size) +static int memory_post_test4 (unsigned long start,unsigned long size) {unsigned long i;ulong *mem = (ulong *) start;
@@ -393,13 +393,13 @@ static int memory_post_test4 (unsigned long start, unsigned long size)for (i =0 ; i < size /sizeof (ulong); i++) { mem[i] = ~i;if (i %1024 ==0 ) -WATCHDOG_RESET (); +WATCHDOG_RESET (); } -for (i =0 ; i < size /sizeof (ulong) && ret ==0 ; i++) { +for (i =0 ; i < size /sizeof (ulong) && !ret; i++) { readback = mem[i];if (readback != ~i) { -post_log ("Memory error at %08x, " +post_log ("Memory error@%08x, " "wrote %08x, read %08x !\n" , mem + i, ~i, readback);
@@ -407,47 +407,48 @@ static int memory_post_test4 (unsigned long start, unsigned long size)break ; }if (i %1024 ==0 ) -WATCHDOG_RESET (); +WATCHDOG_RESET (); }return ret; } -static int memory_post_tests (unsigned long start,unsigned long size) +static int memory_post_tests (unsigned long start,unsigned long size) {int ret =0 ; -if (ret ==0 ) - ret =memory_post_dataline ((unsigned long long *)start); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_addrline ((ulong *)start, (ulong *)start, size); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_addrline ((ulong *)(start + size -8 ), +if (!ret) + ret =memory_post_dataline ((unsigned long long *)start); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_addrline ((ulong *)start, (ulong *)start, + size); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_addrline ((ulong *)(start + size -8 ), (ulong *)start, size); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_test1 (start, size,0x00000000 ); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_test1 (start, size,0xffffffff ); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_test1 (start, size,0x55555555 ); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_test1 (start, size,0xaaaaaaaa ); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_test2 (start, size); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_test3 (start, size); -WATCHDOG_RESET (); -if (ret ==0 ) - ret =memory_post_test4 (start, size); -WATCHDOG_RESET (); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_test1 (start, size,0x00000000 ); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_test1 (start, size,0xffffffff ); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_test1 (start, size,0x55555555 ); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_test1 (start, size,0xaaaaaaaa ); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_test2 (start, size); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_test3 (start, size); +WATCHDOG_RESET (); +if (!ret) + ret =memory_post_test4 (start, size); +WATCHDOG_RESET ();return ret; }
@@ -502,11 +503,11 @@ int memory_post_test(int flags) ret =memory_post_tests (vstart, memsize); }else {/* POST_NORMAL */ unsigned long i; -for (i =0 ; i < (memsize >>20 ) && ret ==0 ; i++) { -if (ret ==0 ) +for (i =0 ; i < (memsize >>20 ) && !ret; i++) { +if (!ret) ret =memory_post_tests (vstart + (i <<20 ),0x800 ); -if (ret ==0 ) +if (!ret) ret =memory_post_tests (vstart + (i <<20 ) +0xff800 ,0x800 ); }
Signature · 1 line
1.7.1
PATCH 4/8 POST: drivers/memory.c coding style cleanup
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110814/ea5cf477/attachment.pgp
PATCH 5/8 POST: add new memory regions test
In reply to Valentin LongchampThis test is similar to the actual POST memory test but quicker and far less complete. It checks the address and data lines and then only tests some regularly placed sub regions of the RAM.
This can be useful when we want to test the RAM but we do not have enough time to run the full memory test.
The POST memory test code was rearranged in order to avoid code duplication between the two tests but the memory test functionnality remains the same.
--- include/post.h | 1 + post/drivers/memory.c | 78 +++++++++++++++++++++++++++++++++++++------------ post/tests.c | 14 +++++++++ 3 files changed, 74 insertions(+), 19 deletions(-)
include/post.h +1 -0
@@ -193,6 +193,7 @@ extern int post_hotkeys_pressed(void);#define CONFIG_SYS_POST_CODEC 0x00200000#define CONFIG_SYS_POST_COPROC 0x00400000#define CONFIG_SYS_POST_FLASH 0x00800000 +#define CONFIG_SYS_POST_MEM_REGIONS 0x01000000#endif /* CONFIG_POST */
post/drivers/memory.c +59 -19
120 lines not on this page · raw message
post/tests.c +14 -0
@@ -55,6 +55,7 @@ extern int fpga_post_test (int flags);extern int lwmon5_watchdog_post_test (int flags);extern int sysmon1_post_test (int flags);extern int coprocessor_post_test (int flags); +extern int memory_regions_post_test (int flags);extern int sysmon_init_f (void );
@@ -316,6 +317,19 @@ struct post_test post_list[] = CONFIG_SYS_POST_FLASH },#endif +#if CONFIG_POST & CONFIG_SYS_POST_MEM_REGIONS + { + "Memory regions test", + "mem_regions", + "This test checks regularly placed regions of the RAM.", + POST_ROM | POST_SLOWTEST | POST_PREREL, + &memory_regions_post_test, + NULL, + NULL, + CONFIG_SYS_POST_MEM_REGIONS + }, +#endif + }; unsigned int post_list_size = ARRAY_SIZE(post_list);
Signature · 1 line
1.7.1
PATCH 6/8 POST/km_arm: add POST memory tests infrastructure
In reply to Valentin LongchampThis patch adds a board support for km_arm in the POST framework. It consists of a memory test configuration with the redefinition of the arch_memory_test_prepare function.
--- post/board/km_arm/Makefile | 29 +++++++++++++++++++++++++++++ post/board/km_arm/memory.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 0 deletions(-) create mode 100644 post/board/km_arm/Makefile create mode 100644 post/board/km_arm/memory.c
post/board/km_arm/Makefile new file +29 -0
@@ -0,0 +1,29 @@ +# +# (C) Copyright 2002-2006 +# Wolfgang Denk, DENX Software Engineering, wd at denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +include $(OBJTREE)/include/autoconf.mk + +LIB = libpostkm_arm.o + +COBJS-$(CONFIG_HAS_POST) += memory.o + +include $(TOPDIR)/post/rules.mk
post/board/km_arm/memory.c new file +37 -0
@@ -0,0 +1,37 @@ +/* +* (C) Copyright 2011 +* Valentin Longchamp, Keymile AG Bern, <[email protected]> +* +* See file CREDITS for list of people who contributed to this +* project. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License, or (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +* MA 02110-1301 USA +*/ + +#include <common.h> +#include <post.h> + +int arch_memory_test_prepare (u32 *vstart,u32 *size,phys_addr_t *phys_offset) +{ +bd_t *bd = gd->bd; + + *vstart =CONFIG_SYS_SDRAM_BASE ; + +/* we go up to relocation plus a 1 MB margin */ + *size =CONFIG_SYS_TEXT_BASE - (1 <<20 ); + +return 0 ; +}
Signature · 1 line
1.7.1
PATCH 6/8 POST/km_arm: add POST memory tests infrastructure
Quoted 9 lines · On Wednesday, August 03, 2011 08:37:05 Valentin Longchamp wrote:
This patch adds a board support for
km_armin the POST framework. It consists of a memory test configuration with the redefinition of thearch_memory_test_preparefunction.Signed-off-by Valentin Longchamp <[email protected]>Signed-off-by Holger Brunck <[email protected]>--- post/board/km_arm/Makefile | 29 +++++++++++++++++++++++++++++ post/board/km_arm/memory.c | 37 +++++++++++++++++++++++++++++++++++++
i'm not sure post/board/<board>/ is something we want to continue. putting the post logic into your normal board/<board>/ dir works fine. might i suggest board/km_arm/post.c ...
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110814/54e1ead2/attachment.pgp
PATCH 6/8 POST/km_arm: add POST memory tests infrastructure
Quoted 11 lines · Mike Frysinger
Quoted 9 lines · On Wednesday, August 03, 2011 08:37:05 Valentin Longchamp wrote:
This patch adds a board support for
km_armin the POST framework. It consists of a memory test configuration with the redefinition of thearch_memory_test_preparefunction.Signed-off-by Valentin Longchamp <[email protected]>Signed-off-by Holger Brunck <[email protected]>--- post/board/km_arm/Makefile | 29 +++++++++++++++++++++++++++++ post/board/km_arm/memory.c | 37 +++++++++++++++++++++++++++++++++++++
Quoted 4 lines
i'm not sure post/board/<board>/ is something we want to continue. putting the post logic into your normal board/<board>/ dir works fine. might i suggest
board/km_arm/post.c...
-mike
Fine for me, I will change it for the next version of the series.
Signature · 13 lines
Valentin Longchamp Embedded Software Engineer Hardware and Chip Integration ______________________________________ KEYMILE AG Schwarzenburgstr. 73 CH-3097 Liebefeld Phone +41 31 377 1318 Fax +41 31 377 1212 valentin.longchamp at keymile.com www.keymile.com ______________________________________ KEYMILE: A Specialist as a Partner
PATCH 6/8 POST/km_arm: add POST memory tests infrastructure
In reply to Mike FrysingerQuoted 9 lines · Mike Frysinger
Quoted 8 lines · On Wednesday, August 03, 2011 08:37:05 Valentin Longchamp wrote:
This patch adds a board support for
km_armin the POST framework. It consists of a memory test configuration with the redefinition of thearch_memory_test_preparefunction.Signed-off-by Valentin Longchamp <[email protected]>Signed-off-by Holger Brunck <[email protected]>---
Quoted 7 lines
Quoted 2 lines
post/board/km_arm/Makefile | 29 +++++++++++++++++++++++++++++ post/board/km_arm/memory.c | 37 +++++++++++++++++++++++++++++++++++++i'm not sure post/board/<board>/ is something we want to continue. putting the post logic into your normal board/<board>/ dir works fine. might i suggest
board/km_arm/post.c...
-mike
post/board/... seems fine to me actually ... there might be more post tests for the board so poluting usual board directory would be stupid.
PATCH 6/8 POST/km_arm: add POST memory tests infrastructure
Quoted 14 lines · On Thursday, August 18, 2011 06:44:34 Marek Vasut wrote:
Quoted 13 lines · Mike Frysinger
Quoted 11 lines · On Wednesday, August 03, 2011 08:37:05 Valentin Longchamp wrote:
This patch adds a board support for
km_armin the POST framework. It consists of a memory test configuration with the redefinition of thearch_memory_test_preparefunction.Signed-off-by Valentin Longchamp <[email protected]>Signed-off-by Holger Brunck <[email protected]>---
post/board/km_arm/Makefile | 29 +++++++++++++++++++++++++++++ post/board/km_arm/memory.c | 37+++++++++++++++++++++++++++++++++++++
Quoted 6 lines
Quoted 3 lines
i'm not sure post/board/<board>/ is something we want to continue. putting the post logic into your normal board/<board>/ dir works fine. might i suggest
board/km_arm/post.c...post/board/... seems fine to me actually ... there might be more post tests for the board so poluting usual board directory would be stupid.
no it wouldnt. post tests that are board specific belong in the board specific location: board/<board>/. creating a mirror of that existing hierarchy is stupid, and most board dirs have very few files, so there really isn't all that much to clutter up in the first place.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
Url : http://lists.denx.de/pipermail/u-boot/attachments/20110902/50dd8add/attachment.pgp
PATCH 7/8 km_arm: change CONFIG_SYS_TEXT_BASE to end of RAM
In reply to Valentin LongchampThis allows to test a larger part of the RAM in the memory tests.
--- include/configs/km/km_arm.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/configs/km/km_arm.h +1 -1
@@ -54,7 +54,7 @@#include "asm/arch/config.h" -#define CONFIG_SYS_TEXT_BASE 0x04000000/* code address after reloc */ +#define CONFIG_SYS_TEXT_BASE 0x07d00000/* code address after reloc */ #define CONFIG_SYS_MEMTEST_START 0x00400000/* 4M */ #define CONFIG_SYS_MEMTEST_END 0x007fffff/*(_8M -1) */ #define CONFIG_SYS_LOAD_ADDR 0x00800000/* default load adr- 8M */
Signature · 1 line
1.7.1
PATCH 8/8 km_arm: enable POST for these boards
In reply to Valentin LongchampThe current km_arm boards have a Power-On test jumper. When this jumper is set, this triggers some Power-On tests on the board.
This patch enables the support of this jumper for starting the memory_regions test when the jumper is set.
--- board/keymile/km_arm/km_arm.c | 11 +++++++++++ include/configs/km/km_arm.h | 8 ++++++++ 2 files changed, 19 insertions(+), 0 deletions(-)
board/keymile/km_arm/km_arm.c +11 -0
@@ -448,6 +448,17 @@ int get_scl(void) }#endif +#if defined(CONFIG_POST ) + +#define KM_POST_EN_L 44 + +int post_hotkeys_pressed (void ) +{ +int val =kw_gpio_get_value (KM_POST_EN_L ); +return !val; +} +#endif +#if defined(CONFIG_SYS_EEPROM_WREN )int eeprom_write_enable (unsigned dev_addr,int state) {
include/configs/km/km_arm.h +8 -0
@@ -271,4 +271,12 @@ int get_scl(void);/* address for the bootcount (taken from end of RAM) */ #define BOOTCOUNT_ADDR (CONFIG_KM_RESERVED_PRAM) +/* enable POST tests with log */ +#define CONFIG_POST (CONFIG_SYS_POST_MEM_REGIONS) +#define CONFIG_POST_SKIP_ENV_FLAGS +#define CONFIG_CMD_DIAG + +/* we take the address after the bootcounter */ +#define CONFIG_SYS_POST_WORD_ADDR ((gd->ram_size) - BOOTCOUNT_ADDR + 4) +#endif /* _CONFIG_KM_ARM_H */
Signature · 1 line
1.7.1
PATCH 8/8 km_arm: enable POST for these boards
Hello.
Quoted 19 lines · Valentin Longchamp
The current
km_armboards have a Power-On test jumper. When this jumper is set, this triggers some Power-On tests on the board.This patch enables the support of this jumper for starting the
memory_regionstest when the jumper is set.Signed-off-by Valentin Longchamp<[email protected]>Signed-off-by Holger Brunck<[email protected]>--- board/keymile/km_arm/km_arm.c | 11 +++++++++++ include/configs/km/km_arm.h | 8 ++++++++ 2 files changed, 19 insertions(+), 0 deletions(-)board/keymile/km_arm/km_arm.c +0
-0@@ -448,6 +448,17 @@ int get_scl(void) }
board/keymile/km_arm/km_arm.c int get_scl(void) · line 458
Quoted 10 lines
board/keymile/km_arm/km_arm.c +8
-0#endif +#if defined(CONFIG_POST ) + +#define KM_POST_EN_L 44 + +int post_hotkeys_pressed (void ) +{ +int val =kw_gpio_get_value (KM_POST_EN_L ); +return !val;
WHy not just:
return !kw_gpio_get_value(KM_POST_EN_L);
WBR, Sergei
PATCH 8/8 km_arm: enable POST for these boards
Quoted 14 lines · Sergei Shtylyov
board/keymile/km_arm/km_arm.c int get_scl(void) · line 458
Quoted 9 lines · Valentin Longchamp
board/keymile/km_arm/km_arm.c +8
-0+#if defined(CONFIG_POST ) + +#define KM_POST_EN_L 44 + +int post_hotkeys_pressed (void ) +{ +int val =kw_gpio_get_value (KM_POST_EN_L ); +return !val;WHy not just:
Quoted 3 lines
return !kw_gpio_get_value(KM_POST_EN_L);WBR, Sergei
Yeah, you are right. I will change it for the next version of the series.
Signature · 13 lines
Valentin Longchamp Embedded Software Engineer Hardware and Chip Integration ______________________________________ KEYMILE AG Schwarzenburgstr. 73 CH-3097 Liebefeld Phone +41 31 377 1318 Fax +41 31 377 1212 valentin.longchamp at keymile.com www.keymile.com ______________________________________ KEYMILE: A Specialist as a Partner