Merge branch 'master' of git://git.denx.de/u-boot-i2c
[oweals/u-boot.git] / post / lib_powerpc / cmpi.c
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  * Integer compare instructions:        cmpwi, cmplwi
12  *
13  * To verify these instructions the test runs them with
14  * different combinations of operands, reads the condition
15  * register value and compares it with the expected one.
16  * The test contains a pre-built table
17  * containing the description of each test case: the instruction,
18  * the values of the operands, the condition field to save
19  * the result in and the expected result.
20  */
21
22 #include <post.h>
23 #include "cpu_asm.h"
24
25 #if CONFIG_POST & CONFIG_SYS_POST_CPU
26
27 extern void cpu_post_exec_11 (ulong *code, ulong *res, ulong op1);
28
29 static struct cpu_post_cmpi_s
30 {
31     ulong cmd;
32     ulong op1;
33     ushort op2;
34     ulong cr;
35     ulong res;
36 } cpu_post_cmpi_table[] =
37 {
38     {
39         OP_CMPWI,
40         123,
41         123,
42         2,
43         0x02
44     },
45     {
46         OP_CMPWI,
47         123,
48         133,
49         3,
50         0x08
51     },
52     {
53         OP_CMPWI,
54         123,
55         -133,
56         4,
57         0x04
58     },
59     {
60         OP_CMPLWI,
61         123,
62         123,
63         2,
64         0x02
65     },
66     {
67         OP_CMPLWI,
68         123,
69         -133,
70         3,
71         0x08
72     },
73     {
74         OP_CMPLWI,
75         123,
76         113,
77         4,
78         0x04
79     },
80 };
81 static unsigned int cpu_post_cmpi_size = ARRAY_SIZE(cpu_post_cmpi_table);
82
83 int cpu_post_test_cmpi (void)
84 {
85     int ret = 0;
86     unsigned int i;
87     int flag = disable_interrupts();
88
89     for (i = 0; i < cpu_post_cmpi_size && ret == 0; i++)
90     {
91         struct cpu_post_cmpi_s *test = cpu_post_cmpi_table + i;
92         unsigned long code[] =
93         {
94             ASM_1IC(test->cmd, test->cr, 3, test->op2),
95             ASM_MFCR(3),
96             ASM_BLR
97         };
98         ulong res;
99
100         cpu_post_exec_11 (code, & res, test->op1);
101
102         ret = ((res >> (28 - 4 * test->cr)) & 0xe) == test->res ? 0 : -1;
103
104         if (ret != 0)
105         {
106             post_log ("Error at cmpi test %d !\n", i);
107         }
108     }
109
110     if (flag)
111         enable_interrupts();
112
113     return ret;
114 }
115
116 #endif