]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - post/lib_powerpc/string.c
tpm: Enable 'tpmtest' command for Chrome OS boards with TPMs
[karo-tx-uboot.git] / post / lib_powerpc / string.c
1 /*
2  * (C) Copyright 2002
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 #include <common.h>
9
10 /*
11  * CPU test
12  * Load/store string instructions:      lswi, stswi, lswx, stswx
13  *
14  * Several consecutive bytes from a source memory buffer are loaded
15  * left to right into GPRs. After that, the bytes are stored
16  * from the GPRs into a target memory buffer. The contents
17  * of the source and target buffers are then compared.
18  */
19
20 #include <post.h>
21 #include "cpu_asm.h"
22
23 #if CONFIG_POST & CONFIG_SYS_POST_CPU
24
25 extern void cpu_post_exec_02 (ulong *code, ulong op1, ulong op2);
26 extern void cpu_post_exec_04 (ulong *code, ulong op1, ulong op2, ulong op3,
27     ulong op4);
28
29 #include <bedbug/regs.h>
30 int cpu_post_test_string (void)
31 {
32     int ret = 0;
33     unsigned int i;
34     int flag = disable_interrupts();
35
36     if (ret == 0)
37     {
38         char src [31], dst [31];
39
40         ulong code[] =
41         {
42             ASM_LSWI(5, 3, 31),
43             ASM_STSWI(5, 4, 31),
44             ASM_BLR,
45         };
46
47         for (i = 0; i < sizeof(src); i ++)
48         {
49             src[i] = (char) i;
50             dst[i] = 0;
51         }
52
53         cpu_post_exec_02(code, (ulong)src, (ulong)dst);
54
55         ret = memcmp(src, dst, sizeof(dst)) == 0 ? 0 : -1;
56     }
57
58     if (ret == 0)
59     {
60         char src [95], dst [95];
61
62         ulong code[] =
63         {
64             ASM_LSWX(8, 3, 5),
65             ASM_STSWX(8, 4, 5),
66             ASM_BLR,
67         };
68
69         for (i = 0; i < sizeof(src); i ++)
70         {
71             src[i] = (char) i;
72             dst[i] = 0;
73         }
74
75         cpu_post_exec_04(code, (ulong)src, (ulong)dst, 0, sizeof(src));
76
77         ret = memcmp(src, dst, sizeof(dst)) == 0 ? 0 : -1;
78     }
79
80     if (ret != 0)
81     {
82         post_log ("Error at string test !\n");
83     }
84
85     if (flag)
86         enable_interrupts();
87
88     return ret;
89 }
90
91 #endif