|
0
|
1 /*================================================================= |
|
|
2 // |
|
|
3 // cache.c |
|
|
4 // |
|
|
5 // HAL Cache timing test |
|
|
6 // |
|
|
7 //========================================================================== |
|
|
8 //####COPYRIGHTBEGIN#### |
|
|
9 // |
|
|
10 // ------------------------------------------- |
|
|
11 // The contents of this file are subject to the Cygnus eCos Public License |
|
|
12 // Version 1.0 (the "License"); you may not use this file except in |
|
|
13 // compliance with the License. You may obtain a copy of the License at |
|
|
14 // http://sourceware.cygnus.com/ecos |
|
|
15 // |
|
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
|
18 // License for the specific language governing rights and limitations under |
|
|
19 // the License. |
|
|
20 // |
|
|
21 // The Original Code is eCos - Embedded Cygnus Operating System, released |
|
|
22 // September 30, 1998. |
|
|
23 // |
|
|
24 // The Initial Developer of the Original Code is Cygnus. Portions created |
|
2
|
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved. |
|
0
|
26 // ------------------------------------------- |
|
|
27 // |
|
|
28 //####COPYRIGHTEND#### |
|
|
29 //========================================================================== |
|
|
30 //#####DESCRIPTIONBEGIN#### |
|
|
31 // |
|
|
32 // Author(s): dsm |
|
|
33 // Contributors: dsm, nickg |
|
|
34 // Date: 1998-06-18 |
|
|
35 //####DESCRIPTIONEND#### |
|
|
36 */ |
|
|
37 |
|
|
38 #include <pkgconf/hal.h> |
|
|
39 |
|
|
40 #include <cyg/infra/testcase.h> |
|
|
41 |
|
|
42 #include <cyg/hal/hal_cache.h> |
|
2
|
43 #include <cyg/hal/hal_intr.h> |
|
|
44 |
|
|
45 // ------------------------------------------------------------------------- |
|
|
46 // If the HAL does not supply this, we supply our own version |
|
|
47 |
|
|
48 #ifndef HAL_DCACHE_PURGE_ALL |
|
|
49 |
|
|
50 static cyg_uint8 dca[HAL_DCACHE_SIZE + HAL_DCACHE_LINE_SIZE*2]; |
|
|
51 |
|
|
52 #define HAL_DCACHE_PURGE_ALL() \ |
|
|
53 CYG_MACRO_START \ |
|
|
54 volatile cyg_uint8 *addr = &dca[HAL_DCACHE_LINE_SIZE]; \ |
|
|
55 volatile cyg_uint8 tmp = 0; \ |
|
|
56 int i; \ |
|
|
57 for( i = 0; i < HAL_DCACHE_SIZE; i += HAL_DCACHE_LINE_SIZE ) \ |
|
|
58 { \ |
|
|
59 tmp = addr[i]; \ |
|
|
60 } \ |
|
|
61 CYG_MACRO_END |
|
|
62 |
|
|
63 #endif |
|
0
|
64 |
|
|
65 // ------------------------------------------------------------------------- |
|
|
66 |
|
|
67 #define MAXSIZE 1<<18 |
|
|
68 |
|
|
69 volatile char m[MAXSIZE]; |
|
|
70 |
|
2
|
71 #ifndef MAX_STRIDE |
|
|
72 #define MAX_STRIDE 64 |
|
|
73 #endif |
|
|
74 |
|
0
|
75 // ------------------------------------------------------------------------- |
|
|
76 |
|
|
77 static void time0(register cyg_uint32 stride) |
|
|
78 { |
|
|
79 register cyg_uint32 j,k; |
|
|
80 // cyg_tick_count_t count0, count1; |
|
|
81 // cyg_ucount32 t; |
|
|
82 register char c; |
|
|
83 |
|
|
84 // count0 = current_time(); |
|
2
|
85 k = 0; |
|
|
86 if ( cyg_test_is_simulator ) |
|
|
87 k = 3960; |
|
0
|
88 |
|
2
|
89 for(; k<4000;k++) { |
|
0
|
90 for(j=0; j<(HAL_DCACHE_SIZE/HAL_DCACHE_LINE_SIZE); j++) { |
|
|
91 c=m[stride*j]; |
|
|
92 } |
|
|
93 } |
|
|
94 |
|
|
95 // count1 = current_time(); |
|
|
96 // t = count1 - count0; |
|
|
97 // diag_printf("stride=%d, time=%d\n", stride, t); |
|
|
98 } |
|
|
99 |
|
|
100 // ------------------------------------------------------------------------- |
|
|
101 |
|
|
102 void time1(void) |
|
|
103 { |
|
|
104 cyg_uint32 i; |
|
|
105 |
|
2
|
106 for(i=1; i<=MAX_STRIDE; i+=i) { |
|
0
|
107 time0(i); |
|
|
108 } |
|
|
109 } |
|
|
110 |
|
|
111 // ------------------------------------------------------------------------- |
|
|
112 // This test could be improved by counting number of passes possible |
|
|
113 // in a given number of ticks. |
|
|
114 |
|
|
115 static void entry0( void ) |
|
|
116 { |
|
2
|
117 register CYG_INTERRUPT_STATE oldints; |
|
|
118 |
|
|
119 HAL_DISABLE_INTERRUPTS(oldints); |
|
|
120 HAL_DCACHE_PURGE_ALL(); |
|
0
|
121 HAL_ICACHE_INVALIDATE_ALL(); |
|
|
122 HAL_DCACHE_INVALIDATE_ALL(); |
|
|
123 HAL_ICACHE_DISABLE(); |
|
|
124 HAL_DCACHE_DISABLE(); |
|
2
|
125 HAL_RESTORE_INTERRUPTS(oldints); |
|
0
|
126 CYG_TEST_INFO("Dcache off Icache off"); |
|
|
127 time1(); |
|
|
128 |
|
2
|
129 HAL_DISABLE_INTERRUPTS(oldints); |
|
|
130 HAL_DCACHE_PURGE_ALL(); |
|
0
|
131 HAL_ICACHE_INVALIDATE_ALL(); |
|
|
132 HAL_DCACHE_INVALIDATE_ALL(); |
|
|
133 HAL_ICACHE_DISABLE(); |
|
|
134 HAL_DCACHE_ENABLE(); |
|
2
|
135 HAL_RESTORE_INTERRUPTS(oldints); |
|
0
|
136 CYG_TEST_INFO("Dcache on Icache off"); |
|
|
137 time1(); |
|
|
138 |
|
2
|
139 HAL_DISABLE_INTERRUPTS(oldints); |
|
|
140 HAL_DCACHE_PURGE_ALL(); |
|
0
|
141 HAL_ICACHE_INVALIDATE_ALL(); |
|
|
142 HAL_DCACHE_INVALIDATE_ALL(); |
|
|
143 HAL_ICACHE_ENABLE(); |
|
|
144 HAL_DCACHE_DISABLE(); |
|
2
|
145 HAL_RESTORE_INTERRUPTS(oldints); |
|
0
|
146 CYG_TEST_INFO("Dcache off Icache on"); |
|
|
147 time1(); |
|
|
148 |
|
2
|
149 HAL_DISABLE_INTERRUPTS(oldints); |
|
|
150 HAL_DCACHE_PURGE_ALL(); |
|
0
|
151 HAL_ICACHE_INVALIDATE_ALL(); |
|
|
152 HAL_DCACHE_INVALIDATE_ALL(); |
|
|
153 HAL_ICACHE_ENABLE(); |
|
|
154 HAL_DCACHE_ENABLE(); |
|
2
|
155 HAL_RESTORE_INTERRUPTS(oldints); |
|
|
156 CYG_TEST_INFO("Dcache on Icache on"); |
|
0
|
157 time1(); |
|
|
158 |
|
2
|
159 HAL_DISABLE_INTERRUPTS(oldints); |
|
|
160 HAL_DCACHE_PURGE_ALL(); |
|
0
|
161 HAL_ICACHE_INVALIDATE_ALL(); |
|
|
162 HAL_DCACHE_INVALIDATE_ALL(); |
|
|
163 HAL_ICACHE_DISABLE(); |
|
|
164 HAL_DCACHE_DISABLE(); |
|
2
|
165 HAL_RESTORE_INTERRUPTS(oldints); |
|
0
|
166 CYG_TEST_INFO("Dcache off Icache off"); |
|
|
167 time1(); |
|
|
168 |
|
|
169 CYG_TEST_PASS_FINISH("End of test"); |
|
|
170 } |
|
|
171 |
|
|
172 // ------------------------------------------------------------------------- |
|
|
173 |
|
|
174 void cache_main( void ) |
|
|
175 { |
|
|
176 CYG_TEST_INIT(); |
|
|
177 |
|
|
178 entry0(); |
|
|
179 |
|
|
180 } |
|
|
181 |
|
|
182 // ------------------------------------------------------------------------- |
|
|
183 |
|
|
184 externC void |
|
|
185 cyg_start( void ) |
|
|
186 { |
|
|
187 cache_main(); |
|
|
188 } |
|
|
189 |
|
|
190 // ------------------------------------------------------------------------- |
|
|
191 /* EOF cache.c */ |