OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [hal/] [arm/] [cma230/] [v2_0/] [include/] [hal_cache.h] - Blame information for rev 578

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 27 unneback
#ifndef CYGONCE_HAL_CACHE_H
2
#define CYGONCE_HAL_CACHE_H
3
 
4
//=============================================================================
5
//
6
//      hal_cache.h
7
//
8
//      HAL cache control API
9
//
10
//=============================================================================
11
//####ECOSGPLCOPYRIGHTBEGIN####
12
// -------------------------------------------
13
// This file is part of eCos, the Embedded Configurable Operating System.
14
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
15
//
16
// eCos is free software; you can redistribute it and/or modify it under
17
// the terms of the GNU General Public License as published by the Free
18
// Software Foundation; either version 2 or (at your option) any later version.
19
//
20
// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
21
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
22
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23
// for more details.
24
//
25
// You should have received a copy of the GNU General Public License along
26
// with eCos; if not, write to the Free Software Foundation, Inc.,
27
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
28
//
29
// As a special exception, if other files instantiate templates or use macros
30
// or inline functions from this file, or you compile this file and link it
31
// with other works to produce a work based on this file, this file does not
32
// by itself cause the resulting work to be covered by the GNU General Public
33
// License. However the source code for this file must still be made available
34
// in accordance with section (3) of the GNU General Public License.
35
//
36
// This exception does not invalidate any other reasons why a work based on
37
// this file might be covered by the GNU General Public License.
38
//
39
// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
40
// at http://sources.redhat.com/ecos/ecos-license/
41
// -------------------------------------------
42
//####ECOSGPLCOPYRIGHTEND####
43
//=============================================================================
44
//#####DESCRIPTIONBEGIN####
45
//
46
// Author(s):   nickg, gthomas
47
// Contributors:        nickg, gthomas, msalter
48
// Date:        1998-09-28
49
// Purpose:     Cache control API
50
// Description: The macros defined here provide the HAL APIs for handling
51
//              cache control operations.
52
// Usage:
53
//              #include <cyg/hal/hal_cache.h>
54
//              ...
55
//              
56
//
57
//####DESCRIPTIONEND####
58
//
59
//=============================================================================
60
 
61
#include <cyg/infra/cyg_type.h>
62
 
63
#ifdef __CMA222
64
//-----------------------------------------------------------------------------
65
// Cache dimensions
66
 
67
#define HAL_UCACHE_SIZE                 0x2000   // Size of data cache in bytes
68
#define HAL_UCACHE_LINE_SIZE            16       // Size of a data cache line
69
#define HAL_UCACHE_WAYS                 4        // Associativity of the cache
70
#define HAL_UCACHE_SETS (HAL_UCACHE_SIZE/(HAL_UCACHE_LINE_SIZE*HAL_UCACHE_WAYS))
71
 
72
#define HAL_CACHE_UNIFIED   // Let programs know the caches are combined
73
 
74
//-----------------------------------------------------------------------------
75
// Global control of caches
76
 
77
// Note: the 'mrc' doesn't seem to work.
78
#if 0
79
// Enable the data cache
80
//    mrc  MMU_CP,0,r1,MMU_Control,c0
81
//    orr  r1,r1,#MMU_Control_C|MMU_Control_B
82
//    mcr  MMU_CP,0,r1,MMU_Control,c0    
83
 
84
#define HAL_UCACHE_ENABLE()                     \
85
{                                               \
86
    asm volatile ("mrc  p15,0,r1,c1,c0;"        \
87
                  "orr  r1,r1,#0x000C;"         \
88
                  "mcr  p15,0,r1,c1,c0;"        \
89
                  :                             \
90
                  :                             \
91
                  : "r1" /* Clobber list */     \
92
        );                                      \
93
                                                \
94
}
95
 
96
// Disable the data cache
97
#define HAL_UCACHE_DISABLE()                     \
98
{                                               \
99
    asm volatile ("mrc  p15,0,r1,c1,c0;"        \
100
                  "bic  r1,r1,#0x000C;"         \
101
                  "mcr  p15,0,r1,c1,c0;"        \
102
                  :                             \
103
                  :                             \
104
                  : "r1" /* Clobber list */     \
105
        );                                      \
106
                                                \
107
}
108
#else
109
#define HAL_UCACHE_ENABLE()                     \
110
{                                               \
111
    asm volatile ("mov  r1,#0x7D;"              \
112
                  "mcr  p15,0,r1,c1,c0;"        \
113
                  :                             \
114
                  :                             \
115
                  : "r1" /* Clobber list */     \
116
        );                                      \
117
                                                \
118
}
119
 
120
// Disable the data cache
121
#define HAL_UCACHE_DISABLE()                    \
122
{                                               \
123
    asm volatile ("mov  r1,#0x71;"              \
124
                  "mcr  p15,0,r1,c1,c0;"        \
125
                  :                             \
126
                  :                             \
127
                  : "r1" /* Clobber list */     \
128
        );                                      \
129
                                                \
130
}
131
#endif
132
 
133
// Is the cache turned on?
134
#define HAL_UCACHE_IS_ENABLED(_state_) _state_ = 1;
135
 
136
// Invalidate the entire cache
137
//    mcr  MMU_CP,0,r1,MMU_InvalidateCache,c0
138
#define HAL_UCACHE_INVALIDATE_ALL()             \
139
{                                               \
140
    asm volatile (                              \
141
        "mov    r1,#0;"                         \
142
        "mcr p15,0,r1,c7,c0,0;"                 \
143
        :                                       \
144
        :                                       \
145
        : "r1","memory" /* Clobber list */      \
146
    );                                          \
147
}
148
 
149
// Synchronize the contents of the cache with memory.
150
#define HAL_UCACHE_SYNC()                                               \
151
{                                                                       \
152
    cyg_uint32 *ROM = (cyg_uint32 *)0xE0000000;                         \
153
    int i;                                                              \
154
    volatile cyg_uint32 val;                                            \
155
    for (i = 0;  i < HAL_UCACHE_SETS;  i++) {                           \
156
        val = *ROM;                                                     \
157
        ROM += HAL_UCACHE_LINE_SIZE;                                    \
158
    }                                                                   \
159
}
160
 
161
// Purge contents of data cache
162
#define HAL_UCACHE_PURGE_ALL()  HAL_UCACHE_INVALIDATE_ALL()
163
 
164
//-----------------------------------------------------------------------------
165
// Data cache line control
166
 
167
// Write dirty cache lines to memory and invalidate the cache entries
168
// for the given address range.
169
#define HAL_UCACHE_FLUSH( _base_ , _size_ )  HAL_UCACHE_SYNC()
170
 
171
// Write dirty cache lines to memory for the given address range.
172
#define HAL_UCACHE_STORE( _base_ , _size_ )  HAL_UCACHE_SYNC()
173
 
174
#endif // ifdef __CMA222
175
 
176
#ifdef HAL_CACHE_UNIFIED
177
//-----------------------------------------------------------------------------
178
// Global control of data cache
179
 
180
#define HAL_DCACHE_SIZE                 HAL_UCACHE_SIZE
181
#define HAL_DCACHE_LINE_SIZE            HAL_UCACHE_LINE_SIZE
182
#define HAL_DCACHE_WAYS                 HAL_UCACHE_WAYS
183
#define HAL_DCACHE_SETS                 HAL_UCACHE_SETS
184
 
185
// Enable the data cache
186
#define HAL_DCACHE_ENABLE()             HAL_UCACHE_ENABLE()
187
 
188
// Disable the data cache
189
#define HAL_DCACHE_DISABLE()            HAL_UCACHE_DISABLE()
190
 
191
// Invalidate the entire cache
192
#define HAL_DCACHE_INVALIDATE_ALL()     HAL_UCACHE_INVALIDATE_ALL()
193
 
194
// Synchronize the contents of the cache with memory.
195
#define HAL_DCACHE_SYNC()               HAL_UCACHE_SYNC()
196
 
197
// Query the state of the data cache
198
#define HAL_DCACHE_IS_ENABLED(_state_)  HAL_UCACHE_IS_ENABLED(_state_)
199
 
200
//-----------------------------------------------------------------------------
201
// Data cache line control
202
 
203
// Write dirty cache lines to memory and invalidate the cache entries
204
// for the given address range.
205
#define HAL_DCACHE_FLUSH( _base_ , _size_ )  HAL_UCACHE_FLUSH( _base_ , _size_ )
206
 
207
// Write dirty cache lines to memory for the given address range.
208
#define HAL_DCACHE_STORE( _base_ , _size_ )  HAL_UCACHE_STORE( _base_ , _size_ )
209
 
210
//-----------------------------------------------------------------------------
211
// Global control of Instruction cache - use Data cache controls since they
212
// are not separatable.
213
 
214
#define HAL_ICACHE_SIZE                 HAL_UCACHE_SIZE
215
#define HAL_ICACHE_LINE_SIZE            HAL_UCACHE_LINE_SIZE
216
#define HAL_ICACHE_WAYS                 HAL_UCACHE_WAYS
217
#define HAL_ICACHE_SETS                 HAL_UCACHE_SETS
218
 
219
// Enable the instruction cache
220
#define HAL_ICACHE_ENABLE()      HAL_UCACHE_ENABLE()
221
 
222
// Disable the instruction cache
223
#define HAL_ICACHE_DISABLE()     HAL_UCACHE_DISABLE()
224
 
225
// Invalidate the entire cache
226
#define HAL_ICACHE_INVALIDATE_ALL()  HAL_UCACHE_INVALIDATE_ALL()
227
 
228
// Synchronize the contents of the cache with memory.
229
#define HAL_ICACHE_SYNC()        HAL_UCACHE_SYNC()
230
 
231
#else
232
//-----------------------------------------------------------------------------
233
// Cache dimensions
234
 
235
// Data cache
236
//#define HAL_DCACHE_SIZE                 0    // Size of data cache in bytes
237
//#define HAL_DCACHE_LINE_SIZE            0    // Size of a data cache line
238
//#define HAL_DCACHE_WAYS                 0    // Associativity of the cache
239
 
240
// Instruction cache
241
//#define HAL_ICACHE_SIZE                 0    // Size of cache in bytes
242
//#define HAL_ICACHE_LINE_SIZE            0    // Size of a cache line
243
//#define HAL_ICACHE_WAYS                 0    // Associativity of the cache
244
 
245
//#define HAL_DCACHE_SETS (HAL_DCACHE_SIZE/(HAL_DCACHE_LINE_SIZE*HAL_DCACHE_WAYS))
246
//#define HAL_ICACHE_SETS (HAL_ICACHE_SIZE/(HAL_ICACHE_LINE_SIZE*HAL_ICACHE_WAYS))
247
 
248
 
249
//-----------------------------------------------------------------------------
250
// Global control of data cache
251
 
252
// Enable the data cache
253
#define HAL_DCACHE_ENABLE()
254
 
255
// Disable the data cache
256
#define HAL_DCACHE_DISABLE()
257
 
258
// Invalidate the entire cache
259
#define HAL_DCACHE_INVALIDATE_ALL()
260
 
261
// Synchronize the contents of the cache with memory.
262
#define HAL_DCACHE_SYNC()
263
 
264
// Purge contents of data cache
265
#define HAL_DCACHE_PURGE_ALL()
266
 
267
// Set the data cache refill burst size
268
//#define HAL_DCACHE_BURST_SIZE(_size_)
269
 
270
// Set the data cache write mode
271
//#define HAL_DCACHE_WRITE_MODE( _mode_ )
272
 
273
//#define HAL_DCACHE_WRITETHRU_MODE       0
274
//#define HAL_DCACHE_WRITEBACK_MODE       1
275
 
276
// Load the contents of the given address range into the data cache
277
// and then lock the cache so that it stays there.
278
//#define HAL_DCACHE_LOCK(_base_, _size_)
279
 
280
// Undo a previous lock operation
281
//#define HAL_DCACHE_UNLOCK(_base_, _size_)
282
 
283
// Unlock entire cache
284
//#define HAL_DCACHE_UNLOCK_ALL()
285
 
286
//-----------------------------------------------------------------------------
287
// Data cache line control
288
 
289
// Allocate cache lines for the given address range without reading its
290
// contents from memory.
291
//#define HAL_DCACHE_ALLOCATE( _base_ , _size_ )
292
 
293
// Write dirty cache lines to memory and invalidate the cache entries
294
// for the given address range.
295
//#define HAL_DCACHE_FLUSH( _base_ , _size_ )
296
 
297
// Invalidate cache lines in the given range without writing to memory.
298
//#define HAL_DCACHE_INVALIDATE( _base_ , _size_ )
299
 
300
// Write dirty cache lines to memory for the given address range.
301
//#define HAL_DCACHE_STORE( _base_ , _size_ )
302
 
303
// Preread the given range into the cache with the intention of reading
304
// from it later.
305
//#define HAL_DCACHE_READ_HINT( _base_ , _size_ )
306
 
307
// Preread the given range into the cache with the intention of writing
308
// to it later.
309
//#define HAL_DCACHE_WRITE_HINT( _base_ , _size_ )
310
 
311
// Allocate and zero the cache lines associated with the given range.
312
//#define HAL_DCACHE_ZERO( _base_ , _size_ )
313
 
314
//-----------------------------------------------------------------------------
315
// Global control of Instruction cache
316
 
317
// Enable the instruction cache
318
#define HAL_ICACHE_ENABLE()
319
 
320
// Disable the instruction cache
321
#define HAL_ICACHE_DISABLE()
322
 
323
// Invalidate the entire cache
324
#define HAL_ICACHE_INVALIDATE_ALL()
325
 
326
// Synchronize the contents of the cache with memory.
327
#define HAL_ICACHE_SYNC()
328
 
329
// Set the instruction cache refill burst size
330
//#define HAL_ICACHE_BURST_SIZE(_size_)
331
 
332
// Load the contents of the given address range into the instruction cache
333
// and then lock the cache so that it stays there.
334
//#define HAL_ICACHE_LOCK(_base_, _size_)
335
 
336
// Undo a previous lock operation
337
//#define HAL_ICACHE_UNLOCK(_base_, _size_)
338
 
339
// Unlock entire cache
340
//#define HAL_ICACHE_UNLOCK_ALL()
341
 
342
//-----------------------------------------------------------------------------
343
// Instruction cache line control
344
 
345
// Invalidate cache lines in the given range without writing to memory.
346
//#define HAL_ICACHE_INVALIDATE( _base_ , _size_ )
347
 
348
//-----------------------------------------------------------------------------
349
#endif // ifndef HAL_CACHE_UNIFIED
350
#endif // ifndef CYGONCE_HAL_CACHE_H
351
// End of hal_cache.h

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.