uboot/board/Marvell/common/ecctest.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2001
   3 *
   4 * See file CREDITS for list of people who contributed to this
   5 * project.
   6 *
   7 * This program is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU General Public License as
   9 * published by the Free Software Foundation; either version 2 of
  10 * the License, or (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  20 * MA 02111-1307 USA
  21 */
  22
  23#ifdef ECC_TEST
  24static inline void ecc_off (void)
  25{
  26        *(volatile int *) (INTERNAL_REG_BASE_ADDR + 0x4b4) &= ~0x00200000;
  27}
  28
  29static inline void ecc_on (void)
  30{
  31        *(volatile int *) (INTERNAL_REG_BASE_ADDR + 0x4b4) |= 0x00200000;
  32}
  33
  34static int putshex (const char *buf, int len)
  35{
  36        int i;
  37
  38        for (i = 0; i < len; i++) {
  39                printf ("%02x", buf[i]);
  40        }
  41        return 0;
  42}
  43
  44static int char_memcpy (void *d, const void *s, int len)
  45{
  46        int i;
  47        char *cd = d;
  48        const char *cs = s;
  49
  50        for (i = 0; i < len; i++) {
  51                *(cd++) = *(cs++);
  52        }
  53        return 0;
  54}
  55
  56static int memory_test (char *buf)
  57{
  58        const char src[][16] = {
  59                {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  60                {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
  61                 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
  62                {0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
  63                 0x02, 0x02, 0x02, 0x02, 0x02, 0x02},
  64                {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
  65                 0x04, 0x04, 0x04, 0x04, 0x04, 0x04},
  66                {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
  67                 0x08, 0x08, 0x08, 0x08, 0x08, 0x08},
  68                {0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
  69                 0x10, 0x10, 0x10, 0x10, 0x10, 0x10},
  70                {0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
  71                 0x20, 0x20, 0x20, 0x20, 0x20, 0x20},
  72                {0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
  73                 0x40, 0x40, 0x40, 0x40, 0x40, 0x40},
  74                {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
  75                 0x80, 0x80, 0x80, 0x80, 0x80, 0x80},
  76                {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
  77                 0x55, 0x55, 0x55, 0x55, 0x55, 0x55},
  78                {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
  79                 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa},
  80                {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  81                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
  82        };
  83        const int foo[] = { 0 };
  84        int i, j, a;
  85
  86        printf ("\ntest @ %d %p\n", foo[0], buf);
  87        for (i = 0; i < 12; i++) {
  88                for (a = 0; a < 8; a++) {
  89                        const char *s = src[i] + a;
  90                        int align = (unsigned) (s) & 0x7;
  91
  92                        /* ecc_off(); */
  93                        memcpy (buf, s, 8);
  94                        /* ecc_on(); */
  95                        putshex (s, 8);
  96                        if (memcmp (buf, s, 8)) {
  97                                putc ('\n');
  98                                putshex (buf, 8);
  99                                printf (" [FAIL] (%p) align=%d\n", s, align);
 100                                for (j = 0; j < 8; j++) {
 101                                        s[j] == buf[j] ? puts ("  ") :
 102                                                printf ("%02x",
 103                                                        (s[j]) ^ (buf[j]));
 104                                }
 105                                putc ('\n');
 106                        } else {
 107                                printf (" [PASS] (%p) align=%d\n", s, align);
 108                        }
 109                        /* ecc_off(); */
 110                        char_memcpy (buf, s, 8);
 111                        /* ecc_on(); */
 112                        putshex (s, 8);
 113                        if (memcmp (buf, s, 8)) {
 114                                putc ('\n');
 115                                putshex (buf, 8);
 116                                printf (" [FAIL] (%p) align=%d\n", s, align);
 117                                for (j = 0; j < 8; j++) {
 118                                        s[j] == buf[j] ? puts ("  ") :
 119                                                printf ("%02x",
 120                                                        (s[j]) ^ (buf[j]));
 121                                }
 122                                putc ('\n');
 123                        } else {
 124                                printf (" [PASS] (%p) align=%d\n", s, align);
 125                        }
 126                }
 127        }
 128
 129        return 0;
 130}
 131#endif
 132