xref: /openbmc/u-boot/post/lib_powerpc/cpu.c (revision ef64e782)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2002
4  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5  */
6 
7 #include <common.h>
8 
9 /*
10  * CPU test
11  *
12  * This test checks the arithmetic logic unit (ALU) of CPU.
13  * It tests independently various groups of instructions using
14  * run-time modification of the code to reduce the memory footprint.
15  * For more details refer to post/cpu/ *.c files.
16  */
17 
18 #include <watchdog.h>
19 #include <post.h>
20 #include <asm/mmu.h>
21 
22 #if CONFIG_POST & CONFIG_SYS_POST_CPU
23 
24 extern int cpu_post_test_cmp (void);
25 extern int cpu_post_test_cmpi (void);
26 extern int cpu_post_test_two (void);
27 extern int cpu_post_test_twox (void);
28 extern int cpu_post_test_three (void);
29 extern int cpu_post_test_threex (void);
30 extern int cpu_post_test_threei (void);
31 extern int cpu_post_test_andi (void);
32 extern int cpu_post_test_srawi (void);
33 extern int cpu_post_test_rlwnm (void);
34 extern int cpu_post_test_rlwinm (void);
35 extern int cpu_post_test_rlwimi (void);
36 extern int cpu_post_test_store (void);
37 extern int cpu_post_test_load (void);
38 extern int cpu_post_test_cr (void);
39 extern int cpu_post_test_b (void);
40 extern int cpu_post_test_multi (void);
41 extern int cpu_post_test_string (void);
42 extern int cpu_post_test_complex (void);
43 
44 ulong cpu_post_makecr (long v)
45 {
46 	ulong cr = 0;
47 
48 	if (v < 0)
49 		cr |= 0x80000000;
50 	if (v > 0)
51 		cr |= 0x40000000;
52 	if (v == 0)
53 		cr |= 0x20000000;
54 
55 	return cr;
56 }
57 
58 int cpu_post_test (int flags)
59 {
60 	int ic = icache_status ();
61 	int ret = 0;
62 
63 	WATCHDOG_RESET();
64 	if (ic)
65 		icache_disable ();
66 
67 	if (ret == 0)
68 		ret = cpu_post_test_cmp ();
69 	if (ret == 0)
70 		ret = cpu_post_test_cmpi ();
71 	if (ret == 0)
72 		ret = cpu_post_test_two ();
73 	if (ret == 0)
74 		ret = cpu_post_test_twox ();
75 	WATCHDOG_RESET();
76 	if (ret == 0)
77 		ret = cpu_post_test_three ();
78 	if (ret == 0)
79 		ret = cpu_post_test_threex ();
80 	if (ret == 0)
81 		ret = cpu_post_test_threei ();
82 	if (ret == 0)
83 		ret = cpu_post_test_andi ();
84 	WATCHDOG_RESET();
85 	if (ret == 0)
86 		ret = cpu_post_test_srawi ();
87 	if (ret == 0)
88 		ret = cpu_post_test_rlwnm ();
89 	if (ret == 0)
90 		ret = cpu_post_test_rlwinm ();
91 	if (ret == 0)
92 		ret = cpu_post_test_rlwimi ();
93 	WATCHDOG_RESET();
94 	if (ret == 0)
95 		ret = cpu_post_test_store ();
96 	if (ret == 0)
97 		ret = cpu_post_test_load ();
98 	if (ret == 0)
99 		ret = cpu_post_test_cr ();
100 	if (ret == 0)
101 		ret = cpu_post_test_b ();
102 	WATCHDOG_RESET();
103 	if (ret == 0)
104 		ret = cpu_post_test_multi ();
105 	WATCHDOG_RESET();
106 	if (ret == 0)
107 		ret = cpu_post_test_string ();
108 	if (ret == 0)
109 		ret = cpu_post_test_complex ();
110 	WATCHDOG_RESET();
111 
112 	if (ic)
113 		icache_enable ();
114 
115 	WATCHDOG_RESET();
116 
117 	return ret;
118 }
119 
120 #endif /* CONFIG_POST & CONFIG_SYS_POST_CPU */
121