]> git.sur5r.net Git - u-boot/commitdiff
Merge branch 'lwmon5' of /home/wd/git/u-boot/projects
authorWolfgang Denk <wd@denx.de>
Tue, 20 May 2008 23:13:39 +0000 (01:13 +0200)
committerWolfgang Denk <wd@denx.de>
Tue, 20 May 2008 23:13:39 +0000 (01:13 +0200)
20 files changed:
common/cmd_log.c
include/asm-arm/global_data.h
include/asm-avr32/global_data.h
include/asm-blackfin/global_data.h
include/asm-i386/global_data.h
include/asm-m68k/global_data.h
include/asm-microblaze/global_data.h
include/asm-mips/global_data.h
include/asm-nios/global_data.h
include/asm-nios2/global_data.h
include/asm-ppc/global_data.h
include/asm-sh/global_data.h
include/asm-sparc/global_data.h
include/configs/lwmon5.h
include/logbuff.h
include/post.h
post/cpu/ppc4xx/Makefile
post/cpu/ppc4xx/ocm.c [new file with mode: 0644]
post/post.c
post/tests.c

index b9f9ba03428fe2c7d35dff7b6ae2a2b2880c9374..c6e72ac3c0ca3a84485e5b0b3ae924da13b13916 100644 (file)
@@ -107,7 +107,7 @@ void logbuff_init_ptrs (void)
        if ((s = getenv ("loglevel")) != NULL)
                console_loglevel = (int)simple_strtoul (s, NULL, 10);
 
-       gd->post_log_word |= LOGBUFF_INITIALIZED;
+       gd->flags |= GD_FLG_LOGINIT;
 }
 
 void logbuff_reset (void)
@@ -168,7 +168,7 @@ static void logbuff_puts (const char *s)
 
 void logbuff_log(char *msg)
 {
-       if ((gd->post_log_word & LOGBUFF_INITIALIZED)) {
+       if ((gd->flags & GD_FLG_LOGINIT)) {
                logbuff_printk (msg);
        } else {
                /* Can happen only for pre-relocated errors as logging */
index 0410b5ef70c797ac71cbd337107c3957e41966d9..7564ff1469fdbdd3a19ffb5cbc31b7d01a894d4a 100644 (file)
@@ -61,6 +61,8 @@ typedef       struct  global_data {
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 
 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")
 
index daf64bc0089b6495a49aa134f2fd161b8f2631ae..007cfe4e7e7c48ac76751cec18cc95c9907200f0 100644 (file)
@@ -52,6 +52,8 @@ typedef       struct  global_data {
 #define GD_FLG_DEVINIT 0x00002         /* Devices have been initialized */
 #define GD_FLG_SILENT  0x00004         /* Silent mode                   */
 #define GD_FLG_POSTFAIL        0x00008         /* Critical POST test failed     */
+#define GD_FLG_POSTSTOP        0x00010         /* POST seqeunce aborted         */
+#define GD_FLG_LOGINIT 0x00020         /* Log Buf has been initialized  */
 
 #define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm("r5")
 
index 6debfc745130d5ee1fa4d84de46a4c2baf97ae78..4c8863962343225d22a480eb5018d326edbd991a 100644 (file)
@@ -62,6 +62,8 @@ typedef struct global_data {
 #define        GD_FLG_DEVINIT  0x00002 /* Devices have been initialized */
 #define        GD_FLG_SILENT   0x00004 /* Silent mode                   */
 #define        GD_FLG_POSTFAIL 0x00008 /* Critical POST test failed     */
+#define        GD_FLG_POSTSTOP 0x00010 /* POST seqeunce aborted         */
+#define        GD_FLG_LOGINIT  0x00020 /* Log Buf has been initialized  */
 
 #define DECLARE_GLOBAL_DATA_PTR     register gd_t * volatile gd asm ("P5")
 
index 68a9ad61eface7a2ea9e6adf543a77886f1a15a0..323506399549bf7614185167e9f4bc51095a6c40 100644 (file)
@@ -55,6 +55,8 @@ typedef       struct {
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 
 extern gd_t *global_data;
 
index c897f2b2a856078f165a9573bfdcb13e1698506f..7377d313db8a123d1c204e18c62f52ad00d311e0 100644 (file)
@@ -73,6 +73,8 @@ typedef       struct  global_data {
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 
 #if 0
 extern gd_t *global_data;
index 91243b22c02557814930be0d43b791f12b003c97..376786fca98ec135dc5a50fa6a633cfe1e0e91e6 100644 (file)
@@ -53,6 +53,8 @@ typedef       struct  global_data {
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 
 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r31")
 
index bd9e4dd86210a65cd1ab247df296310d2252f7d7..0c0ba50f425328b5e01a6b8ef21ae2e2888876bd 100644 (file)
@@ -55,6 +55,8 @@ typedef       struct  global_data {
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                   */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed     */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted         */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buf has been initialized  */
 
 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("k0")
 
index ddd66cfd4008e691907c87a91279384663d7ddfb..a8cc9878932fab8440cd5c80000fc00f3c4f6bfa 100644 (file)
@@ -46,6 +46,8 @@ typedef       struct  global_data {
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 
 #define DECLARE_GLOBAL_DATA_PTR     register gd_t *gd asm ("%g7")
 
index ae5f61700e2496217e8507c69f034fa73b0570c0..729048917bbd367a0f865ffd686f2740635fc817 100644 (file)
@@ -45,6 +45,8 @@ typedef       struct  global_data {
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 
 #define DECLARE_GLOBAL_DATA_PTR     register gd_t *gd asm ("r15")
 
index 202c8441c26aeca1fd6082b4f8ad921d004c24ce..ea702662f8a2fef500537f70f9b710ac896bc826 100644 (file)
@@ -168,6 +168,8 @@ typedef     struct  global_data {
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 
 #if 1
 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r2")
index 521a66ffc30b8e8938b5cff4ef763d4318c3b428..69af24a7708cc45ea7d80a27d75b397e3cd11b9b 100644 (file)
@@ -45,6 +45,8 @@ typedef       struct global_data
 #define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
 #define        GD_FLG_POSTFAIL 0x00008         /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010         /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020         /* Log Buffer has been initialized      */
 
 #define DECLARE_GLOBAL_DATA_PTR        register gd_t *gd asm ("r13")
 
index 7c29fc6840257b3fc386ea5620669ebe5c57ef68..de2c84b22b3bfd187f4c2744631b8fcdba47c1dd 100644 (file)
@@ -79,6 +79,9 @@ typedef struct global_data {
 #define        GD_FLG_RELOC    0x00001 /* Code was relocated to RAM            */
 #define        GD_FLG_DEVINIT  0x00002 /* Devices have been initialized        */
 #define        GD_FLG_SILENT   0x00004 /* Silent mode                          */
+#define        GD_FLG_POSTFAIL 0x00008 /* Critical POST test failed            */
+#define        GD_FLG_POSTSTOP 0x00010 /* POST seqeunce aborted                */
+#define        GD_FLG_LOGINIT  0x00020 /* Log Buffer has been initialized      */
 
 #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("%g7")
 
index 1f669aa8f688785abc0d1dce7a94b630ee9ef0a1..cf406c8c0da6f5ea9c5bae5f696811c1418d680c 100644 (file)
                                                /* unused GPT0 COMP reg */
 #define CFG_MEM_TOP_HIDE       (4 << 10) /* don't use last 4kbytes     */
                                        /* 440EPx errata CHIP 11        */
+#define CFG_OCM_SIZE           (16 << 10)
 
 /* Additional registers for watchdog timer post test */
 
 #define CFG_WATCHDOG_TIME_ADDR (CFG_PERIPHERAL_BASE + GPT0_MASK2)
 #define CFG_WATCHDOG_FLAGS_ADDR        (CFG_PERIPHERAL_BASE + GPT0_MASK1)
 #define CFG_DSPIC_TEST_ADDR    CFG_WATCHDOG_FLAGS_ADDR
+#define CFG_OCM_STATUS_ADDR    CFG_WATCHDOG_FLAGS_ADDR
 #define CFG_WATCHDOG_MAGIC     0x12480000
 #define CFG_WATCHDOG_MAGIC_MASK        0xFFFF0000
 #define CFG_DSPIC_TEST_MASK    0x00000001
+#define CFG_OCM_STATUS_OK      0x00009A00
+#define CFG_OCM_STATUS_FAIL    0x0000A300
+#define CFG_OCM_STATUS_MASK    0x0000FF00
 
 /*-----------------------------------------------------------------------
  * Serial Port
                                 CFG_POST_FPU      | \
                                 CFG_POST_I2C      | \
                                 CFG_POST_MEMORY   | \
+                                CFG_POST_OCM      | \
                                 CFG_POST_RTC      | \
                                 CFG_POST_SPR      | \
                                 CFG_POST_UART     | \
index d4157290538c1baf1433a5846469055712efd059..d06d208844264e7b29e22f5a5ebc7b088c9e37ac 100644 (file)
@@ -31,8 +31,6 @@
 #define LOGBUFF_OVERHEAD (4096) /* Logbuffer overhead for extra info */
 #define LOGBUFF_RESERVE (LOGBUFF_LEN+LOGBUFF_OVERHEAD)
 
-#define LOGBUFF_INITIALIZED    (1<<31)
-
 /* The mapping used here has to be the same as in setup_ext_logbuff ()
    in linux/kernel/printk */
 
index ee07d2caa2e56edfb7f0eb13a331bfc26ac92c8c..123623f5c85981cf465262916252303f0b47d3af 100644 (file)
@@ -43,6 +43,7 @@
 #define POST_PREREL             0x1000  /* test runs before relocation */
 
 #define POST_CRITICAL          0x2000  /* Use failbootcmd if test failed */
+#define POST_STOP              0x4000  /* Interrupt POST sequence on fail */
 
 #define POST_MEM               (POST_RAM | POST_ROM)
 #define POST_ALWAYS            (POST_NORMAL    | \
@@ -94,7 +95,7 @@ extern int post_hotkeys_pressed(void);
 #define CFG_POST_SPR           0x00000400
 #define CFG_POST_SYSMON                0x00000800
 #define CFG_POST_DSP           0x00001000
-#define CFG_POST_CODEC         0x00002000
+#define CFG_POST_OCM           0x00002000
 #define CFG_POST_FPU           0x00004000
 #define CFG_POST_ECC           0x00008000
 #define CFG_POST_BSPEC1                0x00010000
@@ -102,6 +103,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_CODEC         0x00200000
 
 #endif /* CONFIG_POST */
 
index f19dc5d3cefb68ec5cedf48d0f12e7990c011e43..1cfd3bb59c3e5d9cd9475e9e58021f6b8f7fcc47 100644 (file)
@@ -29,6 +29,7 @@ COBJS-$(CONFIG_HAS_POST)      += cache.o
 COBJS-$(CONFIG_HAS_POST)       += denali_ecc.o
 COBJS-$(CONFIG_HAS_POST)       += ether.o
 COBJS-$(CONFIG_HAS_POST)       += fpu.o
+COBJS-$(CONFIG_HAS_POST)       += ocm.o
 COBJS-$(CONFIG_HAS_POST)       += spr.o
 COBJS-$(CONFIG_HAS_POST)       += uart.o
 COBJS-$(CONFIG_HAS_POST)       += watchdog.o
diff --git a/post/cpu/ppc4xx/ocm.c b/post/cpu/ppc4xx/ocm.c
new file mode 100644 (file)
index 0000000..88aa93e
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * (C) Copyright 2008 Ilya Yanok, EmCraft Systems, yanok@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 */
index c016c3ae4062b8575ee2194697e627168ea244f4..d31829ba162b41c30d5e0672cf5104cd725e3dfc 100644 (file)
@@ -238,14 +238,20 @@ static int post_run_single (struct post_test *test,
                if (test_flags & POST_PREREL) {
                        if ((*test->test) (flags) == 0)
                                post_log_mark_succ ( test->testid );
-                       else if (test_flags & POST_CRITICAL)
-                               gd->flags |= GD_FLG_POSTFAIL;
+                       else {
+                               if (test_flags & POST_CRITICAL)
+                                       gd->flags |= GD_FLG_POSTFAIL;
+                               if (test_flags & POST_STOP)
+                                       gd->flags |= GD_FLG_POSTSTOP;
+                       }
                } else {
                if ((*test->test) (flags) != 0) {
                        post_log ("FAILED\n");
                        show_boot_progress (-32);
                        if (test_flags & POST_CRITICAL)
                                gd->flags |= GD_FLG_POSTFAIL;
+                       if (test_flags & POST_STOP)
+                               gd->flags |= GD_FLG_POSTSTOP;
                }
                else
                        post_log ("PASSED\n");
@@ -271,6 +277,9 @@ int post_run (char *name, int flags)
        if (name == NULL) {
                unsigned int last;
 
+               if (gd->flags & GD_FLG_POSTSTOP)
+                       return 0;
+
                if (post_bootmode_get (&last) & POST_POWERTEST) {
                        if (last & POST_FAIL_SAVE) {
                                last &= ~POST_FAIL_SAVE;
@@ -285,6 +294,8 @@ int post_run (char *name, int flags)
                                                 flags | POST_REBOOT, last);
 
                                for (i = last + 1; i < post_list_size; i++) {
+                                       if (gd->flags & GD_FLG_POSTSTOP)
+                                               break;
                                        post_run_single (post_list + i,
                                                         test_flags[i],
                                                         flags, i);
@@ -292,6 +303,8 @@ int post_run (char *name, int flags)
                        }
                } else {
                        for (i = 0; i < post_list_size; i++) {
+                               if (gd->flags & GD_FLG_POSTSTOP)
+                                       break;
                                post_run_single (post_list + i,
                                                 test_flags[i],
                                                 flags, i);
index 36473e311f8606eb805ad037d8108c0b96b3f553..a790c789d63fbf51df9a90bc2e13fdd404776970 100644 (file)
@@ -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 | POST_STOP,
+       &ocm_post_test,
+       NULL,
+       NULL,
+       CFG_POST_OCM
+    },
+#endif
 #if CONFIG_POST & CFG_POST_CACHE
     {
        "Cache test",
@@ -270,7 +283,7 @@ struct post_test post_list[] =
 #if CONFIG_POST & CFG_POST_BSPEC4
        CONFIG_POST_BSPEC4,
 #endif
-#if CONFIG_POST & CFG_POST_BSPEC4
+#if CONFIG_POST & CFG_POST_BSPEC5
        CONFIG_POST_BSPEC5,
 #endif
 };