summaryrefslogtreecommitdiffstats
path: root/board/evb64260/ecctest.c
blob: e7c58b3a292707cc3257a8c3fa95dbbcb8247a54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifdef ECC_TEST
static inline void ecc_off(void)
{
	*(volatile int *)(INTERNAL_REG_BASE_ADDR+0x4b4) &= ~0x00200000;
}

static inline void ecc_on(void)
{
	*(volatile int *)(INTERNAL_REG_BASE_ADDR+0x4b4) |= 0x00200000;
}

static int putshex(const char *buf, int len)
{
    int i;
    for (i=0;i<len;i++) {
	printf("%02x", buf[i]);
    }
    return 0;
}

static int char_memcpy(void *d, const void *s, int len)
{
    int i;
    char *cd=d;
    const char *cs=s;
    for(i=0;i<len;i++) {
	*(cd++)=*(cs++);
    }
    return 0;
}

static int memory_test(char *buf)
{
    const char src[][16]={
	{   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0},
	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
	{0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02},
	{0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04},
	{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},
	{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10},
	{0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20},
	{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40},
	{0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80},
	{0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55},
	{0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa},
	{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}
    };
    const int foo[] = {0};
    int i,j,a;

    printf("\ntest @ %d %p\n", foo[0], buf);
    for(i=0;i<12;i++) {
	for(a=0;a<8;a++) {
	    const char *s=src[i]+a;
	    int align=(unsigned)(s)&0x7;
	    /* ecc_off(); */
	    memcpy(buf,s,8);
	    /* ecc_on(); */
	    putshex(s,8);
	    if(memcmp(buf,s,8)) {
		putc('\n');
		putshex(buf,8);
		printf(" [FAIL] (%p) align=%d\n", s, align);
		for(j=0;j<8;j++) {
		    s[j]==buf[j]?puts("  "):printf("%02x", (s[j])^(buf[j]));
		}
		putc('\n');
	    } else {
		printf(" [PASS] (%p) align=%d\n", s, align);
	    }
	    /* ecc_off(); */
	    char_memcpy(buf,s,8);
	    /* ecc_on(); */
	    putshex(s,8);
	    if(memcmp(buf,s,8)) {
		putc('\n');
		putshex(buf,8);
		printf(" [FAIL] (%p) align=%d\n", s, align);
		for(j=0;j<8;j++) {
		    s[j]==buf[j]?puts("  "):printf("%02x", (s[j])^(buf[j]));
		}
		putc('\n');
	    } else {
		printf(" [PASS] (%p) align=%d\n", s, align);
	    }
	}
    }

    return 0;
}
#endif
OpenPOWER on IntegriCloud