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