]> git.sur5r.net Git - freertos/blob
03fa33989a6da1f814951ca487e5d31dc5590992
[freertos] /
1 /******************************************************************************
2 *
3 * (c) Copyright 2009 Xilinx, Inc. All rights reserved.
4 *
5 * This file contains confidential and proprietary information of Xilinx, Inc.
6 * and is protected under U.S. and international copyright and other
7 * intellectual property laws.
8 *
9 * DISCLAIMER
10 * This disclaimer is not a license and does not grant any rights to the
11 * materials distributed herewith. Except as otherwise provided in a valid
12 * license issued to you by Xilinx, and to the maximum extent permitted by
13 * applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
14 * FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
15 * IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
16 * MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
17 * and (2) Xilinx shall not be liable (whether in contract or tort, including
18 * negligence, or under any other theory of liability) for any loss or damage
19 * of any kind or nature related to, arising under or in connection with these
20 * materials, including for any direct, or any indirect, special, incidental,
21 * or consequential loss or damage (including loss of data, profits, goodwill,
22 * or any type of loss or damage suffered as a result of any action brought by
23 * a third party) even if such damage or loss was reasonably foreseeable or
24 * Xilinx had been advised of the possibility of the same.
25 *
26 * CRITICAL APPLICATIONS
27 * Xilinx products are not designed or intended to be fail-safe, or for use in
28 * any application requiring fail-safe performance, such as life-support or
29 * safety devices or systems, Class III medical devices, nuclear facilities,
30 * applications related to the deployment of airbags, or any other applications
31 * that could lead to death, personal injury, or severe property or
32 * environmental damage (individually and collectively, "Critical
33 * Applications"). Customer assumes the sole risk and liability of any use of
34 * Xilinx products in Critical Applications, subject only to applicable laws
35 * and regulations governing limitations on product liability.
36 *
37 * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
38 * AT ALL TIMES.
39 *
40 ******************************************************************************/
41 /*****************************************************************************/
42 /**
43 *
44 * @file xil_testcache.c
45 *
46 * Contains utility functions to test cache.
47 *
48 * <pre>
49 * MODIFICATION HISTORY:
50 *
51 * Ver   Who  Date        Changes
52 * ----- ---- -------- -------------------------------------------------------
53 * 1.00a hbm  07/28/09 Initial release
54 * 4.1   asa  05/09/14 Ensured that the address uses for cache test is aligned
55 *                                     cache line.
56 * </pre>
57 *
58 * @note
59 *
60 * This file contain functions that all operate on HAL.
61 *
62 ******************************************************************************/
63 #include "xil_cache.h"
64 #include "xil_testcache.h"
65
66 extern void xil_printf(const char *ctrl1, ...);
67
68 #define DATA_LENGTH 128
69
70 static u32 Data[DATA_LENGTH] __attribute__ ((aligned(32)));
71
72 /**
73 * Perform DCache range related API test such as Xil_DCacheFlushRange and
74 * Xil_DCacheInvalidateRange. This test function writes a constant value
75 * to the Data array, flushes the range, writes a new value, then invalidates
76 * the corresponding range.
77 *
78 * @return
79 *
80 *     - 0 is returned for a pass
81 *     - -1 is returned for a failure
82 */
83 int Xil_TestDCacheRange(void)
84 {
85         int Index;
86         int Status;
87
88         u32 Value;
89
90         xil_printf("-- Cache Range Test --\n\r");
91
92
93         for (Index = 0; Index < DATA_LENGTH; Index++)
94                 Data[Index] = 0xA0A00505;
95
96         xil_printf("    initialize Data done:\r\n");
97
98         Xil_DCacheFlushRange((u32)Data, DATA_LENGTH * sizeof(u32));
99
100         xil_printf("    flush range done\r\n");
101         for (Index = 0; Index < DATA_LENGTH; Index++)
102                 Data[Index] = Index + 3;
103
104         Xil_DCacheInvalidateRange((u32)Data, DATA_LENGTH * sizeof(u32));
105
106         xil_printf("    invalidate dcache range done\r\n");
107
108         Status = 0;
109
110         for (Index = 0; Index < DATA_LENGTH; Index++) {
111                 Value = Data[Index];
112                 if (Value != 0xA0A00505) {
113                         Status = -1;
114                         xil_printf("Data[%d] = %x\r\n", Index, Value);
115                         break;
116                 }
117         }
118
119         if (!Status) {
120                 xil_printf("    Invalidate worked\r\n");
121         }
122         else {
123                 xil_printf("Error: Invalidate dcache range not working\r\n");
124         }
125
126         xil_printf("-- Cache Range Test Complete --\r\n");
127
128         return Status;
129
130 }
131
132 /**
133 * Perform DCache all related API test such as Xil_DCacheFlush and
134 * Xil_DCacheInvalidate. This test function writes a constant value
135 * to the Data array, flushes the DCache, writes a new value, then invalidates
136 * the DCache.
137 *
138 * @return
139 *     - 0 is returned for a pass
140 *     - -1 is returned for a failure
141 */
142 int Xil_TestDCacheAll(void)
143 {
144         int Index;
145         int Status;
146         u32 Value;
147
148         xil_printf("-- Cache All Test --\n\r");
149
150
151         for (Index = 0; Index < DATA_LENGTH; Index++)
152                 Data[Index] = 0x50500A0A;
153
154         xil_printf("    initialize Data done:\r\n");
155
156         Xil_DCacheFlush();
157
158         xil_printf("    flush all done\r\n");
159
160         for (Index = 0; Index < DATA_LENGTH; Index++)
161                 Data[Index] = Index + 3;
162
163         Xil_DCacheInvalidate();
164
165         xil_printf("    invalidate all done\r\n");
166
167         Status = 0;
168
169         for (Index = 0; Index < DATA_LENGTH; Index++) {
170                 Value = Data[Index];
171                 if (Value != 0x50500A0A) {
172                         Status = -1;
173                         xil_printf("Data[%d] = %x\r\n", Index, Value);
174                         break;
175                 }
176         }
177
178         if (!Status) {
179                 xil_printf("    Invalidate all worked\r\n");
180         }
181         else {
182                 xil_printf("Error: Invalidate dcache all not working\r\n");
183         }
184
185         xil_printf("-- DCache all Test Complete --\n\r");
186
187         return Status;
188
189 }
190
191
192 /**
193 * Perform Xil_ICacheInvalidateRange() on a few function pointers.
194 *
195 * @return
196 *
197 *     - 0 is returned for a pass
198 *     The function will hang if it fails.
199 */
200 int Xil_TestICacheRange(void)
201 {
202
203         Xil_ICacheInvalidateRange((u32)Xil_TestICacheRange, 1024);
204         Xil_ICacheInvalidateRange((u32)Xil_TestDCacheRange, 1024);
205         Xil_ICacheInvalidateRange((u32)Xil_TestDCacheAll, 1024);
206
207         xil_printf("-- Invalidate icache range done --\r\n");
208
209         return 0;
210 }
211
212 /**
213 * Perform Xil_ICacheInvalidate().
214 *
215 * @return
216 *
217 *     - 0 is returned for a pass
218 *     The function will hang if it fails.
219 */
220 int Xil_TestICacheAll(void)
221 {
222         Xil_ICacheInvalidate();
223         xil_printf("-- Invalidate icache all done --\r\n");
224         return 0;
225 }