annotate packages/hal/sparclite/sleb/current/include/hal_cache.h @ 2:443894e2e912 ecos-v1_2_1-release

Block commit of eCos version 1.2.1
author jlarmour
date Tue, 11 May 1999 12:24:34 +0000
parents
children c38311975d4f
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 #ifndef CYGONCE_HAL_CACHE_H
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_HAL_CACHE_H
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3
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 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 // hal_cache.h
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 // HAL Cache control support (such as it is in the simulator)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 //####COPYRIGHTBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 // The contents of this file are subject to the Cygnus eCos Public License
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15 // Version 1.0 (the "License"); you may not use this file except in
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 // compliance with the License. You may obtain a copy of the License at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17 // http://sourceware.cygnus.com/ecos
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19 // Software distributed under the License is distributed on an "AS IS"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21 // License for the specific language governing rights and limitations under
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 // the License.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 // The Original Code is eCos - Embedded Cygnus Operating System, released
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25 // September 30, 1998.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 // The Initial Developer of the Original Code is Cygnus. Portions created
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Author(s): nickg, gthomas, hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Contributors: nickg, gthomas, hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // Date: 1999-01-28
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 // Purpose: Define Interrupt support
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 // Description: The macros defined here provide the HAL APIs for handling
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 // the caches.
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 // Usage:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 // #include <cyg/hal/hal_cache.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 // ...
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 //####DESCRIPTIONEND####
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 //=============================================================================
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 <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 #include <pkgconf/hal_sparclite.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54 #include <cyg/infra/cyg_type.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 // SPARClite cache macros
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 // The MB6863x Control Registers are in Address Space 1:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 #define HAL_SPARC_ASI_1_READ( addr, res ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 asm volatile( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 "lda [ %1 ] 1, %0" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 : "=r"(res) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 : "r"(addr) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 );
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 #define HAL_SPARC_ASI_1_WRITE( addr, val ) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 asm volatile( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 "sta %0, [ %1 ] 1" \
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 : "r"(val),"r"(addr) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 #define HAL_SPARC_MMCR_CBIR 0x00 // Cache/BusInterfaceUnit Control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 #define HAL_SPARC_MMCR_LCR 0x04 // Lock Control Register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 #define HAL_SPARC_MMCR_LCSR 0x08 // Lock Control Save Reg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 #define HAL_SPARC_MMCR_CSR 0x0c // Cache Status Reg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 #define HAL_SPARC_MMCR_RLCR 0x10 // Restore Lock Control Register
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 #define HAL_SPARC_MMCR_CBIR_ICE 0x01 // Instruction Cache Enable
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 #define HAL_SPARC_MMCR_CBIR_GICL 0x02 // Global IC Lock
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 #define HAL_SPARC_MMCR_CBIR_DCE 0x04 // Data CE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 #define HAL_SPARC_MMCR_CBIR_GDCL 0x08 // G Data CE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 #define HAL_SPARC_MMCR_CBIR_PBE 0x10 // Prefetch Buffer Enable
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 #define HAL_SPARC_MMCR_CBIR_WBE 0x20 // Write BE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 // Cache dimensions
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 // These definitions are suitable for any MB8683x processor:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 // The largest possible cachesize and "ways",
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 // the smallest possible line size.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 // This gives values that can correctly manipulate the cache by
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 // jumping on memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 // Data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 #define HAL_DCACHE_SIZE 0x2000 // Size of data cache in bytes
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 #define HAL_DCACHE_LINE_SIZE 16 // Size of a data cache line
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 #define HAL_DCACHE_WAYS 2 // Associativity of the cache
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 // Instruction cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 #define HAL_ICACHE_SIZE 0x2000 // Size of cache in bytes
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 #define HAL_ICACHE_LINE_SIZE 16 // Size of a cache line
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 #define HAL_ICACHE_WAYS 2 // Associativity of the cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 #define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 #define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
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 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 // Global control of data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 // Enable the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 #define HAL_DCACHE_ENABLE() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 _v_ |= HAL_SPARC_MMCR_CBIR_DCE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 HAL_SPARC_ASI_1_WRITE( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 asm volatile ( "nop; nop; nop; nop;" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 // Disable the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 #define HAL_DCACHE_DISABLE() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 _v_ &=~ HAL_SPARC_MMCR_CBIR_DCE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 HAL_SPARC_ASI_1_WRITE( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 asm volatile ( "nop; nop; nop; nop;" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 // Invalidate the entire cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 #define HAL_DCACHE_INVALIDATE_ALL() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 asm volatile ( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 "set 3, %%l0;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 "set 0x00001000, %%l1;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 "set 0x80001000, %%l2;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 "sta %%l0, [ %%l1 ] 0x0e;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 "sta %%l0, [ %%l2 ] 0x0e;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 "nop" : : : "l0","l1","l2" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 // Synchronize the contents of the cache with memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 #define HAL_DCACHE_SYNC() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 /* read 8k from the ROM; that should do it... */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 volatile cyg_uint32 *_p_ = (cyg_uint32 *)0; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 volatile cyg_uint32 *_q_ = (cyg_uint32 *)HAL_DCACHE_SIZE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 volatile cyg_uint32 _tmp_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 for ( ; _p_ < _q_; _p_ ++ ) _tmp_ = *_q_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 // Query the state of the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 #define HAL_DCACHE_IS_ENABLED(_state_) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 (_state_) = (0 != (_v_ & HAL_SPARC_MMCR_CBIR_DCE)); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160
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 // Set the data cache refill burst size
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 //#define HAL_DCACHE_BURST_SIZE(_size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 // Set the data cache write mode
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 //#define HAL_DCACHE_WRITE_MODE( _mode_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 //#define HAL_DCACHE_WRITETHRU_MODE 0
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169 //#define HAL_DCACHE_WRITEBACK_MODE 1
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 // Load the contents of the given address range into the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 // and then lock the cache so that it stays there.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 //#define HAL_DCACHE_LOCK(_base_, _size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 // Undo a previous lock operation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 //#define HAL_DCACHE_UNLOCK(_base_, _size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
178 // Unlock entire cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
179 //#define HAL_DCACHE_UNLOCK_ALL()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
180
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
181 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
182 // Data cache line control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
183
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
184 // Allocate cache lines for the given address range without reading its
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
185 // contents from memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 //#define HAL_DCACHE_ALLOCATE( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188 // Write dirty cache lines to memory and invalidate the cache entries
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 // for the given address range.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
190 //#define HAL_DCACHE_FLUSH( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
191
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
192 // Invalidate cache lines in the given range without writing to memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
193 //#define HAL_DCACHE_INVALIDATE( _base_ , _size_ )
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 // Write dirty cache lines to memory for the given address range.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
196 //#define HAL_DCACHE_STORE( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
197
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
198 // Preread the given range into the cache with the intention of reading
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
199 // from it later.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
200 //#define HAL_DCACHE_READ_HINT( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
201
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
202 // Preread the given range into the cache with the intention of writing
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
203 // to it later.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 //#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ )
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 // Allocate and zero the cache lines associated with the given range.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 //#define HAL_DCACHE_ZERO( _base_ , _size_ )
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 // Global control of Instruction cache - use Data cache controls since they
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211 // are not separatable.
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 // Enable the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 #define HAL_ICACHE_ENABLE() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
216 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
217 _v_ |= HAL_SPARC_MMCR_CBIR_ICE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
218 HAL_SPARC_ASI_1_WRITE( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
219 asm volatile ( "nop; nop; nop; nop;" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
220 CYG_MACRO_END
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 // Disable the data cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
223 #define HAL_ICACHE_DISABLE() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
224 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
225 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
226 _v_ &=~ HAL_SPARC_MMCR_CBIR_ICE; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
227 HAL_SPARC_ASI_1_WRITE( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
228 asm volatile ( "nop; nop; nop; nop;" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
229 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
230
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
231 // Invalidate the entire cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
232 #define HAL_ICACHE_INVALIDATE_ALL() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 asm volatile ( \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 "set 3, %%l0;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 "set 0x00001000, %%l1;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 "set 0x80001000, %%l2;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237 "sta %%l0, [ %%l1 ] 0x0c;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 "sta %%l0, [ %%l2 ] 0x0c;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 "nop;" \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 "nop" : : : "l0","l1","l2" ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 // Synchronize the contents of the cache with memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246 #define HAL_ICACHE_SYNC() CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247 HAL_DCACHE_SYNC(); /* Ensure data is in memory */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 HAL_ICACHE_INVALIDATE_ALL(); /* Pick up new memory contents */ \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251 // Query the state of the instruction cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 #define HAL_ICACHE_IS_ENABLED(_state_) CYG_MACRO_START \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 int _v_; \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 HAL_SPARC_ASI_1_READ( HAL_SPARC_MMCR_CBIR, _v_ ); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 (_state_) = (0 != (_v_ & HAL_SPARC_MMCR_CBIR_ICE)); \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256 CYG_MACRO_END
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 // Set the instruction cache refill burst size
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259 //#define HAL_ICACHE_BURST_SIZE(_size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261 // Load the contents of the given address range into the instruction cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 // and then lock the cache so that it stays there.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 //#define HAL_ICACHE_LOCK(_base_, _size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 // Undo a previous lock operation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 //#define HAL_ICACHE_UNLOCK(_base_, _size_)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 // Unlock entire cache
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269 //#define HAL_ICACHE_UNLOCK_ALL()
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270
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 // Instruction cache line control
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 // Invalidate cache lines in the given range without writing to memory.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275 //#define HAL_ICACHE_INVALIDATE( _base_ , _size_ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276
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 #endif // ifndef CYGONCE_HAL_CACHE_H
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 // End of hal_cache.h