annotate packages/kernel/current/tests/kcache2.c @ 760:74589c7c236e

* tests/fptest.c (alarm_fn): Added CYG_TEST_PASS() call to keep configtool happy.
author nickg
date Tue, 25 Feb 2003 18:42:00 +0000
parents c0ed1c4642f8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 /*=================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // kcache2.c
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // Cache feature/timing tests
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
12 // Copyright (C) 2003 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 // Author(s): jskov, based on kcache1.c by dsm
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
45 // Contributors: jskov, gthomas
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 // Date: 1998-12-10
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 // Description: Tests some of the more exotic cache macros.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 #include <cyg/hal/hal_arch.h> // CYGNUM_HAL_STACK_SIZE_TYPICAL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 #include <cyg/kernel/kapi.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 #include <cyg/infra/testcase.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 #ifdef CYGFUN_KERNEL_API_C
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 #include <cyg/infra/diag.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 #include <cyg/hal/hal_cache.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 #define NTHREADS 1
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 #define STACKSIZE CYGNUM_HAL_STACK_SIZE_TYPICAL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 // The following are defaults for loop variables. Note they will be overriden
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 // on simulator targets, where detected - there is no point testing a cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 // which doesn't exist :-).
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 #define TEST_DZERO_LOOPS 5000 // default number of loops for test_dzero()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 #define TIME_ILOCK_LOOPS 10000 // default number of loops for time_ilock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 #define TIME_DLOCK_LOOPS 10000 // default number of loops for time_dlock()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
76 // Define this to enable a simple, but hopefully useful, data cache
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
77 // test. It may help discover if the cache support has been defined
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
78 // properly (in terms of size and shape)
583
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
79 #ifdef HAL_DCACHE_LINE_SIZE
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
80 #define _TEST_DCACHE_OPERATION
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
81 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 static cyg_handle_t thread[NTHREADS];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 static cyg_thread thread_obj[NTHREADS];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 static char stack[NTHREADS][STACKSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 #define MAXSIZE 1<<18
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 volatile char m[MAXSIZE];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 // Test of data cache zero.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 // o Timing comparison with instructions doing the same amount of work.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 // o Check that area cleared with the DCACHE_ZERO macro contains zeros.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 #ifdef HAL_DCACHE_ZERO
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 static void test_dzero(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 register cyg_uint32 k, i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 cyg_tick_count_t count0, count1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 cyg_ucount32 t;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 volatile cyg_uint32* aligned_p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 volatile cyg_uint32* p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 register CYG_INTERRUPT_STATE oldints;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 cyg_ucount32 test_dzero_loops = TEST_DZERO_LOOPS;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 CYG_TEST_INFO("Data cache zero");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 if (cyg_test_is_simulator)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 test_dzero_loops=10;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 aligned_p = (volatile cyg_uint32*)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2])
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 & ~(HAL_DCACHE_LINE_SIZE-1));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 // Time with conventional instructions.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 count0 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 for (k = 0; k < test_dzero_loops; k++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 p = aligned_p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 for (i = 0; i < HAL_DCACHE_SETS; i++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 #if (16 == HAL_DCACHE_LINE_SIZE)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 *p++ = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 *p++ = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 *p++ = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 *p++ = 0;
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
133 #elif (32 == HAL_DCACHE_LINE_SIZE)
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
134 *p++ = 0;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
135 *p++ = 0;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
136 *p++ = 0;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
137 *p++ = 0;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
138 *p++ = 0;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
139 *p++ = 0;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
140 *p++ = 0;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
141 *p++ = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 #error "Not defined for this cache line size."
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 count1 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 t = count1 - count0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 diag_printf("time with instructions: %d\n", t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 // Initialize the area with non-zero so we can check whether
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160 // the macro cleared the area properly.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 p = aligned_p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 for (i = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 i < HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE/sizeof(cyg_uint32);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 i++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 *p++ = 0xdeadbeef;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 // Time with DCACHE_ZERO.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 count0 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 for (k = 0; k < test_dzero_loops; k++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 HAL_DCACHE_ZERO(aligned_p, HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 count1 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 t = count1 - count0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 diag_printf("time with HAL_DCACHE_ZERO: %d\n", t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 // Verify that the area was actually cleared.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
194 cyg_uint32 d;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
195
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 d = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197 p = aligned_p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 for (i = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 i < HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE/sizeof(cyg_uint32);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 i++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201 d |= *p++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 CYG_TEST_CHECK(0 == d, "region not properly cleared");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 // Test of data cache write hint.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 // Just check that the macro compiles.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213 #ifdef HAL_DCACHE_WRITE_HINT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 static void test_dwrite_hint(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 register cyg_uint32 k;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 register CYG_INTERRUPT_STATE oldints;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 CYG_TEST_INFO("Data cache write hint");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
221 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
222 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 HAL_DCACHE_WRITE_HINT(&m[HAL_DCACHE_LINE_SIZE*2], 2*HAL_DCACHE_LINE_SIZE);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230 for (k = 0; k < 20; k++);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 m[HAL_DCACHE_LINE_SIZE*2] = 42;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 // Test of data cache read hint.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 // Just check that the macro compiles.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 #ifdef HAL_DCACHE_READ_HINT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 static void test_dread_hint(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 register char c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 register cyg_uint32 k;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 register CYG_INTERRUPT_STATE oldints;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 CYG_TEST_INFO("Data cache read hint");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 HAL_DCACHE_READ_HINT(&m[HAL_DCACHE_LINE_SIZE*2], 2*HAL_DCACHE_LINE_SIZE);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 for (k = 0; k < 20; k++);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 c = m[HAL_DCACHE_LINE_SIZE*2];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 // -------------------------------------------------------------------------
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
262 // Test of data cache line store
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
263 // o No semantic requirement.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
264 // o Check that flushed data is written to memory.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
265 // o Simple invocation check of macro.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 #ifdef HAL_DCACHE_STORE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 static void test_dstore(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 volatile cyg_uint8* aligned_p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 cyg_int32 i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271 register CYG_INTERRUPT_STATE oldints;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 CYG_TEST_INFO("Data cache store region");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 m[i] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
280 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285 aligned_p = (volatile cyg_uint8*)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2])
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 & ~(HAL_DCACHE_LINE_SIZE-1));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
289 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used!
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291 HAL_DCACHE_STORE(aligned_p, HAL_DCACHE_LINE_SIZE);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
292
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
293 CYG_TEST_CHECK(42 == aligned_p[0],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
294 "memory didn't contain flushed data");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
295
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
296 HAL_DCACHE_INVALIDATE_ALL(); // Discard...
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
297
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
298 CYG_TEST_CHECK(42 == aligned_p[0],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
299 "memory didn't contain flushed data after invalidate all");
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
300
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
301 HAL_RESTORE_INTERRUPTS(oldints);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 // -------------------------------------------------------------------------
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
306 // Test of data cache total flush (sync).
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
307 // o No semantic requirement.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
308 // o Check that flushed data is written to memory.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
309 // o Simple invocation check of macro.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
310 #ifdef HAL_DCACHE_LINE_SIZE // So we can find our way around memory
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
311
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
312 #ifdef _TEST_DCACHE_OPERATION
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
313 static void
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
314 test_dcache_operation(void)
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
315 {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
316 long *lp = (long *)m;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
317 int i, errs;
583
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
318 cyg_uint32 oldints;
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
319
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
320 CYG_TEST_INFO("Data cache basic");
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
321
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
322 HAL_DISABLE_INTERRUPTS(oldints);
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
323 HAL_DCACHE_SYNC();
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
324 HAL_DCACHE_DISABLE();
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
325 HAL_DCACHE_SYNC();
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
326 // Fill test buffer
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
327 for (i = 0; i < sizeof(m)/sizeof(*lp); i++) {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
328 lp[i] = i;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
329 }
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
330 HAL_DCACHE_INVALIDATE_ALL();
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
331 HAL_DCACHE_ENABLE();
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
332 // Now push data through the cache
583
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
333 // Note: 256 seems like a reasonable offset. It may be useful to actually
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
334 // compute this (and the size of the test region) based on cache geometry
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
335 for (i = 256; i < 256+HAL_DCACHE_SIZE/sizeof(*lp); i++) {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
336 lp[i] = 0xFF000000 + i;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
337 }
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
338 // Now force cache clean and off
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
339 HAL_DCACHE_SYNC();
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
340 HAL_DCACHE_DISABLE();
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
341 // Verify the data
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
342 diag_printf("Verify data with cache off\n");
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
343 errs = 0;
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
344 for (i = 0; i < sizeof(m)/sizeof(*lp); i++) {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
345 if ((i >= 256) && (i < 256+HAL_DCACHE_SIZE/sizeof(*lp))) {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
346 if (lp[i] != (0xFF000000 + i)) {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
347 if (++errs < 16) {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
348 diag_printf("Data inside test range changed - was: %x, is %x, index: %x\n",
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
349 0xFF000000+i, lp[i], i);
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
350 }
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
351 }
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
352 } else {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
353 if (lp[i] != i) {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
354 if (++errs < 16) {
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
355 diag_printf("Data outside test range changed - was: %x, is %x, index: %x\n",
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
356 i, lp[i], i);
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
357 }
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
358 }
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
359 }
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
360 }
583
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
361 CYG_TEST_CHECK(0 == errs, "dcache basic failed");
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
362 #if 0 // Additional information
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
363 diag_printf("%d total errors during compare\n", errs);
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
364 diag_dump_buf(&lp[240], 128);
583
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
365 #endif
477
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
366 HAL_RESTORE_INTERRUPTS(oldints);
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
367 }
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
368 #endif
658c231c7e71 Fix kcache2 test for 32 byte cache line size. Add low level cache testing.
gthomas
parents: 210
diff changeset
369
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
370 static void test_dsync(void)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
371 {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
372 volatile cyg_uint8* aligned_p;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
373 cyg_int32 i;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
374 register CYG_INTERRUPT_STATE oldints;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
375
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
376 CYG_TEST_INFO("Data cache sync all");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
377
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
378 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
379 m[i] = 0;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
380
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
381 HAL_DISABLE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
382 HAL_DCACHE_SYNC();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
383 HAL_DCACHE_DISABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
384 HAL_DCACHE_SYNC();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
385 HAL_DCACHE_INVALIDATE_ALL();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
386 HAL_DCACHE_ENABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
387
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
388 aligned_p = (volatile cyg_uint8*)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
389 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2])
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
390 & ~(HAL_DCACHE_LINE_SIZE-1));
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
391
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
392 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used!
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
393 aligned_p[HAL_DCACHE_LINE_SIZE] = 43 + aligned_p[HAL_DCACHE_LINE_SIZE + 1];
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
394
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
395 HAL_DCACHE_SYNC();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
396
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
397 CYG_TEST_CHECK(42 == aligned_p[0],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
398 "memory didn't contain flushed data");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
399 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
400 "memory didn't contain flushed data next block");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
401
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
402 HAL_DCACHE_INVALIDATE_ALL();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
403
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
404 CYG_TEST_CHECK(42 == aligned_p[0],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
405 "memory didn't contain flushed data after invalidate");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
406 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
407 "memory didn't contain flushed data next block after invalidate");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
408
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
409 HAL_RESTORE_INTERRUPTS(oldints);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 199
diff changeset
410
195
67850532eebb Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents: 191
diff changeset
411 HAL_ICACHE_INVALIDATE_ALL();
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
412 HAL_DCACHE_DISABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
413
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
414 CYG_TEST_CHECK(42 == aligned_p[0],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
415 "memory didn't contain flushed data after disable");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
416 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
417 "memory didn't contain flushed data next block after disable");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
418
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
419 HAL_DCACHE_ENABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
420 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
421 #endif // HAL_DCACHE_LINE_SIZE
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
422
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
423 // -------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
424 // Test of data cache line flush.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
425 // o Requires write-back cache.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
426 // o Check that flushed data is written to memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
427 // o Simple range check of macro.
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 143
diff changeset
428 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test:
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
429 #ifdef HAL_DCACHE_FLUSH
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
430 static void test_dflush(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
431 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
432 volatile cyg_uint8* aligned_p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
433 cyg_int32 i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
434 register CYG_INTERRUPT_STATE oldints;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
435
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
436 CYG_TEST_INFO("Data cache flush region");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
437
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
438 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
439 m[i] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
440
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
441 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
442 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
443 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
444 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
445 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
446 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
447 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
448
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
449 aligned_p = (volatile cyg_uint8*)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
450 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2])
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
451 & ~(HAL_DCACHE_LINE_SIZE-1));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
452
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
453 HAL_DISABLE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
454
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
455 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used!
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
456 aligned_p[HAL_DCACHE_LINE_SIZE] = 43 + aligned_p[HAL_DCACHE_LINE_SIZE + 1];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
457
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
458 HAL_DCACHE_FLUSH(aligned_p, HAL_DCACHE_LINE_SIZE);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
459
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
460 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
461
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
462 HAL_RESTORE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
463
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
464 CYG_TEST_CHECK(42 == aligned_p[0],
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
465 "memory didn't contain flushed data");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
466 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE],
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
467 "flushed beyond region");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
468
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
469 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
470 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
471 #endif
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 143
diff changeset
472 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
473
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
474 // -------------------------------------------------------------------------
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
475 // Test of data cache disable (which does NOT force contents out to RAM)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
476 // o Requires write-back cache [so NOT invoked unconditionally]
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
477 // o Check that dirty data is not written to memory and is invalidated
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
478 // in the cache.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
479 // o Simple invocation check of macro.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
480 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test:
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
481 static void test_ddisable(void)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
482 {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
483 volatile cyg_uint8* aligned_p;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
484 cyg_int32 i;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
485 register CYG_INTERRUPT_STATE oldints;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
486
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
487 CYG_TEST_INFO("Data cache gross disable");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
488
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
489 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
490 m[i] = 0;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
491
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
492 HAL_DISABLE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
493 HAL_DCACHE_SYNC();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
494 HAL_DCACHE_DISABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
495 HAL_DCACHE_SYNC();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
496 HAL_DCACHE_INVALIDATE_ALL();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
497 HAL_DCACHE_ENABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
498 HAL_RESTORE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
499
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
500 aligned_p = (volatile cyg_uint8*)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
501 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2])
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
502 & ~(HAL_DCACHE_LINE_SIZE-1));
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
503
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
504 HAL_DISABLE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
505
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
506 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used!
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
507 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
508
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
509 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1];
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
510
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
511 HAL_DCACHE_DISABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
512
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
513 HAL_RESTORE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
514
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
515 CYG_TEST_CHECK(0 == aligned_p[0] &&
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
516 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
517 "cache/memory contained invalidated data");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
518 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
519 "next block contained invalidated data");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
520
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
521 HAL_DCACHE_ENABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
522 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
523 #endif // def HAL_DCACHE_QUERY_WRITE_MODE
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
524
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
525 // -------------------------------------------------------------------------
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
526 // Test of data cache total invalidate.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
527 // o Requires write-back cache.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
528 // o Check that invalidated data is not written to memory and is invalidated
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
529 // in the cache.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
530 // o Simple invocation check of macro.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
531 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test:
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
532 #ifdef HAL_DCACHE_INVALIDATE_ALL
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
533 static void test_dinvalidate_all(void)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
534 {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
535 volatile cyg_uint8* aligned_p;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
536 cyg_int32 i;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
537 register CYG_INTERRUPT_STATE oldints;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
538
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
539 CYG_TEST_INFO("Data cache invalidate all");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
540
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
541 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
542 m[i] = 0;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
543
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
544 HAL_DISABLE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
545 HAL_DCACHE_SYNC();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
546 HAL_DCACHE_DISABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
547 HAL_DCACHE_SYNC();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
548 HAL_DCACHE_INVALIDATE_ALL();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
549 HAL_DCACHE_ENABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
550
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
551 aligned_p = (volatile cyg_uint8*)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
552 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2])
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
553 & ~(HAL_DCACHE_LINE_SIZE-1));
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
554
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
555 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used!
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
556 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
557
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
558 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1];
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
559
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
560 HAL_DCACHE_INVALIDATE_ALL();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
561
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
562 HAL_RESTORE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
563
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
564 CYG_TEST_CHECK(0 == aligned_p[0] &&
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
565 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
566 "cache/memory contained invalidated data");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
567 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
568 "next block contained invalidated data");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
569 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
570 #endif
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
571 #endif // def HAL_DCACHE_QUERY_WRITE_MODE
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
572
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
573 // -------------------------------------------------------------------------
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
574 // Test of data cache line invalidate.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
575 // o Requires write-back cache.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
576 // o Check that invalidated data is not written to memory and is invalidated
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
577 // in the cache.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
578 // o Simple range check of macro.
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
579 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test:
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
580 #ifdef HAL_DCACHE_INVALIDATE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
581 static void test_dinvalidate(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
582 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
583 volatile cyg_uint8* aligned_p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
584 cyg_int32 i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
585 register CYG_INTERRUPT_STATE oldints;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
586
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
587 CYG_TEST_INFO("Data cache invalidate region");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
588
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
589 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
590 m[i] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
591
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
592 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
593 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
594 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
595 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
596 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
597 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
598 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
599
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
600 aligned_p = (volatile cyg_uint8*)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
601 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2])
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
602 & ~(HAL_DCACHE_LINE_SIZE-1));
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
603
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
604 HAL_DISABLE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
605
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
606 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used!
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
607 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
608
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
609 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1];
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
610
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
611 HAL_DCACHE_INVALIDATE(aligned_p, HAL_DCACHE_LINE_SIZE);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
612
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
613 HAL_RESTORE_INTERRUPTS(oldints);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
614
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
615 CYG_TEST_CHECK(0 == aligned_p[0] &&
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
616 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1],
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
617 "cache/memory contained invalidated data");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
618 CYG_TEST_CHECK(42 == aligned_p[HAL_DCACHE_LINE_SIZE],
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
619 "invalidated beyond range");
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
620
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
621 HAL_DCACHE_SYNC();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
622 HAL_DCACHE_DISABLE();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
623
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
624 CYG_TEST_CHECK(0 == aligned_p[0] &&
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
625 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
626 "cache/memory contained invalidated data after SYNC/DIS");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
627 CYG_TEST_CHECK(42 == aligned_p[HAL_DCACHE_LINE_SIZE],
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
628 "invalidated beyond range after SYNC/DIS");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
629
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
630 HAL_DCACHE_ENABLE();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
631 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
632 #endif
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
633 #endif // def HAL_DCACHE_QUERY_WRITE_MODE
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
634
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
635 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
636 // Test of instruction cache locking.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
637 // o Time difference between repeatedly executing a bunch of instructions
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
638 // with and without locking.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
639 #ifdef HAL_ICACHE_LOCK
199
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
640 static void iloop(unsigned long* start, unsigned long* end, int dummy)
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
641 {
199
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
642 // dummy is just used to fool the compiler to not move the labels
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
643 // around. All callers should call with dummy=0;
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
644
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
645 register char c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
646 register CYG_INTERRUPT_STATE oldints;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
647
199
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
648 if (1 == dummy) goto label_end;
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
649
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
650 label_start:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
651 // Invalidating shouldn't affect locked lines.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
652 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
653 HAL_ICACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
654 HAL_ICACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
655 HAL_ICACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
656 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
657
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
658 c = m[HAL_DCACHE_LINE_SIZE*0];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
659 c = m[HAL_DCACHE_LINE_SIZE*1];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
660 c = m[HAL_DCACHE_LINE_SIZE*2];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
661 c = m[HAL_DCACHE_LINE_SIZE*3];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
662 c = m[HAL_DCACHE_LINE_SIZE*4];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
663 c = m[HAL_DCACHE_LINE_SIZE*5];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
664 c = m[HAL_DCACHE_LINE_SIZE*6];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
665 c = m[HAL_DCACHE_LINE_SIZE*7];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
666 c = m[HAL_DCACHE_LINE_SIZE*8];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
667 c = m[HAL_DCACHE_LINE_SIZE*9];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
668 c = m[HAL_DCACHE_LINE_SIZE*10];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
669 c = m[HAL_DCACHE_LINE_SIZE*11];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
670 c = m[HAL_DCACHE_LINE_SIZE*12];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
671 c = m[HAL_DCACHE_LINE_SIZE*13];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
672 c = m[HAL_DCACHE_LINE_SIZE*14];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
673 c = m[HAL_DCACHE_LINE_SIZE*15];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
674 c = m[HAL_DCACHE_LINE_SIZE*16];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
675 c = m[HAL_DCACHE_LINE_SIZE*17];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
676 c = m[HAL_DCACHE_LINE_SIZE*18];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
677 c = m[HAL_DCACHE_LINE_SIZE*19];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
678 c = m[HAL_DCACHE_LINE_SIZE*20];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
679 c = m[HAL_DCACHE_LINE_SIZE*21];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
680 c = m[HAL_DCACHE_LINE_SIZE*22];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
681 c = m[HAL_DCACHE_LINE_SIZE*23];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
682 c = m[HAL_DCACHE_LINE_SIZE*24];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
683 c = m[HAL_DCACHE_LINE_SIZE*25];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
684 c = m[HAL_DCACHE_LINE_SIZE*26];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
685 c = m[HAL_DCACHE_LINE_SIZE*27];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
686 c = m[HAL_DCACHE_LINE_SIZE*28];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
687 c = m[HAL_DCACHE_LINE_SIZE*29];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
688 c = m[HAL_DCACHE_LINE_SIZE*30];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
689 c = m[HAL_DCACHE_LINE_SIZE*31];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
690 c = m[HAL_DCACHE_LINE_SIZE*32];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
691 c = m[HAL_DCACHE_LINE_SIZE*33];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
692 c = m[HAL_DCACHE_LINE_SIZE*34];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
693 c = m[HAL_DCACHE_LINE_SIZE*35];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
694 c = m[HAL_DCACHE_LINE_SIZE*36];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
695 c = m[HAL_DCACHE_LINE_SIZE*37];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
696 c = m[HAL_DCACHE_LINE_SIZE*38];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
697 c = m[HAL_DCACHE_LINE_SIZE*39];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
698 c = m[HAL_DCACHE_LINE_SIZE*40];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
699 c = m[HAL_DCACHE_LINE_SIZE*41];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
700 c = m[HAL_DCACHE_LINE_SIZE*42];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
701 c = m[HAL_DCACHE_LINE_SIZE*43];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
702 c = m[HAL_DCACHE_LINE_SIZE*44];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
703 c = m[HAL_DCACHE_LINE_SIZE*45];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
704 c = m[HAL_DCACHE_LINE_SIZE*46];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
705 c = m[HAL_DCACHE_LINE_SIZE*47];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
706 c = m[HAL_DCACHE_LINE_SIZE*48];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
707 c = m[HAL_DCACHE_LINE_SIZE*49];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
708 c = m[HAL_DCACHE_LINE_SIZE*50];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
709 c = m[HAL_DCACHE_LINE_SIZE*51];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
710 c = m[HAL_DCACHE_LINE_SIZE*52];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
711 c = m[HAL_DCACHE_LINE_SIZE*53];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
712 c = m[HAL_DCACHE_LINE_SIZE*54];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
713 c = m[HAL_DCACHE_LINE_SIZE*55];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
714 c = m[HAL_DCACHE_LINE_SIZE*56];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
715 c = m[HAL_DCACHE_LINE_SIZE*57];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
716 c = m[HAL_DCACHE_LINE_SIZE*58];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
717 c = m[HAL_DCACHE_LINE_SIZE*59];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
718 c = m[HAL_DCACHE_LINE_SIZE*60];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
719 c = m[HAL_DCACHE_LINE_SIZE*61];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
720 c = m[HAL_DCACHE_LINE_SIZE*62];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
721 c = m[HAL_DCACHE_LINE_SIZE*63];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
722
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
723 label_end:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
724
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
725 *start = (unsigned long) &&label_start;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
726 *end = (unsigned long) &&label_end;
199
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
727
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
728 if (1 == dummy) goto label_start;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
729 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
730
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
731 static void time_ilock(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
732 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
733 register cyg_ucount32 k;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
734 cyg_tick_count_t count0, count1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
735 cyg_ucount32 t;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
736 unsigned long start, end;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
737 register cyg_ucount32 time_ilock_loops = TIME_ILOCK_LOOPS;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
738
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
739 CYG_TEST_INFO("Instruction cache lock");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
740
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
741 if (cyg_test_is_simulator)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
742 time_ilock_loops = 10;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
743
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
744 count0 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
745 for (k = 0; k < time_ilock_loops; k++) {
199
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
746 iloop(&start, &end, 0);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
747 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
748 count1 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
749 t = count1 - count0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
750 diag_printf("time without lock: %d\n", t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
751
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
752 HAL_ICACHE_LOCK(start, end-start);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
753
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
754 count0 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
755 for (k = 0; k < time_ilock_loops; k++) {
199
920b9b754b53 Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents: 195
diff changeset
756 iloop(&start, &end, 0);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
757 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
758 count1 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
759 t = count1 - count0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
760 diag_printf("time with lock: %d\n", t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
761
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
762 HAL_ICACHE_UNLOCK(start, end-start);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
763 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
764 #endif // ifdef HAL_ICACHE_LOCK
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
765
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
766 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
767 // Test of data cache locking.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
768 // o Time difference between repeatedly accessing a memory region
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
769 // with and without locking.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
770 #ifdef HAL_DCACHE_LOCK
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
771 static void dloop(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
772 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
773 register cyg_uint32 j;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
774 register char c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
775 register CYG_INTERRUPT_STATE oldints;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
776
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
777 HAL_DISABLE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
778 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
779 HAL_DCACHE_DISABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
780 HAL_DCACHE_SYNC();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
781 HAL_DCACHE_INVALIDATE_ALL();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
782 HAL_DCACHE_ENABLE();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
783 HAL_RESTORE_INTERRUPTS(oldints);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
784 for (j = 0; j < HAL_DCACHE_SETS; j++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
785 c = m[HAL_DCACHE_LINE_SIZE*j];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
786 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
787 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
788
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
789 static void time_dlock(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
790 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
791 register cyg_ucount32 k;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
792 cyg_tick_count_t count0, count1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
793 cyg_ucount32 t;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
794 register cyg_ucount32 time_dlock_loops = TIME_DLOCK_LOOPS;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
795
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
796 CYG_TEST_INFO("Data cache lock");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
797
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
798 if (cyg_test_is_simulator)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
799 time_dlock_loops = 10;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
800
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
801 count0 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
802 for (k = 0; k < time_dlock_loops; k++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
803 dloop();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
804 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
805 count1 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
806 t = count1 - count0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
807 diag_printf("time without lock: %d\n", t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
808
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
809 HAL_DCACHE_LOCK(&m[0], HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
810
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
811 count0 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
812 for (k = 0; k < time_dlock_loops; k++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
813 dloop();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
814 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
815 count1 = cyg_current_time();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
816 t = count1 - count0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
817 diag_printf("time with lock: %d\n", t);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
818
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
819 HAL_DCACHE_UNLOCK(&m[0], HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
820 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
821 #endif // ifdef HAL_DCACHE_LOCK
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
822
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
823 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
824 static void entry0( cyg_addrword_t data )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
825 {
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
826 int numtests = 0;
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 2
diff changeset
827 #ifdef HAL_DCACHE_QUERY_WRITE_MODE
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 2
diff changeset
828 int wmode;
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 2
diff changeset
829 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
830 #ifdef HAL_DCACHE_LOCK
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
831 time_dlock(); numtests++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
832 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
833 #ifdef HAL_ICACHE_LOCK
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
834 time_ilock(); numtests++;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
835 #endif
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
836 #ifdef HAL_DCACHE_LINE_SIZE // So we can find our way around memory
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
837 test_dsync(); numtests++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
838 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
839 #ifdef HAL_DCACHE_STORE
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
840 test_dstore(); numtests++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
841 #endif
583
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
842 #ifdef _TEST_DCACHE_OPERATION
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
843 test_dcache_operation(); numtests++;
c0ed1c4642f8 Fix some bitrot. Always run basic DATA cache test.
gthomas
parents: 484
diff changeset
844 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
845 #ifdef HAL_DCACHE_READ_HINT
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
846 test_dread_hint(); numtests++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
847 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
848 #ifdef HAL_DCACHE_WRITE_HINT
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
849 test_dwrite_hint(); numtests++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
850 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
851 #ifdef HAL_DCACHE_ZERO
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
852 test_dzero(); numtests++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
853 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
854
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
855 // The below tests only work on a copy-back cache.
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 2
diff changeset
856 #ifdef HAL_DCACHE_QUERY_WRITE_MODE
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 2
diff changeset
857 HAL_DCACHE_QUERY_WRITE_MODE( wmode );
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 2
diff changeset
858
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 2
diff changeset
859 if ( HAL_DCACHE_WRITEBACK_MODE == wmode ) {
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
860 test_ddisable(); numtests++;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
861 #ifdef HAL_DCACHE_INVALIDATE
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
862 test_dinvalidate_all(); numtests++;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
863 #endif
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
864 #ifdef HAL_DCACHE_FLUSH
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
865 test_dflush(); numtests++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
866 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
867 #ifdef HAL_DCACHE_INVALIDATE
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
868 test_dinvalidate(); numtests++;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
869 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
870 }
24
306eee292492 Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents: 2
diff changeset
871 #endif // def HAL_DCACHE_QUERY_WRITE_MODE
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
872 if ( numtests ) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
873 CYG_TEST_PASS_FINISH("End of test");
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
874 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
875 else {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
876 CYG_TEST_NA( "No applicable cache tests" );
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 66
diff changeset
877 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
878 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
879
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
880 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
881
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
882 void kcache2_main( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
883 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
884 CYG_TEST_INIT();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
885
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
886 cyg_thread_create(4, entry0 , (cyg_addrword_t)0, "kcache2",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
887 (void *)stack[0], STACKSIZE, &thread[0], &thread_obj[0]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
888 cyg_thread_resume(thread[0]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
889
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
890 cyg_scheduler_start();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
891 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
892
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
893 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
894
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
895 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
896 cyg_start( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
897 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
898 kcache2_main();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
899 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
900
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
901 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
902
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
903 #else // def CYGFUN_KERNEL_API_C
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
904 #define N_A_MSG "Kernel C API layer disabled"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
905 #endif // def CYGFUN_KERNEL_API_C
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
906 #else // def CYGVAR_KERNEL_COUNTERS_CLOCK
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
907 #define N_A_MSG "Kernel real-time clock disabled"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
908 #endif // def CYGVAR_KERNEL_COUNTERS_CLOCK
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
909
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
910 #ifdef N_A_MSG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
911 externC void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
912 cyg_start( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
913 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
914 CYG_TEST_INIT();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
915 CYG_TEST_NA( N_A_MSG );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
916 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
917 #endif // N_A_MSG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
918
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
919 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
920 /* EOF kcache2.c */