[U-Boot-Users] [PATCH] POST: OCM test added.

Jean-Christophe PLAGNIOL-VILLARD plagnioj at jcrosoft.com
Fri May 9 11:03:28 CEST 2008


On 23:59 Thu 08 May     , Wolfgang Denk wrote:
> From: Yuri Tikhonov <yur at emcraft.com>
> 
> Added OCM test for post layer. This version runs before all other tests
> but still don't interrupt post sequence on failure.
> 
> Signed-off-by: Ilya Yanok <yanok at emcraft.com>
> Signed-off-by: Yuri Tikhonov <yur at emcraft.com>
> ---
>  include/post.h           |    1 +
>  post/cpu/ppc4xx/Makefile |    2 +-
>  post/cpu/ppc4xx/ocm.c    |   91 ++++++++++++++++++++++++++++++++++++++++++++++
>  post/tests.c             |   13 +++++++
>  4 files changed, 106 insertions(+), 1 deletions(-)
>  create mode 100644 post/cpu/ppc4xx/ocm.c
> 
> diff --git a/include/post.h b/include/post.h
> index ee07d2c..a108c7d 100644
> --- a/include/post.h
> +++ b/include/post.h
> @@ -102,6 +102,7 @@ extern int post_hotkeys_pressed(void);
>  #define CFG_POST_BSPEC3		0x00040000
>  #define CFG_POST_BSPEC4		0x00080000
>  #define CFG_POST_BSPEC5		0x00100000
> +#define CFG_POST_OCM		0x00200000
>  
>  #endif /* CONFIG_POST */
>  
> diff --git a/post/cpu/ppc4xx/Makefile b/post/cpu/ppc4xx/Makefile
> index 87ecd7c..62be9c6 100644
> --- a/post/cpu/ppc4xx/Makefile
> +++ b/post/cpu/ppc4xx/Makefile
> @@ -25,6 +25,6 @@ include $(OBJTREE)/include/autoconf.mk
>  LIB	= libpostppc4xx.a
>  
>  AOBJS-$(CONFIG_HAS_POST)	+= cache_4xx.o
> -COBJS-$(CONFIG_HAS_POST)	+= cache.o denali_ecc.o ether.o fpu.o spr.o uart.o watchdog.o
> +COBJS-$(CONFIG_HAS_POST)	+= cache.o denali_ecc.o ether.o fpu.o ocm.o spr.o uart.o watchdog.o
Too long please split it
>  
>  include $(TOPDIR)/post/rules.mk
> diff --git a/post/cpu/ppc4xx/ocm.c b/post/cpu/ppc4xx/ocm.c
> new file mode 100644
> index 0000000..51212ac
> --- /dev/null
> +++ b/post/cpu/ppc4xx/ocm.c
> @@ -0,0 +1,89 @@
> +/*
> + * (C) Copyright 2008 Ilya Yanok, EmCraft Systems, yanok at emcraft.com
> + *
> + * Developed for DENX Software Engineering GmbH
> + *
> + * 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 <common.h>
> +
> +/*
> + * This test attempts to verify on-chip memory (OCM). Result is written
> + * to the scratch register and if test succeed it won't be run till next
> + * power on.
> + */
> +
> +#include <post.h>
> +
> +#include <asm/io.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define OCM_TEST_PATTERN1	0x55555555
> +#define OCM_TEST_PATTERN2	0xAAAAAAAA
> +
> +#if CONFIG_POST & CFG_POST_OCM
> +
> +static uint ocm_status_read(void)
> +{
> +	return in_be32((void *)CFG_OCM_STATUS_ADDR) &
> +		CFG_OCM_STATUS_MASK;
> +}
> +
> +static void ocm_status_write(uint value)
> +{
> +	out_be32((void *)CFG_OCM_STATUS_ADDR, value |
> +		(in_be32((void *)CFG_OCM_STATUS_ADDR) &
> +			~CFG_OCM_STATUS_MASK));
> +}
> +
> +static inline int ocm_test_word(uint value, uint *address)
> +{
> +	uint read_value;
> +
> +	*address = value;
> +	sync();
> +	read_value = *address;
> +
> +	return (read_value != value);
> +}
> +
> +int ocm_post_test(int flags)
> +{
> +	uint   old_value;
> +	int    ret = 0;
> +	uint  *address = (uint*)CFG_OCM_BASE;
> +
> +	if (ocm_status_read() == CFG_OCM_STATUS_OK)
> +		return 0;
> +	for (; address < (uint*)(CFG_OCM_BASE + CFG_OCM_SIZE); address++) {
> +		old_value = *address;
> +		if (ocm_test_word(OCM_TEST_PATTERN1, address) ||
> +				ocm_test_word(OCM_TEST_PATTERN2, address)) {
> +			ret = 1;
> +			*address = old_value;
> +			printf("OCM POST failed at %p!\n", address);
> +			break;
> +		}
> +		*address = old_value;
> +	}
> +	ocm_status_write(ret ? CFG_OCM_STATUS_FAIL : CFG_OCM_STATUS_OK);
> +	return ret;
> +}
> +#endif /* CONFIG_POST & CFG_POST_OCM */
> diff --git a/post/tests.c b/post/tests.c
> index 5db59d6..cdf4c86 100644
> --- a/post/tests.c
> +++ b/post/tests.c
> @@ -29,6 +29,7 @@
>  
>  #include <post.h>
>  
> +extern int ocm_post_test (int flags);
>  extern int cache_post_test (int flags);
>  extern int watchdog_post_test (int flags);
>  extern int i2c_post_test (int flags);
> @@ -60,6 +61,18 @@ extern void sysmon_reloc (void);
>  
>  struct post_test post_list[] =
>  {
> +#if CONFIG_POST & CFG_POST_OCM
> +    {
> +	"OCM test",
> +	"ocm",
> +	"This test checks on chip memory (OCM).",
> +	POST_ROM | POST_ALWAYS | POST_PREREL | POST_CRITICAL,
> +	&ocm_post_test,
> +	NULL,
> +	NULL,
> +	CFG_POST_OCM
> +    },
> +#endif
>  #if CONFIG_POST & CFG_POST_CACHE
>      {
>  	"Cache test",
> -- 
> 1.5.4.2
> 
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
> Don't miss this year's exciting event. There's still time to save $100. 
> Use priority code J8TL2D2. 
> http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
> _______________________________________________
> U-Boot-Users mailing list
> U-Boot-Users at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/u-boot-users




More information about the U-Boot mailing list