annotate packages/kernel/current/tests/kcache2.c @ 3250:283b2c38b413

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